package org.batfish.datamodel; import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.batfish.common.BatfishException; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; public enum RoutingProtocol { AGGREGATE("aggregate"), BGP("bgp"), CONNECTED("connected"), EGP("egp"), IBGP("ibgp"), IGP("igp"), ISIS("isis"), ISIS_EL1("isisEL1"), ISIS_EL2("isisEL2"), ISIS_L1("isisL1"), ISIS_L2("isisL2"), LDP("ldp"), LOCAL("local"), MSDP("msdp"), OSPF("ospf"), OSPF_E1("ospfE1"), OSPF_E2("ospfE2"), OSPF_IA("ospfIA"), OSPF3("ospf3"), RSVP("rsvp"), STATIC("static"); private final static Map<String, RoutingProtocol> _map = buildMap(); private synchronized static Map<String, RoutingProtocol> buildMap() { Map<String, RoutingProtocol> map = new HashMap<>(); for (RoutingProtocol protocol : RoutingProtocol.values()) { String protocolName = protocol._protocolName.toLowerCase(); map.put(protocolName, protocol); } return Collections.unmodifiableMap(map); } @JsonCreator public static RoutingProtocol fromProtocolName(String name) { RoutingProtocol protocol = _map.get(name.toLowerCase()); if (protocol == null) { throw new BatfishException( "No routing protocol with name: \"" + name + "\""); } return protocol; } private final String _protocolName; private RoutingProtocol(String protocolName) { _protocolName = protocolName; } public int getDefaultAdministrativeCost(ConfigurationFormat vendor) { switch (this) { case AGGREGATE: switch (vendor) { case ALCATEL_AOS: break; case ARISTA: break; case AWS_VPC: break; case CISCO_IOS: case CISCO_IOS_XR: case CISCO_NX: case FORCE10: case FOUNDRY: break; case FLAT_JUNIPER: case JUNIPER: case JUNIPER_SWITCH: break; case FLAT_VYOS: case VYOS: break; case EMPTY: case BLADENETWORK: case F5: case HOST: case IGNORED: case IPTABLES: case MRV: case MRV_COMMANDS: case MSS: case UNKNOWN: case VXWORKS: break; default: break; } break; case BGP: switch (vendor) { case ALCATEL_AOS: break; case ARISTA: return 200; case AWS_VPC: return 20; case CISCO_IOS: case CISCO_IOS_XR: case CISCO_NX: case FORCE10: case FOUNDRY: return 20; case FLAT_JUNIPER: case JUNIPER: case JUNIPER_SWITCH: return 170; case FLAT_VYOS: case VYOS: return 20; case EMPTY: case IGNORED: case BLADENETWORK: case F5: case HOST: case IPTABLES: case MRV: case MRV_COMMANDS: case MSS: case UNKNOWN: case VXWORKS: break; } break; case CONNECTED: return 0; case IBGP: switch (vendor) { case ALCATEL_AOS: break; case ARISTA: return 200; case AWS_VPC: return 200; case CISCO_IOS: case CISCO_IOS_XR: case CISCO_NX: case FORCE10: case FOUNDRY: return 200; case FLAT_JUNIPER: case JUNIPER: case JUNIPER_SWITCH: return 170; case FLAT_VYOS: case VYOS: return 200; case EMPTY: case IGNORED: case BLADENETWORK: case F5: case HOST: case IPTABLES: case MRV: case MRV_COMMANDS: case MSS: case UNKNOWN: case VXWORKS: break; } break; case ISIS_EL1: switch (vendor) { case ALCATEL_AOS: break; case ARISTA: break; case AWS_VPC: return 115; case CISCO_IOS: case CISCO_IOS_XR: case CISCO_NX: case FORCE10: case FOUNDRY: return 115; case FLAT_JUNIPER: case JUNIPER: case JUNIPER_SWITCH: return 160; case FLAT_VYOS: case VYOS: return 115; case EMPTY: case IGNORED: case BLADENETWORK: case F5: case HOST: case IPTABLES: case MRV: case MRV_COMMANDS: case MSS: case UNKNOWN: case VXWORKS: break; } break; case ISIS_EL2: switch (vendor) { case ALCATEL_AOS: break; case ARISTA: break; case AWS_VPC: return 115; case CISCO_IOS: case CISCO_IOS_XR: case CISCO_NX: case FORCE10: case FOUNDRY: return 115; case FLAT_JUNIPER: case JUNIPER: case JUNIPER_SWITCH: return 165; case FLAT_VYOS: case VYOS: return 115; case EMPTY: case IGNORED: case F5: case BLADENETWORK: case HOST: case IPTABLES: case MRV: case MRV_COMMANDS: case MSS: case UNKNOWN: case VXWORKS: break; } break; case ISIS_L1: switch (vendor) { case ALCATEL_AOS: break; case ARISTA: break; case AWS_VPC: return 115; case CISCO_IOS: case CISCO_IOS_XR: case CISCO_NX: case FORCE10: case FOUNDRY: return 115; case FLAT_JUNIPER: case JUNIPER: case JUNIPER_SWITCH: return 15; case FLAT_VYOS: case VYOS: return 115; case EMPTY: case IGNORED: case F5: case BLADENETWORK: case HOST: case IPTABLES: case MRV: case MRV_COMMANDS: case MSS: case UNKNOWN: case VXWORKS: break; } break; case ISIS_L2: switch (vendor) { case ALCATEL_AOS: break; case ARISTA: break; case AWS_VPC: return 115; case CISCO_IOS: case CISCO_IOS_XR: case CISCO_NX: case FORCE10: case FOUNDRY: return 115; case FLAT_JUNIPER: case JUNIPER: case JUNIPER_SWITCH: return 18; case FLAT_VYOS: case VYOS: return 115; case EMPTY: case IGNORED: case F5: case BLADENETWORK: case HOST: case IPTABLES: case MRV: case MRV_COMMANDS: case MSS: case UNKNOWN: case VXWORKS: break; } break; case OSPF: switch (vendor) { case ALCATEL_AOS: break; case ARISTA: return 110; case AWS_VPC: return 110; case CISCO_IOS: case CISCO_IOS_XR: case CISCO_NX: case FORCE10: case FOUNDRY: return 110; case FLAT_JUNIPER: case JUNIPER: case JUNIPER_SWITCH: return 10; case FLAT_VYOS: case VYOS: return 110; case EMPTY: case IGNORED: case BLADENETWORK: case F5: case HOST: case IPTABLES: case MRV: case MRV_COMMANDS: case MSS: case UNKNOWN: case VXWORKS: break; } break; case OSPF_E1: switch (vendor) { case ALCATEL_AOS: break; case ARISTA: return 110; case AWS_VPC: return 110; case CISCO_IOS: case CISCO_IOS_XR: case CISCO_NX: case FORCE10: case FOUNDRY: return 110; case FLAT_JUNIPER: case JUNIPER: case JUNIPER_SWITCH: return 150; case FLAT_VYOS: case VYOS: return 110; case EMPTY: case IGNORED: case BLADENETWORK: case F5: case HOST: case IPTABLES: case MRV: case MRV_COMMANDS: case MSS: case UNKNOWN: case VXWORKS: break; } break; case OSPF_E2: switch (vendor) { case ALCATEL_AOS: break; case ARISTA: return 110; case AWS_VPC: return 110; case CISCO_IOS: case CISCO_IOS_XR: case CISCO_NX: case FORCE10: case FOUNDRY: return 110; case FLAT_JUNIPER: case JUNIPER: case JUNIPER_SWITCH: return 150; case FLAT_VYOS: case VYOS: return 110; case EMPTY: case IGNORED: case BLADENETWORK: case F5: case HOST: case IPTABLES: case MRV: case MRV_COMMANDS: case MSS: case UNKNOWN: case VXWORKS: break; } break; case OSPF_IA: switch (vendor) { case ALCATEL_AOS: break; case ARISTA: return 110; case AWS_VPC: return 110; case CISCO_IOS: case CISCO_IOS_XR: case CISCO_NX: case FORCE10: case FOUNDRY: return 110; case FLAT_JUNIPER: case JUNIPER: case JUNIPER_SWITCH: return 10; case FLAT_VYOS: case VYOS: return 110; case EMPTY: case IGNORED: case BLADENETWORK: case F5: case HOST: case IPTABLES: case MRV: case MRV_COMMANDS: case MSS: case UNKNOWN: case VXWORKS: break; } break; case STATIC: return 1; case EGP: case IGP: case ISIS: case LDP: case LOCAL: case MSDP: case OSPF3: case RSVP: default: break; } throw new BatfishException( "Missing default administrative cost for protocol: '" + _protocolName + "' for vendor '" + vendor.toString() + "'"); } public int getSummaryAdministrativeCost(ConfigurationFormat vendor) { switch (this) { case OSPF_IA: switch (vendor) { case ARISTA: case CISCO_IOS: case CISCO_IOS_XR: case CISCO_NX: case FORCE10: case FOUNDRY: return 254; case ALCATEL_AOS: case AWS_VPC: case BLADENETWORK: case EMPTY: case F5: case FLAT_JUNIPER: case FLAT_VYOS: case HOST: case IGNORED: case IPTABLES: case JUNIPER: case JUNIPER_SWITCH: case MRV: case MRV_COMMANDS: case MSS: case UNKNOWN: case VXWORKS: case VYOS: default: throw new BatfishException( "Unsupported vendor for OSPF inter-area summary administrative cost: " + vendor.toString()); } case AGGREGATE: case BGP: case CONNECTED: case EGP: case IBGP: case IGP: case ISIS: case ISIS_EL1: case ISIS_EL2: case ISIS_L1: case ISIS_L2: case LDP: case LOCAL: case MSDP: case OSPF: case OSPF3: case OSPF_E1: case OSPF_E2: case RSVP: case STATIC: default: throw new BatfishException( "Unuspported protocol for summary administrative cost: " + protocolName()); } } @JsonValue public String protocolName() { return _protocolName; } }