Search in sources :

Example 1 with RouteAttribute

use of org.onosproject.routing.fpm.protocol.RouteAttribute in project onos by opennetworkinglab.

the class FpmManager method fpmMessage.

private void fpmMessage(FpmPeer peer, FpmHeader fpmMessage) {
    if (fpmMessage.type() == FpmHeader.FPM_TYPE_KEEPALIVE) {
        return;
    }
    Netlink netlink = fpmMessage.netlink();
    RtNetlink rtNetlink = netlink.rtNetlink();
    if (log.isTraceEnabled()) {
        log.trace("Received FPM message: {}", fpmMessage);
    }
    if (!(rtNetlink.protocol() == RtProtocol.ZEBRA || rtNetlink.protocol() == RtProtocol.UNSPEC)) {
        log.trace("Ignoring non-zebra route");
        return;
    }
    IpAddress dstAddress = null;
    IpAddress gateway = null;
    for (RouteAttribute attribute : rtNetlink.attributes()) {
        if (attribute.type() == RouteAttribute.RTA_DST) {
            RouteAttributeDst raDst = (RouteAttributeDst) attribute;
            dstAddress = raDst.dstAddress();
        } else if (attribute.type() == RouteAttribute.RTA_GATEWAY) {
            RouteAttributeGateway raGateway = (RouteAttributeGateway) attribute;
            gateway = raGateway.gateway();
        }
    }
    if (dstAddress == null) {
        log.error("Dst address missing!");
        return;
    }
    IpPrefix prefix = IpPrefix.valueOf(dstAddress, rtNetlink.dstLength());
    // Ignore routes that we sent.
    if (gateway != null && ((prefix.isIp4() && pdPushNextHopIPv4 != null && pdPushNextHopIPv4.contains(gateway.getIp4Address())) || (prefix.isIp6() && pdPushNextHopIPv6 != null && pdPushNextHopIPv6.contains(gateway.getIp6Address())))) {
        if (routeInDhcpStore(prefix) || routeInRipStore(prefix)) {
            return;
        }
    }
    List<Route> updates = new LinkedList<>();
    List<Route> withdraws = new LinkedList<>();
    Route route;
    switch(netlink.type()) {
        case RTM_NEWROUTE:
            if (gateway == null) {
                // We ignore interface routes with no gateway for now.
                return;
            }
            route = new Route(Route.Source.FPM, prefix, gateway, clusterService.getLocalNode().id());
            Route oldRoute = fpmRoutes.get(peer).put(prefix, route);
            if (oldRoute != null) {
                log.trace("Swapping {} with {}", oldRoute, route);
                withdraws.add(oldRoute);
            }
            updates.add(route);
            break;
        case RTM_DELROUTE:
            Route existing = fpmRoutes.get(peer).remove(prefix);
            if (existing == null) {
                log.warn("Got delete for non-existent prefix");
                return;
            }
            route = new Route(Route.Source.FPM, prefix, existing.nextHop(), clusterService.getLocalNode().id());
            withdraws.add(route);
            break;
        case RTM_GETROUTE:
        default:
            break;
    }
    updateRouteStore(updates, withdraws);
}
Also used : IpPrefix(org.onlab.packet.IpPrefix) Netlink(org.onosproject.routing.fpm.protocol.Netlink) RtNetlink(org.onosproject.routing.fpm.protocol.RtNetlink) RouteAttributeDst(org.onosproject.routing.fpm.protocol.RouteAttributeDst) InterfaceIpAddress(org.onosproject.net.host.InterfaceIpAddress) IpAddress(org.onlab.packet.IpAddress) RouteAttributeGateway(org.onosproject.routing.fpm.protocol.RouteAttributeGateway) RouteAttribute(org.onosproject.routing.fpm.protocol.RouteAttribute) RtNetlink(org.onosproject.routing.fpm.protocol.RtNetlink) Route(org.onosproject.routeservice.Route) LinkedList(java.util.LinkedList)

Aggregations

LinkedList (java.util.LinkedList)1 IpAddress (org.onlab.packet.IpAddress)1 IpPrefix (org.onlab.packet.IpPrefix)1 InterfaceIpAddress (org.onosproject.net.host.InterfaceIpAddress)1 Route (org.onosproject.routeservice.Route)1 Netlink (org.onosproject.routing.fpm.protocol.Netlink)1 RouteAttribute (org.onosproject.routing.fpm.protocol.RouteAttribute)1 RouteAttributeDst (org.onosproject.routing.fpm.protocol.RouteAttributeDst)1 RouteAttributeGateway (org.onosproject.routing.fpm.protocol.RouteAttributeGateway)1 RtNetlink (org.onosproject.routing.fpm.protocol.RtNetlink)1