Ticket #5187: natpmp_Defect5187_r13682.patch

File natpmp_Defect5187_r13682.patch, 3.6 KB (added by beatmag, 9 years ago)

Initial Fix with Hack to unmap both UDP and TCP ports properly

  • .c

    old new  
    4040    TR_NATPMP_SEND_MAP,
    4141    TR_NATPMP_RECV_MAP,
    4242    TR_NATPMP_SEND_UNMAP,
    43     TR_NATPMP_RECV_UNMAP
     43    TR_NATPMP_RECV_UNMAP,
     44    TR_NATPMP_SEND_UDP_MAP,
     45    TR_NATPMP_RECV_UDP_MAP,
    4446}
    4547tr_natpmp_state;
    4648
     
    152154        if (nat->is_mapped && (!is_enabled || (nat->private_port != private_port)))
    153155            nat->state = TR_NATPMP_SEND_UNMAP;
    154156    }
    155 
     157       
    156158    if ((nat->state == TR_NATPMP_SEND_UNMAP) && canSendCommand (nat))
    157159    {
    158         const int val = sendnewportmappingrequest (&nat->natpmp, NATPMP_PROTOCOL_TCP,
     160       
     161               
     162                const int val = sendnewportmappingrequest (&nat->natpmp, NATPMP_PROTOCOL_TCP,
    159163                                                   nat->private_port,
    160164                                                   nat->public_port,
    161165                                                   0);
     166                                                                                                   
     167        const int val2 = sendnewportmappingrequest (&nat->natpmp, NATPMP_PROTOCOL_UDP,
     168                                                   nat->private_port,
     169                                                   nat->public_port,
     170                                                   0);                                                                                             
    162171        logVal ("sendnewportmappingrequest", val);
    163172        nat->state = val < 0 ? TR_NATPMP_ERR : TR_NATPMP_RECV_UNMAP;
    164173        setCommandTime (nat);
     
    188197            nat->state = TR_NATPMP_ERR;
    189198        }
    190199    }
    191 
     200       
    192201    if (nat->state == TR_NATPMP_IDLE)
    193202    {
    194203        if (is_enabled && !nat->is_mapped && nat->has_discovered)
     
    197206        else if (nat->is_mapped && tr_time () >= nat->renew_time)
    198207            nat->state = TR_NATPMP_SEND_MAP;
    199208    }
    200 
     209       
    201210    if ((nat->state == TR_NATPMP_SEND_MAP) && canSendCommand (nat))
    202211    {
    203212        const int val = sendnewportmappingrequest (&nat->natpmp, NATPMP_PROTOCOL_TCP, private_port, private_port, LIFETIME_SECS);
     
    213222        logVal ("readnatpmpresponseorretry", val);
    214223        if (val >= 0)
    215224        {
    216             nat->state = TR_NATPMP_IDLE;
     225            nat->state = TR_NATPMP_SEND_UDP_MAP;
    217226            nat->is_mapped = true;
    218227            nat->renew_time = tr_time () + (resp.pnu.newportmapping.lifetime / 2);
    219228            nat->private_port = resp.pnu.newportmapping.privateport;
     
    224233        {
    225234            nat->state = TR_NATPMP_ERR;
    226235        }
     236    }   
     237       
     238    if ((nat->state == TR_NATPMP_SEND_UDP_MAP) && canSendCommand (nat))
     239    {
     240        const int val = sendnewportmappingrequest (&nat->natpmp, NATPMP_PROTOCOL_UDP, private_port, private_port, LIFETIME_SECS);
     241        logVal ("sendnewportmappingrequest", val);
     242        nat->state = val < 0 ? TR_NATPMP_ERR : TR_NATPMP_RECV_UDP_MAP;
     243        setCommandTime (nat);
    227244    }
    228245
     246    if (nat->state == TR_NATPMP_RECV_UDP_MAP)
     247    {
     248        natpmpresp_t resp;
     249        const int    val = readnatpmpresponseorretry (&nat->natpmp, &resp);
     250        logVal ("readnatpmpresponseorretry", val);
     251        if (val >= 0)
     252        {
     253            nat->state = TR_NATPMP_IDLE;
     254            tr_ninf (getKey (), _("UDP Port %d forwarded successfully"), nat->private_port);
     255        }
     256        else if (val != NATPMP_TRYAGAIN)
     257        {
     258            nat->state = TR_NATPMP_ERR;
     259        }
     260    }   
     261
    229262    switch (nat->state)
    230263    {
    231264        case TR_NATPMP_IDLE:
     
    239272        case TR_NATPMP_RECV_PUB:
    240273        case TR_NATPMP_SEND_MAP:
    241274        case TR_NATPMP_RECV_MAP:
     275                case TR_NATPMP_SEND_UDP_MAP:
     276        case TR_NATPMP_RECV_UDP_MAP:
    242277            ret = TR_PORT_MAPPING; break;
    243278
    244279        case TR_NATPMP_SEND_UNMAP: