diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c index f6ec4a1e2..8d1e1e072 100644 --- a/wpa_supplicant/config.c +++ b/wpa_supplicant/config.c @@ -1732,6 +1732,7 @@ static const struct parse_data ssid_fields[] = { #endif /* IEEE8021X_EAPOL */ #ifdef CONFIG_MESH { INT_RANGE(mode, 0, 5) }, + { INT_RANGE(no_auto_peer, 0, 1) }, #else /* CONFIG_MESH */ { INT_RANGE(mode, 0, 4) }, #endif /* CONFIG_MESH */ diff --git a/wpa_supplicant/config_ssid.h b/wpa_supplicant/config_ssid.h index 82fa2c5cb..a4910d0e5 100644 --- a/wpa_supplicant/config_ssid.h +++ b/wpa_supplicant/config_ssid.h @@ -669,6 +669,14 @@ struct wpa_ssid { * followed). */ int mac_addr; + + /** + * no_auto_peer - Do not automatically peer with compatible mesh peers + * + * When unset, the reception of a beacon from a another mesh peer in + * this MBSS will trigger a peering attempt. + */ + int no_auto_peer; }; #endif /* CONFIG_SSID_H */ diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c index f2715af55..cb23a454e 100644 --- a/wpa_supplicant/ctrl_iface.c +++ b/wpa_supplicant/ctrl_iface.c @@ -2610,6 +2610,8 @@ static int wpa_supplicant_ctrl_iface_update_network( wpa_config_update_psk(ssid); else if (os_strcmp(name, "priority") == 0) wpa_config_update_prio_list(wpa_s->conf); + else if (os_strcmp(name, "no_auto_peer") == 0) + ssid->no_auto_peer = atoi(value); return 0; } diff --git a/wpa_supplicant/mesh_mpm.c b/wpa_supplicant/mesh_mpm.c index aa28324dd..02bb32c43 100644 --- a/wpa_supplicant/mesh_mpm.c +++ b/wpa_supplicant/mesh_mpm.c @@ -490,6 +490,7 @@ void wpa_mesh_new_mesh_peer(struct wpa_supplicant *wpa_s, const u8 *addr, struct mesh_conf *conf = wpa_s->ifmsh->mconf; struct hostapd_data *data = wpa_s->ifmsh->bss[0]; struct sta_info *sta; + struct wpa_ssid *ssid = wpa_s->current_ssid; int ret = 0; sta = ap_get_sta(data, addr); @@ -532,6 +533,12 @@ void wpa_mesh_new_mesh_peer(struct wpa_supplicant *wpa_s, const u8 *addr, return; } + if (ssid && ssid->no_auto_peer) { + wpa_msg(wpa_s, MSG_INFO, "will not initiate new peer link with " + MACSTR " because of no_auto_peer", MAC2STR(addr)); + return; + } + mesh_mpm_plink_open(wpa_s, sta, PLINK_OPEN_SENT); }