Module: kamailio Branch: master Commit: 581912f5ed117bb56087668aa7ac60a7b667d525 URL: https://github.com/kamailio/kamailio/commit/581912f5ed117bb56087668aa7ac60a7...
Author: Carsten Bock carsten@ng-voice.com Committer: Carsten Bock carsten@ng-voice.com Date: 2016-01-11T15:14:37+01:00
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 dileepn30@gmail.com
Closes Github #467 (Kamailio sending update ccr request instead of terminate request for initial ccr response having final_unit_action flag)
---
Modified: modules/ims_charging/ims_ro.c Modified: modules/ims_charging/ro_session_hash.h Modified: modules/ims_charging/ro_timer.c
---
Diff: https://github.com/kamailio/kamailio/commit/581912f5ed117bb56087668aa7ac60a7... Patch: https://github.com/kamailio/kamailio/commit/581912f5ed117bb56087668aa7ac60a7...
---
diff --git a/modules/ims_charging/ims_ro.c b/modules/ims_charging/ims_ro.c index adb536d..8864788 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 7aa1b89..fa92ed9 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 f5978d6..40f3c42 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();