static void acc_dlg_callback(struct dlg_cell *dlg, int type, struct dlg_cb_params *_params) { unsigned int flags; if (!_params || !_params->msg) { LM_ERR("not enough info\n"); return; } flags = (unsigned int)(long)(*_params->param); if (flags & log_flag) { env_set_text( ACC_ENDED, ACC_ENDED_LEN); if (acc_log_cdrs(dlg, _params->msg) < 0) { LM_ERR("Cannot log values\n"); return; } } if (flags & db_flag) { env_set_text( db_table_acc.s, db_table_acc.len); if (acc_db_cdrs(dlg, _params->msg) < 0) { LM_ERR("Cannot insert into database\n"); return; } } if ((flags & aaa_flag) && acc_aaa_cdrs(dlg, _params->msg) < 0) { LM_ERR("Cannot create radius accounting\n"); return; } }
static void acc_dlg_callback(struct dlg_cell *dlg, int type, struct dlg_cb_params *_params) { unsigned long long flags; if (!_params) { LM_ERR("not enough info\n"); return; } flags = *((unsigned long long*)(*_params->param)); if (is_evi_acc_on(flags)) { env_set_event(acc_cdr_event); if (acc_evi_cdrs(dlg, _params->msg) < 0) { LM_ERR("cannot send accounting events\n"); return; } } if (is_log_acc_on(flags)) { env_set_text( ACC_ENDED, ACC_ENDED_LEN); if (acc_log_cdrs(dlg, _params->msg) < 0) { LM_ERR("Cannot log values\n"); return; } } if (is_db_acc_on(flags)) { env_set_text( db_table_acc.s, db_table_acc.len); if (acc_db_cdrs(dlg, _params->msg) < 0) { LM_ERR("Cannot insert into database\n"); return; } } if (is_aaa_acc_on(flags) && acc_aaa_cdrs(dlg, _params->msg) < 0) { LM_ERR("Cannot create radius accounting\n"); return; } }
static void acc_cdr_cb( struct cell* t, int type, struct tmcb_params *ps ) { acc_ctx_t* ctx = *ps->param; struct dlg_cell *dlg; dlg = dlg_api.get_dlg(); if (dlg == NULL) { LM_DBG("dlg is null!\n"); return; } if (is_log_acc_on(ctx->flags)) { env_set_text( ACC_ENDED, ACC_ENDED_LEN); if (acc_log_cdrs(dlg, ps->req, ctx) < 0) { LM_ERR("Cannot log values\n"); return; } } if (is_db_acc_on(ctx->flags)) { env_set_text( db_table_acc.s, db_table_acc.len); if (acc_db_cdrs(dlg, ps->req, ctx) < 0) { LM_ERR("Cannot insert into database\n"); return; } } if (is_aaa_acc_on(ctx->flags) && acc_aaa_cdrs(dlg, ps->req, ctx) < 0) { LM_ERR("Cannot create radius accounting\n"); return; } if (is_evi_acc_on(ctx->flags)) { env_set_event(acc_cdr_event); if (acc_evi_cdrs(dlg, ps->req, ctx) < 0) { LM_ERR("cannot send accounting events\n"); return; } } }
static void acc_dlg_callback(struct dlg_cell *dlg, int type, struct dlg_cb_params *_params) { struct cell* t; acc_ctx_t* ctx; if (!_params) { LM_ERR("not enough info\n"); return; } ctx = *_params->param; ACC_PUT_CTX(ctx); /** * we've read the value of the flags * increase the number of references to the shm memory pointer * we know that this operation is atomic since the dialog callbacks * are executed sequentially */ ACC_MASK_INC_REF(ctx->flags); LM_DBG("flags[%p] ref counter value after referencing [%llu]\n", *_params->param, ACC_MASK_GET_REF(ctx->flags)); /* * this way we "enable" the refcount * if opensips shuts down before dialog terminated then the refcount * won't be enabled */ set_dlg_cb_used(ctx->flags); /* this time will be used to set */ gettimeofday(&ctx->bye_time, NULL); /* if it's not a local transaction we do the accounting on the tm callbacks */ if (((t=tmb.t_gett()) == T_UNDEFINED) || !t || (t != NULL && !tmb.t_is_local(_params->msg))) { /* normal dialogs will have to do accounting when the response for * the bye will come since users should be able to populate extra * vars and leg vars */ if (tmb.register_tmcb( _params->msg, NULL, TMCB_RESPONSE_OUT, acc_cdr_cb, ctx, 0) < 0) { LM_ERR("failed to register cdr callback!\n"); return; } /* for local transactions we do the accounting here since all the messages * have been processed */ } else if (t != NULL && tmb.t_is_local(_params->msg)) { /* expired dialogs will be handled here */ if (is_log_acc_on(ctx->flags)) { env_set_text( ACC_ENDED, ACC_ENDED_LEN); if (acc_log_cdrs(dlg, _params->msg, ctx) < 0) { LM_ERR("Cannot log values\n"); return; } } if (is_db_acc_on(ctx->flags)) { env_set_text( db_table_acc.s, db_table_acc.len); if (acc_db_cdrs(dlg, _params->msg, ctx) < 0) { LM_ERR("Cannot insert into database\n"); return; } } if (is_aaa_acc_on(ctx->flags) && acc_aaa_cdrs(dlg, _params->msg, ctx) < 0) { LM_ERR("Cannot create radius accounting\n"); return; } if (is_evi_acc_on(ctx->flags)) { env_set_event(acc_cdr_event); if (acc_evi_cdrs(dlg, _params->msg, ctx) < 0) { LM_ERR("cannot send accounting events\n"); return; } } } }
static void acc_dlg_ended(struct dlg_cell *dlg, int type, struct dlg_cb_params *_params) { struct cell* t; acc_ctx_t* ctx; if (!_params) { LM_ERR("not enough info\n"); return; } /* resolve local/dlg ctx conflict by merging them together */ acc_merge_contexts(dlg, type, _params); ctx = (acc_ctx_t *)(*_params->param); /* * this way we "enable" the refcount * if opensips shuts down before dialog terminated then the refcount * won't be enabled */ if (was_dlg_cb_used(ctx->flags)) { LM_INFO("CDR callback already registered [%p|%u] - do not run it again!\n", *_params->param, ctx->ref_no); return; } set_dlg_cb_used(ctx->flags); /* this time will be used to set */ gettimeofday(&ctx->bye_time, NULL); /* if it's not a local transaction we do the accounting on the tm callbacks */ if (((t=tmb.t_gett()) == T_UNDEFINED) || !t || !tmb.t_is_local(_params->msg)) { /* normal dialogs will have to do accounting when the response for * the bye will come since users should be able to populate extra * vars and leg vars */ acc_ref(ctx); if (tmb.register_tmcb( _params->msg, NULL, TMCB_RESPONSE_OUT, acc_cdr_cb, ctx, unref_acc_ctx) < 0) { acc_unref(ctx); LM_ERR("failed to register cdr callback!\n"); return; } /* for local transactions we do the accounting here since all the messages * have been processed */ } else { /* expired dialogs will be handled here */ if (is_log_acc_on(ctx->flags)) { env_set_text( ACC_ENDED, ACC_ENDED_LEN); if (acc_log_cdrs(dlg, _params->msg, ctx) < 0) { LM_ERR("Cannot log values\n"); return; } } if (is_db_acc_on(ctx->flags)) { env_set_text( db_table_acc.s, db_table_acc.len); if (acc_db_cdrs(dlg, _params->msg, ctx) < 0) { LM_ERR("Cannot insert into database\n"); return; } } if (is_aaa_acc_on(ctx->flags) && acc_aaa_cdrs(dlg, _params->msg, ctx) < 0) { LM_ERR("Cannot create radius accounting\n"); return; } if (is_evi_acc_on(ctx->flags)) { env_set_event(acc_cdr_event); if (acc_evi_cdrs(dlg, _params->msg, ctx) < 0) { LM_ERR("cannot send accounting events\n"); return; } } } }