wiphy, netdev: Add enum values for P2P-related iftypes

Also add a mask parameter to wiphy_get_supported_iftypes to make sure
the SupportedModes property only contains the values that can be used
as Device.Mode.
This commit is contained in:
Andrew Zaborowski 2019-03-11 15:43:21 +01:00 committed by Denis Kenzior
parent e344df432b
commit 154e9f63bc
3 changed files with 20 additions and 9 deletions

View File

@ -306,9 +306,13 @@ enum netdev_iftype netdev_get_iftype(struct netdev *netdev)
return NETDEV_IFTYPE_AP; return NETDEV_IFTYPE_AP;
case NL80211_IFTYPE_ADHOC: case NL80211_IFTYPE_ADHOC:
return NETDEV_IFTYPE_ADHOC; return NETDEV_IFTYPE_ADHOC;
case NL80211_IFTYPE_P2P_CLIENT:
return NETDEV_IFTYPE_P2P_CLIENT;
case NL80211_IFTYPE_P2P_GO:
return NETDEV_IFTYPE_P2P_GO;
default: default:
/* cant really do much here */ /* can't really do much here */
l_error("invalid iftype %u", netdev->type); l_error("unknown iftype %u", netdev->type);
return NETDEV_IFTYPE_STATION; return NETDEV_IFTYPE_STATION;
} }
} }

View File

@ -62,6 +62,8 @@ enum netdev_iftype {
NETDEV_IFTYPE_ADHOC = 1, NETDEV_IFTYPE_ADHOC = 1,
NETDEV_IFTYPE_STATION = 2, NETDEV_IFTYPE_STATION = 2,
NETDEV_IFTYPE_AP = 3, NETDEV_IFTYPE_AP = 3,
NETDEV_IFTYPE_P2P_CLIENT,
NETDEV_IFTYPE_P2P_GO,
}; };
typedef void (*netdev_command_cb_t)(struct netdev *netdev, int result, typedef void (*netdev_command_cb_t)(struct netdev *netdev, int result,

View File

@ -302,17 +302,17 @@ bool wiphy_supports_adhoc_rsn(struct wiphy *wiphy)
return wiphy->support_adhoc_rsn; return wiphy->support_adhoc_rsn;
} }
static char **wiphy_get_supported_iftypes(struct wiphy *wiphy) static char **wiphy_get_supported_iftypes(struct wiphy *wiphy, uint16_t mask)
{ {
char **ret = l_new(char *, uint16_t supported_mask = wiphy->supported_iftypes & mask;
__builtin_popcount(wiphy->supported_iftypes) + 1); char **ret = l_new(char *, __builtin_popcount(supported_mask) + 1);
unsigned int i; unsigned int i;
unsigned int j; unsigned int j;
for (j = 0, i = 0; i < sizeof(wiphy->supported_iftypes) * 8; i++) { for (j = 0, i = 0; i < sizeof(supported_mask) * 8; i++) {
const char *str; const char *str;
if (!(wiphy->supported_iftypes & (1 << i))) if (!(supported_mask & (1 << i)))
continue; continue;
str = dbus_iftype_to_string(i + 1); str = dbus_iftype_to_string(i + 1);
@ -384,7 +384,7 @@ static void wiphy_print_basic_info(struct wiphy *wiphy)
} }
if (wiphy->supported_iftypes) { if (wiphy->supported_iftypes) {
char **iftypes = wiphy_get_supported_iftypes(wiphy); char **iftypes = wiphy_get_supported_iftypes(wiphy, ~0);
char *joined = l_strjoinv(iftypes, ' '); char *joined = l_strjoinv(iftypes, ' ');
l_info("\tSupported iftypes: %s", joined); l_info("\tSupported iftypes: %s", joined);
@ -1019,6 +1019,11 @@ static bool wiphy_property_get_name(struct l_dbus *dbus,
return true; return true;
} }
#define WIPHY_MODE_MASK ( \
(1 << (NL80211_IFTYPE_STATION - 1)) | \
(1 << (NL80211_IFTYPE_AP - 1)) | \
(1 << (NL80211_IFTYPE_ADHOC - 1)))
static bool wiphy_property_get_supported_modes(struct l_dbus *dbus, static bool wiphy_property_get_supported_modes(struct l_dbus *dbus,
struct l_dbus_message *message, struct l_dbus_message *message,
struct l_dbus_message_builder *builder, struct l_dbus_message_builder *builder,
@ -1026,7 +1031,7 @@ static bool wiphy_property_get_supported_modes(struct l_dbus *dbus,
{ {
struct wiphy *wiphy = user_data; struct wiphy *wiphy = user_data;
unsigned int j = 0; unsigned int j = 0;
char **iftypes = wiphy_get_supported_iftypes(wiphy); char **iftypes = wiphy_get_supported_iftypes(wiphy, WIPHY_MODE_MASK);
l_dbus_message_builder_enter_array(builder, "s"); l_dbus_message_builder_enter_array(builder, "s");