From 3fd122e9fdec7fb9f418bf24b9471605c80ff59f Mon Sep 17 00:00:00 2001 From: vemax78 Date: Tue, 1 Oct 2013 16:40:15 +0200 Subject: [PATCH] Improve management SOAP request/response --- src/ac/ac_80211_json.c | 750 ++++++++++++++++++++++++++++++++------ src/ac/ac_dfa_configure.c | 121 +++++- src/ac/ac_dfa_join.c | 84 ++--- src/ac/ac_json.h | 13 +- 4 files changed, 777 insertions(+), 191 deletions(-) diff --git a/src/ac/ac_80211_json.c b/src/ac/ac_80211_json.c index 70c366d..5268c68 100644 --- a/src/ac/ac_80211_json.c +++ b/src/ac/ac_80211_json.c @@ -1,6 +1,5 @@ #include "ac.h" #include "ac_json.h" -#include /* */ void ac_json_ieee80211_init(struct ac_json_ieee80211_wtpradio* wtpradio) { @@ -11,21 +10,501 @@ void ac_json_ieee80211_init(struct ac_json_ieee80211_wtpradio* wtpradio) { /* */ void ac_json_ieee80211_free(struct ac_json_ieee80211_wtpradio* wtpradio) { - int i; + int i, j; ASSERT(wtpradio != NULL); for (i = 0; i < RADIOID_MAX_COUNT; i++) { struct ac_json_ieee80211_item* item = &wtpradio->items[i]; - if (item->iearray) { - capwap_array_free(item->iearray); + if (item->valid) { + if (item->addwlan) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_ADD_WLAN)->free_message_element(item->addwlan); + } + + if (item->antenna) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_ANTENNA)->free_message_element(item->antenna); + } + + if (item->assignbssid) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_ASSIGN_BSSID)->free_message_element(item->assignbssid); + } + + if (item->deletewlan) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_DELETE_WLAN)->free_message_element(item->deletewlan); + } + + if (item->directsequencecontrol) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL)->free_message_element(item->directsequencecontrol); + } + + if (item->iearray) { + struct capwap_message_elements_ops* ieops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_IE); + + for (j = 0; j < item->iearray->count; j++) { + ieops->free_message_element(*(struct capwap_80211_ie_element**)capwap_array_get_item_pointer(item->iearray, j)); + } + + capwap_array_free(item->iearray); + } + + if (item->macoperation) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_MACOPERATION)->free_message_element(item->macoperation); + } + + if (item->miccountermeasures) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES)->free_message_element(item->miccountermeasures); + } + + if (item->multidomaincapability) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY)->free_message_element(item->multidomaincapability); + } + + if (item->ofdmcontrol) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_OFDMCONTROL)->free_message_element(item->ofdmcontrol); + } + + if (item->rateset) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_RATESET)->free_message_element(item->rateset); + } + + if (item->rsnaerrorreport) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT)->free_message_element(item->rsnaerrorreport); + } + + if (item->statistics) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_STATISTICS)->free_message_element(item->statistics); + } + + if (item->supportedrates) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_SUPPORTEDRATES)->free_message_element(item->supportedrates); + } + + if (item->txpower) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_TXPOWER)->free_message_element(item->txpower); + } + + if (item->txpowerlevel) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_TXPOWERLEVEL)->free_message_element(item->txpowerlevel); + } + + if (item->updatewlan) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_UPDATE_WLAN)->free_message_element(item->updatewlan); + } + + if (item->wtpqos) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTP_QOS)->free_message_element(item->wtpqos); + } + + if (item->wtpradioconf) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTP_RADIO_CONF)->free_message_element(item->wtpradioconf); + } + + if (item->wtpradiofailalarm) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTP_RADIO_FAIL_ALARM)->free_message_element(item->wtpradiofailalarm); + } + + if (item->wtpradioinformation) { + capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION)->free_message_element(item->wtpradioinformation); + } } } } /* */ -int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, struct capwap_message_element_itemlist* messageelement) { +int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, uint16_t type, void* data, int overwrite) { + ASSERT(wtpradio != NULL); + ASSERT(IS_80211_MESSAGE_ELEMENTS(type)); + ASSERT(data != NULL); + + switch (type) { + case CAPWAP_ELEMENT_80211_ADD_WLAN: { + struct capwap_80211_addwlan_element* addwlan = (struct capwap_80211_addwlan_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[addwlan->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_ADD_WLAN); + + if (item->addwlan) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->addwlan); + } + + item->valid = 1; + item->addwlan = (struct capwap_80211_addwlan_element*)ops->clone_message_element(addwlan); + break; + } + + case CAPWAP_ELEMENT_80211_ANTENNA: { + struct capwap_80211_antenna_element* antenna = (struct capwap_80211_antenna_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[antenna->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_ANTENNA); + + if (item->antenna) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->antenna); + } + + item->valid = 1; + item->antenna = (struct capwap_80211_antenna_element*)ops->clone_message_element(antenna); + break; + } + + case CAPWAP_ELEMENT_80211_ASSIGN_BSSID: { + struct capwap_80211_assignbssid_element* assignbssid = (struct capwap_80211_assignbssid_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[assignbssid->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_ASSIGN_BSSID); + + if (item->assignbssid) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->assignbssid); + } + + item->valid = 1; + item->assignbssid = (struct capwap_80211_assignbssid_element*)ops->clone_message_element(assignbssid); + break; + } + + case CAPWAP_ELEMENT_80211_DELETE_WLAN: { + struct capwap_80211_deletewlan_element* deletewlan = (struct capwap_80211_deletewlan_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[deletewlan->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_DELETE_WLAN); + + if (item->deletewlan) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->deletewlan); + } + + item->valid = 1; + item->deletewlan = (struct capwap_80211_deletewlan_element*)ops->clone_message_element(deletewlan); + break; + } + + case CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL: { + struct capwap_80211_directsequencecontrol_element* directsequencecontrol = (struct capwap_80211_directsequencecontrol_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[directsequencecontrol->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL); + + if (item->directsequencecontrol) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->directsequencecontrol); + } + + item->valid = 1; + item->directsequencecontrol = (struct capwap_80211_directsequencecontrol_element*)ops->clone_message_element(directsequencecontrol); + break; + } + + case CAPWAP_ELEMENT_80211_IE: { + struct capwap_80211_ie_element** ieclone; + struct capwap_80211_ie_element* ie = (struct capwap_80211_ie_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[ie->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_IE); + + if (!item->iearray) { + item->iearray = capwap_array_create(sizeof(struct capwap_80211_ie_element*), 0, 0); + } + + item->valid = 1; + ieclone = (struct capwap_80211_ie_element**)capwap_array_get_item_pointer(item->iearray, item->iearray->count); + *ieclone = (struct capwap_80211_ie_element*)ops->clone_message_element(ie); + + break; + } + + case CAPWAP_ELEMENT_80211_MACOPERATION: { + struct capwap_80211_macoperation_element* macoperation = (struct capwap_80211_macoperation_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[macoperation->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_MACOPERATION); + + if (item->macoperation) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->macoperation); + } + + item->valid = 1; + item->macoperation = (struct capwap_80211_macoperation_element*)ops->clone_message_element(macoperation); + break; + } + + case CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES: { + struct capwap_80211_miccountermeasures_element* miccountermeasures = (struct capwap_80211_miccountermeasures_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[miccountermeasures->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES); + + if (item->miccountermeasures) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->miccountermeasures); + } + + item->valid = 1; + item->miccountermeasures = (struct capwap_80211_miccountermeasures_element*)ops->clone_message_element(miccountermeasures); + break; + } + + case CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY: { + struct capwap_80211_multidomaincapability_element* multidomaincapability = (struct capwap_80211_multidomaincapability_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[multidomaincapability->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY); + + if (item->multidomaincapability) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->multidomaincapability); + } + + item->valid = 1; + item->multidomaincapability = (struct capwap_80211_multidomaincapability_element*)ops->clone_message_element(multidomaincapability); + break; + } + + case CAPWAP_ELEMENT_80211_OFDMCONTROL: { + struct capwap_80211_ofdmcontrol_element* ofdmcontrol = (struct capwap_80211_ofdmcontrol_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[ofdmcontrol->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_OFDMCONTROL); + + if (item->ofdmcontrol) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->ofdmcontrol); + } + + item->valid = 1; + item->ofdmcontrol = (struct capwap_80211_ofdmcontrol_element*)ops->clone_message_element(ofdmcontrol); + break; + } + + case CAPWAP_ELEMENT_80211_RATESET: { + struct capwap_80211_rateset_element* rateset = (struct capwap_80211_rateset_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[rateset->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_RATESET); + + if (item->rateset) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->rateset); + } + + item->valid = 1; + item->rateset = (struct capwap_80211_rateset_element*)ops->clone_message_element(rateset); + break; + } + + case CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT: { + struct capwap_80211_rsnaerrorreport_element* rsnaerrorreport = (struct capwap_80211_rsnaerrorreport_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[rsnaerrorreport->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT); + + if (item->rsnaerrorreport) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->rsnaerrorreport); + } + + item->valid = 1; + item->rsnaerrorreport = (struct capwap_80211_rsnaerrorreport_element*)ops->clone_message_element(rsnaerrorreport); + break; + } + + case CAPWAP_ELEMENT_80211_STATISTICS: { + struct capwap_80211_statistics_element* statistics = (struct capwap_80211_statistics_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[statistics->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_STATISTICS); + + if (item->statistics) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->statistics); + } + + item->valid = 1; + item->statistics = (struct capwap_80211_statistics_element*)ops->clone_message_element(statistics); + break; + } + + case CAPWAP_ELEMENT_80211_SUPPORTEDRATES: { + struct capwap_80211_supportedrates_element* supportedrates = (struct capwap_80211_supportedrates_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[supportedrates->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_SUPPORTEDRATES); + + if (item->supportedrates) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->supportedrates); + } + + item->valid = 1; + item->supportedrates = (struct capwap_80211_supportedrates_element*)ops->clone_message_element(supportedrates); + break; + } + + case CAPWAP_ELEMENT_80211_TXPOWER: { + struct capwap_80211_txpower_element* txpower = (struct capwap_80211_txpower_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[txpower->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_TXPOWER); + + if (item->txpower) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->txpower); + } + + item->valid = 1; + item->txpower = (struct capwap_80211_txpower_element*)ops->clone_message_element(txpower); + break; + } + + case CAPWAP_ELEMENT_80211_TXPOWERLEVEL: { + struct capwap_80211_txpowerlevel_element* txpowerlevel = (struct capwap_80211_txpowerlevel_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[txpowerlevel->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_TXPOWERLEVEL); + + if (item->txpowerlevel) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->txpowerlevel); + } + + item->valid = 1; + item->txpowerlevel = (struct capwap_80211_txpowerlevel_element*)ops->clone_message_element(txpowerlevel); + break; + } + + case CAPWAP_ELEMENT_80211_UPDATE_WLAN: { + struct capwap_80211_updatewlan_element* updatewlan = (struct capwap_80211_updatewlan_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[updatewlan->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_UPDATE_WLAN); + + if (item->updatewlan) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->updatewlan); + } + + item->valid = 1; + item->updatewlan = (struct capwap_80211_updatewlan_element*)ops->clone_message_element(updatewlan); + break; + } + + case CAPWAP_ELEMENT_80211_WTP_QOS: { + struct capwap_80211_wtpqos_element* wtpqos = (struct capwap_80211_wtpqos_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[wtpqos->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTP_QOS); + + if (item->wtpqos) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->wtpqos); + } + + item->valid = 1; + item->wtpqos = (struct capwap_80211_wtpqos_element*)ops->clone_message_element(wtpqos); + break; + } + + case CAPWAP_ELEMENT_80211_WTP_RADIO_CONF: { + struct capwap_80211_wtpradioconf_element* wtpradioconf = (struct capwap_80211_wtpradioconf_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[wtpradioconf->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTP_RADIO_CONF); + + if (item->wtpradioconf) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->wtpradioconf); + } + + item->valid = 1; + item->wtpradioconf = (struct capwap_80211_wtpradioconf_element*)ops->clone_message_element(wtpradioconf); + break; + } + + case CAPWAP_ELEMENT_80211_WTP_RADIO_FAIL_ALARM: { + struct capwap_80211_wtpradiofailalarm_element* wtpradiofailalarm = (struct capwap_80211_wtpradiofailalarm_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[wtpradiofailalarm->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTP_RADIO_FAIL_ALARM); + + if (item->wtpradiofailalarm) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->wtpradiofailalarm); + } + + item->valid = 1; + item->wtpradiofailalarm = (struct capwap_80211_wtpradiofailalarm_element*)ops->clone_message_element(wtpradiofailalarm); + break; + } + + case CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION: { + struct capwap_80211_wtpradioinformation_element* wtpradioinformation = (struct capwap_80211_wtpradioinformation_element*)data; + struct ac_json_ieee80211_item* item = &wtpradio->items[wtpradioinformation->radioid - 1]; + struct capwap_message_elements_ops* ops = capwap_get_message_element_ops(CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION); + + if (item->wtpradioinformation) { + if (!overwrite) { + return 0; + } + + ops->free_message_element(item->wtpradioinformation); + } + + item->valid = 1; + item->wtpradioinformation = (struct capwap_80211_wtpradioinformation_element*)ops->clone_message_element(wtpradioinformation); + break; + } + + default: { + return 0; + } + } + + return 1; +} + +/* */ +int ac_json_ieee80211_parsingmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, struct capwap_message_element_itemlist* messageelement) { int i; ASSERT(wtpradio != NULL); @@ -33,15 +512,12 @@ int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpra switch (messageelement->type) { case CAPWAP_ELEMENT_80211_ADD_WLAN: { - struct capwap_80211_addwlan_element* addwlan = (struct capwap_80211_addwlan_element*)messageelement->data; ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_SINGLE); - if (wtpradio->items[addwlan->radioid - 1].addwlan) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_ADD_WLAN, messageelement->data, 0)) { return 0; } - wtpradio->items[addwlan->radioid - 1].valid = 1; - wtpradio->items[addwlan->radioid - 1].addwlan = addwlan; break; } @@ -50,42 +526,31 @@ int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpra ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY); for (i = 0; i < antennaarray->count; i++) { - struct capwap_80211_antenna_element* antenna = *(struct capwap_80211_antenna_element**)capwap_array_get_item_pointer(antennaarray, i); - - if (wtpradio->items[antenna->radioid - 1].antenna) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_ANTENNA, *(struct capwap_80211_antenna_element**)capwap_array_get_item_pointer(antennaarray, i), 0)) { return 0; } - - wtpradio->items[antenna->radioid - 1].valid = 1; - wtpradio->items[antenna->radioid - 1].antenna = antenna; } break; } case CAPWAP_ELEMENT_80211_ASSIGN_BSSID: { - struct capwap_80211_assignbssid_element* assignbssid = (struct capwap_80211_assignbssid_element*)messageelement->data; ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_SINGLE); - if (wtpradio->items[assignbssid->radioid - 1].assignbssid) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_ASSIGN_BSSID, messageelement->data, 0)) { return 0; } - wtpradio->items[assignbssid->radioid - 1].valid = 1; - wtpradio->items[assignbssid->radioid - 1].assignbssid = assignbssid; break; } case CAPWAP_ELEMENT_80211_DELETE_WLAN: { - struct capwap_80211_deletewlan_element* deletewlan = (struct capwap_80211_deletewlan_element*)messageelement->data; ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_SINGLE); - if (wtpradio->items[deletewlan->radioid - 1].deletewlan) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_DELETE_WLAN, messageelement->data, 0)) { return 0; } - wtpradio->items[deletewlan->radioid - 1].valid = 1; - wtpradio->items[deletewlan->radioid - 1].deletewlan = deletewlan; break; } @@ -94,14 +559,9 @@ int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpra ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY); for (i = 0; i < directsequencecontrolarray->count; i++) { - struct capwap_80211_directsequencecontrol_element* directsequencecontrol = *(struct capwap_80211_directsequencecontrol_element**)capwap_array_get_item_pointer(directsequencecontrolarray, i); - - if (wtpradio->items[directsequencecontrol->radioid - 1].directsequencecontrol) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL, *(struct capwap_80211_directsequencecontrol_element**)capwap_array_get_item_pointer(directsequencecontrolarray, i), 0)) { return 0; } - - wtpradio->items[directsequencecontrol->radioid - 1].valid = 1; - wtpradio->items[directsequencecontrol->radioid - 1].directsequencecontrol = directsequencecontrol; } break; @@ -112,14 +572,9 @@ int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpra ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY); for (i = 0; i < iearray->count; i++) { - struct capwap_80211_ie_element* ie = *(struct capwap_80211_ie_element**)capwap_array_get_item_pointer(iearray, i); - - if (!wtpradio->items[ie->radioid - 1].iearray) { - wtpradio->items[ie->radioid - 1].iearray = capwap_array_create(sizeof(struct capwap_80211_ie_element*), 0, 0); + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_IE, *(struct capwap_80211_ie_element**)capwap_array_get_item_pointer(iearray, i), 0)) { + return 0; } - - wtpradio->items[ie->radioid - 1].valid = 1; - memcpy(capwap_array_get_item_pointer(wtpradio->items[ie->radioid - 1].iearray, wtpradio->items[ie->radioid - 1].iearray->count), &ie, sizeof(struct capwap_80211_ie_element*)); } break; @@ -130,30 +585,21 @@ int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpra ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY); for (i = 0; i < macoperationarray->count; i++) { - struct capwap_80211_macoperation_element* macoperation = *(struct capwap_80211_macoperation_element**)capwap_array_get_item_pointer(macoperationarray, i); - - if (wtpradio->items[macoperation->radioid - 1].macoperation) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_MACOPERATION, *(struct capwap_80211_macoperation_element**)capwap_array_get_item_pointer(macoperationarray, i), 0)) { return 0; } - - wtpradio->items[macoperation->radioid - 1].valid = 1; - wtpradio->items[macoperation->radioid - 1].macoperation = macoperation; } break; } case CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES: { - struct capwap_80211_miccountermeasures_element* miccountermeasures = (struct capwap_80211_miccountermeasures_element*)messageelement->data; ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_SINGLE); - if (wtpradio->items[miccountermeasures->radioid - 1].miccountermeasures) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES, messageelement->data, 0)) { return 0; } - wtpradio->items[miccountermeasures->radioid - 1].valid = 1; - wtpradio->items[miccountermeasures->radioid - 1].miccountermeasures = miccountermeasures; - break; } @@ -162,14 +608,9 @@ int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpra ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY); for (i = 0; i < multidomaincapabilityarray->count; i++) { - struct capwap_80211_multidomaincapability_element* multidomaincapability = *(struct capwap_80211_multidomaincapability_element**)capwap_array_get_item_pointer(multidomaincapabilityarray, i); - - if (wtpradio->items[multidomaincapability->radioid - 1].multidomaincapability) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY, *(struct capwap_80211_multidomaincapability_element**)capwap_array_get_item_pointer(multidomaincapabilityarray, i), 0)) { return 0; } - - wtpradio->items[multidomaincapability->radioid - 1].valid = 1; - wtpradio->items[multidomaincapability->radioid - 1].multidomaincapability = multidomaincapability; } break; @@ -180,14 +621,9 @@ int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpra ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY); for (i = 0; i < ofdmcontrolarray->count; i++) { - struct capwap_80211_ofdmcontrol_element* ofdmcontrol = *(struct capwap_80211_ofdmcontrol_element**)capwap_array_get_item_pointer(ofdmcontrolarray, i); - - if (wtpradio->items[ofdmcontrol->radioid - 1].ofdmcontrol) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_OFDMCONTROL, *(struct capwap_80211_ofdmcontrol_element**)capwap_array_get_item_pointer(ofdmcontrolarray, i), 0)) { return 0; } - - wtpradio->items[ofdmcontrol->radioid - 1].valid = 1; - wtpradio->items[ofdmcontrol->radioid - 1].ofdmcontrol = ofdmcontrol; } break; @@ -198,29 +634,21 @@ int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpra ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY); for (i = 0; i < ratesetarray->count; i++) { - struct capwap_80211_rateset_element* rateset = *(struct capwap_80211_rateset_element**)capwap_array_get_item_pointer(ratesetarray, i); - - if (wtpradio->items[rateset->radioid - 1].rateset) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_RATESET, *(struct capwap_80211_rateset_element**)capwap_array_get_item_pointer(ratesetarray, i), 0)) { return 0; } - - wtpradio->items[rateset->radioid - 1].valid = 1; - wtpradio->items[rateset->radioid - 1].rateset = rateset; } break; } case CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT: { - struct capwap_80211_rsnaerrorreport_element* rsnaerrorreport = (struct capwap_80211_rsnaerrorreport_element*)messageelement->data; ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_SINGLE); - if (wtpradio->items[rsnaerrorreport->radioid - 1].rsnaerrorreport) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT, messageelement->data, 0)) { return 0; } - wtpradio->items[rsnaerrorreport->radioid - 1].valid = 1; - wtpradio->items[rsnaerrorreport->radioid - 1].rsnaerrorreport = rsnaerrorreport; break; } @@ -229,14 +657,9 @@ int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpra ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY); for (i = 0; i < statisticsarray->count; i++) { - struct capwap_80211_statistics_element* statistics = *(struct capwap_80211_statistics_element**)capwap_array_get_item_pointer(statisticsarray, i); - - if (wtpradio->items[statistics->radioid - 1].statistics) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_STATISTICS, *(struct capwap_80211_statistics_element**)capwap_array_get_item_pointer(statisticsarray, i), 0)) { return 0; } - - wtpradio->items[statistics->radioid - 1].valid = 1; - wtpradio->items[statistics->radioid - 1].statistics = statistics; } break; @@ -247,14 +670,9 @@ int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpra ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY); for (i = 0; i < supportedratesarray->count; i++) { - struct capwap_80211_supportedrates_element* supportedrates = *(struct capwap_80211_supportedrates_element**)capwap_array_get_item_pointer(supportedratesarray, i); - - if (wtpradio->items[supportedrates->radioid - 1].supportedrates) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_SUPPORTEDRATES, *(struct capwap_80211_supportedrates_element**)capwap_array_get_item_pointer(supportedratesarray, i), 0)) { return 0; } - - wtpradio->items[supportedrates->radioid - 1].valid = 1; - wtpradio->items[supportedrates->radioid - 1].supportedrates = supportedrates; } break; @@ -265,14 +683,9 @@ int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpra ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY); for (i = 0; i < txpowerarray->count; i++) { - struct capwap_80211_txpower_element* txpower = *(struct capwap_80211_txpower_element**)capwap_array_get_item_pointer(txpowerarray, i); - - if (wtpradio->items[txpower->radioid - 1].txpower) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_TXPOWER, *(struct capwap_80211_txpower_element**)capwap_array_get_item_pointer(txpowerarray, i), 0)) { return 0; } - - wtpradio->items[txpower->radioid - 1].valid = 1; - wtpradio->items[txpower->radioid - 1].txpower = txpower; } break; @@ -283,29 +696,21 @@ int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpra ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY); for (i = 0; i < txpowerlevelarray->count; i++) { - struct capwap_80211_txpowerlevel_element* txpowerlevel = *(struct capwap_80211_txpowerlevel_element**)capwap_array_get_item_pointer(txpowerlevelarray, i); - - if (wtpradio->items[txpowerlevel->radioid - 1].txpowerlevel) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_TXPOWERLEVEL, *(struct capwap_80211_txpowerlevel_element**)capwap_array_get_item_pointer(txpowerlevelarray, i), 0)) { return 0; } - - wtpradio->items[txpowerlevel->radioid - 1].valid = 1; - wtpradio->items[txpowerlevel->radioid - 1].txpowerlevel = txpowerlevel; } break; } case CAPWAP_ELEMENT_80211_UPDATE_WLAN: { - struct capwap_80211_updatewlan_element* updatewlan = (struct capwap_80211_updatewlan_element*)messageelement->data; ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_SINGLE); - if (wtpradio->items[updatewlan->radioid - 1].updatewlan) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_UPDATE_WLAN, messageelement->data, 0)) { return 0; } - wtpradio->items[updatewlan->radioid - 1].valid = 1; - wtpradio->items[updatewlan->radioid - 1].updatewlan = updatewlan; break; } @@ -314,14 +719,9 @@ int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpra ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY); for (i = 0; i < wtpqosarray->count; i++) { - struct capwap_80211_wtpqos_element* wtpqos = *(struct capwap_80211_wtpqos_element**)capwap_array_get_item_pointer(wtpqosarray, i); - - if (wtpradio->items[wtpqos->radioid - 1].wtpqos) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_WTP_QOS, *(struct capwap_80211_wtpqos_element**)capwap_array_get_item_pointer(wtpqosarray, i), 0)) { return 0; } - - wtpradio->items[wtpqos->radioid - 1].valid = 1; - wtpradio->items[wtpqos->radioid - 1].wtpqos = wtpqos; } break; @@ -332,29 +732,21 @@ int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpra ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY); for (i = 0; i < wtpradioconfarray->count; i++) { - struct capwap_80211_wtpradioconf_element* wtpradioconf = *(struct capwap_80211_wtpradioconf_element**)capwap_array_get_item_pointer(wtpradioconfarray, i); - - if (wtpradio->items[wtpradioconf->radioid - 1].wtpradioconf) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_WTP_RADIO_CONF, *(struct capwap_80211_wtpradioconf_element**)capwap_array_get_item_pointer(wtpradioconfarray, i), 0)) { return 0; } - - wtpradio->items[wtpradioconf->radioid - 1].valid = 1; - wtpradio->items[wtpradioconf->radioid - 1].wtpradioconf = wtpradioconf; } break; } case CAPWAP_ELEMENT_80211_WTP_RADIO_FAIL_ALARM: { - struct capwap_80211_wtpradiofailalarm_element* wtpradiofailalarm = (struct capwap_80211_wtpradiofailalarm_element*)messageelement->data; ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_SINGLE); - if (wtpradio->items[wtpradiofailalarm->radioid - 1].wtpradiofailalarm) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_WTP_RADIO_FAIL_ALARM, messageelement->data, 0)) { return 0; } - wtpradio->items[wtpradiofailalarm->radioid - 1].valid = 1; - wtpradio->items[wtpradiofailalarm->radioid - 1].wtpradiofailalarm = wtpradiofailalarm; break; } @@ -363,14 +755,9 @@ int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpra ASSERT(messageelement->category == CAPWAP_MESSAGE_ELEMENT_ARRAY); for (i = 0; i < wtpradioinformationarray->count; i++) { - struct capwap_80211_wtpradioinformation_element* wtpradioinformation = *(struct capwap_80211_wtpradioinformation_element**)capwap_array_get_item_pointer(wtpradioinformationarray, i); - - if (wtpradio->items[wtpradioinformation->radioid - 1].wtpradioinformation) { + if (!ac_json_ieee80211_addmessageelement(wtpradio, CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION, *(struct capwap_80211_wtpradioinformation_element**)capwap_array_get_item_pointer(wtpradioinformationarray, i), 0)) { return 0; } - - wtpradio->items[wtpradioinformation->radioid - 1].valid = 1; - wtpradio->items[wtpradioinformation->radioid - 1].wtpradioinformation = wtpradioinformation; } break; @@ -380,6 +767,11 @@ int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpra return 1; } +/* */ +int ac_json_ieee80211_parsingjson(struct ac_json_ieee80211_wtpradio* wtpradio, struct json_object* jsonroot) { + return 1; +} + /* */ struct json_object* ac_json_ieee80211_getjson(struct ac_json_ieee80211_wtpradio* wtpradio) { int i; @@ -387,6 +779,8 @@ struct json_object* ac_json_ieee80211_getjson(struct ac_json_ieee80211_wtpradio* struct json_object* jsonitems; struct json_object* jsonitem; + ASSERT(wtpradio != NULL); + jsonarray = json_object_new_array(); for (i = 0; i < RADIOID_MAX_COUNT; i++) { struct ac_json_ieee80211_item* item = &wtpradio->items[i]; @@ -402,6 +796,7 @@ struct json_object* ac_json_ieee80211_getjson(struct ac_json_ieee80211_wtpradio* json_object_object_add(jsonitems, "RadioID", json_object_new_int(i + 1)); if (item->addwlan) { + /* TODO */ } if (item->antenna) { @@ -420,9 +815,11 @@ struct json_object* ac_json_ieee80211_getjson(struct ac_json_ieee80211_wtpradio* } if (item->assignbssid) { + /* TODO */ } if (item->deletewlan) { + /* TODO */ } if (item->directsequencecontrol) { @@ -434,6 +831,7 @@ struct json_object* ac_json_ieee80211_getjson(struct ac_json_ieee80211_wtpradio* } if (item->iearray) { + /* TODO */ } if (item->macoperation) { @@ -448,6 +846,7 @@ struct json_object* ac_json_ieee80211_getjson(struct ac_json_ieee80211_wtpradio* } if (item->miccountermeasures) { + /* TODO */ } if (item->multidomaincapability) { @@ -467,12 +866,22 @@ struct json_object* ac_json_ieee80211_getjson(struct ac_json_ieee80211_wtpradio* } if (item->rateset) { + struct json_object* jsonrates; + + jsonrates = json_object_new_array(); + for (i = 0; i < item->rateset->ratesetcount; i++) { + json_object_array_add(jsonrates, json_object_new_int((int)item->rateset->rateset[i])); + } + + json_object_object_add(jsonitems, "IEEE80211Rateset", jsonrates); } if (item->rsnaerrorreport) { + /* TODO */ } if (item->statistics) { + /* TODO */ } if (item->supportedrates) { @@ -504,9 +913,11 @@ struct json_object* ac_json_ieee80211_getjson(struct ac_json_ieee80211_wtpradio* } if (item->updatewlan) { + /* TODO */ } if (item->wtpqos) { + /* TODO */ } if (item->wtpradioconf) { @@ -523,6 +934,7 @@ struct json_object* ac_json_ieee80211_getjson(struct ac_json_ieee80211_wtpradio* } if (item->wtpradiofailalarm) { + /* TODO */ } if (item->wtpradioinformation) { @@ -537,3 +949,103 @@ struct json_object* ac_json_ieee80211_getjson(struct ac_json_ieee80211_wtpradio* return jsonarray; } + +/* */ +void ac_json_ieee80211_buildpacket(struct ac_json_ieee80211_wtpradio* wtpradio, struct capwap_packet_txmng* txmngpacket) { + int i, j; + + ASSERT(wtpradio != NULL); + ASSERT(txmngpacket != NULL); + + for (i = 0; i < RADIOID_MAX_COUNT; i++) { + struct ac_json_ieee80211_item* item = &wtpradio->items[i]; + + if (item->valid) { + if (item->addwlan) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_ADD_WLAN, item->addwlan); + } + + if (item->antenna) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_ANTENNA, item->antenna); + } + + if (item->assignbssid) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_ASSIGN_BSSID, item->assignbssid); + } + + if (item->deletewlan) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_DELETE_WLAN, item->deletewlan); + } + + if (item->directsequencecontrol) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL, item->directsequencecontrol); + } + + if (item->iearray) { + for (j = 0; j < item->iearray->count; j++) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_IE, *(struct capwap_80211_ie_element**)capwap_array_get_item_pointer(item->iearray, j)); + } + } + + if (item->macoperation) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_MACOPERATION, item->macoperation); + } + + if (item->miccountermeasures) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_MIC_COUNTERMEASURES, item->miccountermeasures); + } + + if (item->multidomaincapability) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY, item->multidomaincapability); + } + + if (item->ofdmcontrol) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_OFDMCONTROL, item->ofdmcontrol); + } + + if (item->rateset) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_RATESET, item->rateset); + } + + if (item->rsnaerrorreport) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_RSNA_ERROR_REPORT, item->rsnaerrorreport); + } + + if (item->statistics) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_STATISTICS, item->statistics); + } + + if (item->supportedrates) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_SUPPORTEDRATES, item->supportedrates); + } + + if (item->txpower) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_TXPOWER, item->txpower); + } + + if (item->txpowerlevel) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_TXPOWERLEVEL, item->txpowerlevel); + } + + if (item->updatewlan) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_UPDATE_WLAN, item->updatewlan); + } + + if (item->wtpqos) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_WTP_QOS, item->wtpqos); + } + + if (item->wtpradioconf) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_WTP_RADIO_CONF, item->wtpradioconf); + } + + if (item->wtpradiofailalarm) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_WTP_RADIO_FAIL_ALARM, item->wtpradiofailalarm); + } + + if (item->wtpradioinformation) { + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION, item->wtpradioinformation); + } + } + } +} diff --git a/src/ac/ac_dfa_configure.c b/src/ac/ac_dfa_configure.c index dc2cb17..2303677 100644 --- a/src/ac/ac_dfa_configure.c +++ b/src/ac/ac_dfa_configure.c @@ -198,7 +198,7 @@ static struct ac_soap_response* ac_dfa_state_configure_parsing_request(struct ac /* Parsing only IEEE 802.11 message element */ if (IS_80211_MESSAGE_ELEMENTS(messageelement->type)) { - if (!ac_json_ieee80211_addmessageelement(&wtpradio, messageelement)) { + if (!ac_json_ieee80211_parsingmessageelement(&wtpradio, messageelement)) { json_object_put(jsonparam); return NULL; } @@ -243,6 +243,7 @@ static uint32_t ac_dfa_state_configure_create_response(struct ac_session_t* sess struct capwap_timers_element responsetimers; struct capwap_idletimeout_element responseidletimeout; struct capwap_wtpfallback_element responsewtpfallback; + unsigned short binding = GET_WBID_HEADER(packet->rxmngpacket->header); if ((response->responsecode != HTTP_RESULT_OK) || !response->xmlResponseReturn) { return CAPWAP_RESULTCODE_FAILURE; @@ -282,6 +283,94 @@ static uint32_t ac_dfa_state_configure_create_response(struct ac_session_t* sess Gateway: [string], Static: [int] } + + WTPRadio: [ + { + RadioID: [int], + IEEE80211Antenna: { + Diversity: [bool], + Combiner: [int], + AntennaSelection: [ + [int] + ] + }, + IEEE80211DirectSequenceControl: { + CurrentChan: [int], + CurrentCCA: [int], + EnergyDetectThreshold: [int] + }, + IEEE80211MACOperation: { + RTSThreshold: [int], + ShortRetry: [int], + LongRetry: [int], + FragmentationThreshold: [int], + TxMSDULifetime: [int], + RxMSDULifetime: [int] + }, + IEEE80211MultiDomainCapability: { + FirstChannel: [int], + NumberChannels: [int], + MaxTxPowerLevel: [int] + }, + IEEE80211OFDMControl: { + CurrentChan: [int], + BandSupport: [int], + TIThreshold: [int] + }, + IEEE80211Rateset: [ + [int] + ], + IEEE80211SupportedRates: [ + [int] + ], + IEEE80211TxPower: { + CurrentTxPower: [int] + }, + IEEE80211WTPQoS: { + TaggingPolicy: [int], + Voice: { + QueueDepth: [int], + CWMin: [int], + CWMax: [int], + AIFS: [int], + Priority8021p: [int], + DSCP: [int] + } + Video: { + QueueDepth: [int], + CWMin: [int], + CWMax: [int], + AIFS: [int], + Priority8021p: [int], + DSCP: [int] + } + BestEffort: { + QueueDepth: [int], + CWMin: [int], + CWMax: [int], + AIFS: [int], + Priority8021p: [int], + DSCP: [int] + } + Background: { + QueueDepth: [int], + CWMin: [int], + CWMax: [int], + AIFS: [int], + Priority8021p: [int], + DSCP: [int] + } + } + IEEE80211WTPRadioConfiguration: { + ShortPreamble: [int], + NumBSSIDs: [int], + DTIMPeriod: [int], + BSSID: [string], + BeaconPeriod: [int], + CountryString: [string] + } + } + ] } */ @@ -588,16 +677,26 @@ static uint32_t ac_dfa_state_configure_create_response(struct ac_session_t* sess } } - /* CAPWAP_ELEMENT_80211_ANTENNA */ /* TODO */ - /* CAPWAP_ELEMENT_80211_DIRECTSEQUENCECONTROL */ /* TODO */ - /* CAPWAP_ELEMENT_80211_MACOPERATION */ /* TODO */ - /* CAPWAP_ELEMENT_80211_MULTIDOMAINCAPABILITY */ /* TODO */ - /* CAPWAP_ELEMENT_80211_OFDMCONTROL */ /* TODO */ - /* CAPWAP_ELEMENT_80211_RATESET */ /* TODO */ - /* CAPWAP_ELEMENT_80211_SUPPORTEDRATES */ /* TODO */ - /* CAPWAP_ELEMENT_80211_TXPOWER */ /* TODO */ - /* CAPWAP_ELEMENT_80211_WTP_QOS */ /* TODO */ - /* CAPWAP_ELEMENT_80211_WTP_RADIO_CONF */ /* TODO */ + /* WTP Radio Information */ + if (binding == CAPWAP_WIRELESS_BINDING_IEEE80211) { + struct ac_json_ieee80211_wtpradio wtpradio; + + /* */ + ac_json_ieee80211_init(&wtpradio); + + /* Parsing SOAP response */ + jsonelement = json_object_object_get(jsonroot, "WTPRadio"); + if (jsonelement) { + if (ac_json_ieee80211_parsingjson(&wtpradio, jsonelement)) { + /* Add IEEE802.11 message elements to packet */ + ac_json_ieee80211_buildpacket(&wtpradio, txmngpacket); + } + } + + /* Free resource */ + ac_json_ieee80211_free(&wtpradio); + } + /* CAPWAP_ELEMENT_VENDORPAYLOAD */ /* TODO */ if (jsonroot) { diff --git a/src/ac/ac_dfa_join.c b/src/ac/ac_dfa_join.c index a020e8a..d42abd5 100644 --- a/src/ac/ac_dfa_join.c +++ b/src/ac/ac_dfa_join.c @@ -241,7 +241,7 @@ static struct ac_soap_response* ac_dfa_state_join_parsing_request(struct ac_sess /* Parsing only IEEE 802.11 message element */ if (IS_80211_MESSAGE_ELEMENTS(messageelement->type)) { - if (!ac_json_ieee80211_addmessageelement(&wtpradio, messageelement)) { + if (!ac_json_ieee80211_parsingmessageelement(&wtpradio, messageelement)) { json_object_put(jsonparam); return NULL; } @@ -259,28 +259,6 @@ static struct ac_soap_response* ac_dfa_state_join_parsing_request(struct ac_sess ac_json_ieee80211_free(&wtpradio); } - - - /* WTPRadioInformation */ - /*if (binding == CAPWAP_WIRELESS_BINDING_IEEE80211) { - struct capwap_array* wtpradioinformation = (struct capwap_array*)capwap_get_message_element_data(packet, CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION); - - jsonarray = json_object_new_array(); - for (i = 0; i < wtpradioinformation->count; i++) { - struct json_object* jsonradio; - struct capwap_80211_wtpradioinformation_element* radio = *(struct capwap_80211_wtpradioinformation_element**)capwap_array_get_item_pointer(wtpradioinformation, i); - - jsonradio = json_object_new_object(); - json_object_object_add(jsonradio, "RadioID", json_object_new_int((int)radio->radioid)); - json_object_object_add(jsonradio, "Mode", json_object_new_int((int)radio->radiotype)); - json_object_array_add(jsonarray, jsonradio); - } - - jsonhash = json_object_new_object(); - json_object_object_add(jsonhash, "IEEE80211WTPRadioInformation", jsonarray); - json_object_object_add(jsonparam, "WTPRadioInformation", jsonhash); - }*/ - /* ECNSupport */ ecnsupport = (struct capwap_ecnsupport_element*)capwap_get_message_element_data(packet, CAPWAP_ELEMENT_ECNSUPPORT); @@ -374,6 +352,15 @@ static uint32_t ac_dfa_state_join_create_response(struct ac_session_t* session, ACIPAddress: [string] } ] + + WTPRadio: [ + { + RadioID: [int], + IEEE80211WTPRadioInformation: { + Mode: [int] + } + } + ] } */ @@ -409,49 +396,28 @@ static uint32_t ac_dfa_state_join_create_response(struct ac_session_t* session, /* WTP Radio Information */ if (binding == CAPWAP_WIRELESS_BINDING_IEEE80211) { + struct ac_json_ieee80211_wtpradio wtpradio; struct capwap_array* wtpradioinformation = (struct capwap_array*)capwap_get_message_element_data(packet, CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION); /* */ - jsonelement = NULL; - if (jsonroot) { - jsonelement = json_object_object_get(jsonroot, "WTPRadioInformation"); - if (jsonelement && (json_object_get_type(jsonelement) == json_type_array)) { - length = json_object_array_length(jsonelement); - } else { - jsonelement = NULL; - } + ac_json_ieee80211_init(&wtpradio); + + /* */ + jsonelement = json_object_object_get(jsonroot, "WTPRadio"); + if (jsonelement) { + ac_json_ieee80211_parsingjson(&wtpradio, jsonelement); + } + + /* Copy WTP Radio Information if not present into SOAP response */ + for (i = 0; i < wtpradioinformation->count; i++) { + ac_json_ieee80211_addmessageelement(&wtpradio, CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION, *(struct capwap_80211_wtpradioinformation_element**)capwap_array_get_item_pointer(wtpradioinformation, i), 0); } /* */ - for (i = 0; i < wtpradioinformation->count; i++) { - struct capwap_80211_wtpradioinformation_element radio; + ac_json_ieee80211_buildpacket(&wtpradio, txmngpacket); - /* Override WTP Radio Information value with SOAP response */ - memcpy(&radio, *(struct capwap_80211_wtpradioinformation_element**)capwap_array_get_item_pointer(wtpradioinformation, i), sizeof(struct capwap_80211_wtpradioinformation_element)); - if (jsonelement && length) { - for (j = 0; j < length; j++) { - struct json_object* jsonvalue = json_object_array_get_idx(jsonelement, i); - if (jsonvalue && (json_object_get_type(jsonvalue) == json_type_object)) { - struct json_object* jsonitem; - - /* RadioID */ - jsonitem = json_object_object_get(jsonvalue, "RadioID"); - if (jsonitem && (json_object_get_type(jsonitem) == json_type_int)) { - if ((int)radio.radioid == json_object_get_int(jsonitem)) { - jsonitem = json_object_object_get(jsonvalue, "Mode"); - if (jsonitem && (json_object_get_type(jsonitem) == json_type_int)) { - radio.radiotype = (uint32_t)(json_object_get_int(jsonitem) & CAPWAP_RADIO_TYPE_MASK); - } - - break; - } - } - } - } - } - - capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION, &radio); - } + /* Free resource */ + ac_json_ieee80211_free(&wtpradio); } /* ECN Support */ diff --git a/src/ac/ac_json.h b/src/ac/ac_json.h index 6013094..b87867f 100644 --- a/src/ac/ac_json.h +++ b/src/ac/ac_json.h @@ -2,6 +2,7 @@ #define __AC_JSON_HEADER__ #include "capwap_array.h" +#include struct ac_json_ieee80211_item { int valid; @@ -34,9 +35,17 @@ struct ac_json_ieee80211_wtpradio { /* */ void ac_json_ieee80211_init(struct ac_json_ieee80211_wtpradio* wtpradio); -int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, struct capwap_message_element_itemlist* messageelement); -struct json_object* ac_json_ieee80211_getjson(struct ac_json_ieee80211_wtpradio* wtpradio); void ac_json_ieee80211_free(struct ac_json_ieee80211_wtpradio* wtpradio); +/* */ +int ac_json_ieee80211_addmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, uint16_t type, void* data, int overwrite); +int ac_json_ieee80211_parsingmessageelement(struct ac_json_ieee80211_wtpradio* wtpradio, struct capwap_message_element_itemlist* messageelement); +int ac_json_ieee80211_parsingjson(struct ac_json_ieee80211_wtpradio* wtpradio, struct json_object* jsonroot); + +/* */ +struct json_object* ac_json_ieee80211_getjson(struct ac_json_ieee80211_wtpradio* wtpradio); +void ac_json_ieee80211_buildpacket(struct ac_json_ieee80211_wtpradio* wtpradio, struct capwap_packet_txmng* txmngpacket); + + #endif /* __AC_JSON_HEADER__ */