Kunihiro Ishiguro
Committed by Pavlin Radoslavov

ONOS-635 Adding ICMPv6 type and code builder for HostMonitor.

aovid duplicate call of toString.

Apply changes to FlowEntryBuilder and FlowModBuilder as well.
Fix missing break; issue.

Change-Id: I1a2e59ca943bbcc9677b9fc0cb9eb2f7cb3d7aa3
...@@ -194,6 +194,16 @@ public final class DefaultTrafficSelector implements TrafficSelector { ...@@ -194,6 +194,16 @@ public final class DefaultTrafficSelector implements TrafficSelector {
194 } 194 }
195 195
196 @Override 196 @Override
197 + public Builder matchIcmpv6Type(Byte icmpv6Type) {
198 + return add(Criteria.matchIcmpv6Type(icmpv6Type));
199 + }
200 +
201 + @Override
202 + public Builder matchIcmpv6Code(Byte icmpv6Code) {
203 + return add(Criteria.matchIcmpv6Code(icmpv6Code));
204 + }
205 +
206 + @Override
197 public Builder matchMplsLabel(Integer mplsLabel) { 207 public Builder matchMplsLabel(Integer mplsLabel) {
198 return add(Criteria.matchMplsLabel(mplsLabel)); 208 return add(Criteria.matchMplsLabel(mplsLabel));
199 } 209 }
......
...@@ -163,6 +163,22 @@ public interface TrafficSelector { ...@@ -163,6 +163,22 @@ public interface TrafficSelector {
163 public Builder matchIPv6Dst(IpPrefix ip); 163 public Builder matchIPv6Dst(IpPrefix ip);
164 164
165 /** 165 /**
166 + * Matches a ICMPv6 type.
167 + *
168 + * @param icmpv6Type a ICMPv6 type
169 + * @return a selection builder
170 + */
171 + public Builder matchIcmpv6Type(Byte icmpv6Type);
172 +
173 + /**
174 + * Matches a ICMPv6 code.
175 + *
176 + * @param icmpv6Code a ICMPv6 code
177 + * @return a selection builder
178 + */
179 + public Builder matchIcmpv6Code(Byte icmpv6Code);
180 +
181 + /**
166 * Matches on a MPLS label . 182 * Matches on a MPLS label .
167 * @param mplsLabel a MPLS label. 183 * @param mplsLabel a MPLS label.
168 * @return a selection builder 184 * @return a selection builder
......
...@@ -167,6 +167,26 @@ public final class Criteria { ...@@ -167,6 +167,26 @@ public final class Criteria {
167 return new IPCriterion(ip, Type.IPV6_DST); 167 return new IPCriterion(ip, Type.IPV6_DST);
168 } 168 }
169 169
170 + /*
171 + * Creates a match on ICMPv6 type field using the specified value.
172 + *
173 + * @param icmpv6Type ICMPv6 type
174 + * @return match criterion
175 + */
176 + public static Criterion matchIcmpv6Type(Byte icmpv6Type) {
177 + return new Icmpv6TypeCriterion(icmpv6Type);
178 + }
179 +
180 + /**
181 + * Creates a match on ICMPv6 code field using the specified value.
182 + *
183 + * @param icmpv6Code ICMPv6 code
184 + * @return match criterion
185 + */
186 + public static Criterion matchIcmpv6Code(Byte icmpv6Code) {
187 + return new Icmpv6CodeCriterion(icmpv6Code);
188 + }
189 +
170 /** 190 /**
171 * Creates a match on MPLS label. 191 * Creates a match on MPLS label.
172 * @param mplsLabel MPLS label 192 * @param mplsLabel MPLS label
...@@ -588,6 +608,96 @@ public final class Criteria { ...@@ -588,6 +608,96 @@ public final class Criteria {
588 } 608 }
589 609
590 /** 610 /**
611 + * Implementation of ICMPv6 type criterion.
612 + */
613 + public static final class Icmpv6TypeCriterion implements Criterion {
614 +
615 + private final Byte icmpv6Type;
616 +
617 + public Icmpv6TypeCriterion(Byte icmpv6Type) {
618 + this.icmpv6Type = icmpv6Type;
619 + }
620 +
621 + @Override
622 + public Type type() {
623 + return Type.ICMPV6_TYPE;
624 + }
625 +
626 + public Byte icmpv6Type() {
627 + return icmpv6Type;
628 + }
629 +
630 + @Override
631 + public String toString() {
632 + return toStringHelper(type().toString())
633 + .add("icmpv6Type", icmpv6Type & 0xff).toString();
634 + }
635 +
636 + @Override
637 + public int hashCode() {
638 + return Objects.hash(icmpv6Type, type());
639 + }
640 +
641 + @Override
642 + public boolean equals(Object obj) {
643 + if (this == obj) {
644 + return true;
645 + }
646 + if (obj instanceof Icmpv6TypeCriterion) {
647 + Icmpv6TypeCriterion that = (Icmpv6TypeCriterion) obj;
648 + return Objects.equals(icmpv6Type, that.icmpv6Type) &&
649 + Objects.equals(this.type(), that.type());
650 + }
651 + return false;
652 + }
653 + }
654 +
655 + /**
656 + * Implementation of ICMPv6 code criterion.
657 + */
658 + public static final class Icmpv6CodeCriterion implements Criterion {
659 +
660 + private final Byte icmpv6Code;
661 +
662 + public Icmpv6CodeCriterion(Byte icmpv6Code) {
663 + this.icmpv6Code = icmpv6Code;
664 + }
665 +
666 + @Override
667 + public Type type() {
668 + return Type.ICMPV6_CODE;
669 + }
670 +
671 + public Byte icmpv6Code() {
672 + return icmpv6Code;
673 + }
674 +
675 + @Override
676 + public String toString() {
677 + return toStringHelper(type().toString())
678 + .add("icmpv6Code", icmpv6Code & 0xff).toString();
679 + }
680 +
681 + @Override
682 + public int hashCode() {
683 + return Objects.hash(icmpv6Code, type());
684 + }
685 +
686 + @Override
687 + public boolean equals(Object obj) {
688 + if (this == obj) {
689 + return true;
690 + }
691 + if (obj instanceof Icmpv6CodeCriterion) {
692 + Icmpv6CodeCriterion that = (Icmpv6CodeCriterion) obj;
693 + return Objects.equals(icmpv6Code, that.icmpv6Code) &&
694 + Objects.equals(this.type(), that.type());
695 + }
696 + return false;
697 + }
698 + }
699 +
700 + /**
591 * Implementation of MPLS tag criterion. 701 * Implementation of MPLS tag criterion.
592 */ 702 */
593 public static final class MplsCriterion implements Criterion { 703 public static final class MplsCriterion implements Criterion {
......
...@@ -428,6 +428,14 @@ public class FlowEntryBuilder { ...@@ -428,6 +428,14 @@ public class FlowEntryBuilder {
428 } 428 }
429 builder.matchIPv6Src(sipv6); 429 builder.matchIPv6Src(sipv6);
430 break; 430 break;
431 + case ICMPV6_TYPE:
432 + byte icmpv6type = (byte) match.get(MatchField.ICMPV6_TYPE).getValue();
433 + builder.matchIcmpv6Type(icmpv6type);
434 + break;
435 + case ICMPV6_CODE:
436 + byte icmpv6code = (byte) match.get(MatchField.ICMPV6_CODE).getValue();
437 + builder.matchIcmpv6Code(icmpv6code);
438 + break;
431 case ARP_OP: 439 case ARP_OP:
432 case ARP_SHA: 440 case ARP_SHA:
433 case ARP_SPA: 441 case ARP_SPA:
...@@ -435,8 +443,6 @@ public class FlowEntryBuilder { ...@@ -435,8 +443,6 @@ public class FlowEntryBuilder {
435 case ARP_TPA: 443 case ARP_TPA:
436 case ICMPV4_CODE: 444 case ICMPV4_CODE:
437 case ICMPV4_TYPE: 445 case ICMPV4_TYPE:
438 - case ICMPV6_CODE:
439 - case ICMPV6_TYPE:
440 case IN_PHY_PORT: 446 case IN_PHY_PORT:
441 case IPV6_FLABEL: 447 case IPV6_FLABEL:
442 case IPV6_ND_SLL: 448 case IPV6_ND_SLL:
......
...@@ -31,6 +31,8 @@ import org.onosproject.net.flow.criteria.Criteria.PortCriterion; ...@@ -31,6 +31,8 @@ import org.onosproject.net.flow.criteria.Criteria.PortCriterion;
31 import org.onosproject.net.flow.criteria.Criteria.TcpPortCriterion; 31 import org.onosproject.net.flow.criteria.Criteria.TcpPortCriterion;
32 import org.onosproject.net.flow.criteria.Criteria.VlanIdCriterion; 32 import org.onosproject.net.flow.criteria.Criteria.VlanIdCriterion;
33 import org.onosproject.net.flow.criteria.Criteria.VlanPcpCriterion; 33 import org.onosproject.net.flow.criteria.Criteria.VlanPcpCriterion;
34 +import org.onosproject.net.flow.criteria.Criteria.Icmpv6TypeCriterion;
35 +import org.onosproject.net.flow.criteria.Criteria.Icmpv6CodeCriterion;
34 import org.onosproject.net.flow.criteria.Criterion; 36 import org.onosproject.net.flow.criteria.Criterion;
35 import org.onlab.packet.Ip4Address; 37 import org.onlab.packet.Ip4Address;
36 import org.onlab.packet.Ip4Prefix; 38 import org.onlab.packet.Ip4Prefix;
...@@ -254,6 +256,16 @@ public abstract class FlowModBuilder { ...@@ -254,6 +256,16 @@ public abstract class FlowModBuilder {
254 IPv6Address.of(ip6Prefix.address().toString())); 256 IPv6Address.of(ip6Prefix.address().toString()));
255 } 257 }
256 break; 258 break;
259 + case ICMPV6_TYPE:
260 + Icmpv6TypeCriterion icmpv6type = (Icmpv6TypeCriterion) c;
261 + mBuilder.setExact(MatchField.ICMPV6_TYPE,
262 + U8.of(icmpv6type.icmpv6Type().byteValue()));
263 + break;
264 + case ICMPV6_CODE:
265 + Icmpv6CodeCriterion icmpv6code = (Icmpv6CodeCriterion) c;
266 + mBuilder.setExact(MatchField.ICMPV6_CODE,
267 + U8.of(icmpv6code.icmpv6Code().byteValue()));
268 + break;
257 case ARP_OP: 269 case ARP_OP:
258 case ARP_SHA: 270 case ARP_SHA:
259 case ARP_SPA: 271 case ARP_SPA:
...@@ -261,8 +273,6 @@ public abstract class FlowModBuilder { ...@@ -261,8 +273,6 @@ public abstract class FlowModBuilder {
261 case ARP_TPA: 273 case ARP_TPA:
262 case ICMPV4_CODE: 274 case ICMPV4_CODE:
263 case ICMPV4_TYPE: 275 case ICMPV4_TYPE:
264 - case ICMPV6_CODE:
265 - case ICMPV6_TYPE:
266 case IN_PHY_PORT: 276 case IN_PHY_PORT:
267 case IPV6_EXTHDR: 277 case IPV6_EXTHDR:
268 case IPV6_FLABEL: 278 case IPV6_FLABEL:
......