1 /* 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef WEBRTC_P2P_BASE_PORT_H_ 12 #define WEBRTC_P2P_BASE_PORT_H_ 13 14 #include <map> 15 #include <set> 16 #include <string> 17 #include <vector> 18 19 #include "webrtc/p2p/base/candidate.h" 20 #include "webrtc/p2p/base/packetsocketfactory.h" 21 #include "webrtc/p2p/base/portinterface.h" 22 #include "webrtc/p2p/base/stun.h" 23 #include "webrtc/p2p/base/stunrequest.h" 24 #include "webrtc/p2p/base/transport.h" 25 #include "webrtc/base/asyncpacketsocket.h" 26 #include "webrtc/base/network.h" 27 #include "webrtc/base/proxyinfo.h" 28 #include "webrtc/base/ratetracker.h" 29 #include "webrtc/base/sigslot.h" 30 #include "webrtc/base/socketaddress.h" 31 #include "webrtc/base/thread.h" 32 33 namespace cricket { 34 35 class Connection; 36 class ConnectionRequest; 37 38 extern const char LOCAL_PORT_TYPE[]; 39 extern const char STUN_PORT_TYPE[]; 40 extern const char PRFLX_PORT_TYPE[]; 41 extern const char RELAY_PORT_TYPE[]; 42 43 extern const char UDP_PROTOCOL_NAME[]; 44 extern const char TCP_PROTOCOL_NAME[]; 45 extern const char SSLTCP_PROTOCOL_NAME[]; 46 47 // RFC 6544, TCP candidate encoding rules. 48 extern const int DISCARD_PORT; 49 extern const char TCPTYPE_ACTIVE_STR[]; 50 extern const char TCPTYPE_PASSIVE_STR[]; 51 extern const char TCPTYPE_SIMOPEN_STR[]; 52 53 // The minimum time we will wait before destroying a connection after creating 54 // it. 55 const uint32_t MIN_CONNECTION_LIFETIME = 10 * 1000; // 10 seconds. 56 57 // A connection will be declared dead if it has not received anything for this 58 // long. 59 const uint32_t DEAD_CONNECTION_RECEIVE_TIMEOUT = 30 * 1000; // 30 seconds. 60 61 // The timeout duration when a connection does not receive anything. 62 const uint32_t WEAK_CONNECTION_RECEIVE_TIMEOUT = 2500; // 2.5 seconds 63 64 // The length of time we wait before timing out writability on a connection. 65 const uint32_t CONNECTION_WRITE_TIMEOUT = 15 * 1000; // 15 seconds 66 67 // The length of time we wait before we become unwritable. 68 const uint32_t CONNECTION_WRITE_CONNECT_TIMEOUT = 5 * 1000; // 5 seconds 69 70 // The number of pings that must fail to respond before we become unwritable. 71 const uint32_t CONNECTION_WRITE_CONNECT_FAILURES = 5; 72 73 // This is the length of time that we wait for a ping response to come back. 74 const int CONNECTION_RESPONSE_TIMEOUT = 5 * 1000; // 5 seconds 75 76 enum RelayType { 77 RELAY_GTURN, // Legacy google relay service. 78 RELAY_TURN // Standard (TURN) relay service. 79 }; 80 81 enum IcePriorityValue { 82 // The reason we are choosing Relay preference 2 is because, we can run 83 // Relay from client to server on UDP/TCP/TLS. To distinguish the transport 84 // protocol, we prefer UDP over TCP over TLS. 85 // For UDP ICE_TYPE_PREFERENCE_RELAY will be 2. 86 // For TCP ICE_TYPE_PREFERENCE_RELAY will be 1. 87 // For TLS ICE_TYPE_PREFERENCE_RELAY will be 0. 88 // Check turnport.cc for setting these values. 89 ICE_TYPE_PREFERENCE_RELAY = 2, 90 ICE_TYPE_PREFERENCE_HOST_TCP = 90, 91 ICE_TYPE_PREFERENCE_SRFLX = 100, 92 ICE_TYPE_PREFERENCE_PRFLX = 110, 93 ICE_TYPE_PREFERENCE_HOST = 126 94 }; 95 96 const char* ProtoToString(ProtocolType proto); 97 bool StringToProto(const char* value, ProtocolType* proto); 98 99 struct ProtocolAddress { 100 rtc::SocketAddress address; 101 ProtocolType proto; 102 bool secure; 103 104 ProtocolAddress(const rtc::SocketAddress& a, ProtocolType p) 105 : address(a), proto(p), secure(false) { } 106 ProtocolAddress(const rtc::SocketAddress& a, ProtocolType p, bool sec) 107 : address(a), proto(p), secure(sec) { } 108 }; 109 110 typedef std::set<rtc::SocketAddress> ServerAddresses; 111 112 // Represents a local communication mechanism that can be used to create 113 // connections to similar mechanisms of the other client. Subclasses of this 114 // one add support for specific mechanisms like local UDP ports. 115 class Port : public PortInterface, public rtc::MessageHandler, 116 public sigslot::has_slots<> { 117 public: 118 Port(rtc::Thread* thread, 119 rtc::PacketSocketFactory* factory, 120 rtc::Network* network, 121 const rtc::IPAddress& ip, 122 const std::string& username_fragment, 123 const std::string& password); 124 Port(rtc::Thread* thread, 125 const std::string& type, 126 rtc::PacketSocketFactory* factory, 127 rtc::Network* network, 128 const rtc::IPAddress& ip, 129 uint16_t min_port, 130 uint16_t max_port, 131 const std::string& username_fragment, 132 const std::string& password); 133 virtual ~Port(); 134 135 virtual const std::string& Type() const { return type_; } 136 virtual rtc::Network* Network() const { return network_; } 137 138 // Methods to set/get ICE role and tiebreaker values. 139 IceRole GetIceRole() const { return ice_role_; } 140 void SetIceRole(IceRole role) { ice_role_ = role; } 141 142 void SetIceTiebreaker(uint64_t tiebreaker) { tiebreaker_ = tiebreaker; } 143 uint64_t IceTiebreaker() const { return tiebreaker_; } 144 145 virtual bool SharedSocket() const { return shared_socket_; } 146 void ResetSharedSocket() { shared_socket_ = false; } 147 148 // The thread on which this port performs its I/O. 149 rtc::Thread* thread() { return thread_; } 150 151 // The factory used to create the sockets of this port. 152 rtc::PacketSocketFactory* socket_factory() const { return factory_; } 153 void set_socket_factory(rtc::PacketSocketFactory* factory) { 154 factory_ = factory; 155 } 156 157 // For debugging purposes. 158 const std::string& content_name() const { return content_name_; } 159 void set_content_name(const std::string& content_name) { 160 content_name_ = content_name; 161 } 162 163 int component() const { return component_; } 164 void set_component(int component) { component_ = component; } 165 166 bool send_retransmit_count_attribute() const { 167 return send_retransmit_count_attribute_; 168 } 169 void set_send_retransmit_count_attribute(bool enable) { 170 send_retransmit_count_attribute_ = enable; 171 } 172 173 // Identifies the generation that this port was created in. 174 uint32_t generation() { return generation_; } 175 void set_generation(uint32_t generation) { generation_ = generation; } 176 177 // ICE requires a single username/password per content/media line. So the 178 // |ice_username_fragment_| of the ports that belongs to the same content will 179 // be the same. However this causes a small complication with our relay 180 // server, which expects different username for RTP and RTCP. 181 // 182 // To resolve this problem, we implemented the username_fragment(), 183 // which returns a different username (calculated from 184 // |ice_username_fragment_|) for RTCP in the case of ICEPROTO_GOOGLE. And the 185 // username_fragment() simply returns |ice_username_fragment_| when running 186 // in ICEPROTO_RFC5245. 187 // 188 // As a result the ICEPROTO_GOOGLE will use different usernames for RTP and 189 // RTCP. And the ICEPROTO_RFC5245 will use same username for both RTP and 190 // RTCP. 191 const std::string username_fragment() const; 192 const std::string& password() const { return password_; } 193 194 // Fired when candidates are discovered by the port. When all candidates 195 // are discovered that belong to port SignalAddressReady is fired. 196 sigslot::signal2<Port*, const Candidate&> SignalCandidateReady; 197 198 // Provides all of the above information in one handy object. 199 virtual const std::vector<Candidate>& Candidates() const { 200 return candidates_; 201 } 202 203 // SignalPortComplete is sent when port completes the task of candidates 204 // allocation. 205 sigslot::signal1<Port*> SignalPortComplete; 206 // This signal sent when port fails to allocate candidates and this port 207 // can't be used in establishing the connections. When port is in shared mode 208 // and port fails to allocate one of the candidates, port shouldn't send 209 // this signal as other candidates might be usefull in establishing the 210 // connection. 211 sigslot::signal1<Port*> SignalPortError; 212 213 // Returns a map containing all of the connections of this port, keyed by the 214 // remote address. 215 typedef std::map<rtc::SocketAddress, Connection*> AddressMap; 216 const AddressMap& connections() { return connections_; } 217 218 // Returns the connection to the given address or NULL if none exists. 219 virtual Connection* GetConnection( 220 const rtc::SocketAddress& remote_addr); 221 222 // Called each time a connection is created. 223 sigslot::signal2<Port*, Connection*> SignalConnectionCreated; 224 225 // In a shared socket mode each port which shares the socket will decide 226 // to accept the packet based on the |remote_addr|. Currently only UDP 227 // port implemented this method. 228 // TODO(mallinath) - Make it pure virtual. 229 virtual bool HandleIncomingPacket( 230 rtc::AsyncPacketSocket* socket, const char* data, size_t size, 231 const rtc::SocketAddress& remote_addr, 232 const rtc::PacketTime& packet_time) { 233 ASSERT(false); 234 return false; 235 } 236 237 // Sends a response message (normal or error) to the given request. One of 238 // these methods should be called as a response to SignalUnknownAddress. 239 // NOTE: You MUST call CreateConnection BEFORE SendBindingResponse. 240 virtual void SendBindingResponse(StunMessage* request, 241 const rtc::SocketAddress& addr); 242 virtual void SendBindingErrorResponse( 243 StunMessage* request, const rtc::SocketAddress& addr, 244 int error_code, const std::string& reason); 245 246 void set_proxy(const std::string& user_agent, 247 const rtc::ProxyInfo& proxy) { 248 user_agent_ = user_agent; 249 proxy_ = proxy; 250 } 251 const std::string& user_agent() { return user_agent_; } 252 const rtc::ProxyInfo& proxy() { return proxy_; } 253 254 virtual void EnablePortPackets(); 255 256 // Called if the port has no connections and is no longer useful. 257 void Destroy(); 258 259 virtual void OnMessage(rtc::Message *pmsg); 260 261 // Debugging description of this port 262 virtual std::string ToString() const; 263 const rtc::IPAddress& ip() const { return ip_; } 264 uint16_t min_port() { return min_port_; } 265 uint16_t max_port() { return max_port_; } 266 267 // Timeout shortening function to speed up unit tests. 268 void set_timeout_delay(int delay) { timeout_delay_ = delay; } 269 270 // This method will return local and remote username fragements from the 271 // stun username attribute if present. 272 bool ParseStunUsername(const StunMessage* stun_msg, 273 std::string* local_username, 274 std::string* remote_username) const; 275 void CreateStunUsername(const std::string& remote_username, 276 std::string* stun_username_attr_str) const; 277 278 bool MaybeIceRoleConflict(const rtc::SocketAddress& addr, 279 IceMessage* stun_msg, 280 const std::string& remote_ufrag); 281 282 // Called when a packet has been sent to the socket. 283 // This is made pure virtual to notify subclasses of Port that they MUST 284 // listen to AsyncPacketSocket::SignalSentPacket and then call 285 // PortInterface::OnSentPacket. 286 virtual void OnSentPacket(rtc::AsyncPacketSocket* socket, 287 const rtc::SentPacket& sent_packet) = 0; 288 289 // Called when the socket is currently able to send. 290 void OnReadyToSend(); 291 292 // Called when the Connection discovers a local peer reflexive candidate. 293 // Returns the index of the new local candidate. 294 size_t AddPrflxCandidate(const Candidate& local); 295 296 void set_candidate_filter(uint32_t candidate_filter) { 297 candidate_filter_ = candidate_filter; 298 } 299 300 protected: 301 enum { 302 MSG_DEAD = 0, 303 MSG_FIRST_AVAILABLE 304 }; 305 306 void set_type(const std::string& type) { type_ = type; } 307 308 void AddAddress(const rtc::SocketAddress& address, 309 const rtc::SocketAddress& base_address, 310 const rtc::SocketAddress& related_address, 311 const std::string& protocol, 312 const std::string& relay_protocol, 313 const std::string& tcptype, 314 const std::string& type, 315 uint32_t type_preference, 316 uint32_t relay_preference, 317 bool final); 318 319 // Adds the given connection to the list. (Deleting removes them.) 320 void AddConnection(Connection* conn); 321 322 // Called when a packet is received from an unknown address that is not 323 // currently a connection. If this is an authenticated STUN binding request, 324 // then we will signal the client. 325 void OnReadPacket(const char* data, size_t size, 326 const rtc::SocketAddress& addr, 327 ProtocolType proto); 328 329 // If the given data comprises a complete and correct STUN message then the 330 // return value is true, otherwise false. If the message username corresponds 331 // with this port's username fragment, msg will contain the parsed STUN 332 // message. Otherwise, the function may send a STUN response internally. 333 // remote_username contains the remote fragment of the STUN username. 334 bool GetStunMessage(const char* data, size_t size, 335 const rtc::SocketAddress& addr, 336 IceMessage** out_msg, std::string* out_username); 337 338 // Checks if the address in addr is compatible with the port's ip. 339 bool IsCompatibleAddress(const rtc::SocketAddress& addr); 340 341 // Returns default DSCP value. 342 rtc::DiffServCodePoint DefaultDscpValue() const { 343 // No change from what MediaChannel set. 344 return rtc::DSCP_NO_CHANGE; 345 } 346 347 uint32_t candidate_filter() { return candidate_filter_; } 348 349 private: 350 void Construct(); 351 // Called when one of our connections deletes itself. 352 void OnConnectionDestroyed(Connection* conn); 353 354 // Whether this port is dead, and hence, should be destroyed on the controlled 355 // side. 356 bool dead() const { 357 return ice_role_ == ICEROLE_CONTROLLED && connections_.empty(); 358 } 359 360 rtc::Thread* thread_; 361 rtc::PacketSocketFactory* factory_; 362 std::string type_; 363 bool send_retransmit_count_attribute_; 364 rtc::Network* network_; 365 rtc::IPAddress ip_; 366 uint16_t min_port_; 367 uint16_t max_port_; 368 std::string content_name_; 369 int component_; 370 uint32_t generation_; 371 // In order to establish a connection to this Port (so that real data can be 372 // sent through), the other side must send us a STUN binding request that is 373 // authenticated with this username_fragment and password. 374 // PortAllocatorSession will provide these username_fragment and password. 375 // 376 // Note: we should always use username_fragment() instead of using 377 // |ice_username_fragment_| directly. For the details see the comment on 378 // username_fragment(). 379 std::string ice_username_fragment_; 380 std::string password_; 381 std::vector<Candidate> candidates_; 382 AddressMap connections_; 383 int timeout_delay_; 384 bool enable_port_packets_; 385 IceRole ice_role_; 386 uint64_t tiebreaker_; 387 bool shared_socket_; 388 // Information to use when going through a proxy. 389 std::string user_agent_; 390 rtc::ProxyInfo proxy_; 391 392 // Candidate filter is pushed down to Port such that each Port could 393 // make its own decision on how to create candidates. For example, 394 // when IceTransportsType is set to relay, both RelayPort and 395 // TurnPort will hide raddr to avoid local address leakage. 396 uint32_t candidate_filter_; 397 398 friend class Connection; 399 }; 400 401 // Represents a communication link between a port on the local client and a 402 // port on the remote client. 403 class Connection : public rtc::MessageHandler, 404 public sigslot::has_slots<> { 405 public: 406 struct SentPing { 407 SentPing(const std::string id, uint32_t sent_time) 408 : id(id), sent_time(sent_time) {} 409 410 std::string id; 411 uint32_t sent_time; 412 }; 413 414 // States are from RFC 5245. http://tools.ietf.org/html/rfc5245#section-5.7.4 415 enum State { 416 STATE_WAITING = 0, // Check has not been performed, Waiting pair on CL. 417 STATE_INPROGRESS, // Check has been sent, transaction is in progress. 418 STATE_SUCCEEDED, // Check already done, produced a successful result. 419 STATE_FAILED // Check for this connection failed. 420 }; 421 422 virtual ~Connection(); 423 424 // The local port where this connection sends and receives packets. 425 Port* port() { return port_; } 426 const Port* port() const { return port_; } 427 428 // Returns the description of the local port 429 virtual const Candidate& local_candidate() const; 430 431 // Returns the description of the remote port to which we communicate. 432 const Candidate& remote_candidate() const { return remote_candidate_; } 433 434 // Returns the pair priority. 435 uint64_t priority() const; 436 437 enum WriteState { 438 STATE_WRITABLE = 0, // we have received ping responses recently 439 STATE_WRITE_UNRELIABLE = 1, // we have had a few ping failures 440 STATE_WRITE_INIT = 2, // we have yet to receive a ping response 441 STATE_WRITE_TIMEOUT = 3, // we have had a large number of ping failures 442 }; 443 444 WriteState write_state() const { return write_state_; } 445 bool writable() const { return write_state_ == STATE_WRITABLE; } 446 bool receiving() const { return receiving_; } 447 448 // Determines whether the connection has finished connecting. This can only 449 // be false for TCP connections. 450 bool connected() const { return connected_; } 451 bool weak() const { return !(writable() && receiving() && connected()); } 452 bool active() const { 453 return write_state_ != STATE_WRITE_TIMEOUT; 454 } 455 // A connection is dead if it can be safely deleted. 456 bool dead(uint32_t now) const; 457 458 // Estimate of the round-trip time over this connection. 459 uint32_t rtt() const { return rtt_; } 460 461 size_t sent_total_bytes(); 462 size_t sent_bytes_second(); 463 // Used to track how many packets are discarded in the application socket due 464 // to errors. 465 size_t sent_discarded_packets(); 466 size_t sent_total_packets(); 467 size_t recv_total_bytes(); 468 size_t recv_bytes_second(); 469 sigslot::signal1<Connection*> SignalStateChange; 470 471 // Sent when the connection has decided that it is no longer of value. It 472 // will delete itself immediately after this call. 473 sigslot::signal1<Connection*> SignalDestroyed; 474 475 // The connection can send and receive packets asynchronously. This matches 476 // the interface of AsyncPacketSocket, which may use UDP or TCP under the 477 // covers. 478 virtual int Send(const void* data, size_t size, 479 const rtc::PacketOptions& options) = 0; 480 481 // Error if Send() returns < 0 482 virtual int GetError() = 0; 483 484 sigslot::signal4<Connection*, const char*, size_t, const rtc::PacketTime&> 485 SignalReadPacket; 486 487 sigslot::signal1<Connection*> SignalReadyToSend; 488 489 // Called when a packet is received on this connection. 490 void OnReadPacket(const char* data, size_t size, 491 const rtc::PacketTime& packet_time); 492 493 // Called when the socket is currently able to send. 494 void OnReadyToSend(); 495 496 // Called when a connection is determined to be no longer useful to us. We 497 // still keep it around in case the other side wants to use it. But we can 498 // safely stop pinging on it and we can allow it to time out if the other 499 // side stops using it as well. 500 bool pruned() const { return pruned_; } 501 void Prune(); 502 503 bool use_candidate_attr() const { return use_candidate_attr_; } 504 void set_use_candidate_attr(bool enable); 505 506 bool nominated() const { return nominated_; } 507 void set_nominated(bool nominated) { nominated_ = nominated; } 508 509 void set_remote_ice_mode(IceMode mode) { 510 remote_ice_mode_ = mode; 511 } 512 513 void set_receiving_timeout(uint32_t receiving_timeout_ms) { 514 receiving_timeout_ = receiving_timeout_ms; 515 } 516 517 // Makes the connection go away. 518 void Destroy(); 519 520 // Makes the connection go away, in a failed state. 521 void FailAndDestroy(); 522 523 // Checks that the state of this connection is up-to-date. The argument is 524 // the current time, which is compared against various timeouts. 525 void UpdateState(uint32_t now); 526 527 // Called when this connection should try checking writability again. 528 uint32_t last_ping_sent() const { return last_ping_sent_; } 529 void Ping(uint32_t now); 530 void ReceivedPingResponse(); 531 uint32_t last_ping_response_received() const { 532 return last_ping_response_received_; 533 } 534 535 // Called whenever a valid ping is received on this connection. This is 536 // public because the connection intercepts the first ping for us. 537 uint32_t last_ping_received() const { return last_ping_received_; } 538 void ReceivedPing(); 539 // Handles the binding request; sends a response if this is a valid request. 540 void HandleBindingRequest(IceMessage* msg); 541 542 // Debugging description of this connection 543 std::string ToDebugId() const; 544 std::string ToString() const; 545 std::string ToSensitiveString() const; 546 // Prints pings_since_last_response_ into a string. 547 void PrintPingsSinceLastResponse(std::string* pings, size_t max); 548 549 bool reported() const { return reported_; } 550 void set_reported(bool reported) { reported_ = reported;} 551 552 // This signal will be fired if this connection is nominated by the 553 // controlling side. 554 sigslot::signal1<Connection*> SignalNominated; 555 556 // Invoked when Connection receives STUN error response with 487 code. 557 void HandleRoleConflictFromPeer(); 558 559 State state() const { return state_; } 560 561 IceMode remote_ice_mode() const { return remote_ice_mode_; } 562 563 // Update the ICE password of the remote candidate if |ice_ufrag| matches 564 // the candidate's ufrag, and the candidate's passwrod has not been set. 565 void MaybeSetRemoteIceCredentials(const std::string& ice_ufrag, 566 const std::string& ice_pwd); 567 568 // If |remote_candidate_| is peer reflexive and is equivalent to 569 // |new_candidate| except the type, update |remote_candidate_| to 570 // |new_candidate|. 571 void MaybeUpdatePeerReflexiveCandidate(const Candidate& new_candidate); 572 573 // Returns the last received time of any data, stun request, or stun 574 // response in milliseconds 575 uint32_t last_received() const; 576 577 protected: 578 enum { MSG_DELETE = 0, MSG_FIRST_AVAILABLE }; 579 580 // Constructs a new connection to the given remote port. 581 Connection(Port* port, size_t index, const Candidate& candidate); 582 583 // Called back when StunRequestManager has a stun packet to send 584 void OnSendStunPacket(const void* data, size_t size, StunRequest* req); 585 586 // Callbacks from ConnectionRequest 587 virtual void OnConnectionRequestResponse(ConnectionRequest* req, 588 StunMessage* response); 589 void OnConnectionRequestErrorResponse(ConnectionRequest* req, 590 StunMessage* response); 591 void OnConnectionRequestTimeout(ConnectionRequest* req); 592 void OnConnectionRequestSent(ConnectionRequest* req); 593 594 // Changes the state and signals if necessary. 595 void set_write_state(WriteState value); 596 void set_receiving(bool value); 597 void set_state(State state); 598 void set_connected(bool value); 599 600 void OnMessage(rtc::Message *pmsg); 601 602 Port* port_; 603 size_t local_candidate_index_; 604 Candidate remote_candidate_; 605 WriteState write_state_; 606 bool receiving_; 607 bool connected_; 608 bool pruned_; 609 // By default |use_candidate_attr_| flag will be true, 610 // as we will be using aggressive nomination. 611 // But when peer is ice-lite, this flag "must" be initialized to false and 612 // turn on when connection becomes "best connection". 613 bool use_candidate_attr_; 614 // Whether this connection has been nominated by the controlling side via 615 // the use_candidate attribute. 616 bool nominated_; 617 IceMode remote_ice_mode_; 618 StunRequestManager requests_; 619 uint32_t rtt_; 620 uint32_t last_ping_sent_; // last time we sent a ping to the other side 621 uint32_t last_ping_received_; // last time we received a ping from the other 622 // side 623 uint32_t last_data_received_; 624 uint32_t last_ping_response_received_; 625 std::vector<SentPing> pings_since_last_response_; 626 627 rtc::RateTracker recv_rate_tracker_; 628 rtc::RateTracker send_rate_tracker_; 629 uint32_t sent_packets_discarded_; 630 uint32_t sent_packets_total_; 631 632 private: 633 void MaybeAddPrflxCandidate(ConnectionRequest* request, 634 StunMessage* response); 635 636 bool reported_; 637 State state_; 638 // Time duration to switch from receiving to not receiving. 639 uint32_t receiving_timeout_; 640 uint32_t time_created_ms_; 641 642 friend class Port; 643 friend class ConnectionRequest; 644 }; 645 646 // ProxyConnection defers all the interesting work to the port. 647 class ProxyConnection : public Connection { 648 public: 649 ProxyConnection(Port* port, size_t index, const Candidate& remote_candidate); 650 651 int Send(const void* data, 652 size_t size, 653 const rtc::PacketOptions& options) override; 654 int GetError() override { return error_; } 655 656 private: 657 int error_ = 0; 658 }; 659 660 } // namespace cricket 661 662 #endif // WEBRTC_P2P_BASE_PORT_H_ 663