/** * Looks for a CC Acc dession with a given id and returns it if found * \note Returns with a lock on AAASession->hash. Unlock when done working with the result * @returns the new AAASession or null on error */ AAASession* AAAGetCCAccSession(str id) { AAASession *x=cdp_get_session(id); if (x){ switch (x->type){ case ACCT_CC_CLIENT: return x; default: AAASessionsUnlock(x->hash); return 0; } } return 0; }
/** * Looks for an Auth session with a given id and returns it if found * \note Returns with a lock on AAASession->hash. Unlock when done working with the result * @returns the new AAASession or null on error */ AAASession* AAAGetAuthSession(str id) { AAASession *x=cdp_get_session(id); if (x){ switch (x->type){ case AUTH_CLIENT_STATEFULL: case AUTH_CLIENT_STATELESS: case AUTH_SERVER_STATEFULL: case AUTH_SERVER_STATELESS: return x; default: AAASessionsUnlock(x->hash); return 0; } } return 0; }
/** * Processes an incoming message. * This actually just puts the message into a message queue. One worker will pick-it-up * and do the actual processing. * \note Must be called with a lock on the peer. * @param p - peer received from * @param msg - the message received */ void Rcv_Process(peer *p, AAAMessage *msg) { AAASession *session=0; int nput=0; if (msg->sessionId) session = cdp_get_session(msg->sessionId->data); if (session){ switch (session->type){ case AUTH_CLIENT_STATEFULL: if (is_req(msg)){ if (msg->commandCode==IMS_ASR) auth_client_statefull_sm_process(session,AUTH_EV_RECV_ASR,msg); else auth_client_statefull_sm_process(session,AUTH_EV_RECV_REQ,msg); session = 0; }else { if (msg->commandCode==IMS_STA) nput=auth_client_statefull_sm_process(session,AUTH_EV_RECV_STA,msg); else auth_client_statefull_sm_process(session,AUTH_EV_RECV_ANS,msg); session = 0; } break; case AUTH_SERVER_STATEFULL: if (is_req(msg)) { if (msg->commandCode==IMS_STR) { auth_server_statefull_sm_process(session,AUTH_EV_RECV_STR,msg); } else { auth_server_statefull_sm_process(session,AUTH_EV_RECV_REQ,msg); } session = 0; }else{ if (msg->commandCode==IMS_ASA) auth_server_statefull_sm_process(session,AUTH_EV_RECV_ASA,msg); else auth_server_statefull_sm_process(session,AUTH_EV_RECV_ANS,msg); session = 0; } break; default: AAASessionsUnlock(session->hash); session =0; break; } }else{ if (msg->sessionId){ if (msg->commandCode == IMS_ASR) auth_client_statefull_sm_process(0,AUTH_EV_RECV_ASR,msg); } } if (!nput && !put_task(p,msg)){ LM_ERR("Rcv_Process(): Queue refused task\n"); if (msg) AAAFreeMessage(&msg); } //if (msg) LM_ERR("Rcv_Process(): task added to queue command %d, flags %#1x endtoend %u hopbyhop %u\n",msg->commandCode,msg->flags,msg->endtoendId,msg->hopbyhopId); // AAAPrintMessage(msg); }
/** * Sends a message to the peer. * \note Must be called with a lock on the peer. * @param p - peer to send to * @param msg - message to send */ void Snd_Message(peer *p, AAAMessage *msg) { AAASession *session=0; int rcode; int send_message_before_session_sm=0; LM_DBG("Snd_Message called to peer [%.*s] for %s with code %d \n", p->fqdn.len,p->fqdn.s,is_req(msg)?"request":"response",msg->commandCode); touch_peer(p); if (msg->sessionId) session = cdp_get_session(msg->sessionId->data); if (session){ LM_DBG("There is a session of type %d\n",session->type); switch (session->type){ case AUTH_CLIENT_STATEFULL: if (is_req(msg)) { auth_client_statefull_sm_process(session,AUTH_EV_SEND_REQ,msg); session = 0; } else { if (msg->commandCode == IMS_ASA){ if (!msg->res_code){ msg->res_code = AAAFindMatchingAVP(msg,0,AVP_Result_Code,0,0); } if (!msg->res_code) { auth_client_statefull_sm_process(session,AUTH_EV_SEND_ASA_UNSUCCESS,msg); session = 0; } else { rcode = get_4bytes(msg->res_code->data.s); if (rcode>=2000 && rcode<3000) { peer_send_msg(p,msg); send_message_before_session_sm=1; auth_client_statefull_sm_process(session,AUTH_EV_SEND_ASA_SUCCESS,msg); session = 0; } else { auth_client_statefull_sm_process(session,AUTH_EV_SEND_ASA_UNSUCCESS,msg); session = 0; } } }else { auth_client_statefull_sm_process(session,AUTH_EV_SEND_ANS,msg); session = 0; } } break; case AUTH_SERVER_STATEFULL: LM_DBG("this message is matched here to see what request or reply it is\n"); if (is_req(msg)) { if (msg->commandCode== IMS_ASR) { LM_DBG("ASR\n"); auth_server_statefull_sm_process(session,AUTH_EV_SEND_ASR,msg); session = 0; } else { //would be a RAR but ok! LM_DBG("other request\n"); auth_server_statefull_sm_process(session,AUTH_EV_SEND_REQ,msg); session = 0; } } else { if (msg->commandCode == IMS_STR) { LM_DBG("STA\n"); auth_server_statefull_sm_process(session,AUTH_EV_SEND_STA,msg); session = 0; } else { LM_DBG("other reply\n"); auth_server_statefull_sm_process(session,AUTH_EV_SEND_ANS,msg); session = 0; } } break; default: break; } if (session) AAASessionsUnlock(session->hash); } if (!send_message_before_session_sm) peer_send_msg(p,msg); }
/** * Processes an incoming message. * This actually just puts the message into a message queue. One worker will pick-it-up * and do the actual processing. * \note Must be called with a lock on the peer. * @param p - peer received from * @param msg - the message received */ void Rcv_Process(peer *p, AAAMessage *msg) { AAASession *session=0; int nput=0; if (msg->sessionId) session = cdp_get_session(msg->sessionId->data); if (session){ switch (session->type){ case ACCT_CC_CLIENT: if (is_req(msg)){ LM_WARN("unhandled receive request on Credit Control Acct session\n"); AAASessionsUnlock(session->hash); //must be called because we dont call state machine here session = 0; //we dont call SM here so we mustnt set to 0 } else { cc_acc_client_stateful_sm_process(session, ACC_CC_EV_RECV_ANS, msg); session = 0; } break; case AUTH_CLIENT_STATEFULL: if (is_req(msg)){ if (msg->commandCode==IMS_ASR) auth_client_statefull_sm_process(session,AUTH_EV_RECV_ASR,msg); else auth_client_statefull_sm_process(session,AUTH_EV_RECV_REQ,msg); session = 0; }else { if (msg->commandCode==IMS_STA) nput=auth_client_statefull_sm_process(session,AUTH_EV_RECV_STA,msg); else auth_client_statefull_sm_process(session,AUTH_EV_RECV_ANS,msg); session = 0; } break; case AUTH_SERVER_STATEFULL: if (is_req(msg)) { if (msg->commandCode==IMS_STR) { auth_server_statefull_sm_process(session,AUTH_EV_RECV_STR,msg); } else { auth_server_statefull_sm_process(session,AUTH_EV_RECV_REQ,msg); } session = 0; }else{ if (msg->commandCode==IMS_ASA) auth_server_statefull_sm_process(session,AUTH_EV_RECV_ASA,msg); else auth_server_statefull_sm_process(session,AUTH_EV_RECV_ANS,msg); session = 0; } break; default: AAASessionsUnlock(session->hash); session =0; break; } }else{ if (msg->sessionId){ if (msg->commandCode == IMS_ASR) auth_client_statefull_sm_process(0,AUTH_EV_RECV_ASR,msg); } } if (!nput && !put_task(p,msg)){ LM_ERR("Rcv_Process(): Queue refused task\n"); if (msg) AAAFreeMessage(&msg); } //if (msg) LM_ERR("Rcv_Process(): task added to queue command %d, flags %#1x endtoend %u hopbyhop %u\n",msg->commandCode,msg->flags,msg->endtoendId,msg->hopbyhopId); // AAAPrintMessage(msg); }
/** * Looks for a session with a given id and returns it if found * \note Returns with a lock on AAASession->hash. Unlock when done working with the result * @returns the new AAASession or null on error */ AAASession* AAAGetSession(str id) { return cdp_get_session(id); }