Change file position of some ieee80211 functions

This commit is contained in:
vemax78
2014-02-20 21:23:18 +01:00
parent ea02d7379e
commit 2bdcac10ba
6 changed files with 250 additions and 251 deletions

View File

@ -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));
}