use of org.batfish.datamodel.InterfaceAddress in project batfish by batfish.
the class CommonUtil method synthesizeTopology.
public static Topology synthesizeTopology(Map<String, Configuration> configurations) {
SortedSet<Edge> edges = new TreeSet<>();
Map<Prefix, Set<NodeInterfacePair>> prefixInterfaces = new HashMap<>();
configurations.forEach((nodeName, node) -> {
for (Entry<String, Interface> e : node.getInterfaces().entrySet()) {
String ifaceName = e.getKey();
Interface iface = e.getValue();
if (!iface.isLoopback(node.getConfigurationFormat()) && iface.getActive()) {
for (InterfaceAddress address : iface.getAllAddresses()) {
if (address.getNetworkBits() < Prefix.MAX_PREFIX_LENGTH) {
Prefix prefix = address.getPrefix();
NodeInterfacePair pair = new NodeInterfacePair(nodeName, ifaceName);
Set<NodeInterfacePair> interfaceBucket = prefixInterfaces.computeIfAbsent(prefix, k -> new HashSet<>());
interfaceBucket.add(pair);
}
}
}
}
});
for (Set<NodeInterfacePair> bucket : prefixInterfaces.values()) {
for (NodeInterfacePair p1 : bucket) {
for (NodeInterfacePair p2 : bucket) {
if (!p1.equals(p2)) {
Edge edge = new Edge(p1, p2);
edges.add(edge);
}
}
}
}
return new Topology(edges);
}
use of org.batfish.datamodel.InterfaceAddress in project batfish by batfish.
the class CommonUtil method initRemoteIpsecVpns.
public static void initRemoteIpsecVpns(Map<String, Configuration> configurations) {
Map<IpsecVpn, Ip> vpnRemoteIps = new IdentityHashMap<>();
Map<Ip, Set<IpsecVpn>> externalIpVpnMap = new HashMap<>();
SetMultimap<Ip, IpWildcardSetIpSpace> privateIpsByPublicIp = initPrivateIpsByPublicIp(configurations);
for (Configuration c : configurations.values()) {
for (IpsecVpn ipsecVpn : c.getIpsecVpns().values()) {
Ip remoteIp = ipsecVpn.getIkeGateway().getAddress();
vpnRemoteIps.put(ipsecVpn, remoteIp);
Set<InterfaceAddress> externalAddresses = ipsecVpn.getIkeGateway().getExternalInterface().getAllAddresses();
for (InterfaceAddress address : externalAddresses) {
Ip ip = address.getIp();
Set<IpsecVpn> vpnsUsingExternalAddress = externalIpVpnMap.computeIfAbsent(ip, k -> Sets.newIdentityHashSet());
vpnsUsingExternalAddress.add(ipsecVpn);
}
}
}
for (Entry<IpsecVpn, Ip> e : vpnRemoteIps.entrySet()) {
IpsecVpn ipsecVpn = e.getKey();
Ip remoteIp = e.getValue();
Ip localIp = ipsecVpn.getIkeGateway().getLocalIp();
ipsecVpn.initCandidateRemoteVpns();
Set<IpsecVpn> remoteIpsecVpnCandidates = externalIpVpnMap.get(remoteIp);
if (remoteIpsecVpnCandidates != null) {
for (IpsecVpn remoteIpsecVpnCandidate : remoteIpsecVpnCandidates) {
Ip remoteIpsecVpnLocalAddress = remoteIpsecVpnCandidate.getIkeGateway().getLocalIp();
if (remoteIpsecVpnLocalAddress != null && !remoteIpsecVpnLocalAddress.equals(remoteIp)) {
continue;
}
Ip reciprocalRemoteAddress = vpnRemoteIps.get(remoteIpsecVpnCandidate);
Set<IpsecVpn> reciprocalVpns = externalIpVpnMap.get(reciprocalRemoteAddress);
if (reciprocalVpns == null) {
Set<IpWildcardSetIpSpace> privateIpsBehindReciprocalRemoteAddress = privateIpsByPublicIp.get(reciprocalRemoteAddress);
if (privateIpsBehindReciprocalRemoteAddress != null && privateIpsBehindReciprocalRemoteAddress.stream().anyMatch(ipSpace -> ipSpace.containsIp(localIp))) {
reciprocalVpns = externalIpVpnMap.get(localIp);
ipsecVpn.setRemoteIpsecVpn(remoteIpsecVpnCandidate);
ipsecVpn.getCandidateRemoteIpsecVpns().add(remoteIpsecVpnCandidate);
remoteIpsecVpnCandidate.initCandidateRemoteVpns();
remoteIpsecVpnCandidate.setRemoteIpsecVpn(ipsecVpn);
remoteIpsecVpnCandidate.getCandidateRemoteIpsecVpns().add(ipsecVpn);
}
} else if (reciprocalVpns.contains(ipsecVpn)) {
ipsecVpn.setRemoteIpsecVpn(remoteIpsecVpnCandidate);
ipsecVpn.getCandidateRemoteIpsecVpns().add(remoteIpsecVpnCandidate);
}
}
}
}
}
use of org.batfish.datamodel.InterfaceAddress in project batfish by batfish.
the class VirtualRouter method computeBgpAdvertisementsToOutside.
int computeBgpAdvertisementsToOutside(Map<Ip, Set<String>> ipOwners) {
int numAdvertisements = 0;
// If we have no BGP process, nothing to do
if (_vrf.getBgpProcess() == null) {
return numAdvertisements;
}
for (BgpNeighbor neighbor : _vrf.getBgpProcess().getNeighbors().values()) {
Ip localIp = neighbor.getLocalIp();
Set<String> localIpOwners = ipOwners.get(localIp);
String hostname = _c.getHostname();
if (localIpOwners == null || !localIpOwners.contains(hostname)) {
continue;
}
Prefix remotePrefix = neighbor.getPrefix();
if (remotePrefix.getPrefixLength() != Prefix.MAX_PREFIX_LENGTH) {
// Do not support dynamic outside neighbors
continue;
}
Ip remoteIp = remotePrefix.getStartIp();
if (ipOwners.get(remoteIp) != null) {
// Skip if neighbor is not outside the network
continue;
}
int localAs = neighbor.getLocalAs();
int remoteAs = neighbor.getRemoteAs();
String remoteHostname = remoteIp.toString();
String remoteVrfName = Configuration.DEFAULT_VRF_NAME;
RoutingPolicy exportPolicy = _c.getRoutingPolicies().get(neighbor.getExportPolicy());
boolean ebgpSession = localAs != remoteAs;
RoutingProtocol targetProtocol = ebgpSession ? RoutingProtocol.BGP : RoutingProtocol.IBGP;
Set<AbstractRoute> candidateRoutes = Collections.newSetFromMap(new IdentityHashMap<>());
// Add IGP routes
Set<AbstractRoute> activeRoutes = Collections.newSetFromMap(new IdentityHashMap<>());
activeRoutes.addAll(_mainRib.getRoutes());
for (AbstractRoute candidateRoute : activeRoutes) {
if (candidateRoute.getProtocol() != RoutingProtocol.BGP && candidateRoute.getProtocol() != RoutingProtocol.IBGP) {
candidateRoutes.add(candidateRoute);
}
}
/*
* bgp advertise-external
*
* When this is set, add best eBGP path independently of whether
* it is preempted by an iBGP or IGP route. Only applicable to
* iBGP sessions.
*/
boolean advertiseExternal = !ebgpSession && neighbor.getAdvertiseExternal();
if (advertiseExternal) {
candidateRoutes.addAll(_ebgpBestPathRib.getRoutes());
}
/*
* bgp advertise-inactive
*
* When this is set, add best BGP path independently of whether
* it is preempted by an IGP route. Only applicable to eBGP
* sessions.
*/
boolean advertiseInactive = ebgpSession && neighbor.getAdvertiseInactive();
/* Add best bgp paths if they are active, or if advertise-inactive */
for (AbstractRoute candidateRoute : _bgpBestPathRib.getRoutes()) {
if (advertiseInactive || activeRoutes.contains(candidateRoute)) {
candidateRoutes.add(candidateRoute);
}
}
/* Add all bgp paths if additional-paths active for this session */
boolean additionalPaths = !ebgpSession && neighbor.getAdditionalPathsSend() && neighbor.getAdditionalPathsSelectAll();
if (additionalPaths) {
candidateRoutes.addAll(_bgpMultipathRib.getRoutes());
}
for (AbstractRoute route : candidateRoutes) {
BgpRoute.Builder transformedOutgoingRouteBuilder = new BgpRoute.Builder();
RoutingProtocol routeProtocol = route.getProtocol();
boolean routeIsBgp = routeProtocol == RoutingProtocol.IBGP || routeProtocol == RoutingProtocol.BGP;
// originatorIP
Ip originatorIp;
if (!ebgpSession && routeProtocol.equals(RoutingProtocol.IBGP)) {
BgpRoute bgpRoute = (BgpRoute) route;
originatorIp = bgpRoute.getOriginatorIp();
} else {
originatorIp = _vrf.getBgpProcess().getRouterId();
}
transformedOutgoingRouteBuilder.setOriginatorIp(originatorIp);
transformedOutgoingRouteBuilder.setReceivedFromIp(neighbor.getLocalIp());
// for bgp remote route)
if (routeIsBgp) {
BgpRoute bgpRoute = (BgpRoute) route;
transformedOutgoingRouteBuilder.setOriginType(bgpRoute.getOriginType());
if (ebgpSession && bgpRoute.getAsPath().containsAs(neighbor.getRemoteAs()) && !neighbor.getAllowRemoteAsOut()) {
// disable-peer-as-check (getAllowRemoteAsOut) is set
continue;
}
/*
* route reflection: reflect everything received from
* clients to clients and non-clients. reflect everything
* received from non-clients to clients. Do not reflect to
* originator
*/
Ip routeOriginatorIp = bgpRoute.getOriginatorIp();
/*
* iBGP speaker should not send out routes to iBGP neighbor whose router-id is
* same as originator id of advertisement
*/
if (!ebgpSession && routeOriginatorIp != null && remoteIp.equals(routeOriginatorIp)) {
continue;
}
if (routeProtocol.equals(RoutingProtocol.IBGP) && !ebgpSession) {
boolean routeReceivedFromRouteReflectorClient = bgpRoute.getReceivedFromRouteReflectorClient();
boolean sendingToRouteReflectorClient = neighbor.getRouteReflectorClient();
transformedOutgoingRouteBuilder.getClusterList().addAll(bgpRoute.getClusterList());
if (!routeReceivedFromRouteReflectorClient && !sendingToRouteReflectorClient) {
continue;
}
if (sendingToRouteReflectorClient) {
// sender adds its local cluster id to clusterlist of
// new route
transformedOutgoingRouteBuilder.getClusterList().add(neighbor.getClusterId());
}
}
}
// Outgoing communities
if (routeIsBgp) {
BgpRoute bgpRoute = (BgpRoute) route;
transformedOutgoingRouteBuilder.setAsPath(bgpRoute.getAsPath().getAsSets());
if (neighbor.getSendCommunity()) {
transformedOutgoingRouteBuilder.getCommunities().addAll(bgpRoute.getCommunities());
}
}
if (ebgpSession) {
SortedSet<Integer> newAsPathElement = new TreeSet<>();
newAsPathElement.add(localAs);
transformedOutgoingRouteBuilder.getAsPath().add(0, newAsPathElement);
}
// Outgoing protocol
transformedOutgoingRouteBuilder.setProtocol(targetProtocol);
transformedOutgoingRouteBuilder.setNetwork(route.getNetwork());
// Outgoing metric
if (routeIsBgp) {
transformedOutgoingRouteBuilder.setMetric(route.getMetric());
}
// Outgoing nextHopIp
// Outgoing localPreference
Ip nextHopIp;
int localPreference;
if (ebgpSession || !routeIsBgp) {
nextHopIp = neighbor.getLocalIp();
localPreference = BgpRoute.DEFAULT_LOCAL_PREFERENCE;
} else {
nextHopIp = route.getNextHopIp();
BgpRoute ibgpRoute = (BgpRoute) route;
localPreference = ibgpRoute.getLocalPreference();
}
if (nextHopIp.equals(Route.UNSET_ROUTE_NEXT_HOP_IP)) {
// should only happen for ibgp
String nextHopInterface = route.getNextHopInterface();
InterfaceAddress nextHopAddress = _c.getInterfaces().get(nextHopInterface).getAddress();
if (nextHopAddress == null) {
throw new BatfishException("route's nextHopInterface has no address");
}
nextHopIp = nextHopAddress.getIp();
}
transformedOutgoingRouteBuilder.setNextHopIp(nextHopIp);
transformedOutgoingRouteBuilder.setLocalPreference(localPreference);
// Outgoing srcProtocol
transformedOutgoingRouteBuilder.setSrcProtocol(route.getProtocol());
/*
* CREATE OUTGOING ROUTE
*/
boolean acceptOutgoing = exportPolicy.process(route, transformedOutgoingRouteBuilder, remoteIp, remoteVrfName, Direction.OUT);
if (acceptOutgoing) {
BgpRoute transformedOutgoingRoute = transformedOutgoingRouteBuilder.build();
// Record sent advertisement
BgpAdvertisementType sentType = ebgpSession ? BgpAdvertisementType.EBGP_SENT : BgpAdvertisementType.IBGP_SENT;
Ip sentOriginatorIp = transformedOutgoingRoute.getOriginatorIp();
SortedSet<Long> sentClusterList = transformedOutgoingRoute.getClusterList();
AsPath sentAsPath = transformedOutgoingRoute.getAsPath();
SortedSet<Long> sentCommunities = transformedOutgoingRoute.getCommunities();
Prefix sentNetwork = route.getNetwork();
Ip sentNextHopIp;
String sentSrcNode = hostname;
String sentSrcVrf = _vrf.getName();
Ip sentSrcIp = neighbor.getLocalIp();
String sentDstNode = remoteHostname;
String sentDstVrf = remoteVrfName;
Ip sentDstIp = remoteIp;
int sentWeight = -1;
if (ebgpSession) {
sentNextHopIp = nextHopIp;
} else {
sentNextHopIp = transformedOutgoingRoute.getNextHopIp();
}
int sentLocalPreference = transformedOutgoingRoute.getLocalPreference();
long sentMed = transformedOutgoingRoute.getMetric();
OriginType sentOriginType = transformedOutgoingRoute.getOriginType();
RoutingProtocol sentSrcProtocol = targetProtocol;
BgpAdvertisement sentAdvert = new BgpAdvertisement(sentType, sentNetwork, sentNextHopIp, sentSrcNode, sentSrcVrf, sentSrcIp, sentDstNode, sentDstVrf, sentDstIp, sentSrcProtocol, sentOriginType, sentLocalPreference, sentMed, sentOriginatorIp, sentAsPath, sentCommunities, sentClusterList, sentWeight);
_sentBgpAdvertisements.add(sentAdvert);
numAdvertisements++;
}
}
}
return numAdvertisements;
}
use of org.batfish.datamodel.InterfaceAddress in project batfish by batfish.
the class CiscoControlPlaneExtractor method exitFailover_interface.
@Override
public void exitFailover_interface(Failover_interfaceContext ctx) {
String name = ctx.name.getText();
Ip primaryIp = toIp(ctx.pip);
Ip primaryMask = toIp(ctx.pmask);
Ip standbyIp = toIp(ctx.sip);
InterfaceAddress primaryAddress = new InterfaceAddress(primaryIp, primaryMask);
InterfaceAddress standbyAddress = new InterfaceAddress(standbyIp, primaryMask);
_configuration.getFailoverPrimaryAddresses().put(name, primaryAddress);
_configuration.getFailoverStandbyAddresses().put(name, standbyAddress);
}
use of org.batfish.datamodel.InterfaceAddress in project batfish by batfish.
the class CiscoControlPlaneExtractor method exitIf_ip_address.
@Override
public void exitIf_ip_address(If_ip_addressContext ctx) {
InterfaceAddress address;
if (ctx.prefix != null) {
address = new InterfaceAddress(ctx.prefix.getText());
} else {
Ip ip = new Ip(ctx.ip.getText());
Ip mask = new Ip(ctx.subnet.getText());
address = new InterfaceAddress(ip, mask);
}
for (Interface currentInterface : _currentInterfaces) {
currentInterface.setAddress(address);
}
if (ctx.STANDBY() != null) {
Ip standbyIp = toIp(ctx.standby_address);
InterfaceAddress standbyAddress = new InterfaceAddress(standbyIp, address.getNetworkBits());
for (Interface currentInterface : _currentInterfaces) {
currentInterface.setStandbyAddress(standbyAddress);
}
}
}
Aggregations