[ONOS-7242] Support MPLS by fabric.p4 pipeliner
Change-Id: I56a8f266e6d0afe5ad6737b8d0e399758fb75378
diff --git a/pipelines/fabric/src/main/resources/include/control/next.p4 b/pipelines/fabric/src/main/resources/include/control/next.p4
index 5ab18fa..2b3019c 100644
--- a/pipelines/fabric/src/main/resources/include/control/next.p4
+++ b/pipelines/fabric/src/main/resources/include/control/next.p4
@@ -73,6 +73,28 @@
rewrite_smac(smac);
}
+ action push_mpls (mpls_label_t label, bit<3> tc) {
+ //Suppose that the maximum number of label is one.
+ hdr.mpls.setValid();
+ hdr.ethernet.ether_type = ETHERTYPE_MPLS;
+ hdr.mpls.label = label;
+ hdr.mpls.tc = tc;
+ hdr.mpls.bos = 1; // BOS = TRUE
+ hdr.mpls.ttl = DEFAULT_MPLS_TTL;
+ }
+
+ action mpls_routing_v4 (port_num_t port_num, mac_addr_t smac, mac_addr_t dmac,
+ mpls_label_t label) {
+ l3_routing(port_num, smac, dmac);
+ push_mpls(label, hdr.ipv4.diffserv[7:5]);
+ }
+
+ action mpls_routing_v6 (port_num_t port_num, mac_addr_t smac, mac_addr_t dmac,
+ mpls_label_t label) {
+ l3_routing(port_num, smac, dmac);
+ push_mpls(label, hdr.ipv6.traffic_class[7:5]);
+ }
+
table next_id_mapping {
key = {
fabric_metadata.next_id: exact;
@@ -112,6 +134,8 @@
actions = {
l3_routing;
+ mpls_routing_v4;
+ mpls_routing_v6;
}
implementation = ecmp_selector;