blob: 1580351611c777f822b84e0cd34d0559cac63c42 [file] [log] [blame]
/*
* 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-GPE definitions.
*/
#ifndef __LISP_GPE_FWD_ENTRY_H__
#define __LISP_GPE_FWD_ENTRY_H__
#include <vnet/lisp-gpe/lisp_gpe.h>
/**
* @brief A path on which to forward lisp traffic
*/
typedef struct lisp_fwd_path_t_
{
/**
* The adjacency constructed for the locator pair
*/
index_t lisp_adj;
/**
* Priority. Only the paths with the best priority will be installed in FIB
*/
u8 priority;
/**
* [UE]CMP weigt for the path
*/
u8 weight;
} lisp_fwd_path_t;
/**
* @brief A Forwarding entry can be 'normal' or 'negative'
* Negative implies we deliberately want to add a FIB entry for an EID
* that results in 'special' behaviour determined by an 'action'.
* @normal means send it down some tunnels.
*/
typedef enum lisp_gpe_fwd_entry_type_t_
{
LISP_GPE_FWD_ENTRY_TYPE_NORMAL,
LISP_GPE_FWD_ENTRY_TYPE_NEGATIVE,
} lisp_gpe_fwd_entry_type_t;
/**
* LISP-GPE fwd entry key
*/
typedef struct lisp_gpe_fwd_entry_key_t_
{
dp_address_t rmt;
dp_address_t lcl;
u32 vni;
} lisp_gpe_fwd_entry_key_t;
/**
* @brief A LISP Forwarding Entry
*
* A forwarding entry is from a locai EID to a remote EID over a set of rloc pairs
*/
typedef struct lisp_gpe_fwd_entry_t_
{
/**
* Follows src/dst or dst only forwarding policy
*/
u8 is_src_dst;
/**
* This object joins the FIB control plane graph to receive updates to
* for changes to the graph.
*/
fib_node_t node;
/**
* The Entry's key: {lEID,rEID,vni}
*/
lisp_gpe_fwd_entry_key_t *key;
/**
* The forwarding entry type
*/
lisp_gpe_fwd_entry_type_t type;
/**
* The tenant the entry belongs to
*/
u32 tenant;
/**
* The VRF (in the case of L3) or Bridge-Domain (for L2) index
*/
union
{
/**
* Fields relevant to an L2 entry
*/
struct
{
/**
* The VRF ID
*/
u32 eid_table_id;
/**
* The FIB index for the overlay, i.e. the FIB in which the EIDs
* are present
*/
u32 eid_fib_index;
/**
* The SRC-FIB index for created for anding source-route entries
*/
u32 src_fib_index;
};
/**
* Fields relevant to an L2 entry
*/
struct
{
/**
* The Bridge-Domain (for L2) index
*/
u32 eid_bd_id;
/**
* The Bridge-domain index for the overlay EIDs
*/
u32 eid_bd_index;
/**
* The path-list created for the forwarding
*/
fib_node_index_t path_list_index;
/**
* Child index of this entry on the path-list
*/
u32 child_index;
/**
* The DPO used to forward
*/
dpo_id_t dpo;
} l2;
/**
* Fields relevant to an NSH entry
*/
struct
{
/**
* The path-list created for the forwarding
*/
fib_node_index_t path_list_index;
/**
* Child index of this entry on the path-list
*/
u32 child_index;
/**
* The DPO contributed by NSH
*/
dpo_id_t dpo;
/**
* The DPO used for forwarding. Obtained after stacking tx node
* onto lb choice
*/
dpo_id_t choice;
} nsh;
};
union
{
/**
* @brief When the type is 'normal'
* The RLOC pair that form the route's paths. i.e. where to send
* packets for this route.
*/
lisp_fwd_path_t *paths;
/**
* @brief When the type is negative. The action to take.
*/
negative_fwd_actions_e action;
};
} lisp_gpe_fwd_entry_t;
extern int
vnet_lisp_gpe_add_del_fwd_entry (vnet_lisp_gpe_add_del_fwd_entry_args_t * a,
u32 * hw_if_indexp);
extern void vnet_lisp_gpe_fwd_entry_flush (void);
extern u32 lisp_l2_fib_lookup (lisp_gpe_main_t * lgm,
u16 bd_index, u8 src_mac[8], u8 dst_mac[8]);
extern const dpo_id_t *lisp_nsh_fib_lookup (lisp_gpe_main_t * lgm,
u32 spi_si);
extern void
vnet_lisp_gpe_del_fwd_counters (vnet_lisp_gpe_add_del_fwd_entry_args_t * a,
u32 fwd_entry_index);
extern void
vnet_lisp_gpe_add_fwd_counters (vnet_lisp_gpe_add_del_fwd_entry_args_t * a,
u32 fwd_entry_index);
extern u32 *vnet_lisp_gpe_get_fwd_entry_vnis (void);
#endif
/*
* fd.io coding-style-patch-verification: ON
*
* Local Variables:
* eval: (c-set-style "gnu")
* End:
*/