vl_api_vmxnet3_create_t *mp;
vmxnet3_create_if_args_t args;
int ret;
- u32 x[4];
+ u32 size;
- memset (&args, 0, sizeof (vmxnet3_create_if_args_t));
+ clib_memset (&args, 0, sizeof (vmxnet3_create_if_args_t));
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (i, "%x:%x:%x.%x", &x[0], &x[1], &x[2], &x[3]))
- {
- args.addr.domain = x[0];
- args.addr.bus = x[1];
- args.addr.slot = x[2];
- args.addr.function = x[3];
- }
+ if (unformat (i, "%U", unformat_vlib_pci_addr, &args.addr))
+ ;
else if (unformat (i, "elog"))
args.enable_elog = 1;
- else if (unformat (i, "rx-queue-size %u", &args.rxq_size))
- ;
- else if (unformat (i, "tx-queue-size %u", &args.txq_size))
- ;
+ else if (unformat (i, "bind"))
+ args.bind = 1;
+ else if (unformat (i, "gso"))
+ args.enable_gso = 1;
+ else if (unformat (i, "rx-queue-size %u", &size))
+ args.rxq_size = size;
+ else if (unformat (i, "tx-queue-size %u", &size))
+ args.txq_size = size;
+ else if (unformat (i, "num-tx-queues %u", &size))
+ args.txq_num = size;
+ else if (unformat (i, "num-rx-queues %u", &size))
+ args.rxq_num = size;
else
{
clib_warning ("unknown input '%U'", format_unformat_error, i);
mp->enable_elog = clib_host_to_net_u16 (args.enable_elog);
mp->rxq_size = clib_host_to_net_u16 (args.rxq_size);
mp->txq_size = clib_host_to_net_u16 (args.txq_size);
+ mp->txq_num = clib_host_to_net_u16 (args.txq_num);
+ mp->rxq_num = clib_host_to_net_u16 (args.rxq_num);
+ mp->bind = args.bind;
+ mp->enable_gso = args.enable_gso;
S (mp);
W (ret);
return ret;
}
+static u8 *
+format_pci_addr (u8 * s, va_list * va)
+{
+ vlib_pci_addr_t *addr = va_arg (*va, vlib_pci_addr_t *);
+ return format (s, "%04x:%02x:%02x.%x", addr->domain, addr->bus,
+ addr->slot, addr->function);
+}
+
static void
vl_api_vmxnet3_details_t_handler (vl_api_vmxnet3_details_t * mp)
{
vat_main_t *vam = vmxnet3_test_main.vat_main;
u32 pci_addr = ntohl (mp->pci_addr);
+ u16 qid;
fformat (vam->ofp, "%s: sw_if_index %u mac %U\n"
" version: %u\n"
" PCI Address: %U\n"
- " RX completion next index %u"
- " RX Queue %u\n"
- " ring 0 size %u fill %u consume %u produce %u\n"
- " ring 1 size %u fill %u consume %u produce %u\n"
- " TX completion next index %u"
- " TX Queue %u\n"
- " size %u consume %u produce %u\n"
" state %s\n",
mp->if_name, ntohl (mp->sw_if_index), format_ethernet_address,
mp->hw_addr, mp->version,
- format_vlib_pci_addr, &pci_addr,
- ntohs (mp->rx_next),
- ntohs (mp->rx_qid),
- ntohs (mp->rx_qsize), ntohs (mp->rx_fill[0]),
- ntohs (mp->rx_consume[0]),
- ntohs (mp->rx_produce[0]),
- ntohs (mp->rx_qsize), ntohs (mp->rx_fill[1]),
- ntohs (mp->rx_consume[1]),
- ntohs (mp->rx_produce[1]),
- ntohs (mp->tx_next),
- ntohs (mp->tx_qid),
- ntohs (mp->tx_qsize), ntohs (mp->tx_consume),
- ntohs (mp->tx_produce), mp->admin_up_down ? "up" : "down");
+ format_pci_addr, &pci_addr, mp->admin_up_down ? "up" : "down");
+ for (qid = 0; qid < mp->rx_count; qid++)
+ {
+ vl_api_vmxnet3_rx_list_t *rx_list = &mp->rx_list[qid];
+ fformat (vam->ofp,
+ " RX Queue %u\n"
+ " RX completion next index %u\n"
+ " ring 0 size %u fill %u consume %u produce %u\n"
+ " ring 1 size %u fill %u consume %u produce %u\n",
+ qid,
+ ntohs (rx_list->rx_next),
+ ntohs (rx_list->rx_qsize), ntohs (rx_list->rx_fill[0]),
+ ntohs (rx_list->rx_consume[0]),
+ ntohs (rx_list->rx_produce[0]),
+ ntohs (rx_list->rx_qsize), ntohs (rx_list->rx_fill[1]),
+ ntohs (rx_list->rx_consume[1]),
+ ntohs (rx_list->rx_produce[1]));
+ }
+ for (qid = 0; qid < mp->tx_count; qid++)
+ {
+ vl_api_vmxnet3_tx_list_t *tx_list = &mp->tx_list[qid];
+ fformat (vam->ofp,
+ " TX Queue %u\n"
+ " TX completion next index %u\n"
+ " size %u consume %u produce %u\n",
+ qid,
+ ntohs (tx_list->tx_next),
+ ntohs (tx_list->tx_qsize), ntohs (tx_list->tx_consume),
+ ntohs (tx_list->tx_produce));
+ }
}
/*
*/
#define foreach_vpe_api_msg \
_(vmxnet3_create, "<pci-address> [rx-queue-size <size>] " \
- "[tx-queue-size <size>]") \
-_(vmxnet3_delete, "<sw_if_index>") \
+ "[tx-queue-size <size>] [num-tx-queues <num>]" \
+ "[num-rx-queues <num>] [bind] [gso]") \
+_(vmxnet3_delete, "sw_if_index <sw_if_index>") \
_(vmxnet3_dump, "")
static void
name = format (0, "vmxnet3_%08x%c", api_version, 0);
vxm->msg_id_base = vl_client_get_first_plugin_msg_id ((char *) name);
+ vec_free (name);
+
+ if (vxm->msg_id_base == (u16) ~ 0)
+ return clib_error_return (0, "vmxnet3 plugin not loaded...");
/* Get the control ping ID */
#define _(id,n,crc) \
#undef _
vxm->ping_id = vl_msg_api_get_msg_index ((u8 *) (VL_API_CONTROL_PING_CRC));
- if (vxm->msg_id_base != (u16) ~ 0)
- vmxnet3_vat_api_hookup (vam);
-
- vec_free (name);
+ vmxnet3_vat_api_hookup (vam);
return 0;
}