summaryrefslogtreecommitdiffstats
path: root/vnet/vnet/vxlan/decap.c
diff options
context:
space:
mode:
Diffstat (limited to 'vnet/vnet/vxlan/decap.c')
-rw-r--r--vnet/vnet/vxlan/decap.c51
1 files changed, 36 insertions, 15 deletions
diff --git a/vnet/vnet/vxlan/decap.c b/vnet/vnet/vxlan/decap.c
index 2b74ce22dfe..812a8416dc3 100644
--- a/vnet/vnet/vxlan/decap.c
+++ b/vnet/vnet/vxlan/decap.c
@@ -37,13 +37,13 @@ static u8 * format_vxlan_rx_trace (u8 * s, va_list * args)
if (t->tunnel_index != ~0)
{
- s = format (s, "VXLAN: tunnel %d vni %d next %d error %d",
+ s = format (s, "VXLAN decap from vxlan_tunnel%d vni %d next %d error %d",
t->tunnel_index, t->vni, t->next_index, t->error);
}
else
{
- s = format (s, "VXLAN: no tunnel for vni %d next %d error %d",
- t->vni, t->next_index, t->error);
+ s = format (s, "VXLAN decap error - tunnel for vni %d does not exist",
+ t->vni);
}
return s;
}
@@ -129,11 +129,13 @@ vxlan_input (vlib_main_t * vm,
vxlan0 = vlib_buffer_get_current (b0);
vxlan1 = vlib_buffer_get_current (b1);
+ next0 = next1 = VXLAN_INPUT_NEXT_L2_INPUT;
+
if (is_ip4) {
- vlib_buffer_advance
- (b0, -(word)(sizeof(udp_header_t)+sizeof(ip4_header_t)));
- vlib_buffer_advance
- (b1, -(word)(sizeof(udp_header_t)+sizeof(ip4_header_t)));
+ vlib_buffer_advance
+ (b0, -(word)(sizeof(udp_header_t)+sizeof(ip4_header_t)));
+ vlib_buffer_advance
+ (b1, -(word)(sizeof(udp_header_t)+sizeof(ip4_header_t)));
ip4_0 = vlib_buffer_get_current (b0);
ip4_1 = vlib_buffer_get_current (b1);
} else {
@@ -149,10 +151,10 @@ vxlan_input (vlib_main_t * vm,
if (is_ip4) {
vlib_buffer_advance
(b0, sizeof(*ip4_0)+sizeof(udp_header_t)+sizeof(*vxlan0));
- vlib_buffer_advance
+ vlib_buffer_advance
(b1, sizeof(*ip4_1)+sizeof(udp_header_t)+sizeof(*vxlan1));
} else {
- vlib_buffer_advance
+ vlib_buffer_advance
(b0, sizeof(*ip6_0)+sizeof(udp_header_t)+sizeof(*vxlan0));
vlib_buffer_advance
(b1, sizeof(*ip6_1)+sizeof(udp_header_t)+sizeof(*vxlan1));
@@ -164,6 +166,13 @@ vxlan_input (vlib_main_t * vm,
tunnel_index1 = ~0;
error1 = 0;
+ if (PREDICT_FALSE (vxlan0->flags != VXLAN_FLAGS_I))
+ {
+ error0 = VXLAN_ERROR_BAD_FLAGS;
+ next0 = VXLAN_INPUT_NEXT_DROP;
+ goto trace0;
+ }
+
if (is_ip4) {
key4_0.src = ip4_0->src_address.as_u32;
key4_0.vni = vxlan0->vni_reserved;
@@ -209,7 +218,6 @@ vxlan_input (vlib_main_t * vm,
t0 = pool_elt_at_index (vxm->tunnels, tunnel_index0);
- next0 = t0->decap_next_index;
sw_if_index0 = t0->sw_if_index;
len0 = vlib_buffer_length_in_chain (vm, b0);
@@ -253,6 +261,12 @@ vxlan_input (vlib_main_t * vm,
tr->vni = vnet_get_vni (vxlan0);
}
+ if (PREDICT_FALSE (vxlan1->flags != VXLAN_FLAGS_I))
+ {
+ error1 = VXLAN_ERROR_BAD_FLAGS;
+ next1 = VXLAN_INPUT_NEXT_DROP;
+ goto trace1;
+ }
if (is_ip4) {
key4_1.src = ip4_1->src_address.as_u32;
@@ -299,7 +313,6 @@ vxlan_input (vlib_main_t * vm,
t1 = pool_elt_at_index (vxm->tunnels, tunnel_index1);
- next1 = t1->decap_next_index;
sw_if_index1 = t1->sw_if_index;
len1 = vlib_buffer_length_in_chain (vm, b1);
@@ -376,9 +389,11 @@ vxlan_input (vlib_main_t * vm,
/* udp leaves current_data pointing at the vxlan header */
vxlan0 = vlib_buffer_get_current (b0);
+ next0 = VXLAN_INPUT_NEXT_L2_INPUT;
+
if (is_ip4) {
- vlib_buffer_advance
- (b0, -(word)(sizeof(udp_header_t)+sizeof(ip4_header_t)));
+ vlib_buffer_advance
+ (b0, -(word)(sizeof(udp_header_t)+sizeof(ip4_header_t)));
ip4_0 = vlib_buffer_get_current (b0);
} else {
vlib_buffer_advance
@@ -391,13 +406,20 @@ vxlan_input (vlib_main_t * vm,
vlib_buffer_advance
(b0, sizeof(*ip4_0)+sizeof(udp_header_t)+sizeof(*vxlan0));
} else {
- vlib_buffer_advance
+ vlib_buffer_advance
(b0, sizeof(*ip6_0)+sizeof(udp_header_t)+sizeof(*vxlan0));
}
tunnel_index0 = ~0;
error0 = 0;
+ if (PREDICT_FALSE (vxlan0->flags != VXLAN_FLAGS_I))
+ {
+ error0 = VXLAN_ERROR_BAD_FLAGS;
+ next0 = VXLAN_INPUT_NEXT_DROP;
+ goto trace00;
+ }
+
if (is_ip4) {
key4_0.src = ip4_0->src_address.as_u32;
key4_0.vni = vxlan0->vni_reserved;
@@ -443,7 +465,6 @@ vxlan_input (vlib_main_t * vm,
t0 = pool_elt_at_index (vxm->tunnels, tunnel_index0);
- next0 = t0->decap_next_index;
sw_if_index0 = t0->sw_if_index;
len0 = vlib_buffer_length_in_chain (vm, b0);