diff --git a/src/netlink/cnetlink.cc b/src/netlink/cnetlink.cc index bfe1d96a..62b4aba4 100644 --- a/src/netlink/cnetlink.cc +++ b/src/netlink/cnetlink.cc @@ -1489,7 +1489,7 @@ void cnetlink::link_created(rtnl_link *link) noexcept { << rtnl_link_get_name(link); if (rtnl_link_is_vxlan(base_link) && !new_bridge) - vxlan->create_endpoint(base_link); + vxlan->create_endpoint(base_link, link); vlan->disable_vlans(link); bridge->add_interface(link); diff --git a/src/netlink/nl_vxlan.cc b/src/netlink/nl_vxlan.cc index b622cb59..ba1d82a1 100644 --- a/src/netlink/nl_vxlan.cc +++ b/src/netlink/nl_vxlan.cc @@ -260,8 +260,10 @@ void nl_vxlan::register_bridge(nl_bridge *bridge) { if (rtnl_link_get_master(link) == 0) continue; + auto br_link = nl->get_link(rtnl_link_get_ifindex(link), AF_BRIDGE); + // XXX TODO maybe before cont. - rv = create_endpoint(link); + rv = create_endpoint(link, br_link); if (rv < 0) { LOG(ERROR) << __FUNCTION__ << ": failed (rv=" << rv << ") to create create endpoint " << link; @@ -529,7 +531,7 @@ int nl_vxlan::remove_vni(rtnl_link *link) { return 0; } -int nl_vxlan::create_endpoint(rtnl_link *vxlan_link) { +int nl_vxlan::create_endpoint(rtnl_link *vxlan_link, rtnl_link *br_link) { assert(vxlan_link); if (!rtnl_link_is_vxlan(vxlan_link)) { @@ -555,9 +557,7 @@ int nl_vxlan::create_endpoint(rtnl_link *vxlan_link) { return -ENOTSUP; } - // XXX get br_link if master exists - - create_endpoint(vxlan_link, nullptr, group_.get()); + create_endpoint(vxlan_link, br_link, group_.get()); return 0; } diff --git a/src/netlink/nl_vxlan.h b/src/netlink/nl_vxlan.h index 3f83f32f..07fa0283 100644 --- a/src/netlink/nl_vxlan.h +++ b/src/netlink/nl_vxlan.h @@ -54,7 +54,7 @@ class nl_vxlan : public net_reachable, nh_reachable { int delete_access_port(rtnl_link *br_link, uint32_t pport_no, uint16_t vid, bool wipe_l2_addresses); - int create_endpoint(rtnl_link *vxlan_link); + int create_endpoint(rtnl_link *vxlan_link, rtnl_link *br_link); int delete_endpoint(rtnl_link *vxlan_link); private: