aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/ipip/node.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/ipip/node.c')
-rw-r--r--src/vnet/ipip/node.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/vnet/ipip/node.c b/src/vnet/ipip/node.c
index baaeee863fc..b008a21a20f 100644
--- a/src/vnet/ipip/node.c
+++ b/src/vnet/ipip/node.c
@@ -22,11 +22,12 @@
#include <vnet/tunnel/tunnel_dp.h>
#include <vppinfra/sparse_vec.h>
-#define foreach_ipip_input_next \
- _(PUNT, "error-punt") \
- _(DROP, "error-drop") \
- _(IP4_INPUT, "ip4-input") \
- _(IP6_INPUT, "ip6-input")
+#define foreach_ipip_input_next \
+ _ (PUNT, "error-punt") \
+ _ (DROP, "error-drop") \
+ _ (IP4_INPUT, "ip4-input") \
+ _ (IP6_INPUT, "ip6-input") \
+ _ (MPLS_INPUT, "mpls-input")
typedef enum
{
@@ -175,6 +176,17 @@ ipip_input (vlib_main_t * vm, vlib_node_runtime_t * node,
else
tunnel_decap_fixup_4o4 (t0->flags, ip40 + 1, ip40);
}
+ else if (inner_protocol0 == IP_PROTOCOL_MPLS_IN_IP)
+ {
+ next0 = IPIP_INPUT_NEXT_MPLS_INPUT;
+
+ if (is_ipv6)
+ tunnel_decap_fixup_mplso6 (
+ t0->flags, (mpls_unicast_header_t *) (ip60 + 1), ip60);
+ else
+ tunnel_decap_fixup_mplso4 (
+ t0->flags, (mpls_unicast_header_t *) ip40 + 1, ip40);
+ }
if (!is_ipv6 && t0->mode == IPIP_MODE_6RD
&& t0->sixrd.security_check)