diff options
Diffstat (limited to 'src/vnet/pg/stream.c')
-rw-r--r-- | src/vnet/pg/stream.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/src/vnet/pg/stream.c b/src/vnet/pg/stream.c index 605567c1296..cf3d37d5e9e 100644 --- a/src/vnet/pg/stream.c +++ b/src/vnet/pg/stream.c @@ -171,7 +171,6 @@ pg_add_del_mac_address (vnet_hw_interface_t * hi, return (NULL); } -/* *INDENT-OFF* */ VNET_DEVICE_CLASS (pg_dev_class) = { .name = "pg", .tx_function = pg_output, @@ -180,7 +179,6 @@ VNET_DEVICE_CLASS (pg_dev_class) = { .admin_up_down_function = pg_interface_admin_up_down, .mac_addr_add_del_function = pg_add_del_mac_address, }; -/* *INDENT-ON* */ static u8 * pg_build_rewrite (vnet_main_t * vnm, @@ -197,12 +195,10 @@ pg_build_rewrite (vnet_main_t * vnm, return (rewrite); } -/* *INDENT-OFF* */ VNET_HW_INTERFACE_CLASS (pg_interface_class,static) = { .name = "Packet generator", .build_rewrite = pg_build_rewrite, }; -/* *INDENT-ON* */ static u32 pg_eth_flag_change (vnet_main_t * vnm, vnet_hw_interface_t * hi, u32 flags) @@ -245,10 +241,11 @@ VNET_HW_INTERFACE_CLASS (pg_tun_hw_interface_class) = { .build_rewrite = NULL, //.update_adjacency = gre_update_adj, .flags = VNET_HW_INTERFACE_CLASS_FLAG_P2P, + .tx_hash_fn_type = VNET_HASH_FN_TYPE_IP, }; u32 -pg_interface_add_or_get (pg_main_t *pg, uword if_id, u8 gso_enabled, +pg_interface_add_or_get (pg_main_t *pg, u32 if_id, u8 gso_enabled, u32 gso_size, u8 coalesce_enabled, pg_interface_mode_t mode) { @@ -267,6 +264,7 @@ pg_interface_add_or_get (pg_main_t *pg, uword if_id, u8 gso_enabled, } else { + vnet_eth_interface_registration_t eir = {}; u8 hw_addr[6]; f64 now = vlib_time_now (vm); u32 rnd; @@ -286,8 +284,11 @@ pg_interface_add_or_get (pg_main_t *pg, uword if_id, u8 gso_enabled, switch (pi->mode) { case PG_MODE_ETHERNET: - ethernet_register_interface (vnm, pg_dev_class.index, i, hw_addr, - &pi->hw_if_index, pg_eth_flag_change); + eir.dev_class_index = pg_dev_class.index; + eir.dev_instance = i; + eir.address = hw_addr; + eir.cb.flag_change = pg_eth_flag_change; + pi->hw_if_index = vnet_eth_register_interface (vnm, &eir); break; case PG_MODE_IP4: case PG_MODE_IP6: @@ -298,7 +299,7 @@ pg_interface_add_or_get (pg_main_t *pg, uword if_id, u8 gso_enabled, hi = vnet_get_hw_interface (vnm, pi->hw_if_index); if (gso_enabled) { - hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO; + vnet_hw_if_set_caps (vnm, pi->hw_if_index, VNET_HW_IF_CAP_TCP_GSO); pi->gso_enabled = 1; pi->gso_size = gso_size; if (coalesce_enabled) @@ -310,8 +311,8 @@ pg_interface_add_or_get (pg_main_t *pg, uword if_id, u8 gso_enabled, hash_set (pg->if_index_by_if_id, if_id, i); - vec_validate (pg->if_id_by_sw_if_index, hi->sw_if_index); - pg->if_id_by_sw_if_index[hi->sw_if_index] = i; + vec_validate (pg->if_index_by_sw_if_index, hi->sw_if_index); + pg->if_index_by_sw_if_index[hi->sw_if_index] = i; if (vlib_num_workers ()) { @@ -555,6 +556,11 @@ pg_stream_add (pg_main_t * pg, pg_stream_t * s_init) */ s->sw_if_index[VLIB_RX] = pi->sw_if_index; } + else if (vec_len (pg->if_index_by_sw_if_index) <= s->sw_if_index[VLIB_RX]) + { + vec_validate (pg->if_index_by_sw_if_index, s->sw_if_index[VLIB_RX]); + pg->if_index_by_sw_if_index[s->sw_if_index[VLIB_RX]] = s->pg_if_index; + } /* Connect the graph. */ s->next_index = vlib_node_add_next (vm, device_input_node.index, |