Ignore:
Timestamp:
Nov 18, 2005 10:43:42 PM (17 years ago)
Author:
bennylp
Message:

The BIG transport modifications

File:
1 edited

Legend:

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

    r51 r54  
    3333#include <pj/assert.h> 
    3434#include <pj/errno.h> 
    35  
     35#include <pj/lock.h> 
    3636 
    3737#define PJSIP_EX_NO_MEMORY  PJ_NO_MEMORY_EXCEPTION 
     
    6464 
    6565    /** Transport manager. */ 
    66     pjsip_transport_mgr *transport_mgr; 
     66    pjsip_tpmgr         *transport_mgr; 
     67 
     68    /** Ioqueue. */ 
     69    pj_ioqueue_t        *ioqueue; 
    6770 
    6871    /** DNS Resolver. */ 
     
    9699 * Prototypes. 
    97100 */ 
    98 static void endpt_transport_callback( pjsip_endpoint *, pjsip_rx_data *rdata ); 
     101static void endpt_transport_callback(pjsip_endpoint*,  
     102                                     pj_status_t, pjsip_rx_data*); 
    99103 
    100104 
     
    355359    pjsip_endpoint *endpt; 
    356360    pjsip_max_forwards_hdr *mf_hdr; 
     361    pj_lock_t *lock = NULL; 
    357362 
    358363    PJ_LOG(5, (THIS_FILE, "pjsip_endpt_create()")); 
     
    399404    } 
    400405 
     406    /* Set recursive lock for the timer heap. */ 
     407    status = pj_lock_create_recursive_mutex( endpt->pool, "edpt%p", &lock); 
     408    if (status != PJ_SUCCESS) { 
     409        goto on_error; 
     410    } 
     411    pj_timer_heap_set_lock(endpt->timer_heap, lock, PJ_TRUE); 
     412 
     413    /* Set maximum timed out entries to process in a single poll. */ 
     414    pj_timer_heap_set_max_timed_out_per_poll(endpt->timer_heap,  
     415                                             PJSIP_MAX_TIMED_OUT_ENTRIES); 
     416 
     417    /* Create ioqueue. */ 
     418    status = pj_ioqueue_create( endpt->pool, PJSIP_MAX_TRANSPORTS, &endpt->ioqueue); 
     419    if (status != PJ_SUCCESS) { 
     420        goto on_error; 
     421    } 
     422 
    401423    /* Create transport manager. */ 
    402     status = pjsip_transport_mgr_create( endpt->pool, 
    403                                          endpt, 
    404                                         &endpt_transport_callback, 
    405                                         &endpt->transport_mgr); 
     424    status = pjsip_tpmgr_create( endpt->pool, endpt, 
     425                                 endpt->ioqueue, endpt->timer_heap, 
     426                                &endpt_transport_callback, 
     427                                &endpt->transport_mgr); 
    406428    if (status != PJ_SUCCESS) { 
    407429        goto on_error; 
     
    446468on_error: 
    447469    if (endpt->transport_mgr) { 
    448         pjsip_transport_mgr_destroy(endpt->transport_mgr); 
     470        pjsip_tpmgr_destroy(endpt->transport_mgr); 
    449471        endpt->transport_mgr = NULL; 
    450472    } 
     
    471493 
    472494    /* Shutdown and destroy all transports. */ 
    473     pjsip_transport_mgr_destroy(endpt->transport_mgr); 
     495    pjsip_tpmgr_destroy(endpt->transport_mgr); 
    474496 
    475497    /* Delete endpoint mutex. */ 
     
    533555                                        const pj_time_val *max_timeout) 
    534556{ 
    535     pj_time_val timeout; 
    536     int i; 
     557    /* timeout is 'out' var. This just to make compiler happy. */ 
     558    pj_time_val timeout = { 0, 0}; 
    537559 
    538560    PJ_LOG(5, (THIS_FILE, "pjsip_endpt_handle_events()")); 
    539561 
    540562    /* Poll the timer. The timer heap has its own mutex for better  
    541      * granularity, so we don't need to lock end endpoint. We also keep 
    542      * polling the timer while we have events. 
     563     * granularity, so we don't need to lock end endpoint.  
    543564     */ 
    544     timeout.sec = timeout.msec = 0; /* timeout is 'out' var. This just to make compiler happy. */ 
    545     for (i=0; i<10; ++i) { 
    546         if (pj_timer_heap_poll( endpt->timer_heap, &timeout ) < 1) 
    547             break; 
    548     } 
     565    timeout.sec = timeout.msec = 0; 
     566    pj_timer_heap_poll( endpt->timer_heap, &timeout ); 
    549567 
    550568    /* If caller specifies maximum time to wait, then compare the value with 
     
    555573    } 
    556574 
    557     /* Poll events in the transport manager. */ 
    558     pjsip_transport_mgr_handle_events( endpt->transport_mgr, &timeout); 
     575    /* Poll ioqueue. */ 
     576    pj_ioqueue_poll( endpt->ioqueue, &timeout); 
    559577} 
    560578 
     
    659677{ 
    660678    pjsip_role_e role; 
    661     if (rdata->msg->type == PJSIP_REQUEST_MSG) { 
     679    if (rdata->msg_info.msg->type == PJSIP_REQUEST_MSG) { 
    662680        role = PJSIP_ROLE_UAS; 
    663681    } else { 
    664682        role = PJSIP_ROLE_UAC; 
    665683    } 
    666     pjsip_tsx_create_key(rdata->pool, &rdata->key, role, 
    667                          &rdata->cseq->method, rdata); 
     684    pjsip_tsx_create_key(rdata->tp_info.pool, &rdata->endpt_info.key, role, 
     685                         &rdata->msg_info.cseq->method, rdata); 
    668686} 
    669687 
     
    673691 */ 
    674692static void endpt_transport_callback( pjsip_endpoint *endpt, 
     693                                      pj_status_t status, 
    675694                                      pjsip_rx_data *rdata ) 
    676695{ 
    677     pjsip_msg *msg = rdata->msg; 
     696    pjsip_msg *msg = rdata->msg_info.msg; 
    678697    pjsip_transaction *tsx; 
    679698    pj_bool_t a_new_transaction_just_been_created = PJ_FALSE; 
    680699 
    681700    PJ_LOG(5, (THIS_FILE, "endpt_transport_callback(rdata=%p)", rdata)); 
     701 
     702    if (status != PJ_SUCCESS) { 
     703        const char *src_addr = pj_inet_ntoa(rdata->pkt_info.addr.sin_addr); 
     704        int port = pj_ntohs(rdata->pkt_info.addr.sin_port); 
     705        PJSIP_ENDPT_LOG_ERROR((endpt, "transport", status, 
     706                               "Src.addr=%s:%d, packet:--\n" 
     707                               "%s\n" 
     708                               "-- end of packet. Error", 
     709                               src_addr, port, rdata->msg_info.msg_buf)); 
     710        return; 
     711    } 
    682712 
    683713    /* For response, check that the value in Via sent-by match the transport. 
     
    688718        const pj_sockaddr_in *addr; 
    689719        const char *addr_addr; 
    690         int port = rdata->via->sent_by.port; 
     720        int port = rdata->msg_info.via->sent_by.port; 
    691721        pj_bool_t mismatch = PJ_FALSE; 
    692722        if (port == 0) { 
    693723            int type; 
    694             type = pjsip_transport_get_type(rdata->transport); 
     724            type = rdata->tp_info.transport->type; 
    695725            port = pjsip_transport_get_default_port_for_type(type); 
    696726        } 
    697         addr = pjsip_transport_get_addr_name(rdata->transport); 
     727        addr = &rdata->tp_info.transport->public_addr; 
    698728        addr_addr = pj_inet_ntoa(addr->sin_addr); 
    699         if (pj_strcmp2(&rdata->via->sent_by.host, addr_addr) != 0) 
     729        if (pj_strcmp2(&rdata->msg_info.via->sent_by.host, addr_addr) != 0) 
    700730            mismatch = PJ_TRUE; 
    701731        else if (port != pj_ntohs(addr->sin_port)) { 
     
    707737             * both the port in sent-by and rport. We try to be lenient here! 
    708738             */ 
    709             if (rdata->via->rport_param != pj_sockaddr_in_get_port(addr)) 
     739            if (rdata->msg_info.via->rport_param != pj_sockaddr_in_get_port(addr)) 
    710740                mismatch = PJ_TRUE; 
    711741            else { 
     
    730760    /* Find the transaction for the received message. */ 
    731761    PJ_LOG(5, (THIS_FILE, "finding tsx with key=%.*s",  
    732                          rdata->key.slen, rdata->key.ptr)); 
     762                         rdata->endpt_info.key.slen, rdata->endpt_info.key.ptr)); 
    733763 
    734764    /* Start lock mutex in the endpoint. */ 
     
    736766 
    737767    /* Find the transaction in the hash table. */ 
    738     tsx = pj_hash_get( endpt->tsx_table, rdata->key.ptr, rdata->key.slen ); 
     768    tsx = pj_hash_get( endpt->tsx_table, rdata->endpt_info.key.ptr, rdata->endpt_info.key.slen ); 
    739769 
    740770    /* Unlock mutex. */ 
     
    753783            /* Inform TU about the 200 message, only if it's INVITE. */ 
    754784            if (PJSIP_IS_STATUS_IN_CLASS(msg->line.status.code, 200) && 
    755                 rdata->cseq->method.id == PJSIP_INVITE_METHOD)  
     785                rdata->msg_info.cseq->method.id == PJSIP_INVITE_METHOD)  
    756786            { 
    757787                pjsip_event e; 
     
    777807         * For non-ACK request message, create a new transaction. 
    778808         */ 
    779         } else if (rdata->msg->line.req.method.id != PJSIP_ACK_METHOD) { 
     809        } else if (rdata->msg_info.msg->line.req.method.id != PJSIP_ACK_METHOD) { 
    780810 
    781811            pj_status_t status; 
     
    806836        pjsip_tsx_on_rx_msg( tsx, rdata ); 
    807837 
    808     } else if (rdata->msg->line.req.method.id == PJSIP_ACK_METHOD) { 
     838    } else if (rdata->msg_info.msg->line.req.method.id == PJSIP_ACK_METHOD) { 
    809839        /* 
    810840         * This is an ACK message, but the INVITE transaction could not 
     
    915945 * Find/create transport. 
    916946 */ 
    917 PJ_DEF(void) pjsip_endpt_get_transport( pjsip_endpoint *endpt, 
    918                                         pj_pool_t *pool, 
    919                                         pjsip_transport_type_e type, 
    920                                         const pj_sockaddr_in *remote, 
    921                                         void *token, 
    922                                         pjsip_transport_completion_callback *cb) 
    923 { 
    924     PJ_LOG(5, (THIS_FILE, "pjsip_endpt_get_transport()")); 
    925     pjsip_transport_get( endpt->transport_mgr, pool, type, 
    926                          remote, token, cb); 
    927 } 
    928  
    929  
    930 PJ_DEF(pj_status_t) pjsip_endpt_create_listener( pjsip_endpoint *endpt, 
    931                                                  pjsip_transport_type_e type, 
    932                                                  pj_sockaddr_in *addr, 
    933                                                  const pj_sockaddr_in *addr_name) 
    934 { 
    935     PJ_LOG(5, (THIS_FILE, "pjsip_endpt_create_listener()")); 
    936     return pjsip_create_listener( endpt->transport_mgr, type, addr, addr_name ); 
    937 } 
    938  
    939 PJ_DEF(pj_status_t) pjsip_endpt_create_udp_listener( pjsip_endpoint *endpt, 
    940                                                      pj_sock_t sock, 
    941                                                      const pj_sockaddr_in *addr_name) 
    942 { 
    943     PJ_LOG(5, (THIS_FILE, "pjsip_endpt_create_udp_listener()")); 
    944     return pjsip_create_udp_listener( endpt->transport_mgr, sock, addr_name ); 
    945 } 
     947PJ_DECL(pj_status_t) pjsip_endpt_alloc_transport( pjsip_endpoint *endpt, 
     948                                                  pjsip_transport_type_e type, 
     949                                                  const pj_sockaddr_in *remote, 
     950                                                  pjsip_transport **p_transport) 
     951{ 
     952    PJ_LOG(5, (THIS_FILE, "pjsip_endpt_alloc_transport()")); 
     953    return pjsip_tpmgr_alloc_transport( endpt->transport_mgr, type, remote, 
     954                                        p_transport); 
     955} 
     956 
    946957 
    947958PJ_DEF(void) pjsip_endpt_dump( pjsip_endpoint *endpt, pj_bool_t detail ) 
     
    949960#if PJ_LOG_MAX_LEVEL >= 3 
    950961    unsigned count; 
    951     pj_hash_iterator_t itr_val; 
    952     pj_hash_iterator_t *itr; 
    953962 
    954963    PJ_LOG(5, (THIS_FILE, "pjsip_endpt_dump()")); 
     
    10151024 
    10161025    /* Transports.  
    1017      * Note: transport is not properly locked in this function. 
    1018      *       See pjsip_transport_first, pjsip_transport_next. 
    10191026     */ 
    1020     itr = pjsip_transport_first( endpt->transport_mgr, &itr_val ); 
    1021     if (itr) { 
    1022         PJ_LOG(3, (THIS_FILE, " Dumping transports:")); 
    1023  
    1024         do { 
    1025             char src_addr[128], dst_addr[128]; 
    1026             int src_port, dst_port; 
    1027             const pj_sockaddr_in *addr; 
    1028             pjsip_transport_t *t; 
    1029  
    1030             t = pjsip_transport_this(endpt->transport_mgr, itr); 
    1031             addr = pjsip_transport_get_local_addr(t); 
    1032             pj_native_strcpy(src_addr, pj_inet_ntoa(addr->sin_addr)); 
    1033             src_port = pj_ntohs(addr->sin_port); 
    1034  
    1035             addr = pjsip_transport_get_remote_addr(t); 
    1036             pj_native_strcpy(dst_addr, pj_inet_ntoa(addr->sin_addr)); 
    1037             dst_port = pj_ntohs(addr->sin_port); 
    1038  
    1039             PJ_LOG(3, (THIS_FILE, "  %s %s %s:%d --> %s:%d (refcnt=%d)",  
    1040                        pjsip_transport_get_type_name(t), 
    1041                        pjsip_transport_get_obj_name(t), 
    1042                        src_addr, src_port, 
    1043                        dst_addr, dst_port, 
    1044                        pjsip_transport_get_ref_cnt(t))); 
    1045  
    1046             itr = pjsip_transport_next(endpt->transport_mgr, itr); 
    1047         } while (itr); 
    1048     } 
     1027    pjsip_tpmgr_dump_transports( endpt->transport_mgr ); 
    10491028 
    10501029    /* Timer. */ 
Note: See TracChangeset for help on using the changeset viewer.