In case of problems with the backend, at receipt of the WTP Requests Message is
correctly sent the result error failer.
This commit is contained in:
parent
f81afd5e8c
commit
177e997d47
@ -137,7 +137,7 @@ static struct ac_soap_response* ac_dfa_state_configure_parsing_request(struct ac
|
|||||||
ac_base64_string_encode(jsonmessage, base64confstatus);
|
ac_base64_string_encode(jsonmessage, base64confstatus);
|
||||||
|
|
||||||
/* Send message */
|
/* Send message */
|
||||||
response = ac_soap_configurestatus(session, session->wtpid, base64confstatus);
|
response = ac_soap_configurestatusevent(session, session->wtpid, base64confstatus);
|
||||||
|
|
||||||
/* Free JSON */
|
/* Free JSON */
|
||||||
json_object_put(jsonparam);
|
json_object_put(jsonparam);
|
||||||
@ -514,7 +514,6 @@ static uint32_t ac_dfa_state_configure_create_response(struct ac_session_t* sess
|
|||||||
|
|
||||||
/* */
|
/* */
|
||||||
int ac_dfa_state_configure(struct ac_session_t* session, struct capwap_parsed_packet* packet) {
|
int ac_dfa_state_configure(struct ac_session_t* session, struct capwap_parsed_packet* packet) {
|
||||||
uint32_t result;
|
|
||||||
struct capwap_header_data capwapheader;
|
struct capwap_header_data capwapheader;
|
||||||
struct capwap_packet_txmng* txmngpacket;
|
struct capwap_packet_txmng* txmngpacket;
|
||||||
int status = AC_DFA_ACCEPT_PACKET;
|
int status = AC_DFA_ACCEPT_PACKET;
|
||||||
@ -522,53 +521,55 @@ int ac_dfa_state_configure(struct ac_session_t* session, struct capwap_parsed_pa
|
|||||||
ASSERT(session != NULL);
|
ASSERT(session != NULL);
|
||||||
|
|
||||||
if (packet) {
|
if (packet) {
|
||||||
/* Parsing request */
|
struct ac_soap_response* response;
|
||||||
struct ac_soap_response* response = ac_dfa_state_configure_parsing_request(session, packet);
|
uint32_t result = CAPWAP_RESULTCODE_FAILURE;
|
||||||
|
|
||||||
|
/* Create response */
|
||||||
|
capwap_header_init(&capwapheader, CAPWAP_RADIOID_NONE, GET_WBID_HEADER(packet->rxmngpacket->header));
|
||||||
|
txmngpacket = capwap_packet_txmng_create_ctrl_message(&capwapheader, CAPWAP_CONFIGURATION_STATUS_RESPONSE, packet->rxmngpacket->ctrlmsg.seq, session->mtu);
|
||||||
|
|
||||||
|
/* Parsing request and add message element for respone message */
|
||||||
|
response = ac_dfa_state_configure_parsing_request(session, packet);
|
||||||
if (response) {
|
if (response) {
|
||||||
/* Create response */
|
|
||||||
capwap_header_init(&capwapheader, CAPWAP_RADIOID_NONE, GET_WBID_HEADER(packet->rxmngpacket->header));
|
|
||||||
txmngpacket = capwap_packet_txmng_create_ctrl_message(&capwapheader, CAPWAP_CONFIGURATION_STATUS_RESPONSE, packet->rxmngpacket->ctrlmsg.seq, session->mtu);
|
|
||||||
|
|
||||||
/* Add message element */
|
|
||||||
result = ac_dfa_state_configure_create_response(session, packet, response, txmngpacket);
|
result = ac_dfa_state_configure_create_response(session, packet, response, txmngpacket);
|
||||||
if (!CAPWAP_RESULTCODE_OK(result)) {
|
ac_soapclient_free_response(response);
|
||||||
struct capwap_resultcode_element resultcode = { .code = result };
|
}
|
||||||
|
|
||||||
/* Add error result code */
|
/* With error add result code message element */
|
||||||
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_RESULTCODE, &resultcode);
|
if (!CAPWAP_RESULTCODE_OK(result)) {
|
||||||
}
|
struct capwap_resultcode_element resultcode = { .code = result };
|
||||||
|
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_RESULTCODE, &resultcode);
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
ac_soapclient_free_response(response);
|
if (result == CAPWAP_RESULTCODE_FAILURE) {
|
||||||
|
/* TODO: Add AC List Message Elements */
|
||||||
/* Configure response complete, get fragment packets */
|
|
||||||
ac_free_reference_last_response(session);
|
|
||||||
capwap_packet_txmng_get_fragment_packets(txmngpacket, session->responsefragmentpacket, session->fragmentid);
|
|
||||||
if (session->responsefragmentpacket->count > 1) {
|
|
||||||
session->fragmentid++;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Free packets manager */
|
/* Configure response complete, get fragment packets */
|
||||||
capwap_packet_txmng_free(txmngpacket);
|
ac_free_reference_last_response(session);
|
||||||
|
capwap_packet_txmng_get_fragment_packets(txmngpacket, session->responsefragmentpacket, session->fragmentid);
|
||||||
|
if (session->responsefragmentpacket->count > 1) {
|
||||||
|
session->fragmentid++;
|
||||||
|
}
|
||||||
|
|
||||||
/* Save remote sequence number */
|
/* Free packets manager */
|
||||||
session->remoteseqnumber = packet->rxmngpacket->ctrlmsg.seq;
|
capwap_packet_txmng_free(txmngpacket);
|
||||||
capwap_get_packet_digest(packet->rxmngpacket, packet->connection, session->lastrecvpackethash);
|
|
||||||
|
|
||||||
/* Send Configure response to WTP */
|
/* Save remote sequence number */
|
||||||
if (!capwap_crypt_sendto_fragmentpacket(&session->ctrldtls, session->ctrlsocket.socket[session->ctrlsocket.type], session->responsefragmentpacket, &session->acctrladdress, &session->wtpctrladdress)) {
|
session->remoteseqnumber = packet->rxmngpacket->ctrlmsg.seq;
|
||||||
/* Response is already created and saved. When receive a re-request, DFA autoresponse */
|
capwap_get_packet_digest(packet->rxmngpacket, packet->connection, session->lastrecvpackethash);
|
||||||
capwap_logging_debug("Warning: error to send configuration status response packet");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Change state */
|
/* Send Configure response to WTP */
|
||||||
if (CAPWAP_RESULTCODE_OK(result)) {
|
if (!capwap_crypt_sendto_fragmentpacket(&session->ctrldtls, session->ctrlsocket.socket[session->ctrlsocket.type], session->responsefragmentpacket, &session->acctrladdress, &session->wtpctrladdress)) {
|
||||||
ac_dfa_change_state(session, CAPWAP_DATA_CHECK_STATE);
|
/* Response is already created and saved. When receive a re-request, DFA autoresponse */
|
||||||
capwap_set_timeout(session->dfa.rfcChangeStatePendingTimer, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION);
|
capwap_logging_debug("Warning: error to send configuration status response packet");
|
||||||
} else {
|
}
|
||||||
ac_dfa_change_state(session, CAPWAP_CONFIGURE_TO_DTLS_TEARDOWN_STATE);
|
|
||||||
status = AC_DFA_NO_PACKET;
|
/* Change state */
|
||||||
}
|
if (CAPWAP_RESULTCODE_OK(result)) {
|
||||||
|
ac_dfa_change_state(session, CAPWAP_DATA_CHECK_STATE);
|
||||||
|
capwap_set_timeout(session->dfa.rfcChangeStatePendingTimer, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION);
|
||||||
} else {
|
} else {
|
||||||
ac_dfa_change_state(session, CAPWAP_CONFIGURE_TO_DTLS_TEARDOWN_STATE);
|
ac_dfa_change_state(session, CAPWAP_CONFIGURE_TO_DTLS_TEARDOWN_STATE);
|
||||||
status = AC_DFA_NO_PACKET;
|
status = AC_DFA_NO_PACKET;
|
||||||
|
@ -84,7 +84,6 @@ static struct ac_soap_response* ac_dfa_state_datacheck_parsing_request(struct ac
|
|||||||
capwap_free(base64confstatus);
|
capwap_free(base64confstatus);
|
||||||
|
|
||||||
return response;
|
return response;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -136,7 +135,6 @@ static uint32_t ac_dfa_state_datacheck_create_response(struct ac_session_t* sess
|
|||||||
|
|
||||||
/* */
|
/* */
|
||||||
int ac_dfa_state_datacheck(struct ac_session_t* session, struct capwap_parsed_packet* packet) {
|
int ac_dfa_state_datacheck(struct ac_session_t* session, struct capwap_parsed_packet* packet) {
|
||||||
uint32_t result;
|
|
||||||
struct capwap_header_data capwapheader;
|
struct capwap_header_data capwapheader;
|
||||||
struct capwap_packet_txmng* txmngpacket;
|
struct capwap_packet_txmng* txmngpacket;
|
||||||
int status = AC_DFA_ACCEPT_PACKET;
|
int status = AC_DFA_ACCEPT_PACKET;
|
||||||
@ -144,53 +142,55 @@ int ac_dfa_state_datacheck(struct ac_session_t* session, struct capwap_parsed_pa
|
|||||||
ASSERT(session != NULL);
|
ASSERT(session != NULL);
|
||||||
|
|
||||||
if (packet) {
|
if (packet) {
|
||||||
/* Parsing request */
|
struct ac_soap_response* response;
|
||||||
struct ac_soap_response* response = ac_dfa_state_datacheck_parsing_request(session, packet);
|
uint32_t result = CAPWAP_RESULTCODE_FAILURE;
|
||||||
|
|
||||||
|
/* Create response */
|
||||||
|
capwap_header_init(&capwapheader, CAPWAP_RADIOID_NONE, GET_WBID_HEADER(packet->rxmngpacket->header));
|
||||||
|
txmngpacket = capwap_packet_txmng_create_ctrl_message(&capwapheader, CAPWAP_CHANGE_STATE_EVENT_RESPONSE, packet->rxmngpacket->ctrlmsg.seq, session->mtu);
|
||||||
|
|
||||||
|
/* Parsing request and add message element for respone message */
|
||||||
|
response = ac_dfa_state_datacheck_parsing_request(session, packet);
|
||||||
if (response) {
|
if (response) {
|
||||||
/* Create response */
|
|
||||||
capwap_header_init(&capwapheader, CAPWAP_RADIOID_NONE, GET_WBID_HEADER(packet->rxmngpacket->header));
|
|
||||||
txmngpacket = capwap_packet_txmng_create_ctrl_message(&capwapheader, CAPWAP_CHANGE_STATE_EVENT_RESPONSE, packet->rxmngpacket->ctrlmsg.seq, session->mtu);
|
|
||||||
|
|
||||||
/* Add message element */
|
|
||||||
result = ac_dfa_state_datacheck_create_response(session, packet, response, txmngpacket);
|
result = ac_dfa_state_datacheck_create_response(session, packet, response, txmngpacket);
|
||||||
if (!CAPWAP_RESULTCODE_OK(result)) {
|
ac_soapclient_free_response(response);
|
||||||
struct capwap_resultcode_element resultcode = { .code = result };
|
}
|
||||||
|
|
||||||
/* Add error result code */
|
/* With error add result code message element */
|
||||||
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_RESULTCODE, &resultcode);
|
if (!CAPWAP_RESULTCODE_OK(result)) {
|
||||||
}
|
struct capwap_resultcode_element resultcode = { .code = result };
|
||||||
|
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_RESULTCODE, &resultcode);
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
ac_soapclient_free_response(response);
|
if (result == CAPWAP_RESULTCODE_FAILURE) {
|
||||||
|
/* TODO: Add AC List Message Elements */
|
||||||
/* Change event response complete, get fragment packets */
|
|
||||||
ac_free_reference_last_response(session);
|
|
||||||
capwap_packet_txmng_get_fragment_packets(txmngpacket, session->responsefragmentpacket, session->fragmentid);
|
|
||||||
if (session->responsefragmentpacket->count > 1) {
|
|
||||||
session->fragmentid++;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Free packets manager */
|
/* Change event response complete, get fragment packets */
|
||||||
capwap_packet_txmng_free(txmngpacket);
|
ac_free_reference_last_response(session);
|
||||||
|
capwap_packet_txmng_get_fragment_packets(txmngpacket, session->responsefragmentpacket, session->fragmentid);
|
||||||
|
if (session->responsefragmentpacket->count > 1) {
|
||||||
|
session->fragmentid++;
|
||||||
|
}
|
||||||
|
|
||||||
/* Save remote sequence number */
|
/* Free packets manager */
|
||||||
session->remoteseqnumber = packet->rxmngpacket->ctrlmsg.seq;
|
capwap_packet_txmng_free(txmngpacket);
|
||||||
capwap_get_packet_digest(packet->rxmngpacket, packet->connection, session->lastrecvpackethash);
|
|
||||||
|
|
||||||
/* Send Change event response to WTP */
|
/* Save remote sequence number */
|
||||||
if (!capwap_crypt_sendto_fragmentpacket(&session->ctrldtls, session->ctrlsocket.socket[session->ctrlsocket.type], session->responsefragmentpacket, &session->acctrladdress, &session->wtpctrladdress)) {
|
session->remoteseqnumber = packet->rxmngpacket->ctrlmsg.seq;
|
||||||
/* Response is already created and saved. When receive a re-request, DFA autoresponse */
|
capwap_get_packet_digest(packet->rxmngpacket, packet->connection, session->lastrecvpackethash);
|
||||||
capwap_logging_debug("Warning: error to send change event response packet");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Change state */
|
/* Send Change event response to WTP */
|
||||||
if (CAPWAP_RESULTCODE_OK(result)) {
|
if (!capwap_crypt_sendto_fragmentpacket(&session->ctrldtls, session->ctrlsocket.socket[session->ctrlsocket.type], session->responsefragmentpacket, &session->acctrladdress, &session->wtpctrladdress)) {
|
||||||
ac_dfa_change_state(session, CAPWAP_DATA_CHECK_TO_RUN_STATE);
|
/* Response is already created and saved. When receive a re-request, DFA autoresponse */
|
||||||
capwap_set_timeout(session->dfa.rfcDataCheckTimer, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION);
|
capwap_logging_debug("Warning: error to send change event response packet");
|
||||||
} else {
|
}
|
||||||
ac_dfa_change_state(session, CAPWAP_DATA_CHECK_TO_DTLS_TEARDOWN_STATE);
|
|
||||||
status = AC_DFA_NO_PACKET;
|
/* Change state */
|
||||||
}
|
if (CAPWAP_RESULTCODE_OK(result)) {
|
||||||
|
ac_dfa_change_state(session, CAPWAP_DATA_CHECK_TO_RUN_STATE);
|
||||||
|
capwap_set_timeout(session->dfa.rfcDataCheckTimer, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION);
|
||||||
} else {
|
} else {
|
||||||
ac_dfa_change_state(session, CAPWAP_DATA_CHECK_TO_DTLS_TEARDOWN_STATE);
|
ac_dfa_change_state(session, CAPWAP_DATA_CHECK_TO_DTLS_TEARDOWN_STATE);
|
||||||
status = AC_DFA_NO_PACKET;
|
status = AC_DFA_NO_PACKET;
|
||||||
@ -246,8 +246,8 @@ int ac_dfa_state_datacheck_to_run(struct ac_session_t* session, struct capwap_pa
|
|||||||
capwap_list_free(txfragpacket);
|
capwap_list_free(txfragpacket);
|
||||||
capwap_packet_txmng_free(txmngpacket);
|
capwap_packet_txmng_free(txmngpacket);
|
||||||
|
|
||||||
|
/* Capwap handshake complete, notify event to backend */
|
||||||
if (result) {
|
if (result) {
|
||||||
/* Capwap handshake complete, notify event to backend */
|
|
||||||
result = 0;
|
result = 0;
|
||||||
response = ac_soap_runningevent(session, session->wtpid);
|
response = ac_soap_runningevent(session, session->wtpid);
|
||||||
if (response) {
|
if (response) {
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include "capwap_array.h"
|
#include "capwap_array.h"
|
||||||
#include "ac_session.h"
|
#include "ac_session.h"
|
||||||
#include "ac_backend.h"
|
#include "ac_backend.h"
|
||||||
|
#include <json/json.h>
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
static int ac_dfa_state_join_check_authorizejoin(struct ac_session_t* session, struct ac_soap_response* response) {
|
static int ac_dfa_state_join_check_authorizejoin(struct ac_session_t* session, struct ac_soap_response* response) {
|
||||||
@ -15,8 +16,154 @@ static int ac_dfa_state_join_check_authorizejoin(struct ac_session_t* session, s
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
int ac_dfa_state_join(struct ac_session_t* session, struct capwap_parsed_packet* packet) {
|
static struct ac_soap_response* ac_dfa_state_join_parsing_request(struct ac_session_t* session, struct capwap_parsed_packet* packet) {
|
||||||
|
const char* jsonmessage;
|
||||||
|
char* base64confstatus;
|
||||||
|
struct json_object* jsonparam;
|
||||||
|
struct ac_soap_response* response;
|
||||||
|
|
||||||
|
/* Create SOAP request with JSON param
|
||||||
|
{
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* */
|
||||||
|
jsonparam = json_object_new_object();
|
||||||
|
|
||||||
|
/* Get JSON param and convert base64 */
|
||||||
|
jsonmessage = json_object_to_json_string(jsonparam);
|
||||||
|
base64confstatus = capwap_alloc(AC_BASE64_ENCODE_LENGTH(strlen(jsonmessage)));
|
||||||
|
if (!base64confstatus) {
|
||||||
|
capwap_outofmemory();
|
||||||
|
}
|
||||||
|
|
||||||
|
ac_base64_string_encode(jsonmessage, base64confstatus);
|
||||||
|
|
||||||
|
/* Send message */
|
||||||
|
response = ac_soap_joinevent(session, session->wtpid, base64confstatus);
|
||||||
|
|
||||||
|
/* Free JSON */
|
||||||
|
json_object_put(jsonparam);
|
||||||
|
capwap_free(base64confstatus);
|
||||||
|
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* */
|
||||||
|
static uint32_t ac_dfa_state_join_create_response(struct ac_session_t* session, struct capwap_parsed_packet* packet, struct ac_soap_response* response, struct capwap_packet_txmng* txmngpacket) {
|
||||||
int i;
|
int i;
|
||||||
|
int length;
|
||||||
|
char* json;
|
||||||
|
xmlChar* xmlResult;
|
||||||
|
struct json_object* jsonroot;
|
||||||
|
struct capwap_list* controllist;
|
||||||
|
struct capwap_list_item* item;
|
||||||
|
unsigned short binding = GET_WBID_HEADER(packet->rxmngpacket->header);
|
||||||
|
|
||||||
|
if ((response->responsecode != HTTP_RESULT_OK) || !response->xmlResponseReturn) {
|
||||||
|
return CAPWAP_RESULTCODE_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Receive SOAP response with JSON result
|
||||||
|
{
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Decode base64 result */
|
||||||
|
xmlResult = xmlNodeGetContent(response->xmlResponseReturn);
|
||||||
|
if (!xmlResult) {
|
||||||
|
return CAPWAP_RESULTCODE_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
length = xmlStrlen(xmlResult);
|
||||||
|
if (!length) {
|
||||||
|
return CAPWAP_RESULTCODE_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
json = (char*)capwap_alloc(AC_BASE64_DECODE_LENGTH(length));
|
||||||
|
ac_base64_string_decode((const char*)xmlResult, json);
|
||||||
|
|
||||||
|
xmlFree(xmlResult);
|
||||||
|
|
||||||
|
/* Parsing JSON result */
|
||||||
|
jsonroot = json_tokener_parse(json);
|
||||||
|
capwap_free(json);
|
||||||
|
|
||||||
|
/* Add message elements response, every local value can be overwrite from backend server */
|
||||||
|
|
||||||
|
/* Update statistics */
|
||||||
|
ac_update_statistics();
|
||||||
|
|
||||||
|
/* */
|
||||||
|
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_ACDESCRIPTION, &g_ac.descriptor);
|
||||||
|
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_ACNAME, &g_ac.acname);
|
||||||
|
|
||||||
|
if (binding == CAPWAP_WIRELESS_BINDING_IEEE80211) {
|
||||||
|
struct capwap_array* wtpradioinformation = (struct capwap_array*)capwap_get_message_element_data(packet, CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION);
|
||||||
|
|
||||||
|
for (i = 0; i < wtpradioinformation->count; i++) {
|
||||||
|
struct capwap_80211_wtpradioinformation_element* radio;
|
||||||
|
|
||||||
|
radio = *(struct capwap_80211_wtpradioinformation_element**)capwap_array_get_item_pointer(wtpradioinformation, i);
|
||||||
|
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION, radio);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_ECNSUPPORT, &session->dfa.ecn);
|
||||||
|
|
||||||
|
/* Get information from any local address */
|
||||||
|
controllist = capwap_list_create();
|
||||||
|
ac_get_control_information(controllist);
|
||||||
|
|
||||||
|
for (item = controllist->first; item != NULL; item = item->next) {
|
||||||
|
struct ac_session_control* sessioncontrol = (struct ac_session_control*)item->item;
|
||||||
|
|
||||||
|
if (sessioncontrol->localaddress.ss_family == AF_INET) {
|
||||||
|
struct capwap_controlipv4_element element;
|
||||||
|
|
||||||
|
memcpy(&element.address, &((struct sockaddr_in*)&sessioncontrol->localaddress)->sin_addr, sizeof(struct in_addr));
|
||||||
|
element.wtpcount = sessioncontrol->count;
|
||||||
|
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_CONTROLIPV4, &element);
|
||||||
|
} else if (sessioncontrol->localaddress.ss_family == AF_INET6) {
|
||||||
|
struct capwap_controlipv6_element element;
|
||||||
|
|
||||||
|
memcpy(&element.address, &((struct sockaddr_in6*)&sessioncontrol->localaddress)->sin6_addr, sizeof(struct in6_addr));
|
||||||
|
element.wtpcount = sessioncontrol->count;
|
||||||
|
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_CONTROLIPV6, &element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
capwap_list_free(controllist);
|
||||||
|
|
||||||
|
if (session->acctrladdress.ss_family == AF_INET) {
|
||||||
|
struct capwap_localipv4_element addr;
|
||||||
|
|
||||||
|
memcpy(&addr.address, &((struct sockaddr_in*)&session->acctrladdress)->sin_addr, sizeof(struct in_addr));
|
||||||
|
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_LOCALIPV4, &addr);
|
||||||
|
} else if (session->acctrladdress.ss_family == AF_INET6) {
|
||||||
|
struct capwap_localipv6_element addr;
|
||||||
|
|
||||||
|
memcpy(&addr.address, &((struct sockaddr_in6*)&session->acctrladdress)->sin6_addr, sizeof(struct in6_addr));
|
||||||
|
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_LOCALIPV6, &addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CAPWAP_CREATE_ACIPV4LIST_ELEMENT */ /* TODO */
|
||||||
|
/* CAPWAP_CREATE_ACIPV6LIST_ELEMENT */ /* TODO */
|
||||||
|
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_TRANSPORT, &session->dfa.transport);
|
||||||
|
/* CAPWAP_CREATE_IMAGEIDENTIFIER_ELEMENT */ /* TODO */
|
||||||
|
/* CAPWAP_CREATE_MAXIMUMMESSAGELENGTH_ELEMENT */ /* TODO */
|
||||||
|
/* CAPWAP_CREATE_VENDORSPECIFICPAYLOAD_ELEMENT */ /* TODO */
|
||||||
|
|
||||||
|
if (jsonroot) {
|
||||||
|
json_object_put(jsonroot);
|
||||||
|
}
|
||||||
|
|
||||||
|
return CAPWAP_RESULTCODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* */
|
||||||
|
int ac_dfa_state_join(struct ac_session_t* session, struct capwap_parsed_packet* packet) {
|
||||||
|
struct ac_soap_response* response;
|
||||||
struct capwap_header_data capwapheader;
|
struct capwap_header_data capwapheader;
|
||||||
struct capwap_packet_txmng* txmngpacket;
|
struct capwap_packet_txmng* txmngpacket;
|
||||||
struct capwap_sessionid_element* sessionid;
|
struct capwap_sessionid_element* sessionid;
|
||||||
@ -44,8 +191,6 @@ int ac_dfa_state_join(struct ac_session_t* session, struct capwap_parsed_packet*
|
|||||||
/* Get printable WTPID */
|
/* Get printable WTPID */
|
||||||
wtpid = ac_get_printable_wtpid(wtpboarddata);
|
wtpid = ac_get_printable_wtpid(wtpboarddata);
|
||||||
if (wtpid && !ac_has_wtpid(wtpid)) {
|
if (wtpid && !ac_has_wtpid(wtpid)) {
|
||||||
struct ac_soap_response* response;
|
|
||||||
|
|
||||||
/* Request authorization of Backend for complete join */
|
/* Request authorization of Backend for complete join */
|
||||||
response = ac_soap_authorizejoin(session, wtpid);
|
response = ac_soap_authorizejoin(session, wtpid);
|
||||||
if (response) {
|
if (response) {
|
||||||
@ -80,76 +225,18 @@ int ac_dfa_state_join(struct ac_session_t* session, struct capwap_parsed_packet*
|
|||||||
capwap_header_init(&capwapheader, CAPWAP_RADIOID_NONE, binding);
|
capwap_header_init(&capwapheader, CAPWAP_RADIOID_NONE, binding);
|
||||||
txmngpacket = capwap_packet_txmng_create_ctrl_message(&capwapheader, CAPWAP_JOIN_RESPONSE, packet->rxmngpacket->ctrlmsg.seq, session->mtu);
|
txmngpacket = capwap_packet_txmng_create_ctrl_message(&capwapheader, CAPWAP_JOIN_RESPONSE, packet->rxmngpacket->ctrlmsg.seq, session->mtu);
|
||||||
|
|
||||||
/* Add message element */
|
/* */
|
||||||
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_RESULTCODE, &resultcode);
|
|
||||||
|
|
||||||
/* Check is valid packet after parsing request */
|
|
||||||
if (CAPWAP_RESULTCODE_OK(resultcode.code)) {
|
if (CAPWAP_RESULTCODE_OK(resultcode.code)) {
|
||||||
struct capwap_list* controllist;
|
response = ac_dfa_state_join_parsing_request(session, packet);
|
||||||
struct capwap_list_item* item;
|
if (response) {
|
||||||
|
resultcode.code = ac_dfa_state_join_create_response(session, packet, response, txmngpacket);
|
||||||
/* Update statistics */
|
ac_soapclient_free_response(response);
|
||||||
ac_update_statistics();
|
|
||||||
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_ACDESCRIPTION, &g_ac.descriptor);
|
|
||||||
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_ACNAME, &g_ac.acname);
|
|
||||||
|
|
||||||
if (binding == CAPWAP_WIRELESS_BINDING_IEEE80211) {
|
|
||||||
struct capwap_array* wtpradioinformation = (struct capwap_array*)capwap_get_message_element_data(packet, CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION);
|
|
||||||
|
|
||||||
for (i = 0; i < wtpradioinformation->count; i++) {
|
|
||||||
struct capwap_80211_wtpradioinformation_element* radio;
|
|
||||||
|
|
||||||
radio = *(struct capwap_80211_wtpradioinformation_element**)capwap_array_get_item_pointer(wtpradioinformation, i);
|
|
||||||
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_WTPRADIOINFORMATION, radio);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_ECNSUPPORT, &session->dfa.ecn);
|
|
||||||
|
|
||||||
/* Get information from any local address */
|
|
||||||
controllist = capwap_list_create();
|
|
||||||
ac_get_control_information(controllist);
|
|
||||||
|
|
||||||
for (item = controllist->first; item != NULL; item = item->next) {
|
|
||||||
struct ac_session_control* sessioncontrol = (struct ac_session_control*)item->item;
|
|
||||||
|
|
||||||
if (sessioncontrol->localaddress.ss_family == AF_INET) {
|
|
||||||
struct capwap_controlipv4_element element;
|
|
||||||
|
|
||||||
memcpy(&element.address, &((struct sockaddr_in*)&sessioncontrol->localaddress)->sin_addr, sizeof(struct in_addr));
|
|
||||||
element.wtpcount = sessioncontrol->count;
|
|
||||||
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_CONTROLIPV4, &element);
|
|
||||||
} else if (sessioncontrol->localaddress.ss_family == AF_INET6) {
|
|
||||||
struct capwap_controlipv6_element element;
|
|
||||||
|
|
||||||
memcpy(&element.address, &((struct sockaddr_in6*)&sessioncontrol->localaddress)->sin6_addr, sizeof(struct in6_addr));
|
|
||||||
element.wtpcount = sessioncontrol->count;
|
|
||||||
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_CONTROLIPV6, &element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
capwap_list_free(controllist);
|
|
||||||
|
|
||||||
if (session->acctrladdress.ss_family == AF_INET) {
|
|
||||||
struct capwap_localipv4_element addr;
|
|
||||||
|
|
||||||
memcpy(&addr.address, &((struct sockaddr_in*)&session->acctrladdress)->sin_addr, sizeof(struct in_addr));
|
|
||||||
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_LOCALIPV4, &addr);
|
|
||||||
} else if (session->acctrladdress.ss_family == AF_INET6) {
|
|
||||||
struct capwap_localipv6_element addr;
|
|
||||||
|
|
||||||
memcpy(&addr.address, &((struct sockaddr_in6*)&session->acctrladdress)->sin6_addr, sizeof(struct in6_addr));
|
|
||||||
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_LOCALIPV6, &addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* CAPWAP_CREATE_ACIPV4LIST_ELEMENT */ /* TODO */
|
|
||||||
/* CAPWAP_CREATE_ACIPV6LIST_ELEMENT */ /* TODO */
|
|
||||||
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_TRANSPORT, &session->dfa.transport);
|
|
||||||
/* CAPWAP_CREATE_IMAGEIDENTIFIER_ELEMENT */ /* TODO */
|
|
||||||
/* CAPWAP_CREATE_MAXIMUMMESSAGELENGTH_ELEMENT */ /* TODO */
|
|
||||||
/* CAPWAP_CREATE_VENDORSPECIFICPAYLOAD_ELEMENT */ /* TODO */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Add always result code message element */
|
||||||
|
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_RESULTCODE, &resultcode);
|
||||||
|
|
||||||
/* Join response complete, get fragment packets */
|
/* Join response complete, get fragment packets */
|
||||||
ac_free_reference_last_response(session);
|
ac_free_reference_last_response(session);
|
||||||
capwap_packet_txmng_get_fragment_packets(txmngpacket, session->responsefragmentpacket, session->fragmentid);
|
capwap_packet_txmng_get_fragment_packets(txmngpacket, session->responsefragmentpacket, session->fragmentid);
|
||||||
|
@ -137,9 +137,10 @@ int ac_dfa_state_dead(struct ac_session_t* session, struct capwap_parsed_packet*
|
|||||||
|
|
||||||
/* Soap function */
|
/* Soap function */
|
||||||
struct ac_soap_response* ac_session_send_soap_request(struct ac_session_t* session, char* method, int numparam, ...);
|
struct ac_soap_response* ac_session_send_soap_request(struct ac_session_t* session, char* method, int numparam, ...);
|
||||||
#define ac_soap_authorizejoin(s, wtpid) ac_session_send_soap_request((s), "authorizeJoin", 1, "xs:string", "wtpid", wtpid)
|
#define ac_soap_authorizejoin(s, wtpid) ac_session_send_soap_request((s), "authorizeJoin", 1, "xs:string", "wtpid", wtpid)
|
||||||
#define ac_soap_configurestatus(s, wtpid, confstatus) ac_session_send_soap_request((s), "configureStatus", 2, "xs:string", "wtpid", wtpid, "xs:base64Binary", "confstatus", confstatus)
|
#define ac_soap_joinevent(s, wtpid, joinparam) ac_session_send_soap_request((s), "joinEvent", 2, "xs:string", "wtpid", wtpid, "xs:base64Binary", "join", joinparam)
|
||||||
#define ac_soap_changestateevent(s, wtpid, changestate) ac_session_send_soap_request((s), "changeStateEvent", 2, "xs:string", "wtpid", wtpid, "xs:base64Binary", "changestate", changestate)
|
#define ac_soap_configurestatusevent(s, wtpid, confstatusparam) ac_session_send_soap_request((s), "configureStatusEvent", 2, "xs:string", "wtpid", wtpid, "xs:base64Binary", "confstatus", confstatusparam)
|
||||||
#define ac_soap_runningevent(s, wtpid) ac_session_send_soap_request((s), "runningEvent", 1, "xs:string", "wtpid", wtpid)
|
#define ac_soap_changestateevent(s, wtpid, changestateparam) ac_session_send_soap_request((s), "changeStateEvent", 2, "xs:string", "wtpid", wtpid, "xs:base64Binary", "changestate", changestateparam)
|
||||||
|
#define ac_soap_runningevent(s, wtpid) ac_session_send_soap_request((s), "runningEvent", 1, "xs:string", "wtpid", wtpid)
|
||||||
|
|
||||||
#endif /* __AC_SESSION_HEADER__ */
|
#endif /* __AC_SESSION_HEADER__ */
|
||||||
|
@ -26,12 +26,17 @@
|
|||||||
<wsdl:message name="authorizeJoinResponse"/>
|
<wsdl:message name="authorizeJoinResponse"/>
|
||||||
<wsdl:message name="waitBackendEventFault"/>
|
<wsdl:message name="waitBackendEventFault"/>
|
||||||
<wsdl:message name="authorizeJoinFault"/>
|
<wsdl:message name="authorizeJoinFault"/>
|
||||||
<wsdl:message name="configureStatus">
|
<wsdl:message name="configureStatusEvent">
|
||||||
<wsdl:part name="sessionid" type="xs:string"/>
|
<wsdl:part name="sessionid" type="xs:string"/>
|
||||||
<wsdl:part name="wtpid" type="xs:string"/>
|
<wsdl:part name="wtpid" type="xs:string"/>
|
||||||
<wsdl:part name="confstatus" type="xs:base64Binary"/>
|
<wsdl:part name="confstatus" type="xs:base64Binary"/>
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="configureStatusResponse">
|
<wsdl:message name="joinEvent">
|
||||||
|
<wsdl:part name="sessionid" type="xs:string"/>
|
||||||
|
<wsdl:part name="wtpid" type="xs:string"/>
|
||||||
|
<wsdl:part name="join" type="xs:base64Binary"/>
|
||||||
|
</wsdl:message>
|
||||||
|
<wsdl:message name="configureStatusEventResponse">
|
||||||
<wsdl:part name="return" type="xs:base64Binary"/>
|
<wsdl:part name="return" type="xs:base64Binary"/>
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="changeStateEvent">
|
<wsdl:message name="changeStateEvent">
|
||||||
@ -47,6 +52,9 @@
|
|||||||
<wsdl:part name="wtpid" type="xs:string"/>
|
<wsdl:part name="wtpid" type="xs:string"/>
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="runningEventResponse"/>
|
<wsdl:message name="runningEventResponse"/>
|
||||||
|
<wsdl:message name="joinEventResponse">
|
||||||
|
<wsdl:part name="return" type="xs:base64Binary"/>
|
||||||
|
</wsdl:message>
|
||||||
<wsdl:portType name="Presence">
|
<wsdl:portType name="Presence">
|
||||||
<wsdl:operation name="joinBackend">
|
<wsdl:operation name="joinBackend">
|
||||||
<wsdl:input message="tns:joinBackend"/>
|
<wsdl:input message="tns:joinBackend"/>
|
||||||
@ -68,9 +76,13 @@
|
|||||||
<wsdl:input message="tns:authorizeJoin"/>
|
<wsdl:input message="tns:authorizeJoin"/>
|
||||||
<wsdl:output message="tns:authorizeJoinResponse"/>
|
<wsdl:output message="tns:authorizeJoinResponse"/>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="configureStatus">
|
<wsdl:operation name="joinEvent">
|
||||||
<wsdl:input message="tns:configureStatus"/>
|
<wsdl:input message="tns:joinEvent"/>
|
||||||
<wsdl:output message="tns:configureStatusResponse"/>
|
<wsdl:output message="tns:joinEventResponse"/>
|
||||||
|
</wsdl:operation>
|
||||||
|
<wsdl:operation name="configureStatusEvent">
|
||||||
|
<wsdl:input message="tns:configureStatusEvent"/>
|
||||||
|
<wsdl:output message="tns:configureStatusEventResponse"/>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="changeStateEvent">
|
<wsdl:operation name="changeStateEvent">
|
||||||
<wsdl:input message="tns:changeStateEvent"/>
|
<wsdl:input message="tns:changeStateEvent"/>
|
||||||
@ -125,7 +137,16 @@
|
|||||||
<soap:body use="literal"/>
|
<soap:body use="literal"/>
|
||||||
</wsdl:output>
|
</wsdl:output>
|
||||||
</wsdl:operation>
|
</wsdl:operation>
|
||||||
<wsdl:operation name="configureStatus">
|
<wsdl:operation name="joinEvent">
|
||||||
|
<soap:operation soapAction=""/>
|
||||||
|
<wsdl:input>
|
||||||
|
<soap:body use="literal"/>
|
||||||
|
</wsdl:input>
|
||||||
|
<wsdl:output>
|
||||||
|
<soap:body use="literal"/>
|
||||||
|
</wsdl:output>
|
||||||
|
</wsdl:operation>
|
||||||
|
<wsdl:operation name="configureStatusEvent">
|
||||||
<soap:operation soapAction=""/>
|
<soap:operation soapAction=""/>
|
||||||
<wsdl:input>
|
<wsdl:input>
|
||||||
<soap:body use="literal"/>
|
<soap:body use="literal"/>
|
||||||
|
Loading…
Reference in New Issue
Block a user