Ignore:
Timestamp:
Mar 1, 2007 12:08:27 AM (17 years ago)
Author:
bennylp
Message:

More work on STUN session framework

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjlib-util/src/pjlib-util/stun_msg.c

    r1003 r1021  
    518518                                    int attr_type, 
    519519                                    pj_bool_t xor_ed, 
     520                                    const pj_sockaddr_t *addr, 
    520521                                    unsigned addr_len, 
    521                                     const pj_sockaddr_t *addr, 
    522522                                    pj_stun_generic_ip_addr_attr **p_attr) 
    523523{ 
     
    560560                                     int attr_type,  
    561561                                     pj_bool_t xor_ed, 
    562                                      unsigned addr_len, 
    563                                      const pj_sockaddr_t *addr) 
     562                                     const pj_sockaddr_t *addr, 
     563                                     unsigned addr_len) 
    564564{ 
    565565    pj_stun_generic_ip_addr_attr *attr; 
     
    567567 
    568568    status = pj_stun_generic_ip_addr_attr_create(pool, attr_type, xor_ed, 
    569                                                  addr_len, addr, &attr); 
     569                                                 addr, addr_len, &attr); 
    570570    if (status != PJ_SUCCESS) 
    571571        return status; 
     
    14351435PJ_INLINE(pj_uint16_t) GET_VAL16(const pj_uint8_t *pdu, unsigned pos) 
    14361436{ 
    1437     pj_uint16_t val = (pj_uint16_t) ((pdu[pos] << 8) + pdu[pos+1]); 
    1438     return pj_ntohs(val); 
     1437    return (pj_uint16_t) ((pdu[pos] << 8) + pdu[pos+1]); 
    14391438} 
    14401439 
    14411440PJ_INLINE(pj_uint32_t) GET_VAL32(const pj_uint8_t *pdu, unsigned pos) 
    14421441{ 
    1443     pj_uint32_t val = (pdu[pos+0] << 24) + 
    1444                       (pdu[pos+1] << 16) + 
    1445                       (pdu[pos+2] <<  8) + 
    1446                       (pdu[pos+3]); 
    1447     return pj_ntohl(val); 
     1442    return (pdu[pos+0] << 24) + 
     1443           (pdu[pos+1] << 16) + 
     1444           (pdu[pos+2] <<  8) + 
     1445           (pdu[pos+3]); 
    14481446} 
    14491447 
     
    14661464        return PJLIB_UTIL_ESTUNINMSGTYPE; 
    14671465 
     1466    /* Check the PDU length */ 
     1467    msg_len = GET_VAL16(pdu, 2); 
     1468    if ((msg_len + 20 > pdu_len) ||  
     1469        ((options & PJ_STUN_IS_DATAGRAM) && msg_len + 20 != pdu_len)) 
     1470    { 
     1471        return PJLIB_UTIL_ESTUNINMSGLEN; 
     1472    } 
     1473 
    14681474    /* If magic is set, then there is great possibility that this is 
    14691475     * a STUN message. 
    14701476     */ 
    1471     if (GET_VAL32(pdu, 4) != PJ_STUN_MAGIC) 
    1472         return PJLIB_UTIL_ESTUNNOTMAGIC; 
    1473  
    1474     /* Check the PDU length */ 
    1475     msg_len = GET_VAL16(pdu, 2); 
    1476     if ((msg_len > pdu_len) ||  
    1477         ((options & PJ_STUN_IS_DATAGRAM) && msg_len != pdu_len)) 
    1478     { 
    1479         return PJLIB_UTIL_ESTUNINMSGLEN; 
    1480     } 
    1481  
    1482     /* Check if FINGERPRINT attribute is present */ 
    1483     if (GET_VAL16(pdu, msg_len + 20) == PJ_STUN_ATTR_FINGERPRINT) { 
    1484         pj_uint16_t attr_len = GET_VAL16(pdu, msg_len + 22); 
    1485         pj_uint32_t fingerprint = GET_VAL32(pdu, msg_len + 24); 
    1486         pj_uint32_t crc; 
    1487  
    1488         if (attr_len != 4) 
    1489             return PJLIB_UTIL_ESTUNINATTRLEN; 
    1490  
    1491         crc = pj_crc32_calc(pdu, msg_len + 20); 
    1492         crc ^= STUN_XOR_FINGERPRINT; 
    1493  
    1494         if (crc != fingerprint) 
    1495             return PJLIB_UTIL_ESTUNFINGERPRINT; 
     1477    if (GET_VAL32(pdu, 4) == PJ_STUN_MAGIC) { 
     1478 
     1479        /* Check if FINGERPRINT attribute is present */ 
     1480        if (GET_VAL16(pdu, msg_len + 20) == PJ_STUN_ATTR_FINGERPRINT) { 
     1481            pj_uint16_t attr_len = GET_VAL16(pdu, msg_len + 22); 
     1482            pj_uint32_t fingerprint = GET_VAL32(pdu, msg_len + 24); 
     1483            pj_uint32_t crc; 
     1484 
     1485            if (attr_len != 4) 
     1486                return PJLIB_UTIL_ESTUNINATTRLEN; 
     1487 
     1488            crc = pj_crc32_calc(pdu, msg_len + 20); 
     1489            crc ^= STUN_XOR_FINGERPRINT; 
     1490 
     1491            if (crc != fingerprint) 
     1492                return PJLIB_UTIL_ESTUNFINGERPRINT; 
     1493        } 
    14961494    } 
    14971495 
     
    18201818 * Print the message structure to a buffer. 
    18211819 */ 
    1822 PJ_DEF(pj_status_t) pj_stun_msg_encode(const pj_stun_msg *msg, 
     1820PJ_DEF(pj_status_t) pj_stun_msg_encode(pj_stun_msg *msg, 
    18231821                                       pj_uint8_t *buf, unsigned buf_size, 
    18241822                                       unsigned options, 
     
    18341832    unsigned printed; 
    18351833    pj_status_t status; 
    1836     unsigned i, length; 
     1834    unsigned i; 
    18371835 
    18381836 
     
    18991897     */ 
    19001898    if (amsg_integrity && afingerprint) { 
    1901         length = (pj_uint16_t)((buf - start) - 20 + 24 + 8); 
     1899        msg->hdr.length = (pj_uint16_t)((buf - start) - 20 + 24 + 8); 
    19021900    } else if (amsg_integrity) { 
    1903         length = (pj_uint16_t)((buf - start) - 20 + 24); 
     1901        msg->hdr.length = (pj_uint16_t)((buf - start) - 20 + 24); 
    19041902    } else if (afingerprint) { 
    1905         length = (pj_uint16_t)((buf - start) - 20 + 8); 
     1903        msg->hdr.length = (pj_uint16_t)((buf - start) - 20 + 8); 
    19061904    } else { 
    1907         length = (pj_uint16_t)((buf - start) - 20); 
     1905        msg->hdr.length = (pj_uint16_t)((buf - start) - 20); 
    19081906    } 
    19091907 
    19101908    /* hdr->length = pj_htons(length); */ 
    1911     *(buf+2) = (pj_uint8_t)((length >> 8) & 0x00FF); 
    1912     *(buf+3) = (pj_uint8_t)(length & 0x00FF); 
     1909    start[2] = (pj_uint8_t)((msg->hdr.length >> 8) & 0x00FF); 
     1910    start[3] = (pj_uint8_t)(msg->hdr.length & 0x00FF); 
    19131911 
    19141912    /* Calculate message integrity, if present */ 
     
    20892087        *p_response = NULL; 
    20902088 
    2091     if (PJ_STUN_IS_REQUEST(msg->hdr.type)) 
     2089    if (!PJ_STUN_IS_REQUEST(msg->hdr.type)) 
    20922090        p_response = NULL; 
    20932091 
Note: See TracChangeset for help on using the changeset viewer.