Ignore:
Timestamp:
Jun 28, 2006 4:46:49 PM (18 years ago)
Author:
bennylp
Message:

Major improvements in PJSIP to support TCP. The changes fall into these categories: (1) the TCP transport implementation itself (*.[hc]), (2) bug-fix in SIP transaction when using reliable transports, (3) support for TCP transport in PJSUA-LIB/PJSUA, and (4) changes in PJSIP-TEST to support TCP testing.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_core.c

    r509 r563  
    730730    /* Find empty transport slot */ 
    731731    for (id=0; id < PJ_ARRAY_SIZE(pjsua_var.tpdata); ++id) { 
    732         if (pjsua_var.tpdata[id].tp == NULL) 
     732        if (pjsua_var.tpdata[id].data.ptr == NULL) 
    733733            break; 
    734734    } 
     
    742742    /* Create the transport */ 
    743743    if (type == PJSIP_TRANSPORT_UDP) { 
    744  
     744        /* 
     745         * Create UDP transport. 
     746         */ 
    745747        pjsua_transport_config config; 
    746748        pj_sock_t sock = PJ_INVALID_SOCKET; 
     
    774776        } 
    775777 
     778 
     779        /* Save the transport */ 
     780        pjsua_var.tpdata[id].type = type; 
     781        pjsua_var.tpdata[id].local_name = tp->local_name; 
     782        pjsua_var.tpdata[id].data.tp = tp; 
     783 
     784    } else if (type == PJSIP_TRANSPORT_TCP) { 
     785        /* 
     786         * Create TCP transport. 
     787         */ 
     788        pjsua_transport_config config; 
     789        pjsip_tpfactory *tcp; 
     790        pj_sockaddr_in local_addr; 
     791 
     792        /* Supply default config if it's not specified */ 
     793        if (cfg == NULL) { 
     794            pjsua_transport_config_default(&config); 
     795            cfg = &config; 
     796        } 
     797 
     798        /* Init local address */ 
     799        pj_sockaddr_in_init(&local_addr, 0, 0); 
     800 
     801        if (cfg->port) 
     802            local_addr.sin_port = pj_htons((pj_uint16_t)cfg->port); 
     803 
     804        if (cfg->ip_addr.s_addr) 
     805            local_addr.sin_addr.s_addr = cfg->ip_addr.s_addr; 
     806 
     807        /* Create the TCP transport */ 
     808        status = pjsip_tcp_transport_start(pjsua_var.endpt, &local_addr, 1, 
     809                                           &tcp); 
     810 
     811        if (status != PJ_SUCCESS) { 
     812            pjsua_perror(THIS_FILE, "Error creating SIP TCP listener",  
     813                         status); 
     814            goto on_return; 
     815        } 
     816 
     817        /* Save the transport */ 
     818        pjsua_var.tpdata[id].type = type; 
     819        pjsua_var.tpdata[id].local_name = tcp->addr_name; 
     820        pjsua_var.tpdata[id].data.factory = tcp; 
     821 
    776822    } else { 
    777823        status = PJSIP_EUNSUPTRANSPORT; 
     
    780826    } 
    781827 
    782     /* Save the transport */ 
    783     pjsua_var.tpdata[id].tp = tp; 
    784828 
    785829    /* Return the ID */ 
     
    808852    /* Find empty transport slot */ 
    809853    for (id=0; id < PJ_ARRAY_SIZE(pjsua_var.tpdata); ++id) { 
    810         if (pjsua_var.tpdata[id].tp == NULL) 
     854        if (pjsua_var.tpdata[id].data.ptr == NULL) 
    811855            break; 
    812856    } 
     
    819863 
    820864    /* Save the transport */ 
    821     pjsua_var.tpdata[id].tp = tp; 
     865    pjsua_var.tpdata[id].type = tp->key.type; 
     866    pjsua_var.tpdata[id].local_name = tp->local_name; 
     867    pjsua_var.tpdata[id].data.tp = tp; 
    822868 
    823869    /* Return the ID */ 
     
    843889         ++i)  
    844890    { 
    845         if (!pjsua_var.tpdata[i].tp) 
     891        if (!pjsua_var.tpdata[i].data.ptr) 
    846892            continue; 
    847893 
     
    863909                                              pjsua_transport_info *info) 
    864910{ 
    865     pjsip_transport *tp; 
     911    struct transport_data *t = &pjsua_var.tpdata[id]; 
    866912 
    867913    pj_memset(info, 0, sizeof(*info)); 
     
    871917 
    872918    /* Make sure that transport exists */ 
    873     PJ_ASSERT_RETURN(pjsua_var.tpdata[id].tp != NULL, PJ_EINVAL); 
     919    PJ_ASSERT_RETURN(pjsua_var.tpdata[id].data.ptr != NULL, PJ_EINVAL); 
    874920 
    875921    PJSUA_LOCK(); 
    876922 
    877     tp = pjsua_var.tpdata[id].tp; 
    878     if (tp == NULL) { 
    879         PJSUA_UNLOCK(); 
    880         return PJ_EINVALIDOP; 
    881     } 
     923    if (pjsua_var.tpdata[id].type == PJSIP_TRANSPORT_UDP) { 
     924 
     925        pjsip_transport *tp = t->data.tp; 
     926 
     927        if (tp == NULL) { 
     928            PJSUA_UNLOCK(); 
     929            return PJ_EINVALIDOP; 
     930        } 
    882931     
    883     info->id = id; 
    884     info->type = tp->key.type; 
    885     info->type_name = pj_str(tp->type_name); 
    886     info->info = pj_str(tp->info); 
    887     info->flag = tp->flag; 
    888     info->addr_len = tp->addr_len; 
    889     info->local_addr = tp->local_addr; 
    890     info->local_name = tp->local_name; 
    891     info->usage_count = pj_atomic_get(tp->ref_cnt); 
     932        info->id = id; 
     933        info->type = tp->key.type; 
     934        info->type_name = pj_str(tp->type_name); 
     935        info->info = pj_str(tp->info); 
     936        info->flag = tp->flag; 
     937        info->addr_len = tp->addr_len; 
     938        info->local_addr = tp->local_addr; 
     939        info->local_name = tp->local_name; 
     940        info->usage_count = pj_atomic_get(tp->ref_cnt); 
     941 
     942    } else if (pjsua_var.tpdata[id].type == PJSIP_TRANSPORT_TCP) { 
     943 
     944        pjsip_tpfactory *factory = t->data.factory; 
     945 
     946        if (factory == NULL) { 
     947            PJSUA_UNLOCK(); 
     948            return PJ_EINVALIDOP; 
     949        } 
     950     
     951        info->id = id; 
     952        info->type = t->type; 
     953        info->type_name = pj_str("TCP"); 
     954        info->info = pj_str("TCP transport"); 
     955        info->flag = factory->flag; 
     956        info->addr_len = sizeof(factory->local_addr); 
     957        info->local_addr = factory->local_addr; 
     958        info->local_name = factory->addr_name; 
     959        info->usage_count = 0; 
     960 
     961    } 
     962 
    892963 
    893964    PJSUA_UNLOCK(); 
     
    907978 
    908979    /* Make sure that transport exists */ 
    909     PJ_ASSERT_RETURN(pjsua_var.tpdata[id].tp != NULL, PJ_EINVAL); 
     980    PJ_ASSERT_RETURN(pjsua_var.tpdata[id].data.ptr != NULL, PJ_EINVAL); 
    910981 
    911982 
     
    927998 
    928999    /* Make sure that transport exists */ 
    929     PJ_ASSERT_RETURN(pjsua_var.tpdata[id].tp != NULL, PJ_EINVAL); 
     1000    PJ_ASSERT_RETURN(pjsua_var.tpdata[id].data.ptr != NULL, PJ_EINVAL); 
    9301001 
    9311002 
Note: See TracChangeset for help on using the changeset viewer.