7b0435a45334c9f268784cf9275446e8fd8a599b
[openwrt/staging/jow.git] / package / network / services / hostapd / patches / 180-BSS-coloring-fix-CCA-with-multiple-BSS.patch
1 From: Felix Fietkau <nbd@nbd.name>
2 Date: Mon, 7 Aug 2023 21:55:57 +0200
3 Subject: [PATCH] BSS coloring: fix CCA with multiple BSS
4
5 Pass bss->ctx instead of drv->ctx in order to avoid multiple reports for
6 the first bss. The first report would otherwise clear hapd->cca_color and
7 subsequent reports would cause the iface bss color to be set to 0.
8 In order to avoid any issues with cancellations, only overwrite the color
9 based on hapd->cca_color if it was actually set.
10
11 Fixes: 33c4dd26cd11 ("BSS coloring: Handle the collision and CCA events coming from the kernel")
12 Signed-off-by: Felix Fietkau <nbd@nbd.name>
13 ---
14
15 --- a/src/ap/drv_callbacks.c
16 +++ b/src/ap/drv_callbacks.c
17 @@ -2260,7 +2260,8 @@ void wpa_supplicant_event(void *ctx, enu
18 case EVENT_CCA_NOTIFY:
19 wpa_printf(MSG_DEBUG, "CCA finished on on %s",
20 hapd->conf->iface);
21 - hapd->iface->conf->he_op.he_bss_color = hapd->cca_color;
22 + if (hapd->cca_color)
23 + hapd->iface->conf->he_op.he_bss_color = hapd->cca_color;
24 hostapd_cleanup_cca_params(hapd);
25 break;
26 #endif /* CONFIG_IEEE80211AX */
27 --- a/src/drivers/driver_nl80211_event.c
28 +++ b/src/drivers/driver_nl80211_event.c
29 @@ -3653,7 +3653,7 @@ static void nl80211_assoc_comeback(struc
30
31 #ifdef CONFIG_IEEE80211AX
32
33 -static void nl80211_obss_color_collision(struct wpa_driver_nl80211_data *drv,
34 +static void nl80211_obss_color_collision(struct i802_bss *bss,
35 struct nlattr *tb[])
36 {
37 union wpa_event_data data;
38 @@ -3667,37 +3667,37 @@ static void nl80211_obss_color_collision
39
40 wpa_printf(MSG_DEBUG, "nl80211: BSS color collision - bitmap %08llx",
41 (long long unsigned int) data.bss_color_collision.bitmap);
42 - wpa_supplicant_event(drv->ctx, EVENT_BSS_COLOR_COLLISION, &data);
43 + wpa_supplicant_event(bss->ctx, EVENT_BSS_COLOR_COLLISION, &data);
44 }
45
46
47 static void
48 -nl80211_color_change_announcement_started(struct wpa_driver_nl80211_data *drv)
49 +nl80211_color_change_announcement_started(struct i802_bss *bss)
50 {
51 union wpa_event_data data = {};
52
53 wpa_printf(MSG_DEBUG, "nl80211: CCA started");
54 - wpa_supplicant_event(drv->ctx, EVENT_CCA_STARTED_NOTIFY, &data);
55 + wpa_supplicant_event(bss->ctx, EVENT_CCA_STARTED_NOTIFY, &data);
56 }
57
58
59 static void
60 -nl80211_color_change_announcement_aborted(struct wpa_driver_nl80211_data *drv)
61 +nl80211_color_change_announcement_aborted(struct i802_bss *bss)
62 {
63 union wpa_event_data data = {};
64
65 wpa_printf(MSG_DEBUG, "nl80211: CCA aborted");
66 - wpa_supplicant_event(drv->ctx, EVENT_CCA_ABORTED_NOTIFY, &data);
67 + wpa_supplicant_event(bss->ctx, EVENT_CCA_ABORTED_NOTIFY, &data);
68 }
69
70
71 static void
72 -nl80211_color_change_announcement_completed(struct wpa_driver_nl80211_data *drv)
73 +nl80211_color_change_announcement_completed(struct i802_bss *bss)
74 {
75 union wpa_event_data data = {};
76
77 wpa_printf(MSG_DEBUG, "nl80211: CCA completed");
78 - wpa_supplicant_event(drv->ctx, EVENT_CCA_NOTIFY, &data);
79 + wpa_supplicant_event(bss->ctx, EVENT_CCA_NOTIFY, &data);
80 }
81
82 #endif /* CONFIG_IEEE80211AX */
83 @@ -3957,16 +3957,16 @@ static void do_process_drv_event(struct
84 break;
85 #ifdef CONFIG_IEEE80211AX
86 case NL80211_CMD_OBSS_COLOR_COLLISION:
87 - nl80211_obss_color_collision(drv, tb);
88 + nl80211_obss_color_collision(bss, tb);
89 break;
90 case NL80211_CMD_COLOR_CHANGE_STARTED:
91 - nl80211_color_change_announcement_started(drv);
92 + nl80211_color_change_announcement_started(bss);
93 break;
94 case NL80211_CMD_COLOR_CHANGE_ABORTED:
95 - nl80211_color_change_announcement_aborted(drv);
96 + nl80211_color_change_announcement_aborted(bss);
97 break;
98 case NL80211_CMD_COLOR_CHANGE_COMPLETED:
99 - nl80211_color_change_announcement_completed(drv);
100 + nl80211_color_change_announcement_completed(bss);
101 break;
102 #endif /* CONFIG_IEEE80211AX */
103 default: