int send_acct_func_async(struct sip_msg* msg, async_resume_module **resume_f, void **resume_param, str *s) { int i, index = -1, res; VALUE_PAIR *send = NULL; SEND_CONTEXT *ctx = 0; struct rad_ctx *rctx; if (!rh) { if (init_radius_handle()) { LM_ERR("invalid radius handle\n"); return -1; } } for (i = 0; i < set_size; i++) { if (sets[i]->set_name.len == s->len && !strncmp(sets[i]->set_name.s, s->s, s->len)) index = i; } if (index == -1) { LM_ERR("set not found\n"); return -1; } if (make_send_message(msg, index, &send) < 0) { LM_ERR("make message failed\n"); return -1; } res = rc_acct_async(rh, SIP_PORT, send, &ctx); if (res == OK_RC) { LM_DBG("radius accounting message sent\n"); rctx = pkg_malloc(sizeof(struct rad_ctx)); if (rctx == NULL) { LM_ERR("no pkg mem\n"); if (send) rc_avpair_free(send); return -1; } rctx->send = send; rctx->ctx = ctx; *resume_param = rctx; *resume_f = resume_send_acct; async_status = ctx->sockfd; return 1; } if (send) rc_avpair_free(send); return -1; }
int send_acct_func(struct sip_msg* msg, str *s) { int i, index = -1; VALUE_PAIR *send = NULL; if (!rh) { if (init_radius_handle()) { LM_ERR("invalid radius handle\n"); return -1; } } //LM_DBG("*******************************************\n"); for (i = 0; i < set_size; i++) { if (sets[i]->set_name.len == s->len && !strncmp(sets[i]->set_name.s, s->s, s->len)) index = i; } if (index == -1) { LM_ERR("set not found\n"); return -1; } if (make_send_message(msg, index, &send) < 0) { LM_ERR("make message failed\n"); return -1; } if (rc_acct(rh, SIP_PORT, send) != OK_RC){ if (send) rc_avpair_free(send); LM_ERR("radius accounting message failed to send\n"); //LM_DBG("*******************************************\n"); return -1; } LM_DBG("radius accounting message sent\n"); // LM_DBG("*******************************************\n"); return 1; }
int send_acct_fixup(void** param, int param_no) { str *s = (str*) pkg_malloc(sizeof(str)); CHECK_ALLOC(s); if (!rh) { if (init_radius_handle()) { LM_ERR("invalid radius handle\n"); return E_UNSPEC; } } if (param_no == 1) { s->s = *param; s->len = strlen(s->s); *param = s; return 0; } return E_UNSPEC; }
int send_auth_func(struct sip_msg* msg, str* s1, str* s2) { int i, res; int index1 = -1, index2 = -1; map_list *mp; pv_value_t pvt; char mess[1024]; VALUE_PAIR *send = NULL, *recv = NULL, *vp = NULL; if (!rh) { if (init_radius_handle()) { LM_ERR("invalid radius handle\n"); return -1; } } for (i = 0; i < set_size; i++) { if (sets[i]->set_name.len == s1->len && !strncmp(sets[i]->set_name.s, s1->s, s1->len)) index1 = i; if (sets[i]->set_name.len == s2->len && !strncmp(sets[i]->set_name.s, s2->s, s2->len)) index2 = i; } if (index1 == -1) { LM_ERR("the first set was not found\n"); return -1; } if (index2 == -1) { LM_ERR("the second set was not found\n"); return -1; } if (make_send_message(msg, index1, &send) < 0) { LM_ERR("make message failed\n"); return -1; } res = rc_auth(rh, SIP_PORT, send, &recv, mess); if (res!=OK_RC && res!=BADRESP_RC) { LM_ERR("radius authentication message failed with %s\n", (res==TIMEOUT_RC)?"TIMEOUT":"ERROR"); }else{ LM_DBG("radius authentication message sent\n"); } for ( mp=sets[index2]->parsed; mp ; mp = mp->next) { vp = recv; while ( (vp=rc_avpair_get(vp, ATTRID(mp->value), VENDOR(mp->value)))!=NULL ) { memset(&pvt, 0, sizeof(pv_value_t)); if (vp->type == PW_TYPE_INTEGER) { pvt.flags = PV_VAL_INT|PV_TYPE_INT; pvt.ri = vp->lvalue; } else if (vp->type == PW_TYPE_STRING) { pvt.flags = PV_VAL_STR; pvt.rs.s = vp->strvalue; pvt.rs.len = vp->lvalue; } if (pv_set_value(msg, mp->pv, (int)EQ_T, &pvt) < 0) { LM_ERR("setting avp failed....skipping\n"); } vp = fetch_all_values ? vp->next : NULL; } } vp = recv; if (attr) for(; (vp = rc_avpair_get(vp, attr->value, 0)); vp = vp->next) extract_avp(vp); if ( res!=OK_RC && res!=BADRESP_RC) goto error; if (send) rc_avpair_free(send); if (recv) rc_avpair_free(recv); return (res==OK_RC)?1:-2; error: if (send) rc_avpair_free(send); if (recv) rc_avpair_free(recv); return -1; }
int send_auth_func_async(struct sip_msg* msg, async_resume_module **resume_f, void **resume_param, str* s1, str* s2) { int i, res; int index1 = -1, index2 = -1; char mess[1024]; SEND_CONTEXT *ctx = 0; struct rad_ctx *rctx; VALUE_PAIR *send = NULL, *recv = NULL; if (!rh) { if (init_radius_handle()) { LM_ERR("invalid radius handle\n"); return -1; } } for (i = 0; i < set_size; i++) { if (sets[i]->set_name.len == s1->len && !strncmp(sets[i]->set_name.s, s1->s, s1->len)) index1 = i; if (sets[i]->set_name.len == s2->len && !strncmp(sets[i]->set_name.s, s2->s, s2->len)) index2 = i; } if (index1 == -1) { LM_ERR("the first set was not found\n"); return -1; } if (index2 == -1) { LM_ERR("the second set was not found\n"); return -1; } if (make_send_message(msg, index1, &send) < 0) { LM_ERR("make message failed\n"); return -1; } res = rc_auth_async(rh, SIP_PORT, send, &recv, mess, &ctx); if (res == OK_RC) { LM_DBG("radius authentication message sent\n"); rctx = pkg_malloc(sizeof(struct rad_ctx)); if (rctx == NULL) { LM_ERR("no pkg mem\n"); if (send) rc_avpair_free(send); return -1; } rctx->index2 = index2; rctx->send = send; rctx->ctx = ctx; *resume_param = rctx; *resume_f = resume_send_auth; async_status = ctx->sockfd; return 1; } LM_ERR("radius authentication message failed with ERROR\n"); if (send) rc_avpair_free(send); return -1; }