dev: initial set of APIs
[vpp.git] / src / vnet / dev / api.c
index 73d315d..114b63d 100644 (file)
@@ -90,6 +90,18 @@ vnet_dev_api_attach (vlib_main_t *vm, vnet_dev_api_attach_args_t *args)
     }
   dev->description = dev_desc;
 
+  if (driver->registration->args)
+    for (vnet_dev_arg_t *a = driver->registration->args;
+        a->type != VNET_DEV_ARG_END; a++)
+      vec_add1 (dev->args, *a);
+
+  if (args->args)
+    {
+      if ((rv = vnet_dev_arg_parse (vm, dev, dev->args, args->args)) !=
+         VNET_DEV_OK)
+       goto done;
+    }
+
   if ((args->flags.e & VNET_DEV_F_NO_STATS) == 0)
     dev->poll_stats = 1;
 
@@ -103,6 +115,8 @@ done:
 
   if (rv != VNET_DEV_OK && dev)
     vnet_dev_process_call_op_no_rv (vm, dev, vnet_dev_free);
+  else if (dev)
+    args->dev_index = dev->index;
 
   return rv;
 }
@@ -110,7 +124,7 @@ done:
 vnet_dev_rv_t
 vnet_dev_api_detach (vlib_main_t *vm, vnet_dev_api_detach_args_t *args)
 {
-  vnet_dev_t *dev = vnet_dev_by_id (args->device_id);
+  vnet_dev_t *dev = vnet_dev_by_index (args->dev_index);
 
   log_debug (dev, "detach");
 
@@ -140,15 +154,16 @@ vnet_dev_rv_t
 vnet_dev_api_create_port_if (vlib_main_t *vm,
                             vnet_dev_api_create_port_if_args_t *args)
 {
-  vnet_dev_t *dev = vnet_dev_by_id (args->device_id);
+  vnet_dev_t *dev = vnet_dev_by_index (args->dev_index);
   vnet_dev_port_t *port = 0;
   u16 n_threads = vlib_get_n_threads ();
   int default_is_intr_mode;
+  vnet_dev_rv_t rv;
 
   log_debug (dev,
-            "create_port_if: device '%s' port %u intf_name '%s' num_rx_q %u "
+            "create_port_if: dev_index %u port %u intf_name '%s' num_rx_q %u "
             "num_tx_q %u rx_q_sz %u tx_q_sz %u, flags '%U' args '%v'",
-            args->device_id, args->port_id, args->intf_name,
+            args->dev_index, args->port_id, args->intf_name,
             args->num_rx_queues, args->num_tx_queues, args->rx_queue_size,
             args->tx_queue_size, format_vnet_dev_port_flags, &args->flags,
             args->args);
@@ -169,6 +184,13 @@ vnet_dev_api_create_port_if (vlib_main_t *vm,
   if (port->interface_created)
     return VNET_DEV_ERR_ALREADY_EXISTS;
 
+  if (args->args)
+    {
+      rv = vnet_dev_arg_parse (vm, dev, port->args, args->args);
+      if (rv != VNET_DEV_OK)
+       return rv;
+    }
+
   default_is_intr_mode = (args->flags.e & VNET_DEV_PORT_F_INTERRUPT_MODE) != 0;
   if (default_is_intr_mode && port->attr.caps.interrupt_mode == 0)
     {
@@ -217,7 +239,10 @@ vnet_dev_api_create_port_if (vlib_main_t *vm,
   clib_memcpy (port->intf.name, args->intf_name, sizeof (port->intf.name));
   port->intf.default_is_intr_mode = default_is_intr_mode;
 
-  return vnet_dev_process_call_port_op (vm, port, vnet_dev_port_if_create);
+  rv = vnet_dev_process_call_port_op (vm, port, vnet_dev_port_if_create);
+  args->sw_if_index = (rv == VNET_DEV_OK) ? port->intf.sw_if_index : ~0;
+
+  return rv;
 }
 
 vnet_dev_rv_t