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_Server_hpp
10 #define anna_diameter_comm_Server_hpp
19 #include <anna/core/util/Millisecond.hpp>
20 #include <anna/core/RuntimeException.hpp>
21 #include <anna/diameter/defines.hpp>
22 #include <anna/config/defines.hpp>
23 #include <anna/diameter.comm/ClassCode.hpp>
24 #include <anna/diameter.comm/MessageStatistics.hpp>
51 Diameter server with 1..N connections.
58 // Main server attributes
62 std::vector<ClientSession*> a_clientSessions;
63 int a_maxClientSessions; // -1 means "no limit to add client-sessions" (sockets per server)
64 std::vector<ClientSession*>::iterator a_deliveryIterator;
65 ClientSession *a_lastUsedResource;
68 anna::Millisecond a_lastIncomingActivityTime; // last unix timestamp (in milliseconds) when message reception was managed over this server
69 anna::Millisecond a_lastOutgoingActivityTime; // last unix timestamp (in milliseconds) when message sending was managed over this server
70 void updateIncomingActivityTime() throw();
71 void updateOutgoingActivityTime() throw();
77 MessageStatistics a_messageStatistics;
78 void initializeStatisticResources() throw();
79 void resetStatistics() throw();
82 bool a_available; // any of the client-sessions must be bound
83 void availabilityLost() throw();
84 void availabilityRecovered() throw();
85 bool refreshAvailability() throw(); // return true if change
86 void assertReady() throw(anna::RuntimeException);
87 void initialize() throw();
88 void childIdle() const throw();
90 // Private close/destroy method
91 void close(bool destroy) throw(anna::RuntimeException);
98 * Default constructor.
99 * @param maxClientSessions Maximum number of client-sessions managed by the server. Default is 1 (monoconnection server).
100 * The value -1, means no limit to add client-sessions.
102 Server(int maxClientSessions = 1) : a_maxClientSessions(maxClientSessions) { initialize(); }
106 * Add a server to the entity and create all the client-sessions configured at #setSocketsPerDiameterServer within that server.
108 * \param socketId Diameter socket identifier within the server.
110 void addClientSession(int socketId) throw(anna::RuntimeException);
113 Set timeout to consider failed a request.
114 \param v Requests class code.
115 \param millisecond Milliseconds wait before considering the requests failed.
117 Timers are internally managed and automatically activated.
119 void setClassCodeTimeout(const ClassCode::_v v, const anna::Millisecond & millisecond) throw();
122 * Binds server client-sessions.
124 * @return Returns true if all client-session were successfully bound
126 bool bind() throw(anna::RuntimeException);
129 * Propagate auto recovery configuration to client-sessions within server
131 * @param autoRecovery Auto recovery indicator. True by default.
133 void raiseAutoRecovery(bool autoRecovery = true) throw(anna::RuntimeException);
136 // Sent a message to the server using a certain client-session by mean round-robin between socketId's for
137 // multiple client client-sessions functionality. If a specific socketId is provided, then uses such specific client-session.
138 // Last used delivery resource could be known through #getLastUsedResource().
139 bool send(const Message*, int socketId = -1 /* client-sessions round-robin */) throw(anna::RuntimeException);
140 bool send(const Message& message, int socketId = -1 /* client-sessions round-robin */) throw(anna::RuntimeException) { return send(&message, socketId); }
143 Gets the last used resource (client session) during sending.
144 Broadcast doesn't updates this information.
146 ClientSession *getLastUsedResource() const throw() { return (a_lastUsedResource); }
149 Sent a message to all the server client-sessions (socketId's) for multiple client client-sessions functionality.
150 It is used, i.e., in Disconnect-Peer-Request procedure over a certain server.
151 Returns true (success) only when broadcast is success over all the server client-sessions. If any client-session fails,
152 then false is returned. Broadcast try to send all over the resources in spite of any fail.
154 bool broadcast(const Message*) throw(anna::RuntimeException);
155 bool broadcast(const Message& message) throw(anna::RuntimeException) { return broadcast(&message); }
158 Close all the server client-sessions. Depending on client-session configuration ('OnDisconnect' behaviour),
159 pending answers will be wait (graceful) or ignored (immediate-abrupt close).
160 Resources are not destroyed.
162 void close() throw(anna::RuntimeException) { close(false /* no destroy */); }
166 Diameter parent entity.
167 \return Diameter parent entity.
169 const Entity *getParent() const throw() { return a_parent; }
172 Returns true when any of the server client-sessions is Bound. False when all not-bound.
174 bool isAvailable() const throw() { return a_available; }
177 std::vector<ClientSession*>::iterator begin() throw() { return a_clientSessions.begin(); }
178 std::vector<ClientSession*>::iterator end() throw() { return a_clientSessions.end(); }
179 std::vector<ClientSession*>::const_iterator begin() const throw() { return a_clientSessions.begin(); }
180 std::vector<ClientSession*>::const_iterator end() const throw() { return a_clientSessions.end(); }
182 int getNumberOfClientSessions() const throw() { return a_clientSessions.size(); }
183 int getMaxClientSessions() const throw() { return a_maxClientSessions; }
184 void setMaxClientSessions(int maxClientSessions) throw() { a_maxClientSessions = maxClientSessions; }
187 Diameter server address (IP or hostname)
188 \return Diameter server address.
190 const std::string& getAddress() const throw() { return a_socket.first; }
193 Diameter server port.
194 \return Diameter server port.
196 int getPort() const throw() { return a_socket.second; }
199 /** Server presentation as 'ADDRESS:PORT' */
200 std::string socketAsString() const throw();
204 Gets the timestamp for last incoming activity over the server.
206 @return Last incoming activity timestamp.
208 const anna::Millisecond & getLastIncomingActivityTime() const throw() { return a_lastIncomingActivityTime; }
211 Gets the timestamp for last outgoing activity over the server.
213 @return Last outgoing activity timestamp.
215 const anna::Millisecond & getLastOutgoingActivityTime() const throw() { return a_lastOutgoingActivityTime; }
219 Gets the number of requests messages over-the-air.
221 @return OTA messages.
223 int getOTARequests() const throw();
226 Returns idle state (no pending answers).
230 bool idle() const throw() { return (getOTARequests() == 0); }
234 Deny resources for delivery restriction.
235 Deny all its client sessions
240 Allow resource for delivery permission.
241 Allow all its client sessions
246 Returns true when all its client session resources are hidden for application messages delivery
248 bool hidden() const throw();
251 Returns true when all its client session resources are shown for application messages delivery
253 bool shown() const throw();
257 Class string representation
258 \return String with relevant information for this instance.
260 std::string asString() const throw();
263 Class xml representation
264 \param parent Parent XML node on which hold this instance information.
265 \return XML document with relevant information for this instance.
267 anna::xml::Node* asXML(anna::xml::Node* parent) const throw();
271 void updateProcessingTimeStatisticConcept(const double &value, const anna::diameter::CommandId &cid) throw();
272 void updateReceivedMessageSizeStatisticConcept(const double &value, const anna::diameter::CommandId &cid) throw();
273 // int getProcessingTimeStatisticConcept() const throw() { return a_processing_time__StatisticConceptId; }
274 // int getReceivedMessageSizeStatisticConcept() const throw() { return a_received_message_size__StatisticConceptId; }
279 Handler about event break connection from diameter server (client-session) over this entity.
281 When notified, ANNA.diameter.comm generates an diameter::comm::Entity::eventResponse for every request with pending answers.
283 virtual void eventPeerShutdown(const ClientSession*) throw();
286 Handler about a request retransmission over the session.
288 \param request Message retransmitted
290 virtual void eventRequestRetransmission(const ClientSession*, Message *request) throw();
293 Handler for diameter server (client-session) responses
295 \param response Answer container object for corresponding diameter request
297 virtual void eventResponse(const Response & response) throw(anna::RuntimeException);
300 Handler for diameter server (client-session) requests
302 \param clientSession ClientSession from which request has been received
303 \param request Diameter request message received
305 virtual void eventRequest(ClientSession *clientSession, const anna::DataBlock &request) throw(anna::RuntimeException);
306 //virtual void eventRequest(ClientSession *clientSession, const Message & request) throw(anna::RuntimeException);
309 Handler for diameter server (client-session) responses out of context
311 \param clientSession ClientSession from which request has been received
312 \param response Answer data block object without context match
314 virtual void eventUnknownResponse(ClientSession *clientSession, const anna::DataBlock& response) throw(anna::RuntimeException);
317 Handler for diameter server (client-session) Disconnect-Peer-Answer messages
319 \param clientSession ClientSession from which request has been received
320 \param response Answer data block object without context match
322 virtual void eventDPA(ClientSession *clientSession, const anna::DataBlock& response) throw(anna::RuntimeException);
327 friend class ClientSession;