wifi: use NMEtherAddr struct for bssid

This commit is contained in:
Thomas Haller 2020-11-19 11:00:08 +01:00
parent 07a60e859c
commit 42156b6010
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
14 changed files with 83 additions and 81 deletions

View file

@ -70,7 +70,7 @@ typedef struct {
gint64 last_scan;
uint32_t ap_id;
guint32 rate;
uint8_t current_ap_bssid[ETH_ALEN];
NMEtherAddr current_ap_bssid;
GDBusMethodInvocation * pending_agent_request;
NMActiveConnection * assumed_ac;
guint assumed_ac_timeout;
@ -174,7 +174,7 @@ set_current_ap(NMDeviceIwd *self, NMWifiAP *new_ap, gboolean recheck_available_c
g_object_unref(old_ap);
}
memset(priv->current_ap_bssid, 0, ETH_ALEN);
memset(&priv->current_ap_bssid, 0, ETH_ALEN);
_notify(self, PROP_ACTIVE_ACCESS_POINT);
_notify(self, PROP_MODE);
}
@ -227,7 +227,6 @@ ap_from_network(NMDeviceIwd *self,
const char * name;
const char * type;
uint32_t ap_id;
uint8_t bssid[6];
gs_unref_bytes GBytes *ssid = NULL;
NMWifiAP * ap;
NMSupplicantBssInfo bss_info;
@ -256,13 +255,7 @@ ap_from_network(NMDeviceIwd *self,
* already does that. We fake the BSSIDs as they don't play any
* role either.
*/
ap_id = priv->ap_id++;
bssid[0] = 0x00;
bssid[1] = 0x01;
bssid[2] = 0x02;
bssid[3] = ap_id >> 16;
bssid[4] = ap_id >> 8;
bssid[5] = ap_id;
ap_id = priv->ap_id++;
ssid = g_bytes_new(name, NM_MIN(32u, strlen(name)));
@ -276,8 +269,8 @@ ap_from_network(NMDeviceIwd *self,
.signal_percent = nm_wifi_utils_level_to_quality(signal / 100),
.frequency = 2417,
.max_rate = 65000,
.bssid = NM_ETHER_ADDR_INIT(0x00, 0x01, 0x02, ap_id >> 16, ap_id >> 8, ap_id),
};
memcpy(bss_info.bssid, bssid, sizeof(bssid));
ap = nm_wifi_ap_new_from_properties(&bss_info);
@ -423,7 +416,7 @@ periodic_update(NMDeviceIwd *self)
int ifindex;
guint32 new_rate;
int percent;
guint8 bssid[ETH_ALEN];
NMEtherAddr bssid;
gboolean ap_changed = FALSE;
NMPlatform * platform;
@ -436,7 +429,7 @@ periodic_update(NMDeviceIwd *self)
/* TODO: obtain quality through the net.connman.iwd.SignalLevelAgent API.
* For now we're waking up for the rate/BSSID updates anyway.
*/
if (!nm_platform_wifi_get_station(platform, ifindex, bssid, &percent, &new_rate)) {
if (!nm_platform_wifi_get_station(platform, ifindex, &bssid, &percent, &new_rate)) {
_LOGD(LOGD_WIFI, "BSSID / quality / rate platform query failed");
return;
}
@ -452,10 +445,10 @@ periodic_update(NMDeviceIwd *self)
_notify(self, PROP_BITRATE);
}
if (nm_ethernet_address_is_valid(bssid, ETH_ALEN)
&& memcmp(bssid, priv->current_ap_bssid, ETH_ALEN)) {
memcpy(priv->current_ap_bssid, bssid, ETH_ALEN);
ap_changed |= nm_wifi_ap_set_address_bin(priv->current_ap, bssid);
if (nm_ethernet_address_is_valid(&bssid, ETH_ALEN)
&& !nm_ether_addr_equal(&bssid, &priv->current_ap_bssid)) {
priv->current_ap_bssid = bssid;
ap_changed |= nm_wifi_ap_set_address_bin(priv->current_ap, &bssid);
ap_changed |= nm_wifi_ap_set_freq(priv->current_ap,
nm_platform_wifi_get_frequency(platform, ifindex));
}

View file

@ -3369,11 +3369,11 @@ activation_success_handler(NMDevice *device)
g_warn_if_fail(priv->current_ap);
if (priv->current_ap) {
if (nm_wifi_ap_get_fake(priv->current_ap)) {
gboolean ap_changed = FALSE;
gboolean update_bssid = !nm_wifi_ap_get_address(priv->current_ap);
gboolean update_rate = !nm_wifi_ap_get_max_bitrate(priv->current_ap);
guint8 bssid[ETH_ALEN];
guint32 rate;
gboolean ap_changed = FALSE;
gboolean update_bssid = !nm_wifi_ap_get_address(priv->current_ap);
gboolean update_rate = !nm_wifi_ap_get_max_bitrate(priv->current_ap);
NMEtherAddr bssid;
guint32 rate;
/* If the activation AP hasn't been seen by the supplicant in a scan
* yet, it will be "fake". This usually happens for Ad-Hoc and
@ -3388,11 +3388,11 @@ activation_success_handler(NMDevice *device)
if ((update_bssid || update_rate)
&& nm_platform_wifi_get_station(nm_device_get_platform(device),
ifindex,
update_bssid ? bssid : NULL,
update_bssid ? &bssid : NULL,
NULL,
update_rate ? &rate : NULL)) {
if (update_bssid && nm_ethernet_address_is_valid(bssid, ETH_ALEN))
ap_changed |= nm_wifi_ap_set_address_bin(priv->current_ap, bssid);
if (update_bssid && nm_ethernet_address_is_valid(&bssid, ETH_ALEN))
ap_changed |= nm_wifi_ap_set_address_bin(priv->current_ap, &bssid);
if (update_rate)
ap_changed |= nm_wifi_ap_set_max_bitrate(priv->current_ap, rate);
}

View file

@ -163,10 +163,12 @@ nm_wifi_ap_get_address(const NMWifiAP *ap)
}
gboolean
nm_wifi_ap_set_address_bin(NMWifiAP *ap, const guint8 addr[static 6 /* ETH_ALEN */])
nm_wifi_ap_set_address_bin(NMWifiAP *ap, const NMEtherAddr *addr)
{
NMWifiAPPrivate *priv = NM_WIFI_AP_GET_PRIVATE(ap);
nm_assert(addr);
if (!priv->address || !nm_utils_hwaddr_matches(addr, ETH_ALEN, priv->address, -1)) {
g_free(priv->address);
priv->address = nm_utils_hwaddr_ntoa(addr, ETH_ALEN);
@ -179,13 +181,13 @@ nm_wifi_ap_set_address_bin(NMWifiAP *ap, const guint8 addr[static 6 /* ETH_ALEN
gboolean
nm_wifi_ap_set_address(NMWifiAP *ap, const char *addr)
{
guint8 addr_buf[ETH_ALEN];
NMEtherAddr addr_buf;
g_return_val_if_fail(NM_IS_WIFI_AP(ap), FALSE);
if (!addr || !nm_utils_hwaddr_aton(addr, addr_buf, sizeof(addr_buf)))
if (!addr || !nm_utils_hwaddr_aton(addr, &addr_buf, sizeof(addr_buf)))
g_return_val_if_reached(FALSE);
return nm_wifi_ap_set_address_bin(ap, addr_buf);
return nm_wifi_ap_set_address_bin(ap, &addr_buf);
}
NM80211Mode
@ -384,7 +386,7 @@ nm_wifi_ap_update_from_properties(NMWifiAP *ap, const NMSupplicantBssInfo *bss_i
changed |= nm_wifi_ap_set_ssid(ap, bss_info->ssid);
if (bss_info->bssid_valid)
changed |= nm_wifi_ap_set_address_bin(ap, bss_info->bssid);
changed |= nm_wifi_ap_set_address_bin(ap, &bss_info->bssid);
else {
/* we don't actually clear the value. */
}

View file

@ -64,23 +64,23 @@ nm_wifi_ap_get_supplicant_path(NMWifiAP *ap)
return ap->_supplicant_path;
}
GBytes * nm_wifi_ap_get_ssid(const NMWifiAP *ap);
gboolean nm_wifi_ap_set_ssid(NMWifiAP *ap, GBytes *ssid);
const char * nm_wifi_ap_get_address(const NMWifiAP *ap);
gboolean nm_wifi_ap_set_address(NMWifiAP *ap, const char *addr);
gboolean nm_wifi_ap_set_address_bin(NMWifiAP *ap, const guint8 addr[static 6 /* ETH_ALEN */]);
NM80211Mode nm_wifi_ap_get_mode(NMWifiAP *ap);
gboolean nm_wifi_ap_is_hotspot(NMWifiAP *ap);
gint8 nm_wifi_ap_get_strength(NMWifiAP *ap);
gboolean nm_wifi_ap_set_strength(NMWifiAP *ap, gint8 strength);
guint32 nm_wifi_ap_get_freq(NMWifiAP *ap);
gboolean nm_wifi_ap_set_freq(NMWifiAP *ap, guint32 freq);
guint32 nm_wifi_ap_get_max_bitrate(NMWifiAP *ap);
gboolean nm_wifi_ap_set_max_bitrate(NMWifiAP *ap, guint32 bitrate);
gboolean nm_wifi_ap_get_fake(const NMWifiAP *ap);
gboolean nm_wifi_ap_set_fake(NMWifiAP *ap, gboolean fake);
NM80211ApFlags nm_wifi_ap_get_flags(const NMWifiAP *self);
gboolean nm_wifi_ap_get_metered(const NMWifiAP *self);
GBytes * nm_wifi_ap_get_ssid(const NMWifiAP *ap);
gboolean nm_wifi_ap_set_ssid(NMWifiAP *ap, GBytes *ssid);
const char * nm_wifi_ap_get_address(const NMWifiAP *ap);
gboolean nm_wifi_ap_set_address(NMWifiAP *ap, const char *addr);
gboolean nm_wifi_ap_set_address_bin(NMWifiAP *ap, const NMEtherAddr *addr);
NM80211Mode nm_wifi_ap_get_mode(NMWifiAP *ap);
gboolean nm_wifi_ap_is_hotspot(NMWifiAP *ap);
gint8 nm_wifi_ap_get_strength(NMWifiAP *ap);
gboolean nm_wifi_ap_set_strength(NMWifiAP *ap, gint8 strength);
guint32 nm_wifi_ap_get_freq(NMWifiAP *ap);
gboolean nm_wifi_ap_set_freq(NMWifiAP *ap, guint32 freq);
guint32 nm_wifi_ap_get_max_bitrate(NMWifiAP *ap);
gboolean nm_wifi_ap_set_max_bitrate(NMWifiAP *ap, guint32 bitrate);
gboolean nm_wifi_ap_get_fake(const NMWifiAP *ap);
gboolean nm_wifi_ap_set_fake(NMWifiAP *ap, gboolean fake);
NM80211ApFlags nm_wifi_ap_get_flags(const NMWifiAP *self);
gboolean nm_wifi_ap_get_metered(const NMWifiAP *self);
NM80211ApSecurityFlags nm_wifi_ap_get_wpa_flags(const NMWifiAP *self);
NM80211ApSecurityFlags nm_wifi_ap_get_rsn_flags(const NMWifiAP *self);

View file

@ -8289,11 +8289,11 @@ wifi_get_frequency(NMPlatform *platform, int ifindex)
}
static gboolean
wifi_get_station(NMPlatform *platform,
int ifindex,
guint8 * out_bssid,
int * out_quality,
guint32 * out_rate)
wifi_get_station(NMPlatform * platform,
int ifindex,
NMEtherAddr *out_bssid,
int * out_quality,
guint32 * out_rate)
{
WIFI_GET_WIFI_DATA_NETNS(wifi_data, platform, ifindex, FALSE);
return nm_wifi_utils_get_station(wifi_data, out_bssid, out_quality, out_rate);

View file

@ -3062,11 +3062,11 @@ nm_platform_wifi_get_frequency(NMPlatform *self, int ifindex)
}
gboolean
nm_platform_wifi_get_station(NMPlatform *self,
int ifindex,
guint8 * out_bssid,
int * out_quality,
guint32 * out_rate)
nm_platform_wifi_get_station(NMPlatform * self,
int ifindex,
NMEtherAddr *out_bssid,
int * out_quality,
guint32 * out_rate)
{
_CHECK_SELF(self, klass, FALSE);

View file

@ -1182,11 +1182,11 @@ typedef struct {
gboolean (*wifi_get_capabilities)(NMPlatform * self,
int ifindex,
NMDeviceWifiCapabilities *caps);
gboolean (*wifi_get_station)(NMPlatform *self,
int ifindex,
guint8 * out_bssid,
int * out_quality,
guint32 * out_rate);
gboolean (*wifi_get_station)(NMPlatform * self,
int ifindex,
NMEtherAddr *out_bssid,
int * out_quality,
guint32 * out_rate);
gboolean (*wifi_get_bssid)(NMPlatform *self, int ifindex, guint8 *bssid);
guint32 (*wifi_get_frequency)(NMPlatform *self, int ifindex);
int (*wifi_get_quality)(NMPlatform *self, int ifindex);
@ -1968,11 +1968,11 @@ gboolean nm_platform_link_tun_get_properties(NMPlatform * self,
gboolean
nm_platform_wifi_get_capabilities(NMPlatform *self, int ifindex, NMDeviceWifiCapabilities *caps);
guint32 nm_platform_wifi_get_frequency(NMPlatform *self, int ifindex);
gboolean nm_platform_wifi_get_station(NMPlatform *self,
int ifindex,
guint8 * out_bssid,
int * out_quality,
guint32 * out_rate);
gboolean nm_platform_wifi_get_station(NMPlatform * self,
int ifindex,
NMEtherAddr *out_bssid,
int * out_quality,
guint32 * out_rate);
NM80211Mode nm_platform_wifi_get_mode(NMPlatform *self, int ifindex);
void nm_platform_wifi_set_mode(NMPlatform *self, int ifindex, NM80211Mode mode);
void nm_platform_wifi_set_powersave(NMPlatform *self, int ifindex, guint32 powersave);

View file

@ -494,7 +494,10 @@ nl80211_station_dump_handler(struct nl_msg *msg, void *arg)
}
static gboolean
wifi_nl80211_get_station(NMWifiUtils *data, guint8 *out_bssid, int *out_quality, guint32 *out_rate)
wifi_nl80211_get_station(NMWifiUtils *data,
NMEtherAddr *out_bssid,
int * out_quality,
guint32 * out_rate)
{
NMWifiUtilsNl80211 * self = (NMWifiUtilsNl80211 *) data;
nm_auto_nlmsg struct nl_msg *msg = NULL;

View file

@ -39,7 +39,7 @@ typedef struct {
* Returns %TRUE on succcess, %FALSE on errors or if not associated.
*/
gboolean (*get_station)(NMWifiUtils *data,
guint8 * out_bssid,
NMEtherAddr *out_bssid,
int * out_quality,
guint32 * out_rate);

View file

@ -266,7 +266,7 @@ wifi_wext_find_freq(NMWifiUtils *data, const guint32 *freqs)
}
static gboolean
wifi_wext_get_bssid(NMWifiUtils *data, guint8 *out_bssid)
wifi_wext_get_bssid(NMWifiUtils *data, NMEtherAddr *out_bssid)
{
NMWifiUtilsWext *wext = (NMWifiUtilsWext *) data;
struct iwreq wrq;
@ -454,7 +454,10 @@ wifi_wext_get_qual(NMWifiUtils *data)
}
static gboolean
wifi_wext_get_station(NMWifiUtils *data, guint8 *out_bssid, int *out_quality, guint32 *out_rate)
wifi_wext_get_station(NMWifiUtils *data,
NMEtherAddr *out_bssid,
int * out_quality,
guint32 * out_rate)
{
NMEtherAddr local_addr;
@ -462,7 +465,7 @@ wifi_wext_get_station(NMWifiUtils *data, guint8 *out_bssid, int *out_quality, gu
/* hm, the caller requested no parameter at all?
* Don't simply return TRUE, but at least check that
* we can successfully fetch the bssid. */
out_bssid = local_addr.ether_addr_octet;
out_bssid = &local_addr;
}
if (out_bssid) {

View file

@ -132,7 +132,10 @@ nm_wifi_utils_find_freq(NMWifiUtils *data, const guint32 *freqs)
}
gboolean
nm_wifi_utils_get_station(NMWifiUtils *data, guint8 *out_bssid, int *out_quality, guint32 *out_rate)
nm_wifi_utils_get_station(NMWifiUtils *data,
NMEtherAddr *out_bssid,
int * out_quality,
guint32 * out_rate)
{
g_return_val_if_fail(data != NULL, FALSE);

View file

@ -51,7 +51,7 @@ guint32 nm_wifi_utils_find_freq(NMWifiUtils *data, const guint32 *freqs);
* Returns %TRUE on succcess.
*/
gboolean nm_wifi_utils_get_station(NMWifiUtils *data,
guint8 * out_bssid,
NMEtherAddr *out_bssid,
int * out_quality,
guint32 * out_rate);

View file

@ -668,19 +668,17 @@ _bss_info_properties_changed(NMSupplicantInterface *self,
if (arr_len != 0) {
nm_assert(arr_len == sizeof(bss_info->bssid));
bss_info->bssid_valid = TRUE;
memcpy(bss_info->bssid, arr_data, sizeof(bss_info->bssid));
memcpy(&bss_info->bssid, arr_data, sizeof(bss_info->bssid));
} else if (bss_info->bssid_valid) {
bss_info->bssid_valid = FALSE;
memset(bss_info->bssid, 0, sizeof(bss_info->bssid));
memset(&bss_info->bssid, 0, sizeof(bss_info->bssid));
}
g_variant_unref(v_v);
} else {
nm_assert(!initial || !bss_info->bssid_valid);
}
nm_assert(
(bss_info->bssid_valid && !nm_utils_memeqzero(bss_info->bssid, sizeof(bss_info->bssid)))
|| (!bss_info->bssid_valid
&& nm_utils_memeqzero(bss_info->bssid, sizeof(bss_info->bssid))));
nm_assert((!!bss_info->bssid_valid)
== (!nm_utils_memeqzero(&bss_info->bssid, sizeof(bss_info->bssid))));
p_max_rate_has = FALSE;
p_max_rate = 0;

View file

@ -158,7 +158,7 @@ typedef struct _NMSupplicantBssInfo {
guint8 signal_percent;
guint8 bssid[6 /* ETH_ALEN */];
NMEtherAddr bssid;
NM80211ApFlags ap_flags : 5;