Fix duplicate events in inform

This commit is contained in:
Suvendhu Hansa 2025-03-24 12:57:58 +05:30 committed by Amin Ben Romdhane
parent 4d57b1ed19
commit 21021a7134
2 changed files with 30 additions and 30 deletions

View file

@ -215,10 +215,8 @@ void bkp_session_simple_insert_in_parent(const char *parent, const char *child,
mxml_node_t *bkp_session_insert_event(int index, char *command_key, int id) mxml_node_t *bkp_session_insert_event(int index, char *command_key, int id)
{ {
char event_idx[32];
mxml_node_t *b; mxml_node_t *b;
snprintf(event_idx, sizeof(event_idx), "%d", index);
b = get_bkp_session_node_by_id(bkp_tree, "cwmp_event", id); b = get_bkp_session_node_by_id(bkp_tree, "cwmp_event", id);
if (!b) { if (!b) {
struct xml_data_struct bkp_xml_event = {0}; struct xml_data_struct bkp_xml_event = {0};
@ -228,8 +226,9 @@ mxml_node_t *bkp_session_insert_event(int index, char *command_key, int id)
int fault = build_xml_node_data(BKP_EVT_BUILD, bkp_tree, &bkp_xml_event); int fault = build_xml_node_data(BKP_EVT_BUILD, bkp_tree, &bkp_xml_event);
if (fault != CWMP_OK) if (fault != CWMP_OK)
return NULL; return NULL;
b = get_bkp_session_node_by_id(bkp_tree, "cwmp_event", id);
} }
b = get_bkp_session_node_by_id(bkp_tree, "cwmp_event", id);
return b; return b;
} }

View file

@ -17,7 +17,10 @@
static struct event_container *__cwmp_add_event_container(int event_code, const char *command_key) static struct event_container *__cwmp_add_event_container(int event_code, const char *command_key)
{ {
struct event_container *event_container = NULL; struct event_container *event_container = NULL;
list_for_each_entry(event_container, &cwmp_ctx.session->events, list) { struct list_head *ilist;
list_for_each (ilist, &(cwmp_ctx.session->events)) {
event_container = list_entry(ilist, struct event_container, list);
if (event_container->code == event_code) { if (event_container->code == event_code) {
return event_container; return event_container;
} }
@ -30,7 +33,7 @@ static struct event_container *__cwmp_add_event_container(int event_code, const
return NULL; return NULL;
} }
INIT_LIST_HEAD(&(event_container->head_dm_parameter)); INIT_LIST_HEAD(&(event_container->head_dm_parameter));
list_add_tail(&(event_container->list), &(cwmp_ctx.session->events)); list_add(&(event_container->list), ilist->prev);
event_container->code = event_code; event_container->code = event_code;
event_container->command_key = command_key ? strdup(command_key) : strdup(""); event_container->command_key = command_key ? strdup(command_key) : strdup("");
event_container->next_session = true; event_container->next_session = true;
@ -39,6 +42,7 @@ static struct event_container *__cwmp_add_event_container(int event_code, const
} }
cwmp_ctx.event_id++; cwmp_ctx.event_id++;
event_container->id = cwmp_ctx.event_id; event_container->id = cwmp_ctx.event_id;
return event_container; return event_container;
} }
@ -54,6 +58,11 @@ void move_next_session_events_to_actual_session()
struct list_head *event_container_list = &(cwmp_ctx.session->events); struct list_head *event_container_list = &(cwmp_ctx.session->events);
list_for_each_entry (event_container, event_container_list, list) { list_for_each_entry (event_container, event_container_list, list) {
// cppcheck-suppress uninitvar
if (cwmp_ctx.session->session_status.is_heartbeat && event_container->code != EVENT_IDX_14HEARTBEAT)
continue;
if ((!cwmp_ctx.session->session_status.is_heartbeat) && (event_container->code == EVENT_IDX_14HEARTBEAT))
continue;
event_container->next_session = false; event_container->next_session = false;
} }
} }
@ -61,21 +70,21 @@ void move_next_session_events_to_actual_session()
int cwmp_remove_all_session_events() int cwmp_remove_all_session_events()
{ {
CWMP_LOG(DEBUG, "%s:%d entry", __func__, __LINE__); CWMP_LOG(DEBUG, "%s:%d entry", __func__, __LINE__);
struct list_head *events_ptr = cwmp_ctx.session->events.next; struct event_container *event_container = NULL, *node = NULL;
while (events_ptr != &cwmp_ctx.session->events) { struct list_head *events_container_list = &(cwmp_ctx.session->events);
struct event_container *event_container;
event_container = list_entry(events_ptr, struct event_container, list); list_for_each_entry_safe(event_container, node, events_container_list, list) {
if (event_container->code == EVENT_IDX_14HEARTBEAT || event_container->next_session) { if (event_container->code == EVENT_IDX_14HEARTBEAT || event_container->next_session) {
events_ptr = events_ptr->next;
continue; continue;
} }
bkp_session_delete_element("cwmp_event", event_container->id); bkp_session_delete_element("cwmp_event", event_container->id);
free(event_container->command_key); FREE(event_container->command_key);
cwmp_free_all_dm_parameter_list(&(event_container->head_dm_parameter)); cwmp_free_all_dm_parameter_list(&(event_container->head_dm_parameter));
list_del(&(event_container->list)); list_del(&(event_container->list));
free(event_container); free(event_container);
events_ptr = cwmp_ctx.session->events.next;
} }
bkp_session_save(); bkp_session_save();
CWMP_LOG(DEBUG, "%s:%d exit", __func__, __LINE__); CWMP_LOG(DEBUG, "%s:%d exit", __func__, __LINE__);
return CWMP_OK; return CWMP_OK;
@ -84,29 +93,21 @@ int cwmp_remove_all_session_events()
int remove_single_event(int event_code) int remove_single_event(int event_code)
{ {
CWMP_LOG(DEBUG, "%s:%d entry", __func__, __LINE__); CWMP_LOG(DEBUG, "%s:%d entry", __func__, __LINE__);
while (cwmp_ctx.session->events.next != &cwmp_ctx.session->events) { struct event_container *event_container = NULL, *node = NULL;
struct event_container *event_container; struct list_head *events_container_list = &(cwmp_ctx.session->events);
event_container = list_entry(cwmp_ctx.session->events.next, struct event_container, list);
if (event_container->next_session) list_for_each_entry_safe(event_container, node, events_container_list, list) {
continue; if (event_container->code == event_code || !event_container->next_session) {
if (event_container->code == event_code) { bkp_session_delete_element("cwmp_event", event_container->id);
bkp_session_delete_element("cwmp_event",event_container->id); FREE(event_container->command_key);
if (event_container->command_key)
free(event_container->command_key);
cwmp_free_all_dm_parameter_list(&(event_container->head_dm_parameter));
list_del(&(event_container->list));
free(event_container);
bkp_session_save();
break;
}
if (event_container) {
if (event_container->command_key)
free(event_container->command_key);
cwmp_free_all_dm_parameter_list(&(event_container->head_dm_parameter)); cwmp_free_all_dm_parameter_list(&(event_container->head_dm_parameter));
list_del(&(event_container->list)); list_del(&(event_container->list));
free(event_container); free(event_container);
} }
} }
bkp_session_save();
CWMP_LOG(DEBUG, "%s:%d exit", __func__, __LINE__); CWMP_LOG(DEBUG, "%s:%d exit", __func__, __LINE__);
return CWMP_OK; return CWMP_OK;
} }