Support for setting the MPLS BOS indicator bit.
Change-Id: Ib42747445113aadb62fd161a1c79ca59783884af
diff --git a/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
index 2dad08b..f0937a7 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
@@ -343,6 +343,11 @@
}
@Override
+ public Builder setMplsBos(boolean mplsBos) {
+ return add(Instructions.modMplsBos(mplsBos));
+ }
+
+ @Override
public Builder decMplsTtl() {
return add(Instructions.decMplsTtl());
}
diff --git a/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java b/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
index 042aeaf..b982199 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
@@ -227,6 +227,14 @@
Builder setMpls(MplsLabel mplsLabel);
/**
+ * Sets the mpls bottom-of-stack indicator bit.
+ *
+ * @param mplsBos boolean to set BOS=1 (true) or BOS=0 (false).
+ * @return a treatment builder.
+ */
+ Builder setMplsBos(boolean mplsBos);
+
+ /**
* Decrement MPLS TTL.
*
* @return a treatment builder
diff --git a/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java b/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
index cd9ec96..97f57db 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
@@ -176,6 +176,16 @@
}
/**
+ * Creates a MPLS BOS bit modification.
+ *
+ * @param mplsBos MPLS BOS bit to set (true) or unset (false)
+ * @return a L2 Modification
+ */
+ public static L2ModificationInstruction modMplsBos(boolean mplsBos) {
+ return new L2ModificationInstruction.ModMplsBosInstruction(mplsBos);
+ }
+
+ /**
* Creates a MPLS decrement TTL modification.
*
* @return a L2 Modification
@@ -673,6 +683,7 @@
return false;
}
}
+
}
diff --git a/core/api/src/main/java/org/onosproject/net/flow/instructions/L2ModificationInstruction.java b/core/api/src/main/java/org/onosproject/net/flow/instructions/L2ModificationInstruction.java
index bfb6300..cf6a1a2 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/instructions/L2ModificationInstruction.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/instructions/L2ModificationInstruction.java
@@ -84,9 +84,14 @@
VLAN_PUSH,
/**
- * Tunnle id modification.
+ * Tunnel id modification.
*/
- TUNNEL_ID
+ TUNNEL_ID,
+
+ /**
+ * MPLS BOS instruction.
+ */
+ MPLS_BOS
}
// TODO: Create factory class 'Instructions' that will have various factory
@@ -371,6 +376,51 @@
}
/**
+ * Represents a MPLS BOS modification.
+ */
+ public static final class ModMplsBosInstruction
+ extends L2ModificationInstruction {
+
+ private final boolean mplsBos;
+
+ ModMplsBosInstruction(boolean mplsBos) {
+ this.mplsBos = mplsBos;
+ }
+
+ public boolean mplsBos() {
+ return mplsBos;
+ }
+
+ @Override
+ public L2SubType subtype() {
+ return L2SubType.MPLS_BOS;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(subtype().toString()).add("bos", mplsBos)
+ .toString();
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(type(), subtype(), mplsBos);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof ModMplsBosInstruction) {
+ ModMplsBosInstruction that = (ModMplsBosInstruction) obj;
+ return Objects.equals(mplsBos, that.mplsBos());
+ }
+ return false;
+ }
+ }
+
+ /**
* Represents a MPLS TTL modification.
*/
public static final class ModMplsTtlInstruction
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
index 170a2af..dba123b 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
@@ -404,6 +404,11 @@
OFOxm<U32> labelId = (OFOxm<U32>) oxm;
builder.setMpls(MplsLabel.mplsLabel((int) labelId.getValue().getValue()));
break;
+ case MPLS_BOS:
+ @SuppressWarnings("unchecked")
+ OFOxm<U8> mplsBos = (OFOxm<U8>) oxm;
+ builder.setMplsBos(mplsBos.getValue() == U8.ZERO ? false : true);
+ break;
case TUNNEL_ID:
@SuppressWarnings("unchecked")
OFOxm<U64> tunnelId = (OFOxm<U64>) oxm;
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
index 483eca9..ac93f7b 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
@@ -31,6 +31,7 @@
import org.onosproject.net.flow.instructions.L0ModificationInstruction.ModOchSignalInstruction;
import org.onosproject.net.flow.instructions.L2ModificationInstruction;
import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModEtherInstruction;
+import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModMplsBosInstruction;
import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModMplsLabelInstruction;
import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModVlanIdInstruction;
import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModVlanPcpInstruction;
@@ -58,6 +59,7 @@
import org.projectfloodlight.openflow.types.IPv6Address;
import org.projectfloodlight.openflow.types.IPv6FlowLabel;
import org.projectfloodlight.openflow.types.MacAddress;
+import org.projectfloodlight.openflow.types.OFBooleanValue;
import org.projectfloodlight.openflow.types.OFBufferId;
import org.projectfloodlight.openflow.types.OFGroup;
import org.projectfloodlight.openflow.types.OFPort;
@@ -343,6 +345,12 @@
oxm = factory().oxms().mplsLabel(U32.of(mplsLabel.label()
.longValue()));
break;
+ case MPLS_BOS:
+ ModMplsBosInstruction mplsBos = (ModMplsBosInstruction) l2m;
+ oxm = factory().oxms()
+ .mplsBos(mplsBos.mplsBos() ? OFBooleanValue.TRUE
+ : OFBooleanValue.FALSE);
+ break;
case DEC_MPLS_TTL:
return factory().actions().decMplsTtl();
case VLAN_POP:
diff --git a/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupBucketEntryBuilder.java b/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupBucketEntryBuilder.java
index c359f58..b9de7c0 100644
--- a/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupBucketEntryBuilder.java
+++ b/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupBucketEntryBuilder.java
@@ -56,6 +56,7 @@
import org.projectfloodlight.openflow.types.IPv4Address;
import org.projectfloodlight.openflow.types.OFVlanVidMatch;
import org.projectfloodlight.openflow.types.U32;
+import org.projectfloodlight.openflow.types.U8;
import org.projectfloodlight.openflow.types.VlanPcp;
import org.slf4j.Logger;
@@ -277,6 +278,11 @@
OFOxm<U32> labelId = (OFOxm<U32>) oxm;
builder.setMpls(MplsLabel.mplsLabel((int) labelId.getValue().getValue()));
break;
+ case MPLS_BOS:
+ @SuppressWarnings("unchecked")
+ OFOxm<U8> mplsBos = (OFOxm<U8>) oxm;
+ builder.setMplsBos(mplsBos.getValue() == U8.ZERO ? false : true);
+ break;
case ARP_OP:
case ARP_SHA:
case ARP_SPA:
diff --git a/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupModBuilder.java b/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupModBuilder.java
index 436fa6e..76d7ee0 100644
--- a/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupModBuilder.java
+++ b/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupModBuilder.java
@@ -44,6 +44,7 @@
import org.projectfloodlight.openflow.types.IPv6Address;
import org.projectfloodlight.openflow.types.IPv6FlowLabel;
import org.projectfloodlight.openflow.types.MacAddress;
+import org.projectfloodlight.openflow.types.OFBooleanValue;
import org.projectfloodlight.openflow.types.OFGroup;
import org.projectfloodlight.openflow.types.OFPort;
import org.projectfloodlight.openflow.types.OFVlanVidMatch;
@@ -286,6 +287,13 @@
oxm = factory.oxms().mplsLabel(U32.of(mplsLabel.label()
.longValue()));
break;
+ case MPLS_BOS:
+ L2ModificationInstruction.ModMplsBosInstruction mplsBos =
+ (L2ModificationInstruction.ModMplsBosInstruction) l2m;
+ oxm = factory.oxms()
+ .mplsBos(mplsBos.mplsBos() ? OFBooleanValue.TRUE
+ : OFBooleanValue.FALSE);
+ break;
case DEC_MPLS_TTL:
return factory.actions().decMplsTtl();
default: