[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;