Ignore:
Timestamp:
Apr 9, 2008 9:38:12 AM (16 years ago)
Author:
bennylp
Message:

More ticket #485: huge changeset to support TURN TCP. Please see ticket #485 for the details

File:
1 edited

Legend:

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

    r1882 r1913  
    111111 */ 
    112112static void sess_shutdown(pj_turn_session *sess, 
    113                           pj_bool_t notify, 
    114113                          pj_status_t status); 
    115114static void do_destroy(pj_turn_session *sess); 
    116115static void send_refresh(pj_turn_session *sess, int lifetime); 
    117116static pj_status_t stun_on_send_msg(pj_stun_session *sess, 
     117                                    void *token, 
    118118                                    const void *pkt, 
    119119                                    pj_size_t pkt_size, 
     
    122122static void stun_on_request_complete(pj_stun_session *sess, 
    123123                                     pj_status_t status, 
     124                                     void *token, 
    124125                                     pj_stun_tx_data *tdata, 
    125126                                     const pj_stun_msg *response, 
     
    130131                                         unsigned pkt_len, 
    131132                                         const pj_stun_msg *msg, 
     133                                         void *token, 
    132134                                         const pj_sockaddr_t *src_addr, 
    133135                                         unsigned src_addr_len); 
     
    145147 
    146148 
    147 /** 
     149/* 
     150 * Create default pj_turn_alloc_param. 
     151 */ 
     152PJ_DEF(void) pj_turn_alloc_param_default(pj_turn_alloc_param *prm) 
     153{ 
     154    pj_bzero(prm, sizeof(*prm)); 
     155} 
     156 
     157/* 
     158 * Duplicate pj_turn_alloc_param. 
     159 */ 
     160PJ_DEF(void) pj_turn_alloc_param_copy( pj_pool_t *pool,  
     161                                       pj_turn_alloc_param *dst, 
     162                                       const pj_turn_alloc_param *src) 
     163{ 
     164    PJ_UNUSED_ARG(pool); 
     165    pj_memcpy(dst, src, sizeof(*dst)); 
     166} 
     167 
     168/* 
    148169 * Get TURN state name. 
    149170 */ 
     
    286307    pj_turn_state_t old_state = sess->state; 
    287308 
     309    if (state==sess->state) 
     310        return; 
     311 
    288312    PJ_LOG(4,(sess->obj_name, "State changed %s --> %s", 
    289313              state_names[old_state], state_names[state])); 
     
    299323 */ 
    300324static void sess_shutdown(pj_turn_session *sess, 
    301                           pj_bool_t notify, 
    302325                          pj_status_t status) 
    303326{ 
    304327    pj_bool_t can_destroy = PJ_TRUE; 
    305  
    306     PJ_UNUSED_ARG(notify); 
    307328 
    308329    PJ_LOG(4,(sess->obj_name, "Request to shutdown in state %s, cause:%d", 
     
    361382 * Public API to destroy TURN client session. 
    362383 */ 
    363 PJ_DEF(pj_status_t) pj_turn_session_destroy(pj_turn_session *sess) 
     384PJ_DEF(pj_status_t) pj_turn_session_shutdown(pj_turn_session *sess) 
    364385{ 
    365386    PJ_ASSERT_RETURN(sess, PJ_EINVAL); 
     
    367388    pj_lock_acquire(sess->lock); 
    368389 
    369     sess_shutdown(sess, PJ_FALSE, PJ_SUCCESS); 
     390    sess_shutdown(sess, PJ_SUCCESS); 
    370391 
    371392    pj_lock_release(sess->lock); 
    372393 
     394    return PJ_SUCCESS; 
     395} 
     396 
     397 
     398/** 
     399 * Forcefully destroy the TURN session. 
     400 */ 
     401PJ_DEF(pj_status_t) pj_turn_session_destroy( pj_turn_session *sess) 
     402{ 
     403    set_state(sess, PJ_TURN_STATE_DEALLOCATED); 
     404    sess_shutdown(sess, PJ_SUCCESS); 
    373405    return PJ_SUCCESS; 
    374406} 
     
    465497        } 
    466498 
     499        PJ_LOG(5,(sess->obj_name, "Resolving %.*s%.*s with DNS SRV", 
     500                  (int)res_name.slen, res_name.ptr, 
     501                  (int)domain->slen, domain->ptr)); 
    467502        set_state(sess, PJ_TURN_STATE_RESOLVING); 
     503 
    468504        status = pj_dns_srv_resolve(domain, &res_name, default_port,  
    469505                                    sess->pool, resolver, opt, sess,  
     
    488524        ai = (pj_addrinfo*) 
    489525             pj_pool_calloc(sess->pool, cnt, sizeof(pj_addrinfo)); 
     526 
     527        PJ_LOG(5,(sess->obj_name, "Resolving %.*s with DNS A", 
     528                  (int)domain->slen, domain->ptr)); 
    490529 
    491530        status = pj_getaddrinfo(sess->af, domain, &cnt, ai); 
     
    539578{ 
    540579    pj_stun_tx_data *tdata; 
     580    pj_bool_t retransmit; 
    541581    pj_status_t status; 
    542582 
    543583    PJ_ASSERT_RETURN(sess, PJ_EINVAL); 
    544     PJ_ASSERT_RETURN(sess->state>PJ_TURN_STATE_NULL && sess->state<=PJ_TURN_STATE_RESOLVED,  
     584    PJ_ASSERT_RETURN(sess->state>PJ_TURN_STATE_NULL &&  
     585                     sess->state<=PJ_TURN_STATE_RESOLVED,  
    545586                     PJ_EINVALIDOP); 
    546587 
     
    548589 
    549590    if (sess->state < PJ_TURN_STATE_RESOLVED) { 
    550         if (param && param != &sess->alloc_param) 
    551             pj_memcpy(&sess->alloc_param, param, sizeof(*param)); 
     591        if (param && param != &sess->alloc_param)  
     592            pj_turn_alloc_param_copy(sess->pool, &sess->alloc_param, param); 
    552593        sess->pending_alloc = PJ_TRUE; 
    553594 
     
    595636    /* Send request */ 
    596637    set_state(sess, PJ_TURN_STATE_ALLOCATING); 
    597     status = pj_stun_session_send_msg(sess->stun, PJ_FALSE, sess->srv_addr, 
     638    retransmit = (sess->tp_type == PJ_TURN_TP_UDP); 
     639    status = pj_stun_session_send_msg(sess->stun, NULL, PJ_FALSE,  
     640                                      retransmit, sess->srv_addr, 
    598641                                      pj_sockaddr_get_len(sess->srv_addr),  
    599642                                      tdata); 
     
    637680    } 
    638681 
    639     status = pj_stun_session_send_msg(sess->stun, PJ_FALSE, sess->srv_addr, 
     682    status = pj_stun_session_send_msg(sess->stun, NULL, PJ_FALSE,  
     683                                      (sess->tp_type==PJ_TURN_TP_UDP), 
     684                                      sess->srv_addr, 
    640685                                      pj_sockaddr_get_len(sess->srv_addr),  
    641686                                      tdata); 
     
    648693    if (lifetime == 0) { 
    649694        set_state(sess, PJ_TURN_STATE_DEALLOCATED); 
    650         sess_shutdown(sess, PJ_FALSE, status); 
     695        sess_shutdown(sess, status); 
    651696    } 
    652697} 
     
    725770 
    726771        /* Send the indication */ 
    727         status = pj_stun_session_send_msg(sess->stun, PJ_FALSE, sess->srv_addr, 
     772        status = pj_stun_session_send_msg(sess->stun, NULL, PJ_FALSE,  
     773                                          PJ_FALSE, sess->srv_addr, 
    728774                                          pj_sockaddr_get_len(sess->srv_addr), 
    729775                                          tdata); 
     
    763809    peer = lookup_peer_by_addr(sess, peer_adr, addr_len, PJ_TRUE, PJ_FALSE); 
    764810    pj_assert(peer); 
    765  
    766     /* Associate peer data structure with tdata for future reference 
    767      * when we receive the ChannelBind response. 
    768      */ 
    769     tdata->user_data = peer; 
    770811 
    771812    if (peer->ch_id != PJ_TURN_INVALID_CHANNEL) { 
     
    788829                                  peer_adr, addr_len); 
    789830 
    790     /* Send the request */ 
    791     status = pj_stun_session_send_msg(sess->stun, PJ_FALSE, sess->srv_addr, 
     831    /* Send the request, associate peer data structure with tdata  
     832     * for future reference when we receive the ChannelBind response. 
     833     */ 
     834    status = pj_stun_session_send_msg(sess->stun, peer, PJ_FALSE,  
     835                                      (sess->tp_type==PJ_TURN_TP_UDP), 
     836                                      sess->srv_addr, 
    792837                                      pj_sockaddr_get_len(sess->srv_addr), 
    793838                                      tdata); 
     
    829874            options |= PJ_STUN_IS_DATAGRAM; 
    830875        status=pj_stun_session_on_rx_pkt(sess->stun, pkt, pkt_len, 
    831                                          options, NULL, 
     876                                         options, NULL, NULL, 
    832877                                         sess->srv_addr, 
    833878                                         pj_sockaddr_get_len(sess->srv_addr)); 
     
    883928 */ 
    884929static pj_status_t stun_on_send_msg(pj_stun_session *stun, 
     930                                    void *token, 
    885931                                    const void *pkt, 
    886932                                    pj_size_t pkt_size, 
     
    889935{ 
    890936    pj_turn_session *sess; 
     937 
     938    PJ_UNUSED_ARG(token); 
    891939 
    892940    sess = (pj_turn_session*) pj_stun_session_get_user_data(stun); 
     
    928976 
    929977            set_state(sess, PJ_TURN_STATE_DEALLOCATED); 
    930             sess_shutdown(sess, PJ_TRUE, status); 
     978            sess_shutdown(sess, status); 
    931979            return; 
    932980        } 
     
    937985        if (method==PJ_STUN_REFRESH_METHOD) { 
    938986            set_state(sess, PJ_TURN_STATE_DEALLOCATED); 
    939             sess_shutdown(sess, PJ_TRUE, status); 
     987            sess_shutdown(sess, status); 
    940988            return; 
    941989        } 
     
    9761024    /* If LIFETIME is zero, this is a deallocation */ 
    9771025    if (lf_attr->value == 0) { 
    978         pj_bool_t notify = sess->state < PJ_TURN_STATE_DEALLOCATING; 
    9791026        set_state(sess, PJ_TURN_STATE_DEALLOCATED); 
    980         sess_shutdown(sess, notify, PJ_SUCCESS); 
     1027        sess_shutdown(sess, PJ_SUCCESS); 
    9811028        return; 
    9821029    } 
     
    10691116static void stun_on_request_complete(pj_stun_session *stun, 
    10701117                                     pj_status_t status, 
     1118                                     void *token, 
    10711119                                     pj_stun_tx_data *tdata, 
    10721120                                     const pj_stun_msg *response, 
     
    11461194        { 
    11471195            /* Successful ChannelBind response */ 
    1148             struct peer *peer = (struct peer*)tdata->user_data; 
     1196            struct peer *peer = (struct peer*)token; 
    11491197 
    11501198            pj_assert(peer->ch_id != PJ_TURN_INVALID_CHANNEL); 
     
    11921240                                         unsigned pkt_len, 
    11931241                                         const pj_stun_msg *msg, 
     1242                                         void *token, 
    11941243                                         const pj_sockaddr_t *src_addr, 
    11951244                                         unsigned src_addr_len) 
     
    11991248    pj_stun_data_attr *data_attr; 
    12001249 
     1250    PJ_UNUSED_ARG(token); 
    12011251    PJ_UNUSED_ARG(pkt); 
    12021252    PJ_UNUSED_ARG(pkt_len); 
     
    12541304    /* Check failure */ 
    12551305    if (status != PJ_SUCCESS) { 
    1256         sess_shutdown(sess, PJ_TRUE, status); 
     1306        sess_shutdown(sess, status); 
    12571307        return; 
    12581308    } 
     
    12631313 
    12641314        for (j=0; j<rec->entry[i].server.addr_count && cnt<MAX_SRV_CNT; ++j) { 
    1265             pj_sockaddr_in *addr = &sess->srv_addr[cnt].ipv4; 
     1315            pj_sockaddr_in *addr = &sess->srv_addr_list[cnt].ipv4; 
    12661316 
    12671317            addr->sin_family = sess->af; 
     
    12751325 
    12761326    /* Set current server */ 
    1277     sess->srv_addr = &sess->srv_addr[0]; 
     1327    sess->srv_addr = &sess->srv_addr_list[0]; 
    12781328 
    12791329    /* Set state to PJ_TURN_STATE_RESOLVED */ 
     
    14151465 
    14161466                /* Send the indication */ 
    1417                 pj_stun_session_send_msg(sess->stun, PJ_FALSE, sess->srv_addr, 
    1418                                         pj_sockaddr_get_len(sess->srv_addr), 
    1419                                         tdata); 
     1467                pj_stun_session_send_msg(sess->stun, NULL, PJ_FALSE,  
     1468                                         PJ_FALSE, sess->srv_addr, 
     1469                                         pj_sockaddr_get_len(sess->srv_addr), 
     1470                                         tdata); 
    14201471            } 
    14211472        } 
Note: See TracChangeset for help on using the changeset viewer.