1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
|
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2017 Huawei Technologies Co., Ltd
*/
#ifndef _HINIC_PMD_ETHDEV_H_
#define _HINIC_PMD_ETHDEV_H_
#include <rte_ethdev.h>
#include <rte_ethdev_core.h>
#include "base/hinic_compat.h"
#include "base/hinic_pmd_cfg.h"
#define HINIC_DEV_NAME_LEN 32
#define HINIC_MAX_RX_QUEUES 64
/* mbuf pool for copy invalid mbuf segs */
#define HINIC_COPY_MEMPOOL_DEPTH 128
#define HINIC_COPY_MBUF_SIZE 4096
#define SIZE_8BYTES(size) (ALIGN((u32)(size), 8) >> 3)
#define HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev) \
((struct hinic_nic_dev *)(dev)->data->dev_private)
#define HINIC_MAX_QUEUE_DEPTH 4096
#define HINIC_MIN_QUEUE_DEPTH 128
#define HINIC_TXD_ALIGN 1
#define HINIC_RXD_ALIGN 1
#define HINIC_UINT32_BIT_SIZE (CHAR_BIT * sizeof(uint32_t))
#define HINIC_VFTA_SIZE (4096 / HINIC_UINT32_BIT_SIZE)
enum hinic_dev_status {
HINIC_DEV_INIT,
HINIC_DEV_CLOSE,
HINIC_DEV_START,
HINIC_DEV_INTR_EN,
};
#define HINIC_MAX_Q_FILTERS 64 /* hinic just support 64 filter types */
#define HINIC_PKT_TYPE_FIND_ID(pkt_type) ((pkt_type) - HINIC_MAX_Q_FILTERS)
/* 5tuple filter info */
struct hinic_5tuple_filter_info {
uint32_t dst_ip;
uint32_t src_ip;
uint16_t dst_port;
uint16_t src_port;
uint8_t proto; /* l4 protocol. */
/*
* seven levels (001b-111b), 111b is highest,
* used when more than one filter matches.
*/
uint8_t priority;
/* if mask is 1b, do not compare the response bit domain */
uint8_t dst_ip_mask:1,
src_ip_mask:1,
dst_port_mask:1,
src_port_mask:1,
proto_mask:1;
};
/* 5tuple filter structure */
struct hinic_5tuple_filter {
TAILQ_ENTRY(hinic_5tuple_filter) entries;
uint16_t index; /* the index of 5tuple filter */
struct hinic_5tuple_filter_info filter_info;
uint16_t queue; /* rx queue assigned to */
};
TAILQ_HEAD(hinic_5tuple_filter_list, hinic_5tuple_filter);
/*
* If this filter is added by configuration,
* it should not be removed.
*/
struct hinic_pkt_filter {
uint16_t pkt_proto;
uint8_t qid;
bool enable;
};
/* Structure to store filters' info. */
struct hinic_filter_info {
uint8_t pkt_type;
uint8_t qid;
uint64_t type_mask; /* Bit mask for every used filter */
struct hinic_5tuple_filter_list fivetuple_list;
struct hinic_pkt_filter pkt_filters[HINIC_MAX_Q_FILTERS];
};
/* Information about the fdir mode. */
struct hinic_hw_fdir_mask {
uint32_t src_ipv4_mask;
uint32_t dst_ipv4_mask;
uint16_t src_port_mask;
uint16_t dst_port_mask;
uint16_t proto_mask;
uint16_t tunnel_flag;
uint16_t tunnel_inner_src_port_mask;
uint16_t tunnel_inner_dst_port_mask;
uint16_t dst_ipv6_mask;
};
/* Flow Director attribute */
struct hinic_atr_input {
uint32_t dst_ip;
uint32_t src_ip;
uint16_t src_port;
uint16_t dst_port;
uint16_t proto;
uint16_t tunnel_flag;
uint16_t tunnel_inner_src_port;
uint16_t tunnel_inner_dst_port;
uint8_t dst_ipv6[16];
};
enum hinic_fdir_mode {
HINIC_FDIR_MODE_NORMAL = 0,
HINIC_FDIR_MODE_TCAM = 1,
};
#define HINIC_PF_MAX_TCAM_FILTERS 1024
#define HINIC_VF_MAX_TCAM_FILTERS 128
#define HINIC_SUPPORT_PF_MAX_NUM 4
#define HINIC_TOTAL_PF_MAX_NUM 16
#define HINIC_SUPPORT_VF_MAX_NUM 32
#define HINIC_TCAM_BLOCK_TYPE_PF 0 /* 1024 tcam index of a block */
#define HINIC_TCAM_BLOCK_TYPE_VF 1 /* 128 tcam index of a block */
#define HINIC_PKT_VF_TCAM_INDEX_START(block_index) \
(HINIC_PF_MAX_TCAM_FILTERS * HINIC_SUPPORT_PF_MAX_NUM + \
HINIC_VF_MAX_TCAM_FILTERS * (block_index))
TAILQ_HEAD(hinic_tcam_filter_list, hinic_tcam_filter);
struct hinic_tcam_info {
struct hinic_tcam_filter_list tcam_list;
u8 tcam_index_array[HINIC_PF_MAX_TCAM_FILTERS];
u16 tcam_block_index;
u16 tcam_rule_nums;
};
struct tag_tcam_key_mem {
#if (RTE_BYTE_ORDER == RTE_BIG_ENDIAN)
u32 rsvd0:16;
u32 function_id:16;
u32 protocol:8;
/*
* tunnel packet, mask must be 0xff, spec value is 1;
* normal packet, mask must be 0, spec value is 0;
* if tunnal packet, ucode use
* sip/dip/protocol/src_port/dst_dport from inner packet
*/
u32 tunnel_flag:8;
u32 sip_h:16;
u32 sip_l:16;
u32 dip_h:16;
u32 dip_l:16;
u32 src_port:16;
u32 dst_port:16;
/*
* tunnel packet and normal packet,
* ext_dip mask must be 0xffffffff
*/
u32 ext_dip_h:16;
u32 ext_dip_l:16;
u32 rsvd2:16;
#else
u32 function_id:16;
u32 rsvd0:16;
u32 sip_h:16;
u32 tunnel_flag:8;
u32 protocol:8;
u32 dip_h:16;
u32 sip_l:16;
u32 src_port:16;
u32 dip_l:16;
u32 ext_dip_h:16;
u32 dst_port:16;
u32 rsvd2:16;
u32 ext_dip_l:16;
#endif
};
struct tag_tcam_key_ipv6_mem {
#if (RTE_BYTE_ORDER == RTE_BIG_ENDIAN)
u32 rsvd0:16;
u32 ipv6_flag:1;
u32 protocol:7;
u32 function_id:8;
u32 dst_port:16;
u32 ipv6_key0:16;
u32 ipv6_key1:16;
u32 ipv6_key2:16;
u32 ipv6_key3:16;
u32 ipv6_key4:16;
u32 ipv6_key5:16;
u32 ipv6_key6:16;
u32 ipv6_key7:16;
u32 rsvd2:16;
#else
u32 function_id:8;
u32 protocol:7;
u32 ipv6_flag:1;
u32 rsvd0:16;
u32 ipv6_key0:16;
u32 dst_port:16;
u32 ipv6_key2:16;
u32 ipv6_key1:16;
u32 ipv6_key4:16;
u32 ipv6_key3:16;
u32 ipv6_key6:16;
u32 ipv6_key5:16;
u32 rsvd2:16;
u32 ipv6_key7:16;
#endif
};
struct tag_tcam_key {
union {
struct tag_tcam_key_mem key_info;
struct tag_tcam_key_ipv6_mem key_info_ipv6;
};
union {
struct tag_tcam_key_mem key_mask;
struct tag_tcam_key_ipv6_mem key_mask_ipv6;
};
};
struct hinic_fdir_rule {
struct hinic_hw_fdir_mask mask;
struct hinic_atr_input hinic_fdir; /* key of fdir filter */
uint8_t queue; /* queue assigned when matched */
enum hinic_fdir_mode mode; /* fdir type */
u16 tcam_index;
};
/* ntuple filter list structure */
struct hinic_ntuple_filter_ele {
TAILQ_ENTRY(hinic_ntuple_filter_ele) entries;
struct rte_eth_ntuple_filter filter_info;
};
/* ethertype filter list structure */
struct hinic_ethertype_filter_ele {
TAILQ_ENTRY(hinic_ethertype_filter_ele) entries;
struct rte_eth_ethertype_filter filter_info;
};
/* fdir filter list structure */
struct hinic_fdir_rule_ele {
TAILQ_ENTRY(hinic_fdir_rule_ele) entries;
struct hinic_fdir_rule filter_info;
};
struct hinic_tcam_filter {
TAILQ_ENTRY(hinic_tcam_filter) entries;
uint16_t index; /* tcam index */
struct tag_tcam_key tcam_key;
uint16_t queue; /* rx queue assigned to */
};
struct rte_flow {
enum rte_filter_type filter_type;
void *rule;
};
/* hinic_flow memory list structure */
struct hinic_flow_mem {
TAILQ_ENTRY(hinic_flow_mem) entries;
struct rte_flow *flow;
};
TAILQ_HEAD(hinic_ntuple_filter_list, hinic_ntuple_filter_ele);
TAILQ_HEAD(hinic_ethertype_filter_list, hinic_ethertype_filter_ele);
TAILQ_HEAD(hinic_fdir_rule_filter_list, hinic_fdir_rule_ele);
TAILQ_HEAD(hinic_flow_mem_list, hinic_flow_mem);
extern const struct rte_flow_ops hinic_flow_ops;
/* hinic nic_device */
struct hinic_nic_dev {
/* hardware device */
struct hinic_hwdev *hwdev;
struct hinic_txq **txqs;
struct hinic_rxq **rxqs;
struct rte_mempool *cpy_mpool;
u16 num_qps;
u16 num_sq;
u16 num_rq;
u16 mtu_size;
u8 rss_tmpl_idx;
u8 rss_indir_flag;
u8 num_rss;
u8 rx_queue_list[HINIC_MAX_RX_QUEUES];
bool pause_set;
struct nic_pause_config nic_pause;
u32 vfta[HINIC_VFTA_SIZE]; /* VLAN bitmap */
struct rte_ether_addr default_addr;
struct rte_ether_addr *mc_list;
/* info */
unsigned int flags;
struct nic_service_cap nic_cap;
u32 rx_mode_status; /* promisc or allmulticast */
unsigned long dev_status;
char proc_dev_name[HINIC_DEV_NAME_LEN];
/* PF0->COS4, PF1->COS5, PF2->COS6, PF3->COS7,
* vf: the same with associate pf
*/
u32 default_cos;
u32 rx_csum_en;
struct hinic_filter_info filter;
struct hinic_tcam_info tcam;
struct hinic_ntuple_filter_list filter_ntuple_list;
struct hinic_ethertype_filter_list filter_ethertype_list;
struct hinic_fdir_rule_filter_list filter_fdir_rule_list;
struct hinic_flow_mem_list hinic_flow_list;
};
void hinic_free_fdir_filter(struct hinic_nic_dev *nic_dev);
void hinic_destroy_fdir_filter(struct rte_eth_dev *dev);
#endif /* _HINIC_PMD_ETHDEV_H_ */
|