From f78bdec2ed5f4c83d2c93f422c8bd21b68b02517 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Thu, 21 Oct 2021 11:28:35 +0200 Subject: [PATCH] wireless: fix handling vif attributes on reload with mode change When switching from AP to station mode, some AP specific flags such as proxyarp could become sticky and lead to hairpin being enabled on the sta interface. Fix this by ensuring that vif fields are always properly rewritten Signed-off-by: Felix Fietkau --- wireless.c | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/wireless.c b/wireless.c index b26c4e8..bd847e7 100644 --- a/wireless.c +++ b/wireless.c @@ -804,20 +804,13 @@ wireless_interface_init_config(struct wireless_interface *vif) vif->network = cur; cur = tb[VIF_ATTR_MODE]; - if (cur) - vif->ap_mode = !strcmp(blobmsg_get_string(cur), "ap"); - - if (!vif->ap_mode) - return; + vif->ap_mode = cur && !strcmp(blobmsg_get_string(cur), "ap"); cur = tb[VIF_ATTR_ISOLATE]; - if (cur) - vif->isolate = blobmsg_get_bool(cur); + vif->isolate = vif->ap_mode && cur && blobmsg_get_bool(cur); cur = tb[VIF_ATTR_PROXYARP]; - if (cur) - vif->proxyarp = blobmsg_get_bool(cur); - + vif->proxyarp = vif->ap_mode && cur && blobmsg_get_bool(cur); } /* vlist update call for wireless interface list */ @@ -846,8 +839,6 @@ vif_update(struct vlist_tree *tree, struct vlist_node *node_new, wireless_interface_handle_link(vif_old, NULL, false); free(vif_old->config); vif_old->config = blob_memdup(vif_new->config); - vif_old->isolate = vif_new->isolate; - vif_old->ap_mode = vif_new->ap_mode; wireless_interface_init_config(vif_old); free(vif_new); } else if (vif_new) { -- 2.30.2