summaryrefslogtreecommitdiff
path: root/ofproto/ofproto-dpif.c
diff options
context:
space:
mode:
authorMartin Varghese <martin.varghese@nokia.com>2021-11-29 11:52:05 +0530
committerIlya Maximets <i.maximets@ovn.org>2022-01-17 02:04:20 +0100
commit1917ace89364d366777b34467e952358d2d85b41 (patch)
tree109d821fbb510ed2df3cf8358d496af8d2830364 /ofproto/ofproto-dpif.c
parent4a6a4734622e42367faf39cd3938bc8a57786282 (diff)
downloadopenvswitch-1917ace89364d366777b34467e952358d2d85b41.tar.gz
Encap & Decap actions for MPLS packet type.
The encap & decap actions are extended to support MPLS packet type. Encap & decap actions adds and removes MPLS header at start of the packet. The existing PUSH MPLS & POP MPLS actions inserts & removes MPLS header between ethernet header and the IP header. Though this behaviour is fine for L3 VPN where an IP packet is encapsulated inside a MPLS tunnel, it does not suffice the L2 VPN requirements. In L2 VPN the ethernet packets must be encapsulated inside MPLS tunnel. In this change the encap & decap actions are extended to support MPLS packet type. The encap & decap adds and removes MPLS header at the start of packet as depicted below. Encapsulation: Actions - encap(mpls),encap(ethernet) Incoming packet -> | ETH | IP | Payload | 1 Actions - encap(mpls) [Datapath action - ADD_MPLS:0x8847] Outgoing packet -> | MPLS | ETH | Payload| 2 Actions - encap(ethernet) [ Datapath action - push_eth ] Outgoing packet -> | ETH | MPLS | ETH | Payload| Decapsulation: Incoming packet -> | ETH | MPLS | ETH | IP | Payload | Actions - decap(),decap(packet_type(ns=0,type=0)) 1 Actions - decap() [Datapath action - pop_eth) Outgoing packet -> | MPLS | ETH | IP | Payload| 2 Actions - decap(packet_type(ns=0,type=0)) [Datapath action - POP_MPLS:0x6558] Outgoing packet -> | ETH | IP | Payload| Signed-off-by: Martin Varghese <martin.varghese@nokia.com> Acked-by: Eelco Chaudron <echaudro@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
Diffstat (limited to 'ofproto/ofproto-dpif.c')
-rw-r--r--ofproto/ofproto-dpif.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index bc3df8ea1..c711b99c7 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -1539,6 +1539,43 @@ check_nd_extensions(struct dpif_backer *backer)
return !error;
}
+/* Tests whether 'backer''s datapath supports the OVS_ACTION_ATTR_ADD_MPLS
+ * action. */
+static bool
+check_add_mpls(struct dpif_backer *backer)
+{
+ struct odputil_keybuf keybuf;
+ struct ofpbuf actions;
+ struct ofpbuf key;
+ struct flow flow;
+ bool supported;
+
+ struct odp_flow_key_parms odp_parms = {
+ .flow = &flow,
+ .probe = true,
+ };
+
+ memset(&flow, 0, sizeof flow);
+ ofpbuf_use_stack(&key, &keybuf, sizeof keybuf);
+ odp_flow_key_from_flow(&odp_parms, &key);
+ ofpbuf_init(&actions, 64);
+
+ struct ovs_action_add_mpls *mpls;
+
+ mpls = nl_msg_put_unspec_zero(&actions,
+ OVS_ACTION_ATTR_ADD_MPLS,
+ sizeof *mpls);
+ mpls->mpls_ethertype = htons(ETH_TYPE_MPLS);
+
+ supported = dpif_probe_feature(backer->dpif, "add_mpls", &key,
+ &actions, NULL);
+ ofpbuf_uninit(&actions);
+ VLOG_INFO("%s: Datapath %s add_mpls action",
+ dpif_name(backer->dpif),
+ supported ? "supports" : "does not support");
+ return supported;
+}
+
#define CHECK_FEATURE__(NAME, SUPPORT, FIELD, VALUE, ETHTYPE) \
static bool \
check_##NAME(struct dpif_backer *backer) \
@@ -1609,6 +1646,7 @@ check_support(struct dpif_backer *backer)
backer->rt_support.lb_output_action =
dpif_supports_lb_output_action(backer->dpif);
backer->rt_support.ct_zero_snat = dpif_supports_ct_zero_snat(backer);
+ backer->rt_support.add_mpls = check_add_mpls(backer);
/* Flow fields. */
backer->rt_support.odp.ct_state = check_ct_state(backer);
@@ -5625,6 +5663,7 @@ get_datapath_cap(const char *datapath_type, struct smap *cap)
s.explicit_drop_action ? "true" :"false");
smap_add(cap, "lb_output_action", s.lb_output_action ? "true" : "false");
smap_add(cap, "ct_zero_snat", s.ct_zero_snat ? "true" : "false");
+ smap_add(cap, "add_mpls", s.add_mpls ? "true" : "false");
}
/* Gets timeout policy name in 'backer' based on 'zone', 'dl_type' and