From: Felix Fietkau Date: Sun, 11 Sep 2011 19:38:11 +0000 (+0200) Subject: add a protocol event for link loss X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=commitdiff_plain;h=13cb667dc2c4131663e728bfc4bf3de465d52b20 add a protocol event for link loss --- diff --git a/interface.c b/interface.c index 72ecf4d..a5675f7 100644 --- a/interface.c +++ b/interface.c @@ -185,6 +185,13 @@ interface_proto_cb(struct interface_proto_state *state, enum interface_proto_eve mark_interface_down(iface); break; + case IFPEV_LINK_LOST: + if (iface->state != IFS_UP) + return; + + iface->state = IFS_SETUP; + interface_event(iface, IFEV_DOWN); + break; } } diff --git a/proto-shell.c b/proto-shell.c index 1481b66..bb42c98 100644 --- a/proto-shell.c +++ b/proto-shell.c @@ -60,15 +60,6 @@ run_script(const char **argv, struct uloop_process *proc) return 0; } -static void -proto_shell_set_down(struct proto_shell_state *state) -{ - if (!state->l3_dev.dev) - return; - - device_remove_user(&state->l3_dev); -} - static int proto_shell_handler(struct interface_proto_state *proto, enum interface_proto_cmd cmd, bool force) @@ -145,8 +136,8 @@ proto_shell_teardown_cb(struct uloop_process *p, int ret) struct proto_shell_state *state; state = container_of(p, struct proto_shell_state, teardown_task); - proto_shell_set_down(state); state->proto.proto_event(&state->proto, IFPEV_DOWN); + device_remove_user(&state->l3_dev); } static void @@ -194,7 +185,7 @@ proto_shell_notify(struct interface_proto_state *proto, struct blob_attr *attr) state->proto.iface->l3_dev = &state->l3_dev; state->proto.proto_event(&state->proto, IFPEV_UP); } else { - proto_shell_set_down(state); + state->proto.proto_event(&state->proto, IFPEV_LINK_LOST); } return 0; diff --git a/proto.h b/proto.h index c1b97b2..b4a1d04 100644 --- a/proto.h +++ b/proto.h @@ -8,6 +8,7 @@ struct proto_handler; enum interface_proto_event { IFPEV_UP, IFPEV_DOWN, + IFPEV_LINK_LOST, }; enum interface_proto_cmd {