[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[vidalia-svn] r2558: Re-initialize miniupnpc and re-create forwarded ports every (vidalia/branches/upnp/src/vidalia/config)



Author: sjmurdoch
Date: 2008-05-08 07:49:59 -0400 (Thu, 08 May 2008)
New Revision: 2558

Modified:
   vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.cpp
   vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.h
Log:
Re-initialize miniupnpc and re-create forwarded ports every 5(+1) minutes

Modified: vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.cpp
===================================================================
--- vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.cpp	2008-05-07 15:28:32 UTC (rev 2557)
+++ vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.cpp	2008-05-08 11:49:59 UTC (rev 2558)
@@ -18,6 +18,7 @@
 
 #include <QWaitCondition>
 #include <QMutex>
+#include <QTime>
 
 #ifdef WIN32
 #include <winsock2.h>
@@ -26,10 +27,12 @@
 #include "upnpcontrol.h"
 
 #define UPNPCONTROL_DEBUG 1
+#define UPNPCONTROL_REINIT_MSEC 300000 // 5 minutes
+#define UPNPCONTROL_MAX_WAIT_MSEC 60000 // 1 minute
 
 UPNPControlThread::UPNPControlThread(UPNPControl *control)
 {
-  _upnpInitialized = false;
+  _upnpInitialized = QTime();
   _keepRunning = true;
   _control = control;
 
@@ -61,7 +64,7 @@
     _waitMutex->lock();
     if (_keepRunning) {
       /* We should continue */ 
-      _waitCondition->wait(_waitMutex);
+      _waitCondition->wait(_waitMutex, UPNPCONTROL_MAX_WAIT_MSEC);
       /* Maybe we were asked to exit while waiting */
       shouldExit = !_keepRunning;
       _waitMutex->unlock();
@@ -82,19 +85,39 @@
 void
 UPNPControlThread::configurePorts() {
   quint16 desiredDirPort, desiredOrPort;
+  bool force_init = false;
 
   /* Get desired state */
   _control->getDesiredState(&desiredDirPort, &desiredOrPort);
+
+  /* If it's been a while since we initialized the router, or time has gone
+     backward, then maybe the router has gone away or forgotten the forwards.
+     Reset UPnP state, and re-do the port forwarding */
+  if (_upnpInitialized.isNull() || // Is this the first time we have used UPNP?
+      _upnpInitialized>QTime::currentTime() || // Has time gone backwards?
+      _upnpInitialized.addMSecs(UPNPCONTROL_REINIT_MSEC)<QTime::currentTime() // Has it been REINIT_MSEC since initialization
+      ) {
+    _upnpInitialized = QTime();
+    force_init = true;
+  }
   
-  /* Configure DirPort */
-  if (desiredDirPort != _dirPort) {
-    updatePort(_dirPort, desiredDirPort);
+  if (!force_init) {
+    /* Configure DirPort */
+    if (desiredDirPort != _dirPort) {
+      updatePort(_dirPort, desiredDirPort);
+      _dirPort = desiredDirPort;
+    }
+    
+    /* Configure ORPort */
+    if (desiredOrPort != _orPort) {
+      updatePort(_orPort, desiredOrPort);
+      _orPort = desiredOrPort;
+    }
+  } else {
+    /* Add the mapping even if they exist already */
+    updatePort(0, desiredDirPort);
     _dirPort = desiredDirPort;
-  }
-  
-  /* Configure ORPort */
-  if (desiredOrPort != _orPort) {
-    updatePort(_orPort, desiredOrPort);
+    updatePort(0, desiredOrPort);
     _orPort = desiredOrPort;
   }
 }
@@ -138,9 +161,9 @@
   }
 #endif
 
-  if (!_upnpInitialized) {
+  if (_upnpInitialized.isNull() && (oldPort!=0 || newPort !=0)) {
     init_upnp();
-    _upnpInitialized = true;
+    _upnpInitialized = QTime::currentTime();
   }
 
   if (oldPort != 0)

Modified: vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.h
===================================================================
--- vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.h	2008-05-07 15:28:32 UTC (rev 2557)
+++ vidalia/branches/upnp/src/vidalia/config/upnpcontrolthread.h	2008-05-08 11:49:59 UTC (rev 2558)
@@ -20,6 +20,7 @@
 #include <QThread>
 #include <QMutex>
 #include <QWaitCondition>
+#include <QTime>
 
 #define STATICLIB
 #include <miniupnpc/miniwget.h>
@@ -43,7 +44,7 @@
   void run();
 
 private:
-  bool _upnpInitialized;
+  QTime _upnpInitialized;
   bool _keepRunning;
   UPNPControl *_control;
   QWaitCondition *_waitCondition;