From a7e508b71c1cf3ee9d401510d298195067fba8e5 Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Tue, 19 May 2015 20:38:32 +0800 Subject: [PATCH 1/1] proto-shell: allow running protocols without proto_task. Adds a new config parameter "no-proto-task" for noting that no proto_task will be running for this protocol type. This is required since then change in commit "d0dcf74 proto-shell: retry setup if the proto handler script quits without changing the state or starting a process". The change is mainly for protocols like xl2tpd in which control commands are sent to another daemon xl2tpd to start L2TP negotiation and pppd process who is not under netifd's control as proto_task as is the case in other ppp related protocols like pppoe, pptp, etc. Signed-off-by: Yousong Zhou --- proto-shell.c | 12 ++++++++++-- scripts/netifd-proto.sh | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/proto-shell.c b/proto-shell.c index bc4c658..50f1b5b 100644 --- a/proto-shell.c +++ b/proto-shell.c @@ -44,6 +44,7 @@ struct proto_shell_handler { char *config_buf; char *script_name; bool init_available; + bool no_proto_task; struct uci_blob_param_list config; }; @@ -284,11 +285,12 @@ 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) { + else if (task == &state->script_task) { if (state->renew_pending) proto_shell_handler(&state->proto, PROTO_CMD_RENEW, false); - else if (!state->proto_task.uloop.pending && + else if (!state->handler->no_proto_task && + !state->proto_task.uloop.pending && state->sm == S_SETUP) proto_shell_handler(&state->proto, PROTO_CMD_TEARDOWN, @@ -818,6 +820,12 @@ proto_shell_add_handler(const char *script, const char *name, json_object *obj) if (tmp && json_object_get_boolean(tmp)) handler->proto.flags |= PROTO_FLAG_NODEV; + tmp = json_get_field(obj, "no-proto-task", json_type_boolean); + if (tmp && json_object_get_boolean(tmp)) + handler->no_proto_task = true; + else + handler->no_proto_task = false; + tmp = json_get_field(obj, "available", json_type_boolean); if (tmp && json_object_get_boolean(tmp)) handler->proto.flags |= PROTO_FLAG_INIT_AVAILABLE; diff --git a/scripts/netifd-proto.sh b/scripts/netifd-proto.sh index 95c1bb3..447f0f6 100644 --- a/scripts/netifd-proto.sh +++ b/scripts/netifd-proto.sh @@ -362,6 +362,7 @@ init_proto() { dump) add_protocol() { no_device=0 + no_proto_task=0 available=0 renew_handler=0 @@ -373,6 +374,7 @@ init_proto() { eval "proto_$1_init_config" json_close_array json_add_boolean no-device "$no_device" + json_add_boolean no-proto-task "$no_proto_task" json_add_boolean available "$available" json_add_boolean renew-handler "$renew_handler" json_add_boolean lasterror "$lasterror" -- 2.11.0