Type: refactor Change-Id: I54df533a8f863c4e49742903cf2457f18b4fc506 Signed-off-by: Neale Ranns <nranns@cisco.com>
158 lines
3.9 KiB
C
158 lines
3.9 KiB
C
/*
|
|
* 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 <lisp/lisp-gpe/lisp_gpe.h>
|
|
|
|
/**
|
|
* 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
|