@Override public AclLineMatchExpr visitMatchHeaderSpace(MatchHeaderSpace matchHeaderSpace) { HeaderSpace headerSpace = matchHeaderSpace.getHeaderspace(); IpSpace dstIps = rename(headerSpace.getDstIps()); IpSpace notDstIps = rename(headerSpace.getNotDstIps()); IpSpace srcIps = rename(headerSpace.getSrcIps()); IpSpace notSrcIps = rename(headerSpace.getNotSrcIps()); IpSpace srcOrDstIps = rename(headerSpace.getSrcOrDstIps()); MatchHeaderSpace newMatchHeaderSpace = new MatchHeaderSpace( headerSpace .toBuilder() .setDstIps(dstIps) .setNotDstIps(notDstIps) .setSrcIps(srcIps) .setNotSrcIps(notSrcIps) .setSrcOrDstIps(srcOrDstIps) .build()); _literalsMap.put(matchHeaderSpace, newMatchHeaderSpace); return newMatchHeaderSpace; }
@Test public void test_srcOrDstIps() { Ip srcOrDstIp = Ip.parse("1.2.3.4"); HeaderSpace headerSpace = HeaderSpace.builder().setSrcOrDstIps(srcOrDstIp.toIpSpace()).build(); BDD bdd = _toBDD.toBDD(headerSpace); BDD dstIpBDD = _pkt.getDstIp().value(srcOrDstIp.asLong()); BDD srcIpBDD = _pkt.getSrcIp().value(srcOrDstIp.asLong()); assertThat(bdd, equalTo(dstIpBDD.or(srcIpBDD))); // force srcIp to be srcOrDstIp Ip dstIp = Ip.parse("1.1.1.1"); headerSpace = HeaderSpace.builder() .setDstIps(dstIp.toIpSpace()) .setSrcOrDstIps(srcOrDstIp.toIpSpace()) .build(); bdd = _toBDD.toBDD(headerSpace); dstIpBDD = _pkt.getDstIp().value(dstIp.asLong()); assertThat(bdd, equalTo(srcIpBDD.and(dstIpBDD))); // neither can be srcOrDstIp. unsatisfiable Ip srcIp = Ip.parse("2.2.2.2"); headerSpace = HeaderSpace.builder() .setDstIps(dstIp.toIpSpace()) .setSrcIps(srcIp.toIpSpace()) .setSrcOrDstIps(srcOrDstIp.toIpSpace()) .build(); bdd = _toBDD.toBDD(headerSpace); assertThat(bdd, isZero()); }
.setNotSrcIps(simplifyNegativeIpConstraint(notSrcIps)) .setSrcIps(simplifyPositiveIpConstraint(srcIps)) .setSrcOrDstIps(simplifyPositiveIpConstraint(srcOrDstIps)) .build();
hsb.setSrcOrDstIps(original.accept(new IpSpaceDereferencer(namedIpSpaces)));
.setPacketLengths(_packetLengths) .setSrcIps(_srcIps) .setSrcOrDstIps(_srcOrDstIps) .setSrcOrDstPorts(_srcOrDstPorts) .setSrcOrDstProtocols(_srcOrDstProtocols)
@Override public HeaderSpace specialize(HeaderSpace headerSpace) { return headerSpace .toBuilder() // combine dstIps and notDstIps into dstIps .setDstIps(specializeIpSpace(headerSpace.getDstIps(), _dstIpSpaceSpecializer)) .setNotDstIps(specializeIpSpace(headerSpace.getNotDstIps(), _dstIpSpaceSpecializer)) .setDstPorts(specializeSubRange(headerSpace.getDstPorts(), _pkt.getDstPort())) .setNotDstPorts(specializeSubRange(headerSpace.getNotDstPorts(), _pkt.getDstPort())) .setIpProtocols(specializeIpProtocols(headerSpace.getIpProtocols())) .setIcmpCodes(specializeSubRange(headerSpace.getIcmpCodes(), _pkt.getIcmpCode())) .setIcmpTypes(specializeSubRange(headerSpace.getIcmpTypes(), _pkt.getIcmpType())) .setSrcOrDstIps( specializeIpSpace( headerSpace.getSrcOrDstIps(), _dstIpSpaceSpecializer, _srcIpSpaceSpecializer)) .setSrcOrDstPorts( specializeSubRange( headerSpace.getSrcOrDstPorts(), _pkt.getSrcPort(), _pkt.getDstPort())) .setSrcPorts(specializeSubRange(headerSpace.getSrcPorts(), _pkt.getSrcPort())) .setNotSrcPorts(specializeSubRange(headerSpace.getNotSrcPorts(), _pkt.getSrcPort())) .setSrcIps(specializeIpSpace(headerSpace.getSrcIps(), _srcIpSpaceSpecializer)) .setNotSrcIps(specializeIpSpace(headerSpace.getNotSrcIps(), _srcIpSpaceSpecializer)) .setTcpFlags(specializeTcpFlags(headerSpace.getTcpFlags())) .build(); }