/** * Receives a mesasge and does basic processing or call the sm_process(). * This gets called from the receive_loop for every message that is received. * @param msg - the message received * @param sock - socket received on */ void receive_message(AAAMessage *msg,int sock) { AAA_AVP *avp1,*avp2; LOG(L_DBG,"DBG:receive_message(): [%d] Recv msg %d\n",sock,msg->commandCode); if (!this_peer) { this_peer = get_peer_from_sock(sock); set_peer_pipe(); } if (!this_peer){ switch (msg->commandCode){ case Code_CE: if (is_req(msg)){ avp1 = AAAFindMatchingAVP(msg,msg->avpList.head,AVP_Origin_Host,0,0); avp2 = AAAFindMatchingAVP(msg,msg->avpList.head,AVP_Origin_Realm,0,0); if (avp1&&avp2){ this_peer = get_peer_from_fqdn(avp1->data,avp2->data); } if (!this_peer) { LOG(L_ERR,"ERROR:receive_msg(): Received CER from unknown peer (accept unknown=%d) -ignored\n", config->accept_unknown_peers); AAAFreeMessage(&msg); }else{ set_peer_pipe(); sm_process(this_peer,R_Conn_CER,msg,0,sock); } } else{ LOG(L_ERR,"ERROR:receive_msg(): Received CEA from an unknown peer -ignored\n"); AAAFreeMessage(&msg); } break; default: LOG(L_ERR,"ERROR:receive_msg(): Received non-CE from an unknown peer -ignored\n"); AAAFreeMessage(&msg); } }else{ touch_peer(this_peer); switch (this_peer->state){ case Wait_I_CEA: if (msg->commandCode!=Code_CE||is_req(msg)){ sm_process(this_peer,I_Rcv_Non_CEA,msg,0,sock); }else sm_process(this_peer,I_Rcv_CEA,msg,0,sock); break; case I_Open: switch (msg->commandCode){ case Code_CE: if (is_req(msg)) sm_process(this_peer,I_Rcv_CER,msg,0,sock); else sm_process(this_peer,I_Rcv_CEA,msg,0,sock); break; case Code_DW: if (is_req(msg)) sm_process(this_peer,I_Rcv_DWR,msg,0,sock); else sm_process(this_peer,I_Rcv_DWA,msg,0,sock); break; case Code_DP: if (is_req(msg)) sm_process(this_peer,I_Rcv_DPR,msg,0,sock); else sm_process(this_peer,I_Rcv_DPA,msg,0,sock); break; default: sm_process(this_peer,I_Rcv_Message,msg,0,sock); } break; case R_Open: switch (msg->commandCode){ case Code_CE: if (is_req(msg)) sm_process(this_peer,R_Rcv_CER,msg,0,sock); else sm_process(this_peer,R_Rcv_CEA,msg,0,sock); break; case Code_DW: if (is_req(msg)) sm_process(this_peer,R_Rcv_DWR,msg,0,sock); else sm_process(this_peer,R_Rcv_DWA,msg,0,sock); break; case Code_DP: if (is_req(msg)) sm_process(this_peer,R_Rcv_DPR,msg,0,sock); else sm_process(this_peer,R_Rcv_DPA,msg,0,sock); break; default: sm_process(this_peer,R_Rcv_Message,msg,0,sock); } break; default: LOG(L_ERR,"ERROR:receive_msg(): Received msg while peer in state %d -ignored\n",this_peer->state); AAAFreeMessage(&msg); } } }
/** * Receives a message and does basic processing or call the sm_process(). * This gets called from the do_receive() for every message that is received. * Basic processing, before the state machine, is done here. * @param msg - the message received * @param sp - the serviced peer that it was receiver on */ void receive_message(AAAMessage *msg,serviced_peer_t *sp) { AAA_AVP *avp1,*avp2; LM_DBG("receive_message(): [%.*s] Recv msg %d\n", sp->p?sp->p->fqdn.len:0, sp->p?sp->p->fqdn.s:0, msg->commandCode); if (!sp->p){ switch (msg->commandCode){ case Code_CE: if (is_req(msg)){ avp1 = AAAFindMatchingAVP(msg,msg->avpList.head,AVP_Origin_Host,0,0); avp2 = AAAFindMatchingAVP(msg,msg->avpList.head,AVP_Origin_Realm,0,0); if (avp1&&avp2){ sp->p = get_peer_from_fqdn(avp1->data,avp2->data); } if (!sp->p) { LM_ERR("receive_msg(): Received CER from unknown peer (accept unknown=%d) -ignored\n", config->accept_unknown_peers); AAAFreeMessage(&msg); }else{ LM_DBG("receive_message(): [%.*s] This receiver has no peer associated\n", sp->p?sp->p->fqdn.len:0, sp->p?sp->p->fqdn.s:0 ); //set_peer_pipe(); make_send_pipe(sp); sm_process(sp->p,R_Conn_CER,msg,0,sp->tcp_socket); } } else{ LM_ERR("receive_msg(): Received CEA from an unknown peer -ignored\n"); AAAFreeMessage(&msg); } break; default: LM_ERR("receive_msg(): Received non-CE from an unknown peer -ignored\n"); AAAFreeMessage(&msg); } }else{ touch_peer(sp->p); switch (sp->p->state){ case Wait_I_CEA: if (msg->commandCode!=Code_CE||is_req(msg)){ sm_process(sp->p,I_Rcv_Non_CEA,msg,0,sp->tcp_socket); }else sm_process(sp->p,I_Rcv_CEA,msg,0,sp->tcp_socket); break; case I_Open: switch (msg->commandCode){ case Code_CE: if (is_req(msg)) sm_process(sp->p,I_Rcv_CER,msg,0,sp->tcp_socket); else sm_process(sp->p,I_Rcv_CEA,msg,0,sp->tcp_socket); break; case Code_DW: if (is_req(msg)) sm_process(sp->p,I_Rcv_DWR,msg,0,sp->tcp_socket); else sm_process(sp->p,I_Rcv_DWA,msg,0,sp->tcp_socket); break; case Code_DP: if (is_req(msg)) sm_process(sp->p,I_Rcv_DPR,msg,0,sp->tcp_socket); else sm_process(sp->p,I_Rcv_DPA,msg,0,sp->tcp_socket); break; default: sm_process(sp->p,I_Rcv_Message,msg,0,sp->tcp_socket); } break; case R_Open: switch (msg->commandCode){ case Code_CE: if (is_req(msg)) sm_process(sp->p,R_Rcv_CER,msg,0,sp->tcp_socket); else sm_process(sp->p,R_Rcv_CEA,msg,0,sp->tcp_socket); break; case Code_DW: if (is_req(msg)) sm_process(sp->p,R_Rcv_DWR,msg,0,sp->tcp_socket); else sm_process(sp->p,R_Rcv_DWA,msg,0,sp->tcp_socket); break; case Code_DP: if (is_req(msg)) sm_process(sp->p,R_Rcv_DPR,msg,0,sp->tcp_socket); else sm_process(sp->p,R_Rcv_DPA,msg,0,sp->tcp_socket); break; default: sm_process(sp->p,R_Rcv_Message,msg,0,sp->tcp_socket); } break; default: LM_ERR("receive_msg(): [%.*s] Received msg while peer in state %d -ignored\n", sp->p->fqdn.len, sp->p->fqdn.s, sp->p->state); AAAFreeMessage(&msg); } } }