Ignore:
Timestamp:
Dec 1, 2007 8:59:25 AM (16 years ago)
Author:
bennylp
Message:

Ticket #421: initial IPv6 support: UDP transport

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip/sip_transport.c

    r1536 r1602  
    9494struct transport_names_t 
    9595{ 
    96     pjsip_transport_type_e type; 
    97     pj_uint16_t            port; 
    98     pj_str_t               name; 
    99     unsigned               flag; 
    100     char                   name_buf[16]; 
     96    pjsip_transport_type_e type;            /* Transport type       */ 
     97    pj_uint16_t            port;            /* Default port number  */ 
     98    pj_str_t               name;            /* Id tag               */ 
     99    const char            *description;     /* Longer description   */ 
     100    unsigned               flag;            /* Flags                */ 
     101    char                   name_buf[16];    /* For user's transport */ 
    101102} transport_names[16] =  
    102103{ 
    103     { PJSIP_TRANSPORT_UNSPECIFIED, 0, {"Unspecified", 11}, 0}, 
    104     { PJSIP_TRANSPORT_UDP, 5060, {"UDP", 3}, PJSIP_TRANSPORT_DATAGRAM}, 
    105     { PJSIP_TRANSPORT_TCP, 5060, {"TCP", 3}, PJSIP_TRANSPORT_RELIABLE}, 
    106     { PJSIP_TRANSPORT_TLS, 5061, {"TLS", 3}, PJSIP_TRANSPORT_RELIABLE | PJSIP_TRANSPORT_SECURE}, 
    107     { PJSIP_TRANSPORT_SCTP, 5060, {"SCTP", 4}, PJSIP_TRANSPORT_RELIABLE}, 
    108     { PJSIP_TRANSPORT_LOOP, 15060, {"LOOP", 4}, PJSIP_TRANSPORT_RELIABLE},  
    109     { PJSIP_TRANSPORT_LOOP_DGRAM, 15060, {"LOOP-DGRAM", 10}, PJSIP_TRANSPORT_DATAGRAM}, 
     104    {  
     105        PJSIP_TRANSPORT_UNSPECIFIED,  
     106        0,  
     107        {"Unspecified", 11},  
     108        "Unspecified",  
     109        0 
     110    }, 
     111    {  
     112        PJSIP_TRANSPORT_UDP,  
     113        5060,  
     114        {"UDP", 3},  
     115        "UDP transport",  
     116        PJSIP_TRANSPORT_DATAGRAM 
     117    }, 
     118    {  
     119        PJSIP_TRANSPORT_TCP,  
     120        5060,  
     121        {"TCP", 3},  
     122        "TCP transport",  
     123        PJSIP_TRANSPORT_RELIABLE 
     124    }, 
     125    {  
     126        PJSIP_TRANSPORT_TLS,  
     127        5061,  
     128        {"TLS", 3},  
     129        "TLS transport",  
     130        PJSIP_TRANSPORT_RELIABLE | PJSIP_TRANSPORT_SECURE 
     131    }, 
     132    {  
     133        PJSIP_TRANSPORT_SCTP,  
     134        5060,  
     135        {"SCTP", 4},  
     136        "SCTP transport",  
     137        PJSIP_TRANSPORT_RELIABLE 
     138    }, 
     139    {  
     140        PJSIP_TRANSPORT_LOOP,  
     141        15060,  
     142        {"LOOP", 4},  
     143        "Loopback transport",  
     144        PJSIP_TRANSPORT_RELIABLE 
     145    },  
     146    {  
     147        PJSIP_TRANSPORT_LOOP_DGRAM,  
     148        15060,  
     149        {"LOOP-DGRAM", 10},  
     150        "Loopback datagram transport",  
     151        PJSIP_TRANSPORT_DATAGRAM 
     152    }, 
     153    {  
     154        PJSIP_TRANSPORT_UDP6,  
     155        5060,  
     156        {"UDP", 3},  
     157        "UDP IPv6 transport",  
     158        PJSIP_TRANSPORT_DATAGRAM 
     159    }, 
     160    {  
     161        PJSIP_TRANSPORT_TCP6,  
     162        5060,  
     163        {"TCP", 3},  
     164        "TCP IPv6 transport",  
     165        PJSIP_TRANSPORT_RELIABLE 
     166    }, 
    110167}; 
     168 
     169struct transport_names_t *get_tpname(pjsip_transport_type_e type) 
     170{ 
     171    unsigned i; 
     172    for (i=0; i<PJ_ARRAY_SIZE(transport_names); ++i) { 
     173        if (transport_names[i].type == type) 
     174            return &transport_names[i]; 
     175    } 
     176    pj_assert(!"Invalid transport type!"); 
     177    return NULL; 
     178} 
     179 
     180 
     181/* 
     182 * Tools to get address string. 
     183 */ 
     184static const char *addr_string(const pj_sockaddr_t *addr) 
     185{ 
     186    static char str[PJ_INET6_ADDRSTRLEN]; 
     187    pj_inet_ntop(((const pj_sockaddr*)addr)->addr.sa_family,  
     188                 pj_sockaddr_get_addr(addr), 
     189                 str, sizeof(str)); 
     190    return str; 
     191} 
    111192 
    112193 
     
    154235    unsigned i; 
    155236 
    156     /* Sanity check.  
    157      * Check that transport_names[] are indexed on transport type.  
    158      */ 
    159     PJ_ASSERT_RETURN(transport_names[PJSIP_TRANSPORT_UDP].type == 
    160                      PJSIP_TRANSPORT_UDP, PJSIP_TRANSPORT_UNSPECIFIED); 
    161  
    162237    if (name->slen == 0) 
    163238        return PJSIP_TRANSPORT_UNSPECIFIED; 
     
    182257    unsigned i; 
    183258 
    184     /* Sanity check.  
    185      * Check that transport_names[] are indexed on transport type.  
    186      */ 
    187     PJ_ASSERT_RETURN(transport_names[PJSIP_TRANSPORT_UDP].type == 
    188                      PJSIP_TRANSPORT_UDP, PJSIP_TRANSPORT_UNSPECIFIED); 
    189  
    190259    /* Get the transport type for the specified flags. */ 
    191260    for (i=0; i<PJ_ARRAY_SIZE(transport_names); ++i) { 
     
    199268} 
    200269 
     270/* 
     271 * Get the socket address family of a given transport type. 
     272 */ 
     273PJ_DEF(int) pjsip_transport_type_get_af(pjsip_transport_type_e type) 
     274{ 
     275    if (type | PJSIP_TRANSPORT_IPV6) 
     276        return pj_AF_INET6(); 
     277    else 
     278        return pj_AF_INET(); 
     279} 
     280 
    201281PJ_DEF(unsigned) pjsip_transport_get_flag_from_type(pjsip_transport_type_e type) 
    202282{ 
    203     /* Sanity check.  
    204      * Check that transport_names[] are indexed on transport type.  
    205      */ 
    206     PJ_ASSERT_RETURN(transport_names[PJSIP_TRANSPORT_UDP].type == 
    207                      PJSIP_TRANSPORT_UDP, 0); 
    208  
    209     /* Check that argument is valid. */ 
    210     PJ_ASSERT_RETURN((unsigned)type < PJ_ARRAY_SIZE(transport_names), 0); 
    211  
    212283    /* Return transport flag. */ 
    213     return transport_names[type].flag; 
     284    return get_tpname(type)->flag; 
    214285} 
    215286 
     
    219290PJ_DEF(int) pjsip_transport_get_default_port_for_type(pjsip_transport_type_e type) 
    220291{ 
    221     /* Sanity check.  
    222      * Check that transport_names[] are indexed on transport type.  
    223      */ 
    224     PJ_ASSERT_RETURN(transport_names[PJSIP_TRANSPORT_UDP].type == 
    225                      PJSIP_TRANSPORT_UDP, 0); 
    226  
    227     /* Check that argument is valid. */ 
    228     PJ_ASSERT_RETURN((unsigned)type < PJ_ARRAY_SIZE(transport_names), 5060); 
    229  
    230292    /* Return the port. */ 
    231     return transport_names[type].port; 
     293    return get_tpname(type)->port; 
    232294} 
    233295 
     
    237299PJ_DEF(const char*) pjsip_transport_get_type_name(pjsip_transport_type_e type) 
    238300{ 
    239     /* Sanity check.  
    240      * Check that transport_names[] are indexed on transport type.  
    241      */ 
    242     PJ_ASSERT_RETURN(transport_names[PJSIP_TRANSPORT_UDP].type == 
    243                      PJSIP_TRANSPORT_UDP, "Unknown"); 
    244  
    245     /* Check that argument is valid. */ 
    246     PJ_ASSERT_RETURN((unsigned)type<PJ_ARRAY_SIZE(transport_names), "Unknown"); 
    247  
    248     /* Return the port. */ 
    249     return transport_names[type].name.ptr; 
     301    /* Return the name. */ 
     302    return get_tpname(type)->name.ptr; 
     303} 
     304 
     305/* 
     306 * Get transport description. 
     307 */ 
     308PJ_DEF(const char*) pjsip_transport_get_type_desc(pjsip_transport_type_e type) 
     309{ 
     310    /* Return the description. */ 
     311    return get_tpname(type)->description; 
    250312} 
    251313 
     
    557619    pj_memcpy(&tdata->tp_info.dst_addr, addr, addr_len); 
    558620    tdata->tp_info.dst_addr_len = addr_len; 
    559     if (((pj_sockaddr*)addr)->addr.sa_family == pj_AF_INET()) { 
    560         const char *str_addr; 
    561         str_addr = pj_inet_ntoa(((pj_sockaddr_in*)addr)->sin_addr); 
    562         pj_ansi_strcpy(tdata->tp_info.dst_name, str_addr); 
    563         tdata->tp_info.dst_port = pj_ntohs(((pj_sockaddr_in*)addr)->sin_port); 
    564     } else { 
    565         pj_ansi_strcpy(tdata->tp_info.dst_name, "<unknown>"); 
    566         tdata->tp_info.dst_port = 0; 
    567     } 
     621 
     622    pj_inet_ntop(((pj_sockaddr*)addr)->addr.sa_family, 
     623                 pj_sockaddr_get_addr(addr), 
     624                 tdata->tp_info.dst_name, 
     625                 sizeof(tdata->tp_info.dst_name)); 
     626    tdata->tp_info.dst_port = pj_sockaddr_get_port(addr); 
    568627 
    569628    /* Distribute to modules.  
     
    804863                       tp->obj_name, 
    805864                       pjsip_transport_get_type_name(tp->key.type), 
    806                        pj_inet_ntoa(((pj_sockaddr_in*)&tp->key.rem_addr)->sin_addr), 
    807                        pj_ntohs(((pj_sockaddr_in*)&tp->key.rem_addr)->sin_port))); 
     865                       addr_string(&tp->key.rem_addr), 
     866                       pj_sockaddr_get_port(&tp->key.rem_addr))); 
    808867 
    809868    return PJ_SUCCESS; 
     
    10551114    } else if ((flag & PJSIP_TRANSPORT_DATAGRAM) != 0) { 
    10561115         
    1057         pj_sockaddr_in remote; 
     1116        pj_sockaddr remote; 
     1117        int addr_len; 
    10581118        pjsip_transport *tp; 
    10591119 
    1060         pj_sockaddr_in_init(&remote, NULL, 0); 
     1120        pj_bzero(&remote, sizeof(remote)); 
     1121        if (type & PJSIP_TRANSPORT_IPV6) { 
     1122            addr_len = sizeof(pj_sockaddr_in6); 
     1123            remote.addr.sa_family = pj_AF_INET6(); 
     1124        } else { 
     1125            addr_len = sizeof(pj_sockaddr_in); 
     1126            remote.addr.sa_family = pj_AF_INET(); 
     1127        } 
     1128 
    10611129        status = pjsip_tpmgr_acquire_transport(tpmgr, type, &remote, 
    1062                                                sizeof(remote), NULL, &tp); 
     1130                                               addr_len, NULL, &tp); 
    10631131 
    10641132        if (status == PJ_SUCCESS) { 
     
    13821450    TRACE_((THIS_FILE,"Acquiring transport type=%s, remote=%s:%d", 
    13831451                       pjsip_transport_get_type_name(type), 
    1384                        pj_inet_ntoa(((pj_sockaddr_in*)remote)->sin_addr), 
    1385                        pj_ntohs(((pj_sockaddr_in*)remote)->sin_port))); 
     1452                       addr_string(remote), 
     1453                       pj_sockaddr_get_port(remote))); 
    13861454 
    13871455    pj_lock_acquire(mgr->lock); 
     
    14631531                     type == PJSIP_TRANSPORT_LOOP_DGRAM) 
    14641532            { 
    1465                 pj_sockaddr_in *addr = (pj_sockaddr_in*)&key.rem_addr; 
    1466  
    1467                 pj_bzero(addr, sizeof(pj_sockaddr_in)); 
    1468                 key_len = sizeof(key.type) + sizeof(pj_sockaddr_in); 
     1533                pj_sockaddr *addr = &key.rem_addr; 
     1534 
     1535                pj_bzero(addr, addr_len); 
     1536                key_len = sizeof(key.type) + addr_len; 
    14691537                transport = (pjsip_transport*)  
    14701538                            pj_hash_get(mgr->table, &key, key_len, NULL); 
    14711539            } 
    1472             /* For datagram INET transports, try lookup with zero address. 
     1540            /* For datagram transports, try lookup with zero address. 
    14731541             */ 
    1474             else if ((flag & PJSIP_TRANSPORT_DATAGRAM) &&  
    1475                      (remote_addr->addr.sa_family == pj_AF_INET()))  
     1542            else if (flag & PJSIP_TRANSPORT_DATAGRAM) 
    14761543            { 
    1477                 pj_sockaddr_in *addr = (pj_sockaddr_in*)&key.rem_addr; 
    1478  
    1479                 pj_bzero(addr, sizeof(pj_sockaddr_in)); 
    1480                 addr->sin_family = pj_AF_INET(); 
    1481  
    1482                 key_len = sizeof(key.type) + sizeof(pj_sockaddr_in); 
     1544                pj_sockaddr *addr = &key.rem_addr; 
     1545 
     1546                pj_bzero(addr, addr_len); 
     1547                addr->addr.sa_family = remote_addr->addr.sa_family; 
     1548 
     1549                key_len = sizeof(key.type) + addr_len; 
    14831550                transport = (pjsip_transport*) 
    14841551                            pj_hash_get(mgr->table, &key, key_len, NULL); 
Note: See TracChangeset for help on using the changeset viewer.