From: Martin Schiller Date: Fri, 31 Mar 2017 06:31:39 +0000 (+0200) Subject: interface: add new "ifup-failed" hotplug event X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=commitdiff_plain;h=08d8f476b6aa0d701b20cda5f706db853ade1911 interface: add new "ifup-failed" hotplug event This hook makes it possible to do some helper work in hotplug scripts when a connection is not established successfully. example: try several username/passwords from a pool to establish a pppoe or wwan connection by replacing the configured values of the connection in a hotplug script. Signed-off-by: Martin Schiller --- diff --git a/interface-event.c b/interface-event.c index 4976c2c..86e8f54 100644 --- a/interface-event.c +++ b/interface-event.c @@ -33,6 +33,7 @@ static struct uloop_process task = { static const char * const eventnames[] = { [IFEV_DOWN] = "ifdown", [IFEV_UP] = "ifup", + [IFEV_UP_FAILED] = "ifup-failed", [IFEV_UPDATE] = "ifupdate", [IFEV_FREE] = "free", [IFEV_RELOAD] = "reload", @@ -191,6 +192,7 @@ static void interface_event_cb(struct interface_user *dep, struct interface *ifa switch (ev) { case IFEV_LINK_UP: case IFEV_UP: + case IFEV_UP_FAILED: case IFEV_UPDATE: case IFEV_DOWN: interface_queue_event(iface, ev); diff --git a/interface.c b/interface.c index 593b049..900a523 100644 --- a/interface.c +++ b/interface.c @@ -241,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: @@ -268,6 +269,8 @@ mark_interface_down(struct interface *iface) iface->state = IFS_DOWN; if (state == IFS_UP) interface_event(iface, IFEV_DOWN); + else + interface_event(iface, IFEV_UP_FAILED); interface_ip_set_enabled(&iface->config_ip, false); interface_ip_set_enabled(&iface->proto_ip, false); interface_ip_flush(&iface->proto_ip); @@ -557,6 +560,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; diff --git a/interface.h b/interface.h index d35fd98..0e58f69 100644 --- a/interface.h +++ b/interface.h @@ -23,6 +23,7 @@ struct interface_proto_state; enum interface_event { IFEV_DOWN, IFEV_UP, + IFEV_UP_FAILED, IFEV_UPDATE, IFEV_FREE, IFEV_RELOAD,