int w_acc_evi_request(struct sip_msg *rq, pv_elem_t* comment, char *foo) { struct acc_param accp; if (acc_preparse_req(rq)<0) return -1; acc_pvel_to_acc_param(rq, comment, &accp); env_set_to( rq->to ); env_set_comment( &accp ); if (is_cdr_acc_on(rq) && is_evi_acc_on(rq)) { env_set_event(acc_cdr_event); } else if (is_evi_acc_on(rq) && acc_env.code < 300) { env_set_event(acc_event); } else if (is_evi_mc_on(rq)) { env_set_event(acc_missed_event); } else { LM_WARN("evi request flags not set\n"); return 1; } return acc_evi_request( rq, NULL, 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}; 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_evi_mc_on(req)) { env_set_event(acc_missed_event); acc_evi_request( req, reply, is_cdr_acc_on(req) ); flags_to_reset |= evi_missed_flag; } if (is_log_mc_on(req)) { env_set_text( ACC_MISSED, ACC_MISSED_LEN); acc_log_request( req, reply, is_cdr_acc_on(req) ); flags_to_reset |= log_missed_flag; } if (is_aaa_mc_on(req)) { acc_aaa_request( req, reply, is_cdr_acc_on(req) ); 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, is_cdr_acc_on(req)); 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 (t->nr_of_outgoings) { 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); }