wiphy: fix runtime error from bit shift
The compiler treated the '1' as an int type which was not big enough to hold a bit shift of 31: runtime error: left shift of 1 by 31 places cannot be represented in type 'int' Instead of doing the iftype check manually, refactor wiphy_get_supported_iftypes by adding a subroutine which just parses out iftypes from a mask into a char** list. This removes the need to case each iftype into a string.
This commit is contained in:
parent
61682cdc97
commit
f555e5dda2
50
src/wiphy.c
50
src/wiphy.c
|
@ -716,17 +716,16 @@ bool wiphy_constrain_freq_set(const struct wiphy *wiphy,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char **wiphy_get_supported_iftypes(struct wiphy *wiphy, uint16_t mask)
|
static char **wiphy_iftype_mask_to_str(uint16_t mask)
|
||||||
{
|
{
|
||||||
uint16_t supported_mask = wiphy->supported_iftypes & mask;
|
char **ret = l_new(char *, __builtin_popcount(mask) + 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(supported_mask) * 8; i++) {
|
for (j = 0, i = 0; i < sizeof(mask) * 8; i++) {
|
||||||
const char *str;
|
const char *str;
|
||||||
|
|
||||||
if (!(supported_mask & (1 << i)))
|
if (!(mask & (1 << i)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
str = netdev_iftype_to_string(i + 1);
|
str = netdev_iftype_to_string(i + 1);
|
||||||
|
@ -737,6 +736,11 @@ static char **wiphy_get_supported_iftypes(struct wiphy *wiphy, uint16_t mask)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char **wiphy_get_supported_iftypes(struct wiphy *wiphy, uint16_t mask)
|
||||||
|
{
|
||||||
|
return wiphy_iftype_mask_to_str(wiphy->supported_iftypes & mask);
|
||||||
|
}
|
||||||
|
|
||||||
bool wiphy_supports_iftype(struct wiphy *wiphy, uint32_t iftype)
|
bool wiphy_supports_iftype(struct wiphy *wiphy, uint32_t iftype)
|
||||||
{
|
{
|
||||||
if (iftype > sizeof(wiphy->supported_iftypes) * 8)
|
if (iftype > sizeof(wiphy->supported_iftypes) * 8)
|
||||||
|
@ -960,38 +964,14 @@ static void wiphy_print_mcs_info(const uint8_t *mcs_map,
|
||||||
static void wiphy_print_he_capabilities(struct band *band,
|
static void wiphy_print_he_capabilities(struct band *band,
|
||||||
const struct band_he_capabilities *he_cap)
|
const struct band_he_capabilities *he_cap)
|
||||||
{
|
{
|
||||||
int i;
|
_auto_(l_strv_free) char **iftypes = NULL;
|
||||||
char type_buf[128];
|
_auto_(l_free) char *joined = NULL;
|
||||||
char *s = type_buf;
|
|
||||||
uint8_t width_set = bit_field(he_cap->he_phy_capa[0], 1, 7);
|
uint8_t width_set = bit_field(he_cap->he_phy_capa[0], 1, 7);
|
||||||
|
|
||||||
for (i = 0; i < 32; i++) {
|
iftypes = wiphy_iftype_mask_to_str(he_cap->iftypes);
|
||||||
if (!(he_cap->iftypes & (1 << i)))
|
joined = l_strjoinv(iftypes, ' ');
|
||||||
continue;
|
|
||||||
|
|
||||||
if (L_WARN_ON(s >= type_buf + sizeof(type_buf)))
|
l_info("\t\t\tInterface Types: %s", joined);
|
||||||
return;
|
|
||||||
|
|
||||||
switch (i) {
|
|
||||||
case NETDEV_IFTYPE_ADHOC:
|
|
||||||
s += sprintf(s, "%s ", "Ad-Hoc");
|
|
||||||
break;
|
|
||||||
case NETDEV_IFTYPE_STATION:
|
|
||||||
s += sprintf(s, "%s ", "Station");
|
|
||||||
break;
|
|
||||||
case NETDEV_IFTYPE_AP:
|
|
||||||
s += sprintf(s, "%s ", "AP");
|
|
||||||
break;
|
|
||||||
case NETDEV_IFTYPE_P2P_CLIENT:
|
|
||||||
s += sprintf(s, "%s ", "P2P Client");
|
|
||||||
break;
|
|
||||||
case NETDEV_IFTYPE_P2P_GO:
|
|
||||||
s += sprintf(s, "%s ", "P2P GO");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
l_info("\t\t\tInterface Types: %s", type_buf);
|
|
||||||
|
|
||||||
switch (band->freq) {
|
switch (band->freq) {
|
||||||
case BAND_FREQ_2_4_GHZ:
|
case BAND_FREQ_2_4_GHZ:
|
||||||
|
@ -1341,7 +1321,7 @@ static uint32_t get_iftypes(struct l_genl_attr *iftypes)
|
||||||
if (len != 0)
|
if (len != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
types |= (1 << type);
|
types |= (1 << (type - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
return types;
|
return types;
|
||||||
|
|
Loading…
Reference in New Issue