Changeset 901


Ignore:
Timestamp:
Sep 24, 2006, 5:03:42 AM (15 years ago)
Author:
joshe
Message:

Don't treat a requested port being in use as a permanent error with NAT-PMP

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/nat-traversal/libtransmission/natpmp.c

    r870 r901  
    5959    unsigned int         adding : 1;
    6060    unsigned int         nobodyhome : 1;
     61    unsigned int         portused : 1;
    6162    int                  fd;
    6263    int                  delay;
     
    7677#define PMP_STATE_FAILED        5
    7778#define PMP_STATE_NOBODYHOME    6
     79#define PMP_STATE_PORTUSED      7
    7880    char               state;
    7981    unsigned int       active : 1;
     
    108110static tr_tristate_t
    109111readrequest( uint8_t * buf, int len, int adding, int port,
    110              tr_natpmp_uptime_t * uptime, uint64_t * renew );
     112             tr_natpmp_uptime_t * uptime, uint64_t * renew, int * used );
    111113
    112114tr_natpmp_t *
     
    198200            case PMP_STATE_FAILED:
    199201            case PMP_STATE_NOBODYHOME:
     202            case PMP_STATE_PORTUSED:
    200203                break;
    201204            default:
     
    235238                break;
    236239            case PMP_STATE_FAILED:
     240            case PMP_STATE_PORTUSED:
    237241                ret = TR_NAT_TRAVERSAL_ERROR;
    238242                break;
     
    290294        {
    291295            case PMP_STATE_IDLE:
     296            case PMP_STATE_PORTUSED:
    292297                if( 0 < pmp->newport )
    293298                {
    294299                    pmp->state = PMP_STATE_ADDING;
    295                     tr_dbg( "nat-pmp state idle -> add with port %i",
     300                    tr_dbg( "nat-pmp state %s -> add with port %i",
     301                            ( PMP_STATE_IDLE == pmp->state ? "idle" : "used" ),
    296302                            pmp->newport );
    297303                }
     
    331337                                pmp->state = PMP_STATE_NOBODYHOME;
    332338                                tr_dbg( "nat-pmp state add -> nobodyhome on pulse" );
     339                            }
     340                            else if( pmp->req->portused )
     341                            {
     342                                pmp->state = PMP_STATE_PORTUSED;
     343                                tr_dbg( "nat-pmp state add -> used on pulse" );
     344                                if( pmp->req->port == pmp->newport )
     345                                {
     346                                    pmp->newport = 0;
     347                                }
    333348                            }
    334349                            else
     
    511526    struct sockaddr_in sin;
    512527    uint8_t            buf[16];
    513     int                res;
     528    int                res, used;
    514529    uint64_t           now;
     530    tr_tristate_t      ret;
    515531
    516532    now = tr_date();
     
    554570    tr_dbg( "nat-pmp read %i byte response", res );
    555571
    556     return readrequest( buf, res, req->adding, req->port, req->uptime, renew );
     572    ret = readrequest( buf, res, req->adding, req->port, req->uptime, renew,
     573                       &used );
     574    req->portused = ( used ? 1 : 0 );
     575    return ret;
    557576}
    558577
     
    611630    }
    612631
    613     if( TR_OK == readrequest( buf, res, 0, -1, &pmp->uptime, &pmp->renew ) &&
    614         PMP_STATE_FAILED == pmp->state )
    615     {
    616         tr_dbg( "nat-pmp state fail -> idle" );
     632    if( TR_OK == readrequest( buf, res, 0, -1, &pmp->uptime, &pmp->renew, NULL ) &&
     633        PMP_STATE_NOBODYHOME == pmp->state )
     634    {
     635        tr_dbg( "nat-pmp state notfound -> idle" );
    617636        pmp->state = PMP_STATE_IDLE;
    618637    }
     
    662681static tr_tristate_t
    663682readrequest( uint8_t * buf, int len, int adding, int port,
    664              tr_natpmp_uptime_t * uptime, uint64_t * renew )
     683             tr_natpmp_uptime_t * uptime, uint64_t * renew, int * used )
    665684{
    666685    uint8_t            version, opcode, wantedopcode;
     
    668687    uint32_t           seconds, lifetime;
    669688
     689    assert( !adding || NULL != used );
     690    if( NULL != used )
     691    {
     692        *used = 0;
     693    }
    670694    if( 4 > len )
    671695    {
     
    740764            if( port != pubport )
    741765            {
     766                *used = 1;
    742767                /* XXX should just start announcing the pub port we're given */
    743768                return TR_ERROR;
Note: See TracChangeset for help on using the changeset viewer.