nsresult NrIceCtx::SetStunServers(const std::vector<NrIceStunServer>& stun_servers) { if (stun_servers.empty()) return NS_OK; ScopedDeleteArray<nr_ice_stun_server> servers( new nr_ice_stun_server[stun_servers.size()]); int r; for (size_t i=0; i < stun_servers.size(); ++i) { r = nr_praddr_to_transport_addr(&stun_servers[i].addr(), &servers[i].addr, 0); if (r) { MOZ_MTLOG(PR_LOG_ERROR, "Couldn't set STUN server for '" << name_ << "'"); return NS_ERROR_FAILURE; } } r = nr_ice_ctx_set_stun_servers(ctx_, servers, stun_servers.size()); if (r) { MOZ_MTLOG(PR_LOG_ERROR, "Couldn't set STUN server for '" << name_ << "'"); return NS_ERROR_FAILURE; } return NS_OK; }
RefPtr<NrIceCtx> NrIceCtxHandler::CreateCtx(const std::string& ufrag, const std::string& pwd, bool hide_non_default) const { RefPtr<NrIceCtx> new_ctx = new NrIceCtx(this->current_ctx->name(), true, // offerer (hardcoded per bwc) this->current_ctx->policy()); if (new_ctx == nullptr) { return nullptr; } if (!new_ctx->Initialize(hide_non_default, ufrag, pwd)) { return nullptr; } // copy the stun, and turn servers from the current context int r = nr_ice_ctx_set_stun_servers(new_ctx->ctx_, this->current_ctx->ctx_->stun_servers, this->current_ctx->ctx_->stun_server_ct); if (r) { MOZ_MTLOG(ML_ERROR, "Error while setting STUN servers in CreateCtx" << " (likely ice restart related)"); return nullptr; } r = nr_ice_ctx_copy_turn_servers(new_ctx->ctx_, this->current_ctx->ctx_->turn_servers, this->current_ctx->ctx_->turn_server_ct); if (r) { MOZ_MTLOG(ML_ERROR, "Error while copying TURN servers in CreateCtx" << " (likely ice restart related)"); return nullptr; } // grab the NrIceResolver stashed in the nr_resolver and allocate another // for the new ctx. Note: there may not be an nr_resolver. if (this->current_ctx->ctx_->resolver) { NrIceResolver* resolver = static_cast<NrIceResolver*>(this->current_ctx->ctx_->resolver->obj); if (!resolver || NS_FAILED(new_ctx->SetResolver(resolver->AllocateResolver()))) { MOZ_MTLOG(ML_ERROR, "Error while setting dns resolver in CreateCtx" << " (likely ice restart related)"); return nullptr; } } return new_ctx; }
nsresult NrIceCtx::SetStunServers(const std::vector<NrIceStunServer>& stun_servers) { if (stun_servers.empty()) return NS_OK; auto servers = MakeUnique<nr_ice_stun_server[]>(stun_servers.size()); for (size_t i=0; i < stun_servers.size(); ++i) { nsresult rv = stun_servers[i].ToNicerStunStruct(&servers[i]); if (NS_FAILED(rv)) { MOZ_MTLOG(ML_ERROR, "Couldn't set STUN server for '" << name_ << "'"); return NS_ERROR_FAILURE; } } int r = nr_ice_ctx_set_stun_servers(ctx_, servers.get(), stun_servers.size()); if (r) { MOZ_MTLOG(ML_ERROR, "Couldn't set STUN server for '" << name_ << "'"); return NS_ERROR_FAILURE; } return NS_OK; }
nsresult NrIceCtx::SetStunServers(const std::vector<NrIceStunServer>& stun_servers) { if (stun_servers.empty()) return NS_OK; ScopedDeleteArray<nr_ice_stun_server> servers( new nr_ice_stun_server[stun_servers.size()]); for (size_t i=0; i < stun_servers.size(); ++i) { nsresult rv = stun_servers[i].ToNicerStruct(&servers[i]); if (NS_FAILED(rv)) { MOZ_MTLOG(PR_LOG_ERROR, "Couldn't set STUN server for '" << name_ << "'"); return NS_ERROR_FAILURE; } } int r = nr_ice_ctx_set_stun_servers(ctx_, servers, stun_servers.size()); if (r) { MOZ_MTLOG(PR_LOG_ERROR, "Couldn't set STUN server for '" << name_ << "'"); return NS_ERROR_FAILURE; } return NS_OK; }