X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;f=interface.c;h=5870422f418a30d68d5246b7168c03c1d7ec3f42;hb=bf4cfc851d422c742e7c38bd552b792194655a7e;hp=b9833d30b5cfaa1f34c4ab3c081e84ad2b88dccf;hpb=c007f08413edc15805c248a8d65f075bb5fb0bdd;p=project%2Fnetifd.git diff --git a/interface.c b/interface.c index b9833d3..5870422 100644 --- a/interface.c +++ b/interface.c @@ -35,6 +35,7 @@ enum { IFACE_ATTR_PEERDNS, IFACE_ATTR_DNS, IFACE_ATTR_DNS_SEARCH, + IFACE_ATTR_DNS_METRIC, IFACE_ATTR_METRIC, IFACE_ATTR_INTERFACE, IFACE_ATTR_IP6ASSIGN, @@ -57,6 +58,7 @@ static const struct blobmsg_policy iface_attrs[IFACE_ATTR_MAX] = { [IFACE_ATTR_METRIC] = { .name = "metric", .type = BLOBMSG_TYPE_INT32 }, [IFACE_ATTR_DNS] = { .name = "dns", .type = BLOBMSG_TYPE_ARRAY }, [IFACE_ATTR_DNS_SEARCH] = { .name = "dns_search", .type = BLOBMSG_TYPE_ARRAY }, + [IFACE_ATTR_DNS_METRIC] = { .name = "dns_metric", .type = BLOBMSG_TYPE_INT32 }, [IFACE_ATTR_INTERFACE] = { .name = "interface", .type = BLOBMSG_TYPE_STRING }, [IFACE_ATTR_IP6ASSIGN] = { .name = "ip6assign", .type = BLOBMSG_TYPE_INT32 }, [IFACE_ATTR_IP6HINT] = { .name = "ip6hint", .type = BLOBMSG_TYPE_STRING }, @@ -414,7 +416,8 @@ interface_l3_dev_cb(struct device_user *dep, enum device_event ev) switch (ev) { case DEV_EVENT_LINK_DOWN: - interface_proto_event(iface->proto, PROTO_CMD_TEARDOWN, false); + if (iface->proto_handler->flags & PROTO_FLAG_TEARDOWN_ON_L3_LINK_DOWN) + interface_proto_event(iface->proto, PROTO_CMD_TEARDOWN, false); break; default: break; @@ -585,6 +588,8 @@ interface_claim_device(struct interface *iface) if (iface->parent_iface.iface) interface_remove_user(&iface->parent_iface); + device_lock(); + if (iface->parent_ifname) { parent = vlist_find(&interfaces, iface->parent_ifname, parent, node); iface->parent_iface.cb = interface_alias_cb; @@ -600,6 +605,8 @@ interface_claim_device(struct interface *iface) if (dev) interface_set_main_dev(iface, dev); + device_unlock(); + if (iface->proto_handler->flags & PROTO_FLAG_INIT_AVAILABLE) interface_set_available(iface, true); } @@ -790,6 +797,9 @@ interface_alloc(const char *name, struct blob_attr *config) if ((cur = tb[IFACE_ATTR_DNS_SEARCH])) interface_add_dns_search_list(&iface->config_ip, cur); + if ((cur = tb[IFACE_ATTR_DNS_METRIC])) + iface->dns_metric = blobmsg_get_u32(cur); + if ((cur = tb[IFACE_ATTR_METRIC])) iface->metric = blobmsg_get_u32(cur); @@ -1180,6 +1190,7 @@ interface_change_config(struct interface *if_old, struct interface *if_new) if_old->parent_ifname = if_new->parent_ifname; if_old->proto_handler = if_new->proto_handler; if_old->force_link = if_new->force_link; + if_old->dns_metric = if_new->dns_metric; if_old->proto_ip.no_dns = if_new->proto_ip.no_dns; interface_replace_dns(&if_old->config_ip, &if_new->config_ip);