From: John Crispin <john@xxxxxxxxxxx> Add helper functions to retrieve the context for the transmitting interfaces of the MBSSID set and the index of a given BSS. Set device parameters - BSS index, transmitting BSS and total number of BSS in the MBSSID set. Signed-off-by: John Crispin <john@xxxxxxxxxxx> Co-developed-by: Aloka Dixit <quic_alokad@xxxxxxxxxxx> Signed-off-by: Aloka Dixit <quic_alokad@xxxxxxxxxxx> --- src/ap/beacon.c | 33 +++++++++++++++++++++++++++++++-- src/ap/hostapd.c | 23 +++++++++++++++++++++++ src/ap/hostapd.h | 2 ++ src/drivers/driver.h | 15 +++++++++++++++ 4 files changed, 71 insertions(+), 2 deletions(-) diff --git a/src/ap/beacon.c b/src/ap/beacon.c index 8cd1c417043e..1d70cb2ead2c 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -428,6 +428,32 @@ static u8 * hostapd_eid_supported_op_classes(struct hostapd_data *hapd, u8 *eid) } +static void hostapd_set_mbssid_beacon(struct hostapd_data *hapd, + struct wpa_driver_ap_params *params) +{ + struct hostapd_iface *iface = hapd->iface; + + if (!iface->conf->mbssid || iface->num_bss == 1) + return; + + if (!iface->mbssid_max_interfaces) { + wpa_printf(MSG_DEBUG, + "MBSSID: Driver doesn't support multi-BSSID advertisements"); + return; + } else if (iface->num_bss > iface->mbssid_max_interfaces) { + wpa_printf(MSG_DEBUG, + "MBSSID: Driver supports maximum %u interfaces for multi-BSSID advertisements", + iface->mbssid_max_interfaces); + return; + } + + params->mbssid_tx_iface = hostapd_mbssid_get_tx_bss(hapd)->conf->iface; + params->mbssid_index = hostapd_mbssid_get_bss_index(hapd); + params->mbssid_count = iface->num_bss; + return; +} + + static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd, const struct ieee80211_mgmt *req, int is_p2p, size_t *resp_len) @@ -1149,7 +1175,6 @@ static u8 * hostapd_probe_resp_offloads(struct hostapd_data *hapd, /* Generate a Probe Response template for the non-P2P case */ return hostapd_gen_probe_resp(hapd, NULL, 0, resp_len); } - #endif /* NEED_AP_MLME */ @@ -1432,7 +1457,11 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd, #ifdef NEED_AP_MLME u16 capab_info; u8 *pos, *tailpos, *tailend, *csa_pos; +#endif /* NEED_AP_MLME */ + + os_memset(params, 0, sizeof(*params)); +#ifdef NEED_AP_MLME #define BEACON_HEAD_BUF_SIZE 256 #define BEACON_TAIL_BUF_SIZE 512 head = os_zalloc(BEACON_HEAD_BUF_SIZE); @@ -1556,6 +1585,7 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd, tailpos = hostapd_eid_supported_op_classes(hapd, tailpos); tailpos = hostapd_eid_ht_capabilities(hapd, tailpos); tailpos = hostapd_eid_ht_operation(hapd, tailpos); + hostapd_set_mbssid_beacon(hapd, params); tailpos = hostapd_eid_ext_capab(hapd, tailpos); @@ -1662,7 +1692,6 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd, resp = hostapd_probe_resp_offloads(hapd, &resp_len); #endif /* NEED_AP_MLME */ - os_memset(params, 0, sizeof(*params)); params->head = (u8 *) head; params->head_len = head_len; params->tail = tail; diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c index 14b608e67c23..9ca4ffa31d94 100644 --- a/src/ap/hostapd.c +++ b/src/ap/hostapd.c @@ -87,6 +87,29 @@ int hostapd_for_each_interface(struct hapd_interfaces *interfaces, } +struct hostapd_data * hostapd_mbssid_get_tx_bss(struct hostapd_data *hapd) +{ + if (hapd->iconf->mbssid) + return hapd->iface->bss[0]; + + return hapd; +} + + +int hostapd_mbssid_get_bss_index(struct hostapd_data *hapd) +{ + if (hapd->iconf->mbssid) { + size_t i; + + for (i = 1; i < hapd->iface->num_bss; i++) + if (hapd->iface->bss[i] == hapd) + return i; + } + + return 0; +} + + void hostapd_reconfig_encryption(struct hostapd_data *hapd) { if (hapd->wpa_auth) diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h index def0971cc11f..4e9046efa879 100644 --- a/src/ap/hostapd.h +++ b/src/ap/hostapd.h @@ -691,6 +691,8 @@ struct hostapd_data * hostapd_get_iface(struct hapd_interfaces *interfaces, void hostapd_event_sta_opmode_changed(struct hostapd_data *hapd, const u8 *addr, enum smps_mode smps_mode, enum chan_width chan_width, u8 rx_nss); +struct hostapd_data * hostapd_mbssid_get_tx_bss(struct hostapd_data *hapd); +int hostapd_mbssid_get_bss_index(struct hostapd_data *hapd); #ifdef CONFIG_FST void fst_hostapd_fill_iface_obj(struct hostapd_data *hapd, diff --git a/src/drivers/driver.h b/src/drivers/driver.h index cf0f2180e704..0527f120287b 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -1582,6 +1582,21 @@ struct wpa_driver_ap_params { * Unsolicited broadcast Probe Response template length */ size_t unsol_bcast_probe_resp_tmpl_len; + + /** + * mbssid_tx_iface - Transmitting interface of the set + */ + const char *mbssid_tx_iface; + + /** + * mbssid_index - The index of this BSS in the group + */ + unsigned int mbssid_index; + + /** + * mbssid_count - Total number of BSSs in the group + */ + unsigned int mbssid_count; }; struct wpa_driver_mesh_bss_params { -- 2.31.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap