EDMG: Helper functions for parameter encoding/checking
Signed-off-by: Alexei Avshalom Lazar <ailizaro@codeaurora.org>
This commit is contained in:
parent
e8ff22f471
commit
fdd0fef2c6
2 changed files with 81 additions and 0 deletions
|
@ -2012,3 +2012,75 @@ int ieee802_11_ext_capab(const u8 *ie, unsigned int capab)
|
||||||
return 0;
|
return 0;
|
||||||
return !!(ie[2 + capab / 8] & BIT(capab % 8));
|
return !!(ie[2 + capab / 8] & BIT(capab % 8));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void hostapd_encode_edmg_chan(int edmg_enable, u8 edmg_channel,
|
||||||
|
int primary_channel,
|
||||||
|
struct ieee80211_edmg_config *edmg)
|
||||||
|
{
|
||||||
|
if (!edmg_enable) {
|
||||||
|
edmg->channels = 0;
|
||||||
|
edmg->bw_config = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Only EDMG CB1 and EDMG CB2 contiguous channels supported for now */
|
||||||
|
switch (edmg_channel) {
|
||||||
|
case EDMG_CHANNEL_9:
|
||||||
|
edmg->channels = EDMG_CHANNEL_9_SUBCHANNELS;
|
||||||
|
edmg->bw_config = EDMG_BW_CONFIG_5;
|
||||||
|
return;
|
||||||
|
case EDMG_CHANNEL_10:
|
||||||
|
edmg->channels = EDMG_CHANNEL_10_SUBCHANNELS;
|
||||||
|
edmg->bw_config = EDMG_BW_CONFIG_5;
|
||||||
|
return;
|
||||||
|
case EDMG_CHANNEL_11:
|
||||||
|
edmg->channels = EDMG_CHANNEL_11_SUBCHANNELS;
|
||||||
|
edmg->bw_config = EDMG_BW_CONFIG_5;
|
||||||
|
return;
|
||||||
|
case EDMG_CHANNEL_12:
|
||||||
|
edmg->channels = EDMG_CHANNEL_12_SUBCHANNELS;
|
||||||
|
edmg->bw_config = EDMG_BW_CONFIG_5;
|
||||||
|
return;
|
||||||
|
case EDMG_CHANNEL_13:
|
||||||
|
edmg->channels = EDMG_CHANNEL_13_SUBCHANNELS;
|
||||||
|
edmg->bw_config = EDMG_BW_CONFIG_5;
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
if (primary_channel > 0 && primary_channel < 7) {
|
||||||
|
edmg->channels = BIT(primary_channel - 1);
|
||||||
|
edmg->bw_config = EDMG_BW_CONFIG_4;
|
||||||
|
} else {
|
||||||
|
edmg->channels = 0;
|
||||||
|
edmg->bw_config = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Check if the requested EDMG configuration is a subset of the allowed
|
||||||
|
* EDMG configuration. */
|
||||||
|
int ieee802_edmg_is_allowed(struct ieee80211_edmg_config allowed,
|
||||||
|
struct ieee80211_edmg_config requested)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* The validation check if the requested EDMG configuration
|
||||||
|
* is a subset of the allowed EDMG configuration:
|
||||||
|
* 1. Check that the requested channels are part (set) of the allowed
|
||||||
|
* channels.
|
||||||
|
* 2. P802.11ay defines the values of bw_config between 4 and 15.
|
||||||
|
* (bw config % 4) will give us 4 groups inside bw_config definition,
|
||||||
|
* inside each group we can check the subset just by comparing the
|
||||||
|
* bw_config value.
|
||||||
|
* Between this 4 groups, there is no subset relation - as a result of
|
||||||
|
* the P802.11ay definition.
|
||||||
|
* bw_config defined by IEEE P802.11ay/D4.0, 9.4.2.251, Table 13.
|
||||||
|
*/
|
||||||
|
if (((requested.channels & allowed.channels) != requested.channels) ||
|
||||||
|
((requested.bw_config % 4) > (allowed.bw_config % 4)) ||
|
||||||
|
requested.bw_config > allowed.bw_config)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
|
@ -273,4 +273,13 @@ static inline int for_each_element_completed(const struct element *element,
|
||||||
return (const u8 *) element == (const u8 *) data + datalen;
|
return (const u8 *) element == (const u8 *) data + datalen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct ieee80211_edmg_config;
|
||||||
|
|
||||||
|
void hostapd_encode_edmg_chan(int edmg_enable, u8 edmg_channel,
|
||||||
|
int primary_channel,
|
||||||
|
struct ieee80211_edmg_config *edmg);
|
||||||
|
|
||||||
|
int ieee802_edmg_is_allowed(struct ieee80211_edmg_config allowed,
|
||||||
|
struct ieee80211_edmg_config requested);
|
||||||
|
|
||||||
#endif /* IEEE802_11_COMMON_H */
|
#endif /* IEEE802_11_COMMON_H */
|
||||||
|
|
Loading…
Reference in a new issue