Ignore:
Timestamp:
Aug 22, 2008 5:46:33 PM (16 years ago)
Author:
bennylp
Message:

Ticket #598: Update to draft-ietf-behave-rfc3489bis-18 and draft-ietf-behave-turn-09, and fix other things as well. Please see the ticket for more info

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjnath/src/pjnath/turn_session.c

    r2090 r2234  
    915915PJ_DEF(pj_status_t) pj_turn_session_on_rx_pkt(pj_turn_session *sess, 
    916916                                              void *pkt, 
    917                                               unsigned pkt_len) 
     917                                              unsigned pkt_len, 
     918                                              unsigned *parsed_len) 
    918919{ 
    919920    pj_bool_t is_stun; 
     
    941942            options |= PJ_STUN_IS_DATAGRAM; 
    942943        status=pj_stun_session_on_rx_pkt(sess->stun, pkt, pkt_len, 
    943                                          options, NULL, NULL, 
     944                                         options, NULL, parsed_len, 
    944945                                         sess->srv_addr, 
    945946                                         pj_sockaddr_get_len(sess->srv_addr)); 
    946947 
    947     } else if (sess->cb.on_rx_data) { 
    948  
    949         /* This must be ChannelData. Only makes sense when on_rx_data() is 
    950          * implemented by application. 
    951          */ 
     948    } else { 
     949        /* This must be ChannelData. */ 
    952950        pj_turn_channel_data cd; 
    953951        struct peer *peer; 
    954952 
    955         PJ_ASSERT_RETURN(pkt_len >= 4, PJ_ETOOSMALL); 
    956  
    957         /* Lookup peer */ 
     953        if (pkt_len < 4) { 
     954            if (parsed_len) *parsed_len = 0; 
     955            return PJ_ETOOSMALL; 
     956        } 
     957 
     958        /* Decode ChannelData packet */ 
    958959        pj_memcpy(&cd, pkt, sizeof(pj_turn_channel_data)); 
    959960        cd.ch_number = pj_ntohs(cd.ch_number); 
    960961        cd.length = pj_ntohs(cd.length); 
     962 
     963        /* Check that size is sane */ 
     964        if (pkt_len < cd.length+sizeof(cd)) { 
     965            if (parsed_len) { 
     966                if (is_datagram) { 
     967                    /* Discard the datagram */ 
     968                    *parsed_len = pkt_len; 
     969                } else { 
     970                    /* Insufficient fragment */ 
     971                    *parsed_len = 0; 
     972                } 
     973            } 
     974            status = PJ_ETOOSMALL; 
     975            goto on_return; 
     976        } else { 
     977            if (parsed_len) { 
     978                *parsed_len = cd.length + sizeof(cd); 
     979            } 
     980        } 
     981 
     982        /* Lookup peer */ 
    961983        peer = lookup_peer_by_chnum(sess, cd.ch_number); 
    962984        if (!peer || !peer->bound) { 
     
    965987        } 
    966988 
    967         /* Check that size is correct, for UDP */ 
    968         if (pkt_len < cd.length+sizeof(cd)) { 
    969             status = PJ_ETOOSMALL; 
    970             goto on_return; 
    971         } 
    972  
    973989        /* Notify application */ 
    974         (*sess->cb.on_rx_data)(sess, ((pj_uint8_t*)pkt)+sizeof(cd),  
    975                                cd.length, &peer->addr, 
    976                                pj_sockaddr_get_len(&peer->addr)); 
    977  
    978         status = PJ_SUCCESS; 
    979  
    980     } else { 
    981         /* This is ChannelData and application doesn't implement 
    982          * on_rx_data() callback. Just ignore the packet. 
    983          */ 
     990        if (sess->cb.on_rx_data) { 
     991            (*sess->cb.on_rx_data)(sess, ((pj_uint8_t*)pkt)+sizeof(cd),  
     992                                   cd.length, &peer->addr, 
     993                                   pj_sockaddr_get_len(&peer->addr)); 
     994        } 
     995 
    984996        status = PJ_SUCCESS; 
    985997    } 
     
    10781090{ 
    10791091    const pj_stun_lifetime_attr *lf_attr; 
    1080     const pj_stun_relay_addr_attr *raddr_attr; 
     1092    const pj_stun_relayed_addr_attr *raddr_attr; 
    10811093    const pj_stun_sockaddr_attr *mapped_attr; 
    10821094    pj_str_t s; 
     
    11261138     * address family. 
    11271139     */ 
    1128     raddr_attr = (const pj_stun_relay_addr_attr*) 
    1129                  pj_stun_msg_find_attr(msg, PJ_STUN_ATTR_RELAY_ADDR, 0); 
     1140    raddr_attr = (const pj_stun_relayed_addr_attr*) 
     1141                 pj_stun_msg_find_attr(msg, PJ_STUN_ATTR_RELAYED_ADDR, 0); 
    11301142    if (raddr_attr == NULL && method==PJ_STUN_ALLOCATE_METHOD) { 
    11311143        on_session_fail(sess, method, PJNATH_EINSTUNMSG, 
     
    13421354    pj_turn_session *sess; 
    13431355    pj_stun_peer_addr_attr *peer_attr; 
     1356    pj_stun_icmp_attr *icmp; 
    13441357    pj_stun_data_attr *data_attr; 
    13451358 
     
    13571370                  pj_stun_get_method_name(msg->hdr.type))); 
    13581371        return PJ_EINVALIDOP; 
     1372    } 
     1373 
     1374    /* Check if there is ICMP attribute in the message */ 
     1375    icmp = (pj_stun_icmp_attr*) 
     1376           pj_stun_msg_find_attr(msg, PJ_STUN_ATTR_ICMP, 0); 
     1377    if (icmp != NULL) { 
     1378        /* This is a forwarded ICMP packet. Ignore it for now */ 
     1379        return PJ_SUCCESS; 
    13591380    } 
    13601381 
Note: See TracChangeset for help on using the changeset viewer.