aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/gre/gre.h
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2017-12-14 08:51:32 -0800
committerDamjan Marion <dmarion.lists@gmail.com>2017-12-16 19:39:26 +0000
commit33ce60d6759bbbfebb7d489aa591b696e140d870 (patch)
treeeda75c292952f754813648b5a49d0ca5f17a69f3 /src/vnet/gre/gre.h
parent8e66b9bf4ba90279631e6a0e8ccc2eab5f9156c2 (diff)
GRE tunnel key includes the FIB table
- GRE tunnels with the same src,dst addresses are not the same tunnel - Two data-plane improvements: - the cached key was never updated and so useless - no need to dereference the tunnel's HW interface to get the sw_if_index Change-Id: I2f2ea6e08c759a810b753cec22c497e921a2ca01 Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'src/vnet/gre/gre.h')
-rw-r--r--src/vnet/gre/gre.h104
1 files changed, 102 insertions, 2 deletions
diff --git a/src/vnet/gre/gre.h b/src/vnet/gre/gre.h
index f597d42d428..83bab76f087 100644
--- a/src/vnet/gre/gre.h
+++ b/src/vnet/gre/gre.h
@@ -76,6 +76,61 @@ typedef enum gre_tunnel_tyoe_t_
#define GRE_TUNNEL_N_TYPES ((gre_tunnel_type_t)GRE_TUNNEL_TYPE_TEB+1)
/**
+ * @brief Key for a IPv4 GRE Tunnel
+ */
+typedef struct gre_tunnel_key4_t_
+{
+ /**
+ * Source and destination IP addresses
+ */
+ union
+ {
+ struct
+ {
+ ip4_address_t gtk_src;
+ ip4_address_t gtk_dst;
+ };
+ u64 gtk_as_u64;
+ };
+
+ /**
+ * The FIB table the src,dst addresses are in.
+ * tunnels with the same IP addresses in different FIBs are not
+ * the same tunnel
+ */
+ u32 gtk_fib_index;
+} __attribute__ ((packed)) gre_tunnel_key4_t;
+
+/**
+ * @brief Key for a IPv6 GRE Tunnel
+ * We use a different type so that the V4 key hash is as small as possible
+ */
+typedef struct gre_tunnel_key6_t_
+{
+ /**
+ * Source and destination IP addresses
+ */
+ ip6_address_t gtk_src;
+ ip6_address_t gtk_dst;
+
+ /**
+ * The FIB table the src,dst addresses are in.
+ * tunnels with the same IP addresses in different FIBs are not
+ * the same tunnel
+ */
+ u32 gtk_fib_index;
+} __attribute__ ((packed)) gre_tunnel_key6_t;
+
+/**
+ * Union of the two possible key types
+ */
+typedef union gre_tunnel_key_t_
+{
+ gre_tunnel_key4_t gtk_v4;
+ gre_tunnel_key6_t gtk_v6;
+} gre_tunnel_key_t;
+
+/**
* @brief A representation of a GRE tunnel
*/
typedef struct
@@ -86,6 +141,12 @@ typedef struct
fib_node_t node;
/**
+ * The hash table's key stored in separate memory since the tunnel_t
+ * memory can realloc.
+ */
+ gre_tunnel_key_t *key;
+
+ /**
* The tunnel's source/local address
*/
ip46_address_t tunnel_src;
@@ -151,8 +212,8 @@ typedef struct
uword *tunnel_by_key4;
/**
- * Hash mapping ipv6 src/dst addr pair to tunnel
- */
+ * Hash mapping ipv6 src/dst addr pair to tunnel
+ */
uword *tunnel_by_key6;
/**
@@ -255,6 +316,45 @@ typedef struct
int vnet_gre_add_del_tunnel
(vnet_gre_add_del_tunnel_args_t * a, u32 * sw_if_indexp);
+static inline void
+gre_mk_key4 (const ip4_address_t * src,
+ const ip4_address_t * dst,
+ u32 fib_index, gre_tunnel_key4_t * key)
+{
+ key->gtk_src = *src;
+ key->gtk_dst = *dst;
+ key->gtk_fib_index = fib_index;
+}
+
+static inline int
+gre_match_key4 (const gre_tunnel_key4_t * key1,
+ const gre_tunnel_key4_t * key2)
+{
+ return ((key1->gtk_as_u64 == key2->gtk_as_u64) &&
+ (key1->gtk_fib_index == key2->gtk_fib_index));
+}
+
+static inline void
+gre_mk_key6 (const ip6_address_t * src,
+ const ip6_address_t * dst,
+ u32 fib_index, gre_tunnel_key6_t * key)
+{
+ key->gtk_src = *src;
+ key->gtk_dst = *dst;
+ key->gtk_fib_index = fib_index;
+}
+
+static inline int
+gre_match_key6 (const gre_tunnel_key6_t * key1,
+ const gre_tunnel_key6_t * key2)
+{
+ return ((key1->gtk_src.as_u64[0] == key2->gtk_src.as_u64[0]) &&
+ (key1->gtk_src.as_u64[1] == key2->gtk_src.as_u64[1]) &&
+ (key1->gtk_dst.as_u64[0] == key2->gtk_dst.as_u64[0]) &&
+ (key1->gtk_dst.as_u64[1] == key2->gtk_dst.as_u64[1]) &&
+ (key1->gtk_fib_index == key2->gtk_fib_index));
+}
+
#endif /* included_gre_h */
/*