wireless: add support for not killing processes on teardown
authorFelix Fietkau <nbd@nbd.name>
Mon, 28 Dec 2020 13:42:30 +0000 (14:42 +0100)
committerFelix Fietkau <nbd@nbd.name>
Mon, 28 Dec 2020 13:42:31 +0000 (14:42 +0100)
When using a global hostapd/wpa_supplicant instance, it should not be killed
if a single radio is torn down

Signed-off-by: Felix Fietkau <nbd@nbd.name>
scripts/netifd-wireless.sh
wireless.c
wireless.h

index 72f36d6efad30169f93ffac808b0cb3ff35dbe3f..73bce3d3e2b1170cbbd87f729e56cdc9a9c5752a 100644 (file)
@@ -174,6 +174,7 @@ _wireless_add_process() {
        json_add_int pid "$1"
        json_add_string exe "$exe"
        [ -n "$3" ] && json_add_boolean required 1
+       [ -n "$4" ] && json_add_boolean keep 1
        exe2="$(readlink -f /proc/$1/exe)"
        [ "$exe" != "$exe2" ] && echo "WARNING (wireless_add_process): executable path $exe does not match process $1 path ($exe2)"
        _wdev_notify
index a9917a388f79b736c21d342f0c31819b9e18a0af..818f7c994da8851cefc550793a267f3c758a50fa 100644 (file)
@@ -254,7 +254,7 @@ wireless_process_kill_all(struct wireless_device *wdev, int signal, bool free)
        list_for_each_entry_safe(proc, tmp, &wdev->script_proc, list) {
                bool check = wireless_process_check(proc);
 
-               if (check) {
+               if (check && !proc->keep) {
                        D(WIRELESS, "Wireless device '%s' kill pid %d\n", wdev->name, proc->pid);
                        kill(proc->pid, signal);
                }
@@ -1250,12 +1250,14 @@ wireless_device_add_process(struct wireless_device *wdev, struct blob_attr *data
                PROC_ATTR_PID,
                PROC_ATTR_EXE,
                PROC_ATTR_REQUIRED,
+               PROC_ATTR_KEEP,
                __PROC_ATTR_MAX
        };
        static const struct blobmsg_policy proc_policy[__PROC_ATTR_MAX] = {
                [PROC_ATTR_PID] = { .name = "pid", .type = BLOBMSG_TYPE_INT32 },
                [PROC_ATTR_EXE] = { .name = "exe", .type = BLOBMSG_TYPE_STRING },
                [PROC_ATTR_REQUIRED] = { .name = "required", .type = BLOBMSG_TYPE_BOOL },
+               [PROC_ATTR_KEEP] = { .name = "keep", .type = BLOBMSG_TYPE_BOOL },
        };
        struct blob_attr *tb[__PROC_ATTR_MAX];
        struct wireless_process *proc;
@@ -1282,6 +1284,9 @@ wireless_device_add_process(struct wireless_device *wdev, struct blob_attr *data
        if (tb[PROC_ATTR_REQUIRED])
                proc->required = blobmsg_get_bool(tb[PROC_ATTR_REQUIRED]);
 
+       if (tb[PROC_ATTR_KEEP])
+               proc->keep = blobmsg_get_bool(tb[PROC_ATTR_KEEP]);
+
        D(WIRELESS, "Wireless device '%s' add pid %d\n", wdev->name, proc->pid);
        list_add(&proc->list, &wdev->script_proc);
        uloop_timeout_set(&wdev->script_check, 0);
index 5fedd2056be768eb7c2dcc06078e79f21ee79c17..9a2d512f03de595d9a01ecbc814049b217dbc3e9 100644 (file)
@@ -127,6 +127,7 @@ struct wireless_process {
        int pid;
 
        bool required;
+       bool keep;
 };
 
 void wireless_device_create(struct wireless_driver *drv, const char *name, struct blob_attr *data);