1 // ANNA - Anna is Not Nothingness Anymore //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
9 #ifndef anna_diameter_comm_ServerSession_hpp
10 #define anna_diameter_comm_ServerSession_hpp
16 #include <anna/core/util/Millisecond.hpp>
17 #include <anna/core/util/defines.hpp> // U32
18 #include <anna/core/RuntimeException.hpp>
20 #include <anna/diameter.comm/Session.hpp>
21 #include <anna/diameter/defines.hpp>
22 #include <anna/diameter.comm/Message.hpp>
23 #include <anna/diameter.comm/ServerSessionReceiver.hpp>
24 #include <anna/diameter.comm/ReceiverFactoryImpl.hpp>
51 Modela la conexion realizada contra un servidor diameter local.
53 class ServerSession : public Session {
59 /* virtual */void initialize() ;
62 * Default max inactivity period for the diameter server-session health.
64 static const anna::Millisecond DefaultAllowedInactivityTime;
67 Sets the maximum allowed inactivity time on server session
69 @param allowedInactivityTime Inactivity time allowed
71 void setAllowedInactivityTime(const anna::Millisecond & allowedInactivityTime) ;
74 Diameter listening address (ip or hostname).
75 \return Diameter listening address.
77 /* virtual */const std::string& getAddress() const ;
81 \return Diameter listen port.
83 /* virtual */int getPort() const ;
86 Server session key. Same as socket id
88 int getKey() const { return getSocketId(); }
92 \return Local server parent
94 LocalServer *getParent() { return a_parent; }
98 Sets the diameter client socket and assign the receiver factory to it
99 \param clientSocket Diameter client socket
101 void setClientSocket(anna::comm::ClientSocket *clientSocket) ;
104 Diameter client socket
105 \return Diameter client socket
107 anna::comm::ClientSocket *getClientSocket() { return a_clientSocket; }
109 /* virtual */const Response* send(const Message* message) noexcept(false);
110 /* virtual */bool unbind(bool forceDisconnect /* se usa en timer, para el actionTimer del tipo SessionUnbind, etc. */ = false) noexcept(false); // returns true if done at call time (no pendings or ignore pendings, except Disconnecting state by mean DPR/DPA)
114 Class string representation
115 \return String with relevant information for this instance.
117 /* virtual */std::string asString() const ;
121 Class xml representation
122 \param parent Parent XML node on which hold this instance information.
123 \return XML document with relevant information for this instance.
125 /* virtual */anna::xml::Node* asXML(anna::xml::Node* parent) const ;
135 ReceiverFactoryImpl<ServerSession, ServerSessionReceiver> a_receiverFactory;
137 // Parent information
138 LocalServer *a_parent;
141 anna::comm::ClientSocket *a_clientSocket;
143 /* virtual */void expire(anna::timex::Engine *timeController) noexcept(false);
146 /* virtual */void updateIncomingActivityTime() ;
147 /* virtual */void updateOutgoingActivityTime() ;
148 void countSendings(const diameter::CommandId & cid, unsigned int aid, bool ok) ;
152 Handler about event break connection from diameter client over this server-session.
154 When notified, ANNA.diameter.comm generates an diameter::comm::ServerSession::eventResponse for every request with pending answers.
156 void eventPeerShutdown() ;
159 Handler about a request retransmission over the session.
161 \param request Message retransmitted
163 void eventRequestRetransmission(Message *request) ;
166 Handler for diameter client responses
168 \param response Answer container object for corresponding diameter request
169 \param myNode Own origin host
171 void eventResponse(const Response& response, const anna::diameter::comm::OriginHost *myNode) noexcept(false);
174 Handler for diameter client requests
176 \param request Request data block object for corresponding diameter reception
177 \param myNode Own origin host
179 void eventRequest(const anna::DataBlock& request, const anna::diameter::comm::OriginHost *myNode) noexcept(false);
180 //void eventRequest(const Message& request) noexcept(false);
183 Handler for diameter client responses out of context
185 \param response Answer data block object without context match
186 \param myNode Own origin host
188 void eventUnknownResponse(const anna::DataBlock& response, const anna::diameter::comm::OriginHost *myNode) noexcept(false);
191 Handler for diameter client Disconnect-Peer-Answer messages
193 \param response Answer data block object without context match
194 \param myNode Own origin host
196 void eventDPA(const anna::DataBlock& response, const anna::diameter::comm::OriginHost *myNode) noexcept(false);
201 * Handlers for receptions
203 /* virtual */void receive(const anna::comm::Message& message) noexcept(false);
204 /* virtual */void finalize() ;
206 /* virtual */void expireResponse(Response*) ;
208 anna::U32 getAuthApplicationIdFromCER(const anna::DataBlock &cer, bool &found) const;
210 void sendCEA(const Engine*, const anna::DataBlock &cerDataBlock) noexcept(false);
211 void sendDWA(const Engine*, const anna::DataBlock &dwrDataBlock) noexcept(false);
214 friend class anna::diameter::comm::Timer;
215 friend class LocalServer;
217 friend class ServerSessionReceiver;