/* initiate a report if we previously enabled MC accounting for this t */ static void on_missed(struct cell *t, struct sip_msg *reply, int code, void *param ) { int reset_lmf; #ifdef SQL_ACC int reset_dmf; #endif #ifdef RAD_ACC int reset_rmf; #endif /* validation */ if (t->uas.request==0) { DBG("DBG: acc: on_missed: no uas.request, local t; skipping\n"); return; } if (t->is_invite && code>=300) { if (is_log_mc_on(t->uas.request)) { acc_log_missed( t, reply, code); reset_lmf=1; } else reset_lmf=0; #ifdef SQL_ACC if (is_db_mc_on(t->uas.request)) { acc_db_missed( t, reply, code); reset_dmf=1; } else reset_dmf=0; #endif #ifdef RAD_ACC if (is_rad_mc_on(t->uas.request)) { acc_rad_missed(t, reply, code ); reset_rmf=1; } else reset_rmf=0; #endif /* 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; * we do it after all reporting is over to be sure * that all reporting functios got a fair chance */ if (reset_lmf) resetflag(t->uas.request, log_missed_flag); #ifdef SQL_ACC if (reset_dmf) resetflag(t->uas.request, db_missed_flag); #endif #ifdef RAD_ACC if (reset_rmf) resetflag(t->uas.request, radius_missed_flag); #endif } }
/* 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, acc_ctx_t *ctx) { str new_uri_bk={0,0}; str dst_uri_bk={0,0}; unsigned long long flags_to_reset=0; unsigned long long *flags = &ctx->flags; 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_evi_mc_on(*flags)) { env_set_event(acc_missed_event); acc_evi_request( req, reply, is_evi_cdr_on(*flags) ); flags_to_reset |= DO_ACC_EVI * DO_ACC_MISSED; } if (is_log_mc_on(*flags)) { env_set_text( ACC_MISSED, ACC_MISSED_LEN); acc_log_request( req, reply, is_log_cdr_on(*flags) ); flags_to_reset |= DO_ACC_LOG * DO_ACC_MISSED; } if (is_aaa_mc_on(*flags)) { acc_aaa_request( req, reply, is_aaa_cdr_on(*flags) ); flags_to_reset |= DO_ACC_AAA * DO_ACC_MISSED; } if (is_db_mc_on(*flags)) { env_set_text(db_table_mc.s, db_table_mc.len); acc_db_request( req, reply,&mc_ins_list, is_db_cdr_on(*flags)); flags_to_reset |= DO_ACC_DB * DO_ACC_MISSED; } /* Reset the accounting missed_flags * These can't be reset in the blocks above, because * it would skip accounting if the flags are identical */ if (t->nr_of_outgoings) { req->new_uri = new_uri_bk; req->dst_uri = dst_uri_bk; req->parsed_uri_ok = 0; } reset_flags(*flags, flags_to_reset); }
/* 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; } }