Big update with type fix and minor new function.

Complete the IEEE802.11 Station Association with interation of AC in LocalMAC mode.
After the IEEE802.11 Authorization / Association is complete, the AC can now
authorize the WTP to accept data station packets with Station Configuration Message.
This commit is contained in:
vemax78
2014-04-14 22:33:12 +02:00
parent 2ec98ac74d
commit 3569267283
37 changed files with 969 additions and 401 deletions

View File

@ -662,7 +662,16 @@ int capwap_validate_parsed_packet(struct capwap_parsed_packet* packet, struct ca
}
case CAPWAP_STATION_CONFIGURATION_REQUEST: {
/* TODO */
if (capwap_get_message_element(packet, CAPWAP_ELEMENT_ADDSTATION)) {
if (binding == CAPWAP_WIRELESS_BINDING_IEEE80211) {
if (capwap_get_message_element(packet, CAPWAP_ELEMENT_80211_STATION)) {
return 0;
}
} else {
return 0;
}
}
break;
}

View File

@ -11,7 +11,7 @@ struct capwap_write_message_elements_ops {
int (*write_u8)(capwap_message_elements_handle handle, uint8_t data);
int (*write_u16)(capwap_message_elements_handle handle, uint16_t data);
int (*write_u32)(capwap_message_elements_handle handle, uint32_t data);
int (*write_block)(capwap_message_elements_handle handle, uint8_t* data, unsigned short length);
int (*write_block)(capwap_message_elements_handle handle, const uint8_t* data, unsigned short length);
};
struct capwap_read_message_elements_ops {

View File

@ -25,7 +25,7 @@ static void capwap_80211_miccountermeasures_element_create(void* data, capwap_me
func->write_u8(handle, element->radioid);
func->write_u8(handle, element->wlanid);
func->write_block(handle, element->address, CAPWAP_MIC_COUNTERMEASURES_MACADDRESS_LENGTH);
func->write_block(handle, element->address, MACADDRESS_EUI48_LENGTH);
}
/* */
@ -47,7 +47,7 @@ static void* capwap_80211_miccountermeasures_element_parsing(capwap_message_elem
/* Retrieve data */
func->read_u8(handle, &data->radioid);
func->read_u8(handle, &data->wlanid);
func->read_block(handle, data->address, CAPWAP_MIC_COUNTERMEASURES_MACADDRESS_LENGTH);
func->read_block(handle, data->address, MACADDRESS_EUI48_LENGTH);
return data;
}

View File

@ -3,12 +3,10 @@
#define CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES 1031
#define CAPWAP_MIC_COUNTERMEASURES_MACADDRESS_LENGTH 6
struct capwap_80211_miccountermeasures_element {
uint8_t radioid;
uint8_t wlanid;
uint8_t address[CAPWAP_MIC_COUNTERMEASURES_MACADDRESS_LENGTH];
uint8_t address[MACADDRESS_EUI48_LENGTH];
};
extern struct capwap_message_elements_ops capwap_element_80211_miccountermeasures_ops;

View File

@ -40,8 +40,8 @@ static void capwap_80211_rsnaerrorreport_element_create(void* data, capwap_messa
ASSERT(data != NULL);
func->write_block(handle, element->client, CAPWAP_RSNA_ERROR_REPORT_CLIENT_LENGTH);
func->write_block(handle, element->bssid, CAPWAP_RSNA_ERROR_REPORT_BSSID_LENGTH);
func->write_block(handle, element->client, MACADDRESS_EUI48_LENGTH);
func->write_block(handle, element->bssid, MACADDRESS_EUI48_LENGTH);
func->write_u8(handle, element->radioid);
func->write_u8(handle, element->wlanid);
func->write_u16(handle, 0);
@ -70,8 +70,8 @@ static void* capwap_80211_rsnaerrorreport_element_parsing(capwap_message_element
memset(data, 0, sizeof(struct capwap_80211_rsnaerrorreport_element));
/* Retrieve data */
func->read_block(handle, data->client, CAPWAP_RSNA_ERROR_REPORT_CLIENT_LENGTH);
func->read_block(handle, data->bssid, CAPWAP_RSNA_ERROR_REPORT_BSSID_LENGTH);
func->read_block(handle, data->client, MACADDRESS_EUI48_LENGTH);
func->read_block(handle, data->bssid, MACADDRESS_EUI48_LENGTH);
func->read_u8(handle, &data->radioid);
func->read_u8(handle, &data->wlanid);
func->read_u16(handle, NULL);

View File

@ -3,12 +3,9 @@
#define CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT 1035
#define CAPWAP_RSNA_ERROR_REPORT_CLIENT_LENGTH 6
#define CAPWAP_RSNA_ERROR_REPORT_BSSID_LENGTH 6
struct capwap_80211_rsnaerrorreport_element {
uint8_t client[CAPWAP_RSNA_ERROR_REPORT_CLIENT_LENGTH];
uint8_t bssid[CAPWAP_RSNA_ERROR_REPORT_BSSID_LENGTH];
uint8_t client[MACADDRESS_EUI48_LENGTH];
uint8_t bssid[MACADDRESS_EUI48_LENGTH];
uint8_t radioid;
uint8_t wlanid;
uint32_t tkipicverrors;

View File

@ -30,7 +30,7 @@ static void capwap_80211_station_element_create(void* data, capwap_message_eleme
func->write_u8(handle, element->radioid);
func->write_u16(handle, element->associationid);
func->write_u8(handle, element->flags);
func->write_block(handle, element->address, CAPWAP_STATION_ADDRESS_LENGTH);
func->write_block(handle, element->address, MACADDRESS_EUI48_LENGTH);
func->write_u16(handle, element->capabilities);
func->write_u8(handle, element->wlanid);
func->write_block(handle, element->supportedrates, element->supportedratescount);
@ -64,7 +64,7 @@ static void* capwap_80211_station_element_parsing(capwap_message_elements_handle
func->read_u8(handle, &data->radioid);
func->read_u16(handle, &data->associationid);
func->read_u8(handle, &data->flags);
func->read_block(handle, data->address, CAPWAP_STATION_ADDRESS_LENGTH);
func->read_block(handle, data->address, MACADDRESS_EUI48_LENGTH);
func->read_u16(handle, &data->capabilities);
func->read_u8(handle, &data->wlanid);
data->supportedratescount = length;

View File

@ -3,14 +3,13 @@
#define CAPWAP_ELEMENT_80211_STATION 1036
#define CAPWAP_STATION_ADDRESS_LENGTH 6
#define CAPWAP_STATION_RATES_MAXLENGTH 128
struct capwap_80211_station_element {
uint8_t radioid;
uint16_t associationid;
uint8_t flags;
uint8_t address[CAPWAP_STATION_ADDRESS_LENGTH];
uint8_t address[MACADDRESS_EUI48_LENGTH];
uint16_t capabilities;
uint8_t wlanid;
uint8_t supportedratescount;

View File

@ -31,7 +31,7 @@ static void capwap_80211_stationkey_element_create(void* data, capwap_message_el
ASSERT(data != NULL);
func->write_block(handle, element->address, CAPWAP_STATION_SESSION_KEY_ADDRESS_LENGTH);
func->write_block(handle, element->address, MACADDRESS_EUI48_LENGTH);
func->write_u16(handle, element->flags);
func->write_block(handle, element->pairwisetsc, CAPWAP_STATION_SESSION_KEY_PAIRWISE_TSC_LENGTH);
func->write_block(handle, element->pairwisersc, CAPWAP_STATION_SESSION_KEY_PAIRWISE_RSC_LENGTH);
@ -59,7 +59,7 @@ static void* capwap_80211_stationkey_element_parsing(capwap_message_elements_han
memset(data, 0, sizeof(struct capwap_80211_stationkey_element));
/* Retrieve data */
func->read_block(handle, data->address, CAPWAP_STATION_SESSION_KEY_ADDRESS_LENGTH);
func->read_block(handle, data->address, MACADDRESS_EUI48_LENGTH);
func->read_u16(handle, &data->flags);
func->read_block(handle, data->pairwisetsc, CAPWAP_STATION_SESSION_KEY_PAIRWISE_TSC_LENGTH);
func->read_block(handle, data->pairwisersc, CAPWAP_STATION_SESSION_KEY_PAIRWISE_RSC_LENGTH);

View File

@ -3,7 +3,6 @@
#define CAPWAP_ELEMENT_80211_STATION_SESSION_KEY_PROFILE 1038
#define CAPWAP_STATION_SESSION_KEY_ADDRESS_LENGTH 6
#define CAPWAP_STATION_SESSION_KEY_PAIRWISE_TSC_LENGTH 6
#define CAPWAP_STATION_SESSION_KEY_PAIRWISE_RSC_LENGTH 6
@ -11,7 +10,7 @@
#define CAPWAP_STATION_SESSION_KEY_AC_ENCRYPT 0x4000
struct capwap_80211_stationkey_element {
uint8_t address[CAPWAP_STATION_SESSION_KEY_ADDRESS_LENGTH];
uint8_t address[MACADDRESS_EUI48_LENGTH];
uint16_t flags;
uint8_t pairwisetsc[CAPWAP_STATION_SESSION_KEY_PAIRWISE_TSC_LENGTH];
uint8_t pairwisersc[CAPWAP_STATION_SESSION_KEY_PAIRWISE_RSC_LENGTH];

View File

@ -23,7 +23,7 @@ static void capwap_80211_stationqos_element_create(void* data, capwap_message_el
ASSERT(data != NULL);
func->write_block(handle, element->address, CAPWAP_STATION_QOS_ADDRESS_LENGTH);
func->write_block(handle, element->address, MACADDRESS_EUI48_LENGTH);
func->write_u8(handle, 0);
func->write_u8(handle, element->priority);
}
@ -45,7 +45,7 @@ static void* capwap_80211_stationqos_element_parsing(capwap_message_elements_han
memset(data, 0, sizeof(struct capwap_80211_stationqos_element));
/* Retrieve data */
func->read_block(handle, data->address, CAPWAP_STATION_QOS_ADDRESS_LENGTH);
func->read_block(handle, data->address, MACADDRESS_EUI48_LENGTH);
func->read_u8(handle, NULL);
func->read_u8(handle, &data->priority);

View File

@ -3,10 +3,8 @@
#define CAPWAP_ELEMENT_80211_STATION_QOS_PROFILE 1037
#define CAPWAP_STATION_QOS_ADDRESS_LENGTH 6
struct capwap_80211_stationqos_element {
uint8_t address[CAPWAP_STATION_QOS_ADDRESS_LENGTH];
uint8_t address[MACADDRESS_EUI48_LENGTH];
uint8_t priority;
};

View File

@ -31,7 +31,7 @@ static void capwap_80211_updatestationqos_element_create(void* data, capwap_mess
ASSERT(data != NULL);
func->write_u8(handle, element->radioid);
func->write_block(handle, element->address, CAPWAP_UPDATE_STATION_QOS_ADDRESS_LENGTH);
func->write_block(handle, element->address, MACADDRESS_EUI48_LENGTH);
for (i = 0; i < CAPWAP_UPDATE_STATION_QOS_SUBELEMENTS; i++) {
func->write_u8(handle, element->qos[i].priority8021p & CAPWAP_UPDATE_STATION_QOS_PRIORIY_MASK);
func->write_u8(handle, element->qos[i].dscp & CAPWAP_UPDATE_STATION_QOS_DSCP_MASK);

View File

@ -3,7 +3,6 @@
#define CAPWAP_ELEMENT_80211_UPDATE_STATION_QOS 1043
#define CAPWAP_UPDATE_STATION_QOS_ADDRESS_LENGTH 6
#define CAPWAP_UPDATE_STATION_QOS_SUBELEMENTS 4
#define CAPWAP_UPDATE_STATION_QOS_PRIORIY_MASK 0x07
@ -16,7 +15,7 @@ struct capwap_80211_updatestationqos_subelement {
struct capwap_80211_updatestationqos_element {
uint8_t radioid;
uint8_t address[CAPWAP_UPDATE_STATION_QOS_ADDRESS_LENGTH];
uint8_t address[MACADDRESS_EUI48_LENGTH];
struct capwap_80211_updatestationqos_subelement qos[CAPWAP_UPDATE_STATION_QOS_SUBELEMENTS];
};

View File

@ -31,7 +31,7 @@ static void capwap_80211_wtpradioconf_element_create(void* data, capwap_message_
func->write_u8(handle, element->shortpreamble);
func->write_u8(handle, element->maxbssid);
func->write_u8(handle, element->dtimperiod);
func->write_block(handle, element->bssid, CAPWAP_WTP_RADIO_CONF_BSSID_LENGTH);
func->write_block(handle, element->bssid, MACADDRESS_EUI48_LENGTH);
func->write_u16(handle, element->beaconperiod);
func->write_block(handle, element->country, CAPWAP_WTP_RADIO_CONF_COUNTRY_LENGTH);
}
@ -57,7 +57,7 @@ static void* capwap_80211_wtpradioconf_element_parsing(capwap_message_elements_h
func->read_u8(handle, &data->shortpreamble);
func->read_u8(handle, &data->maxbssid);
func->read_u8(handle, &data->dtimperiod);
func->read_block(handle, data->bssid, CAPWAP_WTP_RADIO_CONF_BSSID_LENGTH);
func->read_block(handle, data->bssid, MACADDRESS_EUI48_LENGTH);
func->read_u16(handle, &data->beaconperiod);
func->read_block(handle, data->country, CAPWAP_WTP_RADIO_CONF_COUNTRY_LENGTH);

View File

@ -3,7 +3,6 @@
#define CAPWAP_ELEMENT_80211_WTP_RADIO_CONF 1046
#define CAPWAP_WTP_RADIO_CONF_BSSID_LENGTH 6
#define CAPWAP_WTP_RADIO_CONF_COUNTRY_LENGTH 4
#define CAPWAP_WTP_RADIO_CONF_SHORTPREAMBLE_DISABLE 0
@ -14,7 +13,7 @@ struct capwap_80211_wtpradioconf_element {
uint8_t shortpreamble;
uint8_t maxbssid;
uint8_t dtimperiod;
uint8_t bssid[CAPWAP_WTP_RADIO_CONF_BSSID_LENGTH];
uint8_t bssid[MACADDRESS_EUI48_LENGTH];
uint16_t beaconperiod;
uint8_t country[CAPWAP_WTP_RADIO_CONF_COUNTRY_LENGTH];
};

View File

@ -352,7 +352,7 @@ static struct capwap_list_item* capwap_packet_txmng_create_fragment_item(struct
}
/* */
static int capwap_fragment_write_block_from_pos(struct capwap_packet_txmng* txmngpacket, uint8_t* data, unsigned short length, struct write_block_from_pos* writepos) {
static int capwap_fragment_write_block_from_pos(struct capwap_packet_txmng* txmngpacket, const uint8_t* data, unsigned short length, struct write_block_from_pos* writepos) {
unsigned short packetpos;
struct capwap_list_item* item;
struct capwap_fragment_packet_item* fragmentpacket;
@ -430,7 +430,7 @@ static int capwap_fragment_write_block_from_pos(struct capwap_packet_txmng* txmn
}
/* */
static int capwap_fragment_write_block(capwap_message_elements_handle handle, uint8_t* data, unsigned short length) {
static int capwap_fragment_write_block(capwap_message_elements_handle handle, const uint8_t* data, unsigned short length) {
struct capwap_packet_txmng* txmngpacket;
struct write_block_from_pos writepos;
@ -611,7 +611,7 @@ struct capwap_packet_txmng* capwap_packet_txmng_create_data_message(struct capwa
}
/* */
void capwap_packet_txmng_add_data(struct capwap_packet_txmng* txmngpacket, uint8_t* data, unsigned short length) {
void capwap_packet_txmng_add_data(struct capwap_packet_txmng* txmngpacket, const uint8_t* data, unsigned short length) {
ASSERT(txmngpacket != NULL);
ASSERT(txmngpacket->isctrlpacket == 0);

View File

@ -65,7 +65,7 @@ struct capwap_packet_txmng {
/* */
struct capwap_packet_txmng* capwap_packet_txmng_create_ctrl_message(struct capwap_header_data* data, unsigned long type, unsigned char seq, unsigned short mtu);
struct capwap_packet_txmng* capwap_packet_txmng_create_data_message(struct capwap_header_data* data, unsigned short mtu);
void capwap_packet_txmng_add_data(struct capwap_packet_txmng* txmngpacket, uint8_t* data, unsigned short length);
void capwap_packet_txmng_add_data(struct capwap_packet_txmng* txmngpacket, const uint8_t* data, unsigned short length);
void capwap_packet_txmng_add_message_element(struct capwap_packet_txmng* txmngpacket, unsigned short type, void* data);
void capwap_packet_txmng_get_fragment_packets(struct capwap_packet_txmng* txmngpacket, struct capwap_list* fragmentlist, unsigned short fragmentid);
void capwap_packet_txmng_free(struct capwap_packet_txmng* txmngpacket);