Committed by
Pavlin Radoslavov
ONOS-509: Match IPV6_SRC, IPV6_DST criteria
* Following classes have been extended to match IPV6_SRC and IPV6_DST criteria:
- Criteria
- DefaultTrafficSelector
- FlowEntryBuilder
- FlowModBuilder
* Not included in this submission
- Match of other IPv6-related criteria
- Set of all IPv6-related criteria (action)
Change-Id: I115829a480356d2037e0fc809595f7a5eec25874
Showing
7 changed files
with
162 additions
and
13 deletions
| ... | @@ -184,6 +184,16 @@ public final class DefaultTrafficSelector implements TrafficSelector { | ... | @@ -184,6 +184,16 @@ public final class DefaultTrafficSelector implements TrafficSelector { |
| 184 | } | 184 | } |
| 185 | 185 | ||
| 186 | @Override | 186 | @Override |
| 187 | + public Builder matchIPv6Src(IpPrefix ip) { | ||
| 188 | + return add(Criteria.matchIPv6Src(ip)); | ||
| 189 | + } | ||
| 190 | + | ||
| 191 | + @Override | ||
| 192 | + public Builder matchIPv6Dst(IpPrefix ip) { | ||
| 193 | + return add(Criteria.matchIPv6Dst(ip)); | ||
| 194 | + } | ||
| 195 | + | ||
| 196 | + @Override | ||
| 187 | public Builder matchMplsLabel(Integer mplsLabel) { | 197 | public Builder matchMplsLabel(Integer mplsLabel) { |
| 188 | return add(Criteria.matchMplsLabel(mplsLabel)); | 198 | return add(Criteria.matchMplsLabel(mplsLabel)); |
| 189 | } | 199 | } | ... | ... |
| ... | @@ -115,7 +115,7 @@ public interface TrafficSelector { | ... | @@ -115,7 +115,7 @@ public interface TrafficSelector { |
| 115 | public Builder matchIPProtocol(Byte proto); | 115 | public Builder matchIPProtocol(Byte proto); |
| 116 | 116 | ||
| 117 | /** | 117 | /** |
| 118 | - * Matches a l3 address. | 118 | + * Matches a l3 IPv4 address. |
| 119 | * | 119 | * |
| 120 | * @param ip a l3 address | 120 | * @param ip a l3 address |
| 121 | * @return a selection builder | 121 | * @return a selection builder |
| ... | @@ -123,7 +123,7 @@ public interface TrafficSelector { | ... | @@ -123,7 +123,7 @@ public interface TrafficSelector { |
| 123 | public Builder matchIPSrc(IpPrefix ip); | 123 | public Builder matchIPSrc(IpPrefix ip); |
| 124 | 124 | ||
| 125 | /** | 125 | /** |
| 126 | - * Matches a l3 address. | 126 | + * Matches a l3 IPv4 address. |
| 127 | * | 127 | * |
| 128 | * @param ip a l3 address | 128 | * @param ip a l3 address |
| 129 | * @return a selection builder | 129 | * @return a selection builder |
| ... | @@ -146,6 +146,21 @@ public interface TrafficSelector { | ... | @@ -146,6 +146,21 @@ public interface TrafficSelector { |
| 146 | */ | 146 | */ |
| 147 | public Builder matchTcpDst(Short tcpPort); | 147 | public Builder matchTcpDst(Short tcpPort); |
| 148 | 148 | ||
| 149 | + /** | ||
| 150 | + * Matches a l3 IPv6 address. | ||
| 151 | + * | ||
| 152 | + * @param ip a l3 IPv6 address | ||
| 153 | + * @return a selection builder | ||
| 154 | + */ | ||
| 155 | + public Builder matchIPv6Src(IpPrefix ip); | ||
| 156 | + | ||
| 157 | + /** | ||
| 158 | + * Matches a l3 IPv6 address. | ||
| 159 | + * | ||
| 160 | + * @param ip a l3 IPv6 address | ||
| 161 | + * @return a selection builder | ||
| 162 | + */ | ||
| 163 | + public Builder matchIPv6Dst(IpPrefix ip); | ||
| 149 | 164 | ||
| 150 | /** | 165 | /** |
| 151 | * Matches on a MPLS label . | 166 | * Matches on a MPLS label . | ... | ... |
| ... | @@ -18,7 +18,6 @@ package org.onosproject.net.flow.criteria; | ... | @@ -18,7 +18,6 @@ package org.onosproject.net.flow.criteria; |
| 18 | import static com.google.common.base.MoreObjects.toStringHelper; | 18 | import static com.google.common.base.MoreObjects.toStringHelper; |
| 19 | 19 | ||
| 20 | import java.util.Objects; | 20 | import java.util.Objects; |
| 21 | - | ||
| 22 | import org.onosproject.net.PortNumber; | 21 | import org.onosproject.net.PortNumber; |
| 23 | import org.onosproject.net.flow.criteria.Criterion.Type; | 22 | import org.onosproject.net.flow.criteria.Criterion.Type; |
| 24 | import org.onlab.packet.IpPrefix; | 23 | import org.onlab.packet.IpPrefix; |
| ... | @@ -109,9 +108,9 @@ public final class Criteria { | ... | @@ -109,9 +108,9 @@ public final class Criteria { |
| 109 | } | 108 | } |
| 110 | 109 | ||
| 111 | /** | 110 | /** |
| 112 | - * Creates a match on IP source field using the specified value. | 111 | + * Creates a match on IPv4 source field using the specified value. |
| 113 | * | 112 | * |
| 114 | - * @param ip ip source value | 113 | + * @param ip ipv4 source value |
| 115 | * @return match criterion | 114 | * @return match criterion |
| 116 | */ | 115 | */ |
| 117 | public static Criterion matchIPSrc(IpPrefix ip) { | 116 | public static Criterion matchIPSrc(IpPrefix ip) { |
| ... | @@ -119,9 +118,9 @@ public final class Criteria { | ... | @@ -119,9 +118,9 @@ public final class Criteria { |
| 119 | } | 118 | } |
| 120 | 119 | ||
| 121 | /** | 120 | /** |
| 122 | - * Creates a match on IP destination field using the specified value. | 121 | + * Creates a match on IPv4 destination field using the specified value. |
| 123 | * | 122 | * |
| 124 | - * @param ip ip source value | 123 | + * @param ip ipv4 source value |
| 125 | * @return match criterion | 124 | * @return match criterion |
| 126 | */ | 125 | */ |
| 127 | public static Criterion matchIPDst(IpPrefix ip) { | 126 | public static Criterion matchIPDst(IpPrefix ip) { |
| ... | @@ -149,6 +148,26 @@ public final class Criteria { | ... | @@ -149,6 +148,26 @@ public final class Criteria { |
| 149 | } | 148 | } |
| 150 | 149 | ||
| 151 | /** | 150 | /** |
| 151 | + * Creates a match on IPv6 source field using the specified value. | ||
| 152 | + * | ||
| 153 | + * @param ip ipv6 source value | ||
| 154 | + * @return match criterion | ||
| 155 | + */ | ||
| 156 | + public static Criterion matchIPv6Src(IpPrefix ip) { | ||
| 157 | + return new IPCriterion(ip, Type.IPV6_SRC); | ||
| 158 | + } | ||
| 159 | + | ||
| 160 | + /** | ||
| 161 | + * Creates a match on IPv6 destination field using the specified value. | ||
| 162 | + * | ||
| 163 | + * @param ip ipv6 source value | ||
| 164 | + * @return match criterion | ||
| 165 | + */ | ||
| 166 | + public static Criterion matchIPv6Dst(IpPrefix ip) { | ||
| 167 | + return new IPCriterion(ip, Type.IPV6_DST); | ||
| 168 | + } | ||
| 169 | + | ||
| 170 | + /** | ||
| 152 | * Creates a match on MPLS label. | 171 | * Creates a match on MPLS label. |
| 153 | * @param mplsLabel MPLS label | 172 | * @param mplsLabel MPLS label |
| 154 | * @return match criterion | 173 | * @return match criterion | ... | ... |
| ... | @@ -129,6 +129,7 @@ public class DefaultTrafficSelectorTest { | ... | @@ -129,6 +129,7 @@ public class DefaultTrafficSelectorTest { |
| 129 | final short shortValue = 33; | 129 | final short shortValue = 33; |
| 130 | final byte byteValue = 44; | 130 | final byte byteValue = 44; |
| 131 | final IpPrefix ipPrefixValue = IpPrefix.valueOf("192.168.1.0/24"); | 131 | final IpPrefix ipPrefixValue = IpPrefix.valueOf("192.168.1.0/24"); |
| 132 | + final IpPrefix ipv6PrefixValue = IpPrefix.valueOf("fe80::1/64"); | ||
| 132 | 133 | ||
| 133 | selector = DefaultTrafficSelector.builder() | 134 | selector = DefaultTrafficSelector.builder() |
| 134 | .matchInport(PortNumber.portNumber(11)).build(); | 135 | .matchInport(PortNumber.portNumber(11)).build(); |
| ... | @@ -175,6 +176,14 @@ public class DefaultTrafficSelectorTest { | ... | @@ -175,6 +176,14 @@ public class DefaultTrafficSelectorTest { |
| 175 | assertThat(selector, hasCriterionWithType(Type.TCP_DST)); | 176 | assertThat(selector, hasCriterionWithType(Type.TCP_DST)); |
| 176 | 177 | ||
| 177 | selector = DefaultTrafficSelector.builder() | 178 | selector = DefaultTrafficSelector.builder() |
| 179 | + .matchIPv6Src(ipv6PrefixValue).build(); | ||
| 180 | + assertThat(selector, hasCriterionWithType(Type.IPV6_SRC)); | ||
| 181 | + | ||
| 182 | + selector = DefaultTrafficSelector.builder() | ||
| 183 | + .matchIPv6Dst(ipv6PrefixValue).build(); | ||
| 184 | + assertThat(selector, hasCriterionWithType(Type.IPV6_DST)); | ||
| 185 | + | ||
| 186 | + selector = DefaultTrafficSelector.builder() | ||
| 178 | .matchMplsLabel(3).build(); | 187 | .matchMplsLabel(3).build(); |
| 179 | assertThat(selector, hasCriterionWithType(Type.MPLS_LABEL)); | 188 | assertThat(selector, hasCriterionWithType(Type.MPLS_LABEL)); |
| 180 | 189 | ... | ... |
| ... | @@ -84,11 +84,18 @@ public class CriteriaTest { | ... | @@ -84,11 +84,18 @@ public class CriteriaTest { |
| 84 | 84 | ||
| 85 | private static final String IP1 = "1.2.3.4/24"; | 85 | private static final String IP1 = "1.2.3.4/24"; |
| 86 | private static final String IP2 = "5.6.7.8/24"; | 86 | private static final String IP2 = "5.6.7.8/24"; |
| 87 | + private static final String IPV61 = "fe80::1/64"; | ||
| 88 | + private static final String IPV62 = "fc80::2/64"; | ||
| 87 | private IpPrefix ip1 = IpPrefix.valueOf(IP1); | 89 | private IpPrefix ip1 = IpPrefix.valueOf(IP1); |
| 88 | private IpPrefix ip2 = IpPrefix.valueOf(IP2); | 90 | private IpPrefix ip2 = IpPrefix.valueOf(IP2); |
| 91 | + private IpPrefix ipv61 = IpPrefix.valueOf(IPV61); | ||
| 92 | + private IpPrefix ipv62 = IpPrefix.valueOf(IPV62); | ||
| 89 | Criterion matchIp1 = Criteria.matchIPSrc(ip1); | 93 | Criterion matchIp1 = Criteria.matchIPSrc(ip1); |
| 90 | Criterion sameAsMatchIp1 = Criteria.matchIPSrc(ip1); | 94 | Criterion sameAsMatchIp1 = Criteria.matchIPSrc(ip1); |
| 91 | Criterion matchIp2 = Criteria.matchIPSrc(ip2); | 95 | Criterion matchIp2 = Criteria.matchIPSrc(ip2); |
| 96 | + Criterion matchIpv61 = Criteria.matchIPSrc(ipv61); | ||
| 97 | + Criterion sameAsMatchIpv61 = Criteria.matchIPSrc(ipv61); | ||
| 98 | + Criterion matchIpv62 = Criteria.matchIPSrc(ipv62); | ||
| 92 | 99 | ||
| 93 | short lambda1 = 1; | 100 | short lambda1 = 1; |
| 94 | short lambda2 = 2; | 101 | short lambda2 = 2; |
| ... | @@ -384,6 +391,32 @@ public class CriteriaTest { | ... | @@ -384,6 +391,32 @@ public class CriteriaTest { |
| 384 | } | 391 | } |
| 385 | 392 | ||
| 386 | /** | 393 | /** |
| 394 | + * Test the matchIPSrc method. | ||
| 395 | + */ | ||
| 396 | + @Test | ||
| 397 | + public void testMatchIPv6SrcMethod() { | ||
| 398 | + Criterion matchIpv6Src = Criteria.matchIPv6Src(ipv61); | ||
| 399 | + Criteria.IPCriterion ipCriterion = | ||
| 400 | + checkAndConvert(matchIpv6Src, | ||
| 401 | + Criterion.Type.IPV6_SRC, | ||
| 402 | + Criteria.IPCriterion.class); | ||
| 403 | + assertThat(ipCriterion.ip(), is(ipv61)); | ||
| 404 | + } | ||
| 405 | + | ||
| 406 | + /** | ||
| 407 | + * Test the matchIPDst method. | ||
| 408 | + */ | ||
| 409 | + @Test | ||
| 410 | + public void testMatchIPv6DstMethod() { | ||
| 411 | + Criterion matchIPv6Dst = Criteria.matchIPv6Dst(ipv61); | ||
| 412 | + Criteria.IPCriterion ipCriterion = | ||
| 413 | + checkAndConvert(matchIPv6Dst, | ||
| 414 | + Criterion.Type.IPV6_DST, | ||
| 415 | + Criteria.IPCriterion.class); | ||
| 416 | + assertThat(ipCriterion.ip(), is(equalTo(ipv61))); | ||
| 417 | + } | ||
| 418 | + | ||
| 419 | + /** | ||
| 387 | * Test the equals() method of the IpCriterion class. | 420 | * Test the equals() method of the IpCriterion class. |
| 388 | */ | 421 | */ |
| 389 | @Test | 422 | @Test |
| ... | @@ -392,6 +425,11 @@ public class CriteriaTest { | ... | @@ -392,6 +425,11 @@ public class CriteriaTest { |
| 392 | .addEqualityGroup(matchIp1, sameAsMatchIp1) | 425 | .addEqualityGroup(matchIp1, sameAsMatchIp1) |
| 393 | .addEqualityGroup(matchIp2) | 426 | .addEqualityGroup(matchIp2) |
| 394 | .testEquals(); | 427 | .testEquals(); |
| 428 | + | ||
| 429 | + new EqualsTester() | ||
| 430 | + .addEqualityGroup(matchIpv61, sameAsMatchIpv61) | ||
| 431 | + .addEqualityGroup(matchIpv62) | ||
| 432 | + .testEquals(); | ||
| 395 | } | 433 | } |
| 396 | 434 | ||
| 397 | // LambdaCriterion class | 435 | // LambdaCriterion class | ... | ... |
| ... | @@ -21,6 +21,7 @@ import java.util.List; | ... | @@ -21,6 +21,7 @@ import java.util.List; |
| 21 | 21 | ||
| 22 | import org.onlab.packet.Ip4Address; | 22 | import org.onlab.packet.Ip4Address; |
| 23 | import org.onlab.packet.Ip4Prefix; | 23 | import org.onlab.packet.Ip4Prefix; |
| 24 | +import org.onlab.packet.Ip6Prefix; | ||
| 24 | import org.onlab.packet.MacAddress; | 25 | import org.onlab.packet.MacAddress; |
| 25 | import org.onlab.packet.VlanId; | 26 | import org.onlab.packet.VlanId; |
| 26 | import org.onosproject.net.DeviceId; | 27 | import org.onosproject.net.DeviceId; |
| ... | @@ -56,6 +57,7 @@ import org.projectfloodlight.openflow.protocol.match.MatchField; | ... | @@ -56,6 +57,7 @@ import org.projectfloodlight.openflow.protocol.match.MatchField; |
| 56 | import org.projectfloodlight.openflow.protocol.oxm.OFOxm; | 57 | import org.projectfloodlight.openflow.protocol.oxm.OFOxm; |
| 57 | import org.projectfloodlight.openflow.protocol.oxm.OFOxmOchSigidBasic; | 58 | import org.projectfloodlight.openflow.protocol.oxm.OFOxmOchSigidBasic; |
| 58 | import org.projectfloodlight.openflow.types.IPv4Address; | 59 | import org.projectfloodlight.openflow.types.IPv4Address; |
| 60 | +import org.projectfloodlight.openflow.types.IPv6Address; | ||
| 59 | import org.projectfloodlight.openflow.types.Masked; | 61 | import org.projectfloodlight.openflow.types.Masked; |
| 60 | import org.projectfloodlight.openflow.types.OFVlanVidMatch; | 62 | import org.projectfloodlight.openflow.types.OFVlanVidMatch; |
| 61 | import org.projectfloodlight.openflow.types.VlanPcp; | 63 | import org.projectfloodlight.openflow.types.VlanPcp; |
| ... | @@ -398,6 +400,34 @@ public class FlowEntryBuilder { | ... | @@ -398,6 +400,34 @@ public class FlowEntryBuilder { |
| 398 | builder.matchOpticalSignalType(match.get(MatchField | 400 | builder.matchOpticalSignalType(match.get(MatchField |
| 399 | .OCH_SIGTYPE).getValue()); | 401 | .OCH_SIGTYPE).getValue()); |
| 400 | break; | 402 | break; |
| 403 | + case IPV6_DST: | ||
| 404 | + Ip6Prefix dipv6; | ||
| 405 | + if (match.isPartiallyMasked(MatchField.IPV6_DST)) { | ||
| 406 | + Masked<IPv6Address> maskedIp = match.getMasked(MatchField.IPV6_DST); | ||
| 407 | + dipv6 = Ip6Prefix.valueOf( | ||
| 408 | + maskedIp.getValue().getBytes(), | ||
| 409 | + maskedIp.getMask().asCidrMaskLength()); | ||
| 410 | + } else { | ||
| 411 | + dipv6 = Ip6Prefix.valueOf( | ||
| 412 | + match.get(MatchField.IPV6_DST).getBytes(), | ||
| 413 | + Ip6Prefix.MAX_MASK_LENGTH); | ||
| 414 | + } | ||
| 415 | + builder.matchIPv6Dst(dipv6); | ||
| 416 | + break; | ||
| 417 | + case IPV6_SRC: | ||
| 418 | + Ip6Prefix sipv6; | ||
| 419 | + if (match.isPartiallyMasked(MatchField.IPV6_SRC)) { | ||
| 420 | + Masked<IPv6Address> maskedIp = match.getMasked(MatchField.IPV6_SRC); | ||
| 421 | + sipv6 = Ip6Prefix.valueOf( | ||
| 422 | + maskedIp.getValue().getBytes(), | ||
| 423 | + maskedIp.getMask().asCidrMaskLength()); | ||
| 424 | + } else { | ||
| 425 | + sipv6 = Ip6Prefix.valueOf( | ||
| 426 | + match.get(MatchField.IPV6_SRC).getBytes(), | ||
| 427 | + Ip6Prefix.MAX_MASK_LENGTH); | ||
| 428 | + } | ||
| 429 | + builder.matchIPv6Src(sipv6); | ||
| 430 | + break; | ||
| 401 | case ARP_OP: | 431 | case ARP_OP: |
| 402 | case ARP_SHA: | 432 | case ARP_SHA: |
| 403 | case ARP_SPA: | 433 | case ARP_SPA: |
| ... | @@ -408,12 +438,10 @@ public class FlowEntryBuilder { | ... | @@ -408,12 +438,10 @@ public class FlowEntryBuilder { |
| 408 | case ICMPV6_CODE: | 438 | case ICMPV6_CODE: |
| 409 | case ICMPV6_TYPE: | 439 | case ICMPV6_TYPE: |
| 410 | case IN_PHY_PORT: | 440 | case IN_PHY_PORT: |
| 411 | - case IPV6_DST: | ||
| 412 | case IPV6_FLABEL: | 441 | case IPV6_FLABEL: |
| 413 | case IPV6_ND_SLL: | 442 | case IPV6_ND_SLL: |
| 414 | case IPV6_ND_TARGET: | 443 | case IPV6_ND_TARGET: |
| 415 | case IPV6_ND_TLL: | 444 | case IPV6_ND_TLL: |
| 416 | - case IPV6_SRC: | ||
| 417 | case IP_DSCP: | 445 | case IP_DSCP: |
| 418 | case IP_ECN: | 446 | case IP_ECN: |
| 419 | case METADATA: | 447 | case METADATA: |
| ... | @@ -425,8 +453,6 @@ public class FlowEntryBuilder { | ... | @@ -425,8 +453,6 @@ public class FlowEntryBuilder { |
| 425 | case UDP_SRC: | 453 | case UDP_SRC: |
| 426 | default: | 454 | default: |
| 427 | log.warn("Match type {} not yet implemented.", field.id); | 455 | log.warn("Match type {} not yet implemented.", field.id); |
| 428 | - | ||
| 429 | - | ||
| 430 | } | 456 | } |
| 431 | } | 457 | } |
| 432 | return builder.build(); | 458 | return builder.build(); | ... | ... |
| ... | @@ -17,6 +17,8 @@ package org.onosproject.provider.of.flow.impl; | ... | @@ -17,6 +17,8 @@ package org.onosproject.provider.of.flow.impl; |
| 17 | 17 | ||
| 18 | import static org.slf4j.LoggerFactory.getLogger; | 18 | import static org.slf4j.LoggerFactory.getLogger; |
| 19 | 19 | ||
| 20 | +import org.onlab.packet.Ip6Address; | ||
| 21 | +import org.onlab.packet.Ip6Prefix; | ||
| 20 | import org.onosproject.net.flow.FlowRule; | 22 | import org.onosproject.net.flow.FlowRule; |
| 21 | import org.onosproject.net.flow.TrafficSelector; | 23 | import org.onosproject.net.flow.TrafficSelector; |
| 22 | import org.onosproject.net.flow.criteria.Criteria; | 24 | import org.onosproject.net.flow.criteria.Criteria; |
| ... | @@ -41,6 +43,7 @@ import org.projectfloodlight.openflow.protocol.match.MatchField; | ... | @@ -41,6 +43,7 @@ import org.projectfloodlight.openflow.protocol.match.MatchField; |
| 41 | import org.projectfloodlight.openflow.types.CircuitSignalID; | 43 | import org.projectfloodlight.openflow.types.CircuitSignalID; |
| 42 | import org.projectfloodlight.openflow.types.EthType; | 44 | import org.projectfloodlight.openflow.types.EthType; |
| 43 | import org.projectfloodlight.openflow.types.IPv4Address; | 45 | import org.projectfloodlight.openflow.types.IPv4Address; |
| 46 | +import org.projectfloodlight.openflow.types.IPv6Address; | ||
| 44 | import org.projectfloodlight.openflow.types.IpProtocol; | 47 | import org.projectfloodlight.openflow.types.IpProtocol; |
| 45 | import org.projectfloodlight.openflow.types.MacAddress; | 48 | import org.projectfloodlight.openflow.types.MacAddress; |
| 46 | import org.projectfloodlight.openflow.types.Masked; | 49 | import org.projectfloodlight.openflow.types.Masked; |
| ... | @@ -134,6 +137,7 @@ public abstract class FlowModBuilder { | ... | @@ -134,6 +137,7 @@ public abstract class FlowModBuilder { |
| 134 | EthCriterion eth; | 137 | EthCriterion eth; |
| 135 | IPCriterion ip; | 138 | IPCriterion ip; |
| 136 | Ip4Prefix ip4Prefix; | 139 | Ip4Prefix ip4Prefix; |
| 140 | + Ip6Prefix ip6Prefix; | ||
| 137 | TcpPortCriterion tp; | 141 | TcpPortCriterion tp; |
| 138 | for (Criterion c : selector.criteria()) { | 142 | for (Criterion c : selector.criteria()) { |
| 139 | switch (c.type()) { | 143 | switch (c.type()) { |
| ... | @@ -220,6 +224,36 @@ public abstract class FlowModBuilder { | ... | @@ -220,6 +224,36 @@ public abstract class FlowModBuilder { |
| 220 | mBuilder.setExact(MatchField.OCH_SIGTYPE, | 224 | mBuilder.setExact(MatchField.OCH_SIGTYPE, |
| 221 | U8.of(sc.signalType())); | 225 | U8.of(sc.signalType())); |
| 222 | break; | 226 | break; |
| 227 | + case IPV6_DST: | ||
| 228 | + ip = (IPCriterion) c; | ||
| 229 | + ip6Prefix = ip.ip().getIp6Prefix(); | ||
| 230 | + if (ip6Prefix.prefixLength() != Ip6Prefix.MAX_MASK_LENGTH) { | ||
| 231 | + Ip6Address maskAddr = | ||
| 232 | + Ip6Address.makeMaskPrefix(ip6Prefix.prefixLength()); | ||
| 233 | + Masked<IPv6Address> maskedIp = | ||
| 234 | + Masked.of(IPv6Address.of(ip6Prefix.address().toString()), | ||
| 235 | + IPv6Address.of(maskAddr.toString())); | ||
| 236 | + mBuilder.setMasked(MatchField.IPV6_DST, maskedIp); | ||
| 237 | + } else { | ||
| 238 | + mBuilder.setExact(MatchField.IPV6_DST, | ||
| 239 | + IPv6Address.of(ip6Prefix.address().toString())); | ||
| 240 | + } | ||
| 241 | + break; | ||
| 242 | + case IPV6_SRC: | ||
| 243 | + ip = (IPCriterion) c; | ||
| 244 | + ip6Prefix = ip.ip().getIp6Prefix(); | ||
| 245 | + if (ip6Prefix.prefixLength() != Ip6Prefix.MAX_MASK_LENGTH) { | ||
| 246 | + Ip6Address maskAddr = | ||
| 247 | + Ip6Address.makeMaskPrefix(ip6Prefix.prefixLength()); | ||
| 248 | + Masked<IPv6Address> maskedIp = | ||
| 249 | + Masked.of(IPv6Address.of(ip6Prefix.address().toString()), | ||
| 250 | + IPv6Address.of(maskAddr.toString())); | ||
| 251 | + mBuilder.setMasked(MatchField.IPV6_SRC, maskedIp); | ||
| 252 | + } else { | ||
| 253 | + mBuilder.setExact(MatchField.IPV6_SRC, | ||
| 254 | + IPv6Address.of(ip6Prefix.address().toString())); | ||
| 255 | + } | ||
| 256 | + break; | ||
| 223 | case ARP_OP: | 257 | case ARP_OP: |
| 224 | case ARP_SHA: | 258 | case ARP_SHA: |
| 225 | case ARP_SPA: | 259 | case ARP_SPA: |
| ... | @@ -230,13 +264,11 @@ public abstract class FlowModBuilder { | ... | @@ -230,13 +264,11 @@ public abstract class FlowModBuilder { |
| 230 | case ICMPV6_CODE: | 264 | case ICMPV6_CODE: |
| 231 | case ICMPV6_TYPE: | 265 | case ICMPV6_TYPE: |
| 232 | case IN_PHY_PORT: | 266 | case IN_PHY_PORT: |
| 233 | - case IPV6_DST: | ||
| 234 | case IPV6_EXTHDR: | 267 | case IPV6_EXTHDR: |
| 235 | case IPV6_FLABEL: | 268 | case IPV6_FLABEL: |
| 236 | case IPV6_ND_SLL: | 269 | case IPV6_ND_SLL: |
| 237 | case IPV6_ND_TARGET: | 270 | case IPV6_ND_TARGET: |
| 238 | case IPV6_ND_TLL: | 271 | case IPV6_ND_TLL: |
| 239 | - case IPV6_SRC: | ||
| 240 | case IP_DSCP: | 272 | case IP_DSCP: |
| 241 | case IP_ECN: | 273 | case IP_ECN: |
| 242 | case METADATA: | 274 | case METADATA: | ... | ... |
-
Please register or login to post a comment