浏览代码

Merge pull request #722 from athonet-open/ims_charging_fix_ro_issues

ims_charging: fix Ro issues
jaybeepee 9 年之前
父节点
当前提交
f029335159

+ 1 - 1
modules/ims_charging/ccr.c

@@ -21,7 +21,7 @@ int Ro_write_event_type_avps(AAA_AVP_LIST * avp_list, event_type_t * x) {
             goto error;
 
     if (x->expires)
-        if (!cdp_avp->epcapp.add_Expires(avp_list, *(x->expires)))
+        if (!cdp_avp->epcapp.add_Expires(&aList, *(x->expires)))
             goto error;
 
     if (!cdp_avp->epcapp.add_Event_Type(avp_list, &aList, AVP_FREE_DATA))	//TODO: used to be DONT FREE

+ 1 - 0
modules/ims_charging/ims_ro.c

@@ -638,6 +638,7 @@ void send_ccr_interim(struct ro_session* ro_session, unsigned int used, unsigned
     }
 
     if (ret != 1) {
+        ccr = 0;	// If an error is returned from cdp AAASendMessage, the message has been freed there
         goto error;
     }
     //    cdpb.AAASessionsUnlock(auth->hash);

+ 1 - 1
modules/ims_charging/ro_session_hash.c

@@ -220,7 +220,7 @@ struct ro_session* build_new_ro_session(int direction, int auth_appid, int auth_
     new_ro_session->reserved_secs = requested_secs;
     new_ro_session->valid_for = validity_timeout;
 
-    new_ro_session->hop_by_hop = 1;
+    new_ro_session->hop_by_hop = 0;
     new_ro_session->next = 0;
     new_ro_session->dlg_h_entry = dlg_h_entry;
     new_ro_session->dlg_h_id = dlg_h_id;

+ 4 - 1
modules/ims_charging/ro_timer.c

@@ -280,7 +280,7 @@ void resume_ro_session_ontimeout(struct interim_ccr *i_req, int timeout_or_error
     used_secs = rint((now - ((timeout_or_error==1 && i_req->ro_session->last_event_timestamp_backup>0)?i_req->ro_session->last_event_timestamp_backup : i_req->ro_session->last_event_timestamp)) / (float) 1000000);
 
     /* check to make sure diameter server is giving us sane values */
-    if (i_req->new_credit > i_req->credit_valid_for) {
+    if (i_req->credit_valid_for !=0 && i_req->new_credit > i_req->credit_valid_for) {
         LM_WARN("That's weird, Diameter server gave us credit with a lower validity period :D. Setting reserved time to validity period instead \n");
         i_req->new_credit = i_req->credit_valid_for;
     }
@@ -473,6 +473,9 @@ void ro_session_ontimeout(struct ro_tl *tl) {
         case delayed_delete:
             destroy_ro_session(ro_session);
             return;
+        case pending:
+            /* call is not answered yet. No point asking more credit. Just wait for dialog to progress somehow */
+            return;
         default:
             LM_ERR("Diameter call session - event [%d]\n", ro_session->event_type);