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:
vemax78 2013-08-18 18:37:17 +02:00
parent f81afd5e8c
commit 177e997d47
5 changed files with 268 additions and 158 deletions

View File

@ -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,24 +521,30 @@ 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;
if (response) {
/* Create response */ /* Create response */
capwap_header_init(&capwapheader, CAPWAP_RADIOID_NONE, GET_WBID_HEADER(packet->rxmngpacket->header)); 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); txmngpacket = capwap_packet_txmng_create_ctrl_message(&capwapheader, CAPWAP_CONFIGURATION_STATUS_RESPONSE, packet->rxmngpacket->ctrlmsg.seq, session->mtu);
/* Add message element */ /* Parsing request and add message element for respone message */
response = ac_dfa_state_configure_parsing_request(session, packet);
if (response) {
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 */
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_RESULTCODE, &resultcode);
} }
/* With error add result code message element */
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 */ /* Configure response complete, get fragment packets */
ac_free_reference_last_response(session); ac_free_reference_last_response(session);
@ -569,10 +574,6 @@ int ac_dfa_state_configure(struct ac_session_t* session, struct capwap_parsed_pa
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;
} }
} else {
ac_dfa_change_state(session, CAPWAP_CONFIGURE_TO_DTLS_TEARDOWN_STATE);
status = AC_DFA_NO_PACKET;
}
} else { } else {
/* Configure timeout */ /* Configure timeout */
ac_dfa_change_state(session, CAPWAP_CONFIGURE_TO_DTLS_TEARDOWN_STATE); ac_dfa_change_state(session, CAPWAP_CONFIGURE_TO_DTLS_TEARDOWN_STATE);

View File

@ -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,24 +142,30 @@ 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;
if (response) {
/* Create response */ /* Create response */
capwap_header_init(&capwapheader, CAPWAP_RADIOID_NONE, GET_WBID_HEADER(packet->rxmngpacket->header)); 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); txmngpacket = capwap_packet_txmng_create_ctrl_message(&capwapheader, CAPWAP_CHANGE_STATE_EVENT_RESPONSE, packet->rxmngpacket->ctrlmsg.seq, session->mtu);
/* Add message element */ /* Parsing request and add message element for respone message */
response = ac_dfa_state_datacheck_parsing_request(session, packet);
if (response) {
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 */
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_RESULTCODE, &resultcode);
} }
/* With error add result code message element */
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 */ /* Change event response complete, get fragment packets */
ac_free_reference_last_response(session); ac_free_reference_last_response(session);
@ -191,10 +195,6 @@ int ac_dfa_state_datacheck(struct ac_session_t* session, struct capwap_parsed_pa
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;
} }
} else {
ac_dfa_change_state(session, CAPWAP_DATA_CHECK_TO_DTLS_TEARDOWN_STATE);
status = AC_DFA_NO_PACKET;
}
} else { } else {
/* Configure timeout */ /* Configure timeout */
ac_dfa_change_state(session, CAPWAP_DATA_CHECK_TO_DTLS_TEARDOWN_STATE); ac_dfa_change_state(session, CAPWAP_DATA_CHECK_TO_DTLS_TEARDOWN_STATE);
@ -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);
if (result) {
/* Capwap handshake complete, notify event to backend */ /* Capwap handshake complete, notify event to backend */
if (result) {
result = 0; result = 0;
response = ac_soap_runningevent(session, session->wtpid); response = ac_soap_runningevent(session, session->wtpid);
if (response) { if (response) {

View File

@ -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,81 +16,85 @@ 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) {
int i; const char* jsonmessage;
struct capwap_header_data capwapheader; char* base64confstatus;
struct capwap_packet_txmng* txmngpacket; struct json_object* jsonparam;
struct capwap_sessionid_element* sessionid;
struct capwap_wtpboarddata_element* wtpboarddata;
int status = AC_DFA_ACCEPT_PACKET;
struct capwap_resultcode_element resultcode = { .code = CAPWAP_RESULTCODE_FAILURE };
ASSERT(session != NULL);
if (packet) {
unsigned short binding;
/* Check binding */
binding = GET_WBID_HEADER(packet->rxmngpacket->header);
if (ac_valid_binding(binding)) {
if (packet->rxmngpacket->ctrlmsg.type == CAPWAP_JOIN_REQUEST) {
/* Get sessionid and verify unique id */
sessionid = (struct capwap_sessionid_element*)capwap_get_message_element_data(packet, CAPWAP_ELEMENT_SESSIONID);
if (!ac_has_sessionid(sessionid)) {
char* wtpid;
/* Checking macaddress for detect if WTP already connected */
wtpboarddata = (struct capwap_wtpboarddata_element*)capwap_get_message_element_data(packet, CAPWAP_ELEMENT_WTPBOARDDATA);
/* Get printable WTPID */
wtpid = ac_get_printable_wtpid(wtpboarddata);
if (wtpid && !ac_has_wtpid(wtpid)) {
struct ac_soap_response* response; struct ac_soap_response* response;
/* Request authorization of Backend for complete join */ /* Create SOAP request with JSON param
response = ac_soap_authorizejoin(session, wtpid); {
if (response) {
resultcode.code = ac_dfa_state_join_check_authorizejoin(session, response);
ac_soapclient_free_response(response);
} else {
resultcode.code = CAPWAP_RESULTCODE_JOIN_FAILURE_UNKNOWN_SOURCE;
}
} else {
resultcode.code = CAPWAP_RESULTCODE_JOIN_FAILURE_UNKNOWN_SOURCE;
} }
*/
/* */ /* */
if (CAPWAP_RESULTCODE_OK(resultcode.code)) { jsonparam = json_object_new_object();
session->wtpid = wtpid;
memcpy(&session->sessionid, sessionid, sizeof(struct capwap_sessionid_element)); /* Get JSON param and convert base64 */
session->binding = binding; jsonmessage = json_object_to_json_string(jsonparam);
} else { base64confstatus = capwap_alloc(AC_BASE64_ENCODE_LENGTH(strlen(jsonmessage)));
capwap_free(wtpid); if (!base64confstatus) {
} capwap_outofmemory();
} else {
resultcode.code = CAPWAP_RESULTCODE_JOIN_FAILURE_ID_ALREADY_IN_USE;
}
} else {
resultcode.code = CAPWAP_RESULTCODE_MSG_UNEXPECTED_INVALID_CURRENT_STATE;
}
} else {
resultcode.code = CAPWAP_RESULTCODE_JOIN_FAILURE_BINDING_NOT_SUPPORTED;
} }
/* Create response */ ac_base64_string_encode(jsonmessage, base64confstatus);
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);
/* Add message element */ /* Send message */
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_RESULTCODE, &resultcode); response = ac_soap_joinevent(session, session->wtpid, base64confstatus);
/* Check is valid packet after parsing request */ /* Free JSON */
if (CAPWAP_RESULTCODE_OK(resultcode.code)) { 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 length;
char* json;
xmlChar* xmlResult;
struct json_object* jsonroot;
struct capwap_list* controllist; struct capwap_list* controllist;
struct capwap_list_item* item; 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 */ /* Update statistics */
ac_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_ACDESCRIPTION, &g_ac.descriptor);
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_ACNAME, &g_ac.acname); capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_ACNAME, &g_ac.acname);
@ -148,8 +153,90 @@ int ac_dfa_state_join(struct ac_session_t* session, struct capwap_parsed_packet*
/* CAPWAP_CREATE_IMAGEIDENTIFIER_ELEMENT */ /* TODO */ /* CAPWAP_CREATE_IMAGEIDENTIFIER_ELEMENT */ /* TODO */
/* CAPWAP_CREATE_MAXIMUMMESSAGELENGTH_ELEMENT */ /* TODO */ /* CAPWAP_CREATE_MAXIMUMMESSAGELENGTH_ELEMENT */ /* TODO */
/* CAPWAP_CREATE_VENDORSPECIFICPAYLOAD_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_packet_txmng* txmngpacket;
struct capwap_sessionid_element* sessionid;
struct capwap_wtpboarddata_element* wtpboarddata;
int status = AC_DFA_ACCEPT_PACKET;
struct capwap_resultcode_element resultcode = { .code = CAPWAP_RESULTCODE_FAILURE };
ASSERT(session != NULL);
if (packet) {
unsigned short binding;
/* Check binding */
binding = GET_WBID_HEADER(packet->rxmngpacket->header);
if (ac_valid_binding(binding)) {
if (packet->rxmngpacket->ctrlmsg.type == CAPWAP_JOIN_REQUEST) {
/* Get sessionid and verify unique id */
sessionid = (struct capwap_sessionid_element*)capwap_get_message_element_data(packet, CAPWAP_ELEMENT_SESSIONID);
if (!ac_has_sessionid(sessionid)) {
char* wtpid;
/* Checking macaddress for detect if WTP already connected */
wtpboarddata = (struct capwap_wtpboarddata_element*)capwap_get_message_element_data(packet, CAPWAP_ELEMENT_WTPBOARDDATA);
/* Get printable WTPID */
wtpid = ac_get_printable_wtpid(wtpboarddata);
if (wtpid && !ac_has_wtpid(wtpid)) {
/* Request authorization of Backend for complete join */
response = ac_soap_authorizejoin(session, wtpid);
if (response) {
resultcode.code = ac_dfa_state_join_check_authorizejoin(session, response);
ac_soapclient_free_response(response);
} else {
resultcode.code = CAPWAP_RESULTCODE_JOIN_FAILURE_UNKNOWN_SOURCE;
}
} else {
resultcode.code = CAPWAP_RESULTCODE_JOIN_FAILURE_UNKNOWN_SOURCE;
}
/* */
if (CAPWAP_RESULTCODE_OK(resultcode.code)) {
session->wtpid = wtpid;
memcpy(&session->sessionid, sessionid, sizeof(struct capwap_sessionid_element));
session->binding = binding;
} else {
capwap_free(wtpid);
}
} else {
resultcode.code = CAPWAP_RESULTCODE_JOIN_FAILURE_ID_ALREADY_IN_USE;
}
} else {
resultcode.code = CAPWAP_RESULTCODE_MSG_UNEXPECTED_INVALID_CURRENT_STATE;
}
} else {
resultcode.code = CAPWAP_RESULTCODE_JOIN_FAILURE_BINDING_NOT_SUPPORTED;
}
/* Create response */
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);
/* */
if (CAPWAP_RESULTCODE_OK(resultcode.code)) {
response = ac_dfa_state_join_parsing_request(session, packet);
if (response) {
resultcode.code = ac_dfa_state_join_create_response(session, packet, response, txmngpacket);
ac_soapclient_free_response(response);
}
}
/* 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);

View File

@ -138,8 +138,9 @@ 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_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) #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__ */

View File

@ -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"/>