summaryrefslogtreecommitdiff
path: root/system-linux.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@nbd.name>2020-11-13 12:44:56 +0100
committerFelix Fietkau <nbd@nbd.name>2020-11-13 12:44:58 +0100
commit4a41135750d97e06d1f6d808a9d24bb4b472aca4 (patch)
tree87bb39b251ae50a22d3892a31b2920b1b7d00a29 /system-linux.c
parented11f0c0ffe4fdacfe3f8223049ef8a61d9c53e9 (diff)
downloadnetifd-4a41135750d97e06d1f6d808a9d24bb4b472aca4.tar.gz
system-linux: only overwrite dev->present state on check_state for simple devices
After settting config_pending for vlan devices, a check_state call from device_init_pending was leading to the vlan device present state being overwritten because the linux device didn't exist yet, even though the vlan code had already indicated its present state based on the lower dev. Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'system-linux.c')
-rw-r--r--system-linux.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/system-linux.c b/system-linux.c
index 9188899..78455ae 100644
--- a/system-linux.c
+++ b/system-linux.c
@@ -1743,7 +1743,8 @@ static int cb_if_check_valid(struct nl_msg *msg, void *arg)
if (nh->nlmsg_type != RTM_NEWLINK)
return NL_SKIP;
- device_set_present(chk->dev, ifi->ifi_index > 0 ? true : false);
+ if (chk->dev->type == &simple_device_type)
+ device_set_present(chk->dev, ifi->ifi_index > 0 ? true : false);
device_set_link(chk->dev, ifi->ifi_flags & IFF_LOWER_UP ? true : false);
return NL_OK;
@@ -1760,7 +1761,8 @@ static int cb_if_check_error(struct sockaddr_nl *nla, struct nlmsgerr *err, void
{
struct if_check_data *chk = (struct if_check_data *)arg;
- device_set_present(chk->dev, false);
+ if (chk->dev->type == &simple_device_type)
+ device_set_present(chk->dev, false);
device_set_link(chk->dev, false);
chk->pending = err->error;