aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/vxlan
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2020-12-16 13:06:58 +0000
committerOle Tr�an <otroan@employees.org>2021-01-14 11:43:41 +0000
commit1b5ca985dc51bea730ce5ee799641c75f73a0f26 (patch)
tree430c91891d54710adf8f16c3daddc5b5315e4b9f /src/vnet/vxlan
parent887f1aa725ed64c3c83aca557bd7bb6588bacaf7 (diff)
vxlan: Protect against tunnel config where source is not local
Type: fix If a tunnel's source is not local then post encap VPP will attempt to receive (via ip4-local) that packet, things go wrong from there. The fix is when stacking the encap forwarding don't accept a receive DPO. This approach is taken, rather than rejecting bad tunnels, because the 'local-ness' of the tunnel's source can change and we can't reject tunnels that were once correctly configured but are no longer. the user will quickly discover their mistake as traffic won't pass. Signed-off-by: Neale Ranns <nranns@cisco.com> Change-Id: I46198422e321606e8baba003112e978a526b4c2f
Diffstat (limited to 'src/vnet/vxlan')
-rw-r--r--src/vnet/vxlan/vxlan.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/vnet/vxlan/vxlan.c b/src/vnet/vxlan/vxlan.c
index bf205adc8fb..71d03f6d03d 100644
--- a/src/vnet/vxlan/vxlan.c
+++ b/src/vnet/vxlan/vxlan.c
@@ -20,6 +20,7 @@
#include <vnet/mfib/mfib_table.h>
#include <vnet/adj/adj_mcast.h>
#include <vnet/adj/rewrite.h>
+#include <vnet/dpo/drop_dpo.h>
#include <vnet/interface.h>
#include <vnet/flow/flow.h>
#include <vnet/udp/udp_local.h>
@@ -151,11 +152,19 @@ vxlan_tunnel_restack_dpo (vxlan_tunnel_t * t)
* skip single bucket load balance dpo's */
while (DPO_LOAD_BALANCE == dpo.dpoi_type)
{
- load_balance_t *lb = load_balance_get (dpo.dpoi_index);
+ const load_balance_t *lb;
+ const dpo_id_t *choice;
+
+ lb = load_balance_get (dpo.dpoi_index);
if (lb->lb_n_buckets > 1)
break;
- dpo_copy (&dpo, load_balance_get_bucket_i (lb, 0));
+ choice = load_balance_get_bucket_i (lb, 0);
+
+ if (DPO_RECEIVE == choice->dpoi_type)
+ dpo_copy (&dpo, drop_dpo_get (choice->dpoi_proto));
+ else
+ dpo_copy (&dpo, choice);
}
u32 encap_index = is_ip4 ?