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 2dad08b435..f0937a78fc 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 @@ -342,6 +342,11 @@ public final class DefaultTrafficTreatment implements TrafficTreatment { return add(Instructions.modMplsLabel(mplsLabel)); } + @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 042aeaf6a3..b982199b6d 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 @@ -226,6 +226,14 @@ public interface TrafficTreatment { */ 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. * 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 cd9ec96b70..97f57dbe80 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 @@ -175,6 +175,16 @@ public final class Instructions { return new L2ModificationInstruction.ModMplsLabelInstruction(mplsLabel); } + /** + * 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. * @@ -673,6 +683,7 @@ public final class Instructions { 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 bfb6300978..cf6a1a2ccd 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 @@ public abstract class L2ModificationInstruction implements Instruction { 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 @@ -370,6 +375,51 @@ public abstract class L2ModificationInstruction implements Instruction { } } + /** + * 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. */ 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 170a2af343..dba123bd1f 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 @@ public class FlowEntryBuilder { OFOxm labelId = (OFOxm) oxm; builder.setMpls(MplsLabel.mplsLabel((int) labelId.getValue().getValue())); break; + case MPLS_BOS: + @SuppressWarnings("unchecked") + OFOxm mplsBos = (OFOxm) oxm; + builder.setMplsBos(mplsBos.getValue() == U8.ZERO ? false : true); + break; case TUNNEL_ID: @SuppressWarnings("unchecked") OFOxm tunnelId = (OFOxm) 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 483eca979a..ac93f7be54 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.ModLambda 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.IPv4Address; 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 @@ public class FlowModBuilderVer13 extends FlowModBuilder { 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 c359f583e0..b9de7c0f1e 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.protocol.oxm.OFOxmOchSigidBasic; 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 @@ public class GroupBucketEntryBuilder { OFOxm labelId = (OFOxm) oxm; builder.setMpls(MplsLabel.mplsLabel((int) labelId.getValue().getValue())); break; + case MPLS_BOS: + @SuppressWarnings("unchecked") + OFOxm mplsBos = (OFOxm) 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 436fa6e209..76d7ee0a33 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.IPv4Address; 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 @@ public final class GroupModBuilder { 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: