From 581912f5ed117bb56087668aa7ac60a7b667d525 Mon Sep 17 00:00:00 2001 From: Carsten Bock Date: Mon, 11 Jan 2016 15:14:37 +0100 Subject: [PATCH] ims_charging: Properly check final_unit_action-flag for initial requests If final_unit_action flag is set in initial ccr response, kamailio need to send terminate request after the granted time instead of sending an CCR-UPDATE request. Patch by DileepNunna Closes Github #467 (Kamailio sending update ccr request instead of terminate request for initial ccr response having final_unit_action flag) --- modules/ims_charging/ims_ro.c | 4 ++++ modules/ims_charging/ro_session_hash.h | 1 + modules/ims_charging/ro_timer.c | 13 +++++++++++++ 3 files changed, 18 insertions(+) diff --git a/modules/ims_charging/ims_ro.c b/modules/ims_charging/ims_ro.c index adb536ddd87..88647887943 100644 --- a/modules/ims_charging/ims_ro.c +++ b/modules/ims_charging/ims_ro.c @@ -1255,6 +1255,10 @@ static void resume_on_initial_ccr(int is_timeout, void *param, AAAMessage *cca, ssd->ro_session->event_type = pending; ssd->ro_session->reserved_secs = ro_cca_data->mscc->granted_service_unit->cc_time; ssd->ro_session->valid_for = ro_cca_data->mscc->validity_time; + ssd->ro_session->is_final_allocation = 0; + + if (ro_cca_data->mscc->final_unit_action && (ro_cca_data->mscc->final_unit_action->action == 0)) + ssd->ro_session->is_final_allocation = 1; Ro_free_CCA(ro_cca_data); diff --git a/modules/ims_charging/ro_session_hash.h b/modules/ims_charging/ro_session_hash.h index 7aa1b89bdb4..fa92ed96e3a 100644 --- a/modules/ims_charging/ro_session_hash.h +++ b/modules/ims_charging/ro_session_hash.h @@ -71,6 +71,7 @@ struct ro_session { str mac; int rating_group; int service_identifier; + unsigned int is_final_allocation; }; /*! entries in the main ro_session table */ diff --git a/modules/ims_charging/ro_timer.c b/modules/ims_charging/ro_timer.c index f5978d6da6a..40f3c4240fb 100644 --- a/modules/ims_charging/ro_timer.c +++ b/modules/ims_charging/ro_timer.c @@ -400,6 +400,19 @@ void ro_session_ontimeout(struct ro_tl *tl) { // return; // } + + if(ro_session->is_final_allocation) { + now = get_current_time_micro(); + used_secs = now - ro_session->last_event_timestamp; + if((ro_session->reserved_secs - used_secs) > 0) { + update_ro_timer(&ro_session->ro_tl, (ro_session->reserved_secs - used_secs)); + return; + } + else { + ro_session->event_type = no_more_credit; + } + } + switch (ro_session->event_type) { case answered: now = get_current_time_micro();