return 1;
}
-int br_vlan_configure(Link *link, uint16_t pvid, uint32_t *br_vid_bitmap, uint32_t *br_untagged_bitmap) {
+int link_set_bridge_vlan(Link *link) {
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
- sd_netlink *rtnl;
- uint16_t flags;
int r;
assert(link);
assert(link->manager);
- assert(br_vid_bitmap);
- assert(br_untagged_bitmap);
assert(link->network);
- /* pvid might not be in br_vid_bitmap yet */
- if (pvid)
- set_bit(pvid, br_vid_bitmap);
+ if (!link->network->use_br_vlan)
+ return 0;
- rtnl = link->manager->rtnl;
+ if (!link->network->bridge && !streq_ptr(link->kind, "bridge"))
+ return 0;
+
+ /* pvid might not be in br_vid_bitmap yet */
+ if (link->network->pvid)
+ set_bit(link->network->pvid, link->network->br_vid_bitmap);
/* create new RTM message */
- r = sd_rtnl_message_new_link(rtnl, &req, RTM_SETLINK, link->ifindex);
+ r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
if (r < 0)
return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
/* master needs flag self */
if (!link->network->bridge) {
- flags = BRIDGE_FLAGS_SELF;
- r = sd_netlink_message_append_data(req, IFLA_BRIDGE_FLAGS, &flags, sizeof(uint16_t));
+ uint16_t flags = BRIDGE_FLAGS_SELF;
+ r = sd_netlink_message_append_data(req, IFLA_BRIDGE_FLAGS, &flags, sizeof(flags));
if (r < 0)
return log_link_error_errno(link, r, "Could not open IFLA_BRIDGE_FLAGS: %m");
}
/* add vlan info */
- r = append_vlan_info_data(link, req, pvid, br_vid_bitmap, br_untagged_bitmap);
+ r = append_vlan_info_data(link, req, link->network->pvid, link->network->br_vid_bitmap, link->network->br_untagged_bitmap);
if (r < 0)
return log_link_error_errno(link, r, "Could not append VLANs: %m");
return log_link_error_errno(link, r, "Could not close IFLA_AF_SPEC container: %m");
/* send message to the kernel */
- r = netlink_call_async(rtnl, NULL, req, set_brvlan_handler,
+ r = netlink_call_async(link->manager->rtnl, NULL, req, set_brvlan_handler,
link_netlink_destroy_callback, link);
if (r < 0)
return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
return 0;
}
-static int link_set_bridge_vlan(Link *link) {
- int r;
-
- r = br_vlan_configure(link, link->network->pvid, link->network->br_vid_bitmap, link->network->br_untagged_bitmap);
- if (r < 0)
- log_link_error_errno(link, r, "Failed to assign VLANs to bridge port: %m");
-
- return r;
-}
-
static int link_set_proxy_arp(Link *link) {
int r;
log_link_error_errno(link, r, "Failed to add to bond master's slave list: %m");
}
- if (link->network->use_br_vlan &&
- (link->network->bridge || streq_ptr("bridge", link->kind))) {
- r = link_set_bridge_vlan(link);
- if (r < 0)
- log_link_error_errno(link, r, "Could not set bridge vlan: %m");
- }
+ r = link_set_bridge_vlan(link);
+ if (r < 0)
+ log_link_error_errno(link, r, "Could not set bridge vlan: %m");
/* Skip setting up addresses until it gets carrier,
or it would try to set addresses twice,