Change file position of some ieee80211 functions
This commit is contained in:
@ -572,224 +572,3 @@ int wifi_frequency_to_radiotype(uint32_t freq) {
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* */
|
||||
unsigned long wifi_frequency_to_channel(uint32_t freq) {
|
||||
if ((freq >= 2412) && (freq <= 2472)) {
|
||||
return (freq - 2407) / 5;
|
||||
} else if (freq == 2484) {
|
||||
return 14;
|
||||
} else if ((freq >= 4915) && (freq <= 4980)) {
|
||||
return (freq - 4000) / 5;
|
||||
} else if ((freq >= 5035) && (freq <= 5825)) {
|
||||
return (freq - 5000) / 5;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* */
|
||||
int wifi_is_broadcast_addr(const uint8_t* addr) {
|
||||
return (((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)) ? 1 : 0);
|
||||
}
|
||||
|
||||
/* */
|
||||
int wifi_is_valid_ssid(const char* ssid, struct ieee80211_ie_ssid* iessid, struct ieee80211_ie_ssid_list* isssidlist) {
|
||||
int ssidlength;
|
||||
|
||||
ASSERT(ssid != NULL);
|
||||
|
||||
if (!iessid) {
|
||||
return WIFI_WRONG_SSID;
|
||||
}
|
||||
|
||||
/* Check SSID */
|
||||
ssidlength = strlen((char*)ssid);
|
||||
if ((ssidlength == iessid->len) && !memcmp(ssid, iessid->ssid, ssidlength)) {
|
||||
return WIFI_VALID_SSID;
|
||||
}
|
||||
|
||||
/* Check SSID list */
|
||||
if (isssidlist) {
|
||||
int length = isssidlist->len;
|
||||
uint8_t* pos = isssidlist->lists;
|
||||
|
||||
while (length >= sizeof(struct ieee80211_ie)) {
|
||||
struct ieee80211_ie_ssid* ssiditem = (struct ieee80211_ie_ssid*)pos;
|
||||
|
||||
/* Check buffer */
|
||||
length -= sizeof(struct ieee80211_ie);
|
||||
if ((ssiditem->id != IEEE80211_IE_SSID) || !ssiditem->len || (length < ssiditem->len)) {
|
||||
break;
|
||||
} else if ((ssidlength == ssiditem->len) && !memcmp(ssid, ssiditem->ssid, ssidlength)) {
|
||||
return WIFI_VALID_SSID;
|
||||
}
|
||||
|
||||
/* Next */
|
||||
length -= ssiditem->len;
|
||||
pos += sizeof(struct ieee80211_ie) + ssiditem->len;
|
||||
}
|
||||
}
|
||||
|
||||
return (!iessid->len ? WIFI_WILDCARD_SSID : WIFI_WRONG_SSID);
|
||||
}
|
||||
|
||||
/* */
|
||||
int wifi_retrieve_information_elements_position(struct ieee80211_ie_items* items, const uint8_t* data, int length) {
|
||||
ASSERT(items != NULL);
|
||||
ASSERT(data != NULL);
|
||||
|
||||
/* */
|
||||
memset(items, 0, sizeof(struct ieee80211_ie_items));
|
||||
|
||||
/* Parsing */
|
||||
while (length >= 2) {
|
||||
uint8_t ie_id = data[0];
|
||||
uint8_t ie_len = data[1];
|
||||
|
||||
/* Parsing Information Element */
|
||||
switch (ie_id) {
|
||||
case IEEE80211_IE_SSID: {
|
||||
if (ie_len > IEEE80211_IE_SSID_MAX_LENGTH) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
items->ssid = (struct ieee80211_ie_ssid*)data;
|
||||
break;
|
||||
}
|
||||
|
||||
case IEEE80211_IE_SUPPORTED_RATES: {
|
||||
if ((ie_len < IEEE80211_IE_SUPPORTED_RATES_MIN_LENGTH) || (ie_len > IEEE80211_IE_SUPPORTED_RATES_MAX_LENGTH)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
items->supported_rates = (struct ieee80211_ie_supported_rates*)data;
|
||||
break;
|
||||
}
|
||||
|
||||
case IEEE80211_IE_DSSS: {
|
||||
if (ie_len != IEEE80211_IE_DSSS_LENGTH) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
items->dsss = (struct ieee80211_ie_dsss*)data;
|
||||
break;
|
||||
}
|
||||
|
||||
case IEEE80211_IE_COUNTRY: {
|
||||
if (ie_len < IEEE80211_IE_COUNTRY_MIN_LENGTH) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
items->country = (struct ieee80211_ie_country*)data;
|
||||
break;
|
||||
}
|
||||
|
||||
case IEEE80211_IE_CHALLENGE_TEXT: {
|
||||
if (ie_len < IEEE80211_IE_CHALLENGE_TEXT_MIN_LENGTH) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
items->challenge_text = (struct ieee80211_ie_challenge_text*)data;
|
||||
break;
|
||||
}
|
||||
|
||||
case IEEE80211_IE_ERP: {
|
||||
if (ie_len != IEEE80211_IE_ERP_LENGTH) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
items->erp = (struct ieee80211_ie_erp*)data;
|
||||
break;
|
||||
}
|
||||
|
||||
case IEEE80211_IE_EXTENDED_SUPPORTED_RATES: {
|
||||
if (ie_len < IEEE80211_IE_EXTENDED_SUPPORTED_MIN_LENGTH) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
items->extended_supported_rates = (struct ieee80211_ie_extended_supported_rates*)data;
|
||||
break;
|
||||
}
|
||||
|
||||
case IEEE80211_IE_EDCA_PARAMETER_SET: {
|
||||
if (ie_len != IEEE80211_IE_EDCA_PARAMETER_SET_LENGTH) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
items->edca_parameter_set = (struct ieee80211_ie_edca_parameter_set*)data;
|
||||
break;
|
||||
}
|
||||
|
||||
case IEEE80211_IE_QOS_CAPABILITY: {
|
||||
if (ie_len != IEEE80211_IE_QOS_CAPABILITY_LENGTH) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
items->qos_capability = (struct ieee80211_ie_qos_capability*)data;
|
||||
break;
|
||||
}
|
||||
|
||||
case IEEE80211_IE_POWER_CONSTRAINT: {
|
||||
if (ie_len != IEEE80211_IE_POWER_CONSTRAINT_LENGTH) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
items->power_constraint = (struct ieee80211_ie_power_constraint*)data;
|
||||
break;
|
||||
}
|
||||
|
||||
case IEEE80211_IE_SSID_LIST: {
|
||||
items->ssid_list = (struct ieee80211_ie_ssid_list*)data;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Next Information Element */
|
||||
data += sizeof(struct ieee80211_ie) + ie_len;
|
||||
length -= sizeof(struct ieee80211_ie) + ie_len;
|
||||
}
|
||||
|
||||
return (!length ? 0 : -1);
|
||||
}
|
||||
|
||||
/* */
|
||||
int wifi_aid_create(uint32_t* aidbitfield, uint16_t* aid) {
|
||||
int i, j;
|
||||
|
||||
ASSERT(aidbitfield != NULL);
|
||||
ASSERT(aid != NULL);
|
||||
|
||||
/* Search free aid bitfield */
|
||||
for (i = 0; i < WIFI_AID_BITFIELD_SIZE; i++) {
|
||||
if (aidbitfield[i] != 0xffffffff) {
|
||||
uint32_t bitfield = aidbitfield[i];
|
||||
|
||||
/* Search free bit */
|
||||
for (j = 0; j < 32; j++) {
|
||||
if (!(bitfield & (1 << j))) {
|
||||
*aid = i * 32 + j + 1;
|
||||
if (*aid <= IEEE80211_AID_MAX_VALUE) {
|
||||
aidbitfield[i] |= (1 << j);
|
||||
return 0;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
*aid = 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* */
|
||||
void wifi_aid_free(uint32_t* aidbitfield, uint16_t aid) {
|
||||
ASSERT(aidbitfield != NULL);
|
||||
ASSERT((aid > 0) && (aid <= IEEE80211_AID_MAX_VALUE));
|
||||
|
||||
aidbitfield[(aid - 1) / 32] &= ~(1 << ((aid - 1) % 32));
|
||||
}
|
||||
|
Reference in New Issue
Block a user