summaryrefslogtreecommitdiff
path: root/src/network/networkd-wifi.c
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2019-10-23 13:01:35 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2019-10-24 00:02:41 +0200
commitb492aea093bba5f7c85806b050985a0b0333c4f9 (patch)
treea77388f0439cadede3fbfc74ca91ac607ef8aa81 /src/network/networkd-wifi.c
parent516e9c802ff60816e58e5cbd8c05be036199d09c (diff)
downloadsystemd-b492aea093bba5f7c85806b050985a0b0333c4f9.tar.gz
network: split out functions to get ssid and bssid
Diffstat (limited to 'src/network/networkd-wifi.c')
-rw-r--r--src/network/networkd-wifi.c107
1 files changed, 12 insertions, 95 deletions
diff --git a/src/network/networkd-wifi.c b/src/network/networkd-wifi.c
index 94195d778f..877c742280 100644
--- a/src/network/networkd-wifi.c
+++ b/src/network/networkd-wifi.c
@@ -12,101 +12,9 @@
#include "networkd-manager.h"
#include "networkd-wifi.h"
#include "string-util.h"
-
-static int wifi_get_ssid(Link *link) {
- _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL, *reply = NULL;
- _cleanup_free_ char *ssid = NULL;
- sd_genl_family family;
- int r;
-
- r = sd_genl_message_new(link->manager->genl, SD_GENL_NL80211, NL80211_CMD_GET_INTERFACE, &m);
- if (r < 0)
- return log_link_error_errno(link, r, "Failed to create generic netlink message: %m");
-
- r = sd_netlink_message_append_u32(m, NL80211_ATTR_IFINDEX, link->ifindex);
- if (r < 0)
- return log_link_error_errno(link, r, "Could not append NL80211_ATTR_IFINDEX attribute: %m");
-
- r = sd_netlink_call(link->manager->genl, m, 0, &reply);
- if (r < 0)
- return log_link_error_errno(link, r, "Failed to request information about wifi interface: %m");
- if (!reply)
- return 0;
-
- r = sd_netlink_message_get_errno(reply);
- if (r < 0)
- return log_link_warning_errno(link, r, "Failed to get information about wifi interface: %m");
-
- r = sd_genl_message_get_family(link->manager->genl, reply, &family);
- if (r < 0)
- return log_link_warning_errno(link, r, "Failed to determine genl family: %m");
- if (family != SD_GENL_NL80211) {
- log_link_debug(link, "Received message of unexpected genl family %u, ignoring.", family);
- return 0;
- }
-
- r = sd_netlink_message_read_string_strdup(reply, NL80211_ATTR_SSID, &ssid);
- if (r < 0 && r != -ENODATA)
- return log_link_warning_errno(link, r, "Failed to get NL80211_ATTR_SSID attribute: %m");
-
- free_and_replace(link->ssid, ssid);
- return r == -ENODATA ? 0 : 1;
-}
-
-static int wifi_get_bssid(Link *link) {
- _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL, *reply = NULL;
- struct ether_addr mac = {};
- sd_genl_family family;
- int r;
-
- assert(link);
- assert(link->manager);
- assert(link->manager->genl);
-
- r = sd_genl_message_new(link->manager->genl, SD_GENL_NL80211, NL80211_CMD_GET_STATION, &m);
- if (r < 0)
- return log_link_error_errno(link, r, "Failed to create generic netlink message: %m");
-
- r = sd_netlink_message_set_flags(m, NLM_F_REQUEST | NLM_F_ACK | NLM_F_DUMP);
- if (r < 0)
- return log_link_error_errno(link, r, "Failed to set dump flag: %m");
-
- r = sd_netlink_message_append_u32(m, NL80211_ATTR_IFINDEX, link->ifindex);
- if (r < 0)
- return log_link_error_errno(link, r, "Could not append NL80211_ATTR_IFINDEX attribute: %m");
-
- r = sd_netlink_call(link->manager->genl, m, 0, &reply);
- if (r < 0)
- return log_link_error_errno(link, r, "Failed to request information about wifi station: %m");
- if (!reply)
- return 0;
-
- r = sd_netlink_message_get_errno(reply);
- if (r < 0)
- return log_link_error_errno(link, r, "Failed to get information about wifi station: %m");
-
- r = sd_genl_message_get_family(link->manager->genl, reply, &family);
- if (r < 0)
- return log_link_warning_errno(link, r, "Failed to determine genl family: %m");
- if (family != SD_GENL_NL80211) {
- log_link_debug(link, "Received message of unexpected genl family %u, ignoring.", family);
- return 0;
- }
-
- r = sd_netlink_message_read_ether_addr(reply, NL80211_ATTR_MAC, &mac);
- if (r < 0 && r != -ENODATA)
- return log_link_warning_errno(link, r, "Failed to get NL80211_ATTR_MAC attribute: %m");
-
- r = memcmp(&link->bssid, &mac, sizeof(mac));
- if (r == 0)
- return 0;
-
- memcpy(&link->bssid, &mac, sizeof(mac));
- return 1;
-}
+#include "wifi-util.h"
int wifi_get_info(Link *link) {
- char buf[ETHER_ADDR_TO_STRING_MAX];
const char *type;
int r, s;
@@ -124,15 +32,24 @@ int wifi_get_info(Link *link) {
if (!streq(type, "wlan"))
return 0;
- r = wifi_get_ssid(link);
+ _cleanup_free_ char *ssid = NULL;
+ r = wifi_get_ssid(link->manager->genl, link->ifindex, &ssid);
if (r < 0)
return r;
+ if (r > 0 && streq_ptr(link->ssid, ssid))
+ r = 0;
+ free_and_replace(link->ssid, ssid);
- s = wifi_get_bssid(link);
+ struct ether_addr old_bssid = link->bssid;
+ s = wifi_get_bssid(link->manager->genl, link->ifindex, &link->bssid);
if (s < 0)
return s;
+ if (s > 0 && memcmp(&old_bssid, &link->bssid, sizeof old_bssid) == 0)
+ s = 0;
if (r > 0 || s > 0) {
+ char buf[ETHER_ADDR_TO_STRING_MAX];
+
if (link->ssid)
log_link_info(link, "Connected WiFi access point: %s (%s)",
link->ssid, ether_addr_to_string(&link->bssid, buf));