/* * Copyright (c) 2016 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file * @brief LISP sub-interfaces. * */ #ifndef __LISP_GPE_SUB_INTERFACE_H__ #define __LISP_GPE_SUB_INTERFACE_H__ #include /** * A Key for lookup in the L£ sub-interface DB */ typedef struct lisp_gpe_sub_interface_key_t_ { /** * The local-RLOC. This is the interface's 'source' address. */ ip_address_t local_rloc; /** * The VNI. In network byte order! */ u32 vni; } lisp_gpe_sub_interface_key_t; /** * @brief A LISP L3 sub-interface * * A LISP sub-interface is a multi-access interface, whose local address is a * single local-RLOC. Adjacencies that form on this sub-interface, represent * remote RLOCs. * This is analogous to an ethernet interface. * As with all interface types it can only be present in one VRF, hence a * LISP sub-interface is per-local-rloc and per-VNI. */ typedef struct lisp_gpe_sub_interface_t_ { /** * The interface's key inthe DB; rloc & vni; * The key is allocated from the heap so it can be used in the hash-table. * if it's part of the object, then it is subjet to realloc, which no-worky. */ lisp_gpe_sub_interface_key_t *key; /** * The Table-ID in the overlay that this interface is bound to. */ u32 eid_table_id; /** * A reference counting lock on the number of users of this interface. * When this count drops to 0 the interface is deleted. */ u32 locks; /** * The SW if index assigned to this sub-interface */ u32 sw_if_index; /** * The SW IF index assigned to the main interface of which this is a sub. */ u32 main_sw_if_index; } lisp_gpe_sub_interface_t; extern index_t lisp_gpe_sub_interface_find_or_create_and_lock (const ip_address_t * lrloc, u32 eid_table_id, u32 vni); extern u8 *format_lisp_gpe_sub_interface (u8 * s, va_list * ap); extern void lisp_gpe_sub_interface_unlock (index_t itf); extern const lisp_gpe_sub_interface_t *lisp_gpe_sub_interface_get (index_t itf); /** * A DB of all L3 sub-interfaces. The key is:{VNI,l-RLOC} */ extern uword *lisp_gpe_sub_interfaces_sw_if_index; /** * @brief * Get a VNET L3 interface matching the local-RLOC and VNI * Called from the data-plane */ always_inline u32 lisp_gpe_sub_interface_find_ip6 (const ip6_address_t * addr, u32 vni) { lisp_gpe_sub_interface_key_t key; const uword *p; ip_addr_v6 (&key.local_rloc).as_u64[0] = addr->as_u64[0]; ip_addr_v6 (&key.local_rloc).as_u64[1] = addr->as_u64[1]; ip_addr_version (&key.local_rloc) = AF_IP6; key.vni = vni; p = hash_get_mem (&lisp_gpe_sub_interfaces_sw_if_index, &key); if (NULL != p) return p[0]; return (INDEX_INVALID); } /** * @brief * Get a VNET L3 interface matching the local-RLOC and VNI * Called from the data-plane */ always_inline index_t lisp_gpe_sub_interface_find_ip4 (const ip4_address_t * addr, u32 vni) { lisp_gpe_sub_interface_key_t key; const uword *p; ip_addr_v4 (&key.local_rloc).as_u32 = addr->as_u32; key.local_rloc.version = AF_IP4; key.vni = vni; p = hash_get_mem (&lisp_gpe_sub_interfaces_sw_if_index, &key); if (NULL != p) return p[0]; return (INDEX_INVALID); } /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */ #endif