void NetlinkManager::netlinkRouteUpdated( struct nl_cache* /*cache*/, struct nl_object* obj, int nlOperation, void* data) { NetlinkManager* nlm = static_cast<NetlinkManager*>(data); std::string operation = nlm->nlOperationToStr(nlOperation); if (operation == "unknown") { VLOG(1) << "Ignoring an unknown route update"; return; } VLOG(2) << "Received a " << operation << " netlink route update message"; struct rtnl_route* route = (struct rtnl_route*)obj; if (rtnl_route_get_type(route) != RTN_UNICAST) { VLOG(1) << "Ignoring non-unicast route update"; return; } struct nl_addr* nlDst = rtnl_route_get_dst(route); const uint8_t ipLen = nl_addr_get_prefixlen(nlDst); char strDst[ipLen]; nl_addr2str(nlDst, strDst, ipLen); int numNexthops = rtnl_route_get_nnexthops(route); if (!numNexthops) { VLOG(0) << "Could not find next hop for route update for " << strDst; struct nl_dump_params dumpParams = initDumpParams(); nl_object_dump((nl_object*)route, &dumpParams); return; } std::vector<BinaryAddress> nexthops; { std::lock_guard<std::mutex> lock(nlm->interfacesMutex_); nexthops = getNextHops(route, ipLen, nlm->monitoredInterfaces_); } if (nexthops.empty()) { VLOG(1) << operation << " Route update for " << strDst << " has no valid nexthop"; return; } if (FLAGS_debug) { VLOG(1) << "Got " << operation << " route update for " << strDst; return; } switch (nlOperation) { case NL_ACT_NEW: { nlm->addRouteViaFbossThrift(nlDst, nexthops); break; } case NL_ACT_DEL: { nlm->deleteRouteViaFbossThrift(nlDst); break; } case NL_ACT_CHANGE: { VLOG(2) << "Not updating state due to unimplemented" << "NL_ACT_CHANGE netlink operation"; break; } default: { VLOG(0) << "Not updating state due to unknown netlink operation " << std::to_string(nlOperation); break; /* NL_ACT_??? */ } } return; }
java::util::Collection* rice::pastry::socket::nat::rendezvous::RendezvousLeafSetNHStrategy::getNextHops(::java::lang::Object* destination) { return getNextHops(dynamic_cast< ::org::mpisws::p2p::transport::multiaddress::MultiInetSocketAddress* >(destination)); }