ANNA Suite  2020b
Multipurpose development suite for Telco applications
Engine.hpp
Go to the documentation of this file.
1 // ANNA - Anna is Not Nothingness Anymore //
2 // //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
4 // //
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 //
7 
8 
9 #ifndef anna_diameter_comm_Engine_hpp
10 #define anna_diameter_comm_Engine_hpp
11 
12 
13 // STL
14 #include <map>
15 #include <vector>
16 #include <string>
17 #include <algorithm>
18 
19 #include <anna/app/Component.hpp>
21 
25 #include <anna/config/defines.hpp>
28 #include <anna/core/util/defines.hpp> // U32
29 
30 
31 // Standard
32 #include <time.h>
33 
34 
35 //------------------------------------------------------------------------------
36 //---------------------------------------------------------------------- #define
37 //------------------------------------------------------------------------------
38 
39 namespace anna {
40 class DataBlock;
41 class Millisecond;
42 }
43 
44 
45 
46 namespace anna {
47 
48 namespace diameter {
49 
50 namespace codec {
51 class Engine;
52 }
53 
54 namespace stack {
55 class Dictionary;
56 }
57 
58 namespace comm {
59 
60 class Response;
61 class Entity;
62 class Server;
63 class LocalServer;
64 
102 class Engine : public anna::app::Component {
103 public:
104 
111  void setOriginRealmName(const std::string & originRealmName) ;
112 
119  void setOriginHostName(const std::string & originHostName) ;
120 
126  const std::string & getOriginRealmName() const { return a_originRealm; }
127 
133  const std::string & getOriginHostName() const { return a_originHost; }
134 
135 
146  void raiseAutoRecovery(bool autoRecovery = true) noexcept(false);
147 
152  bool getAutoBind() const { return a_autoBind; }
153 
161  void setAutoBind(const bool autoBind) { a_autoBind = autoBind; }
162 
170  void setMaxConnectionDelay(const anna::Millisecond & maxConnectionDelay) { a_maxConnectionDelay = maxConnectionDelay; }
171 
179  const anna::Millisecond & getMaxConnectionDelay() { return a_maxConnectionDelay; }
180 
186  bool bind() noexcept(false);
187 
193  void setClientCER(const anna::DataBlock & cer) noexcept(false);
194 
200  void setClientCER(const std::string & cerPathFile) noexcept(false);
201 
207  void setClientCER(const anna::U32 &applicationId) noexcept(false);
208 
214  void setClientDWR(const anna::DataBlock & dwr) noexcept(false);
215 
222  void setClientDWR(const std::string & dwrPathFile = "") noexcept(false);
223 
230  void setWatchdogPeriod(const anna::Millisecond & wp) noexcept(false);
231 
236  int getNumberOfClientSessionsPerServer() const { return a_numberOfClientSessionsPerServer; }
237 
243  void setNumberOfClientSessionsPerServer(int numberOfClientSessionsPerServer) { a_numberOfClientSessionsPerServer = numberOfClientSessionsPerServer; }
244 
245 
258  ClientSession* findClientSession(const std::string & addr, int port, int socketId, anna::Exception::Mode::_v emode = anna::Exception::Mode::Throw) noexcept(false);
259 
260 
264  ClientSession* findClientSession(const std::string & key, anna::Exception::Mode::_v emode = anna::Exception::Mode::Throw) noexcept(false);
265 
266 
278  Server* findServer(const std::string & addr, int port, anna::Exception::Mode::_v emode = anna::Exception::Mode::Throw) noexcept(false);
279 
290  Entity* findEntity(const socket_v & socketList, anna::Exception::Mode::_v emode = anna::Exception::Mode::Throw) noexcept(false);
291 
305  Entity* findEntity(const std::string & addr1, int port1, const std::string & addr2, int port2, anna::Exception::Mode::_v emode = anna::Exception::Mode::Throw) noexcept(false);
306 
320  Entity* createEntity(const socket_v & socketList, const std::string & description = "")
321  noexcept(false);
322 
339  Entity* createEntity(const std::string & addr1, int port1, const std::string & addr2, int port2, const std::string & description = "")
340  noexcept(false);
341 
342 
354  LocalServer* findLocalServer(const std::string & addr, int port, anna::Exception::Mode::_v emode = anna::Exception::Mode::Throw) noexcept(false);
355 
366  ServerSession* findServerSession(int socketId, anna::Exception::Mode::_v emode = anna::Exception::Mode::Throw) noexcept(false);
367 
384  LocalServer *createLocalServer(const std::string & addr, int port = Session::DefaultPort, int maxConnections = -1, const anna::Millisecond & allowedInactivityTime = ServerSession::DefaultAllowedInactivityTime, int category = 1, const std::string & description = "")
385  noexcept(false);
386 
387 
394  void close(bool destroy = false) noexcept(false) { closeEntities(destroy); closeLocalServers(destroy); }
395 
396 
403  void closeEntities(bool destroy = false) noexcept(false);
404 
405 
413  void closeEntity(Entity* entity, bool destroy = false) noexcept(false);
414 
415 
422  void closeLocalServers(bool destroy = false) noexcept(false);
423 
433  void closeLocalServer(LocalServer * localServer, bool destroy = false) noexcept(false);
434 
440  int getOTARequestsForEntities() const ;
441 
447  int getOTARequestsForLocalServers() const ;
448 
454  int getOTARequests() const { return (getOTARequestsForEntities() + getOTARequestsForLocalServers()); }
455 
461  bool idleForEntities() const { return (getOTARequestsForEntities() == 0); }
462 
468  bool idleForLocalServers() const { return (getOTARequestsForLocalServers() == 0); }
469 
475  bool idle() const { return (getOTARequests() == 0); }
476 
486  bool broadcastEntities(const Message*message) noexcept(false);
487  bool broadcastEntities(const Message& message) noexcept(false) { return broadcastEntities(&message); }
488 
498  bool broadcastLocalServers(const Message*message) noexcept(false);
499  bool broadcastLocalServers(const Message& message) noexcept(false) { return broadcastLocalServers(&message); }
500 
506  virtual std::string asString(void) const ;
507 
513  virtual anna::xml::Node* asXML(anna::xml::Node* parent) const ;
514 
519  virtual void bindingClientSession(const ClientSession *) const {;}
520 
531  virtual void readDPA(anna::DataBlock &dpa, const anna::DataBlock & dpr) const;
532 
538  void setCEA(const std::string &ceaPathfile) { a_ceaPathfile = ceaPathfile; }
539 
545  const std::string & getCEA() const { return a_ceaPathfile; }
546 
576  virtual void readCEA(anna::DataBlock &cea, const anna::DataBlock & cer) const;
577 
587  virtual void readDWA(anna::DataBlock &dwa, const anna::DataBlock & dwr) const;
588 
600  const Response* sendRealmHost(const Message* message, const std::string &destinationRealm, const std::string &destinationHost = "") noexcept(false);
601 
606  void resetStatistics() ;
607 
608 
615  void lazyInitialize() noexcept(false);
616 
617 
618 protected:
631  Engine(const char *className, const stack::Dictionary *baseProtocolDictionary);
632 
633  // INTERNAL CREATORS AND CLOSE METHODS
634  Server *createServer(Entity*, const socket_t&) noexcept(false);
635  void closeServer(Server*, bool) noexcept(false);
636  ClientSession *createClientSession(Server*, int) noexcept(false);
637  void closeClientSession(ClientSession*, bool) noexcept(false);
638 
639  // INTERNAL ALLOCATORS
640  Server* allocateServer() ;
641  void releaseServer(Server*) ;
642  ClientSession* allocateClientSession() ;
643  void releaseClientSession(ClientSession*) ;
644 
645 
653  virtual Entity* allocateEntity() { return NULL; }
654 
655 
660  virtual void releaseEntity(Entity*) {;}
661 
662 
670  virtual LocalServer* allocateLocalServer() { return NULL; }
671 
672 
677  virtual void releaseLocalServer(LocalServer*) {;}
678 
679  // Gets the base protocol codec engine used internally.
680  // This engine is initializaed on constructor with the base protocol dictionary.
681  // The reason to not reuse any other codec engine from the application is to have this one isolated with no interference
682  // regarding configuration changes (validation depth/mode, fix mode, etc.).
683  //
684  // @return Pointer to the internal base protocol codec engine
685  codec::Engine *getBaseProtocolCodecEngine() const { return const_cast<codec::Engine *>(&a_baseProtocolCodecEngine); }
686 
687 private:
688 
689  // Internal use: tracing and readCEA/DPA/DWA
690  codec::Engine a_baseProtocolCodecEngine;
691 
692  std::string a_originRealm;
693  std::string a_originHost;
694  bool a_autoBind;
695  int a_numberOfClientSessionsPerServer;
696 
697 
698  // ClientSessions messages:
699  anna::DataBlock a_client_cer;
700  anna::DataBlock a_client_dwr;
701  anna::Millisecond a_watchdogPeriod;
702 
703  // ServerSessions messages: no need for DWA and DPA templates, they are built on the fly (enough information).
704  std::string a_ceaPathfile; // path file to optional CEA (diameter local server configuration)
705 
706  // Client connectivity
707  anna::Millisecond a_maxConnectionDelay;
708 
709 
710  // Availability
711  bool a_availableForEntities; // any of the entities must be bound
712  void availabilityLostForEntities() ;
713  void availabilityRecoveredForEntities() ;
714  bool refreshAvailabilityForEntities() ; // return true if change
715 
716  bool a_availableForLocalServers; // any of the local servers must be bound
717  void availabilityLostForLocalServers() ;
718  void availabilityRecoveredForLocalServers() ;
719  bool refreshAvailabilityForLocalServers() ; // return true if change
720 
721  void eraseDeprecatedIdleEntities() ;
722 
723  // Component:
724  void do_initialize() noexcept(false);
725  void do_stop() ;
726 
727  // Integrity:
728  void checkEntityCollision(const socket_v &) noexcept(false);
729  void assertBaseProtocolHealth() const noexcept(false); // checks the dictionary
730 
731 
733  // CLIENT FUNCTIONALITY //
735 
736  typedef std::string clientSession_key; // 'ADDR:PORT|id'
737  typedef std::map <clientSession_key, ClientSession*> clientSession_container;
738  typedef clientSession_container::value_type clientSession_value_type;
739  typedef clientSession_container::iterator clientSession_iterator;
740  typedef clientSession_container::const_iterator const_clientSession_iterator;
741  clientSession_container a_clientSessions;
742  anna::Recycler<ClientSession> a_clientSessionsRecycler;
743  clientSession_iterator clientSession_find(const clientSession_key&) ;
744  clientSession_iterator clientSession_begin() { return a_clientSessions.begin(); }
745  clientSession_iterator clientSession_end() { return a_clientSessions.end(); }
746  static ClientSession* clientSession(clientSession_iterator ii) { return ii->second; }
747  const_clientSession_iterator clientSession_begin() const { return a_clientSessions.begin(); }
748  const_clientSession_iterator clientSession_end() const { return a_clientSessions.end(); }
749  static const ClientSession* clientSession(const_clientSession_iterator ii) { return ii->second; }
750 
751  typedef socket_t server_key;
752  server_key getServerKey(const std::string & addr, int port) const ;
753  typedef std::map <server_key, Server*> server_container;
754  typedef server_container::value_type server_value_type;
755  typedef server_container::iterator server_iterator;
756  typedef server_container::const_iterator const_server_iterator;
757  server_container a_servers;
758  anna::Recycler<Server> a_serversRecycler;
759  server_iterator server_find(const server_key&) ;
760  server_iterator server_begin() { return a_servers.begin(); }
761  server_iterator server_end() { return a_servers.end(); }
762  static Server* server(server_iterator ii) { return ii->second; }
763  const_server_iterator server_begin() const { return a_servers.begin(); }
764  const_server_iterator server_end() const { return a_servers.end(); }
765  static const Server* server(const_server_iterator ii) { return ii->second; }
766 
767  typedef std::string entity_key; // 'ADDR1:PORT1 ADDR2:PORT2 ADDR3:PORT3 ...'
768  entity_key getEntityKey(const socket_v &) const ;
769  entity_key getEntityKey(const std::string & addr1, int port1, const std::string & addr2, int port2) const ;
770  typedef std::map <entity_key, Entity*> entity_container;
771  typedef entity_container::value_type entity_value_type;
772  typedef entity_container::iterator entity_iterator;
773  typedef entity_container::const_iterator const_entity_iterator;
774  entity_container a_entities;
775  entity_iterator entity_find(const entity_key&) ;
776  entity_iterator entity_begin() { return a_entities.begin(); }
777  entity_iterator entity_end() { return a_entities.end(); }
778  static Entity* entity(entity_iterator ii) { return ii->second; }
779  const_entity_iterator entity_begin() const { return a_entities.begin(); }
780  const_entity_iterator entity_end() const { return a_entities.end(); }
781  static const Entity* entity(const_entity_iterator ii) { return ii->second; }
782 
783 
785  // SERVER FUNCTIONALITY //
787 
788  // Local servers
789  typedef std::map <socket_t, LocalServer*> localServer_container;
790  typedef localServer_container::value_type localServer_value_type;
791  typedef localServer_container::iterator localServer_iterator;
792  typedef localServer_container::const_iterator const_localServer_iterator;
793  localServer_container a_localServers;
794  localServer_iterator localServer_find(const socket_t&) ;
795  localServer_iterator localServer_begin() { return a_localServers.begin(); }
796  localServer_iterator localServer_end() { return a_localServers.end(); }
797  static LocalServer* localServer(localServer_iterator ii) { return ii->second; }
798  const_localServer_iterator localServer_begin() const { return a_localServers.begin(); }
799  const_localServer_iterator localServer_end() const { return a_localServers.end(); }
800  static const LocalServer* localServer(const_localServer_iterator ii) { return ii->second; }
801 
802  // Server sessions are managed within LocalServer (not at engine) due to dynamic creation nature
803  // Here we maintain the Destination-Realm / Destination-Host maps for DRA basics:
804  typedef std::vector<ServerSession*> server_sessions_vector_t;
805  typedef server_sessions_vector_t::const_iterator server_sessions_it_t;
806  typedef server_sessions_vector_t::iterator server_sessions_nc_it_t;
807  typedef std::map <std::string /* Destination-Host */, server_sessions_vector_t> dh_server_sessions_map_t;
808  typedef dh_server_sessions_map_t::const_iterator dh_server_sessions_it_t;
809  typedef dh_server_sessions_map_t::iterator dh_server_sessions_nc_it_t;
810  typedef std::map <std::string /* Destination-Realm */, dh_server_sessions_map_t> dr_dh_server_sessions_map_t;
811  typedef dr_dh_server_sessions_map_t::const_iterator dr_dh_server_sessions_it_t;
812  typedef dr_dh_server_sessions_map_t::iterator dr_dh_server_sessions_nc_it_t;
813  dr_dh_server_sessions_map_t a_dr_dh_server_sessions;
814  void manageDrDhServerSession(ServerSession *ss, bool register_or_desregister) ;
815 
816  friend class Session;
817  friend class ClientSession;
818  friend class ServerSession;
819  friend class ServerSocket;
820  friend class Server;
821  friend class Entity;
822  friend class LocalServer;
823  //friend class Message;
824 };
825 
826 }
827 }
828 }
829 
830 #endif
831 
Definition: Exception.hpp:26
Definition: Millisecond.hpp:24
Definition: Engine.hpp:42
_v
Definition: Exception.hpp:26
void setMaxConnectionDelay(const anna::Millisecond &maxConnectionDelay)
Definition: Engine.hpp:170
Definition: Engine.hpp:102
void setAutoBind(const bool autoBind)
Definition: Engine.hpp:161
Definition: Node.hpp:56
Definition: Server.hpp:54
bool getAutoBind() const
Definition: Engine.hpp:152
codec::Engine * getBaseProtocolCodecEngine() const
Definition: Engine.hpp:685
bool broadcastLocalServers(const Message &message) noexcept(false)
Definition: Engine.hpp:499
uint32_t U32
Definition: defines.hpp:75
bool broadcastEntities(const Message &message) noexcept(false)
Definition: Engine.hpp:487
bool idleForLocalServers() const
Definition: Engine.hpp:468
virtual Entity * allocateEntity()
Definition: Engine.hpp:653
bool idleForEntities() const
Definition: Engine.hpp:461
Definition: Response.hpp:44
void setNumberOfClientSessionsPerServer(int numberOfClientSessionsPerServer)
Definition: Engine.hpp:243
Definition: Message.hpp:45
Definition: ServerSession.hpp:53
Definition: ClientSession.hpp:51
std::pair< std::string, int > socket_t
Definition: defines.hpp:104
Definition: Recycler.hpp:30
Definition: LocalServer.hpp:55
virtual void releaseEntity(Entity *)
Definition: Engine.hpp:660
Definition: Dictionary.hpp:50
const std::string & getCEA() const
Definition: Engine.hpp:545
void setCEA(const std::string &ceaPathfile)
Definition: Engine.hpp:538
const std::string & getOriginHostName() const
Definition: Engine.hpp:133
Definition: app.hpp:12
void close(bool destroy=false) noexcept(false)
Definition: Engine.hpp:394
std::vector< Server * >::iterator begin()
Definition: Entity.hpp:390
Definition: Component.hpp:44
std::vector< ClientSession * >::iterator begin()
Definition: Server.hpp:181
virtual void bindingClientSession(const ClientSession *) const
Definition: Engine.hpp:519
const anna::Millisecond & getMaxConnectionDelay()
Definition: Engine.hpp:179
std::vector< socket_t > socket_v
Definition: defines.hpp:109
int getNumberOfClientSessionsPerServer() const
Definition: Engine.hpp:236
Definition: Entity.hpp:50
const std::string & getOriginRealmName() const
Definition: Engine.hpp:126
Definition: Session.hpp:55
int getOTARequests() const
Definition: Engine.hpp:454
virtual LocalServer * allocateLocalServer()
Definition: Engine.hpp:670
Definition: DataBlock.hpp:24
Definition: functions.hpp:118
virtual void releaseLocalServer(LocalServer *)
Definition: Engine.hpp:677
bool idle() const
Definition: Engine.hpp:475
Definition: ServerSocket.hpp:44