1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 #include <net/ethernet.h>
4 #include <linux/nl80211.h>
9 #include "netlink-util.h"
10 #include "wifi-util.h"
12 int wifi_get_interface(sd_netlink
*genl
, int ifindex
, enum nl80211_iftype
*iftype
, char **ssid
) {
13 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*m
= NULL
, *reply
= NULL
;
14 sd_genl_family family
;
20 r
= sd_genl_message_new(genl
, SD_GENL_NL80211
, NL80211_CMD_GET_INTERFACE
, &m
);
22 return log_debug_errno(r
, "Failed to create generic netlink message: %m");
24 r
= sd_netlink_message_append_u32(m
, NL80211_ATTR_IFINDEX
, ifindex
);
26 return log_debug_errno(r
, "Could not append NL80211_ATTR_IFINDEX attribute: %m");
28 r
= sd_netlink_call(genl
, m
, 0, &reply
);
30 /* For obsolete WEXT driver. */
31 log_debug_errno(r
, "Failed to request information about wifi interface %d. "
32 "The device doesn't seem to have nl80211 interface. Ignoring.",
37 return log_debug_errno(r
, "Failed to request information about wifi interface %d: %m", ifindex
);
41 r
= sd_netlink_message_get_errno(reply
);
43 return log_debug_errno(r
, "Failed to get information about wifi interface %d: %m", ifindex
);
45 r
= sd_genl_message_get_family(genl
, reply
, &family
);
47 return log_debug_errno(r
, "Failed to determine genl family: %m");
48 if (family
!= SD_GENL_NL80211
) {
49 log_debug("Received message of unexpected genl family %u, ignoring.", family
);
56 r
= sd_netlink_message_read_u32(reply
, NL80211_ATTR_IFTYPE
, &t
);
58 return log_debug_errno(r
, "Failed to get NL80211_ATTR_IFTYPE attribute: %m");
63 r
= sd_netlink_message_read_string_strdup(reply
, NL80211_ATTR_SSID
, ssid
);
67 return log_debug_errno(r
, "Failed to get NL80211_ATTR_SSID attribute: %m");
80 int wifi_get_station(sd_netlink
*genl
, int ifindex
, struct ether_addr
*bssid
) {
81 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*m
= NULL
, *reply
= NULL
;
82 sd_genl_family family
;
89 r
= sd_genl_message_new(genl
, SD_GENL_NL80211
, NL80211_CMD_GET_STATION
, &m
);
91 return log_debug_errno(r
, "Failed to create generic netlink message: %m");
93 r
= sd_netlink_message_set_flags(m
, NLM_F_REQUEST
| NLM_F_ACK
| NLM_F_DUMP
);
95 return log_debug_errno(r
, "Failed to set dump flag: %m");
97 r
= sd_netlink_message_append_u32(m
, NL80211_ATTR_IFINDEX
, ifindex
);
99 return log_debug_errno(r
, "Could not append NL80211_ATTR_IFINDEX attribute: %m");
101 r
= sd_netlink_call(genl
, m
, 0, &reply
);
103 return log_debug_errno(r
, "Failed to request information about wifi station: %m");
107 r
= sd_netlink_message_get_errno(reply
);
109 return log_debug_errno(r
, "Failed to get information about wifi station: %m");
111 r
= sd_genl_message_get_family(genl
, reply
, &family
);
113 return log_debug_errno(r
, "Failed to determine genl family: %m");
114 if (family
!= SD_GENL_NL80211
) {
115 log_debug("Received message of unexpected genl family %u, ignoring.", family
);
119 r
= sd_netlink_message_read_ether_addr(reply
, NL80211_ATTR_MAC
, bssid
);
123 return log_debug_errno(r
, "Failed to get NL80211_ATTR_MAC attribute: %m");
128 *bssid
= (struct ether_addr
) {};