static void ack_handler(struct cell* t, int type, struct tmcb_params* ps) { if (is_acc_on(t->uas.request)) { preparse_req(ps->req); log_ack(t, ps->req, (time_t)*(ps->param)); } }
/* these wrappers parse all what may be needed; they don't care about * the result -- accounting functions just display "unavailable" if there * is nothing meaningful */ static int acc_rad_missed1(struct sip_msg *rq, char* p1, char* p2) { int code; preparse_req(rq); if (get_int_fparam(&code, rq, (fparam_t*)p1) < 0) { code = 0; } return log_request(rq, GET_RURI(rq), rq->to, code, time(0)); }
/* these wrappers parse all what may be needed; they don't care about * the result -- accounting functions just display "unavailable" if there * is nothing meaningful */ static int acc_db_request1(struct sip_msg *rq, char* p1, char* p2) { int code; if (get_int_fparam(&code, rq, (fparam_t*)p1) < 0) { code = 0; } preparse_req(rq); return log_request(rq, GET_RURI(rq), rq->to, acc_table.s, code, time(0)); }
/* prepare message and transaction context for later accounting */ void on_req(struct cell* t, int type, struct tmcb_params *ps) { time_t req_time; /* Pass the timestamp of the request as a parameter to callbacks */ req_time = time(0); if (is_acc_on(ps->req) || is_mc_on(ps->req)) { if (tmb.register_tmcb(0, t, TMCB_RESPONSE_OUT, replyout_handler, (void*)req_time, 0) <= 0) { LOG(L_ERR, "ERROR:acc:on_req: Error while registering TMCB_RESPONSE_OUT callback\n"); return; } if (report_ack) { if (tmb.register_tmcb(0, t, TMCB_E2EACK_IN, ack_handler, (void*)req_time, 0) <= 0) { LOG(L_ERR, "ERROR:acc:on_req: Error while registering TMCB_E2EACK_IN callback\n"); return; } } if (tmb.register_tmcb(0, t, TMCB_ON_FAILURE_RO, failure_handler, (void*)req_time, 0) <= 0) { LOG(L_ERR, "ERROR:acc:on_req: Error while registering TMCB_ON_FAILURE_RO callback\n"); return; } if (tmb.register_tmcb(0, t, TMCB_RESPONSE_IN, replyin_handler, (void*)req_time, 0) <= 0) { LOG(L_ERR, "ERROR:acc:on_req: Error while registering TMCB_RESPONSE_IN callback\n"); return; } /* do some parsing in advance */ preparse_req(ps->req); /* also, if that is INVITE, disallow silent t-drop */ if (ps->req->REQ_METHOD == METHOD_INVITE) { DBG("DEBUG: noisy_timer set for accounting\n"); t->flags |= T_NOISY_CTIMER_FLAG; } } }
/* these wrappers parse all what may be needed; they don't care about * the result -- accounting functions just display "unavailable" if there * is nothing meaningful */ static int acc_db_missed0(struct sip_msg *rq, char* s1, char* s2) { preparse_req(rq); return log_request(rq, GET_RURI(rq), rq->to, mc_table.s, 0, time(0)); }
/* these wrappers parse all what may be needed; they don't care about * the result -- accounting functions just display "unavailable" if there * is nothing meaningful */ static int acc_rad_missed0(struct sip_msg *rq, char* p1, char* p2) { preparse_req(rq); return log_request(rq, GET_RURI(rq), rq->to, 0, time(0)); }
/* these wrappers parse all what may be needed; they don't care about * the result -- accounting functions just display "unavailable" if there * is nothing meaningful */ static int acc_db_request0(struct sip_msg *rq, char* s1, char* s2) { preparse_req(rq); return log_request(rq, GET_RURI(rq), rq->to, write_acc, 0, time(0)); }