public RouteFilterLine(LineAction action, PrefixRange prefixRange) { this(action, new IpWildcard(prefixRange.getPrefix()), prefixRange.getLengthRange()); }
public boolean containsPrefixRange(PrefixRange prefixRange) { Prefix prefix = prefixRange.getPrefix(); int prefixLength = prefix.getPrefixLength(); BitSet bits = getAddressBits(prefix.getStartIp()); return _root.containsPrefixRange(prefixRange, bits, prefixLength, 0); }
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(); }
private BDD matchPrefixSet( TransferParam<BDDRoute> p, Configuration conf, PrefixSetExpr e, BDDRoute other) { if (e instanceof ExplicitPrefixSet) { ExplicitPrefixSet x = (ExplicitPrefixSet) e; Set<PrefixRange> ranges = x.getPrefixSpace().getPrefixRanges(); if (ranges.isEmpty()) { p.debug("empty"); return factory.one(); } BDD acc = factory.zero(); for (PrefixRange range : ranges) { p.debug("Prefix Range: " + range); if (!PrefixUtils.isContainedBy(range.getPrefix(), _ignoredNetworks)) { acc = acc.or(isRelevantFor(other, range)); } } return acc; } else if (e instanceof NamedPrefixSet) { NamedPrefixSet x = (NamedPrefixSet) e; p.debug("Named: " + x.getName()); String name = x.getName(); RouteFilterList fl = conf.getRouteFilterLists().get(name); return matchFilterList(p, fl, other); } else { throw new BatfishException("TODO: match prefix set: " + e); } }
Set<PrefixRange> ranges = eps.getPrefixSpace().getPrefixRanges(); for (PrefixRange r : ranges) { acc.add(r.getPrefix());
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); }
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); }
int start = r.getLengthRange().getStart(); int end = r.getLengthRange().getEnd(); Prefix pfx = r.getPrefix(); if (start == end && start == pfx.getPrefixLength()) { String router = _conf.getHostname();
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); } }