Ignore:
Timestamp:
Sep 24, 2006, 7:41:05 AM (15 years ago)
Author:
joshe
Message:

Treat a couple more NAT-PMP errors as temporary.

File:
1 edited

Legend:

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

    r901 r902  
    5959    unsigned int         adding : 1;
    6060    unsigned int         nobodyhome : 1;
    61     unsigned int         portused : 1;
     61    unsigned int         tmpfail : 1;
    6262    int                  fd;
    6363    int                  delay;
     
    7777#define PMP_STATE_FAILED        5
    7878#define PMP_STATE_NOBODYHOME    6
    79 #define PMP_STATE_PORTUSED      7
     79#define PMP_STATE_TMPFAIL       7
    8080    char               state;
    8181    unsigned int       active : 1;
     
    110110static tr_tristate_t
    111111readrequest( uint8_t * buf, int len, int adding, int port,
    112              tr_natpmp_uptime_t * uptime, uint64_t * renew, int * used );
     112             tr_natpmp_uptime_t * uptime, uint64_t * renew, int * tmpfail );
    113113
    114114tr_natpmp_t *
     
    200200            case PMP_STATE_FAILED:
    201201            case PMP_STATE_NOBODYHOME:
    202             case PMP_STATE_PORTUSED:
     202            case PMP_STATE_TMPFAIL:
    203203                break;
    204204            default:
     
    238238                break;
    239239            case PMP_STATE_FAILED:
    240             case PMP_STATE_PORTUSED:
     240            case PMP_STATE_TMPFAIL:
    241241                ret = TR_NAT_TRAVERSAL_ERROR;
    242242                break;
     
    294294        {
    295295            case PMP_STATE_IDLE:
    296             case PMP_STATE_PORTUSED:
     296            case PMP_STATE_TMPFAIL:
    297297                if( 0 < pmp->newport )
    298298                {
     299                    tr_dbg( "nat-pmp state %s -> add with port %i",
     300                            ( PMP_STATE_IDLE == pmp->state ? "idle" : "err" ),
     301                            pmp->newport );
    299302                    pmp->state = PMP_STATE_ADDING;
    300                     tr_dbg( "nat-pmp state %s -> add with port %i",
    301                             ( PMP_STATE_IDLE == pmp->state ? "idle" : "used" ),
    302                             pmp->newport );
    303303                }
    304304                break;
     
    338338                                tr_dbg( "nat-pmp state add -> nobodyhome on pulse" );
    339339                            }
    340                             else if( pmp->req->portused )
     340                            else if( pmp->req->tmpfail )
    341341                            {
    342                                 pmp->state = PMP_STATE_PORTUSED;
    343                                 tr_dbg( "nat-pmp state add -> used on pulse" );
     342                                pmp->state = PMP_STATE_TMPFAIL;
     343                                tr_dbg( "nat-pmp state add -> err on pulse" );
    344344                                if( pmp->req->port == pmp->newport )
    345345                                {
     
    390390                                tr_dbg( "nat-pmp state del -> nobodyhome on pulse" );
    391391                            }
     392                            else if( pmp->req->tmpfail )
     393                            {
     394                                pmp->state = PMP_STATE_TMPFAIL;
     395                                tr_dbg( "nat-pmp state del -> err on pulse" );
     396                                pmp->mappedport = -1;
     397                            }
    392398                            else
    393399                            {
     
    526532    struct sockaddr_in sin;
    527533    uint8_t            buf[16];
    528     int                res, used;
     534    int                res, tmpfail;
    529535    uint64_t           now;
    530536    tr_tristate_t      ret;
     
    571577
    572578    ret = readrequest( buf, res, req->adding, req->port, req->uptime, renew,
    573                        &used );
    574     req->portused = ( used ? 1 : 0 );
     579                       &tmpfail );
     580    req->tmpfail = ( tmpfail ? 1 : 0 );
    575581    return ret;
    576582}
     
    681687static tr_tristate_t
    682688readrequest( uint8_t * buf, int len, int adding, int port,
    683              tr_natpmp_uptime_t * uptime, uint64_t * renew, int * used )
     689             tr_natpmp_uptime_t * uptime, uint64_t * renew, int * tmpfail )
    684690{
    685691    uint8_t            version, opcode, wantedopcode;
     
    687693    uint32_t           seconds, lifetime;
    688694
    689     assert( !adding || NULL != used );
    690     if( NULL != used )
    691     {
    692         *used = 0;
     695    assert( !adding || NULL != tmpfail );
     696    if( NULL != tmpfail )
     697    {
     698        *tmpfail = 0;
    693699    }
    694700    if( 4 > len )
     
    719725        return TR_ERROR;
    720726    }
    721     if( PMP_RESPCODE_OK != rescode )
    722     {
    723         tr_err( "bad nat-pmp result code %hu", rescode );
    724         return TR_ERROR;
     727    switch( rescode )
     728    {
     729        case PMP_RESPCODE_OK:
     730            break;
     731        case PMP_RESPCODE_REFUSED:
     732        case PMP_RESPCODE_NETDOWN:
     733        case PMP_RESPCODE_NOMEM:
     734            if( NULL != tmpfail )
     735            {
     736                *tmpfail = 1;
     737            }
     738            /* fallthrough */
     739        default:
     740            tr_err( "bad nat-pmp result code %hu", rescode );
     741            return TR_ERROR;
    725742    }
    726743
     
    764781            if( port != pubport )
    765782            {
    766                 *used = 1;
     783                *tmpfail = 1;
    767784                /* XXX should just start announcing the pub port we're given */
    768785                return TR_ERROR;
Note: See TracChangeset for help on using the changeset viewer.