Compile option to select SMM functionality

This commit is contained in:
Suvendhu Hansa 2025-05-20 09:21:44 +05:30 committed by IOPSYS Dev
parent e0fde6e913
commit 4339ef5be0
No known key found for this signature in database
9 changed files with 82 additions and 29 deletions

View file

@ -31,9 +31,11 @@ struct autonomous_event {
char name[2048];
};
static void free_autonomous_du_state_change_complete_data(auto_du_state_change_compl *p);
static void free_autonomous_transfer_complete_data(auto_transfer_complete *p);
#ifdef ICWMP_ENABLE_SMM_SUPPORT
static void free_autonomous_du_state_change_complete_data(auto_du_state_change_compl *p);
static bool validate_du_state_change_data(auto_du_state_change_compl *data)
{
@ -173,6 +175,7 @@ static void send_du_state_change_notif(struct blob_attr *msg)
}
}
}
#endif
bool validate_transfer_complete_data(auto_transfer_complete *data)
{
@ -283,7 +286,9 @@ static void send_transfer_complete_notif(struct blob_attr *msg)
}
static struct autonomous_event event_info[] = {
#ifdef ICWMP_ENABLE_SMM_SUPPORT
{ send_du_state_change_notif, "Device.SoftwareModules.DUStateChange!" },
#endif
{ send_transfer_complete_notif, "Device.LocalAgent.TransferComplete!" }
};
@ -323,6 +328,7 @@ void autonomous_notification_handler(struct ubus_context *ctx __attribute__((unu
}
}
#ifdef ICWMP_ENABLE_SMM_SUPPORT
void free_autonomous_du_state_change_complete_data(auto_du_state_change_compl *p)
{
if (p == NULL)
@ -336,6 +342,7 @@ void free_autonomous_du_state_change_complete_data(auto_du_state_change_compl *p
FREE(p->operation);
FREE(p);
}
#endif
void free_autonomous_transfer_complete_data(auto_transfer_complete *p)
{
@ -350,6 +357,8 @@ void free_autonomous_transfer_complete_data(auto_transfer_complete *p)
FREE(p->target_file_name);
FREE(p);
}
#ifdef ICWMP_ENABLE_SMM_SUPPORT
int cwmp_rpc_acs_destroy_data_autonomous_du_state_change_complete(struct rpc *rpc)
{
if (rpc == NULL)
@ -363,6 +372,7 @@ int cwmp_rpc_acs_destroy_data_autonomous_du_state_change_complete(struct rpc *rp
return 0;
}
#endif
int cwmp_rpc_acs_destroy_data_autonomous_transfer_complete(struct rpc *rpc)
{

View file

@ -591,6 +591,7 @@ static void load_upload(mxml_node_t *tree)
cwmp_set_end_session(END_SESSION_UPLOAD);
}
#ifdef ICWMP_ENABLE_SMM_SUPPORT
static void load_change_du_state(mxml_node_t *tree)
{
if (tree == NULL) {
@ -630,27 +631,6 @@ void load_du_state_change_complete(mxml_node_t *tree)
cwmp_root_cause_changedustate_complete(du_state_change_complete_request);
}
static void load_transfer_complete(mxml_node_t *tree)
{
struct transfer_complete *ptransfer_complete;
ptransfer_complete = calloc(1, sizeof(struct transfer_complete));
struct xml_data_struct bkp_xml_transfer_complete = {0};
bkp_xml_transfer_complete.command_key = &ptransfer_complete->command_key;
bkp_xml_transfer_complete.start_time = &ptransfer_complete->start_time;
bkp_xml_transfer_complete.complete_time = &ptransfer_complete->complete_time;
bkp_xml_transfer_complete.old_software_version = &ptransfer_complete->old_software_version;
bkp_xml_transfer_complete.fault_code = &ptransfer_complete->fault_code;
bkp_xml_transfer_complete.fault_string = &ptransfer_complete->fault_string;
bkp_xml_transfer_complete.type = &ptransfer_complete->type;
load_xml_node_data(BKP_TRANSFER_COMPLETE, tree, &bkp_xml_transfer_complete);
cwmp_root_cause_transfer_complete(ptransfer_complete);
sotfware_version_value_change(ptransfer_complete);
}
static void load_autonomous_du_state_change_complete(mxml_node_t *tree)
{
auto_du_state_change_compl *p;
@ -672,6 +652,28 @@ static void load_autonomous_du_state_change_complete(mxml_node_t *tree)
cwmp_root_cause_autonomous_cdu_complete(p);
}
#endif
static void load_transfer_complete(mxml_node_t *tree)
{
struct transfer_complete *ptransfer_complete;
ptransfer_complete = calloc(1, sizeof(struct transfer_complete));
struct xml_data_struct bkp_xml_transfer_complete = {0};
bkp_xml_transfer_complete.command_key = &ptransfer_complete->command_key;
bkp_xml_transfer_complete.start_time = &ptransfer_complete->start_time;
bkp_xml_transfer_complete.complete_time = &ptransfer_complete->complete_time;
bkp_xml_transfer_complete.old_software_version = &ptransfer_complete->old_software_version;
bkp_xml_transfer_complete.fault_code = &ptransfer_complete->fault_code;
bkp_xml_transfer_complete.fault_string = &ptransfer_complete->fault_string;
bkp_xml_transfer_complete.type = &ptransfer_complete->type;
load_xml_node_data(BKP_TRANSFER_COMPLETE, tree, &bkp_xml_transfer_complete);
cwmp_root_cause_transfer_complete(ptransfer_complete);
sotfware_version_value_change(ptransfer_complete);
}
static void load_autonomous_transfer_complete(mxml_node_t *tree)
{
@ -739,14 +741,16 @@ int cwmp_load_saved_session(char **ret, enum backup_loading load)
load_transfer_complete(b);
} else if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "schedule_inform") == 0) {
load_schedule_inform(b);
#ifdef ICWMP_ENABLE_SMM_SUPPORT
} else if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "change_du_state") == 0) {
load_change_du_state(b);
} else if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "du_state_change_complete") == 0) {
load_du_state_change_complete(b);
} else if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "schedule_download") == 0) {
load_schedule_download(b);
} else if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "autonomous_du_state_change_complete") == 0) {
load_autonomous_du_state_change_complete(b);
#endif
} else if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "schedule_download") == 0) {
load_schedule_download(b);
} else if (ntype == MXML_ELEMENT && CWMP_STRCMP(elem_name, "autonomous_transfer_complete") == 0) {
load_autonomous_transfer_complete(b);
}

View file

@ -272,7 +272,9 @@ void cwmp_exit()
uloop_timeout_cancel(&heartbeat_session_timer);
clean_autonomous_complpolicy();
clean_interface_update();
#ifdef ICWMP_ENABLE_SMM_SUPPORT
clean_du_uuid_list();
#endif
clean_force_inform_list();
FREE(cwmp_ctx.ev);
FREE(cwmp_ctx.intf_ev);

View file

@ -9,6 +9,7 @@
*
*/
#ifdef ICWMP_ENABLE_SMM_SUPPORT
#include <libubox/blobmsg_json.h>
#include <stdlib.h>
#include <regex.h>
@ -804,3 +805,4 @@ void clean_du_uuid_list(void)
free(tmp);
}
}
#endif

View file

@ -12,6 +12,7 @@
#ifndef CWMP_DU_STATE_H
#define CWMP_DU_STATE_H
#ifdef ICWMP_ENABLE_SMM_SUPPORT
#include "common.h"
#define CDU_TIMEOUT 86400 //24 hours
@ -25,4 +26,6 @@ void apply_change_du_state();
void remove_node_from_uuid_list(const char *uuid, const char *operation);
bool exists_in_uuid_list(char *uuid, char *operation);
void clean_du_uuid_list(void);
#endif // ICWMP_ENABLE_SMM_SUPPORT
#endif

View file

@ -35,8 +35,10 @@ const struct EVENT_CONST_STRUCT EVENT_CONST[] = {
[EVENT_IDX_8DIAGNOSTICS_COMPLETE] = { "8 DIAGNOSTICS COMPLETE", EVENT_RETRY_AFTER_TRANSMIT_FAIL },
[EVENT_IDX_9REQUEST_DOWNLOAD] = { "9 REQUEST DOWNLOAD", EVENT_RETRY_AFTER_TRANSMIT_FAIL | EVENT_RETRY_AFTER_REBOOT },
[EVENT_IDX_10AUTONOMOUS_TRANSFER_COMPLETE] = { "10 AUTONOMOUS TRANSFER COMPLETE", EVENT_RETRY_AFTER_TRANSMIT_FAIL | EVENT_RETRY_AFTER_REBOOT },
#ifdef ICWMP_ENABLE_SMM_SUPPORT
[EVENT_IDX_11DU_STATE_CHANGE_COMPLETE] = { "11 DU STATE CHANGE COMPLETE", EVENT_RETRY_AFTER_TRANSMIT_FAIL | EVENT_RETRY_AFTER_REBOOT },
[EVENT_IDX_12AUTONOMOUS_DU_STATE_CHANGE_COMPLETE] = { "12 AUTONOMOUS DU STATE CHANGE COMPLETE", EVENT_RETRY_AFTER_TRANSMIT_FAIL | EVENT_RETRY_AFTER_REBOOT },
#endif
[EVENT_IDX_13WAKEUP] = { "13 WAKEUP", EVENT_RETRY_AFTER_TRANSMIT_FAIL | EVENT_RETRY_AFTER_REBOOT },
[EVENT_IDX_14HEARTBEAT] = { "14 HEARTBEAT", EVENT_RETRY_AFTER_TRANSMIT_FAIL | EVENT_RETRY_AFTER_REBOOT },
[EVENT_IDX_M_Reboot] = { "M Reboot", EVENT_RETRY_AFTER_TRANSMIT_FAIL | EVENT_RETRY_AFTER_REBOOT },
@ -44,7 +46,9 @@ const struct EVENT_CONST_STRUCT EVENT_CONST[] = {
[EVENT_IDX_M_Download] = { "M Download", EVENT_RETRY_AFTER_TRANSMIT_FAIL | EVENT_RETRY_AFTER_REBOOT },
[EVENT_IDX_M_Schedule_Download] = { "M ScheduleDownload", EVENT_RETRY_AFTER_TRANSMIT_FAIL | EVENT_RETRY_AFTER_REBOOT },
[EVENT_IDX_M_Upload] = { "M Upload", EVENT_RETRY_AFTER_TRANSMIT_FAIL | EVENT_RETRY_AFTER_REBOOT },
#ifdef ICWMP_ENABLE_SMM_SUPPORT
[EVENT_IDX_M_ChangeDUState] = { "M ChangeDUState", EVENT_RETRY_AFTER_TRANSMIT_FAIL | EVENT_RETRY_AFTER_REBOOT }
#endif
};
void cwmp_save_event_container(struct event_container *event_container)
@ -178,6 +182,7 @@ int cwmp_root_cause_transfer_complete(struct transfer_complete *p)
return CWMP_OK;
}
#ifdef ICWMP_ENABLE_SMM_SUPPORT
int cwmp_root_cause_autonomous_cdu_complete(auto_du_state_change_compl *p)
{
struct event_container *event_container;
@ -196,6 +201,7 @@ int cwmp_root_cause_autonomous_cdu_complete(auto_du_state_change_compl *p)
rpc_acs->extra_data = (void *)p;
return CWMP_OK;
}
#endif
int cwmp_root_cause_autonomous_transfer_complete(auto_transfer_complete *p)
{
@ -216,6 +222,7 @@ int cwmp_root_cause_autonomous_transfer_complete(auto_transfer_complete *p)
return CWMP_OK;
}
#ifdef ICWMP_ENABLE_SMM_SUPPORT
int cwmp_root_cause_changedustate_complete(struct du_state_change_complete *p)
{
struct event_container *event_container;
@ -241,6 +248,7 @@ int cwmp_root_cause_changedustate_complete(struct du_state_change_complete *p)
rpc_acs->extra_data = (void *)p;
return CWMP_OK;
}
#endif
int cwmp_root_cause_schedule_inform(struct schedule_inform *schedule_inform)
{
@ -411,12 +419,13 @@ int cwmp_get_int_event_code(const char *code)
else if (CWMP_STRNCMP(code, "10", 2) == 0)
return EVENT_IDX_10AUTONOMOUS_TRANSFER_COMPLETE;
#ifdef ICWMP_ENABLE_SMM_SUPPORT
else if (CWMP_STRNCMP(code, "11", 2) == 0)
return EVENT_IDX_11DU_STATE_CHANGE_COMPLETE;
else if (CWMP_STRNCMP(code, "12", 2) == 0)
return EVENT_IDX_12AUTONOMOUS_DU_STATE_CHANGE_COMPLETE;
#endif
else if (CWMP_STRNCMP(code, "13", 2) == 0)
return EVENT_IDX_13WAKEUP;
@ -439,8 +448,10 @@ int cwmp_get_int_event_code(const char *code)
else if (CWMP_STRCMP(code, "M Upload") == 0)
return EVENT_IDX_M_Upload;
#ifdef ICWMP_ENABLE_SMM_SUPPORT
else if (CWMP_STRCMP(code, "M ChangeDUState") == 0)
return EVENT_IDX_M_ChangeDUState;
#endif
else
return EVENT_IDX_6CONNECTION_REQUEST;

View file

@ -75,8 +75,10 @@ int cwmp_get_int_event_code(const char *code);
bool event_exist_in_list(int event);
int cwmp_root_cause_events(void);
int cwmp_root_cause_transfer_complete(struct transfer_complete *p);
int cwmp_root_cause_changedustate_complete(struct du_state_change_complete *p);
int cwmp_root_cause_schedule_inform(struct schedule_inform *schedule_inform);
int cwmp_root_cause_autonomous_cdu_complete(auto_du_state_change_compl *p);
int cwmp_root_cause_autonomous_transfer_complete(auto_transfer_complete *p);
#ifdef ICWMP_ENABLE_SMM_SUPPORT
int cwmp_root_cause_changedustate_complete(struct du_state_change_complete *p);
int cwmp_root_cause_autonomous_cdu_complete(auto_du_state_change_compl *p);
#endif // ICWMP_ENABLE_SMM_SUPPORT
#endif /* SRC_INC_EVENT_H_ */

View file

@ -46,16 +46,18 @@ static int cancel_transfer(char *key);
static int cwmp_handle_rpc_cpe_cancel_transfer(struct rpc *rpc);
static int cwmp_handle_rpc_cpe_schedule_inform(struct rpc *rpc);
static int cwmp_handle_rpc_cpe_schedule_download(struct rpc *rpc);
static int cwmp_handle_rpc_cpe_change_du_state(struct rpc *rpc);
static int cwmp_handle_rpc_cpe_fault(struct rpc *rpc);
static int cwmp_create_fault_message(struct rpc *rpc_cpe, int fault_code, const char *fault_msg);
static int cwmp_rpc_acs_parse_response_inform(struct rpc *rpc);
static int cwmp_rpc_acs_parse_response_get_rpc_methods(struct rpc *this);
static int cwmp_rpc_acs_prepare_get_rpc_methods(struct rpc *rpc);
static int cwmp_rpc_acs_prepare_transfer_complete(struct rpc *rpc);
static int cwmp_rpc_acs_prepare_autonomous_transfer_complete(struct rpc *rpc);
#ifdef ICWMP_ENABLE_SMM_SUPPORT
static int cwmp_handle_rpc_cpe_change_du_state(struct rpc *rpc);
static int cwmp_rpc_acs_prepare_du_state_change_complete(struct rpc *rpc);
static int cwmp_rpc_acs_prepare_autonomous_du_state_change_complete(struct rpc *rpc);
static int cwmp_rpc_acs_prepare_autonomous_transfer_complete(struct rpc *rpc);
#endif
struct cwmp_namespaces ns;
const struct rpc_cpe_method rpc_cpe_methods[] = {
@ -74,7 +76,9 @@ const struct rpc_cpe_method rpc_cpe_methods[] = {
[RPC_CPE_CANCEL_TRANSFER] = { "CancelTransfer", cwmp_handle_rpc_cpe_cancel_transfer, AMD_3 },
[RPC_CPE_SCHEDULE_INFORM] = { "ScheduleInform", cwmp_handle_rpc_cpe_schedule_inform, AMD_1 },
[RPC_CPE_SCHEDULE_DOWNLOAD] = { "ScheduleDownload", cwmp_handle_rpc_cpe_schedule_download, AMD_3 },
#ifdef ICWMP_ENABLE_SMM_SUPPORT
[RPC_CPE_CHANGE_DU_STATE] = { "ChangeDUState", cwmp_handle_rpc_cpe_change_du_state, AMD_3 },
#endif
[RPC_CPE_X_FACTORY_RESET_SOFT] = { "X_FactoryResetSoft", cwmp_handle_rpc_cpe_x_factory_reset_soft, AMD_1 },
[RPC_CPE_FAULT] = { "Fault", cwmp_handle_rpc_cpe_fault, AMD_1 }
};
@ -84,8 +88,10 @@ struct rpc_acs_method rpc_acs_methods[] = {
[RPC_ACS_GET_RPC_METHODS] = { "GetRPCMethods", cwmp_rpc_acs_prepare_get_rpc_methods, cwmp_rpc_acs_parse_response_get_rpc_methods, NULL, NOT_KNOWN },
[RPC_ACS_TRANSFER_COMPLETE] = { "TransferComplete", cwmp_rpc_acs_prepare_transfer_complete, NULL, cwmp_rpc_acs_destroy_data_transfer_complete, NOT_KNOWN },
[RPC_ACS_AUTONOMOUS_TRANSFER_COMPLETE] = { "AutonomousTransferComplete", cwmp_rpc_acs_prepare_autonomous_transfer_complete, NULL, cwmp_rpc_acs_destroy_data_autonomous_transfer_complete, NOT_KNOWN },
#ifdef ICWMP_ENABLE_SMM_SUPPORT
[RPC_ACS_DU_STATE_CHANGE_COMPLETE] = { "DUStateChangeComplete", cwmp_rpc_acs_prepare_du_state_change_complete, NULL, cwmp_rpc_acs_destroy_data_du_state_change_complete, NOT_KNOWN },
[RPC_ACS_AUTONOMOUS_DU_STATE_CHANGE_COMPLETE] = { "AutonomousDUStateChangeComplete", cwmp_rpc_acs_prepare_autonomous_du_state_change_complete, NULL, cwmp_rpc_acs_destroy_data_autonomous_du_state_change_complete, NOT_KNOWN }
#endif
};
static char *forced_inform_parameters[] = {
@ -751,6 +757,9 @@ int cwmp_rpc_acs_prepare_autonomous_transfer_complete(struct rpc *rpc)
error:
return -1;
}
#ifdef ICWMP_ENABLE_SMM_SUPPORT
/*
* [RPC ACS]: DUStateChangeComplete
*/
@ -852,6 +861,8 @@ error:
return -1;
}
#endif
/*
* [RPC CPE]: GetParameterValues
*/
@ -1793,6 +1804,7 @@ fault:
/*
* [RPC CPE]: ChangeDuState
*/
#ifdef ICWMP_ENABLE_SMM_SUPPORT
int cwmp_handle_rpc_cpe_change_du_state(struct rpc *rpc)
{
mxml_node_t *n, *t;
@ -1871,6 +1883,7 @@ fault:
error:
return -1;
}
#endif
/*
* [RPC CPE]: Download

View file

@ -531,9 +531,11 @@ void cwmp_schedule_session_with_event(struct uloop_timeout *timeout)
if (session_event->event == TransferClt_Evt) {
struct transfer_complete *ptransfer_complete = (struct transfer_complete *)session_event->extra_data;
cwmp_root_cause_transfer_complete(ptransfer_complete);
#ifdef ICWMP_ENABLE_SMM_SUPPORT
} else if (session_event->event == CDU_Evt) {
struct du_state_change_complete *pdu_state_change_complete = (struct du_state_change_complete *)session_event->extra_data;
cwmp_root_cause_changedustate_complete(pdu_state_change_complete);
#endif
} else if (session_event->event == Schedule_Inform_Evt) {
struct schedule_inform *schedule_inform = (struct schedule_inform *)session_event->extra_data;
cwmp_root_cause_schedule_inform(schedule_inform);
@ -546,9 +548,11 @@ void cwmp_schedule_session_with_event(struct uloop_timeout *timeout)
} else if (session_event->event == EVENT_IDX_10AUTONOMOUS_TRANSFER_COMPLETE) {
auto_transfer_complete *auto_trnsfr_complete = (auto_transfer_complete *)session_event->extra_data;
cwmp_root_cause_autonomous_transfer_complete(auto_trnsfr_complete);
#ifdef ICWMP_ENABLE_SMM_SUPPORT
} else if (session_event->event == EVENT_IDX_12AUTONOMOUS_DU_STATE_CHANGE_COMPLETE) {
auto_du_state_change_compl *data = (auto_du_state_change_compl *)session_event->extra_data;
cwmp_root_cause_autonomous_cdu_complete(data);
#endif
} else if (session_event->event >= 0) {
struct event_container *event_container = NULL;
event_container = cwmp_add_event_container(session_event->event, "");
@ -781,10 +785,12 @@ int run_session_end_func(void)
apply_schedule_inform();
}
#ifdef ICWMP_ENABLE_SMM_SUPPORT
if (end_session_flag & END_SESSION_CDU) {
CWMP_LOG(INFO, "Apply CDU Calls");
apply_change_du_state();
}
#endif
if (cwmp_ctx.heart_session) {
uloop_timeout_cancel(&heartbeat_session_timer);