diff --git a/openair2/ENB_APP/enb_agent.c b/openair2/ENB_APP/enb_agent.c index dbefc60502e120d45f50e6ddd11a519abe805224..6fff53559015c074e0c3086d933e223240a2d04a 100644 --- a/openair2/ENB_APP/enb_agent.c +++ b/openair2/ENB_APP/enb_agent.c @@ -313,19 +313,6 @@ int enb_agent_start(mid_t mod_id, const Enb_properties_array_t* enb_properties){ return -1; } - - //#ifdef TEST_TIMER - long timer_id=0; - enb_agent_timer_args_t timer_args; - memset (&timer_args, 0, sizeof(enb_agent_timer_args_t)); - timer_args.mod_id = mod_id; - //timer_args.cc_actions= ENB_AGENT_ACTION_APPLY; - //timer_args.cc_report_flags = PROTOCOL__PRP_CELL_STATS_TYPE__PRCST_NOISE_INTERFERENCE; - //timer_args.ue_actions = ENB_AGENT_ACTION_SEND; - //timer_args.ue_report_flags = PROTOCOL__PRP_UE_STATS_TYPE__PRUST_BSR | PROTOCOL__PRP_UE_STATS_TYPE__PRUST_DL_CQI; - enb_agent_create_timer(1, 0, ENB_AGENT_DEFAULT, mod_id, ENB_AGENT_TIMER_TYPE_PERIODIC, enb_agent_timeout,(void*)&timer_args, &timer_id); - //#endif - //new_thread(send_thread, &shared_ctxt); //while (1) pause(); diff --git a/openair2/ENB_APP/enb_agent_common.c b/openair2/ENB_APP/enb_agent_common.c index 1522cad07d0ed2063fe3a9e408c75796731f37c3..8d9997e7460559a48ffd27fc1b06c0067da83a50 100644 --- a/openair2/ENB_APP/enb_agent_common.c +++ b/openair2/ENB_APP/enb_agent_common.c @@ -377,6 +377,7 @@ err_code_t enb_agent_create_timer(uint32_t interval_sec, agent_id_t agent_id, instance_t instance, uint32_t timer_type, + xid_t xid, enb_agent_timer_callback_t cb, void* timer_args, long *timer_id){ @@ -424,7 +425,8 @@ err_code_t enb_agent_create_timer(uint32_t interval_sec, e->instance = instance; e->state = ENB_AGENT_TIMER_STATE_ACTIVE; e->timer_id = *timer_id; - // e->timer_args = timer_args; + e->xid = xid; + e->timer_args = timer_args; e->cb = cb; /*element should be a real pointer*/ RB_INSERT(enb_agent_map, &timer_instance.enb_agent_head, e); @@ -440,7 +442,8 @@ err_code_t enb_agent_destroy_timer(long timer_id){ struct enb_agent_timer_element_s *e = get_timer_entry(timer_id); if (e != NULL ) { - RB_REMOVE(enb_agent_map, &timer_instance.enb_agent_head, &e); + RB_REMOVE(enb_agent_map, &timer_instance.enb_agent_head, e); + enb_agent_destroy_progran_message(e->timer_args->msg); free(e); } @@ -454,13 +457,35 @@ err_code_t enb_agent_destroy_timer(long timer_id){ return TIMER_REMOVED_FAILED ; } +err_code_t enb_agent_destroy_timer_by_task_id(xid_t xid) { + struct enb_agent_timer_element_s *e = NULL; + long timer_id; + RB_FOREACH(e, enb_agent_map, &timer_instance.enb_agent_head) { + if (e->xid == xid) { + timer_id = e->timer_id; + RB_REMOVE(enb_agent_map, &timer_instance.enb_agent_head, e); + enb_agent_destroy_progran_message(e->timer_args->msg); + free(e); + if (timer_remove(timer_id) < 0 ) { + goto error; + } + } + } + return 0; + + error: + LOG_E(ENB_AGENT, "timer can't be removed\n"); + return TIMER_REMOVED_FAILED ; +} + err_code_t enb_agent_destroy_timers(void){ struct enb_agent_timer_element_s *e = NULL; RB_FOREACH(e, enb_agent_map, &timer_instance.enb_agent_head) { RB_REMOVE(enb_agent_map, &timer_instance.enb_agent_head, e); - timer_remove(e->timer_id); + timer_remove(e->timer_id); + enb_agent_destroy_progran_message(e->timer_args->msg); free(e); } @@ -468,15 +493,6 @@ err_code_t enb_agent_destroy_timers(void){ } -struct enb_agent_timer_element_s * get_timer_entry(long timer_id) { - - struct enb_agent_timer_element_s search; - memset(&search, 0, sizeof(struct enb_agent_timer_element_s)); - search.timer_id = timer_id; - - return RB_FIND(enb_agent_map, &timer_instance.enb_agent_head, &search); -} - void enb_agent_sleep_until(struct timespec *ts, int delay) { ts->tv_nsec += delay; if(ts->tv_nsec >= 1000*1000*1000){ @@ -493,15 +509,15 @@ void enb_agent_sleep_until(struct timespec *ts, int delay) { } */ -/* -err_code_t enb_agent_stop_timer(uint32_t timer_id){ + +err_code_t enb_agent_stop_timer(long timer_id){ struct enb_agent_timer_element_s *e=NULL; - - RB_FOREACH(e, enb_agent_map, &enb_agent_head) { - if (e->timer_id == timer_id) - break; - } + struct enb_agent_timer_element_s search; + memset(&search, 0, sizeof(struct enb_agent_timer_element_s)); + search.timer_id = timer_id; + + e = RB_FIND(enb_agent_map, &timer_instance.enb_agent_head, &search); if (e != NULL ) { e->state = ENB_AGENT_TIMER_STATE_STOPPED; @@ -510,9 +526,18 @@ err_code_t enb_agent_stop_timer(uint32_t timer_id){ timer_remove(timer_id); return 0; +} + +struct enb_agent_timer_element_s * get_timer_entry(long timer_id) { + + struct enb_agent_timer_element_s search; + memset(&search, 0, sizeof(struct enb_agent_timer_element_s)); + search.timer_id = timer_id; + return RB_FIND(enb_agent_map, &timer_instance.enb_agent_head, &search); } +/* // this will change the timer_id err_code_t enb_agent_restart_timer(uint32_t *timer_id){ diff --git a/openair2/ENB_APP/enb_agent_common.h b/openair2/ENB_APP/enb_agent_common.h index 31d882d0c9dd40d6dd8a7c4cde80ac61ae94dfbb..c2c57ca4ea820d73d83ae5dac4cc561cc5d4b32a 100644 --- a/openair2/ENB_APP/enb_agent_common.h +++ b/openair2/ENB_APP/enb_agent_common.h @@ -70,6 +70,8 @@ typedef int (*enb_agent_message_destruction_callback)( int enb_agent_serialize_message(Protocol__ProgranMessage *msg, void **buf, int *size); int enb_agent_deserialize_message(void *data, int size, Protocol__ProgranMessage **msg); +err_code_t enb_agent_destroy_progran_message(Protocol__ProgranMessage *msg); + int prp_create_header(xid_t xid, Protocol__PrpType type, Protocol__PrpHeader **header); int enb_agent_hello(mid_t mod_id, const void *params, Protocol__ProgranMessage **msg); @@ -189,9 +191,11 @@ typedef struct enb_agent_timer_element_s{ uint32_t interval_usec; long timer_id; /* Timer id returned by the timer API*/ + xid_t xid; /*The id of the task as received by the controller + message*/ enb_agent_timer_callback_t cb; - // void* timer_args; + enb_agent_timer_args_t *timer_args; } enb_agent_timer_element_t; @@ -206,12 +210,14 @@ err_code_t enb_agent_create_timer(uint32_t interval_sec, agent_id_t agent_id, instance_t instance, uint32_t timer_type, + xid_t xid, enb_agent_timer_callback_t cb, void* timer_args, long *timer_id); err_code_t enb_agent_destroy_timers(void); err_code_t enb_agent_destroy_timer(long timer_id); +err_code_t enb_agent_destroy_timer_by_task_id(xid_t xid); err_code_t enb_agent_stop_timer(long timer_id); @@ -219,8 +225,6 @@ err_code_t enb_agent_restart_timer(long *timer_id); struct enb_agent_timer_element_s * get_timer_entry(long timer_id); - - Protocol__ProgranMessage * enb_agent_process_timeout(long timer_id, void* timer_args); int enb_agent_compare_timer(struct enb_agent_timer_element_s *a, struct enb_agent_timer_element_s *b); diff --git a/openair2/ENB_APP/enb_agent_handler.c b/openair2/ENB_APP/enb_agent_handler.c index 2841f9b6e5e6bcde9a0ab7a138bd38fce69bd78a..02092a84f8e29343df20651b7704cf3c1cead580 100644 --- a/openair2/ENB_APP/enb_agent_handler.c +++ b/openair2/ENB_APP/enb_agent_handler.c @@ -54,9 +54,8 @@ enb_agent_message_destruction_callback message_destruction_callback[] = { enb_agent_destroy_hello, enb_agent_destroy_echo_request, enb_agent_destroy_echo_reply, - 0, /*No stats request message is created in the agent. No need for a callback*/ + enb_agent_mac_destroy_stats_request, enb_agent_mac_destroy_stats_reply, - }; static const char *enb_agent_direction2String[] = { @@ -170,3 +169,7 @@ Protocol__ProgranMessage* enb_agent_process_timeout(long timer_id, void* timer_a LOG_E(ENB_AGENT, "can't get the timer element\n"); return TIMER_ELEMENT_NOT_FOUND; } + +err_code_t enb_agent_destroy_progran_message(Protocol__ProgranMessage *msg) { + return ((*message_destruction_callback[msg->msg_case-1])(msg)); +} diff --git a/openair2/ENB_APP/enb_agent_mac.c b/openair2/ENB_APP/enb_agent_mac.c index 1a21db5e1514c19fe12837d90ea41dab3e14936f..411480254fbcb882bea3fe2ed5cc29ca7f0708ad 100644 --- a/openair2/ENB_APP/enb_agent_mac.c +++ b/openair2/ENB_APP/enb_agent_mac.c @@ -71,18 +71,12 @@ int enb_agent_mac_handle_stats(mid_t mod_id, const void *params, Protocol__Progr switch(stats_req->body_case) { case PROTOCOL__PRP_STATS_REQUEST__BODY_COMPLETE_STATS_REQUEST: ; Protocol__PrpCompleteStatsRequest *comp_req = stats_req->complete_stats_request; - /* if (comp_req->report_frequency == PROTOCOL__PRP_STATS_REPORT_FREQ__PRSRF_PERIODICAL) { */ - /* //TODO: Must create a periodic report. Implement once the */ - /* // timer functionality is supported */ - /* *msg = NULL; */ - /* return 0; */ - /* } else */ if (comp_req->report_frequency == PROTOCOL__PRP_STATS_REPORT_FREQ__PRSRF_CONTINUOUS) { //TODO: Must create an event based report mechanism *msg = NULL; return 0; } else if (comp_req->report_frequency == PROTOCOL__PRP_STATS_REPORT_FREQ__PRSRF_OFF) { - //TODO: Must implement to deactivate the event based reporting + enb_agent_destroy_timer_by_task_id(xid); *msg = NULL; return 0; } else { //One-off or periodical reporting @@ -141,7 +135,7 @@ int enb_agent_mac_handle_stats(mid_t mod_id, const void *params, Protocol__Progr sec_interval = usec_interval/(1000*1000); usec_interval = usec_interval%(1000*1000); } - enb_agent_create_timer(sec_interval, usec_interval, ENB_AGENT_DEFAULT, enb_id, ENB_AGENT_TIMER_TYPE_PERIODIC, enb_agent_handle_timed_task,(void*) timer_args, &timer_id); + enb_agent_create_timer(sec_interval, usec_interval, ENB_AGENT_DEFAULT, enb_id, ENB_AGENT_TIMER_TYPE_PERIODIC, xid, enb_agent_handle_timed_task,(void*) timer_args, &timer_id); } } break;