diff options
author | Florin Coras <fcoras@cisco.com> | 2016-02-18 22:20:01 +0100 |
---|---|---|
committer | Gerrit Code Review <gerrit@fd.io> | 2016-04-02 17:20:44 +0000 |
commit | e127a7e4528472a320bf1cc343d3656dcdd4b108 (patch) | |
tree | 0a577faa62d883d0c8a2f223f216ed9c5df69882 /vnet/vnet/lisp-gpe/lisp_gpe.h | |
parent | 28e3db9dd617324a3196f369788d62cc72b5903b (diff) |
LISP GPE: initial CP commit and DP improvements
Control Plane
-------------
In essence, this introduces basic support for map-request/reply
processing, the logic to generate and consume such messages, including
SMRs, a control-plane backend, consisting of an eid-table, locator and
locator-set tables, and CLI to interact with it. Naturally, we can now
serialize/deserialize LISP specific types: addresses, locators,
mappings, messages. An important caveat is that IPv6 support is not
complete, both for EIDs and RLOCs.
Functionally, the DP forwards all packets it can't handle to the CP
(lisp_cp_lookup node) which takes care of obtaining a mapping for the
packet's destination from a pre-configured map-resolver using the LISP
protocol. The CP then caches this information and programs the DP such
that all new packets with the same destination (or within the covering
prefix) are encapsulated to one of the locators retrieved in the
mapping. Ingress traffic-engineering is not yet supported.
Data Plane
----------
First of all, to enable punting to the CP, when LISP GPE is turned on a
default route that points to lisp_cp_lookup is now inserted. The DP
also exposes an API the CP can use to program forwarding for a given
mapping. This mainly consists in allocating a tunnel and programming the
FIB such that all packets destined to the mapping's prefix are forwarded
to a lisp-gpe encapsulating node.
Another important change done for lisp forwarding is that both source
and destination IP addresses are considered when encapsulating a packet.
To this end, a new FIB/mtrie is introduced as a second stage, src
lookup, post dst lookup. The latter is still done in the IP FIB but for
source-dest entries, in the dest adjacency the lookup_next_index points
to a lisp lookup node and the rewrite_header.sw_if_index points to the
src FIB. This is read by the lisp lookup node which then walks the src
mtrie, finds the associated adjacency, marks the buffer with the index
and forwards the packet to the appropriate next node (typically,
lisp-gpe-encap).
Change-Id: Ibdf52fdc1f89311854621403ccdd66f90e2522fd
Signed-off-by: Florin Coras <fcoras@cisco.com>
Diffstat (limited to 'vnet/vnet/lisp-gpe/lisp_gpe.h')
-rw-r--r-- | vnet/vnet/lisp-gpe/lisp_gpe.h | 122 |
1 files changed, 96 insertions, 26 deletions
diff --git a/vnet/vnet/lisp-gpe/lisp_gpe.h b/vnet/vnet/lisp-gpe/lisp_gpe.h index 12c4ebce38c..7e86d57fc1a 100644 --- a/vnet/vnet/lisp-gpe/lisp_gpe.h +++ b/vnet/vnet/lisp-gpe/lisp_gpe.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Cisco and/or its affiliates. + * 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: @@ -12,18 +12,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + #ifndef included_vnet_lisp_gpe_h #define included_vnet_lisp_gpe_h #include <vppinfra/error.h> -#include <vppinfra/hash.h> +#include <vppinfra/mhash.h> #include <vnet/vnet.h> #include <vnet/ip/ip.h> #include <vnet/l2/l2_input.h> #include <vnet/ethernet/ethernet.h> -#include <vnet/lisp-gpe/lisp_gpe_packet.h> #include <vnet/ip/ip4_packet.h> #include <vnet/ip/udp.h> +#include <vnet/lisp-cp/lisp_types.h> +#include <vnet/lisp-gpe/lisp_gpe_packet.h> + +#define IP_UDP_HDR_LEN (word) (sizeof(udp_header_t) + sizeof(ip4_header_t)) typedef CLIB_PACKED (struct { ip4_header_t ip4; /* 20 bytes */ @@ -31,21 +35,22 @@ typedef CLIB_PACKED (struct { lisp_gpe_header_t lisp; /* 8 bytes */ }) ip4_udp_lisp_gpe_header_t; -typedef CLIB_PACKED(struct { - /* - * Key fields: ip src, LISP iid, ??? $$$$$$$$$ correct answer ??? - * all fields in NET byte order - */ - union { - struct { - u32 src; - u32 iid; - }; - u64 as_u64[1]; +typedef struct +{ + union + { + struct + { + gid_address_t eid; + u32 dst_loc; + u32 iid; + }; + u8 as_u8[6]; }; -}) lisp_gpe_tunnel_key_t; +} lisp_gpe_tunnel_key_t; -typedef struct { +typedef struct +{ /* Rewrite string. $$$$ embed vnet_rewrite header */ u8 * rewrite; @@ -93,30 +98,53 @@ typedef enum { LISP_GPE_N_ERROR, } lisp_gpe_input_error_t; -typedef struct { +/* As a first step, reuse v4 fib. The goal of the typedef is to shield + * consumers from future updates that may result in the lisp ip4 fib diverging + * from ip4 fib */ +typedef ip4_fib_t lisp_ip4_fib_t; + +typedef struct lisp_gpe_main +{ + /* Pool of src fibs that are paired with dst fibs */ + ip4_fib_t * src_fibs; + /* vector of encap tunnel instances */ - lisp_gpe_tunnel_t *tunnels; + lisp_gpe_tunnel_t * tunnels; /* lookup tunnel by key */ - uword * lisp_gpe_tunnel_by_key; + mhash_t lisp_gpe_tunnel_by_key; + + /* lookup tunnel by adjacency index */ + uword * lisp_gpe_tunnel_by_adj_index; /* Free vlib hw_if_indices */ u32 * free_lisp_gpe_tunnel_hw_if_indices; + u32 lisp_gpe_hw_if_index; + + /* next node indexes that points ip4 lookup to lisp gpe lookup and lisp cp */ + u32 ip4_lookup_next_lgpe_ip4_lookup; + /* convenience */ vlib_main_t * vlib_main; vnet_main_t * vnet_main; + ip_lookup_main_t * lookup_main; + ip4_main_t * im4; } lisp_gpe_main_t; lisp_gpe_main_t lisp_gpe_main; +extern vlib_node_registration_t lgpe_ip4_lookup_node; extern vlib_node_registration_t lisp_gpe_input_node; extern vlib_node_registration_t lisp_gpe_encap_node; -u8 * format_lisp_gpe_encap_trace (u8 * s, va_list * args); -u8 * format_lisp_gpe_header_with_length (u8 * s, va_list * args); +u8 * +format_lisp_gpe_encap_trace (u8 * s, va_list * args); +u8 * +format_lisp_gpe_header_with_length (u8 * s, va_list * args); -typedef struct { +typedef struct +{ u8 is_add; ip4_address_t src, dst; u32 encap_fib_index; @@ -126,12 +154,54 @@ typedef struct { u8 ver_res; u8 res; u8 next_protocol; - u32 iid; /* host byte order */ + u32 iid; /* host byte order */ } vnet_lisp_gpe_add_del_tunnel_args_t; -int vnet_lisp_gpe_add_del_tunnel -(vnet_lisp_gpe_add_del_tunnel_args_t *a, u32 * sw_if_indexp); +int +vnet_lisp_gpe_add_del_tunnel (vnet_lisp_gpe_add_del_tunnel_args_t *a, + u32 * sw_if_indexp); + +typedef struct +{ + u8 is_add; +} vnet_lisp_gpe_add_del_iface_args_t; + +void +vnet_lisp_gpe_add_del_iface (vnet_lisp_gpe_add_del_iface_args_t *a, + u32 * hw_if_indexp); + +typedef enum +{ + NO_ACTION, + FORWARD_NATIVE, + SEND_MAP_REQUEST, + DROP +} negative_fwd_actions_e; + +typedef struct +{ + u8 is_add; + u8 is_negative; + negative_fwd_actions_e action; + gid_address_t seid; /* TODO convert to ip4, ip6, mac ? */ + gid_address_t deid; + ip_address_t slocator; + ip_address_t dlocator; + u32 encap_fib_index; + u32 decap_fib_index; + u32 decap_next_index; + u8 flags; + u8 ver_res; + u8 res; + u8 next_protocol; + u32 iid; /* host byte order */ +} vnet_lisp_gpe_add_del_fwd_entry_args_t; + +int +vnet_lisp_gpe_add_del_fwd_entry (vnet_lisp_gpe_add_del_fwd_entry_args_t *a, + u32 * hw_if_indexp); -u8 * format_lisp_gpe_header_with_length (u8 * s, va_list * args); +u8 * +format_lisp_gpe_header_with_length (u8 * s, va_list * args); #endif /* included_vnet_lisp_gpe_h */ |