Changeset 5869 for pjproject


Ignore:
Timestamp:
Aug 28, 2018 5:42:25 AM (13 months ago)
Author:
riza
Message:

Close #2141: Add TCP initial receive timeout for server connection.

Location:
pjproject/trunk/pjsip
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/include/pjsip/sip_config.h

    r5812 r5869  
    773773 
    774774/** 
     775 * Initial timeout interval to be applied to incoming transports (i.e. server 
     776 * side) when no data received after a successful connection. Value is in 
     777 * seconds. Disable the timeout by setting it to 0. 
     778 * 
     779 * Note that even when this is disable, the connection might still get closed 
     780 * when it is idle or not referred anymore. Have a look at \a 
     781 * PJSIP_TRANSPORT_SERVER_IDLE_TIME 
     782 * 
     783 * Default: 0 (disabled) 
     784 */ 
     785#ifndef PJSIP_TCP_INITIAL_TIMEOUT 
     786#   define PJSIP_TCP_INITIAL_TIMEOUT        0 
     787#endif 
     788 
     789/** 
    775790 * Set the interval to send keep-alive packet for TLS transports. 
    776791 * If the value is zero, keep-alive will be disabled for TLS. 
  • pjproject/trunk/pjsip/include/pjsip/sip_transport_tcp.h

    r5649 r5869  
    112112     */ 
    113113    pj_sockopt_params   sockopt_params; 
     114 
     115 
     116    /** 
     117     * Intial timeout interval to be applied to incoming transports  
     118     * (i.e. server side) when no data received after a successful connection. 
     119     * 
     120     * Default: PJSIP_TCP_INITIAL_TIMEOUT 
     121     */ 
     122    unsigned            initial_timeout; 
    114123 
    115124} pjsip_tcp_transport_cfg; 
  • pjproject/trunk/pjsip/src/pjsip/sip_transport_tcp.c

    r5833 r5869  
    6464    pj_bool_t                reuse_addr;         
    6565    unsigned                 async_cnt;     
     66    unsigned                 initial_timeout; 
    6667 
    6768    /* Group lock to be used by TCP listener and ioqueue key */ 
     
    124125    /* Group lock to be used by TCP transport and ioqueue key */ 
    125126    pj_grp_lock_t           *grp_lock; 
     127 
     128    /* Initial timer. */ 
     129    pj_timer_entry           initial_timer; 
    126130}; 
    127131 
     
    237241    cfg->async_cnt = 1; 
    238242    cfg->reuse_addr = PJSIP_TCP_TRANSPORT_REUSEADDR; 
     243    cfg->initial_timeout = PJSIP_TCP_INITIAL_TIMEOUT; 
    239244} 
    240245 
     
    392397    listener->reuse_addr = cfg->reuse_addr; 
    393398    listener->async_cnt = cfg->async_cnt; 
     399    listener->initial_timeout = cfg->initial_timeout; 
    394400    pj_memcpy(&listener->qos_params, &cfg->qos_params, 
    395401              sizeof(cfg->qos_params)); 
     
    594600/* TCP keep-alive timer callback */ 
    595601static void tcp_keep_alive_timer(pj_timer_heap_t *th, pj_timer_entry *e); 
     602 
     603/* TCP initial timer callback */ 
     604static void tcp_initial_timer(pj_timer_heap_t *th, pj_timer_entry *e); 
    596605 
    597606/* Clean up TCP resources */ 
     
    715724    pj_strdup(tcp->base.pool, &tcp->ka_pkt, &ka_pkt); 
    716725 
     726    /* Initialize initial timer. */ 
     727    if (is_server && listener->initial_timeout) { 
     728        tcp->initial_timer.user_data = (void*)tcp; 
     729        tcp->initial_timer.cb = &tcp_initial_timer; 
     730 
     731        pj_time_val delay = { 0 }; 
     732        delay.sec = listener->initial_timeout; 
     733        pjsip_endpt_schedule_timer(listener->endpt,  
     734                                    &tcp->initial_timer,  
     735                                    &delay); 
     736        tcp->initial_timer.id = PJ_TRUE; 
     737    } 
     738 
    717739    /* Done setting up basic transport. */ 
    718740    *p_tcp = tcp; 
     
    810832        pjsip_endpt_cancel_timer(tcp->base.endpt, &tcp->ka_timer); 
    811833        tcp->ka_timer.id = PJ_FALSE; 
     834    } 
     835 
     836    /* Stop initial timer. */ 
     837    if (tcp->initial_timer.id) { 
     838        pjsip_endpt_cancel_timer(tcp->base.endpt, &tcp->initial_timer); 
     839        tcp->initial_timer.id = PJ_FALSE; 
    812840    } 
    813841 
     
    13401368    } 
    13411369 
     1370    /* Stop initial timer. */ 
     1371    if (tcp->initial_timer.id) { 
     1372        pjsip_endpt_cancel_timer(tcp->base.endpt, &tcp->initial_timer); 
     1373        tcp->initial_timer.id = PJ_FALSE; 
     1374    } 
     1375 
    13421376    return PJ_SUCCESS; 
    13431377} 
     
    13661400        tcp->is_closing++; 
    13671401        return PJ_FALSE; 
     1402    } 
     1403 
     1404    if (tcp->initial_timer.id) { 
     1405        pjsip_endpt_cancel_timer(tcp->base.endpt, &tcp->initial_timer); 
     1406        tcp->initial_timer.id = PJ_FALSE; 
    13681407    } 
    13691408 
     
    15851624} 
    15861625 
     1626/* Transport keep-alive timer callback */ 
     1627static void tcp_initial_timer(pj_timer_heap_t *th, pj_timer_entry *e) 
     1628{ 
     1629    pj_status_t status = PJ_ETIMEDOUT; 
     1630    struct tcp_transport *tcp = (struct tcp_transport*) e->user_data; 
     1631 
     1632    PJ_UNUSED_ARG(th); 
     1633 
     1634    tcp_init_shutdown(tcp, status); 
     1635} 
    15871636 
    15881637PJ_DEF(pj_sock_t) pjsip_tcp_transport_get_socket(pjsip_transport *transport) 
Note: See TracChangeset for help on using the changeset viewer.