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