+static int link_set_bridge(Link *link) {
+ _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
+ int r;
+
+ assert(link);
+ assert(link->network);
+
+ if(link->network->cost == 0)
+ return 0;
+
+ r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
+ RTM_SETLINK, link->ifindex);
+ if (r < 0) {
+ log_link_error(link, "Could not allocate RTM_SETLINK message");
+ return r;
+ }
+
+ r = sd_rtnl_message_link_set_family(req, PF_BRIDGE);
+ if (r < 0) {
+ log_link_error(link,
+ "Could not set message family %s", strerror(-r));
+ return r;
+ }
+
+ r = sd_rtnl_message_open_container(req, IFLA_PROTINFO);
+ if (r < 0) {
+ log_link_error(link,
+ "Could not append IFLA_PROTINFO attribute: %s",
+ strerror(-r));
+ return r;
+ }
+
+ if(link->network->cost != 0) {
+ r = sd_rtnl_message_append_u32(req, IFLA_BRPORT_COST, link->network->cost);
+ if (r < 0) {
+ log_link_error(link,
+ "Could not append IFLA_BRPORT_COST attribute: %s",
+ strerror(-r));
+ return r;
+ }
+ }
+
+ r = sd_rtnl_message_close_container(req);
+ if (r < 0) {
+ log_link_error(link,
+ "Could not append IFLA_LINKINFO attribute: %s",
+ strerror(-r));
+ return r;
+ }
+
+ r = sd_rtnl_call_async(link->manager->rtnl, req, link_set_handler, link, 0, NULL);
+ if (r < 0) {
+ log_link_error(link,
+ "Could not send rtnetlink message: %s",
+ strerror(-r));
+ return r;
+ }
+
+ link_ref(link);
+
+ return r;
+}
+