X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=proto-shell.c;h=77c9b87ad4059d927fa835cce1d2ee4288437add;hp=de1b084c5359da330e3a0304fb9c25a186eae6c2;hb=bb1077aaf9f68dba09224803dd89d7316dc24648;hpb=3d317e90f15eec480b23f4dcddb841c292bef690 diff --git a/proto-shell.c b/proto-shell.c index de1b084..77c9b87 100644 --- a/proto-shell.c +++ b/proto-shell.c @@ -71,6 +71,7 @@ struct proto_shell_state { enum proto_shell_sm sm; bool proto_task_killed; + bool renew_pending; int last_error; @@ -162,11 +163,19 @@ proto_shell_handler(struct interface_proto_state *proto, } else if (cmd == PROTO_CMD_RENEW) { if (!(handler->proto.flags & PROTO_FLAG_RENEW_AVAILABLE)) return 0; + + if (state->script_task.uloop.pending) { + state->renew_pending = true; + return 0; + } + + state->renew_pending = false; action = "renew"; } else { if (state->sm == S_TEARDOWN) return 0; + state->renew_pending = false; if (state->script_task.uloop.pending) { if (state->sm != S_SETUP_ABORT) { uloop_timeout_set(&state->teardown_timeout, 1000); @@ -187,6 +196,7 @@ proto_shell_handler(struct interface_proto_state *proto, uloop_timeout_set(&state->teardown_timeout, 5000); } + D(INTERFACE, "run %s for interface '%s'\n", action, proto->iface->name); config = blobmsg_format_json(state->config, true); if (!config) return -1; @@ -255,6 +265,9 @@ proto_shell_task_finish(struct proto_shell_state *state, if (task == &state->proto_task) proto_shell_handler(&state->proto, PROTO_CMD_TEARDOWN, false); + if (task == &state->script_task && state->renew_pending) + proto_shell_handler(&state->proto, PROTO_CMD_RENEW, + false); break; case S_SETUP_ABORT: @@ -431,7 +444,7 @@ proto_shell_update_link(struct proto_shell_state *state, struct blob_attr *data, return UBUS_STATUS_INVALID_ARGUMENT; up = blobmsg_get_bool(tb[NOTIFY_LINK_UP]); - if (!up) { + if (!up || state->sm == S_TEARDOWN) { state->proto.proto_event(&state->proto, IFPEV_LINK_LOST); return 0; } @@ -445,30 +458,31 @@ proto_shell_update_link(struct proto_shell_state *state, struct blob_attr *data, dev_create = 2; } - if (!tb[NOTIFY_IFNAME]) { - if (!iface->main_dev.dev) - return UBUS_STATUS_INVALID_ARGUMENT; - } else if (!keep || iface->state != IFS_UP) { + if (iface->state != IFS_UP || !iface->l3_dev.dev) keep = false; - devname = blobmsg_data(tb[NOTIFY_IFNAME]); - if (tb[NOTIFY_TUNNEL]) { - dev = proto_shell_create_tunnel(devname, - tb[NOTIFY_TUNNEL]); - if (!dev) - return UBUS_STATUS_INVALID_ARGUMENT; - } else { - dev = device_get(devname, dev_create); - if (!dev) - return UBUS_STATUS_NOT_FOUND; + + if (!keep) { + dev = iface->main_dev.dev; + if (tb[NOTIFY_IFNAME]) { + keep = false; + devname = blobmsg_data(tb[NOTIFY_IFNAME]); + if (tb[NOTIFY_TUNNEL]) + dev = proto_shell_create_tunnel(devname, tb[NOTIFY_TUNNEL]); + else + dev = device_get(devname, dev_create); } + if (!dev) + return UBUS_STATUS_INVALID_ARGUMENT; + interface_set_l3_dev(iface, dev); - device_claim(&iface->l3_dev); + if (device_claim(&iface->l3_dev) < 0) + return UBUS_STATUS_UNKNOWN_ERROR; + device_set_present(dev, true); - } - if (!keep) interface_update_start(iface); + } proto_apply_ip_settings(iface, data, addr_ext);