PJ_DEF(pj_status_t) pjstun_get_mapped_addr( pj_pool_factory *pf, int sock_cnt, pj_sock_t sock[], const pj_str_t *srv1, int port1, const pj_str_t *srv2, int port2, pj_sockaddr_in mapped_addr[]) { pjstun_setting opt; pj_bzero(&opt, sizeof(opt)); opt.use_stun2 = PJ_FALSE; opt.srv1 = *srv1; opt.port1 = port1; opt.srv2 = *srv2; opt.port2 = port2; return pjstun_get_mapped_addr2(pf, &opt, sock_cnt, sock, mapped_addr); }
void SipTransportBroker::findLocalAddressFromSTUN(pjsip_transport *transport, pj_str_t *stunServerName, int stunPort, std::string &addr, pj_uint16_t &port) const { // Initialize the sip port with the default SIP port port = DEFAULT_SIP_PORT; // Initialize the sip address with the hostname const pj_str_t *pjMachineName = pj_gethostname(); addr = std::string(pjMachineName->ptr, pjMachineName->slen); // Update address and port with active transport RETURN_IF_NULL(transport, "Transport is NULL in findLocalAddress, using local address %s:%d", addr.c_str(), port); IpAddr mapped_addr; pj_sock_t sipSocket = pjsip_udp_transport_get_socket(transport); const pjstun_setting stunOpt = {PJ_TRUE, *stunServerName, stunPort, *stunServerName, stunPort}; const pj_status_t stunStatus = pjstun_get_mapped_addr2(&cp_.factory, &stunOpt, 1, &sipSocket, &static_cast<pj_sockaddr_in&>(mapped_addr)); switch (stunStatus) { case PJLIB_UTIL_ESTUNNOTRESPOND: ERROR("No response from STUN server %.*s", stunServerName->slen, stunServerName->ptr); return; case PJLIB_UTIL_ESTUNSYMMETRIC: ERROR("Different mapped addresses are returned by servers."); return; case PJ_SUCCESS: port = mapped_addr.getPort(); addr = mapped_addr.toString(); default: break; } WARN("Using address %s provided by STUN server %.*s", IpAddr(mapped_addr).toString(true).c_str(), stunServerName->slen, stunServerName->ptr); }