summaryrefslogtreecommitdiffstats
path: root/src/vnet/dev/api.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/dev/api.c')
-rw-r--r--src/vnet/dev/api.c97
1 files changed, 78 insertions, 19 deletions
diff --git a/src/vnet/dev/api.c b/src/vnet/dev/api.c
index 48ceccf3b6c..d968f66c316 100644
--- a/src/vnet/dev/api.c
+++ b/src/vnet/dev/api.c
@@ -156,6 +156,7 @@ vnet_dev_api_create_port_if (vlib_main_t *vm,
{
vnet_dev_t *dev = vnet_dev_by_index (args->dev_index);
vnet_dev_port_t *port = 0;
+ vnet_dev_port_if_create_args_t a = {};
u16 n_threads = vlib_get_n_threads ();
int default_is_intr_mode;
vnet_dev_rv_t rv;
@@ -181,7 +182,7 @@ vnet_dev_api_create_port_if (vlib_main_t *vm,
if (!port)
return VNET_DEV_ERR_INVALID_DEVICE_ID;
- if (port->interface_created)
+ if (port->interfaces)
return VNET_DEV_ERR_ALREADY_EXISTS;
if (args->args)
@@ -202,47 +203,82 @@ vnet_dev_api_create_port_if (vlib_main_t *vm,
{
if (args->num_rx_queues > port->attr.max_rx_queues)
return VNET_DEV_ERR_INVALID_NUM_RX_QUEUES;
- port->intf.num_rx_queues = args->num_rx_queues;
+ a.num_rx_queues = args->num_rx_queues;
}
else
- port->intf.num_rx_queues = clib_min (port->attr.max_tx_queues, 1);
+ a.num_rx_queues = clib_min (port->attr.max_tx_queues, 1);
if (args->num_tx_queues)
{
if (args->num_tx_queues > port->attr.max_tx_queues)
return VNET_DEV_ERR_INVALID_NUM_TX_QUEUES;
- port->intf.num_tx_queues = args->num_tx_queues;
+ a.num_tx_queues = args->num_tx_queues;
}
else
- port->intf.num_tx_queues = clib_min (port->attr.max_tx_queues, n_threads);
+ a.num_tx_queues = clib_min (port->attr.max_tx_queues, n_threads);
if (args->rx_queue_size)
{
if (!_vnet_dev_queue_size_validate (args->rx_queue_size,
port->rx_queue_config))
return VNET_DEV_ERR_INVALID_RX_QUEUE_SIZE;
- port->intf.rxq_sz = args->rx_queue_size;
+ a.rxq_sz = args->rx_queue_size;
}
else
- port->intf.rxq_sz = port->rx_queue_config.default_size;
+ a.rxq_sz = port->rx_queue_config.default_size;
if (args->tx_queue_size)
{
if (!_vnet_dev_queue_size_validate (args->tx_queue_size,
port->tx_queue_config))
return VNET_DEV_ERR_INVALID_TX_QUEUE_SIZE;
- port->intf.txq_sz = args->tx_queue_size;
+ a.txq_sz = args->tx_queue_size;
}
else
- port->intf.txq_sz = port->tx_queue_config.default_size;
+ a.txq_sz = port->tx_queue_config.default_size;
- clib_memcpy (port->intf.name, args->intf_name, sizeof (port->intf.name));
- port->intf.default_is_intr_mode = default_is_intr_mode;
- port->intf.consistent_qp =
- (args->flags.n & VNET_DEV_PORT_F_CONSISTENT_QP) != 0;
+ clib_memcpy (a.name, args->intf_name, sizeof (a.name));
+ a.default_is_intr_mode = default_is_intr_mode;
+ a.consistent_qp = (args->flags.n & VNET_DEV_PORT_F_CONSISTENT_QP) != 0;
- 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;
+ rv = vnet_dev_process_call_port_op_with_ptr (vm, port,
+ vnet_dev_port_if_create, &a);
+ args->sw_if_index = (rv == VNET_DEV_OK) ? a.sw_if_index : ~0;
+
+ return rv;
+}
+
+vnet_dev_rv_t
+vnet_dev_api_port_add_sec_if (vlib_main_t *vm,
+ vnet_dev_api_port_add_sec_if_args_t *args)
+{
+ vnet_dev_port_t *port = 0;
+ vnet_dev_t *dev = 0;
+ vnet_dev_port_sec_if_create_args_t a = {};
+ vnet_dev_rv_t rv = VNET_DEV_OK;
+
+ port = vnet_dev_get_port_from_sw_if_index (args->primary_sw_if_index);
+ if (port == 0)
+ return VNET_DEV_ERR_NOT_FOUND;
+
+ log_debug (dev,
+ "create_port_if: primary_sw_if_index %u intf_name '%s' "
+ "args '%v'",
+ args->primary_sw_if_index, args->intf_name, args->args);
+
+ if (port->interfaces == 0)
+ return VNET_DEV_ERR_PRIMARY_INTERFACE_MISSING;
+
+ clib_memcpy (a.name, args->intf_name, sizeof (a.name));
+ a.args = args->args;
+
+ rv = vnet_dev_process_call_port_op_with_ptr (vm, port,
+ vnet_dev_port_add_sec_if, &a);
+
+ if (rv != VNET_DEV_OK)
+ args->sw_if_index = ~0;
+ else
+ args->sw_if_index = a.sw_if_index;
return rv;
}
@@ -251,9 +287,23 @@ vnet_dev_rv_t
vnet_dev_api_remove_port_if (vlib_main_t *vm,
vnet_dev_api_remove_port_if_args_t *args)
{
+ vnet_dev_port_t *port;
+
+ port = vnet_dev_get_port_from_sw_if_index (args->sw_if_index);
+
+ if (port == 0)
+ return VNET_DEV_ERR_UNKNOWN_INTERFACE;
+
+ return vnet_dev_process_call_port_op (vm, port, vnet_dev_port_if_remove);
+}
+
+vnet_dev_rv_t
+vnet_dev_api_port_del_sec_if (vlib_main_t *vm,
+ vnet_dev_api_port_del_sec_if_args_t *args)
+{
vnet_dev_main_t *dm = &vnet_dev_main;
vnet_main_t *vnm = vnet_get_main ();
- vnet_sw_interface_t *si;
+ vnet_sw_interface_t *si, *sup_si;
vnet_hw_interface_t *hi;
vnet_dev_port_t *port;
@@ -261,7 +311,14 @@ vnet_dev_api_remove_port_if (vlib_main_t *vm,
if (!si)
return VNET_DEV_ERR_UNKNOWN_INTERFACE;
- hi = vnet_get_hw_interface_or_null (vnm, si->hw_if_index);
+ if (si->sup_sw_if_index == si->sw_if_index)
+ return VNET_DEV_ERR_UNKNOWN_INTERFACE;
+
+ sup_si = vnet_get_sw_interface_or_null (vnm, si->sup_sw_if_index);
+ if (!sup_si)
+ return VNET_DEV_ERR_UNKNOWN_INTERFACE;
+
+ hi = vnet_get_hw_interface_or_null (vnm, sup_si->hw_if_index);
if (!hi)
return VNET_DEV_ERR_UNKNOWN_INTERFACE;
@@ -270,8 +327,10 @@ vnet_dev_api_remove_port_if (vlib_main_t *vm,
port = vnet_dev_get_port_from_dev_instance (hi->dev_instance);
- if (port->intf.hw_if_index != si->hw_if_index)
+ if (port->interfaces->primary_interface.hw_if_index != si->hw_if_index)
return VNET_DEV_ERR_UNKNOWN_INTERFACE;
- return vnet_dev_process_call_port_op (vm, port, vnet_dev_port_if_remove);
+ return vnet_dev_process_call_port_op_with_ptr (
+ vm, port, vnet_dev_port_del_sec_if,
+ &(vnet_dev_port_del_sec_if_args_t){ .sw_if_index = args->sw_if_index });
}