public RouteFilterLine(LineAction action, PrefixRange prefixRange) { this(action, new IpWildcard(prefixRange.getPrefix()), prefixRange.getLengthRange()); }
public boolean includesPrefixRange(PrefixRange argPrefixRange) { Prefix prefix = getPrefix(); SubRange lengthRange = getLengthRange(); int prefixLength = prefix.getPrefixLength(); long maskedPrefixAsLong = prefix.getStartIp().getNetworkAddress(prefixLength).asLong(); Prefix argPrefix = argPrefixRange.getPrefix(); SubRange argLengthRange = argPrefixRange.getLengthRange(); long argMaskedPrefixAsLong = argPrefix.getStartIp().getNetworkAddress(prefixLength).asLong(); return maskedPrefixAsLong == argMaskedPrefixAsLong && lengthRange.getStart() <= argLengthRange.getStart() && lengthRange.getEnd() >= argLengthRange.getEnd(); }
public void addPrefixRange(PrefixRange prefixRange) { Prefix prefix = prefixRange.getPrefix(); BitSet bits = getAddressBits(prefix.getStartIp()); // The minimum length of the range may be shorter than the actual prefix length. // If so, we need to specially handle all shorter prefixes with a custom address and bitset. int minLength = prefixRange.getLengthRange().getStart(); int maxLength = Math.min(prefixRange.getLengthRange().getEnd(), prefix.getPrefixLength() - 1); for (int currentLength = minLength; currentLength <= maxLength; currentLength++) { Prefix currentPrefix = Prefix.create(prefix.getStartIp(), currentLength); PrefixRange currentPrefixRange = PrefixRange.fromPrefix(currentPrefix); BitSet currentBits = getAddressBits(currentPrefix.getStartIp()); _root.addPrefixRange(currentPrefixRange, currentBits, currentLength, 0); } // Otherwise, add the prefix range as-is. _root.addPrefixRange(prefixRange, bits, prefix.getPrefixLength(), 0); }
int start = r.getLengthRange().getStart(); int end = r.getLengthRange().getEnd(); Prefix pfx = r.getPrefix(); if (start == end && start == pfx.getPrefixLength()) {
private BDD isRelevantFor(BDDRoute record, PrefixRange range) { Prefix p = range.getPrefix(); SubRange r = range.getLengthRange(); int len = p.getPrefixLength(); int lower = r.getStart(); int upper = r.getEnd(); BDD lowerBitsMatch = firstBitsEqual(record.getPrefix().getBitvec(), p, len); BDD acc = factory.zero(); if (lower == 0 && upper == 32) { acc = factory.one(); } else { for (int i = lower; i <= upper; i++) { BDD equalLen = record.getPrefixLength().value(i); acc = acc.or(equalLen); } } return acc.and(lowerBitsMatch); }
BoolExpr isRelevantFor(ArithExpr prefixLen, PrefixRange range) { Prefix p = range.getPrefix(); SubRange r = range.getLengthRange(); long pfx = p.getStartIp().asLong(); int len = p.getPrefixLength(); int lower = r.getStart(); int upper = r.getEnd(); // well formed prefix assert (p.getPrefixLength() <= lower && lower <= upper); BoolExpr lowerBitsMatch = firstBitsEqual(_symbolicPacket.getDstIp(), pfx, len); if (lower == upper) { BoolExpr equalLen = mkEq(prefixLen, mkInt(lower)); return mkAnd(equalLen, lowerBitsMatch); } else { BoolExpr lengthLowerBound = mkGe(prefixLen, mkInt(lower)); BoolExpr lengthUpperBound = mkLe(prefixLen, mkInt(upper)); return mkAnd(lengthLowerBound, lengthUpperBound, lowerBitsMatch); } }