[LEDE-DEV,netifd] interface: add new "ifup-failed" hotplug event

Submitted by Martin Schiller on March 31, 2017, 6:31 a.m.

Details

Message ID 1490941899-2841-1-git-send-email-ms@dev.tdt.de
State New
Headers show

Commit Message

Martin Schiller March 31, 2017, 6:31 a.m.
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 <ms@dev.tdt.de>
---
 interface-event.c | 2 ++
 interface.c       | 4 ++++
 interface.h       | 1 +
 3 files changed, 7 insertions(+)

Patch hide | download patch | download mbox

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 f150f7d..e04d477 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 1472324..c51705c 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,