/* Even if the link is not managed by networkd, honor IFF_SLAVE flag. */
return true;
- if (!link->enslaved_raw)
- return false;
-
if (!link->network)
return false;
- if (link->network->bridge)
- /* TODO: support the case when link is not managed by networkd. */
+ if (link->master_ifindex > 0 && link->network->bridge)
return true;
+ if (!link->enslaved_raw)
+ return false;
+
+ /* TODO: add conditions for other netdevs. */
+
return false;
}
? ((old & flag) ? (" -" string) : (" +" string)) \
: "")
-static int link_update_flags(Link *link, sd_netlink_message *m) {
+static int link_update_flags(Link *link, sd_netlink_message *m, bool force_update_operstate) {
unsigned flags, unknown_flags_added, unknown_flags_removed, unknown_flags;
uint8_t operstate;
int r;
the state was unchanged */
operstate = link->kernel_operstate;
- if ((link->flags == flags) && (link->kernel_operstate == operstate))
+ if (!force_update_operstate && (link->flags == flags) && (link->kernel_operstate == operstate))
return 0;
if (link->flags != flags) {
if (r < 0)
return r;
- r = link_update_flags(link, message);
+ r = link_update_flags(link, message, false);
if (r < 0)
return r;
const char *ifname;
uint32_t mtu;
bool had_carrier, carrier_gained, carrier_lost;
- int r;
+ int old_master, r;
assert(link);
assert(link->ifname);
}
}
+ old_master = link->master_ifindex;
+ (void) sd_netlink_message_read_u32(m, IFLA_MASTER, (uint32_t *) &link->master_ifindex);
+
had_carrier = link_has_carrier(link);
- r = link_update_flags(link, m);
+ r = link_update_flags(link, m, old_master != link->master_ifindex);
if (r < 0)
return r;