📄 aaa_session_client.cxx
字号:
AAA_SESSION_AUTH_EV_SSAR_OK, false, true }, { AAA_ERR_NOSERVICE, AAA_SESSION_AUTH_EV_SSAA_NOSVC, 0, true, false }, { AAA_ERR_MSG_UNPROCESSED, AAA_SESSION_AUTH_EV_SSAA_ERROR, 0, true, false }, { AAA_ERR_FAILURE, AAA_SESSION_AUTH_EV_SSAA_FAIL, AAA_SESSION_AUTH_EV_SSAR_FAIL, false, true } }; Attributes().MsgIdRxMessage(*msg); AAAReturnCode rc = (msg->hdr.flags.r) ? RequestMsg(*msg) : AnswerMsg(*msg); for (int i=0; i < sizeof(RxHandlerAry)/sizeof(RxHandler); i++) { if (RxHandlerAry[i].m_Rc == rc) { if (msg->hdr.flags.r) { if (! RxHandlerAry[i].m_ValidOnRequestMsg) { AAA_LOG(LM_INFO, "(%P|%t) Invalid return value (INCOMPLETE, NOSERVICE or UNPROCESSED) in request msg\n"); break; } if (RxHandlerAry[i].m_ReqEvent != 0) { m_Fsm.Notify(RxHandlerAry[i].m_ReqEvent); } } else { if ((RxHandlerAry[i].m_StatefulOnly) && (Attributes().AuthSessionState()() != AAA_SESSION_STATE_MAINTAINED)) { AAA_LOG(LM_INFO, "(%P|%t) Invalid return value (NOSERVICE or UNPROCESSED) in stateless session\n"); break; } if (RxHandlerAry[i].m_AnsEvent != 0) { m_Fsm.Notify(RxHandlerAry[i].m_AnsEvent); } } return (AAA_ERR_SUCCESS); } } return (AAA_ERR_FAILURE);}AAAReturnCode AAA_ClientAuthSession::Send(std::auto_ptr<AAAMessage> msg) { if (! m_Fsm.IsRunning()) { return (AAA_ERR_FAILURE); } if ((m_Fsm.State() == AAA_SESSION_AUTH_ST_IDLE) && (! Attributes().AuthSessionState().IsNegotiated())) { // send the session state hint AAA_EnumAvpContainerWidget sessionStateAvp(msg->acl); sessionStateAvp.AddAvp (AAA_AVPNAME_AUTHSESSIONSTATE) = Attributes().AuthSessionState()(); } // send hint for session timeout if (! Attributes().SessionTimeout().IsNegotiated()) { AAA_UInt32AvpContainerWidget sessToutAvp(msg->acl); diameter_unsigned32_t *tout = sessToutAvp.GetAvp (AAA_AVPNAME_SESSIONTIMEOUT); if (! tout) { sessToutAvp.AddAvp(AAA_AVPNAME_SESSIONTIMEOUT) = Attributes().SessionTimeout()(); } else if (Attributes().SessionTimeout()() < *tout) { AAA_LOG(LM_INFO, "(%P|%t) !!! WARNING !!! application session timeout\n"); AAA_LOG(LM_INFO, "(%P|%t) greater than configuration or callback, overriding\n"); *tout = Attributes().SessionTimeout()(); } else { AAA_LOG(LM_INFO, "(%P|%t) Using applications session timeout settings\n"); Attributes().SessionTimeout() = *tout; } } // send hint for authorization lifetime if (! Attributes().AuthLifetime().IsNegotiated()) { AAA_UInt32AvpContainerWidget authLifetimeAvp(msg->acl); diameter_unsigned32_t *tout = authLifetimeAvp.GetAvp (AAA_AVPNAME_AUTHLIFETIME); if (! tout) { authLifetimeAvp.AddAvp(AAA_AVPNAME_AUTHLIFETIME) = Attributes().AuthLifetime()(); } else if (Attributes().AuthLifetime()() < *tout) { AAA_LOG(LM_INFO, "(%P|%t) !!! WARNING !!! application authorization lifetime\n"); AAA_LOG(LM_INFO, "(%P|%t) greater than configuration or callback, overriding\n"); *tout = Attributes().AuthLifetime()(); } else { AAA_LOG(LM_INFO, "(%P|%t) Using applications auth lifetime settings\n"); Attributes().AuthLifetime() = *tout; } } m_Fsm.Notify(AAA_SESSION_AUTH_EV_TX_SSAR, msg); return (AAA_ERR_SUCCESS);}AAAReturnCode AAA_ClientAuthSession::End(){ if (m_Fsm.IsRunning()) { AAA_SESSION_EV_AUTH ev = (Attributes().AuthSessionState()() == AAA_SESSION_STATE_MAINTAINED) ? AAA_SESSION_AUTH_EV_ABORT : AAA_SESSION_AUTH_EV_STOP; m_Fsm.Notify(ev); } return (AAA_ERR_SUCCESS);}AAAReturnCode AAA_ClientAuthSession::Reset(){ m_Fsm.Stop(); AAA_AuthSession::Reset(); AAA_SESSION_DB().Remove(Attributes().SessionId()); return (AAA_ERR_SUCCESS);}AAA_ClientAcctSession::AAA_ClientAcctSession(AAA_Task &task, diameter_unsigned32_t id, char *optionalValue) : m_Task(task), m_ApplicationId(id), m_SubSessionId(0){ // assign diameter id std::string &sid = m_SessionId.DiameterId(); sid = AAA_CFG_TRANSPORT()->identity + "."; sid += AAA_CFG_TRANSPORT()->realm; if (optionalValue) { m_SessionId.OptionalValue() = optionalValue; } // add to session database AAA_SESSION_DB().Add(m_SessionId, *this); m_SessionId.Dump();}AAA_ClientAcctSession::~AAA_ClientAcctSession() { // remove from session id AAA_SESSION_DB().Remove(m_SessionId);} AAAReturnCode AAA_ClientAcctSession::RegisterSubSession(AAA_AcctSession &s){ if (m_SubSessionMap.find(s.Attributes().SubSessionId()()) == m_SubSessionMap.end()) { s.Attributes().SessionId() = m_SessionId; s.Attributes().SubSessionId() = ++ m_SubSessionId; m_SubSessionMap.insert (std::pair<diameter_unsigned64_t, AAA_AcctSession*> (m_SubSessionId, &s)); return (AAA_ERR_SUCCESS); } return (AAA_ERR_FAILURE);}AAAReturnCode AAA_ClientAcctSession::RemoveSubSession(diameter_unsigned64_t &id){ AAA_SubSessionMap::iterator i = m_SubSessionMap.find(id); if (i != m_SubSessionMap.end()) { m_SubSessionMap.erase(i); return (AAA_ERR_SUCCESS); } return (AAA_ERR_FAILURE);}AAAReturnCode AAA_ClientAcctSession::Send(std::auto_ptr<AAAMessage> msg){ // stub, should not be used return (AAA_ERR_FAILURE);}void AAA_ClientAcctSession::RxRequest(std::auto_ptr<AAAMessage> msg){ AAA_UInt64AvpContainerWidget subSessionIdAvp(msg->acl); diameter_unsigned64_t *subSid = subSessionIdAvp.GetAvp (AAA_AVPNAME_ACCTSUBSID); if (subSid) { AAA_SubSessionMap::iterator i = m_SubSessionMap.find(*subSid); if (i != m_SubSessionMap.end()) { i->second->RxRequest(msg); return; } } AAA_LOG(LM_INFO, "(%P|%t) WARNING: Sub session id not found\n");}void AAA_ClientAcctSession::RxAnswer(std::auto_ptr<AAAMessage> msg){ AAA_UInt64AvpContainerWidget subSessionIdAvp(msg->acl); diameter_unsigned64_t *subSid = subSessionIdAvp.GetAvp (AAA_AVPNAME_ACCTSUBSID); if (subSid) { AAA_SubSessionMap::iterator i = m_SubSessionMap.find(*subSid); if (i != m_SubSessionMap.end()) { i->second->RxAnswer(msg); return; } } AAA_LOG(LM_INFO, "(%P|%t) WARNING: Sub session id not found\n");}void AAA_ClientAcctSession::RxError(std::auto_ptr<AAAMessage> msg){ AAA_UInt64AvpContainerWidget subSessionIdAvp(msg->acl); diameter_unsigned64_t *subSid = subSessionIdAvp.GetAvp (AAA_AVPNAME_ACCTSUBSID); if (subSid) { AAA_SubSessionMap::iterator i = m_SubSessionMap.find(*subSid); if (i != m_SubSessionMap.end()) { i->second->RxError(msg); return; } } AAA_LOG(LM_INFO, "(%P|%t) WARNING: Sub session id not found\n");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -