aboutsummaryrefslogtreecommitdiffstats
path: root/package/network/services/hostapd/patches/350-nl80211_del_beacon_bss.patch
blob: a14fa03527525c03c07875db44fffdba557b0593 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -2254,13 +2254,18 @@ wpa_driver_nl80211_finish_drv_init(struc
 }
 
 
-static int wpa_driver_nl80211_del_beacon(struct wpa_driver_nl80211_data *drv)
+static int wpa_driver_nl80211_del_beacon(struct i802_bss *bss)
 {
+	struct wpa_driver_nl80211_data *drv = bss->drv;
 	struct nl_msg *msg;
 
+	if (!bss->beacon_set)
+		return 0;
+
+	bss->beacon_set = 0;
 	wpa_printf(MSG_DEBUG, "nl80211: Remove beacon (ifindex=%d)",
-		   drv->ifindex);
-	msg = nl80211_drv_msg(drv, 0, NL80211_CMD_DEL_BEACON);
+		   bss->ifindex);
+	msg = nl80211_bss_msg(bss, 0, NL80211_CMD_DEL_BEACON);
 	return send_and_recv_msgs(drv, msg, NULL, NULL);
 }
 
@@ -2311,7 +2316,7 @@ static void wpa_driver_nl80211_deinit(st
 	nl80211_remove_monitor_interface(drv);
 
 	if (is_ap_interface(drv->nlmode))
-		wpa_driver_nl80211_del_beacon(drv);
+		wpa_driver_nl80211_del_beacon(bss);
 
 	if (drv->eapol_sock >= 0) {
 		eloop_unregister_read_sock(drv->eapol_sock);
@@ -4140,8 +4145,7 @@ static void nl80211_teardown_ap(struct i
 		nl80211_remove_monitor_interface(drv);
 	else
 		nl80211_mgmt_unsubscribe(bss, "AP teardown");
-
-	bss->beacon_set = 0;
+	wpa_driver_nl80211_del_beacon(bss);
 }
 
 
@@ -6066,8 +6070,6 @@ static int wpa_driver_nl80211_if_remove(
 	} else {
 		wpa_printf(MSG_DEBUG, "nl80211: First BSS - reassign context");
 		nl80211_teardown_ap(bss);
-		if (!bss->added_if && !drv->first_bss->next)
-			wpa_driver_nl80211_del_beacon(drv);
 		nl80211_destroy_bss(bss);
 		if (!bss->added_if)
 			i802_set_iface_flags(bss, 0);
@@ -6389,8 +6391,7 @@ static int wpa_driver_nl80211_deinit_ap(
 	struct wpa_driver_nl80211_data *drv = bss->drv;
 	if (!is_ap_interface(drv->nlmode))
 		return -1;
-	wpa_driver_nl80211_del_beacon(drv);
-	bss->beacon_set = 0;
+	wpa_driver_nl80211_del_beacon(bss);
 
 	/*
 	 * If the P2P GO interface was dynamically added, then it is
@@ -6409,8 +6410,7 @@ static int wpa_driver_nl80211_stop_ap(vo
 	struct wpa_driver_nl80211_data *drv = bss->drv;
 	if (!is_ap_interface(drv->nlmode))
 		return -1;
-	wpa_driver_nl80211_del_beacon(drv);
-	bss->beacon_set = 0;
+	wpa_driver_nl80211_del_beacon(bss);
 	return 0;
 }