Committed by
Gerrit Code Review
Support for setting the MPLS BOS indicator bit.
Change-Id: Ib42747445113aadb62fd161a1c79ca59783884af
Showing
8 changed files
with
103 additions
and
2 deletions
| ... | @@ -343,6 +343,11 @@ public final class DefaultTrafficTreatment implements TrafficTreatment { | ... | @@ -343,6 +343,11 @@ public final class DefaultTrafficTreatment implements TrafficTreatment { |
| 343 | } | 343 | } |
| 344 | 344 | ||
| 345 | @Override | 345 | @Override |
| 346 | + public Builder setMplsBos(boolean mplsBos) { | ||
| 347 | + return add(Instructions.modMplsBos(mplsBos)); | ||
| 348 | + } | ||
| 349 | + | ||
| 350 | + @Override | ||
| 346 | public Builder decMplsTtl() { | 351 | public Builder decMplsTtl() { |
| 347 | return add(Instructions.decMplsTtl()); | 352 | return add(Instructions.decMplsTtl()); |
| 348 | } | 353 | } | ... | ... |
| ... | @@ -227,6 +227,14 @@ public interface TrafficTreatment { | ... | @@ -227,6 +227,14 @@ public interface TrafficTreatment { |
| 227 | Builder setMpls(MplsLabel mplsLabel); | 227 | Builder setMpls(MplsLabel mplsLabel); |
| 228 | 228 | ||
| 229 | /** | 229 | /** |
| 230 | + * Sets the mpls bottom-of-stack indicator bit. | ||
| 231 | + * | ||
| 232 | + * @param mplsBos boolean to set BOS=1 (true) or BOS=0 (false). | ||
| 233 | + * @return a treatment builder. | ||
| 234 | + */ | ||
| 235 | + Builder setMplsBos(boolean mplsBos); | ||
| 236 | + | ||
| 237 | + /** | ||
| 230 | * Decrement MPLS TTL. | 238 | * Decrement MPLS TTL. |
| 231 | * | 239 | * |
| 232 | * @return a treatment builder | 240 | * @return a treatment builder | ... | ... |
| ... | @@ -176,6 +176,16 @@ public final class Instructions { | ... | @@ -176,6 +176,16 @@ public final class Instructions { |
| 176 | } | 176 | } |
| 177 | 177 | ||
| 178 | /** | 178 | /** |
| 179 | + * Creates a MPLS BOS bit modification. | ||
| 180 | + * | ||
| 181 | + * @param mplsBos MPLS BOS bit to set (true) or unset (false) | ||
| 182 | + * @return a L2 Modification | ||
| 183 | + */ | ||
| 184 | + public static L2ModificationInstruction modMplsBos(boolean mplsBos) { | ||
| 185 | + return new L2ModificationInstruction.ModMplsBosInstruction(mplsBos); | ||
| 186 | + } | ||
| 187 | + | ||
| 188 | + /** | ||
| 179 | * Creates a MPLS decrement TTL modification. | 189 | * Creates a MPLS decrement TTL modification. |
| 180 | * | 190 | * |
| 181 | * @return a L2 Modification | 191 | * @return a L2 Modification |
| ... | @@ -673,6 +683,7 @@ public final class Instructions { | ... | @@ -673,6 +683,7 @@ public final class Instructions { |
| 673 | return false; | 683 | return false; |
| 674 | } | 684 | } |
| 675 | } | 685 | } |
| 686 | + | ||
| 676 | } | 687 | } |
| 677 | 688 | ||
| 678 | 689 | ... | ... |
| ... | @@ -84,9 +84,14 @@ public abstract class L2ModificationInstruction implements Instruction { | ... | @@ -84,9 +84,14 @@ public abstract class L2ModificationInstruction implements Instruction { |
| 84 | VLAN_PUSH, | 84 | VLAN_PUSH, |
| 85 | 85 | ||
| 86 | /** | 86 | /** |
| 87 | - * Tunnle id modification. | 87 | + * Tunnel id modification. |
| 88 | */ | 88 | */ |
| 89 | - TUNNEL_ID | 89 | + TUNNEL_ID, |
| 90 | + | ||
| 91 | + /** | ||
| 92 | + * MPLS BOS instruction. | ||
| 93 | + */ | ||
| 94 | + MPLS_BOS | ||
| 90 | } | 95 | } |
| 91 | 96 | ||
| 92 | // TODO: Create factory class 'Instructions' that will have various factory | 97 | // TODO: Create factory class 'Instructions' that will have various factory |
| ... | @@ -371,6 +376,51 @@ public abstract class L2ModificationInstruction implements Instruction { | ... | @@ -371,6 +376,51 @@ public abstract class L2ModificationInstruction implements Instruction { |
| 371 | } | 376 | } |
| 372 | 377 | ||
| 373 | /** | 378 | /** |
| 379 | + * Represents a MPLS BOS modification. | ||
| 380 | + */ | ||
| 381 | + public static final class ModMplsBosInstruction | ||
| 382 | + extends L2ModificationInstruction { | ||
| 383 | + | ||
| 384 | + private final boolean mplsBos; | ||
| 385 | + | ||
| 386 | + ModMplsBosInstruction(boolean mplsBos) { | ||
| 387 | + this.mplsBos = mplsBos; | ||
| 388 | + } | ||
| 389 | + | ||
| 390 | + public boolean mplsBos() { | ||
| 391 | + return mplsBos; | ||
| 392 | + } | ||
| 393 | + | ||
| 394 | + @Override | ||
| 395 | + public L2SubType subtype() { | ||
| 396 | + return L2SubType.MPLS_BOS; | ||
| 397 | + } | ||
| 398 | + | ||
| 399 | + @Override | ||
| 400 | + public String toString() { | ||
| 401 | + return toStringHelper(subtype().toString()).add("bos", mplsBos) | ||
| 402 | + .toString(); | ||
| 403 | + } | ||
| 404 | + | ||
| 405 | + @Override | ||
| 406 | + public int hashCode() { | ||
| 407 | + return Objects.hash(type(), subtype(), mplsBos); | ||
| 408 | + } | ||
| 409 | + | ||
| 410 | + @Override | ||
| 411 | + public boolean equals(Object obj) { | ||
| 412 | + if (this == obj) { | ||
| 413 | + return true; | ||
| 414 | + } | ||
| 415 | + if (obj instanceof ModMplsBosInstruction) { | ||
| 416 | + ModMplsBosInstruction that = (ModMplsBosInstruction) obj; | ||
| 417 | + return Objects.equals(mplsBos, that.mplsBos()); | ||
| 418 | + } | ||
| 419 | + return false; | ||
| 420 | + } | ||
| 421 | + } | ||
| 422 | + | ||
| 423 | + /** | ||
| 374 | * Represents a MPLS TTL modification. | 424 | * Represents a MPLS TTL modification. |
| 375 | */ | 425 | */ |
| 376 | public static final class ModMplsTtlInstruction | 426 | public static final class ModMplsTtlInstruction | ... | ... |
| ... | @@ -404,6 +404,11 @@ public class FlowEntryBuilder { | ... | @@ -404,6 +404,11 @@ public class FlowEntryBuilder { |
| 404 | OFOxm<U32> labelId = (OFOxm<U32>) oxm; | 404 | OFOxm<U32> labelId = (OFOxm<U32>) oxm; |
| 405 | builder.setMpls(MplsLabel.mplsLabel((int) labelId.getValue().getValue())); | 405 | builder.setMpls(MplsLabel.mplsLabel((int) labelId.getValue().getValue())); |
| 406 | break; | 406 | break; |
| 407 | + case MPLS_BOS: | ||
| 408 | + @SuppressWarnings("unchecked") | ||
| 409 | + OFOxm<U8> mplsBos = (OFOxm<U8>) oxm; | ||
| 410 | + builder.setMplsBos(mplsBos.getValue() == U8.ZERO ? false : true); | ||
| 411 | + break; | ||
| 407 | case TUNNEL_ID: | 412 | case TUNNEL_ID: |
| 408 | @SuppressWarnings("unchecked") | 413 | @SuppressWarnings("unchecked") |
| 409 | OFOxm<U64> tunnelId = (OFOxm<U64>) oxm; | 414 | OFOxm<U64> tunnelId = (OFOxm<U64>) oxm; | ... | ... |
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 | ... | @@ -31,6 +31,7 @@ import org.onosproject.net.flow.instructions.L0ModificationInstruction.ModLambda |
| 31 | import org.onosproject.net.flow.instructions.L0ModificationInstruction.ModOchSignalInstruction; | 31 | import org.onosproject.net.flow.instructions.L0ModificationInstruction.ModOchSignalInstruction; |
| 32 | import org.onosproject.net.flow.instructions.L2ModificationInstruction; | 32 | import org.onosproject.net.flow.instructions.L2ModificationInstruction; |
| 33 | import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModEtherInstruction; | 33 | import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModEtherInstruction; |
| 34 | +import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModMplsBosInstruction; | ||
| 34 | import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModMplsLabelInstruction; | 35 | import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModMplsLabelInstruction; |
| 35 | import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModVlanIdInstruction; | 36 | import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModVlanIdInstruction; |
| 36 | import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModVlanPcpInstruction; | 37 | import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModVlanPcpInstruction; |
| ... | @@ -58,6 +59,7 @@ import org.projectfloodlight.openflow.types.IPv4Address; | ... | @@ -58,6 +59,7 @@ import org.projectfloodlight.openflow.types.IPv4Address; |
| 58 | import org.projectfloodlight.openflow.types.IPv6Address; | 59 | import org.projectfloodlight.openflow.types.IPv6Address; |
| 59 | import org.projectfloodlight.openflow.types.IPv6FlowLabel; | 60 | import org.projectfloodlight.openflow.types.IPv6FlowLabel; |
| 60 | import org.projectfloodlight.openflow.types.MacAddress; | 61 | import org.projectfloodlight.openflow.types.MacAddress; |
| 62 | +import org.projectfloodlight.openflow.types.OFBooleanValue; | ||
| 61 | import org.projectfloodlight.openflow.types.OFBufferId; | 63 | import org.projectfloodlight.openflow.types.OFBufferId; |
| 62 | import org.projectfloodlight.openflow.types.OFGroup; | 64 | import org.projectfloodlight.openflow.types.OFGroup; |
| 63 | import org.projectfloodlight.openflow.types.OFPort; | 65 | import org.projectfloodlight.openflow.types.OFPort; |
| ... | @@ -343,6 +345,12 @@ public class FlowModBuilderVer13 extends FlowModBuilder { | ... | @@ -343,6 +345,12 @@ public class FlowModBuilderVer13 extends FlowModBuilder { |
| 343 | oxm = factory().oxms().mplsLabel(U32.of(mplsLabel.label() | 345 | oxm = factory().oxms().mplsLabel(U32.of(mplsLabel.label() |
| 344 | .longValue())); | 346 | .longValue())); |
| 345 | break; | 347 | break; |
| 348 | + case MPLS_BOS: | ||
| 349 | + ModMplsBosInstruction mplsBos = (ModMplsBosInstruction) l2m; | ||
| 350 | + oxm = factory().oxms() | ||
| 351 | + .mplsBos(mplsBos.mplsBos() ? OFBooleanValue.TRUE | ||
| 352 | + : OFBooleanValue.FALSE); | ||
| 353 | + break; | ||
| 346 | case DEC_MPLS_TTL: | 354 | case DEC_MPLS_TTL: |
| 347 | return factory().actions().decMplsTtl(); | 355 | return factory().actions().decMplsTtl(); |
| 348 | case VLAN_POP: | 356 | case VLAN_POP: | ... | ... |
| ... | @@ -56,6 +56,7 @@ import org.projectfloodlight.openflow.protocol.oxm.OFOxmOchSigidBasic; | ... | @@ -56,6 +56,7 @@ import org.projectfloodlight.openflow.protocol.oxm.OFOxmOchSigidBasic; |
| 56 | import org.projectfloodlight.openflow.types.IPv4Address; | 56 | import org.projectfloodlight.openflow.types.IPv4Address; |
| 57 | import org.projectfloodlight.openflow.types.OFVlanVidMatch; | 57 | import org.projectfloodlight.openflow.types.OFVlanVidMatch; |
| 58 | import org.projectfloodlight.openflow.types.U32; | 58 | import org.projectfloodlight.openflow.types.U32; |
| 59 | +import org.projectfloodlight.openflow.types.U8; | ||
| 59 | import org.projectfloodlight.openflow.types.VlanPcp; | 60 | import org.projectfloodlight.openflow.types.VlanPcp; |
| 60 | import org.slf4j.Logger; | 61 | import org.slf4j.Logger; |
| 61 | 62 | ||
| ... | @@ -277,6 +278,11 @@ public class GroupBucketEntryBuilder { | ... | @@ -277,6 +278,11 @@ public class GroupBucketEntryBuilder { |
| 277 | OFOxm<U32> labelId = (OFOxm<U32>) oxm; | 278 | OFOxm<U32> labelId = (OFOxm<U32>) oxm; |
| 278 | builder.setMpls(MplsLabel.mplsLabel((int) labelId.getValue().getValue())); | 279 | builder.setMpls(MplsLabel.mplsLabel((int) labelId.getValue().getValue())); |
| 279 | break; | 280 | break; |
| 281 | + case MPLS_BOS: | ||
| 282 | + @SuppressWarnings("unchecked") | ||
| 283 | + OFOxm<U8> mplsBos = (OFOxm<U8>) oxm; | ||
| 284 | + builder.setMplsBos(mplsBos.getValue() == U8.ZERO ? false : true); | ||
| 285 | + break; | ||
| 280 | case ARP_OP: | 286 | case ARP_OP: |
| 281 | case ARP_SHA: | 287 | case ARP_SHA: |
| 282 | case ARP_SPA: | 288 | case ARP_SPA: | ... | ... |
| ... | @@ -44,6 +44,7 @@ import org.projectfloodlight.openflow.types.IPv4Address; | ... | @@ -44,6 +44,7 @@ import org.projectfloodlight.openflow.types.IPv4Address; |
| 44 | import org.projectfloodlight.openflow.types.IPv6Address; | 44 | import org.projectfloodlight.openflow.types.IPv6Address; |
| 45 | import org.projectfloodlight.openflow.types.IPv6FlowLabel; | 45 | import org.projectfloodlight.openflow.types.IPv6FlowLabel; |
| 46 | import org.projectfloodlight.openflow.types.MacAddress; | 46 | import org.projectfloodlight.openflow.types.MacAddress; |
| 47 | +import org.projectfloodlight.openflow.types.OFBooleanValue; | ||
| 47 | import org.projectfloodlight.openflow.types.OFGroup; | 48 | import org.projectfloodlight.openflow.types.OFGroup; |
| 48 | import org.projectfloodlight.openflow.types.OFPort; | 49 | import org.projectfloodlight.openflow.types.OFPort; |
| 49 | import org.projectfloodlight.openflow.types.OFVlanVidMatch; | 50 | import org.projectfloodlight.openflow.types.OFVlanVidMatch; |
| ... | @@ -286,6 +287,13 @@ public final class GroupModBuilder { | ... | @@ -286,6 +287,13 @@ public final class GroupModBuilder { |
| 286 | oxm = factory.oxms().mplsLabel(U32.of(mplsLabel.label() | 287 | oxm = factory.oxms().mplsLabel(U32.of(mplsLabel.label() |
| 287 | .longValue())); | 288 | .longValue())); |
| 288 | break; | 289 | break; |
| 290 | + case MPLS_BOS: | ||
| 291 | + L2ModificationInstruction.ModMplsBosInstruction mplsBos = | ||
| 292 | + (L2ModificationInstruction.ModMplsBosInstruction) l2m; | ||
| 293 | + oxm = factory.oxms() | ||
| 294 | + .mplsBos(mplsBos.mplsBos() ? OFBooleanValue.TRUE | ||
| 295 | + : OFBooleanValue.FALSE); | ||
| 296 | + break; | ||
| 289 | case DEC_MPLS_TTL: | 297 | case DEC_MPLS_TTL: |
| 290 | return factory.actions().decMplsTtl(); | 298 | return factory.actions().decMplsTtl(); |
| 291 | default: | 299 | default: | ... | ... |
-
Please register or login to post a comment