aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/geneve/decap.c
diff options
context:
space:
mode:
authorMarco Varlese <marco.varlese@suse.com>2017-11-20 09:20:38 +0100
committerNeale Ranns <nranns@cisco.com>2017-11-24 15:51:30 +0000
commit60d48bbd13649133e51cf56e072c11305c661797 (patch)
tree5caa4f8bfc04c39d681d700de4801df42a1cbf98 /src/vnet/geneve/decap.c
parent952181e0bcbc838c646bd4c710033dd3bc20cec6 (diff)
GENEVE: shift/mask for header
This patch addresses the bit-shifting/masking required to set/get specific fields/bits in the GENEVE header. Change-Id: I06ea6d3487c827ec2bc3edfc67c7cb97640d4fc3 Signed-off-by: Marco Varlese <marco.varlese@suse.com>
Diffstat (limited to 'src/vnet/geneve/decap.c')
-rw-r--r--src/vnet/geneve/decap.c57
1 files changed, 33 insertions, 24 deletions
diff --git a/src/vnet/geneve/decap.c b/src/vnet/geneve/decap.c
index db052145ce2..2e6e9c58a0f 100644
--- a/src/vnet/geneve/decap.c
+++ b/src/vnet/geneve/decap.c
@@ -25,7 +25,7 @@ typedef struct
u32 next_index;
u32 tunnel_index;
u32 error;
- u32 vni;
+ u32 vni_rsvd;
} geneve_rx_trace_t;
static u8 *
@@ -40,12 +40,12 @@ format_geneve_rx_trace (u8 * s, va_list * args)
s =
format (s,
"GENEVE decap from geneve_tunnel%d vni %d next %d error %d",
- t->tunnel_index, t->vni, t->next_index, t->error);
+ t->tunnel_index, t->vni_rsvd, t->next_index, t->error);
}
else
{
s = format (s, "GENEVE decap error - tunnel for vni %d does not exist",
- t->vni);
+ t->vni_rsvd);
}
return s;
}
@@ -147,6 +147,10 @@ geneve_input (vlib_main_t * vm,
/* udp leaves current_data pointing at the geneve header */
geneve0 = vlib_buffer_get_current (b0);
geneve1 = vlib_buffer_get_current (b1);
+
+ vnet_geneve_hdr_1word_ntoh (geneve0);
+ vnet_geneve_hdr_1word_ntoh (geneve1);
+
if (is_ip4)
{
vlib_buffer_advance
@@ -198,13 +202,14 @@ geneve_input (vlib_main_t * vm,
tunnel_index1 = ~0;
error1 = 0;
- if (PREDICT_FALSE (geneve0->ver != GENEVE_VERSION))
+ if (PREDICT_FALSE
+ (vnet_get_geneve_version (geneve0) != GENEVE_VERSION))
{
error0 = GENEVE_ERROR_BAD_FLAGS;
next0 = GENEVE_INPUT_NEXT_DROP;
goto trace0;
}
-#if SUPPORT_OPTIONS_HEADER==0
+#if SUPPORT_OPTIONS_HEADER==1
if (PREDICT_FALSE (vnet_get_geneve_critical_bit (geneve0) == 1))
{
error0 = GENEVE_ERROR_BAD_FLAGS;
@@ -215,7 +220,7 @@ geneve_input (vlib_main_t * vm,
if (is_ip4)
{
key4_0.remote = ip4_0->src_address.as_u32;
- key4_0.vni = geneve0->vni;
+ key4_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
/* Make sure GENEVE tunnel exist according to packet SIP and VNI */
if (PREDICT_FALSE (key4_0.as_u64 != last_key4.as_u64))
@@ -250,7 +255,7 @@ geneve_input (vlib_main_t * vm,
(ip4_address_is_multicast (&ip4_0->dst_address)))
{
key4_0.remote = ip4_0->dst_address.as_u32;
- key4_0.vni = geneve0->vni;
+ key4_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
/* Make sure mcast GENEVE tunnel exist by packet DIP and VNI */
p0 = hash_get (vxm->geneve4_tunnel_by_key, key4_0.as_u64);
if (PREDICT_TRUE (p0 != NULL))
@@ -268,7 +273,7 @@ geneve_input (vlib_main_t * vm,
{
key6_0.remote.as_u64[0] = ip6_0->src_address.as_u64[0];
key6_0.remote.as_u64[1] = ip6_0->src_address.as_u64[1];
- key6_0.vni = geneve0->vni;
+ key6_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
/* Make sure GENEVE tunnel exist according to packet SIP and VNI */
if (PREDICT_FALSE
@@ -305,7 +310,7 @@ geneve_input (vlib_main_t * vm,
{
key6_0.remote.as_u64[0] = ip6_0->dst_address.as_u64[0];
key6_0.remote.as_u64[1] = ip6_0->dst_address.as_u64[1];
- key6_0.vni = geneve0->vni;
+ key6_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
p0 = hash_get_mem (vxm->geneve6_tunnel_by_key, &key6_0);
if (PREDICT_TRUE (p0 != NULL))
{
@@ -361,16 +366,17 @@ geneve_input (vlib_main_t * vm,
tr->next_index = next0;
tr->error = error0;
tr->tunnel_index = tunnel_index0;
- tr->vni = vnet_get_geneve_vni (geneve0);
+ tr->vni_rsvd = vnet_get_geneve_vni (geneve0);
}
- if (PREDICT_FALSE (geneve1->ver != GENEVE_VERSION))
+ if (PREDICT_FALSE
+ (vnet_get_geneve_version (geneve1) != GENEVE_VERSION))
{
error1 = GENEVE_ERROR_BAD_FLAGS;
next1 = GENEVE_INPUT_NEXT_DROP;
goto trace1;
}
-#if SUPPORT_OPTIONS_HEADER==0
+#if SUPPORT_OPTIONS_HEADER==1
if (PREDICT_FALSE (vnet_get_geneve_critical_bit (geneve1) == 1))
{
error1 = GENEVE_ERROR_BAD_FLAGS;
@@ -381,7 +387,7 @@ geneve_input (vlib_main_t * vm,
if (is_ip4)
{
key4_1.remote = ip4_1->src_address.as_u32;
- key4_1.vni = geneve1->vni;
+ key4_1.vni = vnet_get_geneve_vni_bigendian (geneve1);
/* Make sure unicast GENEVE tunnel exist by packet SIP and VNI */
if (PREDICT_FALSE (key4_1.as_u64 != last_key4.as_u64))
@@ -416,7 +422,7 @@ geneve_input (vlib_main_t * vm,
(ip4_address_is_multicast (&ip4_1->dst_address)))
{
key4_1.remote = ip4_1->dst_address.as_u32;
- key4_1.vni = geneve1->vni;
+ key4_1.vni = vnet_get_geneve_vni_bigendian (geneve1);
/* Make sure mcast GENEVE tunnel exist by packet DIP and VNI */
p1 = hash_get (vxm->geneve4_tunnel_by_key, key4_1.as_u64);
if (PREDICT_TRUE (p1 != NULL))
@@ -434,7 +440,7 @@ geneve_input (vlib_main_t * vm,
{
key6_1.remote.as_u64[0] = ip6_1->src_address.as_u64[0];
key6_1.remote.as_u64[1] = ip6_1->src_address.as_u64[1];
- key6_1.vni = geneve1->vni;
+ key6_1.vni = vnet_get_geneve_vni_bigendian (geneve1);
/* Make sure GENEVE tunnel exist according to packet SIP and VNI */
if (PREDICT_FALSE
@@ -473,7 +479,7 @@ geneve_input (vlib_main_t * vm,
{
key6_1.remote.as_u64[0] = ip6_1->dst_address.as_u64[0];
key6_1.remote.as_u64[1] = ip6_1->dst_address.as_u64[1];
- key6_1.vni = geneve1->vni;
+ key6_1.vni = vnet_get_geneve_vni_bigendian (geneve1);
p1 = hash_get_mem (vxm->geneve6_tunnel_by_key, &key6_1);
if (PREDICT_TRUE (p1 != NULL))
{
@@ -529,7 +535,7 @@ geneve_input (vlib_main_t * vm,
tr->next_index = next1;
tr->error = error1;
tr->tunnel_index = tunnel_index1;
- tr->vni = vnet_get_geneve_vni (geneve1);
+ tr->vni_rsvd = vnet_get_geneve_vni (geneve1);
}
vlib_validate_buffer_enqueue_x2 (vm, node, next_index,
@@ -564,6 +570,8 @@ geneve_input (vlib_main_t * vm,
/* udp leaves current_data pointing at the geneve header */
geneve0 = vlib_buffer_get_current (b0);
+ vnet_geneve_hdr_1word_ntoh (geneve0);
+
if (is_ip4)
{
vlib_buffer_advance
@@ -598,13 +606,14 @@ geneve_input (vlib_main_t * vm,
tunnel_index0 = ~0;
error0 = 0;
- if (PREDICT_FALSE (geneve0->ver != GENEVE_VERSION))
+ if (PREDICT_FALSE
+ (vnet_get_geneve_version (geneve0) != GENEVE_VERSION))
{
error0 = GENEVE_ERROR_BAD_FLAGS;
next0 = GENEVE_INPUT_NEXT_DROP;
goto trace00;
}
-#if SUPPORT_OPTIONS_HEADER==0
+#if SUPPORT_OPTIONS_HEADER==1
if (PREDICT_FALSE (vnet_get_geneve_critical_bit (geneve0) == 1))
{
error0 = GENEVE_ERROR_BAD_FLAGS;
@@ -615,7 +624,7 @@ geneve_input (vlib_main_t * vm,
if (is_ip4)
{
key4_0.remote = ip4_0->src_address.as_u32;
- key4_0.vni = geneve0->vni;
+ key4_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
/* Make sure unicast GENEVE tunnel exist by packet SIP and VNI */
if (PREDICT_FALSE (key4_0.as_u64 != last_key4.as_u64))
@@ -650,7 +659,7 @@ geneve_input (vlib_main_t * vm,
(ip4_address_is_multicast (&ip4_0->dst_address)))
{
key4_0.remote = ip4_0->dst_address.as_u32;
- key4_0.vni = geneve0->vni;
+ key4_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
/* Make sure mcast GENEVE tunnel exist by packet DIP and VNI */
p0 = hash_get (vxm->geneve4_tunnel_by_key, key4_0.as_u64);
if (PREDICT_TRUE (p0 != NULL))
@@ -668,7 +677,7 @@ geneve_input (vlib_main_t * vm,
{
key6_0.remote.as_u64[0] = ip6_0->src_address.as_u64[0];
key6_0.remote.as_u64[1] = ip6_0->src_address.as_u64[1];
- key6_0.vni = geneve0->vni;
+ key6_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
/* Make sure GENEVE tunnel exist according to packet SIP and VNI */
if (PREDICT_FALSE
@@ -705,7 +714,7 @@ geneve_input (vlib_main_t * vm,
{
key6_0.remote.as_u64[0] = ip6_0->dst_address.as_u64[0];
key6_0.remote.as_u64[1] = ip6_0->dst_address.as_u64[1];
- key6_0.vni = geneve0->vni;
+ key6_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
p0 = hash_get_mem (vxm->geneve6_tunnel_by_key, &key6_0);
if (PREDICT_TRUE (p0 != NULL))
{
@@ -761,7 +770,7 @@ geneve_input (vlib_main_t * vm,
tr->next_index = next0;
tr->error = error0;
tr->tunnel_index = tunnel_index0;
- tr->vni = vnet_get_geneve_vni (geneve0);
+ tr->vni_rsvd = vnet_get_geneve_vni (geneve0);
}
vlib_validate_buffer_enqueue_x1 (vm, node, next_index,
to_next, n_left_to_next,