mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2025-01-03 19:02:34 +01:00
wiphy: Add wiphy_get_driver api
Read the driver name for each wiphy from sysfs if available. I didn't find a better way to obtain the driver name for a phy than by reading the dir name that the "driver" symlink points at. For an existing netdev this can be done using the SIOCETHTOOL ioctl.
This commit is contained in:
parent
7ce8d9d8b6
commit
ac2eeab570
32
src/wiphy.c
32
src/wiphy.c
@ -24,11 +24,14 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define _GNU_SOURCE
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <linux/if_ether.h>
|
#include <linux/if_ether.h>
|
||||||
#include <fnmatch.h>
|
#include <fnmatch.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include <ell/ell.h>
|
#include <ell/ell.h>
|
||||||
|
|
||||||
@ -63,6 +66,7 @@ struct wiphy {
|
|||||||
struct scan_freq_set *supported_freqs;
|
struct scan_freq_set *supported_freqs;
|
||||||
char *model_str;
|
char *model_str;
|
||||||
char *vendor_str;
|
char *vendor_str;
|
||||||
|
char *driver_str;
|
||||||
struct watchlist state_watches;
|
struct watchlist state_watches;
|
||||||
|
|
||||||
bool support_scheduled_scan:1;
|
bool support_scheduled_scan:1;
|
||||||
@ -185,6 +189,7 @@ static void wiphy_free(void *data)
|
|||||||
watchlist_destroy(&wiphy->state_watches);
|
watchlist_destroy(&wiphy->state_watches);
|
||||||
l_free(wiphy->model_str);
|
l_free(wiphy->model_str);
|
||||||
l_free(wiphy->vendor_str);
|
l_free(wiphy->vendor_str);
|
||||||
|
l_free(wiphy->driver_str);
|
||||||
l_free(wiphy);
|
l_free(wiphy);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -316,6 +321,11 @@ bool wiphy_supports_adhoc_rsn(struct wiphy *wiphy)
|
|||||||
return wiphy->support_adhoc_rsn;
|
return wiphy->support_adhoc_rsn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *wiphy_get_driver(struct wiphy *wiphy)
|
||||||
|
{
|
||||||
|
return wiphy->driver_str;
|
||||||
|
}
|
||||||
|
|
||||||
bool wiphy_constrain_freq_set(const struct wiphy *wiphy,
|
bool wiphy_constrain_freq_set(const struct wiphy *wiphy,
|
||||||
struct scan_freq_set *set)
|
struct scan_freq_set *set)
|
||||||
{
|
{
|
||||||
@ -659,6 +669,26 @@ bool wiphy_parse_id_and_name(struct l_genl_attr *attr, uint32_t *out_id,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool wiphy_get_driver_name(struct wiphy *wiphy)
|
||||||
|
{
|
||||||
|
L_AUTO_FREE_VAR(char *, driver_link) = NULL;
|
||||||
|
char driver_path[256];
|
||||||
|
ssize_t len;
|
||||||
|
|
||||||
|
driver_link = l_strdup_printf("/sys/class/ieee80211/%s/device/driver",
|
||||||
|
wiphy->name);
|
||||||
|
len = readlink(driver_link, driver_path, sizeof(driver_path) - 1);
|
||||||
|
|
||||||
|
if (len == -1) {
|
||||||
|
l_error("Can't read %s: %s", driver_link, strerror(errno));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
driver_path[len] = '\0';
|
||||||
|
wiphy->driver_str = l_strdup(basename(driver_path));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static void wiphy_register(struct wiphy *wiphy)
|
static void wiphy_register(struct wiphy *wiphy)
|
||||||
{
|
{
|
||||||
struct l_dbus *dbus = dbus_get_bus();
|
struct l_dbus *dbus = dbus_get_bus();
|
||||||
@ -699,6 +729,8 @@ static void wiphy_register(struct wiphy *wiphy)
|
|||||||
l_hwdb_lookup_free(entries);
|
l_hwdb_lookup_free(entries);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wiphy_get_driver_name(wiphy);
|
||||||
|
|
||||||
if (!l_dbus_object_add_interface(dbus, wiphy_get_path(wiphy),
|
if (!l_dbus_object_add_interface(dbus, wiphy_get_path(wiphy),
|
||||||
IWD_WIPHY_INTERFACE, wiphy))
|
IWD_WIPHY_INTERFACE, wiphy))
|
||||||
l_info("Unable to add the %s interface to %s",
|
l_info("Unable to add the %s interface to %s",
|
||||||
|
@ -67,6 +67,7 @@ bool wiphy_has_ext_feature(struct wiphy *wiphy, uint32_t feature);
|
|||||||
uint8_t wiphy_get_max_num_ssids_per_scan(struct wiphy *wiphy);
|
uint8_t wiphy_get_max_num_ssids_per_scan(struct wiphy *wiphy);
|
||||||
bool wiphy_supports_iftype(struct wiphy *wiphy, uint32_t iftype);
|
bool wiphy_supports_iftype(struct wiphy *wiphy, uint32_t iftype);
|
||||||
bool wiphy_supports_adhoc_rsn(struct wiphy *wiphy);
|
bool wiphy_supports_adhoc_rsn(struct wiphy *wiphy);
|
||||||
|
const char *wiphy_get_driver(struct wiphy *wiphy);
|
||||||
|
|
||||||
uint32_t wiphy_state_watch_add(struct wiphy *wiphy,
|
uint32_t wiphy_state_watch_add(struct wiphy *wiphy,
|
||||||
wiphy_state_watch_func_t func, void *user_data,
|
wiphy_state_watch_func_t func, void *user_data,
|
||||||
|
Loading…
Reference in New Issue
Block a user