diff options
author | Benny Prijono <bennylp@teluu.com> | 2009-10-25 09:02:07 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2009-10-25 09:02:07 +0000 |
commit | fdc0f2ecdb18b9176f87f55ee17f054ce107e8c7 (patch) | |
tree | 768b9507e60426fcabcc8b4ce2540ae727cf7ffa /pjsip/src/pjsua-lib | |
parent | 2053af19e76b9c13e8bdebb13669cf915dc49981 (diff) |
Initial commit for ticket #950: QoS support:
- implementation:
- PJLIB (sock_qos*.*)
- added QoS support in:
- SIP UDP transport,
- SIP TCP transport,
- media UDP transport (done in pjsua-lib),
- pjnath ICE stream transport,
- pjnath STUN socket,
- pjnath TURN client
- added QoS options in pjsua-lib:
- QoS fields in pjsua_transport_config
- added "--set-qos" parameter in pjsua
Notes:
- QoS in TLS transport is not yet implemented, waiting for #957
- build ok on VS6, VS2005 (multiple targets), Carbide, and Mingw
- no run-time testing yet
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2966 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/pjsua-lib')
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_core.c | 46 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_media.c | 30 |
2 files changed, 54 insertions, 22 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c index 773785ed..0e390763 100644 --- a/pjsip/src/pjsua-lib/pjsua_core.c +++ b/pjsip/src/pjsua-lib/pjsua_core.c @@ -1526,12 +1526,12 @@ static const char *addr_string(const pj_sockaddr_t *addr) * address via STUN, depending on config). */ static pj_status_t create_sip_udp_sock(int af, - const pj_str_t *bind_param, - int port, + const pjsua_transport_config *cfg, pj_sock_t *p_sock, pj_sockaddr *p_pub_addr) { char stun_ip_addr[PJ_INET6_ADDRSTRLEN]; + unsigned port = cfg->port; pj_str_t stun_srv; pj_sock_t sock; pj_sockaddr bind_addr; @@ -1545,8 +1545,8 @@ static pj_status_t create_sip_udp_sock(int af, } /* Initialize bound address */ - if (bind_param->slen) { - status = pj_sockaddr_init(af, &bind_addr, bind_param, + if (cfg->bound_addr.slen) { + status = pj_sockaddr_init(af, &bind_addr, &cfg->bound_addr, (pj_uint16_t)port); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, @@ -1558,12 +1558,19 @@ static pj_status_t create_sip_udp_sock(int af, pj_sockaddr_init(af, &bind_addr, NULL, (pj_uint16_t)port); } + /* Create socket */ status = pj_sock_socket(af, pj_SOCK_DGRAM(), 0, &sock); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "socket() error", status); return status; } + /* Apply QoS, if specified */ + status = pj_sock_apply_qos2(sock, cfg->qos_type, + &cfg->qos_params, + 2, THIS_FILE, "SIP UDP socket"); + + /* Bind socket */ status = pj_sock_bind(sock, &bind_addr, pj_sockaddr_get_len(&bind_addr)); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "bind() error", status); @@ -1711,8 +1718,7 @@ PJ_DEF(pj_status_t) pjsua_transport_create( pjsip_transport_type_e type, * (only when public address is not specified). */ status = create_sip_udp_sock(pjsip_transport_type_get_af(type), - &cfg->bound_addr, cfg->port, - &sock, &pub_addr); + cfg, &sock, &pub_addr); if (status != PJ_SUCCESS) goto on_return; @@ -1743,9 +1749,10 @@ PJ_DEF(pj_status_t) pjsua_transport_create( pjsip_transport_type_e type, * Create TCP transport. */ pjsua_transport_config config; - pjsip_host_port a_name; pjsip_tpfactory *tcp; - pj_sockaddr_in local_addr; + pjsip_tcp_transport_cfg tcp_cfg; + + pjsip_tcp_transport_cfg_default(&tcp_cfg, pj_AF_INET()); /* Supply default config if it's not specified */ if (cfg == NULL) { @@ -1753,14 +1760,14 @@ PJ_DEF(pj_status_t) pjsua_transport_create( pjsip_transport_type_e type, cfg = &config; } - /* Init local address */ - pj_sockaddr_in_init(&local_addr, 0, 0); - + /* Configure bind address */ if (cfg->port) - local_addr.sin_port = pj_htons((pj_uint16_t)cfg->port); + pj_sockaddr_set_port(&tcp_cfg.bind_addr, (pj_uint16_t)cfg->port); if (cfg->bound_addr.slen) { - status = pj_sockaddr_in_set_str_addr(&local_addr,&cfg->bound_addr); + status = pj_sockaddr_set_str_addr(tcp_cfg.af, + &tcp_cfg.bind_addr, + &cfg->bound_addr); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Unable to resolve transport bound address", @@ -1769,14 +1776,17 @@ PJ_DEF(pj_status_t) pjsua_transport_create( pjsip_transport_type_e type, } } - /* Init published name */ - pj_bzero(&a_name, sizeof(pjsip_host_port)); + /* Set published name */ if (cfg->public_addr.slen) - a_name.host = cfg->public_addr; + tcp_cfg.addr_name.host = cfg->public_addr; + + /* Copy the QoS settings */ + tcp_cfg.qos_type = cfg->qos_type; + pj_memcpy(&tcp_cfg.qos_params, &cfg->qos_params, + sizeof(cfg->qos_params)); /* Create the TCP transport */ - status = pjsip_tcp_transport_start2(pjsua_var.endpt, &local_addr, - &a_name, 1, &tcp); + status = pjsip_tcp_transport_start3(pjsua_var.endpt, &tcp_cfg, &tcp); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Error creating SIP TCP listener", diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c index fff917ba..06d12779 100644 --- a/pjsip/src/pjsua-lib/pjsua_media.c +++ b/pjsip/src/pjsua-lib/pjsua_media.c @@ -384,13 +384,19 @@ static pj_status_t create_rtp_rtcp_sock(const pjsua_transport_config *cfg, /* Loop retry to bind RTP and RTCP sockets. */ for (i=0; i<RTP_RETRY; ++i, next_rtp_port += 2) { - /* Create and bind RTP socket. */ + /* Create RTP socket. */ status = pj_sock_socket(pj_AF_INET(), pj_SOCK_DGRAM(), 0, &sock[0]); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "socket() error", status); return status; } + /* Apply QoS to RTP socket, if specified */ + status = pj_sock_apply_qos2(sock[0], cfg->qos_type, + &cfg->qos_params, + 2, THIS_FILE, "RTP socket"); + + /* Bind RTP socket */ status=pj_sock_bind_in(sock[0], pj_ntohl(bound_addr.sin_addr.s_addr), next_rtp_port); if (status != PJ_SUCCESS) { @@ -399,7 +405,7 @@ static pj_status_t create_rtp_rtcp_sock(const pjsua_transport_config *cfg, continue; } - /* Create and bind RTCP socket. */ + /* Create RTCP socket. */ status = pj_sock_socket(pj_AF_INET(), pj_SOCK_DGRAM(), 0, &sock[1]); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "socket() error", status); @@ -407,6 +413,12 @@ static pj_status_t create_rtp_rtcp_sock(const pjsua_transport_config *cfg, return status; } + /* Apply QoS to RTCP socket, if specified */ + status = pj_sock_apply_qos2(sock[1], cfg->qos_type, + &cfg->qos_params, + 2, THIS_FILE, "RTCP socket"); + + /* Bind RTCP socket */ status=pj_sock_bind_in(sock[1], pj_ntohl(bound_addr.sin_addr.s_addr), (pj_uint16_t)(next_rtp_port+1)); if (status != PJ_SUCCESS) { @@ -881,7 +893,7 @@ static pj_status_t parse_host_port(const pj_str_t *host_port, } /* Create ICE media transports (when ice is enabled) */ -static pj_status_t create_ice_media_transports(void) +static pj_status_t create_ice_media_transports(pjsua_transport_config *cfg) { char stunip[PJ_INET6_ADDRSTRLEN]; pj_ice_strans_cfg ice_cfg; @@ -915,6 +927,11 @@ static pj_status_t create_ice_media_transports(void) if (pjsua_var.media_cfg.ice_max_host_cands >= 0) ice_cfg.stun.max_host_cands = pjsua_var.media_cfg.ice_max_host_cands; + /* Copy QoS setting to STUN setting */ + ice_cfg.stun.cfg.qos_type = cfg->qos_type; + pj_memcpy(&ice_cfg.stun.cfg.qos_params, &cfg->qos_params, + sizeof(cfg->qos_params)); + /* Configure TURN settings */ if (pjsua_var.media_cfg.enable_turn) { status = parse_host_port(&pjsua_var.media_cfg.turn_server, @@ -930,6 +947,11 @@ static pj_status_t create_ice_media_transports(void) pj_memcpy(&ice_cfg.turn.auth_cred, &pjsua_var.media_cfg.turn_auth_cred, sizeof(ice_cfg.turn.auth_cred)); + + /* Copy QoS setting to TURN setting */ + ice_cfg.turn.cfg.qos_type = cfg->qos_type; + pj_memcpy(&ice_cfg.turn.cfg.qos_params, &cfg->qos_params, + sizeof(cfg->qos_params)); } /* Create each media transport */ @@ -1025,7 +1047,7 @@ PJ_DEF(pj_status_t) pjsua_media_transports_create( /* Create the transports */ if (pjsua_var.media_cfg.enable_ice) { - status = create_ice_media_transports(); + status = create_ice_media_transports(&cfg); } else { status = create_udp_media_transports(&cfg); } |