void netlink_neigh_info::fill(struct rtnl_neigh* neigh) { if (!neigh) return; nl_addr* addr; char addr_str[ADDR_MAX_STR_LEN + 1]; addr = rtnl_neigh_get_dst(neigh); if (addr) { dst_addr_str = nl_addr2str(addr, addr_str, ADDR_MAX_STR_LEN); dst_addr = (unsigned char*)nl_addr_get_binary_addr(addr); dst_addr_len = nl_addr_get_len(addr); } addr = rtnl_neigh_get_lladdr(neigh); if (addr) { lladdr_str = nl_addr2str(addr, addr_str, ADDR_MAX_STR_LEN); lladdr = (unsigned char*)nl_addr_get_binary_addr(addr); lladdr_len = nl_addr_get_len(addr); } //addr_family = rtnl_neigh_get_family(neigh); flags = rtnl_neigh_get_flags(neigh); ifindex = rtnl_neigh_get_ifindex(neigh); state = rtnl_neigh_get_state(neigh); type = rtnl_neigh_get_type(neigh); }
int netlink_wrapper::get_neigh(const char* ipaddr, netlink_neigh_info* new_neigh_info) { auto_unlocker lock(m_cache_lock); nl_logfunc("--->netlink_listener::get_neigh"); nl_object* obj; rtnl_neigh* neigh; char addr_str[256]; BULLSEYE_EXCLUDE_BLOCK_START if (!new_neigh_info) { nl_logerr("Illegal argument. user pass NULL neigh_info to fill"); return -1; } BULLSEYE_EXCLUDE_BLOCK_END obj = nl_cache_get_first(m_cache_neigh); while (obj) { nl_object_get(obj); //Acquire a reference on a cache object. cache won't use/free it until calling to nl_object_put(obj) neigh = (rtnl_neigh*) obj; nl_addr* addr = rtnl_neigh_get_dst(neigh); if (addr) { nl_addr2str(addr, addr_str, 255); if (!strcmp(addr_str, ipaddr)) { new_neigh_info->fill(neigh); nl_object_put(obj); nl_logdbg("neigh - DST_IP:%s LLADDR:%s", addr_str, new_neigh_info->lladdr_str.c_str() ); nl_logfunc("<---netlink_listener::get_neigh"); return 1; } } nl_object_put(obj); obj = nl_cache_get_next(obj); } nl_logfunc("<---netlink_listener::get_neigh"); return 0; }