Ignore:
Timestamp:
Mar 8, 2007 6:58:04 PM (17 years ago)
Author:
bennylp
Message:

A really initial implementation on STUN server

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjlib-util/src/pjstun-srv-test/bind_usage.c

    r1040 r1049  
    2626                             const pj_sockaddr_t *src_addr, 
    2727                             unsigned src_addr_len); 
     28static void usage_on_destroy(pj_stun_usage *usage); 
    2829static pj_status_t sess_on_send_msg(pj_stun_session *sess, 
    2930                                    const void *pkt, 
     
    3839                                      unsigned src_addr_len); 
    3940 
     41struct bind_usage 
     42{ 
     43    pj_pool_t       *pool; 
     44    pj_stun_usage   *usage; 
     45    pj_stun_session *session; 
     46}; 
     47 
     48 
    4049PJ_DEF(pj_status_t) pj_stun_bind_usage_create(pj_stun_server *srv, 
    4150                                              const pj_str_t *ip_addr, 
     
    4352                                              pj_stun_usage **p_bu) 
    4453{ 
     54    pj_pool_t *pool; 
     55    struct bind_usage *bu; 
    4556    pj_stun_server_info *si; 
    46     pj_stun_session *session; 
    47     pj_stun_usage *usage; 
    4857    pj_stun_usage_cb usage_cb; 
    4958    pj_stun_session_cb sess_cb; 
     
    5362    si = pj_stun_server_get_info(srv); 
    5463 
     64    pool = pj_pool_create(si->pf, "bind%p", 128, 128, NULL); 
     65    bu = PJ_POOL_ZALLOC_T(pool, struct bind_usage); 
     66    bu->pool = pool; 
     67 
    5568    status = pj_sockaddr_in_init(&local_addr, ip_addr, (pj_uint16_t)port); 
    5669    if (status != PJ_SUCCESS) 
     
    5972    pj_bzero(&usage_cb, sizeof(usage_cb)); 
    6073    usage_cb.on_rx_data = &usage_on_rx_data; 
     74    usage_cb.on_destroy = &usage_on_destroy; 
    6175 
    6276    status = pj_stun_usage_create(srv, "bind%p", &usage_cb, 
    6377                                  PJ_AF_INET, PJ_SOCK_DGRAM, 0, 
    6478                                  &local_addr, sizeof(local_addr), 
    65                                   &usage); 
    66     if (status != PJ_SUCCESS) 
    67         return status; 
     79                                  &bu->usage); 
     80    if (status != PJ_SUCCESS) { 
     81        pj_pool_release(pool); 
     82        return status; 
     83    } 
    6884 
    6985    pj_bzero(&sess_cb, sizeof(sess_cb)); 
     
    7187    sess_cb.on_rx_request = &sess_on_rx_request; 
    7288    status = pj_stun_session_create(si->endpt, "bind%p", &sess_cb, PJ_FALSE, 
    73                                     &session); 
    74     if (status != PJ_SUCCESS) { 
    75         pj_stun_usage_destroy(usage); 
    76         return status; 
    77     } 
    78  
    79     pj_stun_usage_set_user_data(usage, session); 
    80     pj_stun_session_set_user_data(session, usage); 
    81  
    82     *p_bu = usage; 
     89                                    &bu->session); 
     90    if (status != PJ_SUCCESS) { 
     91        pj_stun_usage_destroy(bu->usage); 
     92        return status; 
     93    } 
     94 
     95    pj_stun_usage_set_user_data(bu->usage, bu); 
     96    pj_stun_session_set_user_data(bu->session, bu); 
     97 
     98    if (p_bu) 
     99        *p_bu = bu->usage; 
    83100 
    84101    return PJ_SUCCESS; 
     
    92109                             unsigned src_addr_len) 
    93110{ 
     111    struct bind_usage *bu; 
    94112    pj_stun_session *session; 
    95113    pj_status_t status; 
    96114 
    97     session = (pj_stun_session*) pj_stun_usage_get_user_data(usage); 
     115    bu = (struct bind_usage*) pj_stun_usage_get_user_data(usage); 
     116    session = bu->session; 
    98117 
    99118    /* Handle packet to session */ 
     
    114133                                    unsigned addr_len) 
    115134{ 
     135    struct bind_usage *bu; 
    116136    pj_stun_usage *usage; 
    117137 
    118     usage = pj_stun_session_get_user_data(sess); 
     138    bu = (struct bind_usage*) pj_stun_session_get_user_data(sess); 
     139    usage = bu->usage; 
    119140 
    120141    return pj_stun_usage_sendto(usage, pkt, pkt_size, 0, 
     
    156177        status =  
    157178            pj_stun_msg_add_ip_addr_attr(tdata->pool, tdata->msg, 
    158                                          PJ_STUN_ATTR_XOR_MAPPED_ADDRESS, 
     179                                         PJ_STUN_ATTR_XOR_MAPPED_ADDR, 
    159180                                         PJ_TRUE, 
    160181                                         src_addr, src_addr_len); 
     
    173194} 
    174195 
     196static void usage_on_destroy(pj_stun_usage *usage) 
     197{ 
     198    struct bind_usage *bu; 
     199 
     200    bu = (struct bind_usage*) pj_stun_usage_get_user_data(usage); 
     201    if (bu==NULL) 
     202        return; 
     203 
     204    pj_stun_session_destroy(bu->session); 
     205    pj_pool_release(bu->pool); 
     206} 
Note: See TracChangeset for help on using the changeset viewer.