89 else if (
unformat (input,
"max %d", &max))
95 else if (
unformat (input,
"intfc %U",
99 else if (
unformat (input,
"intfc any"))
104 else if (
unformat (input,
"file %s", &filename))
108 if (strstr ((
char *) filename,
"..")
109 || index ((
char *) filename,
'/'))
116 chroot_filename =
format (0,
"/tmp/%s%c", filename, 0);
125 else if (
unformat (input,
"status"))
152 .path =
"pcap tx trace",
154 "pcap tx trace on off max <nn> intfc <intfc> file <name> status",
164 struct rte_mempool *rmp;
172 unsigned count = rte_mempool_avail_count (rmp);
173 unsigned free_count = rte_mempool_in_use_count (rmp);
176 "name=\"%s\" available = %7d allocated = %7d total = %7d\n",
178 (
u32) (count + free_count));
190 .path =
"show dpdk buffer",
191 .short_help =
"show dpdk buffer state",
201 static u32 *allocated_buffers;
208 if (
unformat (input,
"allocate %d", &n_alloc))
210 else if (
unformat (input,
"free %d", &n_free))
218 if (
vec_len (allocated_buffers) < n_free)
220 n_free,
vec_len (allocated_buffers));
222 first =
vec_len (allocated_buffers) - n_free;
224 _vec_len (allocated_buffers) =
first;
228 first =
vec_len (allocated_buffers);
230 vec_len (allocated_buffers) + n_alloc - 1);
234 _vec_len (allocated_buffers) = first + actual_alloc;
236 if (actual_alloc < n_alloc)
244 if (allocated_buffers &&
vec_len (allocated_buffers) == 0)
252 .path =
"test dpdk buffer",
253 .short_help =
"test dpdk buffer [allocate <nn>][free <nn>]",
264 " last_burst_sz %d\n" 266 " full_frames_cnt %u\n" 267 " consec_full_frames_cnt %u\n" 268 " congestion_cnt %d\n" 269 " last_poll_time %llu\n" 270 " max_poll_delay %llu\n" 272 " total_packet_cnt %u\n",
295 "dpdk: (0x%04x) enabled:%d monitor:%d drop_all:%d\n" 296 " dpdk_queue_hi_thresh %d\n" 297 " consec_full_frames_hi_thresh %d\n" 299 "worker: (0x%04x) enabled:%d monitor:%d\n" 300 " worker_queue_hi_thresh %d\n",
313 "ip_prec_bitmap 0x%02x\n" 314 "mpls_exp_bitmap 0x%02x\n" 315 "vlan_cos_bitmap 0x%02x\n",
335 (void)
unformat (input,
"device %d", &device_id);
339 if ((xd->
device_index == device_id) || (device_id == ~0))
346 else if (
unformat (input,
"worker"))
353 u32 first_worker_index = 0;
361 num_workers = tr->
count;
367 "first_worker_index %d\n" 368 "vlib_frame_queues[%d]:\n",
371 for (thread_id = 0; thread_id < tm->
n_vlib_mains; thread_id++)
377 "%2d: frames_queued %u\n" 378 " frames_queued_hint %u\n" 379 " enqueue_full_events %u\n" 380 " enqueue_efd_discards %u\n",
392 "dpdk [device <id>] | worker\n");
405 .short_help =
"Show efd [device <id>] | [config]",
435 for (thread_id = 0; thread_id < tm->
n_vlib_mains; thread_id++)
451 .short_help =
"Clear early-fast-discard counters",
459 char *prec_type,
u8 * prec_bitmap)
475 vlib_cli_output (vm,
"enter operation [ge | lt] and precedence <0-7>)");
501 "EFD will be set for %s precedence %s%u%s.",
526 else if (
unformat (input,
"worker"))
530 else if (
unformat (input,
"monitor"))
535 else if (
unformat (input,
"drop_all"))
539 else if (
unformat (input,
"default"))
549 "worker | monitor | drop_all | default]");
552 else if (
unformat (input,
"disable"))
558 else if (
unformat (input,
"worker"))
562 else if (
unformat (input,
"monitor"))
567 else if (
unformat (input,
"drop_all"))
579 "worker | monitor | drop_all | all]");
582 else if (
unformat (input,
"worker_queue_hi_thresh"))
595 else if (
unformat (input,
"dpdk_device_hi_thresh"))
598 if (
unformat (input,
"%u", &thresh))
608 else if (
unformat (input,
"consec_full_frames_hi_thresh"))
611 if (
unformat (input,
"%u", &thresh))
621 else if (
unformat (input,
"ip-prec"))
626 else if (
unformat (input,
"mpls-exp"))
631 else if (
unformat (input,
"vlan-cos"))
640 " set efd enable <dpdk | worker | monitor | drop_all | default> |\n" 641 " set efd disable <dpdk | worker | monitor | drop_all | all> |\n" 642 " set efd <ip-prec | mpls-exp | vlan-cos> <ge | lt> <0-7>\n" 643 " set efd worker_queue_hi_thresh <0-32> |\n" 644 " set efd dpdk_device_hi_thresh <0-%d> |\n" 645 " set efd consec_full_frames_hi_thresh <count> |\n",
667 .short_help =
"set early-fast-discard commands",
680 u32 hw_if_index = (
u32) ~ 0;
681 u32 nb_rx_desc = (
u32) ~ 0;
682 u32 nb_tx_desc = (
u32) ~ 0;
694 else if (
unformat (line_input,
"tx %d", &nb_tx_desc))
696 else if (
unformat (line_input,
"rx %d", &nb_rx_desc))
705 if (hw_if_index == (
u32) ~ 0)
715 if ((nb_rx_desc == (
u32) ~ 0 || nb_rx_desc == xd->
nb_rx_desc) &&
719 if (nb_rx_desc != (
u32) ~ 0)
722 if (nb_tx_desc != (
u32) ~ 0)
732 .path =
"set dpdk interface descriptors",
733 .short_help =
"set dpdk interface descriptors <if-name> [rx <n>] [tx <n>]",
771 .path =
"show dpdk interface placement",
772 .short_help =
"show dpdk interface placement",
804 u32 hw_if_index = (
u32) ~ 0;
818 else if (
unformat (line_input,
"queue %d", &queue))
820 else if (
unformat (line_input,
"thread %d", &cpu))
829 if (hw_if_index == (
u32) ~ 0)
832 if (cpu < dm->input_cpu_first_index ||
865 VLIB_NODE_STATE_DISABLED);
869 VLIB_NODE_STATE_POLLING);
882 .path =
"set dpdk interface placement",
883 .short_help =
"set dpdk interface placement <if-name> [queue <n>] thread <n>",
920 .path =
"show dpdk interface hqos placement",
921 .short_help =
"show dpdk interface hqos placement",
935 u32 hw_if_index = (
u32) ~ 0;
948 else if (
unformat (line_input,
"thread %d", &cpu))
957 if (hw_if_index == (
u32) ~ 0)
960 if (cpu < dm->hqos_cpu_first_index ||
998 .path =
"set dpdk interface hqos placement",
999 .short_help =
"set dpdk interface hqos placement <if-name> thread <n>",
1012 u32 hw_if_index = (
u32) ~ 0;
1013 u32 subport_id = (
u32) ~ 0;
1015 u32 profile_id = (
u32) ~ 0;
1027 else if (
unformat (line_input,
"subport %d", &subport_id))
1029 else if (
unformat (line_input,
"pipe %d", &pipe_id))
1031 else if (
unformat (line_input,
"profile %d", &profile_id))
1040 if (hw_if_index == (
u32) ~ 0)
1047 rte_sched_pipe_config (xd->
hqos_ht->
hqos, subport_id, pipe_id,
1058 .path =
"set dpdk interface hqos pipe",
1059 .short_help =
"set dpdk interface hqos pipe <if-name> subport <n> pipe <n> " 1073 u32 hw_if_index = (
u32) ~ 0;
1074 u32 subport_id = (
u32) ~ 0;
1075 struct rte_sched_subport_params p = {
1076 .tb_rate = 1250000000,
1078 .tc_rate = {1250000000, 1250000000, 1250000000, 1250000000},
1092 else if (
unformat (line_input,
"subport %d", &subport_id))
1094 else if (
unformat (line_input,
"rate %d", &p.tb_rate))
1096 p.tc_rate[0] = p.tb_rate;
1097 p.tc_rate[1] = p.tb_rate;
1098 p.tc_rate[2] = p.tb_rate;
1099 p.tc_rate[3] = p.tb_rate;
1101 else if (
unformat (line_input,
"bktsize %d", &p.tb_size))
1103 else if (
unformat (line_input,
"tc0 %d", &p.tc_rate[0]))
1105 else if (
unformat (line_input,
"tc1 %d", &p.tc_rate[1]))
1107 else if (
unformat (line_input,
"tc2 %d", &p.tc_rate[2]))
1109 else if (
unformat (line_input,
"tc3 %d", &p.tc_rate[3]))
1111 else if (
unformat (line_input,
"period %d", &p.tc_period))
1120 if (hw_if_index == (
u32) ~ 0)
1126 rv = rte_sched_subport_config (xd->
hqos_ht->
hqos, subport_id, &p);
1135 .path =
"set dpdk interface hqos subport",
1136 .short_help =
"set dpdk interface hqos subport <if-name> subport <n> " 1137 "[rate <n>] [bktsize <n>] [tc0 <n>] [tc1 <n>] [tc2 <n>] [tc3 <n>] " 1152 u32 hw_if_index = (
u32) ~ 0;
1153 u32 entry, tc, queue, val,
i;
1164 else if (
unformat (line_input,
"entry %d", &entry))
1166 else if (
unformat (line_input,
"tc %d", &tc))
1168 else if (
unformat (line_input,
"queue %d", &queue))
1177 if (hw_if_index == (
u32) ~ 0)
1181 if (tc >= RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE)
1183 if (queue >= RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS)
1193 int worker_thread_count = tr->
count;
1195 val = tc * RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS + queue;
1196 for (i = 0; i < worker_thread_count; i++)
1204 .path =
"set dpdk interface hqos tctbl",
1205 .short_help =
"set dpdk interface hqos tctbl <if-name> entry <n> tc <n> queue <n>",
1219 struct rte_eth_dev_info dev_info;
1223 u32 hw_if_index = (
u32) ~ 0;
1229 int worker_thread_count = tr->
count;
1236 u32 n_subports_per_port, n_pipes_per_subport, tctbl_size;
1250 else if (
unformat (line_input,
"id %d", &
id))
1252 else if (
unformat (line_input,
"offset %d", &offset))
1254 else if (
unformat (line_input,
"mask %llx", &mask))
1264 if (hw_if_index == (
u32) ~ 0)
1271 if (dev_info.pci_dev)
1273 vlib_pci_addr_t pci_addr;
1275 pci_addr.domain = dev_info.pci_dev->addr.domain;
1276 pci_addr.bus = dev_info.pci_dev->addr.bus;
1277 pci_addr.slot = dev_info.pci_dev->addr.devid;
1278 pci_addr.function = dev_info.pci_dev->addr.function;
1289 if (devconf->hqos_enabled == 0)
1295 n_subports_per_port = devconf->hqos.port.n_subports_per_port;
1296 n_pipes_per_subport = devconf->hqos.port.n_pipes_per_subport;
1297 tctbl_size = RTE_DIM (devconf->hqos.tc_table);
1308 "(n_subports_per_port = %u)",
1309 n_subports_per_port);
1314 "(n_pipes_per_subport = %u)",
1315 n_pipes_per_subport);
1321 "(TC table size = %u)", tctbl_size);
1325 for (i = 0; i < worker_thread_count; i++)
1332 __builtin_ctzll (mask);
1338 __builtin_ctzll (mask);
1345 __builtin_ctzll (mask);
1353 .path =
"set dpdk interface hqos pktfield",
1354 .short_help =
"set dpdk interface hqos pktfield <if-name> id <n> offset <n> " 1373 u32 hw_if_index = (
u32) ~ 0;
1375 struct rte_eth_dev_info dev_info;
1396 if (hw_if_index == (
u32) ~ 0)
1403 if (dev_info.pci_dev)
1405 vlib_pci_addr_t pci_addr;
1407 pci_addr.domain = dev_info.pci_dev->addr.domain;
1408 pci_addr.bus = dev_info.pci_dev->addr.bus;
1409 pci_addr.slot = dev_info.pci_dev->addr.devid;
1410 pci_addr.function = dev_info.pci_dev->addr.function;
1421 if (devconf->hqos_enabled == 0)
1431 cfg = &devconf->hqos;
1444 " Packet field 0: slab position = %4u, slab bitmask = 0x%016llx",
1447 " Packet field 1: slab position = %4u, slab bitmask = 0x%016llx",
1450 " Packet field 2: slab position = %4u, slab bitmask = 0x%016llx",
1454 "%2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u",
1455 tctbl[0], tctbl[1], tctbl[2], tctbl[3],
1456 tctbl[4], tctbl[5], tctbl[6], tctbl[7],
1457 tctbl[8], tctbl[9], tctbl[10], tctbl[11],
1458 tctbl[12], tctbl[13], tctbl[14], tctbl[15]);
1460 "%2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u",
1461 tctbl[16], tctbl[17], tctbl[18], tctbl[19],
1462 tctbl[20], tctbl[21], tctbl[22], tctbl[23],
1463 tctbl[24], tctbl[25], tctbl[26], tctbl[27],
1464 tctbl[28], tctbl[29], tctbl[30], tctbl[31]);
1466 "%2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u",
1467 tctbl[32], tctbl[33], tctbl[34], tctbl[35],
1468 tctbl[36], tctbl[37], tctbl[38], tctbl[39],
1469 tctbl[40], tctbl[41], tctbl[42], tctbl[43],
1470 tctbl[44], tctbl[45], tctbl[46], tctbl[47]);
1472 "%2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u %2u",
1473 tctbl[48], tctbl[49], tctbl[50], tctbl[51],
1474 tctbl[52], tctbl[53], tctbl[54], tctbl[55],
1475 tctbl[56], tctbl[57], tctbl[58], tctbl[59],
1476 tctbl[60], tctbl[61], tctbl[62], tctbl[63]);
1482 cfg->
port.frame_overhead);
1484 cfg->
port.n_subports_per_port);
1486 cfg->
port.n_pipes_per_subport);
1488 " Packet queue size: TC0 = %u, TC1 = %u, TC2 = %u, TC3 = %u packets",
1489 cfg->
port.qsize[0], cfg->
port.qsize[1], cfg->
port.qsize[2],
1490 cfg->
port.qsize[3]);
1492 cfg->
port.n_pipe_profiles);
1494 for (profile_id = 0; profile_id <
vec_len (cfg->
pipe); profile_id++)
1498 cfg->
pipe[profile_id].tb_rate);
1500 cfg->
pipe[profile_id].tb_size);
1502 " Traffic class rate: TC0 = %u, TC1 = %u, TC2 = %u, TC3 = %u bytes/second",
1503 cfg->
pipe[profile_id].tc_rate[0],
1504 cfg->
pipe[profile_id].tc_rate[1],
1505 cfg->
pipe[profile_id].tc_rate[2],
1506 cfg->
pipe[profile_id].tc_rate[3]);
1508 cfg->
pipe[profile_id].tc_period);
1509 #ifdef RTE_SCHED_SUBPORT_TC_OV 1511 cfg->
pipe[profile_id].tc_ov_weight);
1514 for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++)
1517 " TC%u WRR weights: Q0 = %u, Q1 = %u, Q2 = %u, Q3 = %u",
1518 i, cfg->
pipe[profile_id].wrr_weights[i * 4],
1519 cfg->
pipe[profile_id].wrr_weights[i * 4 + 1],
1520 cfg->
pipe[profile_id].wrr_weights[i * 4 + 2],
1521 cfg->
pipe[profile_id].wrr_weights[i * 4 + 3]);
1525 #ifdef RTE_SCHED_RED 1527 for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++)
1530 cfg->
port.red_params[i][e_RTE_METER_GREEN].min_th,
1531 cfg->
port.red_params[i][e_RTE_METER_YELLOW].min_th,
1532 cfg->
port.red_params[i][e_RTE_METER_RED].min_th);
1535 cfg->
port.red_params[i][e_RTE_METER_GREEN].max_th,
1536 cfg->
port.red_params[i][e_RTE_METER_YELLOW].max_th,
1537 cfg->
port.red_params[i][e_RTE_METER_RED].max_th);
1540 " TC%u inverted probability: G = %u, Y = %u, R = %u",
1541 i, cfg->
port.red_params[i][e_RTE_METER_GREEN].maxp_inv,
1542 cfg->
port.red_params[i][e_RTE_METER_YELLOW].maxp_inv,
1543 cfg->
port.red_params[i][e_RTE_METER_RED].maxp_inv);
1546 cfg->
port.red_params[i][e_RTE_METER_GREEN].wq_log2,
1547 cfg->
port.red_params[i][e_RTE_METER_YELLOW].wq_log2,
1548 cfg->
port.red_params[i][e_RTE_METER_RED].wq_log2);
1557 .path =
"show dpdk interface hqos",
1558 .short_help =
"show dpdk interface hqos <if-name>",
unformat_function_t unformat_vnet_hw_interface
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
char * file_name
File name of pcap output.
sll srl srl sll sra u16x4 i
static void show_dpdk_device_stats(vlib_main_t *vm, dpdk_device_t *xd)
u32 n_packets_to_capture
Number of packets to capture.
static clib_error_t * show_dpdk_if_placement(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define VLIB_EFD_DISCARD_ENABLED
int dpdk_hqos_validate_mask(u64 mask, u32 n)
static clib_error_t * set_dpdk_if_placement(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static clib_error_t * set_dpdk_if_hqos_placement(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static vnet_hw_interface_t * vnet_get_hw_interface(vnet_main_t *vnm, u32 hw_if_index)
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
dpdk_device_and_queue_t ** devices_by_hqos_cpu
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
static clib_error_t * parse_op_and_prec(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd, char *prec_type, u8 *prec_bitmap)
struct rte_sched_port_params port
vlib_buffer_main_t * buffer_main
vlib_worker_thread_t * vlib_worker_threads
struct rte_sched_port * hqos
unformat_function_t unformat_vnet_sw_interface
static clib_error_t * show_dpdk_buffer(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define clib_error_report(e)
#define DPDK_DEVICE_FLAG_PMD
clib_error_t * dpdk_port_setup(dpdk_main_t *dm, dpdk_device_t *xd)
struct rte_sched_pipe_params * pipe
void * dpdk_input_efd_multiarch_select()
vlib_node_function_t * function
#define VLIB_INIT_FUNCTION(x)
vlib_node_registration_t dpdk_input_node
(constructor) VLIB_REGISTER_NODE (dpdk_input_node)
dpdk_device_config_t default_devconf
int input_cpu_first_index
static clib_error_t * set_dpdk_if_hqos_subport(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
vlib_frame_queue_t ** vlib_frame_queues
static clib_error_t * show_dpdk_if_hqos(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
dpdk_device_hqos_per_worker_thread_t * hqos_wt
#define VLIB_EFD_MONITOR_ENABLED
void * dpdk_input_multiarch_select()
static heap_elt_t * first(heap_header_t *h)
u16 consec_full_frames_hi_thresh
vlib_main_t ** vlib_mains
static clib_error_t * pcap_trace_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
dpdk_device_and_queue_t ** devices_by_cpu
static clib_error_t * clear_efd(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
u32 consec_full_frames_cnt
static clib_error_t * set_dpdk_if_hqos_pipe(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define DPDK_EFD_DISCARD_ENABLED
#define DPDK_EFD_MONITOR_ENABLED
#define vec_del1(v, i)
Delete the element at index I.
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
static clib_error_t * set_dpdk_if_hqos_pktfield(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
struct rte_mempool ** pktmbuf_pools
u16 * cpu_socket_id_by_queue
#define vec_free(V)
Free vector's memory (no header).
static clib_error_t * test_dpdk_buffer(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
dpdk_device_config_t * dev_confs
static vlib_thread_main_t * vlib_get_thread_main()
static vlib_node_runtime_t * vlib_node_get_runtime(vlib_main_t *vm, u32 node_index)
Get node runtime by node index.
static int dpdk_device_queue_sort(void *a1, void *a2)
clib_error_t * pcap_write(pcap_main_t *pm)
Write PCAP file.
static clib_error_t * set_dpdk_if_desc(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define VLIB_CLI_COMMAND(x,...)
#define EFD_OPERATION_GREATER_OR_EQUAL
static clib_error_t * show_dpdk_if_hqos_placement(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
void * dpdk_input_rss_multiarch_select()
void vlib_buffer_free(vlib_main_t *vm, u32 *buffers, u32 n_buffers)
Free buffers Frees the entire buffer chain for each buffer.
static clib_error_t * set_dpdk_if_hqos_tctbl(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
dpdk_device_hqos_per_hqos_thread_t * hqos_ht
static void vlib_node_set_state(vlib_main_t *vm, u32 node_index, vlib_node_state_t new_state)
Set node dispatch state.
uword * thread_registrations_by_name
u32 vlib_buffer_alloc(vlib_main_t *vm, u32 *buffers, u32 n_buffers)
Allocate buffers into supplied array.
#define DPDK_NB_RX_DESC_10GE
static clib_error_t * show_efd(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
pcap_packet_type_t packet_type
Packet type.
static clib_error_t * set_efd(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
dpdk_efd_agent_t efd_agent
#define DPDK_EFD_DROPALL_ENABLED
void set_efd_bitmap(u8 *bitmap, u32 value, u32 op)
#define vec_sort_with_function(vec, f)
Sort a vector using the supplied element comparison function.
#define hash_get_mem(h, key)
struct clib_bihash_value offset
template key/value backing page structure
#define vec_foreach(var, vec)
Vector iterator.
#define EFD_OPERATION_LESS_THAN
#define clib_error_return(e, args...)
uword * device_config_index_by_pci_addr
static void show_efd_config(vlib_main_t *vm)
u32 n_packets_captured
Number of packets currently captured.
CLIB vectors are ubiquitous dynamically resized arrays with by user defined "headers".
clib_error_t * dpdk_cli_init(vlib_main_t *vm)
dpdk_config_main_t * conf