Started implementing the packet management of IEEE802.11 by AC side.

Made it clear some constants.
This commit is contained in:
vemax78
2014-04-02 22:40:04 +02:00
parent 7fd2d4357a
commit ae97e96f57
24 changed files with 609 additions and 44 deletions

View File

@ -25,7 +25,7 @@ static void capwap_80211_assignbssid_element_create(void* data, capwap_message_e
func->write_u8(handle, element->radioid);
func->write_u8(handle, element->wlanid);
func->write_block(handle, element->bssid, CAPWAP_ASSIGN_BSSID_LENGTH);
func->write_block(handle, element->bssid, MACADDRESS_EUI48_LENGTH);
}
/* */
@ -47,7 +47,7 @@ static void* capwap_80211_assignbssid_element_parsing(capwap_message_elements_ha
/* Retrieve data */
func->read_u8(handle, &data->radioid);
func->read_u8(handle, &data->wlanid);
func->read_block(handle, data->bssid, CAPWAP_ASSIGN_BSSID_LENGTH);
func->read_block(handle, data->bssid, MACADDRESS_EUI48_LENGTH);
return data;
}

View File

@ -3,12 +3,10 @@
#define CAPWAP_ELEMENT_80211_ASSIGN_BSSID 1026
#define CAPWAP_ASSIGN_BSSID_LENGTH 6
struct capwap_80211_assignbssid_element {
uint8_t radioid;
uint8_t wlanid;
uint8_t bssid[CAPWAP_ASSIGN_BSSID_LENGTH];
uint8_t bssid[MACADDRESS_EUI48_LENGTH];
};
extern struct capwap_message_elements_ops capwap_element_80211_assignbssid_ops;

View File

@ -57,7 +57,7 @@ static void* capwap_80211_updatestationqos_element_parsing(capwap_message_elemen
/* Retrieve data */
func->read_u8(handle, &data->radioid);
func->read_block(handle, data->address, CAPWAP_ASSIGN_BSSID_LENGTH);
func->read_block(handle, data->address, MACADDRESS_EUI48_LENGTH);
for (i = 0; i < CAPWAP_UPDATE_STATION_QOS_SUBELEMENTS; i++) {
func->read_u8(handle, &data->qos[i].priority8021p);
data->qos[i].priority8021p &= CAPWAP_UPDATE_STATION_QOS_PRIORIY_MASK;

View File

@ -59,8 +59,6 @@ static struct capwap_hash_item* capwap_hash_search_items(struct capwap_hash* has
/* */
static int capwap_hash_foreach_items(struct capwap_hash* hash, struct capwap_hash_item* item, capwap_hash_item_foreach item_foreach, void* param) {
int result;
ASSERT(hash != NULL);
ASSERT(item_foreach != NULL);
ASSERT(item != NULL);
@ -73,8 +71,7 @@ static int capwap_hash_foreach_items(struct capwap_hash* hash, struct capwap_has
}
/* */
result = item_foreach(item->key, hash->keysize, item->data, param);
if (!result) {
if (!item_foreach(item->key, hash->keysize, item->data, param)) {
return 0;
}

View File

@ -1300,7 +1300,7 @@ void capwap_interface_list(struct capwap_network* net, struct capwap_list* list)
/* */
char* capwap_printf_macaddress(char* buffer, const unsigned char* macaddress, int type) {
char* capwap_printf_macaddress(char* buffer, const uint8_t* macaddress, int type) {
if (type == MACADDRESS_EUI48_LENGTH) {
sprintf(buffer, "%02x:%02x:%02x:%02x:%02x:%02x", macaddress[0], macaddress[1], macaddress[2], macaddress[3], macaddress[4], macaddress[5]);
} else if (type == MACADDRESS_EUI64_LENGTH) {
@ -1313,7 +1313,7 @@ char* capwap_printf_macaddress(char* buffer, const unsigned char* macaddress, in
}
/* */
int capwap_scanf_macaddress(unsigned char* macaddress, const char* buffer, int type) {
int capwap_scanf_macaddress(uint8_t* macaddress, const char* buffer, int type) {
if (type == MACADDRESS_EUI48_LENGTH) {
if (sscanf(buffer, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", &macaddress[0], &macaddress[1], &macaddress[2], &macaddress[3], &macaddress[4], &macaddress[5]) != 6) {
return 0;

View File

@ -8,11 +8,6 @@
#define CAPWAP_CONTROL_PORT 5246
#define CAPWAP_MAX_PACKET_SIZE 65535
#define CAPWAP_MACADDRESS_NONE 0
#define CAPWAP_MACADDRESS_EUI48 6
#define CAPWAP_MACADDRESS_EUI64 8
#define CAPWAP_MACADDRESS_MAX_SIZE CAPWAP_MACADDRESS_EUI64
/* Helper */
#define CAPWAP_GET_NETWORK_PORT(address) ntohs((((address)->ss_family == AF_INET) ? ((struct sockaddr_in*)(address))->sin_port : ((struct sockaddr_in6*)(address))->sin6_port))
#define CAPWAP_SET_NETWORK_PORT(address, port) if ((address)->ss_family == AF_INET) { \
@ -95,7 +90,7 @@ int capwap_address_from_string(const char* ip, struct sockaddr_storage* address)
int capwap_get_localaddress_by_remoteaddress(struct sockaddr_storage* local, struct sockaddr_storage* remote, char* oif, int ipv6dualstack);
char* capwap_printf_macaddress(char* buffer, const unsigned char* macaddress, int type);
int capwap_scanf_macaddress(unsigned char* macaddress, const char* buffer, int type);
char* capwap_printf_macaddress(char* buffer, const uint8_t* macaddress, int type);
int capwap_scanf_macaddress(uint8_t* macaddress, const char* buffer, int type);
#endif /* __CAPWAP_NETWORK_HEADER__ */

View File

@ -208,7 +208,7 @@ void capwap_header_set_radio_macaddress(struct capwap_header_data* data, int rad
ASSERT(data != NULL);
header = (struct capwap_header*)&data->headerbuffer[0];
if (radiotype == CAPWAP_MACADDRESS_NONE) {
if (radiotype == MACADDRESS_NONE_LENGTH) {
if (IS_FLAG_M_HEADER(header)) {
if (!IS_FLAG_W_HEADER(header)) {
SET_HLEN_HEADER(header, sizeof(struct capwap_header) / 4);
@ -230,7 +230,7 @@ void capwap_header_set_radio_macaddress(struct capwap_header_data* data, int rad
int size = sizeof(struct capwap_header) / 4;
ASSERT(macaddress != NULL);
ASSERT((radiotype == CAPWAP_MACADDRESS_EUI48) || (radiotype == CAPWAP_MACADDRESS_EUI64));
ASSERT((radiotype == MACADDRESS_EUI48_LENGTH) || (radiotype == MACADDRESS_EUI64_LENGTH));
if (IS_FLAG_M_HEADER(header)) {
radio = GET_RADIO_MAC_ADDRESS_STRUCT(header);
@ -242,7 +242,7 @@ void capwap_header_set_radio_macaddress(struct capwap_header_data* data, int rad
}
/* Remove old radio mac address */
capwap_header_set_radio_macaddress(data, CAPWAP_MACADDRESS_NONE, NULL);
capwap_header_set_radio_macaddress(data, MACADDRESS_NONE_LENGTH, NULL);
}
/* Radio mac address size*/
@ -1001,6 +1001,45 @@ int capwap_packet_rxmng_add_recv_packet(struct capwap_packet_rxmng* rxmngpacket,
return CAPWAP_WRONG_FRAGMENT;
}
/* */
struct capwap_packet_rxmng* capwap_packet_rxmng_create_from_requestfragmentpacket(struct capwap_list* requestfragmentpacket) {
struct capwap_packet_rxmng* rxmngpacket;
struct capwap_list_item* fragment;
int result = CAPWAP_WRONG_FRAGMENT;
ASSERT(requestfragmentpacket != NULL);
if (!requestfragmentpacket->count) {
return NULL;
}
/* */
rxmngpacket = capwap_packet_rxmng_create_message(CAPWAP_CONTROL_PACKET);
/* */
fragment = requestfragmentpacket->first;
while (fragment != NULL) {
struct capwap_fragment_packet_item* fragmentpacket = (struct capwap_fragment_packet_item*)fragment->item;
/* Append fragment */
result = capwap_packet_rxmng_add_recv_packet(rxmngpacket, fragmentpacket->buffer, fragmentpacket->offset);
if (result == CAPWAP_WRONG_FRAGMENT) {
break;
}
/* Next fragment */
fragment = fragment->next;
}
/* */
if (result != CAPWAP_RECEIVE_COMPLETE_PACKET) {
capwap_packet_rxmng_free(rxmngpacket);
rxmngpacket = NULL;
}
return rxmngpacket;
}
/* */
void capwap_packet_rxmng_free(struct capwap_packet_rxmng* rxmngpacket) {
if (rxmngpacket) {

View File

@ -107,10 +107,16 @@ struct capwap_packet_rxmng {
#define CAPWAP_REQUEST_MORE_FRAGMENT 0
#define CAPWAP_RECEIVE_COMPLETE_PACKET 1
#define CAPWAP_CONTROL_PACKET 1
#define CAPWAP_DATA_PACKET 0
struct capwap_packet_rxmng* capwap_packet_rxmng_create_message(int isctrlpacket);
int capwap_packet_rxmng_add_recv_packet(struct capwap_packet_rxmng* rxmngpacket, void* data, int length);
void capwap_packet_rxmng_free(struct capwap_packet_rxmng* rxmngpacket);
/* Parsing a packet sent */
struct capwap_packet_rxmng* capwap_packet_rxmng_create_from_requestfragmentpacket(struct capwap_list* requestfragmentpacket);
/* */
int capwap_is_request_type(unsigned long type);

View File

@ -188,6 +188,9 @@ struct capwap_data_message {
#define IS_SEQUENCE_SMALLER(s1, s2) (((((s1) < (s2)) && (((s2) - (s1)) < 128)) || (((s1) > (s2)) && (((s1) - (s2)) > 128))) ? 1 : 0)
/* */
#define MACADDRESS_NONE_LENGTH 0
/* */
#define MACADDRESS_EUI48_LENGTH 6
struct capwap_macaddress_eui48 {