summaryrefslogtreecommitdiff
path: root/wireless.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@nbd.name>2021-10-21 11:28:35 +0200
committerFelix Fietkau <nbd@nbd.name>2021-10-21 11:28:38 +0200
commitf78bdec2ed5f4c83d2c93f422c8bd21b68b02517 (patch)
treea7d5bd087671a11fad80f18a80337305ef5de292 /wireless.c
parentc61a1d432b34babe230e49a82712608b07410fc3 (diff)
downloadnetifd-f78bdec2ed5f4c83d2c93f422c8bd21b68b02517.tar.gz
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 <nbd@nbd.name>
Diffstat (limited to 'wireless.c')
-rw-r--r--wireless.c15
1 files 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) {