summaryrefslogtreecommitdiff
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
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>
-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) {