Pavlin Radoslavov

Implement some of the missing Selector and Match Conditions

Work toward ONOS-509

The following match conditions are added/implemented:
  - IN_PHY_PORT
  - IP_DSCP
  - IP_ECN
  - METADATA

Change-Id: I6f529ee90b2b9e0d5046f83c034e8be3faf86d8b
...@@ -135,6 +135,16 @@ public final class DefaultTrafficSelector implements TrafficSelector { ...@@ -135,6 +135,16 @@ public final class DefaultTrafficSelector implements TrafficSelector {
135 } 135 }
136 136
137 @Override 137 @Override
138 + public Builder matchInPhyPort(PortNumber port) {
139 + return add(Criteria.matchInPhyPort(port));
140 + }
141 +
142 + @Override
143 + public Builder matchMetadata(Long metadata) {
144 + return add(Criteria.matchMetadata(metadata));
145 + }
146 +
147 + @Override
138 public Builder matchEthDst(MacAddress addr) { 148 public Builder matchEthDst(MacAddress addr) {
139 return add(Criteria.matchEthDst(addr)); 149 return add(Criteria.matchEthDst(addr));
140 } 150 }
...@@ -160,6 +170,16 @@ public final class DefaultTrafficSelector implements TrafficSelector { ...@@ -160,6 +170,16 @@ public final class DefaultTrafficSelector implements TrafficSelector {
160 } 170 }
161 171
162 @Override 172 @Override
173 + public Builder matchIPDscp(Byte ipDscp) {
174 + return add(Criteria.matchIPDscp(ipDscp));
175 + }
176 +
177 + @Override
178 + public Builder matchIPEcn(Byte ipEcn) {
179 + return add(Criteria.matchIPEcn(ipEcn));
180 + }
181 +
182 + @Override
163 public Builder matchIPProtocol(Byte proto) { 183 public Builder matchIPProtocol(Byte proto) {
164 return add(Criteria.matchIPProtocol(proto)); 184 return add(Criteria.matchIPProtocol(proto));
165 } 185 }
...@@ -273,7 +293,5 @@ public final class DefaultTrafficSelector implements TrafficSelector { ...@@ -273,7 +293,5 @@ public final class DefaultTrafficSelector implements TrafficSelector {
273 public TrafficSelector build() { 293 public TrafficSelector build() {
274 return new DefaultTrafficSelector(ImmutableSet.copyOf(selector.values())); 294 return new DefaultTrafficSelector(ImmutableSet.copyOf(selector.values()));
275 } 295 }
276 -
277 } 296 }
278 -
279 } 297 }
......
...@@ -68,6 +68,22 @@ public interface TrafficSelector { ...@@ -68,6 +68,22 @@ public interface TrafficSelector {
68 public Builder matchInPort(PortNumber port); 68 public Builder matchInPort(PortNumber port);
69 69
70 /** 70 /**
71 + * Matches a physical inport.
72 + *
73 + * @param port the physical inport
74 + * @return a selection builder
75 + */
76 + public Builder matchInPhyPort(PortNumber port);
77 +
78 + /**
79 + * Matches a metadata.
80 + *
81 + * @param metadata the metadata
82 + * @return a selection builder
83 + */
84 + public Builder matchMetadata(Long metadata);
85 +
86 + /**
71 * Matches a l2 dst address. 87 * Matches a l2 dst address.
72 * 88 *
73 * @param addr a l2 address 89 * @param addr a l2 address
...@@ -108,6 +124,22 @@ public interface TrafficSelector { ...@@ -108,6 +124,22 @@ public interface TrafficSelector {
108 public Builder matchVlanPcp(Byte vlanPcp); 124 public Builder matchVlanPcp(Byte vlanPcp);
109 125
110 /** 126 /**
127 + * Matches an IP DSCP (6 bits in ToS field).
128 + *
129 + * @param ipDscp an IP DSCP value
130 + * @return a selection builder
131 + */
132 + public Builder matchIPDscp(Byte ipDscp);
133 +
134 + /**
135 + * Matches an IP ECN (2 bits in ToS field).
136 + *
137 + * @param ipEcn an IP ECN value
138 + * @return a selection builder
139 + */
140 + public Builder matchIPEcn(Byte ipEcn);
141 +
142 + /**
111 * Matches the l3 protocol. 143 * Matches the l3 protocol.
112 * 144 *
113 * @param proto a l3 protocol 145 * @param proto a l3 protocol
......
...@@ -43,7 +43,27 @@ public final class Criteria { ...@@ -43,7 +43,27 @@ public final class Criteria {
43 * @return match criterion 43 * @return match criterion
44 */ 44 */
45 public static Criterion matchInPort(PortNumber port) { 45 public static Criterion matchInPort(PortNumber port) {
46 - return new PortCriterion(port); 46 + return new PortCriterion(port, Type.IN_PORT);
47 + }
48 +
49 + /**
50 + * Creates a match on IN_PHY_PORT field using the specified value.
51 + *
52 + * @param port inport value
53 + * @return match criterion
54 + */
55 + public static Criterion matchInPhyPort(PortNumber port) {
56 + return new PortCriterion(port, Type.IN_PHY_PORT);
57 + }
58 +
59 + /**
60 + * Creates a match on METADATA field using the specified value.
61 + *
62 + * @param metadata metadata value
63 + * @return match criterion
64 + */
65 + public static Criterion matchMetadata(Long metadata) {
66 + return new MetadataCriterion(metadata);
47 } 67 }
48 68
49 /** 69 /**
...@@ -99,6 +119,26 @@ public final class Criteria { ...@@ -99,6 +119,26 @@ public final class Criteria {
99 } 119 }
100 120
101 /** 121 /**
122 + * Creates a match on IP DSCP field using the specified value.
123 + *
124 + * @param ipDscp ip dscp value
125 + * @return match criterion
126 + */
127 + public static Criterion matchIPDscp(Byte ipDscp) {
128 + return new IPDscpCriterion(ipDscp);
129 + }
130 +
131 + /**
132 + * Creates a match on IP ECN field using the specified value.
133 + *
134 + * @param ipEcn ip ecn value
135 + * @return match criterion
136 + */
137 + public static Criterion matchIPEcn(Byte ipEcn) {
138 + return new IPEcnCriterion(ipEcn);
139 + }
140 +
141 + /**
102 * Creates a match on IP proto field using the specified value. 142 * Creates a match on IP proto field using the specified value.
103 * 143 *
104 * @param proto ip protocol value 144 * @param proto ip protocol value
...@@ -327,19 +367,23 @@ public final class Criteria { ...@@ -327,19 +367,23 @@ public final class Criteria {
327 */ 367 */
328 public static final class PortCriterion implements Criterion { 368 public static final class PortCriterion implements Criterion {
329 private final PortNumber port; 369 private final PortNumber port;
370 + private final Type type;
330 371
331 /** 372 /**
332 * Constructor. 373 * Constructor.
333 * 374 *
334 * @param port the input port number to match 375 * @param port the input port number to match
376 + * @param type the match type. Should be either Type.IN_PORT or
377 + * Type.IN_PHY_PORT
335 */ 378 */
336 - public PortCriterion(PortNumber port) { 379 + public PortCriterion(PortNumber port, Type type) {
337 this.port = port; 380 this.port = port;
381 + this.type = type;
338 } 382 }
339 383
340 @Override 384 @Override
341 public Type type() { 385 public Type type() {
342 - return Type.IN_PORT; 386 + return this.type;
343 } 387 }
344 388
345 /** 389 /**
...@@ -371,7 +415,61 @@ public final class Criteria { ...@@ -371,7 +415,61 @@ public final class Criteria {
371 PortCriterion that = (PortCriterion) obj; 415 PortCriterion that = (PortCriterion) obj;
372 return Objects.equals(port, that.port) && 416 return Objects.equals(port, that.port) &&
373 Objects.equals(this.type(), that.type()); 417 Objects.equals(this.type(), that.type());
418 + }
419 + return false;
420 + }
421 + }
374 422
423 + /**
424 + * Implementation of Metadata criterion.
425 + */
426 + public static final class MetadataCriterion implements Criterion {
427 + private final Long metadata;
428 +
429 + /**
430 + * Constructor.
431 + *
432 + * @param metadata the metadata to match
433 + */
434 + public MetadataCriterion(Long metadata) {
435 + this.metadata = metadata;
436 + }
437 +
438 + @Override
439 + public Type type() {
440 + return Type.METADATA;
441 + }
442 +
443 + /**
444 + * Gets the metadata to match.
445 + *
446 + * @return the metadata to match
447 + */
448 + public Long metadata() {
449 + return metadata;
450 + }
451 +
452 + @Override
453 + public String toString() {
454 + return toStringHelper(type().toString())
455 + .add("metadata", Long.toHexString(metadata))
456 + .toString();
457 + }
458 +
459 + @Override
460 + public int hashCode() {
461 + return Objects.hash(type(), metadata);
462 + }
463 +
464 + @Override
465 + public boolean equals(Object obj) {
466 + if (this == obj) {
467 + return true;
468 + }
469 + if (obj instanceof MetadataCriterion) {
470 + MetadataCriterion that = (MetadataCriterion) obj;
471 + return Objects.equals(metadata, that.metadata) &&
472 + Objects.equals(this.type(), that.type());
375 } 473 }
376 return false; 474 return false;
377 } 475 }
...@@ -601,6 +699,118 @@ public final class Criteria { ...@@ -601,6 +699,118 @@ public final class Criteria {
601 } 699 }
602 700
603 /** 701 /**
702 + * Implementation of IP DSCP criterion (6-bit Differentiated Services
703 + * Code Point).
704 + */
705 + public static final class IPDscpCriterion implements Criterion {
706 + private static final byte DSCP_MASK = 0x3f;
707 + private final Byte ipDscp; // IP DSCP value: 6 bits
708 +
709 + /**
710 + * Constructor.
711 + *
712 + * @param ipDscp the IP DSCP value to match
713 + */
714 + public IPDscpCriterion(Byte ipDscp) {
715 + this.ipDscp = (byte) (ipDscp & DSCP_MASK);
716 + }
717 +
718 + @Override
719 + public Type type() {
720 + return Type.IP_DSCP;
721 + }
722 +
723 + /**
724 + * Gets the IP DSCP value to match.
725 + *
726 + * @return the IP DSCP value to match
727 + */
728 + public Byte ipDscp() {
729 + return ipDscp;
730 + }
731 +
732 + @Override
733 + public String toString() {
734 + return toStringHelper(type().toString())
735 + .add("ipDscp", ipDscp).toString();
736 + }
737 +
738 + @Override
739 + public int hashCode() {
740 + return Objects.hash(type(), ipDscp);
741 + }
742 +
743 + @Override
744 + public boolean equals(Object obj) {
745 + if (this == obj) {
746 + return true;
747 + }
748 + if (obj instanceof IPDscpCriterion) {
749 + IPDscpCriterion that = (IPDscpCriterion) obj;
750 + return Objects.equals(ipDscp, that.ipDscp) &&
751 + Objects.equals(this.type(), that.type());
752 + }
753 + return false;
754 + }
755 + }
756 +
757 + /**
758 + * Implementation of IP ECN criterion (3-bit Explicit Congestion
759 + * Notification).
760 + */
761 + public static final class IPEcnCriterion implements Criterion {
762 + private static final byte ECN_MASK = 0x3;
763 + private final Byte ipEcn; // IP ECN value: 3 bits
764 +
765 + /**
766 + * Constructor.
767 + *
768 + * @param ipEcn the IP ECN value to match
769 + */
770 + public IPEcnCriterion(Byte ipEcn) {
771 + this.ipEcn = (byte) (ipEcn & ECN_MASK);
772 + }
773 +
774 + @Override
775 + public Type type() {
776 + return Type.IP_ECN;
777 + }
778 +
779 + /**
780 + * Gets the IP ECN value to match.
781 + *
782 + * @return the IP ECN value to match
783 + */
784 + public Byte ipEcn() {
785 + return ipEcn;
786 + }
787 +
788 + @Override
789 + public String toString() {
790 + return toStringHelper(type().toString())
791 + .add("ipEcn", ipEcn).toString();
792 + }
793 +
794 + @Override
795 + public int hashCode() {
796 + return Objects.hash(type(), ipEcn);
797 + }
798 +
799 + @Override
800 + public boolean equals(Object obj) {
801 + if (this == obj) {
802 + return true;
803 + }
804 + if (obj instanceof IPEcnCriterion) {
805 + IPEcnCriterion that = (IPEcnCriterion) obj;
806 + return Objects.equals(ipEcn, that.ipEcn) &&
807 + Objects.equals(this.type(), that.type());
808 + }
809 + return false;
810 + }
811 + }
812 +
813 + /**
604 * Implementation of Internet Protocol Number criterion. 814 * Implementation of Internet Protocol Number criterion.
605 */ 815 */
606 public static final class IPProtocolCriterion implements Criterion { 816 public static final class IPProtocolCriterion implements Criterion {
......
...@@ -127,9 +127,12 @@ public class DefaultTrafficSelectorTest { ...@@ -127,9 +127,12 @@ public class DefaultTrafficSelectorTest {
127 public void testCriteriaCreation() { 127 public void testCriteriaCreation() {
128 TrafficSelector selector; 128 TrafficSelector selector;
129 129
130 + final long longValue = 0x12345678;
130 final int intValue = 22; 131 final int intValue = 22;
131 final short shortValue = 33; 132 final short shortValue = 33;
132 final byte byteValue = 44; 133 final byte byteValue = 44;
134 + final byte dscpValue = 0xf;
135 + final byte ecnValue = 3;
133 final MacAddress macValue = MacAddress.valueOf("11:22:33:44:55:66"); 136 final MacAddress macValue = MacAddress.valueOf("11:22:33:44:55:66");
134 final IpPrefix ipPrefixValue = IpPrefix.valueOf("192.168.1.0/24"); 137 final IpPrefix ipPrefixValue = IpPrefix.valueOf("192.168.1.0/24");
135 final IpPrefix ipv6PrefixValue = IpPrefix.valueOf("fe80::1/64"); 138 final IpPrefix ipv6PrefixValue = IpPrefix.valueOf("fe80::1/64");
...@@ -140,6 +143,14 @@ public class DefaultTrafficSelectorTest { ...@@ -140,6 +143,14 @@ public class DefaultTrafficSelectorTest {
140 assertThat(selector, hasCriterionWithType(Type.IN_PORT)); 143 assertThat(selector, hasCriterionWithType(Type.IN_PORT));
141 144
142 selector = DefaultTrafficSelector.builder() 145 selector = DefaultTrafficSelector.builder()
146 + .matchInPhyPort(PortNumber.portNumber(11)).build();
147 + assertThat(selector, hasCriterionWithType(Type.IN_PHY_PORT));
148 +
149 + selector = DefaultTrafficSelector.builder()
150 + .matchMetadata(longValue).build();
151 + assertThat(selector, hasCriterionWithType(Type.METADATA));
152 +
153 + selector = DefaultTrafficSelector.builder()
143 .matchEthDst(macValue).build(); 154 .matchEthDst(macValue).build();
144 assertThat(selector, hasCriterionWithType(Type.ETH_DST)); 155 assertThat(selector, hasCriterionWithType(Type.ETH_DST));
145 156
...@@ -160,6 +171,14 @@ public class DefaultTrafficSelectorTest { ...@@ -160,6 +171,14 @@ public class DefaultTrafficSelectorTest {
160 assertThat(selector, hasCriterionWithType(Type.VLAN_PCP)); 171 assertThat(selector, hasCriterionWithType(Type.VLAN_PCP));
161 172
162 selector = DefaultTrafficSelector.builder() 173 selector = DefaultTrafficSelector.builder()
174 + .matchIPDscp(dscpValue).build();
175 + assertThat(selector, hasCriterionWithType(Type.IP_DSCP));
176 +
177 + selector = DefaultTrafficSelector.builder()
178 + .matchIPEcn(ecnValue).build();
179 + assertThat(selector, hasCriterionWithType(Type.IP_ECN));
180 +
181 + selector = DefaultTrafficSelector.builder()
163 .matchIPProtocol(byteValue).build(); 182 .matchIPProtocol(byteValue).build();
164 assertThat(selector, hasCriterionWithType(Type.IP_PROTO)); 183 assertThat(selector, hasCriterionWithType(Type.IP_PROTO));
165 184
......
...@@ -45,6 +45,16 @@ public class CriteriaTest { ...@@ -45,6 +45,16 @@ public class CriteriaTest {
45 Criterion sameAsMatchInPort1 = Criteria.matchInPort(port1); 45 Criterion sameAsMatchInPort1 = Criteria.matchInPort(port1);
46 Criterion matchInPort2 = Criteria.matchInPort(port2); 46 Criterion matchInPort2 = Criteria.matchInPort(port2);
47 47
48 + Criterion matchInPhyPort1 = Criteria.matchInPhyPort(port1);
49 + Criterion sameAsMatchInPhyPort1 = Criteria.matchInPhyPort(port1);
50 + Criterion matchInPhyPort2 = Criteria.matchInPhyPort(port2);
51 +
52 + long metadata1 = 1;
53 + long metadata2 = 2;
54 + Criterion matchMetadata1 = Criteria.matchMetadata(metadata1);
55 + Criterion sameAsMatchMetadata1 = Criteria.matchMetadata(metadata1);
56 + Criterion matchMetadata2 = Criteria.matchMetadata(metadata2);
57 +
48 private static final String MAC1 = "00:00:00:00:00:01"; 58 private static final String MAC1 = "00:00:00:00:00:01";
49 private static final String MAC2 = "00:00:00:00:00:02"; 59 private static final String MAC2 = "00:00:00:00:00:02";
50 private MacAddress mac1 = MacAddress.valueOf(MAC1); 60 private MacAddress mac1 = MacAddress.valueOf(MAC1);
...@@ -73,6 +83,18 @@ public class CriteriaTest { ...@@ -73,6 +83,18 @@ public class CriteriaTest {
73 Criterion sameAsMatchVlanPcp1 = Criteria.matchVlanPcp(vlanPcp1); 83 Criterion sameAsMatchVlanPcp1 = Criteria.matchVlanPcp(vlanPcp1);
74 Criterion matchVlanPcp2 = Criteria.matchVlanPcp(vlanPcp2); 84 Criterion matchVlanPcp2 = Criteria.matchVlanPcp(vlanPcp2);
75 85
86 + byte ipDscp1 = 1;
87 + byte ipDscp2 = 2;
88 + Criterion matchIpDscp1 = Criteria.matchIPDscp(ipDscp1);
89 + Criterion sameAsMatchIpDscp1 = Criteria.matchIPDscp(ipDscp1);
90 + Criterion matchIpDscp2 = Criteria.matchIPDscp(ipDscp2);
91 +
92 + byte ipEcn1 = 1;
93 + byte ipEcn2 = 2;
94 + Criterion matchIpEcn1 = Criteria.matchIPEcn(ipEcn1);
95 + Criterion sameAsMatchIpEcn1 = Criteria.matchIPEcn(ipEcn1);
96 + Criterion matchIpEcn2 = Criteria.matchIPEcn(ipEcn2);
97 +
76 byte protocol1 = 1; 98 byte protocol1 = 1;
77 byte protocol2 = 2; 99 byte protocol2 = 2;
78 Criterion matchIpProtocol1 = Criteria.matchIPProtocol(protocol1); 100 Criterion matchIpProtocol1 = Criteria.matchIPProtocol(protocol1);
...@@ -214,10 +236,13 @@ public class CriteriaTest { ...@@ -214,10 +236,13 @@ public class CriteriaTest {
214 @Test 236 @Test
215 public void testCriteriaImmutability() { 237 public void testCriteriaImmutability() {
216 assertThatClassIsImmutable(Criteria.PortCriterion.class); 238 assertThatClassIsImmutable(Criteria.PortCriterion.class);
239 + assertThatClassIsImmutable(Criteria.MetadataCriterion.class);
217 assertThatClassIsImmutable(Criteria.EthCriterion.class); 240 assertThatClassIsImmutable(Criteria.EthCriterion.class);
218 assertThatClassIsImmutable(Criteria.EthTypeCriterion.class); 241 assertThatClassIsImmutable(Criteria.EthTypeCriterion.class);
219 assertThatClassIsImmutable(Criteria.VlanIdCriterion.class); 242 assertThatClassIsImmutable(Criteria.VlanIdCriterion.class);
220 assertThatClassIsImmutable(Criteria.VlanPcpCriterion.class); 243 assertThatClassIsImmutable(Criteria.VlanPcpCriterion.class);
244 + assertThatClassIsImmutable(Criteria.IPDscpCriterion.class);
245 + assertThatClassIsImmutable(Criteria.IPEcnCriterion.class);
221 assertThatClassIsImmutable(Criteria.IPProtocolCriterion.class); 246 assertThatClassIsImmutable(Criteria.IPProtocolCriterion.class);
222 assertThatClassIsImmutable(Criteria.IPCriterion.class); 247 assertThatClassIsImmutable(Criteria.IPCriterion.class);
223 assertThatClassIsImmutable(Criteria.TcpPortCriterion.class); 248 assertThatClassIsImmutable(Criteria.TcpPortCriterion.class);
...@@ -252,6 +277,20 @@ public class CriteriaTest { ...@@ -252,6 +277,20 @@ public class CriteriaTest {
252 } 277 }
253 278
254 /** 279 /**
280 + * Test the matchInPhyPort method.
281 + */
282 + @Test
283 + public void testMatchInPhyPortMethod() {
284 + PortNumber p1 = portNumber(1);
285 + Criterion matchInPhyPort = Criteria.matchInPhyPort(p1);
286 + Criteria.PortCriterion portCriterion =
287 + checkAndConvert(matchInPhyPort,
288 + Criterion.Type.IN_PHY_PORT,
289 + Criteria.PortCriterion.class);
290 + assertThat(portCriterion.port(), is(equalTo(p1)));
291 + }
292 +
293 + /**
255 * Test the equals() method of the PortCriterion class. 294 * Test the equals() method of the PortCriterion class.
256 */ 295 */
257 @Test 296 @Test
...@@ -260,6 +299,38 @@ public class CriteriaTest { ...@@ -260,6 +299,38 @@ public class CriteriaTest {
260 .addEqualityGroup(matchInPort1, sameAsMatchInPort1) 299 .addEqualityGroup(matchInPort1, sameAsMatchInPort1)
261 .addEqualityGroup(matchInPort2) 300 .addEqualityGroup(matchInPort2)
262 .testEquals(); 301 .testEquals();
302 +
303 + new EqualsTester()
304 + .addEqualityGroup(matchInPhyPort1, sameAsMatchInPhyPort1)
305 + .addEqualityGroup(matchInPhyPort2)
306 + .testEquals();
307 + }
308 +
309 + // MetadataCriterion class
310 +
311 + /**
312 + * Test the matchMetadata method.
313 + */
314 + @Test
315 + public void testMatchMetadataMethod() {
316 + Long metadata = 12L;
317 + Criterion matchMetadata = Criteria.matchMetadata(metadata);
318 + Criteria.MetadataCriterion metadataCriterion =
319 + checkAndConvert(matchMetadata,
320 + Criterion.Type.METADATA,
321 + Criteria.MetadataCriterion.class);
322 + assertThat(metadataCriterion.metadata(), is(equalTo(metadata)));
323 + }
324 +
325 + /**
326 + * Test the equals() method of the MetadataCriterion class.
327 + */
328 + @Test
329 + public void testMetadataCriterionEquals() {
330 + new EqualsTester()
331 + .addEqualityGroup(matchMetadata1, sameAsMatchMetadata1)
332 + .addEqualityGroup(matchMetadata2)
333 + .testEquals();
263 } 334 }
264 335
265 // EthCriterion class 336 // EthCriterion class
...@@ -380,6 +451,58 @@ public class CriteriaTest { ...@@ -380,6 +451,58 @@ public class CriteriaTest {
380 .testEquals(); 451 .testEquals();
381 } 452 }
382 453
454 + // IPDscpCriterion class
455 +
456 + /**
457 + * Test the matchIPDscp method.
458 + */
459 + @Test
460 + public void testMatchIPDscpMethod() {
461 + Criterion matchIPDscp = Criteria.matchIPDscp(ipDscp1);
462 + Criteria.IPDscpCriterion ipDscpCriterion =
463 + checkAndConvert(matchIPDscp,
464 + Criterion.Type.IP_DSCP,
465 + Criteria.IPDscpCriterion.class);
466 + assertThat(ipDscpCriterion.ipDscp(), is(equalTo(ipDscp1)));
467 + }
468 +
469 + /**
470 + * Test the equals() method of the IPDscpCriterion class.
471 + */
472 + @Test
473 + public void testIPDscpCriterionEquals() {
474 + new EqualsTester()
475 + .addEqualityGroup(matchIpDscp1, sameAsMatchIpDscp1)
476 + .addEqualityGroup(matchIpDscp2)
477 + .testEquals();
478 + }
479 +
480 + // IPEcnCriterion class
481 +
482 + /**
483 + * Test the matchIPEcn method.
484 + */
485 + @Test
486 + public void testMatchIPEcnMethod() {
487 + Criterion matchIPEcn = Criteria.matchIPEcn(ipEcn1);
488 + Criteria.IPEcnCriterion ipEcnCriterion =
489 + checkAndConvert(matchIPEcn,
490 + Criterion.Type.IP_ECN,
491 + Criteria.IPEcnCriterion.class);
492 + assertThat(ipEcnCriterion.ipEcn(), is(equalTo(ipEcn1)));
493 + }
494 +
495 + /**
496 + * Test the equals() method of the IPEcnCriterion class.
497 + */
498 + @Test
499 + public void testIPEcnCriterionEquals() {
500 + new EqualsTester()
501 + .addEqualityGroup(matchIpEcn1, sameAsMatchIpEcn1)
502 + .addEqualityGroup(matchIpEcn2)
503 + .testEquals();
504 + }
505 +
383 // IpProtocolCriterion class 506 // IpProtocolCriterion class
384 507
385 /** 508 /**
......
...@@ -355,6 +355,15 @@ public class FlowEntryBuilder { ...@@ -355,6 +355,15 @@ public class FlowEntryBuilder {
355 builder.matchInPort(PortNumber 355 builder.matchInPort(PortNumber
356 .portNumber(match.get(MatchField.IN_PORT).getPortNumber())); 356 .portNumber(match.get(MatchField.IN_PORT).getPortNumber()));
357 break; 357 break;
358 + case IN_PHY_PORT:
359 + builder.matchInPhyPort(PortNumber
360 + .portNumber(match.get(MatchField.IN_PHY_PORT).getPortNumber()));
361 + break;
362 + case METADATA:
363 + long metadata =
364 + match.get(MatchField.METADATA).getValue().getValue();
365 + builder.matchMetadata(metadata);
366 + break;
358 case ETH_DST: 367 case ETH_DST:
359 mac = MacAddress.valueOf(match.get(MatchField.ETH_DST).getLong()); 368 mac = MacAddress.valueOf(match.get(MatchField.ETH_DST).getLong());
360 builder.matchEthDst(mac); 369 builder.matchEthDst(mac);
...@@ -386,6 +395,14 @@ public class FlowEntryBuilder { ...@@ -386,6 +395,14 @@ public class FlowEntryBuilder {
386 byte vlanPcp = match.get(MatchField.VLAN_PCP).getValue(); 395 byte vlanPcp = match.get(MatchField.VLAN_PCP).getValue();
387 builder.matchVlanPcp(vlanPcp); 396 builder.matchVlanPcp(vlanPcp);
388 break; 397 break;
398 + case IP_DSCP:
399 + byte ipDscp = match.get(MatchField.IP_DSCP).getDscpValue();
400 + builder.matchIPDscp(ipDscp);
401 + break;
402 + case IP_ECN:
403 + byte ipEcn = match.get(MatchField.IP_ECN).getEcnValue();
404 + builder.matchIPEcn(ipEcn);
405 + break;
389 case IP_PROTO: 406 case IP_PROTO:
390 short proto = match.get(MatchField.IP_PROTO).getIpProtocolNumber(); 407 short proto = match.get(MatchField.IP_PROTO).getIpProtocolNumber();
391 builder.matchIPProtocol((byte) proto); 408 builder.matchIPProtocol((byte) proto);
...@@ -514,10 +531,6 @@ public class FlowEntryBuilder { ...@@ -514,10 +531,6 @@ public class FlowEntryBuilder {
514 case ARP_SPA: 531 case ARP_SPA:
515 case ARP_THA: 532 case ARP_THA:
516 case ARP_TPA: 533 case ARP_TPA:
517 - case IN_PHY_PORT:
518 - case IP_DSCP:
519 - case IP_ECN:
520 - case METADATA:
521 case MPLS_TC: 534 case MPLS_TC:
522 case TUNNEL_ID: 535 case TUNNEL_ID:
523 default: 536 default:
......
...@@ -30,11 +30,14 @@ import org.onosproject.net.flow.criteria.Criteria.IcmpTypeCriterion; ...@@ -30,11 +30,14 @@ import org.onosproject.net.flow.criteria.Criteria.IcmpTypeCriterion;
30 import org.onosproject.net.flow.criteria.Criteria.Icmpv6CodeCriterion; 30 import org.onosproject.net.flow.criteria.Criteria.Icmpv6CodeCriterion;
31 import org.onosproject.net.flow.criteria.Criteria.Icmpv6TypeCriterion; 31 import org.onosproject.net.flow.criteria.Criteria.Icmpv6TypeCriterion;
32 import org.onosproject.net.flow.criteria.Criteria.IPCriterion; 32 import org.onosproject.net.flow.criteria.Criteria.IPCriterion;
33 +import org.onosproject.net.flow.criteria.Criteria.IPDscpCriterion;
34 +import org.onosproject.net.flow.criteria.Criteria.IPEcnCriterion;
33 import org.onosproject.net.flow.criteria.Criteria.IPProtocolCriterion; 35 import org.onosproject.net.flow.criteria.Criteria.IPProtocolCriterion;
34 import org.onosproject.net.flow.criteria.Criteria.IPv6FlowLabelCriterion; 36 import org.onosproject.net.flow.criteria.Criteria.IPv6FlowLabelCriterion;
35 import org.onosproject.net.flow.criteria.Criteria.IPv6NDLinkLayerAddressCriterion; 37 import org.onosproject.net.flow.criteria.Criteria.IPv6NDLinkLayerAddressCriterion;
36 import org.onosproject.net.flow.criteria.Criteria.IPv6NDTargetAddressCriterion; 38 import org.onosproject.net.flow.criteria.Criteria.IPv6NDTargetAddressCriterion;
37 import org.onosproject.net.flow.criteria.Criteria.LambdaCriterion; 39 import org.onosproject.net.flow.criteria.Criteria.LambdaCriterion;
40 +import org.onosproject.net.flow.criteria.Criteria.MetadataCriterion;
38 import org.onosproject.net.flow.criteria.Criteria.PortCriterion; 41 import org.onosproject.net.flow.criteria.Criteria.PortCriterion;
39 import org.onosproject.net.flow.criteria.Criteria.SctpPortCriterion; 42 import org.onosproject.net.flow.criteria.Criteria.SctpPortCriterion;
40 import org.onosproject.net.flow.criteria.Criteria.TcpPortCriterion; 43 import org.onosproject.net.flow.criteria.Criteria.TcpPortCriterion;
...@@ -55,9 +58,12 @@ import org.projectfloodlight.openflow.types.ICMPv4Type; ...@@ -55,9 +58,12 @@ import org.projectfloodlight.openflow.types.ICMPv4Type;
55 import org.projectfloodlight.openflow.types.IPv4Address; 58 import org.projectfloodlight.openflow.types.IPv4Address;
56 import org.projectfloodlight.openflow.types.IPv6Address; 59 import org.projectfloodlight.openflow.types.IPv6Address;
57 import org.projectfloodlight.openflow.types.IPv6FlowLabel; 60 import org.projectfloodlight.openflow.types.IPv6FlowLabel;
61 +import org.projectfloodlight.openflow.types.IpDscp;
62 +import org.projectfloodlight.openflow.types.IpEcn;
58 import org.projectfloodlight.openflow.types.IpProtocol; 63 import org.projectfloodlight.openflow.types.IpProtocol;
59 import org.projectfloodlight.openflow.types.MacAddress; 64 import org.projectfloodlight.openflow.types.MacAddress;
60 import org.projectfloodlight.openflow.types.Masked; 65 import org.projectfloodlight.openflow.types.Masked;
66 +import org.projectfloodlight.openflow.types.OFMetadata;
61 import org.projectfloodlight.openflow.types.OFPort; 67 import org.projectfloodlight.openflow.types.OFPort;
62 import org.projectfloodlight.openflow.types.OFVlanVidMatch; 68 import org.projectfloodlight.openflow.types.OFVlanVidMatch;
63 import org.projectfloodlight.openflow.types.TransportPort; 69 import org.projectfloodlight.openflow.types.TransportPort;
...@@ -161,8 +167,19 @@ public abstract class FlowModBuilder { ...@@ -161,8 +167,19 @@ public abstract class FlowModBuilder {
161 for (Criterion c : selector.criteria()) { 167 for (Criterion c : selector.criteria()) {
162 switch (c.type()) { 168 switch (c.type()) {
163 case IN_PORT: 169 case IN_PORT:
164 - PortCriterion inport = (PortCriterion) c; 170 + PortCriterion inPort = (PortCriterion) c;
165 - mBuilder.setExact(MatchField.IN_PORT, OFPort.of((int) inport.port().toLong())); 171 + mBuilder.setExact(MatchField.IN_PORT,
172 + OFPort.of((int) inPort.port().toLong()));
173 + break;
174 + case IN_PHY_PORT:
175 + PortCriterion inPhyPort = (PortCriterion) c;
176 + mBuilder.setExact(MatchField.IN_PORT,
177 + OFPort.of((int) inPhyPort.port().toLong()));
178 + break;
179 + case METADATA:
180 + MetadataCriterion metadata = (MetadataCriterion) c;
181 + mBuilder.setExact(MatchField.METADATA,
182 + OFMetadata.ofRaw(metadata.metadata()));
166 break; 183 break;
167 case ETH_DST: 184 case ETH_DST:
168 ethCriterion = (EthCriterion) c; 185 ethCriterion = (EthCriterion) c;
...@@ -193,6 +210,16 @@ public abstract class FlowModBuilder { ...@@ -193,6 +210,16 @@ public abstract class FlowModBuilder {
193 VlanPcpCriterion vpcp = (VlanPcpCriterion) c; 210 VlanPcpCriterion vpcp = (VlanPcpCriterion) c;
194 mBuilder.setExact(MatchField.VLAN_PCP, VlanPcp.of(vpcp.priority())); 211 mBuilder.setExact(MatchField.VLAN_PCP, VlanPcp.of(vpcp.priority()));
195 break; 212 break;
213 + case IP_DSCP:
214 + IPDscpCriterion ipDscpCriterion = (IPDscpCriterion) c;
215 + mBuilder.setExact(MatchField.IP_DSCP,
216 + IpDscp.of(ipDscpCriterion.ipDscp()));
217 + break;
218 + case IP_ECN:
219 + IPEcnCriterion ipEcnCriterion = (IPEcnCriterion) c;
220 + mBuilder.setExact(MatchField.IP_ECN,
221 + IpEcn.of(ipEcnCriterion.ipEcn()));
222 + break;
196 case IP_PROTO: 223 case IP_PROTO:
197 IPProtocolCriterion p = (IPProtocolCriterion) c; 224 IPProtocolCriterion p = (IPProtocolCriterion) c;
198 mBuilder.setExact(MatchField.IP_PROTO, IpProtocol.of(p.protocol())); 225 mBuilder.setExact(MatchField.IP_PROTO, IpProtocol.of(p.protocol()));
...@@ -353,11 +380,7 @@ public abstract class FlowModBuilder { ...@@ -353,11 +380,7 @@ public abstract class FlowModBuilder {
353 case ARP_SPA: 380 case ARP_SPA:
354 case ARP_THA: 381 case ARP_THA:
355 case ARP_TPA: 382 case ARP_TPA:
356 - case IN_PHY_PORT:
357 case IPV6_EXTHDR: 383 case IPV6_EXTHDR:
358 - case IP_DSCP:
359 - case IP_ECN:
360 - case METADATA:
361 case MPLS_BOS: 384 case MPLS_BOS:
362 case MPLS_TC: 385 case MPLS_TC:
363 case PBB_ISID: 386 case PBB_ISID:
......
...@@ -43,10 +43,17 @@ public final class CriterionCodec extends JsonCodec<Criterion> { ...@@ -43,10 +43,17 @@ public final class CriterionCodec extends JsonCodec<Criterion> {
43 switch (criterion.type()) { 43 switch (criterion.type()) {
44 44
45 case IN_PORT: 45 case IN_PORT:
46 + case IN_PHY_PORT:
46 final Criteria.PortCriterion portCriterion = (Criteria.PortCriterion) criterion; 47 final Criteria.PortCriterion portCriterion = (Criteria.PortCriterion) criterion;
47 result.put("port", portCriterion.port().toLong()); 48 result.put("port", portCriterion.port().toLong());
48 break; 49 break;
49 50
51 + case METADATA:
52 + final Criteria.MetadataCriterion metadataCriterion =
53 + (Criteria.MetadataCriterion) criterion;
54 + result.put("metadata", metadataCriterion.metadata());
55 + break;
56 +
50 case ETH_DST: 57 case ETH_DST:
51 case ETH_SRC: 58 case ETH_SRC:
52 final Criteria.EthCriterion ethCriterion = (Criteria.EthCriterion) criterion; 59 final Criteria.EthCriterion ethCriterion = (Criteria.EthCriterion) criterion;
...@@ -71,6 +78,18 @@ public final class CriterionCodec extends JsonCodec<Criterion> { ...@@ -71,6 +78,18 @@ public final class CriterionCodec extends JsonCodec<Criterion> {
71 result.put("priority", vlanPcpCriterion.priority()); 78 result.put("priority", vlanPcpCriterion.priority());
72 break; 79 break;
73 80
81 + case IP_DSCP:
82 + final Criteria.IPDscpCriterion ipDscpCriterion =
83 + (Criteria.IPDscpCriterion) criterion;
84 + result.put("ipDscp", ipDscpCriterion.ipDscp());
85 + break;
86 +
87 + case IP_ECN:
88 + final Criteria.IPEcnCriterion ipEcnCriterion =
89 + (Criteria.IPEcnCriterion) criterion;
90 + result.put("ipEcn", ipEcnCriterion.ipEcn());
91 + break;
92 +
74 case IP_PROTO: 93 case IP_PROTO:
75 final Criteria.IPProtocolCriterion iPProtocolCriterion = 94 final Criteria.IPProtocolCriterion iPProtocolCriterion =
76 (Criteria.IPProtocolCriterion) criterion; 95 (Criteria.IPProtocolCriterion) criterion;
......
...@@ -35,7 +35,8 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo ...@@ -35,7 +35,8 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo
35 35
36 // CHECKSTYLE IGNORE MethodLength FOR NEXT 300 LINES 36 // CHECKSTYLE IGNORE MethodLength FOR NEXT 300 LINES
37 @Override 37 @Override
38 - public boolean matchesSafely(JsonNode jsonCriterion, Description description) { 38 + public boolean matchesSafely(JsonNode jsonCriterion,
39 + Description description) {
39 final String type = criterion.type().name(); 40 final String type = criterion.type().name();
40 final String jsonType = jsonCriterion.get("type").asText(); 41 final String jsonType = jsonCriterion.get("type").asText();
41 if (!type.equals(jsonType)) { 42 if (!type.equals(jsonType)) {
...@@ -46,7 +47,9 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo ...@@ -46,7 +47,9 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo
46 switch (criterion.type()) { 47 switch (criterion.type()) {
47 48
48 case IN_PORT: 49 case IN_PORT:
49 - final Criteria.PortCriterion portCriterion = (Criteria.PortCriterion) criterion; 50 + case IN_PHY_PORT:
51 + final Criteria.PortCriterion portCriterion =
52 + (Criteria.PortCriterion) criterion;
50 final long port = portCriterion.port().toLong(); 53 final long port = portCriterion.port().toLong();
51 final long jsonPort = jsonCriterion.get("port").asLong(); 54 final long jsonPort = jsonCriterion.get("port").asLong();
52 if (port != jsonPort) { 55 if (port != jsonPort) {
...@@ -55,9 +58,21 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo ...@@ -55,9 +58,21 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo
55 } 58 }
56 break; 59 break;
57 60
61 + case METADATA:
62 + final Criteria.MetadataCriterion metadataCriterion =
63 + (Criteria.MetadataCriterion) criterion;
64 + final long metadata = metadataCriterion.metadata();
65 + final long jsonMetadata = jsonCriterion.get("metadata").asLong();
66 + if (metadata != jsonMetadata) {
67 + description.appendText("metadata was " + Long.toString(jsonMetadata));
68 + return false;
69 + }
70 + break;
71 +
58 case ETH_DST: 72 case ETH_DST:
59 case ETH_SRC: 73 case ETH_SRC:
60 - final Criteria.EthCriterion ethCriterion = (Criteria.EthCriterion) criterion; 74 + final Criteria.EthCriterion ethCriterion =
75 + (Criteria.EthCriterion) criterion;
61 final String mac = ethCriterion.mac().toString(); 76 final String mac = ethCriterion.mac().toString();
62 final String jsonMac = jsonCriterion.get("mac").textValue(); 77 final String jsonMac = jsonCriterion.get("mac").textValue();
63 if (!mac.equals(jsonMac)) { 78 if (!mac.equals(jsonMac)) {
...@@ -99,6 +114,28 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo ...@@ -99,6 +114,28 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo
99 } 114 }
100 break; 115 break;
101 116
117 + case IP_DSCP:
118 + final Criteria.IPDscpCriterion ipDscpCriterion =
119 + (Criteria.IPDscpCriterion) criterion;
120 + final byte ipDscp = ipDscpCriterion.ipDscp();
121 + final byte jsonIpDscp = (byte) jsonCriterion.get("ipDscp").shortValue();
122 + if (ipDscp != jsonIpDscp) {
123 + description.appendText("IP DSCP was " + Byte.toString(jsonIpDscp));
124 + return false;
125 + }
126 + break;
127 +
128 + case IP_ECN:
129 + final Criteria.IPEcnCriterion ipEcnCriterion =
130 + (Criteria.IPEcnCriterion) criterion;
131 + final byte ipEcn = ipEcnCriterion.ipEcn();
132 + final byte jsonIpEcn = (byte) jsonCriterion.get("ipEcn").shortValue();
133 + if (ipEcn != jsonIpEcn) {
134 + description.appendText("IP ECN was " + Byte.toString(jsonIpEcn));
135 + return false;
136 + }
137 + break;
138 +
102 case IP_PROTO: 139 case IP_PROTO:
103 final Criteria.IPProtocolCriterion iPProtocolCriterion = 140 final Criteria.IPProtocolCriterion iPProtocolCriterion =
104 (Criteria.IPProtocolCriterion) criterion; 141 (Criteria.IPProtocolCriterion) criterion;
...@@ -114,7 +151,8 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo ...@@ -114,7 +151,8 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo
114 case IPV4_DST: 151 case IPV4_DST:
115 case IPV6_SRC: 152 case IPV6_SRC:
116 case IPV6_DST: 153 case IPV6_DST:
117 - final Criteria.IPCriterion ipCriterion = (Criteria.IPCriterion) criterion; 154 + final Criteria.IPCriterion ipCriterion =
155 + (Criteria.IPCriterion) criterion;
118 final String ip = ipCriterion.ip().toString(); 156 final String ip = ipCriterion.ip().toString();
119 final String jsonIp = jsonCriterion.get("ip").textValue(); 157 final String jsonIp = jsonCriterion.get("ip").textValue();
120 if (!ip.equals(jsonIp)) { 158 if (!ip.equals(jsonIp)) {
...@@ -217,7 +255,7 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo ...@@ -217,7 +255,7 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo
217 case IPV6_ND_TARGET: 255 case IPV6_ND_TARGET:
218 final Criteria.IPv6NDTargetAddressCriterion 256 final Criteria.IPv6NDTargetAddressCriterion
219 ipv6NDTargetAddressCriterion = 257 ipv6NDTargetAddressCriterion =
220 - (Criteria.IPv6NDTargetAddressCriterion) criterion; 258 + (Criteria.IPv6NDTargetAddressCriterion) criterion;
221 final String targetAddress = 259 final String targetAddress =
222 ipv6NDTargetAddressCriterion.targetAddress().toString(); 260 ipv6NDTargetAddressCriterion.targetAddress().toString();
223 final String jsonTargetAddress = 261 final String jsonTargetAddress =
...@@ -233,7 +271,7 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo ...@@ -233,7 +271,7 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo
233 case IPV6_ND_TLL: 271 case IPV6_ND_TLL:
234 final Criteria.IPv6NDLinkLayerAddressCriterion 272 final Criteria.IPv6NDLinkLayerAddressCriterion
235 ipv6NDLinkLayerAddressCriterion = 273 ipv6NDLinkLayerAddressCriterion =
236 - (Criteria.IPv6NDLinkLayerAddressCriterion) criterion; 274 + (Criteria.IPv6NDLinkLayerAddressCriterion) criterion;
237 final String llAddress = 275 final String llAddress =
238 ipv6NDLinkLayerAddressCriterion.mac().toString(); 276 ipv6NDLinkLayerAddressCriterion.mac().toString();
239 final String jsonLlAddress = 277 final String jsonLlAddress =
......