diff --git a/include/osmocom/cbc/cbc_message.h b/include/osmocom/cbc/cbc_message.h index 9d3b5b8..b42d0f2 100644 --- a/include/osmocom/cbc/cbc_message.h +++ b/include/osmocom/cbc/cbc_message.h @@ -99,6 +99,7 @@ struct cbc_message { }; struct cbc_message *cbc_message_alloc(void *ctx, const struct cbc_message *cbcmsg); +void cbc_message_free(struct cbc_message *cbcmsg); int cbc_message_new(const struct cbc_message *cbcmsg, struct rest_it_op *op); void cbc_message_delete(struct cbc_message *cbcmsg, struct rest_it_op *op); struct cbc_message *cbc_message_by_id(uint16_t message_id); diff --git a/src/cbc_vty.c b/src/cbc_vty.c index 99363fb..72ac315 100644 --- a/src/cbc_vty.c +++ b/src/cbc_vty.c @@ -138,6 +138,27 @@ DEFUN(show_messages_cbs, show_messages_cbs_cmd, return CMD_SUCCESS; } +DEFUN(delete_message_expired, delete_message_expired_cmd, + "delete message expired id <0-65535>", + "Delete message from the local expired list\n" + "Delete message from the local expired list\n" + "Delete message from the local expired list\n" + "Message ID\n" "Message ID\n") +{ + struct cbc_message *cbc_msg; + uint16_t msgid = atoi(argv[0]); + cbc_msg = cbc_message_expired_by_id(msgid); + if (!cbc_msg) { + if (cbc_message_by_id(msgid)) + vty_out(vty, "Message ID %s has not yet expired!%s", argv[0], VTY_NEWLINE); + else + vty_out(vty, "Unknown expired Message ID %s%s", argv[0], VTY_NEWLINE); + return CMD_WARNING; + } + cbc_message_free(cbc_msg); + return CMD_SUCCESS; +} + static const char *cbc_cell_id2str(const struct cbc_cell_id *cid) { static char buf[256]; @@ -720,6 +741,7 @@ void cbc_vty_init(void) install_element_ve(&show_message_cbs_cmd); install_element_ve(&show_messages_cbs_cmd); install_element_ve(&show_messages_etws_cmd); + install_element_ve(&delete_message_expired_cmd); install_element(CONFIG_NODE, &cfg_cbc_cmd); install_node(&cbc_node, config_write_cbc); diff --git a/src/smscb_message_fsm.c b/src/smscb_message_fsm.c index 0796587..ba17910 100644 --- a/src/smscb_message_fsm.c +++ b/src/smscb_message_fsm.c @@ -384,6 +384,11 @@ struct cbc_message *cbc_message_alloc(void *ctx, const struct cbc_message *orig_ return smscb; } +void cbc_message_free(struct cbc_message *cbcmsg) +{ + osmo_fsm_inst_term(cbcmsg->fi, OSMO_FSM_TERM_REGULAR, NULL); +} + __attribute__((constructor)) void smscb_fsm_constructor(void) { OSMO_ASSERT(osmo_fsm_register(&smscb_fsm) == 0);