1269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org/* 2269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * 4269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * Use of this source code is governed by a BSD-style license 5269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 6269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 7269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * in the file PATENTS. All contributing project authors may 8269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org */ 10269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 11269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifndef WEBRTC_P2P_BASE_STUNPORT_H_ 12269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#define WEBRTC_P2P_BASE_STUNPORT_H_ 13269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 14269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include <string> 15269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 16269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/p2p/base/port.h" 17269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/p2p/base/stunrequest.h" 18269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/asyncpacketsocket.h" 19269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 20269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// TODO(mallinath) - Rename stunport.cc|h to udpport.cc|h. 21269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgnamespace rtc { 22269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass AsyncResolver; 23269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass SignalThread; 24269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 25269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 26269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgnamespace cricket { 27269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 28269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// Communicates using the address on the outside of a NAT. 29269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass UDPPort : public Port { 30269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org public: 31269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org static UDPPort* Create(rtc::Thread* thread, 32269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::PacketSocketFactory* factory, 33269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::Network* network, 34269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::AsyncPacketSocket* socket, 35269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const std::string& username, 360ba1533fdbe4a098723da8262f1374d71c3a1806pthatcher@webrtc.org const std::string& password, 37fe3bc9d5aeffed8bbfb34c330d8b991abd1a1abaGuo-wei Shieh const std::string& origin, 389af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh bool emit_local_for_anyaddress) { 399af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh UDPPort* port = new UDPPort(thread, factory, network, socket, username, 409af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh password, origin, emit_local_for_anyaddress); 41269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!port->Init()) { 42269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org delete port; 43269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org port = NULL; 44269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 45269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return port; 46269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 47269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 48269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org static UDPPort* Create(rtc::Thread* thread, 49269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::PacketSocketFactory* factory, 50269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::Network* network, 51269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const rtc::IPAddress& ip, 520c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint16_t min_port, 530c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint16_t max_port, 54269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const std::string& username, 550ba1533fdbe4a098723da8262f1374d71c3a1806pthatcher@webrtc.org const std::string& password, 56fe3bc9d5aeffed8bbfb34c330d8b991abd1a1abaGuo-wei Shieh const std::string& origin, 579af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh bool emit_local_for_anyaddress) { 589af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh UDPPort* port = 599af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh new UDPPort(thread, factory, network, ip, min_port, max_port, username, 609af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh password, origin, emit_local_for_anyaddress); 61269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!port->Init()) { 62269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org delete port; 63269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org port = NULL; 64269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 65269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return port; 66269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 670ba1533fdbe4a098723da8262f1374d71c3a1806pthatcher@webrtc.org 68269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual ~UDPPort(); 69269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 70269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::SocketAddress GetLocalAddress() const { 71269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return socket_->GetLocalAddress(); 72269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 73269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 74269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const ServerAddresses& server_addresses() const { 75269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return server_addresses_; 76269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 77269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void 78269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org set_server_addresses(const ServerAddresses& addresses) { 79269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org server_addresses_ = addresses; 80269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 81269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 82269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual void PrepareAddress(); 83269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 84269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual Connection* CreateConnection(const Candidate& address, 85269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org CandidateOrigin origin); 86269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual int SetOption(rtc::Socket::Option opt, int value); 87269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual int GetOption(rtc::Socket::Option opt, int* value); 88269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual int GetError(); 89269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 90269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual bool HandleIncomingPacket( 91269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::AsyncPacketSocket* socket, const char* data, size_t size, 92269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const rtc::SocketAddress& remote_addr, 93269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const rtc::PacketTime& packet_time) { 94269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // All packets given to UDP port will be consumed. 95269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org OnReadPacket(socket, data, size, remote_addr, packet_time); 96269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return true; 97269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 98f9945b2d1aa2d78b19987219ea872605167d7b5fHonghai Zhang virtual bool SupportsProtocol(const std::string& protocol) const { 99f9945b2d1aa2d78b19987219ea872605167d7b5fHonghai Zhang return protocol == UDP_PROTOCOL_NAME; 100f9945b2d1aa2d78b19987219ea872605167d7b5fHonghai Zhang } 101269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 102269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void set_stun_keepalive_delay(int delay) { 103269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org stun_keepalive_delay_ = delay; 104269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 105269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org int stun_keepalive_delay() const { 106269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return stun_keepalive_delay_; 107269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 108269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 109269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org protected: 110332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org UDPPort(rtc::Thread* thread, 111332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org rtc::PacketSocketFactory* factory, 112332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org rtc::Network* network, 113332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org const rtc::IPAddress& ip, 1140c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint16_t min_port, 1150c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint16_t max_port, 116332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org const std::string& username, 1170ba1533fdbe4a098723da8262f1374d71c3a1806pthatcher@webrtc.org const std::string& password, 118fe3bc9d5aeffed8bbfb34c330d8b991abd1a1abaGuo-wei Shieh const std::string& origin, 1199af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh bool emit_local_for_anyaddress); 120332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org 121332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org UDPPort(rtc::Thread* thread, 122332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org rtc::PacketSocketFactory* factory, 123332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org rtc::Network* network, 124332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org rtc::AsyncPacketSocket* socket, 125332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org const std::string& username, 1260ba1533fdbe4a098723da8262f1374d71c3a1806pthatcher@webrtc.org const std::string& password, 127fe3bc9d5aeffed8bbfb34c330d8b991abd1a1abaGuo-wei Shieh const std::string& origin, 1289af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh bool emit_local_for_anyaddress); 129269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 130269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org bool Init(); 131269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 132269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual int SendTo(const void* data, size_t size, 133269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const rtc::SocketAddress& addr, 134269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const rtc::PacketOptions& options, 135269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org bool payload); 136269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 137269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void OnLocalAddressReady(rtc::AsyncPacketSocket* socket, 138269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const rtc::SocketAddress& address); 139269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void OnReadPacket(rtc::AsyncPacketSocket* socket, 140269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const char* data, size_t size, 141269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const rtc::SocketAddress& remote_addr, 142269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const rtc::PacketTime& packet_time); 143269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 144c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan void OnSentPacket(rtc::AsyncPacketSocket* socket, 145c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan const rtc::SentPacket& sent_packet); 146c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan 147269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void OnReadyToSend(rtc::AsyncPacketSocket* socket); 148269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 149269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // This method will send STUN binding request if STUN server address is set. 150269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void MaybePrepareStunCandidate(); 151269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 152269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void SendStunBindingRequests(); 153269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 1549af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh // Helper function which will set |addr|'s IP to the default local address if 155e03cab94c1bac43f4d6c4775023a957f98ee8132Guo-wei Shieh // |addr| is the "any" address and |emit_local_for_anyaddress_| is true. When 156e03cab94c1bac43f4d6c4775023a957f98ee8132Guo-wei Shieh // returning false, it indicates that the operation has failed and the 157e03cab94c1bac43f4d6c4775023a957f98ee8132Guo-wei Shieh // address shouldn't be used by any candidate. 158e03cab94c1bac43f4d6c4775023a957f98ee8132Guo-wei Shieh bool MaybeSetDefaultLocalAddress(rtc::SocketAddress* addr) const; 1599af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh 160269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org private: 161269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // A helper class which can be called repeatedly to resolve multiple 162269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // addresses, as opposed to rtc::AsyncResolverInterface, which can only 163269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // resolve one address per instance. 164269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org class AddressResolver : public sigslot::has_slots<> { 165269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org public: 166269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org explicit AddressResolver(rtc::PacketSocketFactory* factory); 167269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org ~AddressResolver(); 168269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 169269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void Resolve(const rtc::SocketAddress& address); 170269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org bool GetResolvedAddress(const rtc::SocketAddress& input, 171269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org int family, 172269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::SocketAddress* output) const; 173269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 174269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // The signal is sent when resolving the specified address is finished. The 175269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // first argument is the input address, the second argument is the error 176269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // or 0 if it succeeded. 177269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org sigslot::signal2<const rtc::SocketAddress&, int> SignalDone; 178269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 179269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org private: 180269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org typedef std::map<rtc::SocketAddress, 181269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::AsyncResolverInterface*> ResolverMap; 182269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 183269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void OnResolveResult(rtc::AsyncResolverInterface* resolver); 184269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 185269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::PacketSocketFactory* socket_factory_; 186269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org ResolverMap resolvers_; 187269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org }; 188269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 189269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // DNS resolution of the STUN server. 190269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void ResolveStunAddress(const rtc::SocketAddress& stun_addr); 191269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void OnResolveResult(const rtc::SocketAddress& input, int error); 192269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 193269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void SendStunBindingRequest(const rtc::SocketAddress& stun_addr); 194269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 195269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // Below methods handles binding request responses. 196269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void OnStunBindingRequestSucceeded( 197269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const rtc::SocketAddress& stun_server_addr, 198269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const rtc::SocketAddress& stun_reflected_addr); 199269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void OnStunBindingOrResolveRequestFailed( 200269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const rtc::SocketAddress& stun_server_addr); 201269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 202269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // Sends STUN requests to the server. 203269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void OnSendPacket(const void* data, size_t size, StunRequest* req); 204269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 205269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // TODO(mallinaht) - Move this up to cricket::Port when SignalAddressReady is 206269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // changed to SignalPortReady. 207269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void MaybeSetPortCompleteOrError(); 208269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 209269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org bool HasCandidateWithAddress(const rtc::SocketAddress& addr) const; 210269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 211269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org ServerAddresses server_addresses_; 212269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org ServerAddresses bind_request_succeeded_servers_; 213269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org ServerAddresses bind_request_failed_servers_; 214269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org StunRequestManager requests_; 215269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::AsyncPacketSocket* socket_; 216269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org int error_; 217269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::scoped_ptr<AddressResolver> resolver_; 218269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org bool ready_; 219269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org int stun_keepalive_delay_; 220269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 2219af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh // This is true by default and false when 2229af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh // PORTALLOCATOR_DISABLE_DEFAULT_LOCAL_CANDIDATE is specified. 2239af97f89103d8f1f77b52a6ae77b8b7bcdc23f71Guo-wei Shieh bool emit_local_for_anyaddress_; 224fe3bc9d5aeffed8bbfb34c330d8b991abd1a1abaGuo-wei Shieh 225269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org friend class StunBindingRequest; 226269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org}; 227269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 228269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass StunPort : public UDPPort { 229269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org public: 230332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org static StunPort* Create(rtc::Thread* thread, 231332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org rtc::PacketSocketFactory* factory, 232332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org rtc::Network* network, 233332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org const rtc::IPAddress& ip, 2340c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint16_t min_port, 2350c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint16_t max_port, 236332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org const std::string& username, 237332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org const std::string& password, 2380ba1533fdbe4a098723da8262f1374d71c3a1806pthatcher@webrtc.org const ServerAddresses& servers, 2390ba1533fdbe4a098723da8262f1374d71c3a1806pthatcher@webrtc.org const std::string& origin) { 2400ba1533fdbe4a098723da8262f1374d71c3a1806pthatcher@webrtc.org StunPort* port = new StunPort(thread, factory, network, 2410ba1533fdbe4a098723da8262f1374d71c3a1806pthatcher@webrtc.org ip, min_port, max_port, 2420ba1533fdbe4a098723da8262f1374d71c3a1806pthatcher@webrtc.org username, password, servers, 2430ba1533fdbe4a098723da8262f1374d71c3a1806pthatcher@webrtc.org origin); 244269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (!port->Init()) { 245269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org delete port; 246269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org port = NULL; 247269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 248269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return port; 249269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 250269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 251269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual ~StunPort() {} 252269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 253269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual void PrepareAddress() { 254269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org SendStunBindingRequests(); 255269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 256269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 257269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org protected: 258332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org StunPort(rtc::Thread* thread, 259332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org rtc::PacketSocketFactory* factory, 260332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org rtc::Network* network, 261332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org const rtc::IPAddress& ip, 2620c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint16_t min_port, 2630c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint16_t max_port, 264332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org const std::string& username, 265332331fb01f8a316ac6d61cf4572478610fb3472pkasting@chromium.org const std::string& password, 2660ba1533fdbe4a098723da8262f1374d71c3a1806pthatcher@webrtc.org const ServerAddresses& servers, 2670ba1533fdbe4a098723da8262f1374d71c3a1806pthatcher@webrtc.org const std::string& origin) 2680c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström : UDPPort(thread, 2690c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström factory, 2700c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström network, 2710c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström ip, 2720c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström min_port, 2730c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström max_port, 2740c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström username, 2750c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström password, 2760c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström origin, 2770c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström false) { 278269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // UDPPort will set these to local udp, updating these to STUN. 279269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org set_type(STUN_PORT_TYPE); 280269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org set_server_addresses(servers); 281269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 282269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org}; 283269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 284269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} // namespace cricket 285269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 286269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif // WEBRTC_P2P_BASE_STUNPORT_H_ 287