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); }
void nl_bridge::add_neigh_to_fdb(rtnl_neigh *neigh) { assert(sw); assert(neigh); uint32_t port = nl->get_port_id(rtnl_neigh_get_ifindex(neigh)); if (port == 0) { VLOG(1) << __FUNCTION__ << ": unknown port for neigh " << OBJ_CAST(neigh); return; } nl_addr *mac = rtnl_neigh_get_lladdr(neigh); int vlan = rtnl_neigh_get_vlan(neigh); bool permanent = true; // for sure this is master (sw bridged) if (rtnl_neigh_get_master(neigh) && !(rtnl_neigh_get_flags(neigh) & NTF_MASTER)) { rtnl_neigh_set_flags(neigh, NTF_MASTER); } // check if entry already exists in cache if (is_mac_in_l2_cache(neigh)) { permanent = false; } rofl::caddress_ll _mac((uint8_t *)nl_addr_get_binary_addr(mac), nl_addr_get_len(mac)); LOG(INFO) << __FUNCTION__ << ": add mac=" << _mac << " to bridge " << rtnl_link_get_name(bridge) << " on port=" << port << " vlan=" << (unsigned)vlan << ", permanent=" << permanent; LOG(INFO) << __FUNCTION__ << ": object: " << OBJ_CAST(neigh); sw->l2_addr_add(port, vlan, _mac, true, permanent); }