take pea_'s suggestion of not sending out natpmp/upnp discover messages until port forwarding is enabled

This commit is contained in:
Charles Kerr 2007-12-13 18:56:22 +00:00
parent 39773104be
commit a51d790d81
2 changed files with 39 additions and 38 deletions

View File

@ -35,6 +35,7 @@ typedef enum
{
TR_NATPMP_IDLE,
TR_NATPMP_ERR,
TR_NATPMP_DISCOVER,
TR_NATPMP_RECV_PUB,
TR_NATPMP_SEND_MAP,
TR_NATPMP_RECV_MAP,
@ -46,7 +47,8 @@ tr_natpmp_state;
struct tr_natpmp
{
int port;
int isMapped;
unsigned int isMapped : 1;
unsigned int hasDiscovered : 1;
time_t renewTime;
tr_natpmp_state state;
natpmp_t natpmp;
@ -70,15 +72,9 @@ logVal( const char * func, int ret )
struct tr_natpmp*
tr_natpmpInit( void )
{
struct tr_natpmp * nat = tr_new0( struct tr_natpmp, 1 );
int val;
val = initnatpmp( &nat->natpmp );
logVal( "initnatpmp", val );
val = sendpublicaddressrequest( &nat->natpmp );
logVal( "sendpublicaddressrequest", val );
nat->state = val < 0 ? TR_NATPMP_ERR : TR_NATPMP_RECV_PUB;
struct tr_natpmp * nat;
nat = tr_new0( struct tr_natpmp, 1 );
nat->state = TR_NATPMP_DISCOVER;
nat->port = -1;
return nat;
}
@ -98,6 +94,16 @@ tr_natpmpPulse( struct tr_natpmp * nat, int port, int isEnabled )
{
int ret;
if( isEnabled && ( nat->state == TR_NATPMP_DISCOVER ) )
{
int val = initnatpmp( &nat->natpmp );
logVal( "initnatpmp", val );
val = sendpublicaddressrequest( &nat->natpmp );
logVal( "sendpublicaddressrequest", val );
nat->state = val < 0 ? TR_NATPMP_ERR : TR_NATPMP_RECV_PUB;
nat->hasDiscovered = 1;
}
if( nat->state == TR_NATPMP_RECV_PUB )
{
natpmpresp_t response;
@ -141,7 +147,7 @@ tr_natpmpPulse( struct tr_natpmp * nat, int port, int isEnabled )
if( nat->state == TR_NATPMP_IDLE )
{
if( isEnabled && !nat->isMapped )
if( isEnabled && !nat->isMapped && nat->hasDiscovered )
nat->state = TR_NATPMP_SEND_MAP;
else if( nat->isMapped && time(NULL) >= nat->renewTime )
@ -171,15 +177,15 @@ tr_natpmpPulse( struct tr_natpmp * nat, int port, int isEnabled )
}
}
if( nat->state == TR_NATPMP_ERR )
ret = TR_NAT_TRAVERSAL_ERROR;
else if( ( nat->state == TR_NATPMP_IDLE ) && ( nat->isMapped ) )
ret = TR_NAT_TRAVERSAL_MAPPED;
else if( ( nat->state == TR_NATPMP_IDLE ) && ( !nat->isMapped ) )
ret = TR_NAT_TRAVERSAL_UNMAPPED;
else if( ( nat->state == TR_NATPMP_SEND_MAP ) || ( nat->state == TR_NATPMP_RECV_MAP ) )
ret = TR_NAT_TRAVERSAL_MAPPING;
else if( ( nat->state == TR_NATPMP_SEND_UNMAP ) || ( nat->state == TR_NATPMP_RECV_UNMAP ) )
ret = TR_NAT_TRAVERSAL_UNMAPPING;
switch( nat->state ) {
case TR_NATPMP_IDLE: ret = nat->isMapped ? TR_NAT_TRAVERSAL_MAPPED : TR_NAT_TRAVERSAL_UNMAPPED; break;
case TR_NATPMP_DISCOVER: ret = TR_NAT_TRAVERSAL_UNMAPPED; break;
case TR_NATPMP_RECV_PUB:
case TR_NATPMP_SEND_MAP:
case TR_NATPMP_RECV_MAP: ret = TR_NAT_TRAVERSAL_MAPPING; break;
case TR_NATPMP_SEND_UNMAP:
case TR_NATPMP_RECV_UNMAP: ret = TR_NAT_TRAVERSAL_UNMAPPING; break;
default: ret = TR_NAT_TRAVERSAL_ERROR; break;
}
return ret;
}

View File

@ -56,6 +56,7 @@ tr_upnp*
tr_upnpInit( void )
{
tr_upnp * ret = tr_new0( tr_upnp, 1 );
ret->state = TR_UPNP_DISCOVER;
ret->port = -1;
return ret;
}
@ -80,13 +81,7 @@ tr_upnpPulse( tr_upnp * handle, int port, int isEnabled )
{
int ret;
if( handle->state == TR_UPNP_IDLE )
{
if( !handle->hasDiscovered )
handle->state = TR_UPNP_DISCOVER;
}
if( handle->state == TR_UPNP_DISCOVER )
if( isEnabled && ( handle->state == TR_UPNP_DISCOVER ) )
{
struct UPNPDev * devlist;
errno = 0;
@ -157,15 +152,15 @@ tr_upnpPulse( tr_upnp * handle, int port, int isEnabled )
}
}
if( handle->state == TR_UPNP_ERR )
ret = TR_NAT_TRAVERSAL_ERROR;
else if( ( handle->state == TR_UPNP_IDLE ) && handle->isMapped )
ret = TR_NAT_TRAVERSAL_MAPPED;
else if( ( handle->state == TR_UPNP_IDLE ) && !handle->isMapped )
ret = TR_NAT_TRAVERSAL_UNMAPPED;
else if( handle->state == TR_UPNP_MAP )
ret = TR_NAT_TRAVERSAL_MAPPING;
else if( handle->state == TR_UPNP_UNMAP )
ret = TR_NAT_TRAVERSAL_UNMAPPING;
switch( handle->state )
{
case TR_UPNP_DISCOVER: ret = TR_NAT_TRAVERSAL_UNMAPPED; break;
case TR_UPNP_MAP: ret = TR_NAT_TRAVERSAL_MAPPING; break;
case TR_UPNP_UNMAP: ret = TR_NAT_TRAVERSAL_UNMAPPING; break;
case TR_UPNP_IDLE: ret = handle->isMapped ? TR_NAT_TRAVERSAL_MAPPED
: TR_NAT_TRAVERSAL_UNMAPPED; break;
default: ret = TR_NAT_TRAVERSAL_ERROR; break;
}
return ret;
}