diff options
Diffstat (limited to 'src/vnet/dev/dev_funcs.h')
-rw-r--r-- | src/vnet/dev/dev_funcs.h | 98 |
1 files changed, 85 insertions, 13 deletions
diff --git a/src/vnet/dev/dev_funcs.h b/src/vnet/dev/dev_funcs.h index 0531b17a009..f47344b0cea 100644 --- a/src/vnet/dev/dev_funcs.h +++ b/src/vnet/dev/dev_funcs.h @@ -60,6 +60,18 @@ vnet_dev_get_dev_instance (u32 dev_instance) return pool_elt_at_index (dm->dev_instances, dev_instance); } +static_always_inline vnet_dev_port_interface_t * +vnet_dev_port_get_primary_if (vnet_dev_port_t *p) +{ + return &p->interfaces->primary_interface; +} + +static_always_inline vnet_dev_port_interface_t * +vnet_dev_port_get_sec_if_by_index (vnet_dev_port_t *p, u32 index) +{ + return *pool_elt_at_index (p->interfaces->secondary_interfaces, index); +} + static_always_inline vnet_dev_port_t * vnet_dev_get_port_from_dev_instance (u32 dev_instance) { @@ -76,7 +88,8 @@ vnet_dev_get_port_from_hw_if_index (u32 hw_if_index) hw = vnet_get_hw_interface (vnet_get_main (), hw_if_index); port = vnet_dev_get_port_from_dev_instance (hw->dev_instance); - if (!port || port->intf.hw_if_index != hw_if_index) + if (!port || !port->interfaces || + port->interfaces->primary_interface.hw_if_index != hw_if_index) return 0; return port; @@ -85,19 +98,32 @@ vnet_dev_get_port_from_hw_if_index (u32 hw_if_index) static_always_inline u32 vnet_dev_get_rx_queue_if_sw_if_index (vnet_dev_rx_queue_t *rxq) { - return rxq->port->intf.sw_if_index; + return rxq->port->interfaces->primary_interface.sw_if_index; } static_always_inline u32 vnet_dev_get_rx_queue_if_hw_if_index (vnet_dev_rx_queue_t *rxq) { - return rxq->port->intf.hw_if_index; + return rxq->port->interfaces->primary_interface.hw_if_index; } static_always_inline u32 vnet_dev_get_port_rx_node_index (vnet_dev_port_t *port) { - return port->intf.rx_node_index; + return port->interfaces->rx_node_index; +} + +static_always_inline vnet_dev_port_t * +vnet_dev_get_port_from_sw_if_index (u32 sw_if_index) +{ + vnet_main_t *vnm = vnet_get_main (); + vnet_sw_interface_t *si; + + si = vnet_get_sw_interface_or_null (vnm, sw_if_index); + if (!si) + return 0; + + return vnet_dev_get_port_from_hw_if_index (si->hw_if_index); } static_always_inline vnet_dev_t * @@ -219,22 +245,49 @@ vnet_dev_tx_queue_unlock_if_needed (vnet_dev_tx_queue_t *txq) __atomic_store_n (&txq->lock, 0, __ATOMIC_RELEASE); } +static_always_inline vnet_dev_rx_queue_if_rt_data_t * +vnet_dev_get_rx_queue_if_rt_data (vnet_dev_rx_queue_t *rxq) +{ + return &rxq->if_rt_data; +} + +static_always_inline vnet_dev_rx_queue_if_rt_data_t * +vnet_dev_get_rx_queue_sec_if_rt_data (vnet_dev_rx_queue_t *rxq, + u32 sec_if_index) +{ + return rxq->sec_if_rt_data[sec_if_index]; +} + static_always_inline vlib_buffer_template_t vnet_dev_get_rx_queue_if_buffer_template (vnet_dev_rx_queue_t *rxq) { - return rxq->buffer_template; + return rxq->if_rt_data.buffer_template; +} + +static_always_inline vlib_buffer_template_t +vnet_dev_get_rx_queue_sec_if_buffer_template (vnet_dev_rx_queue_t *rxq, + u32 sec_if_index) +{ + return rxq->sec_if_rt_data[sec_if_index]->buffer_template; } static_always_inline u16 vnet_dev_get_rx_queue_if_next_index (vnet_dev_rx_queue_t *rxq) { - return rxq->next_index; + return rxq->if_rt_data.next_index; +} + +static_always_inline u16 +vnet_dev_get_rx_queue_sec_if_next_index (vnet_dev_rx_queue_t *rxq, + u32 sec_if_index) +{ + return rxq->sec_if_rt_data[sec_if_index]->next_index; } static_always_inline u8 vnet_dev_get_rx_queue_buffer_pool_index (vnet_dev_rx_queue_t *rxq) { - return rxq->buffer_template.buffer_pool_index; + return rxq->if_rt_data.buffer_template.buffer_pool_index; } static_always_inline u32 @@ -269,8 +322,8 @@ static_always_inline vnet_dev_rx_queue_t * foreach_vnet_dev_rx_queue_runtime_helper (vlib_node_runtime_t *node, vnet_dev_rx_queue_t *rxq) { - vnet_dev_port_t *port; vnet_dev_rx_queue_rt_req_t req; + vnet_dev_port_interfaces_t *ifs; if (rxq == 0) rxq = vnet_dev_get_rx_node_runtime (node)->first_rx_queue; @@ -287,15 +340,34 @@ foreach_vnet_dev_rx_queue_runtime_helper (vlib_node_runtime_t *node, req.as_number = __atomic_exchange_n (&rxq->runtime_request.as_number, 0, __ATOMIC_ACQUIRE); - port = rxq->port; + ifs = rxq->port->interfaces; if (req.update_next_index) - rxq->next_index = port->intf.rx_next_index; + { + vnet_dev_port_interface_t **si = + rxq->port->interfaces->secondary_interfaces; + rxq->if_rt_data.next_index = ifs->primary_interface.rx_next_index; + vec_foreach_pointer (rtd, rxq->sec_if_rt_data) + if (rtd) + rtd->next_index = si[rtd->sec_if_index]->next_index; + } if (req.update_feature_arc) { - vlib_buffer_template_t *bt = &rxq->buffer_template; - bt->current_config_index = port->intf.current_config_index; - vnet_buffer (bt)->feature_arc_index = port->intf.feature_arc_index; + vnet_dev_port_interface_t **si = + rxq->port->interfaces->secondary_interfaces; + vlib_buffer_template_t *bt = &rxq->if_rt_data.buffer_template; + bt->current_config_index = ifs->primary_interface.current_config_index; + vnet_buffer (bt)->feature_arc_index = + ifs->primary_interface.feature_arc_index; + vec_foreach_pointer (rtd, rxq->sec_if_rt_data) + if (rtd) + { + vlib_buffer_template_t *bt = &rtd->buffer_template; + bt->current_config_index = + si[rtd->sec_if_index]->current_config_index; + vnet_buffer (bt)->feature_arc_index = + si[rtd->sec_if_index]->feature_arc_index; + } } if (req.suspend_on) |