Skip to content

Commit 549838c

Browse files
committed
dpdk: refactor device setup
Type: improvement Change-Id: I9772088bca176fd0fdb162677ec55c59aa8f3adf Signed-off-by: Damjan Marion <[email protected]>
1 parent f8dd9d8 commit 549838c

File tree

7 files changed

+328
-540
lines changed

7 files changed

+328
-540
lines changed

src/plugins/dpdk/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ add_vpp_plugin(dpdk
134134
device/cli.c
135135
device/common.c
136136
device/device.c
137+
device/driver.c
137138
device/flow.c
138139
device/format.c
139140
device/init.c

src/plugins/dpdk/device/device.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ dpdk_subif_add_del_function (vnet_main_t * vnm,
547547
xd->num_subifs--;
548548

549549
/* currently we program VLANS only for IXGBE VF */
550-
if (xd->pmd != VNET_DPDK_PMD_IXGBEVF)
550+
if (xd->driver->program_vlans == 0)
551551
goto done;
552552

553553
if (t->sub.eth.flags.no_tags == 1)

src/plugins/dpdk/device/dpdk.h

Lines changed: 29 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -45,79 +45,6 @@ extern vnet_device_class_t dpdk_device_class;
4545
extern vlib_node_registration_t dpdk_input_node;
4646
extern vlib_node_registration_t admin_up_down_process_node;
4747

48-
#if RTE_VERSION < RTE_VERSION_NUM(20, 8, 0, 0)
49-
#define DPDK_MLX5_PMD_NAME "net_mlx5"
50-
#else
51-
#define DPDK_MLX5_PMD_NAME "mlx5_pci"
52-
#endif
53-
54-
#define foreach_dpdk_pmd \
55-
_ ("net_thunderx", THUNDERX) \
56-
_ ("net_e1000_em", E1000EM) \
57-
_ ("net_e1000_igb", IGB) \
58-
_ ("net_e1000_igb_vf", IGBVF) \
59-
_ ("net_ixgbe", IXGBE) \
60-
_ ("net_ixgbe_vf", IXGBEVF) \
61-
_ ("net_i40e", I40E) \
62-
_ ("net_i40e_vf", I40EVF) \
63-
_ ("net_ice", ICE) \
64-
_ ("net_iavf", IAVF) \
65-
_ ("net_igc", IGC) \
66-
_ ("net_virtio", VIRTIO) \
67-
_ ("net_enic", ENIC) \
68-
_ ("net_vmxnet3", VMXNET3) \
69-
_ ("AF_PACKET PMD", AF_PACKET) \
70-
_ ("net_fm10k", FM10K) \
71-
_ ("net_cxgbe", CXGBE) \
72-
_ ("net_mlx4", MLX4) \
73-
_ (DPDK_MLX5_PMD_NAME, MLX5) \
74-
_ ("net_dpaa2", DPAA2) \
75-
_ ("net_virtio_user", VIRTIO_USER) \
76-
_ ("net_vhost", VHOST_ETHER) \
77-
_ ("net_ena", ENA) \
78-
_ ("net_failsafe", FAILSAFE) \
79-
_ ("net_liovf", LIOVF_ETHER) \
80-
_ ("net_qede", QEDE) \
81-
_ ("net_netvsc", NETVSC) \
82-
_ ("net_bnxt", BNXT)
83-
84-
typedef enum
85-
{
86-
VNET_DPDK_PMD_NONE,
87-
#define _(s,f) VNET_DPDK_PMD_##f,
88-
foreach_dpdk_pmd
89-
#undef _
90-
VNET_DPDK_PMD_UNKNOWN, /* must be last */
91-
} dpdk_pmd_t;
92-
93-
#define forach_dpdk_port_type \
94-
_ (ETH_1G, "GigabitEthernet") \
95-
_ (ETH_2_5G, "Two_FiveGigabitEthernet") \
96-
_ (ETH_5G, "FiveGigabitEthernet") \
97-
_ (ETH_10G, "TenGigabitEthernet") \
98-
_ (ETH_20G, "TwentyGigabitEthernet") \
99-
_ (ETH_25G, "TwentyFiveGigabitEthernet") \
100-
_ (ETH_40G, "FortyGigabitEthernet") \
101-
_ (ETH_50G, "FiftyGigabitEthernet") \
102-
_ (ETH_56G, "FiftySixGigabitEthernet") \
103-
_ (ETH_100G, "HundredGigabitEthernet") \
104-
_ (ETH_200G, "TwoHundredGigabitEthernet") \
105-
_ (ETH_SWITCH, "EthernetSwitch") \
106-
_ (ETH_VF, "VirtualFunctionEthernet") \
107-
_ (AF_PACKET, "af_packet") \
108-
_ (VIRTIO_USER, "VirtioUser") \
109-
_ (VHOST_ETHER, "VhostEthernet") \
110-
_ (FAILSAFE, "FailsafeEthernet") \
111-
_ (NETVSC, "NetVSC")
112-
113-
typedef enum
114-
{
115-
VNET_DPDK_PORT_TYPE_UNKNOWN = 0,
116-
#define _(n, s) VNET_DPDK_PORT_TYPE_##n,
117-
forach_dpdk_port_type
118-
#undef _
119-
} dpdk_port_type_t;
120-
12148
typedef uint16_t dpdk_portid_t;
12249

12350
#define foreach_dpdk_device_flags \
@@ -133,12 +60,12 @@ typedef uint16_t dpdk_portid_t;
13360
_ (13, INT_SUPPORTED, "int-supported") \
13461
_ (14, INT_UNMASKABLE, "int-unmaskable")
13562

136-
enum
63+
typedef enum
13764
{
13865
#define _(a, b, c) DPDK_DEVICE_FLAG_##b = (1 << a),
13966
foreach_dpdk_device_flags
14067
#undef _
141-
};
68+
} dpdk_device_flag_t;
14269

14370
typedef struct
14471
{
@@ -169,6 +96,31 @@ typedef struct
16996
clib_spinlock_t lock;
17097
} dpdk_tx_queue_t;
17198

99+
typedef struct
100+
{
101+
const char *name;
102+
const char *desc;
103+
} dpdk_driver_name_t;
104+
105+
typedef struct
106+
{
107+
dpdk_driver_name_t *drivers;
108+
const char *interface_name_prefix;
109+
u16 n_rx_desc;
110+
u16 n_tx_desc;
111+
u32 supported_flow_actions;
112+
i32 enable_lsc_int : 1;
113+
i32 enable_rxq_int : 1;
114+
i32 disable_rx_scatter : 1;
115+
i32 program_vlans : 1;
116+
i32 mq_mode_none : 1;
117+
i32 interface_number_from_port_id : 1;
118+
i32 use_intel_phdr_cksum : 1;
119+
i32 int_unmaskable : 1;
120+
} dpdk_driver_t;
121+
122+
dpdk_driver_t *dpdk_driver_find (const char *name, const char **desc);
123+
172124
typedef union
173125
{
174126
struct
@@ -216,15 +168,15 @@ typedef struct
216168

217169
/* DPDK device port number */
218170
dpdk_portid_t port_id;
219-
dpdk_pmd_t pmd:8;
220171
i8 cpu_socket;
221172

222173
CLIB_CACHE_LINE_ALIGN_MARK (cacheline1);
223174

224175
u64 enabled_tx_off;
225176
u64 enabled_rx_off;
177+
dpdk_driver_t *driver;
226178
u8 *name;
227-
u8 *interface_name_suffix;
179+
const char *if_desc;
228180

229181
/* number of sub-interfaces */
230182
u16 num_subifs;
@@ -244,7 +196,6 @@ typedef struct
244196
struct rte_eth_stats last_stats;
245197
struct rte_eth_xstat *xstats;
246198
f64 time_last_stats_update;
247-
dpdk_port_type_t port_type;
248199

249200
/* mac address */
250201
u8 *default_mac_address;

src/plugins/dpdk/device/dpdk_priv.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
#define DPDK_NB_RX_DESC_DEFAULT 1024
1717
#define DPDK_NB_TX_DESC_DEFAULT 1024
1818
#define DPDK_MAX_LRO_SIZE_DEFAULT 65536
19-
#define DPDK_NB_RX_DESC_VIRTIO 256
20-
#define DPDK_NB_TX_DESC_VIRTIO 256
2119

2220
/* These args appear by themselves */
2321
#define foreach_eal_double_hyphen_predicate_arg \

src/plugins/dpdk/device/driver.c

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
/* SPDX-License-Identifier: Apache-2.0
2+
* Copyright(c) 2021 Cisco Systems, Inc.
3+
*/
4+
5+
#include <vlib/vlib.h>
6+
7+
#include <dpdk/device/dpdk.h>
8+
9+
static const u32 supported_flow_actions_intel =
10+
(VNET_FLOW_ACTION_MARK | VNET_FLOW_ACTION_REDIRECT_TO_NODE |
11+
VNET_FLOW_ACTION_REDIRECT_TO_QUEUE | VNET_FLOW_ACTION_BUFFER_ADVANCE |
12+
VNET_FLOW_ACTION_COUNT | VNET_FLOW_ACTION_DROP | VNET_FLOW_ACTION_RSS);
13+
14+
#define DPDK_DRIVERS(...) \
15+
(dpdk_driver_name_t[]) \
16+
{ \
17+
__VA_ARGS__, {} \
18+
}
19+
20+
static dpdk_driver_t dpdk_drivers[] = {
21+
{
22+
.drivers = DPDK_DRIVERS ({ "net_ice", "Intel E810 Family" },
23+
{ "net_igc", "Intel I225 2.5G Family" },
24+
{ "net_e1000_igb", "Intel e1000" },
25+
{ "net_e1000_em", "Intel 82540EM (e1000)" }),
26+
.enable_rxq_int = 1,
27+
.supported_flow_actions = supported_flow_actions_intel,
28+
.use_intel_phdr_cksum = 1,
29+
},
30+
{
31+
.drivers = DPDK_DRIVERS ({ "net_ixgbe", "Intel 82599" }),
32+
.enable_rxq_int = 1,
33+
.program_vlans = 1,
34+
.supported_flow_actions = supported_flow_actions_intel,
35+
.use_intel_phdr_cksum = 1,
36+
},
37+
{
38+
.drivers = DPDK_DRIVERS ({ "net_i40e", "Intel X710/XL710 Family" }),
39+
.enable_rxq_int = 1,
40+
.supported_flow_actions = supported_flow_actions_intel,
41+
.use_intel_phdr_cksum = 1,
42+
.int_unmaskable = 1,
43+
},
44+
{
45+
.drivers = DPDK_DRIVERS ({ "net_liovf", "Cavium Lio VF" },
46+
{ "net_thunderx", "Cavium ThunderX" }),
47+
.interface_name_prefix = "VirtualFunctionEthernet",
48+
},
49+
{
50+
.drivers = DPDK_DRIVERS ({ "net_iavf", "Intel iAVF" },
51+
{ "net_i40e_vf", "Intel X710/XL710 Family VF" }),
52+
.interface_name_prefix = "VirtualFunctionEthernet",
53+
.supported_flow_actions = supported_flow_actions_intel,
54+
.use_intel_phdr_cksum = 1,
55+
.int_unmaskable = 1,
56+
},
57+
{
58+
.drivers = DPDK_DRIVERS ({ "net_e1000_igb_vf", "Intel e1000 VF" },
59+
{ "net_ixgbe_vf", "Intel 82599 VF" }),
60+
.interface_name_prefix = "VirtualFunctionEthernet",
61+
.use_intel_phdr_cksum = 1,
62+
},
63+
{
64+
.drivers = DPDK_DRIVERS ({ "net_dpaa2", "NXP DPAA2 Mac" }),
65+
.interface_name_prefix = "TenGigabitEthernet",
66+
},
67+
{
68+
.drivers =
69+
DPDK_DRIVERS ({ "net_fm10k", "Intel FM10000 Family Ethernet Switch" }),
70+
.interface_name_prefix = "EthernetSwitch",
71+
},
72+
{
73+
.drivers = DPDK_DRIVERS ({ "net_cxgbe", "Chelsio T4/T5" }),
74+
.interface_number_from_port_id = 1,
75+
},
76+
{
77+
.drivers = DPDK_DRIVERS ({ "net_mlx4", "Mellanox ConnectX-3 Family" },
78+
{ "net_qede", "Cavium QLogic FastLinQ QL4xxxx" },
79+
{ "net_bnxt", "Broadcom NetXtreme E/S-Series" }),
80+
},
81+
{
82+
.drivers = DPDK_DRIVERS ({ "net_virtio_user", "Virtio User" }),
83+
.interface_name_prefix = "VirtioUser",
84+
},
85+
{
86+
.drivers = DPDK_DRIVERS ({ "net_vhost", "VhostEthernet" }),
87+
.interface_name_prefix = "VhostEthernet",
88+
},
89+
{
90+
.drivers = DPDK_DRIVERS ({ "mlx5_pci", "Mellanox ConnectX-4 Family" },
91+
{ "net_enic", "Cisco VIC" }),
92+
.use_intel_phdr_cksum = 1,
93+
},
94+
{
95+
.drivers = DPDK_DRIVERS ({ "net_failsafe", "FailsafeEthernet" }),
96+
.interface_name_prefix = "FailsafeEthernet",
97+
.enable_lsc_int = 1,
98+
},
99+
{
100+
.drivers = DPDK_DRIVERS ({ "AF_PACKET PMD", "af_packet" }),
101+
.interface_name_prefix = "af_packet",
102+
},
103+
{
104+
.drivers = DPDK_DRIVERS ({ "net_netvsc", "Microsoft Hyper-V Netvsc" }),
105+
.interface_name_prefix = "NetVSC",
106+
},
107+
{
108+
.drivers = DPDK_DRIVERS ({ "net_ena", "AWS ENA VF" }),
109+
.interface_name_prefix = "VirtualFunctionEthernet",
110+
.enable_rxq_int = 1,
111+
.disable_rx_scatter = 1,
112+
},
113+
{
114+
.drivers = DPDK_DRIVERS ({ "net_vmxnet3", "VMware VMXNET3" }),
115+
.interface_name_prefix = "GigabitEthernet",
116+
},
117+
{
118+
.drivers = DPDK_DRIVERS ({ "net_virtio", "Red Hat Virtio" }),
119+
.interface_name_prefix = "GigabitEthernet",
120+
.n_rx_desc = 256,
121+
.n_tx_desc = 256,
122+
.mq_mode_none = 1,
123+
}
124+
};
125+
126+
dpdk_driver_t *
127+
dpdk_driver_find (const char *name, const char **desc)
128+
{
129+
for (int i = 0; i < ARRAY_LEN (dpdk_drivers); i++)
130+
{
131+
dpdk_driver_t *dr = dpdk_drivers + i;
132+
dpdk_driver_name_t *dn = dr->drivers;
133+
134+
while (dn->name)
135+
{
136+
if (name && !strcmp (name, dn->name))
137+
{
138+
*desc = dn->desc;
139+
return dr;
140+
}
141+
dn++;
142+
}
143+
}
144+
return 0;
145+
}

0 commit comments

Comments
 (0)