BSS coloring: Fix CCA with multiple BSS
Pass bss->ctx instead of drv->ctx in order to avoid multiple reports for
the first bss. The first report would otherwise clear hapd->cca_color and
subsequent reports would cause the iface bss color to be set to 0.
In order to avoid any issues with cancellations, only overwrite the color
based on hapd->cca_color if it was actually set.
Fixes: 33c4dd26cd
("BSS coloring: Handle the collision and CCA events coming from the kernel")
Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
34841cfd9a
commit
a685d84139
2 changed files with 14 additions and 16 deletions
|
@ -2471,7 +2471,8 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
|
||||||
case EVENT_CCA_NOTIFY:
|
case EVENT_CCA_NOTIFY:
|
||||||
wpa_printf(MSG_DEBUG, "CCA finished on on %s",
|
wpa_printf(MSG_DEBUG, "CCA finished on on %s",
|
||||||
hapd->conf->iface);
|
hapd->conf->iface);
|
||||||
hapd->iface->conf->he_op.he_bss_color = hapd->cca_color;
|
if (hapd->cca_color)
|
||||||
|
hapd->iface->conf->he_op.he_bss_color = hapd->cca_color;
|
||||||
hostapd_cleanup_cca_params(hapd);
|
hostapd_cleanup_cca_params(hapd);
|
||||||
break;
|
break;
|
||||||
#endif /* CONFIG_IEEE80211AX */
|
#endif /* CONFIG_IEEE80211AX */
|
||||||
|
|
|
@ -3720,7 +3720,7 @@ static void nl80211_assoc_comeback(struct wpa_driver_nl80211_data *drv,
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211AX
|
#ifdef CONFIG_IEEE80211AX
|
||||||
|
|
||||||
static void nl80211_obss_color_collision(struct wpa_driver_nl80211_data *drv,
|
static void nl80211_obss_color_collision(struct i802_bss *bss,
|
||||||
struct nlattr *tb[])
|
struct nlattr *tb[])
|
||||||
{
|
{
|
||||||
union wpa_event_data data;
|
union wpa_event_data data;
|
||||||
|
@ -3734,37 +3734,34 @@ static void nl80211_obss_color_collision(struct wpa_driver_nl80211_data *drv,
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "nl80211: BSS color collision - bitmap %08llx",
|
wpa_printf(MSG_DEBUG, "nl80211: BSS color collision - bitmap %08llx",
|
||||||
(long long unsigned int) data.bss_color_collision.bitmap);
|
(long long unsigned int) data.bss_color_collision.bitmap);
|
||||||
wpa_supplicant_event(drv->ctx, EVENT_BSS_COLOR_COLLISION, &data);
|
wpa_supplicant_event(bss->ctx, EVENT_BSS_COLOR_COLLISION, &data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void nl80211_color_change_announcement_started(struct i802_bss *bss)
|
||||||
nl80211_color_change_announcement_started(struct wpa_driver_nl80211_data *drv)
|
|
||||||
{
|
{
|
||||||
union wpa_event_data data = {};
|
union wpa_event_data data = {};
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "nl80211: CCA started");
|
wpa_printf(MSG_DEBUG, "nl80211: CCA started");
|
||||||
wpa_supplicant_event(drv->ctx, EVENT_CCA_STARTED_NOTIFY, &data);
|
wpa_supplicant_event(bss->ctx, EVENT_CCA_STARTED_NOTIFY, &data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void nl80211_color_change_announcement_aborted(struct i802_bss *bss)
|
||||||
nl80211_color_change_announcement_aborted(struct wpa_driver_nl80211_data *drv)
|
|
||||||
{
|
{
|
||||||
union wpa_event_data data = {};
|
union wpa_event_data data = {};
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "nl80211: CCA aborted");
|
wpa_printf(MSG_DEBUG, "nl80211: CCA aborted");
|
||||||
wpa_supplicant_event(drv->ctx, EVENT_CCA_ABORTED_NOTIFY, &data);
|
wpa_supplicant_event(bss->ctx, EVENT_CCA_ABORTED_NOTIFY, &data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void nl80211_color_change_announcement_completed(struct i802_bss *bss)
|
||||||
nl80211_color_change_announcement_completed(struct wpa_driver_nl80211_data *drv)
|
|
||||||
{
|
{
|
||||||
union wpa_event_data data = {};
|
union wpa_event_data data = {};
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "nl80211: CCA completed");
|
wpa_printf(MSG_DEBUG, "nl80211: CCA completed");
|
||||||
wpa_supplicant_event(drv->ctx, EVENT_CCA_NOTIFY, &data);
|
wpa_supplicant_event(bss->ctx, EVENT_CCA_NOTIFY, &data);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_IEEE80211AX */
|
#endif /* CONFIG_IEEE80211AX */
|
||||||
|
@ -4024,16 +4021,16 @@ static void do_process_drv_event(struct i802_bss *bss, int cmd,
|
||||||
break;
|
break;
|
||||||
#ifdef CONFIG_IEEE80211AX
|
#ifdef CONFIG_IEEE80211AX
|
||||||
case NL80211_CMD_OBSS_COLOR_COLLISION:
|
case NL80211_CMD_OBSS_COLOR_COLLISION:
|
||||||
nl80211_obss_color_collision(drv, tb);
|
nl80211_obss_color_collision(bss, tb);
|
||||||
break;
|
break;
|
||||||
case NL80211_CMD_COLOR_CHANGE_STARTED:
|
case NL80211_CMD_COLOR_CHANGE_STARTED:
|
||||||
nl80211_color_change_announcement_started(drv);
|
nl80211_color_change_announcement_started(bss);
|
||||||
break;
|
break;
|
||||||
case NL80211_CMD_COLOR_CHANGE_ABORTED:
|
case NL80211_CMD_COLOR_CHANGE_ABORTED:
|
||||||
nl80211_color_change_announcement_aborted(drv);
|
nl80211_color_change_announcement_aborted(bss);
|
||||||
break;
|
break;
|
||||||
case NL80211_CMD_COLOR_CHANGE_COMPLETED:
|
case NL80211_CMD_COLOR_CHANGE_COMPLETED:
|
||||||
nl80211_color_change_announcement_completed(drv);
|
nl80211_color_change_announcement_completed(bss);
|
||||||
break;
|
break;
|
||||||
#endif /* CONFIG_IEEE80211AX */
|
#endif /* CONFIG_IEEE80211AX */
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in a new issue