From 42156b601031ee4926b9e9245ed32de903e3e78f Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 19 Nov 2020 11:00:08 +0100 Subject: [PATCH] wifi: use NMEtherAddr struct for bssid --- src/devices/wifi/nm-device-iwd.c | 27 +++++++----------- src/devices/wifi/nm-device-wifi.c | 16 +++++------ src/devices/wifi/nm-wifi-ap.c | 12 ++++---- src/devices/wifi/nm-wifi-ap.h | 34 +++++++++++------------ src/platform/nm-linux-platform.c | 10 +++---- src/platform/nm-platform.c | 10 +++---- src/platform/nm-platform.h | 20 ++++++------- src/platform/wifi/nm-wifi-utils-nl80211.c | 5 +++- src/platform/wifi/nm-wifi-utils-private.h | 2 +- src/platform/wifi/nm-wifi-utils-wext.c | 9 ++++-- src/platform/wifi/nm-wifi-utils.c | 5 +++- src/platform/wifi/nm-wifi-utils.h | 2 +- src/supplicant/nm-supplicant-interface.c | 10 +++---- src/supplicant/nm-supplicant-types.h | 2 +- 14 files changed, 83 insertions(+), 81 deletions(-) diff --git a/src/devices/wifi/nm-device-iwd.c b/src/devices/wifi/nm-device-iwd.c index 9d1acb52a5..ac6b0f8551 100644 --- a/src/devices/wifi/nm-device-iwd.c +++ b/src/devices/wifi/nm-device-iwd.c @@ -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)); } diff --git a/src/devices/wifi/nm-device-wifi.c b/src/devices/wifi/nm-device-wifi.c index fa047067a0..3fe434bb2d 100644 --- a/src/devices/wifi/nm-device-wifi.c +++ b/src/devices/wifi/nm-device-wifi.c @@ -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); } diff --git a/src/devices/wifi/nm-wifi-ap.c b/src/devices/wifi/nm-wifi-ap.c index 82018c01ae..4fa44f0126 100644 --- a/src/devices/wifi/nm-wifi-ap.c +++ b/src/devices/wifi/nm-wifi-ap.c @@ -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. */ } diff --git a/src/devices/wifi/nm-wifi-ap.h b/src/devices/wifi/nm-wifi-ap.h index c5665a365c..da360325f6 100644 --- a/src/devices/wifi/nm-wifi-ap.h +++ b/src/devices/wifi/nm-wifi-ap.h @@ -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); diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c index 55e46cd5ef..4e98ae9e99 100644 --- a/src/platform/nm-linux-platform.c +++ b/src/platform/nm-linux-platform.c @@ -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); diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c index 87b761ff25..cd58211594 100644 --- a/src/platform/nm-platform.c +++ b/src/platform/nm-platform.c @@ -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); diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h index ae326a86a4..25a741166e 100644 --- a/src/platform/nm-platform.h +++ b/src/platform/nm-platform.h @@ -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); diff --git a/src/platform/wifi/nm-wifi-utils-nl80211.c b/src/platform/wifi/nm-wifi-utils-nl80211.c index 0071c67ea5..457c6b8e5a 100644 --- a/src/platform/wifi/nm-wifi-utils-nl80211.c +++ b/src/platform/wifi/nm-wifi-utils-nl80211.c @@ -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; diff --git a/src/platform/wifi/nm-wifi-utils-private.h b/src/platform/wifi/nm-wifi-utils-private.h index 5e7b7fa01a..703ef66a82 100644 --- a/src/platform/wifi/nm-wifi-utils-private.h +++ b/src/platform/wifi/nm-wifi-utils-private.h @@ -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); diff --git a/src/platform/wifi/nm-wifi-utils-wext.c b/src/platform/wifi/nm-wifi-utils-wext.c index 69c53ad55d..fde48cc652 100644 --- a/src/platform/wifi/nm-wifi-utils-wext.c +++ b/src/platform/wifi/nm-wifi-utils-wext.c @@ -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) { diff --git a/src/platform/wifi/nm-wifi-utils.c b/src/platform/wifi/nm-wifi-utils.c index 2d483d1bab..92fbc200d5 100644 --- a/src/platform/wifi/nm-wifi-utils.c +++ b/src/platform/wifi/nm-wifi-utils.c @@ -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); diff --git a/src/platform/wifi/nm-wifi-utils.h b/src/platform/wifi/nm-wifi-utils.h index be943edf96..2febd52803 100644 --- a/src/platform/wifi/nm-wifi-utils.h +++ b/src/platform/wifi/nm-wifi-utils.h @@ -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); diff --git a/src/supplicant/nm-supplicant-interface.c b/src/supplicant/nm-supplicant-interface.c index 5021f3f60b..d3558a3331 100644 --- a/src/supplicant/nm-supplicant-interface.c +++ b/src/supplicant/nm-supplicant-interface.c @@ -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; diff --git a/src/supplicant/nm-supplicant-types.h b/src/supplicant/nm-supplicant-types.h index e35059af45..72936ddfc2 100644 --- a/src/supplicant/nm-supplicant-types.h +++ b/src/supplicant/nm-supplicant-types.h @@ -158,7 +158,7 @@ typedef struct _NMSupplicantBssInfo { guint8 signal_percent; - guint8 bssid[6 /* ETH_ALEN */]; + NMEtherAddr bssid; NM80211ApFlags ap_flags : 5;