From abeb1da46ca7b6a13a5c47c01d9141df4a8e1989 Mon Sep 17 00:00:00 2001 From: Maxim Mamontov Date: Sun, 2 Dec 2012 17:32:42 +0200 Subject: [PATCH] Added SMUX reconnect. Fixes #18. --- .../stargazer/plugins/other/smux/smux.cpp | 42 +++++++++++++++++-- projects/stargazer/plugins/other/smux/smux.h | 5 +++ 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/projects/stargazer/plugins/other/smux/smux.cpp b/projects/stargazer/plugins/other/smux/smux.cpp index bef6e462..81b9ccb5 100644 --- a/projects/stargazer/plugins/other/smux/smux.cpp +++ b/projects/stargazer/plugins/other/smux/smux.cpp @@ -103,6 +103,9 @@ SMUX::SMUX() mutex(), running(false), stopped(true), + needReconnect(false), + lastReconnectTry(0), + reconnectTimeout(1), sock(-1), smuxHandlers(), pdusHandlers(), @@ -157,7 +160,7 @@ assert(corporations != NULL && "corporations must not be NULL"); assert(traffcounter != NULL && "traffcounter must not be NULL"); if (PrepareNet()) - return -1; + needReconnect = true; // Users sensors[OID(".1.3.6.1.4.1.38313.1.1.1")] = new TotalUsersSensor(*users); @@ -286,15 +289,15 @@ void SMUX::Run() { stopped = true; if (!SendOpenPDU(sock)) - return; + needReconnect = true; if (!SendRReqPDU(sock)) - return; + needReconnect = true; running = true; stopped = false; while(running) { - if (WaitPackets(sock)) + if (WaitPackets(sock) && !needReconnect) { SMUX_PDUs_t * pdus = RecvSMUXPDUs(sock); if (pdus) @@ -302,7 +305,11 @@ while(running) DispatchPDUs(pdus); ASN_STRUCT_FREE(asn_DEF_SMUX_PDUs, pdus); } + else if (running) + Reconnect(); } + else if (running && needReconnect) + Reconnect(); if (!running) break; } @@ -339,6 +346,33 @@ if (connect(sock, reinterpret_cast(&addr), sizeof(addr))) return false; } +bool SMUX::Reconnect() +{ +if (needReconnect && difftime(time(NULL), lastReconnectTry) < reconnectTimeout) + return true; + +time(&lastReconnectTry); +SendClosePDU(sock); +close(sock); +if (!PrepareNet()) + if (SendOpenPDU(sock)) + if (SendRReqPDU(sock)) + { + reconnectTimeout = 1; + needReconnect = false; + logger("Connected successfully"); + printfd(__FILE__, "Connected successfully\n"); + return false; + } + +if (needReconnect) + if (reconnectTimeout < 60) + reconnectTimeout *= 2; + +needReconnect = true; +return true; +} + bool SMUX::DispatchPDUs(const SMUX_PDUs_t * pdus) { SMUXHandlers::iterator it(smuxHandlers.find(pdus->present)); diff --git a/projects/stargazer/plugins/other/smux/smux.h b/projects/stargazer/plugins/other/smux/smux.h index cc722511..ef7b191c 100644 --- a/projects/stargazer/plugins/other/smux/smux.h +++ b/projects/stargazer/plugins/other/smux/smux.h @@ -138,6 +138,7 @@ private: static void * Runner(void * d); void Run(); bool PrepareNet(); + bool Reconnect(); bool DispatchPDUs(const SMUX_PDUs_t * pdus); @@ -168,6 +169,10 @@ private: pthread_mutex_t mutex; bool running; bool stopped; + bool needReconnect; + + time_t lastReconnectTry; + unsigned reconnectTimeout; int sock; -- 2.43.2