Management SOAP Comet Notify Event
This commit is contained in:
parent
d303f057f0
commit
91bc075d6a
@ -1,4 +1,5 @@
|
|||||||
#include "ac.h"
|
#include "ac.h"
|
||||||
|
#include "capwap_dfa.h"
|
||||||
#include "ac_backend.h"
|
#include "ac_backend.h"
|
||||||
#include "ac_soap.h"
|
#include "ac_soap.h"
|
||||||
#include "ac_session.h"
|
#include "ac_session.h"
|
||||||
@ -32,7 +33,7 @@ struct ac_backend_t {
|
|||||||
static struct ac_backend_t g_ac_backend;
|
static struct ac_backend_t g_ac_backend;
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
static int ac_backend_parsing_closewtpsession_event(struct json_object* jsonparams) {
|
static int ac_backend_parsing_closewtpsession_event(const char* idevent, struct json_object* jsonparams) {
|
||||||
int result = 0;
|
int result = 0;
|
||||||
struct ac_session_t* session;
|
struct ac_session_t* session;
|
||||||
struct json_object* jsonvalue;
|
struct json_object* jsonvalue;
|
||||||
@ -51,10 +52,19 @@ static int ac_backend_parsing_closewtpsession_event(struct json_object* jsonpara
|
|||||||
/* Get session */
|
/* Get session */
|
||||||
session = ac_search_session_from_wtpid(wtpid);
|
session = ac_search_session_from_wtpid(wtpid);
|
||||||
if (session) {
|
if (session) {
|
||||||
|
struct ac_session_notify_event_t notify;
|
||||||
|
|
||||||
|
/* Notify Request to Complete Event */
|
||||||
|
strcpy(notify.idevent, idevent);
|
||||||
|
notify.action = NOTIFY_ACTION_CHANGE_STATE;
|
||||||
|
notify.session_state = CAPWAP_DEAD_STATE;
|
||||||
|
ac_session_send_action(session, AC_SESSION_ACTION_NOTIFY_EVENT, 0, (void*)¬ify, sizeof(struct ac_session_notify_event_t));
|
||||||
|
|
||||||
|
/* */
|
||||||
capwap_logging_debug("Receive close wtp session for WTP %s", session->wtpid);
|
capwap_logging_debug("Receive close wtp session for WTP %s", session->wtpid);
|
||||||
|
|
||||||
/* Close session */
|
/* Async close session */
|
||||||
ac_session_close(session);
|
ac_session_send_action(session, AC_SESSION_ACTION_CLOSE, 0, NULL, 0);
|
||||||
ac_session_release_reference(session);
|
ac_session_release_reference(session);
|
||||||
result = 1;
|
result = 1;
|
||||||
}
|
}
|
||||||
@ -64,7 +74,7 @@ static int ac_backend_parsing_closewtpsession_event(struct json_object* jsonpara
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
static int ac_backend_parsing_resetwtp_event(struct json_object* jsonparams) {
|
static int ac_backend_parsing_resetwtp_event(const char* idevent, struct json_object* jsonparams) {
|
||||||
int result = 0;
|
int result = 0;
|
||||||
struct ac_session_t* session;
|
struct ac_session_t* session;
|
||||||
struct json_object* jsonvalue;
|
struct json_object* jsonvalue;
|
||||||
@ -99,6 +109,7 @@ static int ac_backend_parsing_resetwtp_event(struct json_object* jsonparams) {
|
|||||||
if (name && *name) {
|
if (name && *name) {
|
||||||
int length;
|
int length;
|
||||||
struct ac_notify_reset_t* reset;
|
struct ac_notify_reset_t* reset;
|
||||||
|
struct ac_session_notify_event_t notify;
|
||||||
|
|
||||||
/* Notification data */
|
/* Notification data */
|
||||||
length = sizeof(struct ac_notify_reset_t) + strlen(name) + 1;
|
length = sizeof(struct ac_notify_reset_t) + strlen(name) + 1;
|
||||||
@ -108,6 +119,12 @@ static int ac_backend_parsing_resetwtp_event(struct json_object* jsonparams) {
|
|||||||
reset->vendor = (uint32_t)json_object_get_int(jsonvendor);
|
reset->vendor = (uint32_t)json_object_get_int(jsonvendor);
|
||||||
strcpy((char*)reset->name, name);
|
strcpy((char*)reset->name, name);
|
||||||
|
|
||||||
|
/* Notify Request to Complete Event */
|
||||||
|
strcpy(notify.idevent, idevent);
|
||||||
|
notify.action = NOTIFY_ACTION_CHANGE_STATE;
|
||||||
|
notify.session_state = CAPWAP_DEAD_STATE;
|
||||||
|
ac_session_send_action(session, AC_SESSION_ACTION_NOTIFY_EVENT, 0, (void*)¬ify, sizeof(struct ac_session_notify_event_t));
|
||||||
|
|
||||||
/* Notify Action */
|
/* Notify Action */
|
||||||
capwap_logging_debug("Receive reset request for WTP %s", session->wtpid);
|
capwap_logging_debug("Receive reset request for WTP %s", session->wtpid);
|
||||||
ac_session_send_action(session, AC_SESSION_ACTION_RESET_WTP, 0, (void*)reset, length);
|
ac_session_send_action(session, AC_SESSION_ACTION_RESET_WTP, 0, (void*)reset, length);
|
||||||
@ -127,28 +144,28 @@ static int ac_backend_parsing_resetwtp_event(struct json_object* jsonparams) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
static int ac_backend_parsing_addwlan_event(struct json_object* jsonparams) {
|
static int ac_backend_parsing_addwlan_event(const char* idevent, struct json_object* jsonparams) {
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
static int ac_backend_parsing_updatewlan_event(struct json_object* jsonparams) {
|
static int ac_backend_parsing_updatewlan_event(const char* idevent, struct json_object* jsonparams) {
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
static int ac_backend_parsing_deletewlan_event(struct json_object* jsonparams) {
|
static int ac_backend_parsing_deletewlan_event(const char* idevent, struct json_object* jsonparams) {
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
static int ac_backend_soap_update_event(int idevent, int status) {
|
static int ac_backend_soap_update_event(const char* idevent, int status) {
|
||||||
int result = 0;
|
int result = 0;
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
struct ac_soap_request* request;
|
struct ac_soap_request* request;
|
||||||
@ -168,7 +185,7 @@ static int ac_backend_soap_update_event(int idevent, int status) {
|
|||||||
request = ac_soapclient_create_request("updateBackendEvent", SOAP_NAMESPACE_URI);
|
request = ac_soapclient_create_request("updateBackendEvent", SOAP_NAMESPACE_URI);
|
||||||
if (request) {
|
if (request) {
|
||||||
ac_soapclient_add_param(request, "xs:string", "idsession", g_ac_backend.backendsessionid);
|
ac_soapclient_add_param(request, "xs:string", "idsession", g_ac_backend.backendsessionid);
|
||||||
ac_soapclient_add_param(request, "xs:int", "idevent", capwap_itoa(idevent, buffer));
|
ac_soapclient_add_param(request, "xs:string", "idevent", idevent);
|
||||||
ac_soapclient_add_param(request, "xs:int", "status", capwap_itoa(status, buffer));
|
ac_soapclient_add_param(request, "xs:int", "status", capwap_itoa(status, buffer));
|
||||||
g_ac_backend.soaprequest = ac_soapclient_prepare_request(request, server);
|
g_ac_backend.soaprequest = ac_soapclient_prepare_request(request, server);
|
||||||
}
|
}
|
||||||
@ -223,8 +240,8 @@ static void ac_backend_parsing_event(struct json_object* jsonitem) {
|
|||||||
|
|
||||||
/* Get EventID */
|
/* Get EventID */
|
||||||
jsonvalue = json_object_object_get(jsonitem, "EventID");
|
jsonvalue = json_object_object_get(jsonitem, "EventID");
|
||||||
if (jsonvalue && (json_object_get_type(jsonvalue) == json_type_int)) {
|
if (jsonvalue && (json_object_get_type(jsonvalue) == json_type_string)) {
|
||||||
int idevent = json_object_get_int(jsonvalue);
|
const char* idevent = json_object_get_string(jsonvalue);
|
||||||
|
|
||||||
/* Get Action */
|
/* Get Action */
|
||||||
jsonvalue = json_object_object_get(jsonitem, "Action");
|
jsonvalue = json_object_object_get(jsonitem, "Action");
|
||||||
@ -237,15 +254,15 @@ static void ac_backend_parsing_event(struct json_object* jsonitem) {
|
|||||||
|
|
||||||
/* Parsing params according to the action */
|
/* Parsing params according to the action */
|
||||||
if (!strcmp(action, "CloseWTPSession")) {
|
if (!strcmp(action, "CloseWTPSession")) {
|
||||||
result = ac_backend_parsing_closewtpsession_event(jsonvalue);
|
result = ac_backend_parsing_closewtpsession_event(idevent, jsonvalue);
|
||||||
} else if (!strcmp(action, "ResetWTP")) {
|
} else if (!strcmp(action, "ResetWTP")) {
|
||||||
result = ac_backend_parsing_resetwtp_event(jsonvalue);
|
result = ac_backend_parsing_resetwtp_event(idevent, jsonvalue);
|
||||||
} else if (!strcmp(action, "AddWLAN")) {
|
} else if (!strcmp(action, "AddWLAN")) {
|
||||||
result = ac_backend_parsing_addwlan_event(jsonvalue);
|
result = ac_backend_parsing_addwlan_event(idevent, jsonvalue);
|
||||||
} else if (!strcmp(action, "UpdateWLAN")) {
|
} else if (!strcmp(action, "UpdateWLAN")) {
|
||||||
result = ac_backend_parsing_updatewlan_event(jsonvalue);
|
result = ac_backend_parsing_updatewlan_event(idevent, jsonvalue);
|
||||||
} else if (!strcmp(action, "DeleteWLAN")) {
|
} else if (!strcmp(action, "DeleteWLAN")) {
|
||||||
result = ac_backend_parsing_deletewlan_event(jsonvalue);
|
result = ac_backend_parsing_deletewlan_event(idevent, jsonvalue);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Notify result action */
|
/* Notify result action */
|
||||||
|
@ -532,6 +532,7 @@ static struct ac_session_t* ac_create_session(struct sockaddr_storage* wtpaddres
|
|||||||
session->packets = capwap_list_create();
|
session->packets = capwap_list_create();
|
||||||
session->requestfragmentpacket = capwap_list_create();
|
session->requestfragmentpacket = capwap_list_create();
|
||||||
session->responsefragmentpacket = capwap_list_create();
|
session->responsefragmentpacket = capwap_list_create();
|
||||||
|
session->notifyevent = capwap_list_create();
|
||||||
|
|
||||||
session->mtu = g_ac.mtu;
|
session->mtu = g_ac.mtu;
|
||||||
session->state = CAPWAP_IDLE_STATE;
|
session->state = CAPWAP_IDLE_STATE;
|
||||||
|
@ -13,6 +13,11 @@ static int ac_session_action_execute(struct ac_session_t* session, struct ac_ses
|
|||||||
int result = AC_ERROR_ACTION_SESSION;
|
int result = AC_ERROR_ACTION_SESSION;
|
||||||
|
|
||||||
switch (action->action) {
|
switch (action->action) {
|
||||||
|
case AC_SESSION_ACTION_CLOSE: {
|
||||||
|
result = CAPWAP_ERROR_CLOSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case AC_SESSION_ACTION_RESET_WTP: {
|
case AC_SESSION_ACTION_RESET_WTP: {
|
||||||
struct capwap_imageidentifier_element imageidentifier;
|
struct capwap_imageidentifier_element imageidentifier;
|
||||||
struct ac_notify_reset_t* reset = (struct ac_notify_reset_t*)action->data;
|
struct ac_notify_reset_t* reset = (struct ac_notify_reset_t*)action->data;
|
||||||
@ -45,6 +50,17 @@ static int ac_session_action_execute(struct ac_session_t* session, struct ac_ses
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case AC_SESSION_ACTION_NOTIFY_EVENT: {
|
||||||
|
struct capwap_list_item* item;
|
||||||
|
|
||||||
|
/* Copy event into queue */
|
||||||
|
item = capwap_itemlist_create(sizeof(struct ac_session_notify_event_t));
|
||||||
|
memcpy(item->item, action->data, sizeof(struct ac_session_notify_event_t));
|
||||||
|
capwap_itemlist_insert_after(session->notifyevent, NULL, item);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -301,6 +317,7 @@ static void ac_session_destroy(struct ac_session_t* session) {
|
|||||||
|
|
||||||
capwap_list_free(session->requestfragmentpacket);
|
capwap_list_free(session->requestfragmentpacket);
|
||||||
capwap_list_free(session->responsefragmentpacket);
|
capwap_list_free(session->responsefragmentpacket);
|
||||||
|
capwap_list_free(session->notifyevent);
|
||||||
|
|
||||||
/* Free DFA resource */
|
/* Free DFA resource */
|
||||||
capwap_array_free(session->dfa.acipv4list.addresses);
|
capwap_array_free(session->dfa.acipv4list.addresses);
|
||||||
@ -470,6 +487,8 @@ static void ac_session_run(struct ac_session_t* session) {
|
|||||||
|
|
||||||
/* Change WTP state machine */
|
/* Change WTP state machine */
|
||||||
void ac_dfa_change_state(struct ac_session_t* session, int state) {
|
void ac_dfa_change_state(struct ac_session_t* session, int state) {
|
||||||
|
struct capwap_list_item* search;
|
||||||
|
|
||||||
ASSERT(session != NULL);
|
ASSERT(session != NULL);
|
||||||
|
|
||||||
if (state != session->state) {
|
if (state != session->state) {
|
||||||
@ -480,6 +499,30 @@ void ac_dfa_change_state(struct ac_session_t* session, int state) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
session->state = state;
|
session->state = state;
|
||||||
|
|
||||||
|
/* Search into notify event*/
|
||||||
|
search = session->notifyevent->first;
|
||||||
|
while (search != NULL) {
|
||||||
|
struct ac_session_notify_event_t* notify = (struct ac_session_notify_event_t*)search->item;
|
||||||
|
|
||||||
|
if ((notify->action == NOTIFY_ACTION_CHANGE_STATE) && (notify->session_state == state)) {
|
||||||
|
char buffer[4];
|
||||||
|
struct ac_soap_response* response;
|
||||||
|
|
||||||
|
/* */
|
||||||
|
capwap_itoa(SOAP_EVENT_STATUS_COMPLETE, buffer);
|
||||||
|
response = ac_soap_updatebackendevent(session, notify->idevent, capwap_itoa(SOAP_EVENT_STATUS_COMPLETE, buffer));
|
||||||
|
if (response) {
|
||||||
|
ac_soapclient_free_response(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove notify event */
|
||||||
|
capwap_itemlist_free(capwap_itemlist_remove(session->notifyevent, search));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
search = search->next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,8 +19,10 @@ struct ac_session_control {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
|
#define AC_SESSION_ACTION_CLOSE 0
|
||||||
#define AC_SESSION_ACTION_RESET_WTP 1
|
#define AC_SESSION_ACTION_RESET_WTP 1
|
||||||
#define AC_SESSION_ACTION_ESTABLISHED_SESSION_DATA 2
|
#define AC_SESSION_ACTION_ESTABLISHED_SESSION_DATA 2
|
||||||
|
#define AC_SESSION_ACTION_NOTIFY_EVENT 3
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct ac_session_action {
|
struct ac_session_action {
|
||||||
@ -30,6 +32,21 @@ struct ac_session_action {
|
|||||||
char data[0];
|
char data[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* */
|
||||||
|
#define NOTIFY_ACTION_CHANGE_STATE 0
|
||||||
|
#define NOTIFY_ACTION_RECEIVE_REQUEST_MESSAGEELEMENT 1
|
||||||
|
#define NOTIFY_ACTION_RECEIVE_RESPONSE_MESSAGEELEMENT 1
|
||||||
|
|
||||||
|
struct ac_session_notify_event_t {
|
||||||
|
char idevent[65];
|
||||||
|
|
||||||
|
int action;
|
||||||
|
union {
|
||||||
|
unsigned long session_state;
|
||||||
|
uint16_t message_element_type;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct ac_session_t;
|
struct ac_session_t;
|
||||||
struct ac_session_data_t;
|
struct ac_session_data_t;
|
||||||
@ -95,6 +112,8 @@ struct ac_session_t {
|
|||||||
struct capwap_list* action;
|
struct capwap_list* action;
|
||||||
struct capwap_list* packets;
|
struct capwap_list* packets;
|
||||||
|
|
||||||
|
struct capwap_list* notifyevent;
|
||||||
|
|
||||||
unsigned char localseqnumber;
|
unsigned char localseqnumber;
|
||||||
unsigned char remoteseqnumber;
|
unsigned char remoteseqnumber;
|
||||||
unsigned short fragmentid;
|
unsigned short fragmentid;
|
||||||
@ -165,5 +184,6 @@ struct ac_soap_response* ac_session_send_soap_request(struct ac_session_t* sessi
|
|||||||
#define ac_soap_runningwtpsession(s, wtpid) ac_session_send_soap_request((s), "runningWTPSession", 1, "xs:string", "idwtp", wtpid)
|
#define ac_soap_runningwtpsession(s, wtpid) ac_session_send_soap_request((s), "runningWTPSession", 1, "xs:string", "idwtp", wtpid)
|
||||||
#define ac_soap_teardownwtpsession(s, wtpid) ac_session_send_soap_request((s), "teardownWTPSession", 1, "xs:string", "idwtp", wtpid)
|
#define ac_soap_teardownwtpsession(s, wtpid) ac_session_send_soap_request((s), "teardownWTPSession", 1, "xs:string", "idwtp", wtpid)
|
||||||
#define ac_soap_checkwtpsession(s, wtpid) ac_session_send_soap_request((s), "checkWTPSession", 1, "xs:string", "idwtp", wtpid)
|
#define ac_soap_checkwtpsession(s, wtpid) ac_session_send_soap_request((s), "checkWTPSession", 1, "xs:string", "idwtp", wtpid)
|
||||||
|
#define ac_soap_updatebackendevent(s, idevent, status) ac_session_send_soap_request((s), "updateBackendEvent", 2, "xs:string", "idevent", idevent, "xs:int", "status", status)
|
||||||
|
|
||||||
#endif /* __AC_SESSION_HEADER__ */
|
#endif /* __AC_SESSION_HEADER__ */
|
||||||
|
@ -81,7 +81,7 @@
|
|||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="updateBackendEvent">
|
<wsdl:message name="updateBackendEvent">
|
||||||
<wsdl:part name="idsession" type="xs:string"/>
|
<wsdl:part name="idsession" type="xs:string"/>
|
||||||
<wsdl:part name="idevent" type="xs:int"/>
|
<wsdl:part name="idevent" type="xs:string"/>
|
||||||
<wsdl:part name="status" type="xs:int"/>
|
<wsdl:part name="status" type="xs:int"/>
|
||||||
</wsdl:message>
|
</wsdl:message>
|
||||||
<wsdl:message name="updateBackendEventResponse"/>
|
<wsdl:message name="updateBackendEventResponse"/>
|
||||||
|
Loading…
Reference in New Issue
Block a user