X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=system-linux.c;h=b190ec64b35a5d15c8209adcfdfe43e5dcd6824d;hp=27c0f1e3416baaece91579dd32cf66daf87ce805;hb=5a0328c7b039a90e988aaab8e03eb8ce5508d62b;hpb=bb99e8017b5b99e5ccd2c05c11b516b6e629ab20 diff --git a/system-linux.c b/system-linux.c index 27c0f1e..b190ec6 100644 --- a/system-linux.c +++ b/system-linux.c @@ -424,7 +424,7 @@ static int cb_rtnl_event(struct nl_msg *msg, void *arg) goto out; struct device *dev = device_get(nla_data(nla[IFLA_IFNAME]), false); - if (!dev || dev->type->keep_link_status) + if (!dev) goto out; if (!system_get_dev_sysctl("/sys/class/net/%s/carrier", dev->ifname, buf, sizeof(buf))) @@ -1225,6 +1225,7 @@ int system_if_up(struct device *dev) { system_if_get_settings(dev, &dev->orig_settings); /* Only keep orig settings based on what needs to be set */ + dev->orig_settings.valid_flags = dev->orig_settings.flags; dev->orig_settings.flags &= dev->settings.flags; system_if_apply_settings(dev, &dev->settings, dev->settings.flags); return system_if_flags(dev->ifname, IFF_UP, 0); @@ -1295,10 +1296,13 @@ int system_if_check(struct device *dev) int ret = 1; msg = nlmsg_alloc_simple(RTM_GETLINK, 0); - if (!msg || nlmsg_append(msg, &ifi, sizeof(ifi), 0) || - nla_put_string(msg, IFLA_IFNAME, dev->ifname)) + if (!msg) goto out; + if (nlmsg_append(msg, &ifi, sizeof(ifi), 0) || + nla_put_string(msg, IFLA_IFNAME, dev->ifname)) + goto free; + nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_if_check_valid, &chk); nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, cb_if_check_ack, &chk); nl_cb_err(cb, NL_CB_CUSTOM, cb_if_check_error, &chk); @@ -1307,9 +1311,10 @@ int system_if_check(struct device *dev) while (chk.pending > 0) nl_recvmsgs(sock_rtnl, cb); - nlmsg_free(msg); ret = chk.pending; +free: + nlmsg_free(msg); out: nl_cb_put(cb); return ret;