/* initiate a report if we previously enabled MC accounting for this t */ static inline void on_missed(struct cell *t, struct sip_msg *req, struct sip_msg *reply, int code) { str new_uri_bk={0,0}; str dst_uri_bk={0,0}; int flags_to_reset = 0; if (t->nr_of_outgoings) { /* set as new_uri the last branch */ new_uri_bk = req->new_uri; dst_uri_bk = req->dst_uri; req->new_uri = t->uac[t->nr_of_outgoings-1].uri; req->dst_uri = t->uac[t->nr_of_outgoings-1].duri; req->parsed_uri_ok = 0; } /* set env variables */ env_set_to( get_rpl_to(t,reply) ); env_set_code_status( code, reply); /* we report on missed calls when the first * forwarding attempt fails; we do not wish to * report on every attempt; so we clear the flags; */ if (is_log_mc_on(req)) { env_set_text( ACC_MISSED, ACC_MISSED_LEN); acc_log_request( req, reply ); flags_to_reset |= log_missed_flag; } if (is_aaa_mc_on(req)) { acc_aaa_request( req, reply ); flags_to_reset |= aaa_missed_flag; } if (is_db_mc_on(req)) { env_set_text(db_table_mc.s, db_table_mc.len); acc_db_request( req, reply,&mc_ins_list); flags_to_reset |= db_missed_flag; } /* DIAMETER */ #ifdef DIAM_ACC if (is_diam_mc_on(req)) { acc_diam_request( req, reply ); flags_to_reset |= diameter_missed_flag; } #endif /* Reset the accounting missed_flags * These can't be reset in the blocks above, because * it would skip accounting if the flags are identical */ reset_acc_flag( req, flags_to_reset ); if (new_uri_bk.s) { req->new_uri = new_uri_bk; req->dst_uri = dst_uri_bk; req->parsed_uri_ok = 0; } }
/* initiate a report if we previously enabled MC accounting for this t */ static inline void on_missed(struct cell *t, struct sip_msg *req, struct sip_msg *reply, int code) { str new_uri_bk = {0, 0}; int flags_to_reset = 0; int br = -1; /* get winning branch index, if set */ if (t->relayed_reply_branch>=0) { br = t->relayed_reply_branch; } else { if(code>=300) { br = tmb.t_get_picked_branch(); } } /* set as new_uri the one from selected branch */ if (br>=0) { new_uri_bk = req->new_uri; req->new_uri = t->uac[br].uri; req->parsed_uri_ok = 0; } else { new_uri_bk.len = -1; new_uri_bk.s = 0; } /* set env variables */ env_set_to( get_rpl_to(t,reply) ); env_set_code_status( code, reply); /* we report on missed calls when the first * forwarding attempt fails; we do not wish to * report on every attempt; so we clear the flags; */ if (is_log_mc_on(req)) { env_set_text( ACC_MISSED, ACC_MISSED_LEN); acc_log_request( req ); flags_to_reset |= log_missed_flag; } #ifdef SQL_ACC if (is_db_mc_on(req)) { if(acc_db_set_table_name(req, db_table_mc_data, &db_table_mc)<0) { LM_ERR("cannot set missed call db table name\n"); return; } acc_db_request( req ); flags_to_reset |= db_missed_flag; } #endif #ifdef RAD_ACC if (is_rad_mc_on(req)) { acc_rad_request( req ); flags_to_reset |= radius_missed_flag; } #endif /* DIAMETER */ #ifdef DIAM_ACC if (is_diam_mc_on(req)) { acc_diam_request( req ); flags_to_reset |= diameter_missed_flag; } #endif /* run extra acc engines */ acc_run_engines(req, 1, &flags_to_reset); /* Reset the accounting missed_flags * These can't be reset in the blocks above, because * it would skip accounting if the flags are identical */ reset_acc_flag( req, flags_to_reset ); if (new_uri_bk.len>=0) { req->new_uri = new_uri_bk; req->parsed_uri_ok = 0; } }