[wtp] prepare message elements for vendor element handling
convert message element type into a struct{ vendor, type }. Vendor will be 0 for all RFC types.
This commit is contained in:
@ -6,102 +6,108 @@
|
||||
/* */
|
||||
#define element_ops(Id, Ops) [(Id) - CAPWAP_MESSAGE_ELEMENTS_START] = &(Ops)
|
||||
static const struct capwap_message_elements_ops * capwap_message_elements[] = {
|
||||
element_ops(CAPWAP_ELEMENT_ACDESCRIPTION, capwap_element_acdescriptor_ops),
|
||||
element_ops(CAPWAP_ELEMENT_ACIPV4LIST, capwap_element_acipv4list_ops),
|
||||
element_ops(CAPWAP_ELEMENT_ACIPV6LIST, capwap_element_acipv6list_ops),
|
||||
element_ops(CAPWAP_ELEMENT_ACNAME, capwap_element_acname_ops),
|
||||
element_ops(CAPWAP_ELEMENT_ACNAMEPRIORITY, capwap_element_acnamepriority_ops),
|
||||
element_ops(CAPWAP_ELEMENT_ACTIMESTAMP, capwap_element_actimestamp_ops),
|
||||
element_ops(CAPWAP_ELEMENT_ADDMACACL, capwap_element_addmacacl_ops),
|
||||
element_ops(CAPWAP_ELEMENT_ADDSTATION, capwap_element_addstation_ops),
|
||||
element_ops(CAPWAP_ELEMENT_CONTROLIPV4, capwap_element_controlipv4_ops),
|
||||
element_ops(CAPWAP_ELEMENT_CONTROLIPV6, capwap_element_controlipv6_ops),
|
||||
element_ops(CAPWAP_ELEMENT_TIMERS, capwap_element_timers_ops),
|
||||
element_ops(CAPWAP_ELEMENT_DATATRANSFERDATA, capwap_element_datatransferdata_ops),
|
||||
element_ops(CAPWAP_ELEMENT_DATATRANSFERMODE, capwap_element_datatransfermode_ops),
|
||||
element_ops(CAPWAP_ELEMENT_DECRYPTERRORREPORT, capwap_element_decrypterrorreport_ops),
|
||||
element_ops(CAPWAP_ELEMENT_DECRYPTERRORREPORTPERIOD, capwap_element_decrypterrorreportperiod_ops),
|
||||
element_ops(CAPWAP_ELEMENT_DELETEMACACL, capwap_element_deletemacacl_ops),
|
||||
element_ops(CAPWAP_ELEMENT_DELETESTATION, capwap_element_deletestation_ops),
|
||||
element_ops(CAPWAP_ELEMENT_DISCOVERYTYPE, capwap_element_discoverytype_ops),
|
||||
element_ops(CAPWAP_ELEMENT_DUPLICATEIPV4, capwap_element_duplicateipv4_ops),
|
||||
element_ops(CAPWAP_ELEMENT_DUPLICATEIPV6, capwap_element_duplicateipv6_ops),
|
||||
element_ops(CAPWAP_ELEMENT_IDLETIMEOUT, capwap_element_idletimeout_ops),
|
||||
element_ops(CAPWAP_ELEMENT_IMAGEDATA, capwap_element_imagedata_ops),
|
||||
element_ops(CAPWAP_ELEMENT_IMAGEIDENTIFIER, capwap_element_imageidentifier_ops),
|
||||
element_ops(CAPWAP_ELEMENT_IMAGEINFO, capwap_element_imageinfo_ops),
|
||||
element_ops(CAPWAP_ELEMENT_INITIATEDOWNLOAD, capwap_element_initdownload_ops),
|
||||
element_ops(CAPWAP_ELEMENT_LOCATION, capwap_element_location_ops),
|
||||
element_ops(CAPWAP_ELEMENT_MAXIMUMLENGTH, capwap_element_maximumlength_ops),
|
||||
element_ops(CAPWAP_ELEMENT_LOCALIPV4, capwap_element_localipv4_ops),
|
||||
element_ops(CAPWAP_ELEMENT_RADIOADMSTATE, capwap_element_radioadmstate_ops),
|
||||
element_ops(CAPWAP_ELEMENT_RADIOOPRSTATE, capwap_element_radiooprstate_ops),
|
||||
element_ops(CAPWAP_ELEMENT_RESULTCODE, capwap_element_resultcode_ops),
|
||||
element_ops(CAPWAP_ELEMENT_RETURNEDMESSAGE, capwap_element_returnedmessage_ops),
|
||||
element_ops(CAPWAP_ELEMENT_SESSIONID, capwap_element_sessionid_ops),
|
||||
element_ops(CAPWAP_ELEMENT_STATISTICSTIMER, capwap_element_statisticstimer_ops),
|
||||
element_ops(CAPWAP_ELEMENT_VENDORPAYLOAD, capwap_element_vendorpayload_ops),
|
||||
element_ops(CAPWAP_ELEMENT_WTPBOARDDATA, capwap_element_wtpboarddata_ops),
|
||||
element_ops(CAPWAP_ELEMENT_WTPDESCRIPTOR, capwap_element_wtpdescriptor_ops),
|
||||
element_ops(CAPWAP_ELEMENT_WTPFALLBACK, capwap_element_wtpfallback_ops),
|
||||
element_ops(CAPWAP_ELEMENT_WTPFRAMETUNNELMODE, capwap_element_wtpframetunnelmode_ops),
|
||||
element_ops(CAPWAP_ELEMENT_WTPMACTYPE, capwap_element_wtpmactype_ops),
|
||||
element_ops(CAPWAP_ELEMENT_WTPNAME, capwap_element_wtpname_ops),
|
||||
element_ops(CAPWAP_ELEMENT_WTPRADIOSTAT, capwap_element_wtpradiostat_ops),
|
||||
element_ops(CAPWAP_ELEMENT_WTPREBOOTSTAT, capwap_element_wtprebootstat_ops),
|
||||
element_ops(CAPWAP_ELEMENT_WTPSTATICIPADDRESS, capwap_element_wtpstaticipaddress_ops),
|
||||
element_ops(CAPWAP_ELEMENT_LOCALIPV6, capwap_element_localipv6_ops),
|
||||
element_ops(CAPWAP_ELEMENT_TRANSPORT, capwap_element_transport_ops),
|
||||
element_ops(CAPWAP_ELEMENT_MTUDISCOVERY, capwap_element_mtudiscovery_ops),
|
||||
element_ops(CAPWAP_ELEMENT_ECNSUPPORT, capwap_element_ecnsupport_ops)
|
||||
element_ops(CAPWAP_ELEMENT_ACDESCRIPTION_TYPE, capwap_element_acdescriptor_ops),
|
||||
element_ops(CAPWAP_ELEMENT_ACIPV4LIST_TYPE, capwap_element_acipv4list_ops),
|
||||
element_ops(CAPWAP_ELEMENT_ACIPV6LIST_TYPE, capwap_element_acipv6list_ops),
|
||||
element_ops(CAPWAP_ELEMENT_ACNAME_TYPE, capwap_element_acname_ops),
|
||||
element_ops(CAPWAP_ELEMENT_ACNAMEPRIORITY_TYPE, capwap_element_acnamepriority_ops),
|
||||
element_ops(CAPWAP_ELEMENT_ACTIMESTAMP_TYPE, capwap_element_actimestamp_ops),
|
||||
element_ops(CAPWAP_ELEMENT_ADDMACACL_TYPE, capwap_element_addmacacl_ops),
|
||||
element_ops(CAPWAP_ELEMENT_ADDSTATION_TYPE, capwap_element_addstation_ops),
|
||||
element_ops(CAPWAP_ELEMENT_CONTROLIPV4_TYPE, capwap_element_controlipv4_ops),
|
||||
element_ops(CAPWAP_ELEMENT_CONTROLIPV6_TYPE, capwap_element_controlipv6_ops),
|
||||
element_ops(CAPWAP_ELEMENT_TIMERS_TYPE, capwap_element_timers_ops),
|
||||
element_ops(CAPWAP_ELEMENT_DATATRANSFERDATA_TYPE, capwap_element_datatransferdata_ops),
|
||||
element_ops(CAPWAP_ELEMENT_DATATRANSFERMODE_TYPE, capwap_element_datatransfermode_ops),
|
||||
element_ops(CAPWAP_ELEMENT_DECRYPTERRORREPORT_TYPE, capwap_element_decrypterrorreport_ops),
|
||||
element_ops(CAPWAP_ELEMENT_DECRYPTERRORREPORTPERIOD_TYPE, capwap_element_decrypterrorreportperiod_ops),
|
||||
element_ops(CAPWAP_ELEMENT_DELETEMACACL_TYPE, capwap_element_deletemacacl_ops),
|
||||
element_ops(CAPWAP_ELEMENT_DELETESTATION_TYPE, capwap_element_deletestation_ops),
|
||||
element_ops(CAPWAP_ELEMENT_DISCOVERYTYPE_TYPE, capwap_element_discoverytype_ops),
|
||||
element_ops(CAPWAP_ELEMENT_DUPLICATEIPV4_TYPE, capwap_element_duplicateipv4_ops),
|
||||
element_ops(CAPWAP_ELEMENT_DUPLICATEIPV6_TYPE, capwap_element_duplicateipv6_ops),
|
||||
element_ops(CAPWAP_ELEMENT_IDLETIMEOUT_TYPE, capwap_element_idletimeout_ops),
|
||||
element_ops(CAPWAP_ELEMENT_IMAGEDATA_TYPE, capwap_element_imagedata_ops),
|
||||
element_ops(CAPWAP_ELEMENT_IMAGEIDENTIFIER_TYPE, capwap_element_imageidentifier_ops),
|
||||
element_ops(CAPWAP_ELEMENT_IMAGEINFO_TYPE, capwap_element_imageinfo_ops),
|
||||
element_ops(CAPWAP_ELEMENT_INITIATEDOWNLOAD_TYPE, capwap_element_initdownload_ops),
|
||||
element_ops(CAPWAP_ELEMENT_LOCATION_TYPE, capwap_element_location_ops),
|
||||
element_ops(CAPWAP_ELEMENT_MAXIMUMLENGTH_TYPE, capwap_element_maximumlength_ops),
|
||||
element_ops(CAPWAP_ELEMENT_LOCALIPV4_TYPE, capwap_element_localipv4_ops),
|
||||
element_ops(CAPWAP_ELEMENT_RADIOADMSTATE_TYPE, capwap_element_radioadmstate_ops),
|
||||
element_ops(CAPWAP_ELEMENT_RADIOOPRSTATE_TYPE, capwap_element_radiooprstate_ops),
|
||||
element_ops(CAPWAP_ELEMENT_RESULTCODE_TYPE, capwap_element_resultcode_ops),
|
||||
element_ops(CAPWAP_ELEMENT_RETURNEDMESSAGE_TYPE, capwap_element_returnedmessage_ops),
|
||||
element_ops(CAPWAP_ELEMENT_SESSIONID_TYPE, capwap_element_sessionid_ops),
|
||||
element_ops(CAPWAP_ELEMENT_STATISTICSTIMER_TYPE, capwap_element_statisticstimer_ops),
|
||||
element_ops(CAPWAP_ELEMENT_VENDORPAYLOAD_TYPE, capwap_element_vendorpayload_ops),
|
||||
element_ops(CAPWAP_ELEMENT_WTPBOARDDATA_TYPE, capwap_element_wtpboarddata_ops),
|
||||
element_ops(CAPWAP_ELEMENT_WTPDESCRIPTOR_TYPE, capwap_element_wtpdescriptor_ops),
|
||||
element_ops(CAPWAP_ELEMENT_WTPFALLBACK_TYPE, capwap_element_wtpfallback_ops),
|
||||
element_ops(CAPWAP_ELEMENT_WTPFRAMETUNNELMODE_TYPE, capwap_element_wtpframetunnelmode_ops),
|
||||
element_ops(CAPWAP_ELEMENT_WTPMACTYPE_TYPE, capwap_element_wtpmactype_ops),
|
||||
element_ops(CAPWAP_ELEMENT_WTPNAME_TYPE, capwap_element_wtpname_ops),
|
||||
element_ops(CAPWAP_ELEMENT_WTPRADIOSTAT_TYPE, capwap_element_wtpradiostat_ops),
|
||||
element_ops(CAPWAP_ELEMENT_WTPREBOOTSTAT_TYPE, capwap_element_wtprebootstat_ops),
|
||||
element_ops(CAPWAP_ELEMENT_WTPSTATICIPADDRESS_TYPE, capwap_element_wtpstaticipaddress_ops),
|
||||
element_ops(CAPWAP_ELEMENT_LOCALIPV6_TYPE, capwap_element_localipv6_ops),
|
||||
element_ops(CAPWAP_ELEMENT_TRANSPORT_TYPE, capwap_element_transport_ops),
|
||||
element_ops(CAPWAP_ELEMENT_MTUDISCOVERY_TYPE, capwap_element_mtudiscovery_ops),
|
||||
element_ops(CAPWAP_ELEMENT_ECNSUPPORT_TYPE, capwap_element_ecnsupport_ops)
|
||||
};
|
||||
#undef element_ops
|
||||
|
||||
/* */
|
||||
#define element_ops(Id, Ops) [(Id) - CAPWAP_80211_MESSAGE_ELEMENTS_START] = &(Ops)
|
||||
static const struct capwap_message_elements_ops * capwap_80211_message_elements[] = {
|
||||
element_ops(CAPWAP_ELEMENT_80211_ADD_WLAN, capwap_element_80211_addwlan_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_ANTENNA, capwap_element_80211_antenna_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_ASSIGN_BSSID, capwap_element_80211_assignbssid_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_DELETE_WLAN, capwap_element_80211_deletewlan_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL, capwap_element_80211_directsequencecontrol_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_IE, capwap_element_80211_ie_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_MACOPERATION, capwap_element_80211_macoperation_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES, capwap_element_80211_miccountermeasures_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY, capwap_element_80211_multidomaincapability_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_OFDMCONTROL, capwap_element_80211_ofdmcontrol_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_RATESET, capwap_element_80211_rateset_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT, capwap_element_80211_rsnaerrorreport_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_STATION, capwap_element_80211_station_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_STATION_QOS_PROFILE, capwap_element_80211_stationqos_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_STATION_SESSION_KEY_PROFILE, capwap_element_80211_stationkey_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_STATISTICS, capwap_element_80211_statistics_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_SUPPORTEDRATES, capwap_element_80211_supportedrates_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_TXPOWER, capwap_element_80211_txpower_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_TXPOWERLEVEL, capwap_element_80211_txpowerlevel_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_UPDATE_STATION_QOS, capwap_element_80211_updatestationqos_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_UPDATE_WLAN, capwap_element_80211_updatewlan_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_WTP_QOS, capwap_element_80211_wtpqos_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_WTP_RADIO_CONF, capwap_element_80211_wtpradioconf_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_WTP_RADIO_FAIL_ALARM, capwap_element_80211_wtpradiofailalarm_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION, capwap_element_80211_wtpradioinformation_ops)
|
||||
element_ops(CAPWAP_ELEMENT_80211_ADD_WLAN_TYPE, capwap_element_80211_addwlan_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_ANTENNA_TYPE, capwap_element_80211_antenna_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_ASSIGN_BSSID_TYPE, capwap_element_80211_assignbssid_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_DELETE_WLAN_TYPE, capwap_element_80211_deletewlan_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL_TYPE, capwap_element_80211_directsequencecontrol_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_IE_TYPE, capwap_element_80211_ie_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_MACOPERATION_TYPE, capwap_element_80211_macoperation_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES_TYPE, capwap_element_80211_miccountermeasures_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY_TYPE, capwap_element_80211_multidomaincapability_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_OFDMCONTROL_TYPE, capwap_element_80211_ofdmcontrol_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_RATESET_TYPE, capwap_element_80211_rateset_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT_TYPE, capwap_element_80211_rsnaerrorreport_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_STATION_TYPE, capwap_element_80211_station_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_STATION_QOS_PROFILE_TYPE, capwap_element_80211_stationqos_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_STATION_SESSION_KEY_PROFILE_TYPE, capwap_element_80211_stationkey_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_STATISTICS_TYPE, capwap_element_80211_statistics_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_SUPPORTEDRATES_TYPE, capwap_element_80211_supportedrates_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_TXPOWER_TYPE, capwap_element_80211_txpower_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_TXPOWERLEVEL_TYPE, capwap_element_80211_txpowerlevel_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_UPDATE_STATION_QOS_TYPE, capwap_element_80211_updatestationqos_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_UPDATE_WLAN_TYPE, capwap_element_80211_updatewlan_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_WTP_QOS_TYPE, capwap_element_80211_wtpqos_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_WTP_RADIO_CONF_TYPE, capwap_element_80211_wtpradioconf_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_WTP_RADIO_FAIL_ALARM_TYPE, capwap_element_80211_wtpradiofailalarm_ops),
|
||||
element_ops(CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION_TYPE, capwap_element_80211_wtpradioinformation_ops)
|
||||
};
|
||||
#undef element_ops
|
||||
|
||||
/* */
|
||||
const struct capwap_message_elements_ops *capwap_get_message_element_ops(unsigned short code)
|
||||
const struct capwap_message_elements_ops *
|
||||
capwap_get_message_element_ops(const struct capwap_message_element_id id)
|
||||
{
|
||||
if (IS_MESSAGE_ELEMENTS(code)) {
|
||||
return capwap_message_elements[code - CAPWAP_MESSAGE_ELEMENTS_START];
|
||||
} else if (IS_80211_MESSAGE_ELEMENTS(code)) {
|
||||
return capwap_80211_message_elements[code - CAPWAP_80211_MESSAGE_ELEMENTS_START];
|
||||
switch (id.vendor) {
|
||||
case 0:
|
||||
if (IS_MESSAGE_ELEMENTS(id)) {
|
||||
return capwap_message_elements[id.type - CAPWAP_MESSAGE_ELEMENTS_START];
|
||||
} else if (IS_80211_MESSAGE_ELEMENTS(id)) {
|
||||
return capwap_80211_message_elements[id.type - CAPWAP_80211_MESSAGE_ELEMENTS_START];
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* */
|
||||
struct capwap_list_item* capwap_get_message_element(struct capwap_parsed_packet* packet, uint16_t type) {
|
||||
struct capwap_list_item* capwap_get_message_element(struct capwap_parsed_packet* packet,
|
||||
const struct capwap_message_element_id id)
|
||||
{
|
||||
struct capwap_list_item* search;
|
||||
|
||||
ASSERT(packet != NULL);
|
||||
@ -109,11 +115,11 @@ struct capwap_list_item* capwap_get_message_element(struct capwap_parsed_packet*
|
||||
|
||||
search = packet->messages->first;
|
||||
while (search) {
|
||||
struct capwap_message_element_itemlist* messageelement = (struct capwap_message_element_itemlist*)search->item;
|
||||
struct capwap_message_element_itemlist* messageelement =
|
||||
(struct capwap_message_element_itemlist*)search->item;
|
||||
|
||||
if (messageelement->type == type) {
|
||||
if (memcmp(&messageelement->id, &id, sizeof(id)) == 0)
|
||||
return search;
|
||||
}
|
||||
|
||||
/* */
|
||||
search = search->next;
|
||||
@ -123,12 +129,14 @@ struct capwap_list_item* capwap_get_message_element(struct capwap_parsed_packet*
|
||||
}
|
||||
|
||||
/* */
|
||||
void* capwap_get_message_element_data(struct capwap_parsed_packet* packet, uint16_t type) {
|
||||
void* capwap_get_message_element_data(struct capwap_parsed_packet* packet,
|
||||
const struct capwap_message_element_id id)
|
||||
{
|
||||
struct capwap_list_item* itemlist;
|
||||
struct capwap_message_element_itemlist* messageelement;
|
||||
|
||||
/* Retrieve item list */
|
||||
itemlist = capwap_get_message_element(packet, type);
|
||||
itemlist = capwap_get_message_element(packet, id);
|
||||
if (!itemlist) {
|
||||
return NULL;
|
||||
}
|
||||
@ -161,7 +169,7 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
|
||||
/* */
|
||||
bodylength = rxmngpacket->ctrlmsg.length - CAPWAP_CONTROL_MESSAGE_MIN_LENGTH;
|
||||
while (bodylength > 0) {
|
||||
uint16_t type;
|
||||
struct capwap_message_element_id id;
|
||||
uint16_t msglength;
|
||||
struct capwap_list_item* itemlist;
|
||||
struct capwap_message_element_itemlist* messageelement;
|
||||
@ -170,18 +178,21 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
|
||||
|
||||
/* Get type and length */
|
||||
rxmngpacket->readerpacketallowed = sizeof(struct capwap_message_element);
|
||||
if (rxmngpacket->read_ops.read_u16((capwap_message_elements_handle)rxmngpacket, &type) != sizeof(uint16_t)) {
|
||||
if (rxmngpacket->read_ops.read_u16((capwap_message_elements_handle)rxmngpacket, &id.type) != sizeof(uint16_t)) {
|
||||
return INVALID_MESSAGE_ELEMENT;
|
||||
}
|
||||
|
||||
/* TODO: implement actual vendor handling */
|
||||
id.vendor = 0;
|
||||
|
||||
/* Check type */
|
||||
capwap_logging_debug("MESSAGE ELEMENT: %d", type);
|
||||
if (!IS_VALID_MESSAGE_ELEMENTS(type)) {
|
||||
capwap_logging_debug("MESSAGE ELEMENT: %06x:%d", id.vendor, id.type);
|
||||
if (!IS_VALID_MESSAGE_ELEMENTS(id)) {
|
||||
return UNRECOGNIZED_MESSAGE_ELEMENT;
|
||||
}
|
||||
|
||||
/* Check binding */
|
||||
if (IS_80211_MESSAGE_ELEMENTS(type) && (binding != CAPWAP_WIRELESS_BINDING_IEEE80211)) {
|
||||
if (IS_80211_MESSAGE_ELEMENTS(id) && (binding != CAPWAP_WIRELESS_BINDING_IEEE80211)) {
|
||||
return UNRECOGNIZED_MESSAGE_ELEMENT;
|
||||
}
|
||||
|
||||
@ -195,7 +206,7 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
|
||||
}
|
||||
|
||||
/* Reader function */
|
||||
read_ops = capwap_get_message_element_ops(type);
|
||||
read_ops = capwap_get_message_element_ops(id);
|
||||
capwap_logging_debug("read_ops: %p", read_ops);
|
||||
if (!read_ops) {
|
||||
return INVALID_MESSAGE_ELEMENT;
|
||||
@ -210,7 +221,7 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
|
||||
return INVALID_MESSAGE_ELEMENT;
|
||||
|
||||
/* */
|
||||
itemlist = capwap_get_message_element(packet, type);
|
||||
itemlist = capwap_get_message_element(packet, id);
|
||||
if (read_ops->category == CAPWAP_MESSAGE_ELEMENT_SINGLE) {
|
||||
/* Check for multiple message element */
|
||||
if (itemlist) {
|
||||
@ -220,7 +231,7 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
|
||||
/* Create new message element */
|
||||
itemlist = capwap_itemlist_create(sizeof(struct capwap_message_element_itemlist));
|
||||
messageelement = (struct capwap_message_element_itemlist*)itemlist->item;
|
||||
messageelement->type = type;
|
||||
messageelement->id = id;
|
||||
messageelement->category = CAPWAP_MESSAGE_ELEMENT_SINGLE;
|
||||
messageelement->data = element;
|
||||
|
||||
@ -239,7 +250,7 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
|
||||
/* */
|
||||
itemlist = capwap_itemlist_create(sizeof(struct capwap_message_element_itemlist));
|
||||
messageelement = (struct capwap_message_element_itemlist*)itemlist->item;
|
||||
messageelement->type = type;
|
||||
messageelement->id = id;
|
||||
messageelement->category = CAPWAP_MESSAGE_ELEMENT_ARRAY;
|
||||
messageelement->data = (void*)arraymessageelement;
|
||||
|
||||
@ -601,7 +612,7 @@ void capwap_free_parsed_packet(struct capwap_parsed_packet* packet) {
|
||||
while (itemlist) {
|
||||
messageelement = (struct capwap_message_element_itemlist*)itemlist->item;
|
||||
if (messageelement->data) {
|
||||
msgops = capwap_get_message_element_ops(messageelement->type);
|
||||
msgops = capwap_get_message_element_ops(messageelement->id);
|
||||
|
||||
if (messageelement->category == CAPWAP_MESSAGE_ELEMENT_SINGLE) {
|
||||
msgops->free(messageelement->data);
|
||||
|
Reference in New Issue
Block a user