/* * 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) { pj_sock_t sock; pj_status_t status; char addr_buf[PJ_INET6_ADDRSTRLEN]; pjsip_host_port bound_name; PJ_ASSERT_RETURN(endpt && async_cnt, PJ_EINVAL); status = create_socket(pj_AF_INET6(), local_a, sizeof(pj_sockaddr_in6), &sock); if (status != PJ_SUCCESS) return status; 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; } a_name = &bound_name; } return pjsip_udp_transport_attach2(endpt, PJSIP_TRANSPORT_UDP6, sock, a_name, async_cnt, p_transport); }
/* * pjsip_udp_transport_start2() * * Create a UDP socket in the specified address and start a 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_transport_type_e transport_type; pj_uint16_t af; int addr_len; PJ_ASSERT_RETURN(endpt && cfg && cfg->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(af, &cfg->bind_addr, addr_len, &sock); if (status != PJ_SUCCESS) return status; /* 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), &addr_name); if (status != PJ_SUCCESS) { pj_sock_close(sock); return status; } } else { addr_name = cfg->addr_name; } return pjsip_udp_transport_attach2(endpt, transport_type, sock, &addr_name, cfg->async_cnt, p_transport); }