]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/network/networkd-wifi.c
Merge pull request #17185 from yuwata/ethtool-update
[thirdparty/systemd.git] / src / network / networkd-wifi.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2
3 #include <net/ethernet.h>
4 #include <linux/nl80211.h>
5
6 #include "sd-bus.h"
7
8 #include "bus-util.h"
9 #include "ether-addr-util.h"
10 #include "netlink-internal.h"
11 #include "netlink-util.h"
12 #include "networkd-link.h"
13 #include "networkd-manager.h"
14 #include "networkd-wifi.h"
15 #include "string-util.h"
16 #include "wifi-util.h"
17
18 int wifi_get_info(Link *link) {
19 const char *type;
20 int r, s = 0;
21
22 assert(link);
23
24 if (!link->sd_device)
25 return 0;
26
27 r = sd_device_get_devtype(link->sd_device, &type);
28 if (r == -ENOENT)
29 return 0;
30 else if (r < 0)
31 return r;
32
33 if (!streq(type, "wlan"))
34 return 0;
35
36 _cleanup_free_ char *ssid = NULL;
37 r = wifi_get_interface(link->manager->genl, link->ifindex, &link->wlan_iftype, &ssid);
38 if (r < 0)
39 return r;
40 if (r > 0 && streq_ptr(link->ssid, ssid))
41 r = 0;
42 free_and_replace(link->ssid, ssid);
43
44 if (link->wlan_iftype == NL80211_IFTYPE_STATION) {
45 struct ether_addr old_bssid = link->bssid;
46 s = wifi_get_station(link->manager->genl, link->ifindex, &link->bssid);
47 if (s < 0)
48 return s;
49 if (s > 0 && memcmp(&old_bssid, &link->bssid, sizeof old_bssid) == 0)
50 s = 0;
51 }
52
53 if (r > 0 || s > 0) {
54 char buf[ETHER_ADDR_TO_STRING_MAX];
55
56 if (link->wlan_iftype == NL80211_IFTYPE_STATION && link->ssid)
57 log_link_info(link, "Connected WiFi access point: %s (%s)",
58 link->ssid, ether_addr_to_string(&link->bssid, buf));
59 return 1;
60 }
61 return 0;
62 }