blob: 6abcc5247aa8ba0fc5fbe7df9b9d90aa45b727da [file] [log] [blame]
developer2fd555a2023-07-25 05:48:15 +08001From 203fe076218129d727229a0eb71b6f5fb4c6e8a9 Mon Sep 17 00:00:00 2001
developer03283c02023-04-28 10:49:18 +08002From: Michael Lee <michael-cy.lee@mediatek.com>
3Date: Fri, 28 Apr 2023 10:22:58 +0800
developer2fd555a2023-07-25 05:48:15 +08004Subject: [PATCH 28/35] hostapd: mtk: Avoid setting beacon after wpa_supplicant
5 stop the AP
developer03283c02023-04-28 10:49:18 +08006
7Add a new variable 'stopped_by_supplicant' to indicate the AP
8interface is currently stopped by co-locating STA interface.
9After the STA interface finishes association with some other APs, it
10will reload the co-locating AP interfaces and marks the
11'stopped_by_supplicant' as 0.
12---
developer636e5232023-07-17 10:26:43 +080013 hostapd/ctrl_iface.c | 4 ++++
14 src/ap/beacon.c | 5 ++++-
15 src/ap/bss_load.c | 10 +++++++---
16 src/ap/ctrl_iface_ap.c | 4 +++-
17 src/ap/hostapd.c | 4 +++-
18 src/ap/hostapd.h | 1 +
19 6 files changed, 22 insertions(+), 6 deletions(-)
developer03283c02023-04-28 10:49:18 +080020
21diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c
developer636e5232023-07-17 10:26:43 +080022index 7f91cb6..8c48d8f 100644
developer03283c02023-04-28 10:49:18 +080023--- a/hostapd/ctrl_iface.c
24+++ b/hostapd/ctrl_iface.c
developer636e5232023-07-17 10:26:43 +080025@@ -193,11 +193,15 @@ static int hostapd_ctrl_iface_update(struct hostapd_data *hapd, char *txt)
developer03283c02023-04-28 10:49:18 +080026 {
27 struct hostapd_config * (*config_read_cb)(const char *config_fname);
28 struct hostapd_iface *iface = hapd->iface;
29+ size_t j;
30
31 config_read_cb = iface->interfaces->config_read_cb;
32 iface->interfaces->config_read_cb = hostapd_ctrl_iface_config_read;
33 reload_opts = txt;
34
35+ for (j = 0; j < iface->num_bss; j++)
36+ iface->bss[j]->stopped_by_supplicant = 0;
37+
38 hostapd_reload_config(iface, 0);
39
40 iface->interfaces->config_read_cb = config_read_cb;
41diff --git a/src/ap/beacon.c b/src/ap/beacon.c
developer636e5232023-07-17 10:26:43 +080042index ad56046..c67d08b 100644
developer03283c02023-04-28 10:49:18 +080043--- a/src/ap/beacon.c
44+++ b/src/ap/beacon.c
45@@ -2125,7 +2125,8 @@ int ieee802_11_set_beacon(struct hostapd_data *hapd)
46 continue;
47
48 for (i = 0; i < colocated->num_bss; i++) {
49- if (colocated->bss[i] && colocated->bss[i]->started)
50+ if (colocated->bss[i] && colocated->bss[i]->started &&
51+ !colocated->bss[i]->stopped_by_supplicant)
52 __ieee802_11_set_beacon(colocated->bss[i]);
53 }
54 }
55@@ -2141,6 +2142,7 @@ int ieee802_11_set_beacons(struct hostapd_iface *iface)
56
57 for (i = 0; i < iface->num_bss; i++) {
58 if (iface->bss[i]->started &&
59+ !iface->bss[i]->stopped_by_supplicant &&
60 ieee802_11_set_beacon(iface->bss[i]) < 0)
61 ret = -1;
62 }
63@@ -2157,6 +2159,7 @@ int ieee802_11_update_beacons(struct hostapd_iface *iface)
64
65 for (i = 0; i < iface->num_bss; i++) {
66 if (iface->bss[i]->beacon_set_done && iface->bss[i]->started &&
67+ !iface->bss[i]->stopped_by_supplicant &&
68 ieee802_11_set_beacon(iface->bss[i]) < 0)
69 ret = -1;
70 }
71diff --git a/src/ap/bss_load.c b/src/ap/bss_load.c
developer2fd555a2023-07-25 05:48:15 +080072index 725d3cd..78fd9d8 100644
developer03283c02023-04-28 10:49:18 +080073--- a/src/ap/bss_load.c
74+++ b/src/ap/bss_load.c
developer636e5232023-07-17 10:26:43 +080075@@ -49,6 +49,9 @@ static void update_channel_utilization(void *eloop_data, void *user_data)
76 if (!(hapd->beacon_set_done && hapd->started))
developer03283c02023-04-28 10:49:18 +080077 return;
78
developer636e5232023-07-17 10:26:43 +080079+ if(hapd->stopped_by_supplicant)
80+ goto skip_update;
81+
developer03283c02023-04-28 10:49:18 +080082 err = hostapd_drv_get_survey(hapd, hapd->iface->freq);
developer636e5232023-07-17 10:26:43 +080083 if (err) {
84 wpa_printf(MSG_ERROR, "BSS Load: Failed to get survey data");
85@@ -57,9 +60,6 @@ static void update_channel_utilization(void *eloop_data, void *user_data)
86
87 ieee802_11_set_beacon(hapd);
88
89- if (get_bss_load_update_timeout(hapd, &sec, &usec) < 0)
90- return;
91-
92 if (hapd->conf->chan_util_avg_period) {
93 iface->chan_util_samples_sum += iface->channel_utilization;
94 iface->chan_util_num_sample_periods +=
95@@ -75,6 +75,10 @@ static void update_channel_utilization(void *eloop_data, void *user_data)
96 }
97 }
98
99+skip_update:
100+ if (get_bss_load_update_timeout(hapd, &sec, &usec) < 0)
101+ return;
102+
103 eloop_register_timeout(sec, usec, update_channel_utilization, hapd,
104 NULL);
105 }
developer03283c02023-04-28 10:49:18 +0800106diff --git a/src/ap/ctrl_iface_ap.c b/src/ap/ctrl_iface_ap.c
107index 2fae590..1ad37c5 100644
108--- a/src/ap/ctrl_iface_ap.c
109+++ b/src/ap/ctrl_iface_ap.c
110@@ -951,8 +951,10 @@ int hostapd_ctrl_iface_stop_ap(struct hostapd_data *hapd)
111 struct hostapd_iface *iface = hapd->iface;
112 int i;
113
114- for (i = 0; i < iface->num_bss; i++)
115+ for (i = 0; i < iface->num_bss; i++){
116+ iface->bss[i]->stopped_by_supplicant = 1;
117 hostapd_drv_stop_ap(iface->bss[i]);
118+ }
119
120 return 0;
121 }
122diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c
developer636e5232023-07-17 10:26:43 +0800123index ef0d6db..b372977 100644
developer03283c02023-04-28 10:49:18 +0800124--- a/src/ap/hostapd.c
125+++ b/src/ap/hostapd.c
126@@ -477,6 +477,7 @@ void hostapd_free_hapd_data(struct hostapd_data *hapd)
127 }
128 hapd->started = 0;
129 hapd->beacon_set_done = 0;
130+ hapd->stopped_by_supplicant = 0;
131
132 wpa_printf(MSG_DEBUG, "%s(%s)", __func__, hapd->conf->iface);
133 hostapd_ubus_free_bss(hapd);
134@@ -1257,6 +1258,7 @@ static int hostapd_setup_bss(struct hostapd_data *hapd, int first,
135 return -1;
136 }
137 hapd->started = 1;
138+ hapd->stopped_by_supplicant = 0;
139
140 if (!first || first == -1) {
141 u8 *addr = hapd->own_addr;
developer636e5232023-07-17 10:26:43 +0800142@@ -4015,7 +4017,7 @@ void hostapd_switch_color(struct hostapd_data *hapd, u64 bitmap)
143 {
144 struct os_reltime now;
145
146- if (hapd->cca_in_progress)
147+ if (hapd->cca_in_progress || hapd->stopped_by_supplicant)
148 return;
149
150 if (os_get_reltime(&now))
developer03283c02023-04-28 10:49:18 +0800151diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h
152index 093c28a..3b51050 100644
153--- a/src/ap/hostapd.h
154+++ b/src/ap/hostapd.h
155@@ -190,6 +190,7 @@ struct hostapd_data {
156 unsigned int started:1;
157 unsigned int disabled:1;
158 unsigned int reenable_beacon:1;
159+ unsigned int stopped_by_supplicant:1;
160
161 u8 own_addr[ETH_ALEN];
162
163--
developer2fd555a2023-07-25 05:48:15 +08001642.18.0
developer03283c02023-04-28 10:49:18 +0800165