summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--vnet/vnet/vxlan-gpe/decap.c78
-rw-r--r--vnet/vnet/vxlan-gpe/dir.dox32
-rw-r--r--vnet/vnet/vxlan-gpe/encap.c72
-rw-r--r--vnet/vnet/vxlan-gpe/vxlan_gpe.c113
-rw-r--r--vnet/vnet/vxlan-gpe/vxlan_gpe.h96
-rw-r--r--vnet/vnet/vxlan-gpe/vxlan_gpe_packet.h33
6 files changed, 380 insertions, 44 deletions
diff --git a/vnet/vnet/vxlan-gpe/decap.c b/vnet/vnet/vxlan-gpe/decap.c
index 7f32cbd8a49..70cf08e116b 100644
--- a/vnet/vnet/vxlan-gpe/decap.c
+++ b/vnet/vnet/vxlan-gpe/decap.c
@@ -14,6 +14,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/**
+ * @file
+ * @brief Functions for decapsulating VXLAN GPE tunnels
+ *
+*/
#include <vlib/vlib.h>
#include <vnet/pg/pg.h>
@@ -21,12 +26,25 @@
vlib_node_registration_t vxlan_gpe_input_node;
+/**
+ * @brief Struct for VXLAN GPE decap packet tracing
+ *
+ */
typedef struct {
u32 next_index;
u32 tunnel_index;
u32 error;
} vxlan_gpe_rx_trace_t;
+/**
+ * @brief Tracing function for VXLAN GPE packet decapsulation
+ *
+ * @param *s
+ * @param *args
+ *
+ * @return *s
+ *
+ */
static u8 * format_vxlan_gpe_rx_trace (u8 * s, va_list * args)
{
CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
@@ -46,7 +64,15 @@ static u8 * format_vxlan_gpe_rx_trace (u8 * s, va_list * args)
return s;
}
-
+/**
+ * @brief Tracing function for VXLAN GPE packet decapsulation including length
+ *
+ * @param *s
+ * @param *args
+ *
+ * @return *s
+ *
+ */
static u8 * format_vxlan_gpe_with_length (u8 * s, va_list * args)
{
CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
@@ -56,6 +82,25 @@ static u8 * format_vxlan_gpe_with_length (u8 * s, va_list * args)
return s;
}
+/**
+ * @brief Common processing for IPv4 and IPv6 VXLAN GPE decap dispatch functions
+ *
+ * It is worth noting that other than trivial UDP forwarding (transit), VXLAN GPE
+ * tunnels are "terminate local". This means that there is no "TX" interface for this
+ * decap case, so that field in the buffer_metadata can be "used for something else".
+ * The something else in this case is, for the IPv4/IPv6 inner-packet type case, the
+ * FIB index used to look up the inner-packet's adjacency.
+ *
+ * vnet_buffer(b0)->sw_if_index[VLIB_TX] = t0->decap_fib_index;
+ *
+ * @param *vm
+ * @param *node
+ * @param *from_frame
+ * @param ip_ip4
+ *
+ * @return from_frame->n_vectors
+ *
+ */
always_inline uword
vxlan_gpe_input (vlib_main_t * vm,
vlib_node_runtime_t * node,
@@ -250,7 +295,7 @@ vxlan_gpe_input (vlib_main_t * vm,
/* Required to make the l2 tag push / pop code work on l2 subifs */
vnet_update_l2_len (b0);
- /*
+ /**
* ip[46] lookup in the configured FIB
*/
vnet_buffer(b0)->sw_if_index[VLIB_TX] = t0->decap_fib_index;
@@ -545,6 +590,17 @@ vxlan_gpe_input (vlib_main_t * vm,
return from_frame->n_vectors;
}
+/**
+ * @brief Graph processing dispatch function for IPv4 VXLAN GPE
+ *
+ * @node vxlan4-gpe-input
+ * @param *vm
+ * @param *node
+ * @param *from_frame
+ *
+ * @return from_frame->n_vectors
+ *
+ */
static uword
vxlan4_gpe_input (vlib_main_t * vm, vlib_node_runtime_t * node,
vlib_frame_t * from_frame)
@@ -552,6 +608,17 @@ vxlan4_gpe_input (vlib_main_t * vm, vlib_node_runtime_t * node,
return vxlan_gpe_input (vm, node, from_frame, /* is_ip4 */1);
}
+/**
+ * @brief Graph processing dispatch function for IPv6 VXLAN GPE
+ *
+ * @node vxlan6-gpe-input
+ * @param *vm
+ * @param *node
+ * @param *from_frame
+ *
+ * @return from_frame->n_vectors - uword
+ *
+ */
static uword
vxlan6_gpe_input (vlib_main_t * vm, vlib_node_runtime_t * node,
vlib_frame_t * from_frame)
@@ -559,6 +626,9 @@ vxlan6_gpe_input (vlib_main_t * vm, vlib_node_runtime_t * node,
return vxlan_gpe_input (vm, node, from_frame, /* is_ip4 */0);
}
+/**
+ * @brief VXLAN GPE error strings
+ */
static char * vxlan_gpe_error_strings[] = {
#define vxlan_gpe_error(n,s) s,
#include <vnet/vxlan-gpe/vxlan_gpe_error.def>
@@ -587,7 +657,7 @@ VLIB_REGISTER_NODE (vxlan4_gpe_input_node) = {
// $$$$ .unformat_buffer = unformat_vxlan_gpe_header,
};
-VLIB_NODE_FUNCTION_MULTIARCH (vxlan4_gpe_input_node, vxlan4_gpe_input)
+VLIB_NODE_FUNCTION_MULTIARCH (vxlan4_gpe_input_node, vxlan4_gpe_input);
VLIB_REGISTER_NODE (vxlan6_gpe_input_node) = {
.function = vxlan6_gpe_input,
@@ -610,4 +680,4 @@ VLIB_REGISTER_NODE (vxlan6_gpe_input_node) = {
// $$$$ .unformat_buffer = unformat_vxlan_gpe_header,
};
-VLIB_NODE_FUNCTION_MULTIARCH (vxlan6_gpe_input_node, vxlan6_gpe_input)
+VLIB_NODE_FUNCTION_MULTIARCH (vxlan6_gpe_input_node, vxlan6_gpe_input);
diff --git a/vnet/vnet/vxlan-gpe/dir.dox b/vnet/vnet/vxlan-gpe/dir.dox
new file mode 100644
index 00000000000..c154733b21f
--- /dev/null
+++ b/vnet/vnet/vxlan-gpe/dir.dox
@@ -0,0 +1,32 @@
+/*
+ *
+ * Copyright (c) 2013 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.
+ */
+/**
+ @dir
+ @brief VXLAN GPE
+
+ Based on IETF: draft-quinn-vxlan-gpe-03.txt
+
+Abstract
+
+ This draft describes extending Virtual eXtensible Local Area Network
+ (VXLAN), via changes to the VXLAN header, with three new
+ capabilities: support for multi-protocol encapsulation, operations,
+ administration and management (OAM) signaling and explicit
+ versioning.
+
+ See file: vxlan-gpe-rfc.txt
+
+*/ \ No newline at end of file
diff --git a/vnet/vnet/vxlan-gpe/encap.c b/vnet/vnet/vxlan-gpe/encap.c
index ba0eca2a0a1..3f6f43c564c 100644
--- a/vnet/vnet/vxlan-gpe/encap.c
+++ b/vnet/vnet/vxlan-gpe/encap.c
@@ -12,6 +12,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/**
+ * @file
+ * @brief Functions for encapsulating VXLAN GPE tunnels
+ *
+*/
#include <vppinfra/error.h>
#include <vppinfra/hash.h>
#include <vnet/vnet.h>
@@ -19,16 +24,22 @@
#include <vnet/ethernet/ethernet.h>
#include <vnet/vxlan-gpe/vxlan_gpe.h>
-/* Statistics (not really errors) */
+/** Statistics (not really errors) */
#define foreach_vxlan_gpe_encap_error \
_(ENCAPSULATED, "good packets encapsulated")
+/**
+ * @brief VXLAN GPE encap error strings
+ */
static char * vxlan_gpe_encap_error_strings[] = {
#define _(sym,string) string,
foreach_vxlan_gpe_encap_error
#undef _
};
+/**
+ * @brief Struct for VXLAN GPE errors/counters
+ */
typedef enum {
#define _(sym,str) VXLAN_GPE_ENCAP_ERROR_##sym,
foreach_vxlan_gpe_encap_error
@@ -36,6 +47,9 @@ typedef enum {
VXLAN_GPE_ENCAP_N_ERROR,
} vxlan_gpe_encap_error_t;
+/**
+ * @brief Struct for defining VXLAN GPE next nodes
+ */
typedef enum {
VXLAN_GPE_ENCAP_NEXT_IP4_LOOKUP,
VXLAN_GPE_ENCAP_NEXT_IP6_LOOKUP,
@@ -43,22 +57,43 @@ typedef enum {
VXLAN_GPE_ENCAP_N_NEXT
} vxlan_gpe_encap_next_t;
+/**
+ * @brief Struct for tracing VXLAN GPE encapsulated packets
+ */
typedef struct {
u32 tunnel_index;
} vxlan_gpe_encap_trace_t;
-
+/**
+ * @brief Trace of packets encapsulated in VXLAN GPE
+ *
+ * @param *s
+ * @param *args
+ *
+ * @return *s
+ *
+ */
u8 * format_vxlan_gpe_encap_trace (u8 * s, va_list * args)
{
CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
- vxlan_gpe_encap_trace_t * t
+ vxlan_gpe_encap_trace_t * t
= va_arg (*args, vxlan_gpe_encap_trace_t *);
s = format (s, "VXLAN-GPE-ENCAP: tunnel %d", t->tunnel_index);
return s;
}
+/**
+ * @brief Instantiates UDP + VXLAN-GPE header then set next node to IP4|6 lookup
+ *
+ * @param *ngm
+ * @param *b0
+ * @param *t0 contains rewrite header
+ * @param *next0 relative index of next dispatch function (next node)
+ * @param is_v4 Is this IPv4? (or IPv6)
+ *
+ */
always_inline void
vxlan_gpe_encap_one_inline (vxlan_gpe_main_t * ngm, vlib_buffer_t * b0,
vxlan_gpe_tunnel_t * t0, u32 * next0, u8 is_v4)
@@ -79,6 +114,19 @@ vxlan_gpe_encap_one_inline (vxlan_gpe_main_t * ngm, vlib_buffer_t * b0,
}
}
+/**
+ * @brief Instantiates UDP + VXLAN-GPE header then set next node to IP4|6 lookup for two packets
+ *
+ * @param *ngm
+ * @param *b0 Packet0
+ * @param *b1 Packet1
+ * @param *t0 contains rewrite header for Packet0
+ * @param *t1 contains rewrite header for Packet1
+ * @param *next0 relative index of next dispatch function (next node) for Packet0
+ * @param *next1 relative index of next dispatch function (next node) for Packet1
+ * @param is_v4 Is this IPv4? (or IPv6)
+ *
+ */
always_inline void
vxlan_gpe_encap_two_inline (vxlan_gpe_main_t * ngm, vlib_buffer_t * b0, vlib_buffer_t * b1,
vxlan_gpe_tunnel_t * t0, vxlan_gpe_tunnel_t * t1, u32 * next0,
@@ -101,6 +149,24 @@ vxlan_gpe_encap_two_inline (vxlan_gpe_main_t * ngm, vlib_buffer_t * b0, vlib_buf
}
}
+/**
+ * @brief Common processing for IPv4 and IPv6 VXLAN GPE encap dispatch functions
+ *
+ * It is worth noting that other than trivial UDP forwarding (transit), VXLAN GPE
+ * tunnels are "establish local". This means that we don't have a TX interface as yet
+ * as we need to look up where the outer-header dest is. By setting the TX index in the
+ * buffer metadata to the encap FIB, we can do a lookup to get the adjacency and real TX.
+ *
+ * vnet_buffer(b0)->sw_if_index[VLIB_TX] = t0->encap_fib_index;
+ *
+ * @node vxlan-gpe-input
+ * @param *vm
+ * @param *node
+ * @param *from_frame
+ *
+ * @return from_frame->n_vectors
+ *
+ */
static uword
vxlan_gpe_encap (vlib_main_t * vm,
vlib_node_runtime_t * node,
diff --git a/vnet/vnet/vxlan-gpe/vxlan_gpe.c b/vnet/vnet/vxlan-gpe/vxlan_gpe.c
index e032d568c97..a2b8978241a 100644
--- a/vnet/vnet/vxlan-gpe/vxlan_gpe.c
+++ b/vnet/vnet/vxlan-gpe/vxlan_gpe.c
@@ -12,11 +12,25 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/**
+ * @file
+ * @brief Common utility functions for IPv4 and IPv6 VXLAN GPE tunnels
+ *
+*/
#include <vnet/vxlan-gpe/vxlan_gpe.h>
#include <vnet/ip/format.h>
vxlan_gpe_main_t vxlan_gpe_main;
+/**
+ * @brief Tracing function for VXLAN GPE tunnel packets
+ *
+ * @param *s formatting string
+ * @param *args
+ *
+ * @return *s formatted string
+ *
+ */
u8 * format_vxlan_gpe_tunnel (u8 * s, va_list * args)
{
vxlan_gpe_tunnel_t * t = va_arg (*args, vxlan_gpe_tunnel_t *);
@@ -54,13 +68,21 @@ u8 * format_vxlan_gpe_tunnel (u8 * s, va_list * args)
return s;
}
+/**
+ * @brief Naming for VXLAN GPE tunnel
+ *
+ * @param *s formatting string
+ * @param *args
+ *
+ * @return *s formatted string
+ *
+ */
static u8 * format_vxlan_gpe_name (u8 * s, va_list * args)
{
u32 dev_instance = va_arg (*args, u32);
return format (s, "vxlan_gpe_tunnel%d", dev_instance);
}
-
static uword dummy_interface_tx (vlib_main_t * vm,
vlib_node_runtime_t * node,
vlib_frame_t * frame)
@@ -68,6 +90,17 @@ static uword dummy_interface_tx (vlib_main_t * vm,
clib_warning ("you shouldn't be here, leaking buffers...");
return frame->n_vectors;
}
+
+/**
+ * @brief CLI function for VXLAN GPE admin up/down
+ *
+ * @param *vnm
+ * @param hw_if_index
+ * @param flag
+ *
+ * @return *rc
+ *
+ */
static clib_error_t *
vxlan_gpe_interface_admin_up_down (vnet_main_t * vnm, u32 hw_if_index, u32 flags)
{
@@ -98,6 +131,15 @@ static uword dummy_set_rewrite (vnet_main_t * vnm,
}
+/**
+ * @brief Formatting function for tracing VXLAN GPE with length
+ *
+ * @param *s
+ * @param *args
+ *
+ * @return *s
+ *
+ */
static u8 * format_vxlan_gpe_header_with_length (u8 * s, va_list * args)
{
u32 dev_instance = va_arg (*args, u32);
@@ -131,6 +173,14 @@ _(decap_fib_index)
}
+/**
+ * @brief Calculate IPv4 VXLAN GPE rewrite header
+ *
+ * @param *t
+ *
+ * @return rc
+ *
+ */
static int vxlan4_gpe_rewrite (vxlan_gpe_tunnel_t * t)
{
u8 *rw = 0;
@@ -169,6 +219,14 @@ static int vxlan4_gpe_rewrite (vxlan_gpe_tunnel_t * t)
return (0);
}
+/**
+ * @brief Calculate IPv6 VXLAN GPE rewrite header
+ *
+ * @param *t
+ *
+ * @return rc
+ *
+ */
static int vxlan6_gpe_rewrite (vxlan_gpe_tunnel_t * t)
{
u8 *rw = 0;
@@ -207,6 +265,15 @@ static int vxlan6_gpe_rewrite (vxlan_gpe_tunnel_t * t)
return (0);
}
+/**
+ * @brief Add or Del a VXLAN GPE tunnel
+ *
+ * @param *a
+ * @param *sw_if_index
+ *
+ * @return rc
+ *
+ */
int vnet_vxlan_gpe_add_del_tunnel
(vnet_vxlan_gpe_add_del_tunnel_args_t *a, u32 * sw_if_indexp)
{
@@ -352,6 +419,14 @@ int vnet_vxlan_gpe_add_del_tunnel
return 0;
}
+/**
+ * @brief Find the IPv4 FIB index from the FIB ID
+ *
+ * @param fib_id
+ *
+ * @return fib_index
+ *
+ */
static u32 fib4_index_from_fib_id (u32 fib_id)
{
ip4_main_t * im = &ip4_main;
@@ -364,6 +439,14 @@ static u32 fib4_index_from_fib_id (u32 fib_id)
return p[0];
}
+/**
+ * @brief Find the IPv4 FIB index from the FIB ID
+ *
+ * @param fib_id
+ *
+ * @return fib_index
+ *
+ */
static u32 fib6_index_from_fib_id (u32 fib_id)
{
ip6_main_t * im = &ip6_main;
@@ -376,6 +459,16 @@ static u32 fib6_index_from_fib_id (u32 fib_id)
return p[0];
}
+/**
+ * @brief CLI function for Add/Del of IPv4/IPv6 VXLAN GPE tunnel
+ *
+ * @param *vm
+ * @param *input
+ * @param *cmd
+ *
+ * @return error
+ *
+ */
static clib_error_t *
vxlan_gpe_add_del_tunnel_command_fn (vlib_main_t * vm,
unformat_input_t * input,
@@ -528,6 +621,16 @@ VLIB_CLI_COMMAND (create_vxlan_gpe_tunnel_command, static) = {
.function = vxlan_gpe_add_del_tunnel_command_fn,
};
+/**
+ * @brief CLI function for showing VXLAN GPE tunnels
+ *
+ * @param *vm
+ * @param *input
+ * @param *cmd
+ *
+ * @return error
+ *
+ */
static clib_error_t *
show_vxlan_gpe_tunnel_command_fn (vlib_main_t * vm,
unformat_input_t * input,
@@ -552,6 +655,14 @@ VLIB_CLI_COMMAND (show_vxlan_gpe_tunnel_command, static) = {
.function = show_vxlan_gpe_tunnel_command_fn,
};
+/**
+ * @brief Feature init function for VXLAN GPE
+ *
+ * @param *vm
+ *
+ * @return error
+ *
+ */
clib_error_t *vxlan_gpe_init (vlib_main_t *vm)
{
vxlan_gpe_main_t *gm = &vxlan_gpe_main;
diff --git a/vnet/vnet/vxlan-gpe/vxlan_gpe.h b/vnet/vnet/vxlan-gpe/vxlan_gpe.h
index f7cfba9956a..e33725f3ef3 100644
--- a/vnet/vnet/vxlan-gpe/vxlan_gpe.h
+++ b/vnet/vnet/vxlan-gpe/vxlan_gpe.h
@@ -12,6 +12,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/**
+ * @file
+ * @brief VXLAN GPE definitions
+ *
+*/
#ifndef included_vnet_vxlan_gpe_h
#define included_vnet_vxlan_gpe_h
@@ -26,80 +31,102 @@
#include <vnet/ip/ip6_packet.h>
#include <vnet/ip/udp.h>
-
+/**
+ * @brief VXLAN GPE header struct
+ *
+ */
typedef CLIB_PACKED (struct {
- ip4_header_t ip4; /* 20 bytes */
- udp_header_t udp; /* 8 bytes */
- vxlan_gpe_header_t vxlan; /* 8 bytes */
+ /** 20 bytes */
+ ip4_header_t ip4;
+ /** 8 bytes */
+ udp_header_t udp;
+ /** 8 bytes */
+ vxlan_gpe_header_t vxlan;
}) ip4_vxlan_gpe_header_t;
typedef CLIB_PACKED (struct {
- ip6_header_t ip6; /* 40 bytes */
- udp_header_t udp; /* 8 bytes */
- vxlan_gpe_header_t vxlan; /* 8 bytes */
+ /** 40 bytes */
+ ip6_header_t ip6;
+ /** 8 bytes */
+ udp_header_t udp;
+ /** 8 bytes */
+ vxlan_gpe_header_t vxlan;
}) ip6_vxlan_gpe_header_t;
+/**
+ * @brief Key struct for IPv4 VXLAN GPE tunnel.
+ * Key fields: local remote, vni
+ * all fields in NET byte order
+ * VNI shifted 8 bits
+ */
typedef CLIB_PACKED(struct {
- /*
- * Key fields: local remote, vni
- * all fields in NET byte order
- */
union {
struct {
u32 local;
u32 remote;
- u32 vni; /* shifted 8 bits */
+
+ u32 vni;
u32 pad;
};
u64 as_u64[2];
};
}) vxlan4_gpe_tunnel_key_t;
+/**
+ * @brief Key struct for IPv6 VXLAN GPE tunnel.
+ * Key fields: local remote, vni
+ * all fields in NET byte order
+ * VNI shifted 8 bits
+ */
typedef CLIB_PACKED(struct {
- /*
- * Key fields: local remote, vni
- * all fields in NET byte order
- */
ip6_address_t local;
ip6_address_t remote;
- u32 vni; /* shifted 8 bits */
+ u32 vni;
}) vxlan6_gpe_tunnel_key_t;
+/**
+ * @brief Struct for VXLAN GPE tunnel
+ */
typedef struct {
- /* Rewrite string. $$$$ embed vnet_rewrite header */
+ /** Rewrite string. $$$$ embed vnet_rewrite header */
u8 * rewrite;
- /* encapsulated protocol */
+ /** encapsulated protocol */
u8 protocol;
- /* tunnel src and dst addresses */
+ /** tunnel local address */
ip46_address_t local;
+ /** tunnel remote address */
ip46_address_t remote;
- /* FIB indices */
- u32 encap_fib_index; /* tunnel partner lookup here */
- u32 decap_fib_index; /* inner IP lookup here */
+ /** FIB indices - tunnel partner lookup here */
+ u32 encap_fib_index;
+ /** FIB indices - inner IP packet lookup here */
+ u32 decap_fib_index;
- /* vxlan VNI in HOST byte order, shifted left 8 bits */
+ /** VXLAN GPE VNI in HOST byte order, shifted left 8 bits */
u32 vni;
- /* vnet intfc hw/sw_if_index */
+ /** vnet intfc hw_if_index */
u32 hw_if_index;
+ /** vnet intfc sw_if_index */
u32 sw_if_index;
- /* flags */
+ /** flags */
u32 flags;
} vxlan_gpe_tunnel_t;
-/* Flags for vxlan_gpe_tunnel_t.flags */
+/** Flags for vxlan_gpe_tunnel_t */
#define VXLAN_GPE_TUNNEL_IS_IPV4 1
+/** next nodes for VXLAN GPE input */
#define foreach_vxlan_gpe_input_next \
_(DROP, "error-drop") \
_(IP4_INPUT, "ip4-input") \
_(IP6_INPUT, "ip6-input") \
_(ETHERNET_INPUT, "ethernet-input")
+/** struct for next nodes for VXLAN GPE input */
typedef enum {
#define _(s,n) VXLAN_GPE_INPUT_NEXT_##s,
foreach_vxlan_gpe_input_next
@@ -107,6 +134,7 @@ typedef enum {
VXLAN_GPE_INPUT_N_NEXT,
} vxlan_gpe_input_next_t;
+/** struct for VXLAN GPE errors */
typedef enum {
#define vxlan_gpe_error(n,s) VXLAN_GPE_ERROR_##n,
#include <vnet/vxlan-gpe/vxlan_gpe_error.def>
@@ -114,22 +142,25 @@ typedef enum {
VXLAN_GPE_N_ERROR,
} vxlan_gpe_input_error_t;
+/** Struct for VXLAN GPE node state */
typedef struct {
- /* vector of encap tunnel instances */
+ /** vector of encap tunnel instances */
vxlan_gpe_tunnel_t *tunnels;
- /* lookup tunnel by key */
+ /** lookup IPv4 VXLAN GPE tunnel by key */
uword * vxlan4_gpe_tunnel_by_key;
+ /** lookup IPv6 VXLAN GPE tunnel by key */
uword * vxlan6_gpe_tunnel_by_key;
- /* Free vlib hw_if_indices */
+ /** Free vlib hw_if_indices */
u32 * free_vxlan_gpe_tunnel_hw_if_indices;
- /* Mapping from sw_if_index to tunnel index */
+ /** Mapping from sw_if_index to tunnel index */
u32 * tunnel_index_by_sw_if_index;
- /* convenience */
+ /** State convenience vlib_main_t */
vlib_main_t * vlib_main;
+ /** State convenience vnet_main_t */
vnet_main_t * vnet_main;
} vxlan_gpe_main_t;
@@ -141,6 +172,7 @@ extern vlib_node_registration_t vxlan6_gpe_input_node;
u8 * format_vxlan_gpe_encap_trace (u8 * s, va_list * args);
+/** Struct for VXLAN GPE add/del args */
typedef struct {
u8 is_add;
u8 is_ip6;
diff --git a/vnet/vnet/vxlan-gpe/vxlan_gpe_packet.h b/vnet/vnet/vxlan-gpe/vxlan_gpe_packet.h
index 3403cc9ebad..e5501b95e3f 100644
--- a/vnet/vnet/vxlan-gpe/vxlan_gpe_packet.h
+++ b/vnet/vnet/vxlan-gpe/vxlan_gpe_packet.h
@@ -12,10 +12,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/**
+ * @file
+ * @brief VXLAN GPE packet header structure
+ *
+*/
#ifndef included_vxlan_gpe_packet_h
#define included_vxlan_gpe_packet_h
-/*
+/**
* From draft-quinn-vxlan-gpe-03.txt
*
* 0 1 2 3
@@ -52,25 +57,45 @@
* 0x4 : Network Service Header [NSH]
*/
-#define foreach_vxlan_gpe_protocol \
+/**
+ * @brief VXLAN GPE support inner protocol definition.
+ * 1 - IP4
+ * 2 - IP6
+ * 3 - ETHERNET
+ * 4 - NSH
+ */
+#define foreach_vxlan_gpe_protocol \
_ (0x01, IP4) \
_ (0x02, IP6) \
_ (0x03, ETHERNET) \
-_ (0x04, NSH)
+_ (0x04, NSH)
+/**
+ * @brief Struct for VXLAN GPE support inner protocol definition.
+ * 1 - IP4
+ * 2 - IP6
+ * 3 - ETHERNET
+ * 4 - NSH
+ */
typedef enum {
#define _(n,f) VXLAN_GPE_PROTOCOL_##f = n,
foreach_vxlan_gpe_protocol
#undef _
} vxlan_gpe_protocol_t;
+/**
+ * @brief VXLAN GPE Header definition
+ */
typedef struct {
u8 flags;
+ /** Version and Reserved */
u8 ver_res;
+ /** Reserved */
u8 res;
- /* see vxlan_gpe_protocol_t */
+ /** see vxlan_gpe_protocol_t */
u8 protocol;
+ /** VNI and Reserved */
u32 vni_res;
} vxlan_gpe_header_t;