diff --git a/src/ac/ac_backend.c b/src/ac/ac_backend.c index f306ce8..96d701a 100644 --- a/src/ac/ac_backend.c +++ b/src/ac/ac_backend.c @@ -47,6 +47,8 @@ static void ac_backend_parsing_closewtpsession_event(const char* eventid, struct /* Get session */ session = ac_search_session_from_wtpid(wtpid); if (session) { + capwap_logging_debug("Receive close wtp session for WTP %s", session->wtpid); + /* Close session */ ac_session_close(session); ac_session_release_reference(session); @@ -58,23 +60,48 @@ static void ac_backend_parsing_closewtpsession_event(const char* eventid, struct static void ac_backend_parsing_resetwtp_event(const char* eventid, struct json_object* jsonparams) { struct ac_session_t* session; struct json_object* jsonvalue; + struct json_object* jsonimage; + struct json_object* jsonvendor; + struct json_object* jsondata; /* Params ResetWTP Action { - WTPId: [string] + WTPId: [string], + ImageIdentifier: { + Vendor: [int], + Data: [string] + } } */ /* Get WTPId */ jsonvalue = json_object_object_get(jsonparams, "WTPId"); if (jsonvalue && (json_object_get_type(jsonvalue) == json_type_string)) { - const char* wtpid = json_object_get_string(jsonvalue); - /* Get session */ - session = ac_search_session_from_wtpid(wtpid); + session = ac_search_session_from_wtpid(json_object_get_string(jsonvalue)); if (session) { - /* Notify Action */ - ac_session_send_action(session, AC_SESSION_ACTION_RESET_WTP, 0, NULL, 0); + /* Get ImageIdentifier */ + jsonimage = json_object_object_get(jsonparams, "ImageIdentifier"); + if (jsonimage && (json_object_get_type(jsonimage) == json_type_object)) { + jsonvendor = json_object_object_get(jsonimage, "Vendor"); + jsondata = json_object_object_get(jsonimage, "Data"); + + if (jsonvendor && jsondata && (json_object_get_type(jsonvendor) == json_type_int) && (json_object_get_type(jsondata) == json_type_string)) { + struct ac_notify_reset_t reset; + + /* */ + memset(&reset, 0, sizeof(struct ac_notify_reset_t)); + reset.startupimage.vendor = (uint32_t)json_object_get_int(jsonvendor); + reset.startupimage.name = (uint8_t*)capwap_duplicate_string(json_object_get_string(jsondata)); + + /* */ + capwap_logging_debug("Receive reset request for WTP %s", session->wtpid); + + /* Notify Action */ + ac_session_send_action(session, AC_SESSION_ACTION_RESET_WTP, 0, (void*)&reset, sizeof(struct ac_notify_reset_t)); + } + } + ac_session_release_reference(session); } } diff --git a/src/ac/ac_backend.h b/src/ac/ac_backend.h index 4f3ce47..a9de1dd 100644 --- a/src/ac/ac_backend.h +++ b/src/ac/ac_backend.h @@ -4,6 +4,11 @@ /* */ #define SOAP_NAMESPACE_URI "http://smartcapwap/namespace" +/* Reset notification */ +struct ac_notify_reset_t { + struct capwap_imageidentifier_element startupimage; +}; + /* */ int ac_backend_start(void); void ac_backend_stop(void); diff --git a/src/ac/ac_dfa_run.c b/src/ac/ac_dfa_run.c index e3afa06..aa9dadf 100644 --- a/src/ac/ac_dfa_run.c +++ b/src/ac/ac_dfa_run.c @@ -181,18 +181,19 @@ void ac_dfa_state_run(struct ac_session_t* session, struct capwap_parsed_packet* } /* */ -void ac_session_reset(struct ac_session_t* session) { +void ac_session_reset(struct ac_session_t* session, struct capwap_imageidentifier_element* startupimage) { struct capwap_header_data capwapheader; struct capwap_packet_txmng* txmngpacket; ASSERT(session != NULL); + ASSERT(startupimage != NULL); /* Build packet */ capwap_header_init(&capwapheader, CAPWAP_RADIOID_NONE, session->binding); txmngpacket = capwap_packet_txmng_create_ctrl_message(&capwapheader, CAPWAP_RESET_REQUEST, session->localseqnumber++, session->mtu); /* Add message element */ - capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_IMAGEIDENTIFIER, &session->startupimage); + capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_IMAGEIDENTIFIER, startupimage); /* CAPWAP_ELEMENT_VENDORPAYLOAD */ /* TODO */ /* Reset request complete, get fragment packets */ diff --git a/src/ac/ac_session.c b/src/ac/ac_session.c index 5a25b1d..e6bf1ba 100644 --- a/src/ac/ac_session.c +++ b/src/ac/ac_session.c @@ -14,7 +14,16 @@ static int ac_session_action_execute(struct ac_session_t* session, struct ac_ses switch (action->action) { case AC_SESSION_ACTION_RESET_WTP: { - ac_session_reset(session); + struct ac_notify_reset_t* reset = (struct ac_notify_reset_t*)action->data; + + /* Send reset command */ + ac_session_reset(session, &reset->startupimage); + + /* Free resource */ + if (reset->startupimage.name) { + capwap_free(reset->startupimage.name); + } + break; } } diff --git a/src/ac/ac_session.h b/src/ac/ac_session.h index 2c83a7a..b440ef0 100644 --- a/src/ac/ac_session.h +++ b/src/ac/ac_session.h @@ -77,8 +77,6 @@ struct ac_session_t { unsigned char lastrecvpackethash[16]; unsigned long state; - - struct capwap_imageidentifier_element startupimage; }; /* */ @@ -95,7 +93,7 @@ struct ac_session_t* ac_search_session_from_wtpid(const char* wtpid); char* ac_get_printable_wtpid(struct capwap_wtpboarddata_element* wtpboarddata); /* */ -void ac_session_reset(struct ac_session_t* session); +void ac_session_reset(struct ac_session_t* session, struct capwap_imageidentifier_element* startupimage); void ac_session_teardown(struct ac_session_t* session); void ac_session_close(struct ac_session_t* session); void ac_session_release_reference(struct ac_session_t* session); diff --git a/src/wtp/wtp_dfa_dtls.c b/src/wtp/wtp_dfa_dtls.c index 9588a5e..c867220 100644 --- a/src/wtp/wtp_dfa_dtls.c +++ b/src/wtp/wtp_dfa_dtls.c @@ -157,6 +157,4 @@ void wtp_dfa_state_dtlsteardown(struct capwap_parsed_packet* packet, struct time capwap_set_timeout(0, timeout, CAPWAP_TIMER_CONTROL_CONNECTION); wtp_dfa_change_state(CAPWAP_IDLE_STATE); } - - /* TODO controllare se è richiesto il ravvio del sistema */ } diff --git a/src/wtp/wtp_dfa_reset.c b/src/wtp/wtp_dfa_reset.c index 91aa34e..d2a1bec 100644 --- a/src/wtp/wtp_dfa_reset.c +++ b/src/wtp/wtp_dfa_reset.c @@ -6,6 +6,9 @@ void wtp_dfa_state_reset(struct capwap_parsed_packet* packet, struct timeout_control* timeout) { ASSERT(timeout != NULL); - /* TODO */ + /* Teardown connection and close application */ + g_wtp.running = 0; wtp_teardown_connection(timeout); + + /* TODO schedule reboot device */ }