package org.batfish.representation.juniper;
import java.util.ArrayList;
import java.util.List;
import org.batfish.common.BatfishException;
import org.batfish.datamodel.IpAccessListLine;
import org.batfish.datamodel.IpProtocol;
import org.batfish.datamodel.IpWildcard;
import org.batfish.datamodel.LineAction;
import org.batfish.datamodel.NamedPort;
import org.batfish.datamodel.Prefix;
import org.batfish.datamodel.SubRange;
public enum HostProtocol {
ALL,
BFD,
BGP,
DVMRP,
IGMP,
LDP,
MSDP,
NHRP,
OSPF,
OSPF3,
PGM,
PIM,
RIP,
RIPNG,
ROUTER_DISCOVERY,
RSVP,
SAP,
VRRP;
private boolean _initialized;
private List<IpAccessListLine> _lines;
public List<IpAccessListLine> getLines() {
init();
return _lines;
}
private synchronized void init() {
if (_initialized) {
return;
}
_initialized = true;
_lines = new ArrayList<>();
switch (this) {
case ALL: {
for (HostProtocol other : values()) {
if (other != ALL) {
_lines.addAll(other.getLines());
}
}
break;
}
case BFD: {
IpAccessListLine line = new IpAccessListLine();
_lines.add(line);
line.getIpProtocols().add(IpProtocol.TCP);
line.getIpProtocols().add(IpProtocol.UDP);
line.getDstPorts().add(new SubRange(NamedPort.BFD_CONTROL.number(),
NamedPort.BFD_ECHO.number()));
break;
}
case BGP: {
IpAccessListLine line = new IpAccessListLine();
_lines.add(line);
line.getIpProtocols().add(IpProtocol.TCP);
line.getDstPorts().add(
new SubRange(NamedPort.BGP.number(), NamedPort.BGP.number()));
break;
}
case DVMRP: {
// TODO: DVMRP uses IGMP (an IP Protocol) type 3. need to add support
// for IGMP types in packet headers
IpAccessListLine line = new IpAccessListLine();
_lines.add(line);
line.getIpProtocols().add(IpProtocol.IGMP);
break;
}
case IGMP: {
IpAccessListLine line = new IpAccessListLine();
_lines.add(line);
line.getIpProtocols().add(IpProtocol.IGMP);
break;
}
case LDP: {
IpAccessListLine line = new IpAccessListLine();
_lines.add(line);
line.getIpProtocols().add(IpProtocol.TCP);
line.getIpProtocols().add(IpProtocol.UDP);
line.getDstPorts().add(
new SubRange(NamedPort.LDP.number(), NamedPort.LDP.number()));
break;
}
case MSDP: {
IpAccessListLine line = new IpAccessListLine();
_lines.add(line);
line.getIpProtocols().add(IpProtocol.TCP);
line.getDstPorts().add(
new SubRange(NamedPort.MSDP.number(), NamedPort.MSDP.number()));
break;
}
case NHRP: {
IpAccessListLine line = new IpAccessListLine();
_lines.add(line);
line.getIpProtocols().add(IpProtocol.NARP);
break;
}
case OSPF: {
IpAccessListLine line = new IpAccessListLine();
_lines.add(line);
line.getIpProtocols().add(IpProtocol.OSPF);
break;
}
case OSPF3: {
// TODO: OSPFv3 is an IPV6-encapsulated protocol
break;
}
case PGM: {
IpAccessListLine line = new IpAccessListLine();
_lines.add(line);
line.getIpProtocols().add(IpProtocol.PGM);
break;
}
case PIM: {
IpAccessListLine line = new IpAccessListLine();
_lines.add(line);
line.getIpProtocols().add(IpProtocol.PIM);
break;
}
case RIP: {
IpAccessListLine line = new IpAccessListLine();
_lines.add(line);
line.getIpProtocols().add(IpProtocol.UDP);
line.getDstPorts().add(
new SubRange(NamedPort.RIP.number(), NamedPort.RIP.number()));
break;
}
case RIPNG: {
// TODO: RIPng is an IPV6-encapsulated protocol
break;
}
case ROUTER_DISCOVERY: {
// TODO: ROUTER_DISCOVERY uses ICMP (an IP Protocol) type 9. need to
// add support
// for ICMP types in packet headers
IpAccessListLine line = new IpAccessListLine();
_lines.add(line);
line.getIpProtocols().add(IpProtocol.ICMP);
break;
}
case RSVP: {
IpAccessListLine line = new IpAccessListLine();
_lines.add(line);
line.getIpProtocols().add(IpProtocol.RSVP);
line.getIpProtocols().add(IpProtocol.RSVP_E2E_IGNORE);
break;
}
case SAP: {
IpAccessListLine line = new IpAccessListLine();
_lines.add(line);
line.getIpProtocols().add(IpProtocol.UDP);
line.getDstPorts().add(
new SubRange(NamedPort.SAP.number(), NamedPort.SAP.number()));
line.getDstIps().add(new IpWildcard(new Prefix("224.2.127.285/32")));
break;
}
case VRRP: {
IpAccessListLine line = new IpAccessListLine();
_lines.add(line);
line.getIpProtocols().add(IpProtocol.VRRP);
break;
}
default: {
throw new BatfishException(
"missing definition for host-inbound-traffic protocol: \""
+ name() + "\"");
}
}
for (IpAccessListLine line : _lines) {
line.setAction(LineAction.ACCEPT);
}
}
}