Started implementing the packet management of IEEE802.11 by AC side.
Made it clear some constants.
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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__ */
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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 {
|
||||
|
Reference in New Issue
Block a user