X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=interface.c;h=2a23984922a10c34fe237a837552fb023ce24d23;hp=522e7fe0c40c888351857e7e6874ea7f8f2d8739;hb=HEAD;hpb=7cc2f10824fb0f7a519a30a77ed75439aab2b6ff diff --git a/interface.c b/interface.c index 522e7fe..2a23984 100644 --- a/interface.c +++ b/interface.c @@ -46,6 +46,7 @@ enum { IFACE_ATTR_DELEGATE, IFACE_ATTR_IP6IFACEID, IFACE_ATTR_FORCE_LINK, + IFACE_ATTR_IP6WEIGHT, IFACE_ATTR_MAX }; @@ -68,6 +69,7 @@ static const struct blobmsg_policy iface_attrs[IFACE_ATTR_MAX] = { [IFACE_ATTR_DELEGATE] = { .name = "delegate", .type = BLOBMSG_TYPE_BOOL }, [IFACE_ATTR_IP6IFACEID] = { .name = "ip6ifaceid", .type = BLOBMSG_TYPE_STRING }, [IFACE_ATTR_FORCE_LINK] = { .name = "force_link", .type = BLOBMSG_TYPE_BOOL }, + [IFACE_ATTR_IP6WEIGHT] = { .name = "ip6weight", .type = BLOBMSG_TYPE_INT32 }, }; const struct uci_blob_param_list interface_attr_list = { @@ -239,6 +241,7 @@ interface_event(struct interface *iface, enum interface_event ev) adev = iface->l3_dev.dev; /* fall through */ case IFEV_DOWN: + case IFEV_UP_FAILED: alias_notify_device(iface->name, adev); break; default: @@ -264,8 +267,16 @@ mark_interface_down(struct interface *iface) iface->link_up_event = false; iface->state = IFS_DOWN; - if (state == IFS_UP) + switch (state) { + case IFS_UP: interface_event(iface, IFEV_DOWN); + break; + case IFS_SETUP: + interface_event(iface, IFEV_UP_FAILED); + break; + default: + break; + } interface_ip_set_enabled(&iface->config_ip, false); interface_ip_set_enabled(&iface->proto_ip, false); interface_ip_flush(&iface->proto_ip); @@ -497,6 +508,7 @@ interface_merge_assignment_data(struct interface *old, struct interface *new) bool changed = (old->assignment_hint != new->assignment_hint || old->assignment_length != new->assignment_length || old->assignment_iface_id_selection != new->assignment_iface_id_selection || + old->assignment_weight != new->assignment_weight || (old->assignment_iface_id_selection == IFID_FIXED && memcmp(&old->assignment_fixed_iface_id, &new->assignment_fixed_iface_id, sizeof(old->assignment_fixed_iface_id))) || @@ -534,6 +546,7 @@ interface_merge_assignment_data(struct interface *old, struct interface *new) old->assignment_length = new->assignment_length; old->assignment_iface_id_selection = new->assignment_iface_id_selection; old->assignment_fixed_iface_id = new->assignment_fixed_iface_id; + old->assignment_weight = new->assignment_weight; interface_refresh_assignments(true); } } @@ -553,6 +566,7 @@ interface_alias_cb(struct interface_user *dep, struct interface *iface, enum int interface_set_available(alias, true); break; case IFEV_DOWN: + case IFEV_UP_FAILED: interface_set_available(alias, false); interface_set_main_dev(alias, NULL); break; @@ -842,6 +856,8 @@ interface_alloc(const char *name, struct blob_attr *config) if ((cur = tb[IFACE_ATTR_IP6CLASS])) interface_add_assignment_classes(iface, cur); + if ((cur = tb[IFACE_ATTR_IP6WEIGHT])) + iface->assignment_weight = blobmsg_get_u32(cur); if ((cur = tb[IFACE_ATTR_IP4TABLE])) { if (!system_resolve_rt_table(blobmsg_data(cur), &iface->ip4table)) @@ -1070,6 +1086,15 @@ interface_set_down(struct interface *iface) return 0; } +int +interface_renew(struct interface *iface) +{ + if (iface->state == IFS_TEARDOWN || iface->state == IFS_DOWN) + return -1; + + return interface_proto_event(iface->proto, PROTO_CMD_RENEW, false); +} + void interface_start_pending(void) {