summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYousong Zhou <yszhou4tech@gmail.com>2015-05-19 20:38:32 +0800
committerFelix Fietkau <nbd@openwrt.org>2015-05-23 16:44:46 +0200
commita7e508b71c1cf3ee9d401510d298195067fba8e5 (patch)
treecb21a1d67fb7567d6dbd74db5a311e6abe7c4167
parenta85176bb5153b2834f7723bce1ab2a608dc834ea (diff)
downloadnetifd-a7e508b71c1cf3ee9d401510d298195067fba8e5.tar.gz
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 <yszhou4tech@gmail.com>
-rw-r--r--proto-shell.c12
-rw-r--r--scripts/netifd-proto.sh2
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"