From 669f4e3416282ef022e6c59d09656b0563e5aae6 Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Mon, 28 Oct 2019 07:56:15 -0700 Subject: ethernet: VNET API to create sub-interfaces Type: refactor Change-Id: I37899a9c1c2b0790bee90b84aec6b51cdd5236b4 Signed-off-by: Neale Ranns --- src/vnet/ethernet/ethernet.h | 3 +++ src/vnet/ethernet/interface.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) (limited to 'src/vnet/ethernet') diff --git a/src/vnet/ethernet/ethernet.h b/src/vnet/ethernet/ethernet.h index 821a576ddf5..cde6fb90038 100644 --- a/src/vnet/ethernet/ethernet.h +++ b/src/vnet/ethernet/ethernet.h @@ -445,6 +445,9 @@ clib_error_t *next_by_ethertype_register (next_by_ethertype_t * l3_next, int vnet_create_loopback_interface (u32 * sw_if_indexp, u8 * mac_address, u8 is_specified, u32 user_instance); int vnet_delete_loopback_interface (u32 sw_if_index); +int vnet_create_sub_interface (u32 sw_if_index, u32 id, + u32 flags, u16 inner_vlan_id, + u16 outer_vlan_id, u32 * sub_sw_if_index); int vnet_delete_sub_interface (u32 sw_if_index); // Perform ethernet subinterface classification table lookups given diff --git a/src/vnet/ethernet/interface.c b/src/vnet/ethernet/interface.c index a0fa61c25f4..7b2b162f1a0 100644 --- a/src/vnet/ethernet/interface.c +++ b/src/vnet/ethernet/interface.c @@ -959,6 +959,48 @@ vnet_delete_loopback_interface (u32 sw_if_index) return 0; } +int +vnet_create_sub_interface (u32 sw_if_index, u32 id, + u32 flags, u16 inner_vlan_id, u16 outer_vlan_id, + u32 * sub_sw_if_index) +{ + vnet_main_t *vnm = vnet_get_main (); + vnet_interface_main_t *im = &vnm->interface_main; + vnet_hw_interface_t *hi; + u64 sup_and_sub_key = ((u64) (sw_if_index) << 32) | (u64) id; + vnet_sw_interface_t template; + uword *p; + u64 *kp; + + hi = vnet_get_sup_hw_interface (vnm, sw_if_index); + + p = hash_get_mem (im->sw_if_index_by_sup_and_sub, &sup_and_sub_key); + if (p) + { + return (VNET_API_ERROR_VLAN_ALREADY_EXISTS); + } + + clib_memset (&template, 0, sizeof (template)); + template.type = VNET_SW_INTERFACE_TYPE_SUB; + template.flood_class = VNET_FLOOD_CLASS_NORMAL; + template.sup_sw_if_index = sw_if_index; + template.sub.id = id; + template.sub.eth.raw_flags = flags; + template.sub.eth.outer_vlan_id = outer_vlan_id; + template.sub.eth.inner_vlan_id = inner_vlan_id; + + if (vnet_create_sw_interface (vnm, &template, sub_sw_if_index)) + return (VNET_API_ERROR_UNSPECIFIED); + + kp = clib_mem_alloc (sizeof (*kp)); + *kp = sup_and_sub_key; + + hash_set (hi->sub_interface_sw_if_index_by_id, id, *sub_sw_if_index); + hash_set_mem (im->sw_if_index_by_sup_and_sub, kp, *sub_sw_if_index); + + return (0); +} + int vnet_delete_sub_interface (u32 sw_if_index) { -- cgit 1.2.3-korg