summaryrefslogtreecommitdiff
path: root/pjsip/src/pjsip/sip_transport_udp.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjsip/src/pjsip/sip_transport_udp.c')
-rw-r--r--pjsip/src/pjsip/sip_transport_udp.c126
1 files changed, 82 insertions, 44 deletions
diff --git a/pjsip/src/pjsip/sip_transport_udp.c b/pjsip/src/pjsip/sip_transport_udp.c
index 9c87fb84..499cbeac 100644
--- a/pjsip/src/pjsip/sip_transport_udp.c
+++ b/pjsip/src/pjsip/sip_transport_udp.c
@@ -869,87 +869,125 @@ PJ_DEF(pj_status_t) pjsip_udp_transport_attach2( pjsip_endpoint *endpt,
async_cnt, p_transport);
}
+
/*
- * pjsip_udp_transport_start()
+ * Initialize pjsip_udp_transport_cfg structure with default values.
+ */
+PJ_DEF(void) pjsip_udp_transport_cfg_default(pjsip_udp_transport_cfg *cfg,
+ int af)
+{
+ pj_bzero(cfg, sizeof(*cfg));
+ cfg->af = af;
+ pj_sockaddr_init(cfg->af, &cfg->bind_addr, NULL, 0);
+ cfg->async_cnt = 1;
+}
+
+
+/*
+ * pjsip_udp_transport_start2()
*
* Create a UDP socket in the specified address and start a transport.
*/
-PJ_DEF(pj_status_t) pjsip_udp_transport_start( pjsip_endpoint *endpt,
- const pj_sockaddr_in *local_a,
- const pjsip_host_port *a_name,
- unsigned async_cnt,
- pjsip_transport **p_transport)
+PJ_DEF(pj_status_t) pjsip_udp_transport_start2(
+ pjsip_endpoint *endpt,
+ const pjsip_udp_transport_cfg *cfg,
+ pjsip_transport **p_transport)
{
pj_sock_t sock;
pj_status_t status;
+ pjsip_host_port addr_name;
char addr_buf[PJ_INET6_ADDRSTRLEN];
- pjsip_host_port bound_name;
+ pjsip_transport_type_e transport_type;
+ pj_uint16_t af;
+ int addr_len;
+
+ PJ_ASSERT_RETURN(endpt && cfg && cfg->async_cnt, PJ_EINVAL);
- PJ_ASSERT_RETURN(endpt && async_cnt, PJ_EINVAL);
+ if (cfg->bind_addr.addr.sa_family == pj_AF_INET()) {
+ af = pj_AF_INET();
+ transport_type = PJSIP_TRANSPORT_UDP;
+ addr_len = sizeof(pj_sockaddr_in);
+ } else {
+ af = pj_AF_INET6();
+ transport_type = PJSIP_TRANSPORT_UDP6;
+ addr_len = sizeof(pj_sockaddr_in6);
+ }
- status = create_socket(pj_AF_INET(), local_a, sizeof(pj_sockaddr_in),
- &sock);
+ status = create_socket(af, &cfg->bind_addr, addr_len, &sock);
if (status != PJ_SUCCESS)
return status;
- if (a_name == NULL) {
- /* Address name is not specified.
+ /* Apply QoS, if specified */
+ pj_sock_apply_qos2(sock, cfg->qos_type, &cfg->qos_params,
+ 2, THIS_FILE, "SIP UDP transport");
+
+ /* Apply sockopt, if specified */
+ if (cfg->sockopt_params.cnt)
+ pj_sock_setsockopt_params(sock, &cfg->sockopt_params);
+
+ if (cfg->addr_name.host.slen == 0) {
+ /* Address name is not specified.
* Build a name based on bound address.
*/
- status = get_published_name(sock, addr_buf, sizeof(addr_buf),
- &bound_name);
+ status = get_published_name(sock, addr_buf, sizeof(addr_buf),
+ &addr_name);
if (status != PJ_SUCCESS) {
pj_sock_close(sock);
return status;
}
-
- a_name = &bound_name;
+ } else {
+ addr_name = cfg->addr_name;
}
- return pjsip_udp_transport_attach( endpt, sock, a_name, async_cnt,
- p_transport );
+ return pjsip_udp_transport_attach2(endpt, transport_type, sock,
+ &addr_name, cfg->async_cnt,
+ p_transport);
}
-
/*
* pjsip_udp_transport_start()
*
* Create a UDP socket in the specified address and start a transport.
*/
-PJ_DEF(pj_status_t) pjsip_udp_transport_start6(pjsip_endpoint *endpt,
- const pj_sockaddr_in6 *local_a,
+PJ_DEF(pj_status_t) pjsip_udp_transport_start( pjsip_endpoint *endpt,
+ const pj_sockaddr_in *local_a,
const pjsip_host_port *a_name,
unsigned async_cnt,
pjsip_transport **p_transport)
{
- pj_sock_t sock;
- pj_status_t status;
- char addr_buf[PJ_INET6_ADDRSTRLEN];
- pjsip_host_port bound_name;
+ pjsip_udp_transport_cfg cfg;
- PJ_ASSERT_RETURN(endpt && async_cnt, PJ_EINVAL);
+ pjsip_udp_transport_cfg_default(&cfg, pj_AF_INET());
+ if (local_a)
+ pj_sockaddr_cp(&cfg.bind_addr, local_a);
+ if (a_name)
+ cfg.addr_name = *a_name;
+ cfg.async_cnt = async_cnt;
- status = create_socket(pj_AF_INET6(), local_a, sizeof(pj_sockaddr_in6),
- &sock);
- if (status != PJ_SUCCESS)
- return status;
+ return pjsip_udp_transport_start2(endpt, &cfg, p_transport);
+}
- if (a_name == NULL) {
- /* Address name is not specified.
- * Build a name based on bound address.
- */
- status = get_published_name(sock, addr_buf, sizeof(addr_buf),
- &bound_name);
- if (status != PJ_SUCCESS) {
- pj_sock_close(sock);
- return status;
- }
+/*
+ * pjsip_udp_transport_start()
+ *
+ * Create a UDP socket in the specified address and start a transport.
+ */
+PJ_DEF(pj_status_t) pjsip_udp_transport_start6(pjsip_endpoint *endpt,
+ const pj_sockaddr_in6 *local_a,
+ const pjsip_host_port *a_name,
+ unsigned async_cnt,
+ pjsip_transport **p_transport)
+{
+ pjsip_udp_transport_cfg cfg;
- a_name = &bound_name;
- }
+ pjsip_udp_transport_cfg_default(&cfg, pj_AF_INET6());
+ if (local_a)
+ pj_sockaddr_cp(&cfg.bind_addr, local_a);
+ if (a_name)
+ cfg.addr_name = *a_name;
+ cfg.async_cnt = async_cnt;
- return pjsip_udp_transport_attach2(endpt, PJSIP_TRANSPORT_UDP6,
- sock, a_name, async_cnt, p_transport);
+ return pjsip_udp_transport_start2(endpt, &cfg, p_transport);
}
/*