use of org.batfish.datamodel.SubRange in project batfish by batfish.
the class CiscoControlPlaneExtractor method toRange.
private static List<SubRange> toRange(RangeContext ctx) {
List<SubRange> range = new ArrayList<>();
for (SubrangeContext sc : ctx.range_list) {
SubRange sr = toSubRange(sc);
range.add(sr);
}
return range;
}
use of org.batfish.datamodel.SubRange in project batfish by batfish.
the class CiscoControlPlaneExtractor method exitExtended_ipv6_access_list_tail.
@Override
public void exitExtended_ipv6_access_list_tail(Extended_ipv6_access_list_tailContext ctx) {
LineAction action = toLineAction(ctx.ala);
IpProtocol protocol = toIpProtocol(ctx.prot);
Ip6 srcIp = getIp(ctx.srcipr);
Ip6 srcWildcard = getWildcard(ctx.srcipr);
Ip6 dstIp = getIp(ctx.dstipr);
Ip6 dstWildcard = getWildcard(ctx.dstipr);
String srcAddressGroup = getAddressGroup(ctx.srcipr);
String dstAddressGroup = getAddressGroup(ctx.dstipr);
List<SubRange> srcPortRanges = ctx.alps_src != null ? toPortRanges(ctx.alps_src) : Collections.<SubRange>emptyList();
List<SubRange> dstPortRanges = ctx.alps_dst != null ? toPortRanges(ctx.alps_dst) : Collections.<SubRange>emptyList();
Integer icmpType = null;
Integer icmpCode = null;
List<TcpFlags> tcpFlags = new ArrayList<>();
Set<Integer> dscps = new TreeSet<>();
Set<Integer> ecns = new TreeSet<>();
Set<State> states = EnumSet.noneOf(State.class);
for (Extended_access_list_additional_featureContext feature : ctx.features) {
if (feature.ACK() != null) {
TcpFlags alt = new TcpFlags();
alt.setUseAck(true);
alt.setAck(true);
tcpFlags.add(alt);
}
if (feature.DSCP() != null) {
int dscpType = toDscpType(feature.dscp_type());
dscps.add(dscpType);
}
if (feature.ECE() != null) {
TcpFlags alt = new TcpFlags();
alt.setUseEce(true);
alt.setEce(true);
tcpFlags.add(alt);
}
if (feature.ECHO_REPLY() != null) {
icmpType = IcmpType.ECHO_REPLY;
icmpCode = IcmpCode.ECHO_REPLY;
}
if (feature.ECHO() != null) {
icmpType = IcmpType.ECHO_REQUEST;
icmpCode = IcmpCode.ECHO_REQUEST;
}
if (feature.ECN() != null) {
int ecn = toInteger(feature.ecn);
ecns.add(ecn);
}
if (feature.ESTABLISHED() != null) {
// must contain ACK or RST
TcpFlags alt1 = new TcpFlags();
TcpFlags alt2 = new TcpFlags();
alt1.setUseAck(true);
alt1.setAck(true);
alt2.setUseRst(true);
alt2.setRst(true);
tcpFlags.add(alt1);
tcpFlags.add(alt2);
}
if (feature.FIN() != null) {
TcpFlags alt = new TcpFlags();
alt.setUseFin(true);
alt.setFin(true);
tcpFlags.add(alt);
}
if (feature.FRAGMENTS() != null) {
todo(ctx, F_FRAGMENTS);
}
if (feature.HOST_UNKNOWN() != null) {
icmpType = IcmpType.DESTINATION_UNREACHABLE;
icmpCode = IcmpCode.DESTINATION_HOST_UNKNOWN;
}
if (feature.HOST_UNREACHABLE() != null) {
icmpType = IcmpType.DESTINATION_UNREACHABLE;
icmpCode = IcmpCode.DESTINATION_HOST_UNREACHABLE;
}
if (feature.NETWORK_UNKNOWN() != null) {
icmpType = IcmpType.DESTINATION_UNREACHABLE;
icmpCode = IcmpCode.DESTINATION_NETWORK_UNKNOWN;
}
if (feature.NET_UNREACHABLE() != null) {
icmpType = IcmpType.DESTINATION_UNREACHABLE;
icmpCode = IcmpCode.DESTINATION_NETWORK_UNREACHABLE;
}
if (feature.PACKET_TOO_BIG() != null) {
icmpType = IcmpType.DESTINATION_UNREACHABLE;
icmpCode = IcmpCode.PACKET_TOO_BIG;
}
if (feature.PARAMETER_PROBLEM() != null) {
icmpType = IcmpType.PARAMETER_PROBLEM;
}
if (feature.PORT_UNREACHABLE() != null) {
icmpType = IcmpType.DESTINATION_UNREACHABLE;
icmpCode = IcmpCode.DESTINATION_PORT_UNREACHABLE;
}
if (feature.PSH() != null) {
TcpFlags alt = new TcpFlags();
alt.setUsePsh(true);
alt.setPsh(true);
tcpFlags.add(alt);
}
if (feature.REDIRECT() != null) {
icmpType = IcmpType.REDIRECT_MESSAGE;
}
if (feature.RST() != null) {
TcpFlags alt = new TcpFlags();
alt.setUseRst(true);
alt.setRst(true);
tcpFlags.add(alt);
}
if (feature.SOURCE_QUENCH() != null) {
icmpType = IcmpType.SOURCE_QUENCH;
icmpCode = IcmpCode.SOURCE_QUENCH;
}
if (feature.SYN() != null) {
TcpFlags alt = new TcpFlags();
alt.setUseSyn(true);
alt.setSyn(true);
tcpFlags.add(alt);
}
if (feature.TIME_EXCEEDED() != null) {
icmpType = IcmpType.TIME_EXCEEDED;
}
if (feature.TTL() != null) {
todo(ctx, F_TTL);
}
if (feature.TTL_EXCEEDED() != null) {
icmpType = IcmpType.TIME_EXCEEDED;
icmpCode = IcmpCode.TTL_EXCEEDED;
}
if (feature.TRACEROUTE() != null) {
icmpType = IcmpType.TRACEROUTE;
icmpCode = IcmpCode.TRACEROUTE;
}
if (feature.TRACKED() != null) {
states.add(State.ESTABLISHED);
}
if (feature.UNREACHABLE() != null) {
icmpType = IcmpType.DESTINATION_UNREACHABLE;
}
if (feature.URG() != null) {
TcpFlags alt = new TcpFlags();
alt.setUseUrg(true);
alt.setUrg(true);
tcpFlags.add(alt);
}
}
String name = getFullText(ctx).trim();
ExtendedIpv6AccessListLine line = new ExtendedIpv6AccessListLine(name, action, protocol, new Ip6Wildcard(srcIp, srcWildcard), srcAddressGroup, new Ip6Wildcard(dstIp, dstWildcard), dstAddressGroup, srcPortRanges, dstPortRanges, dscps, ecns, icmpType, icmpCode, states, tcpFlags);
_currentExtendedIpv6Acl.addLine(line);
}
use of org.batfish.datamodel.SubRange in project batfish by batfish.
the class CiscoControlPlaneExtractor method enterS_interface.
@Override
public void enterS_interface(S_interfaceContext ctx) {
String nameAlpha = ctx.iname.name_prefix_alpha.getText();
String canonicalNamePrefix;
try {
canonicalNamePrefix = CiscoConfiguration.getCanonicalInterfaceNamePrefix(nameAlpha);
} catch (BatfishException e) {
_w.redFlag("Error fetching interface name at: " + getLocation(ctx) + getFullText(ctx) + " : " + e.getMessage());
_currentInterfaces = ImmutableList.of();
return;
}
String namePrefix = canonicalNamePrefix;
for (Token part : ctx.iname.name_middle_parts) {
namePrefix += part.getText();
}
_currentInterfaces = new ArrayList<>();
if (ctx.iname.range() != null) {
List<SubRange> ranges = toRange(ctx.iname.range());
for (SubRange range : ranges) {
for (int i = range.getStart(); i <= range.getEnd(); i++) {
String name = namePrefix + i;
addInterface(name, ctx.iname, true);
}
}
} else {
String name = namePrefix;
addInterface(name, ctx.iname, true);
}
if (ctx.MULTIPOINT() != null) {
todo(ctx, F_INTERFACE_MULTIPOINT);
}
}
use of org.batfish.datamodel.SubRange in project batfish by batfish.
the class CiscoControlPlaneExtractor method toCommunitySetElemHalfExpr.
private CommunitySetElemHalfExpr toCommunitySetElemHalfExpr(Rp_community_set_elem_halfContext ctx) {
if (ctx.value != null) {
int value = toInteger(ctx.value);
return new LiteralCommunitySetElemHalf(value);
} else if (ctx.var != null) {
String var = ctx.var.getText();
return new VarCommunitySetElemHalf(var);
} else if (ctx.first != null) {
int first = toInteger(ctx.first);
int last = toInteger(ctx.last);
SubRange range = new SubRange(first, last);
return new RangeCommunitySetElemHalf(range);
} else {
throw convError(CommunitySetElem.class, ctx);
}
}
use of org.batfish.datamodel.SubRange in project batfish by batfish.
the class CiscoControlPlaneExtractor method toPortRanges.
private List<SubRange> toPortRanges(Port_specifierContext ps) {
List<SubRange> ranges = new ArrayList<>();
if (ps.EQ() != null) {
for (PortContext pc : ps.args) {
int port = getPortNumber(pc);
ranges.add(new SubRange(port, port));
}
} else if (ps.GT() != null) {
int port = getPortNumber(ps.arg);
ranges.add(new SubRange(port + 1, 65535));
} else if (ps.NEQ() != null) {
int port = getPortNumber(ps.arg);
SubRange beforeRange = new SubRange(0, port - 1);
SubRange afterRange = new SubRange(port + 1, 65535);
ranges.add(beforeRange);
ranges.add(afterRange);
} else if (ps.LT() != null) {
int port = getPortNumber(ps.arg);
ranges.add(new SubRange(0, port - 1));
} else if (ps.RANGE() != null) {
int lowPort = getPortNumber(ps.arg1);
int highPort = getPortNumber(ps.arg2);
ranges.add(new SubRange(lowPort, highPort));
} else {
throw convError(List.class, ps);
}
return ranges;
}
Aggregations