1 /* 2 * Copyright 2012 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_PORTINTERFACE_H_ 12 #define WEBRTC_P2P_BASE_PORTINTERFACE_H_ 13 14 #include <string> 15 16 #include "webrtc/p2p/base/transport.h" 17 #include "webrtc/base/asyncpacketsocket.h" 18 #include "webrtc/base/socketaddress.h" 19 20 namespace rtc { 21 class Network; 22 struct PacketOptions; 23 } 24 25 namespace cricket { 26 class Connection; 27 class IceMessage; 28 class StunMessage; 29 30 enum ProtocolType { 31 PROTO_UDP, 32 PROTO_TCP, 33 PROTO_SSLTCP, 34 PROTO_LAST = PROTO_SSLTCP 35 }; 36 37 // Defines the interface for a port, which represents a local communication 38 // mechanism that can be used to create connections to similar mechanisms of 39 // the other client. Various types of ports will implement this interface. 40 class PortInterface { 41 public: ~PortInterface()42 virtual ~PortInterface() {} 43 44 virtual const std::string& Type() const = 0; 45 virtual rtc::Network* Network() const = 0; 46 47 // Methods to set/get ICE role and tiebreaker values. 48 virtual void SetIceRole(IceRole role) = 0; 49 virtual IceRole GetIceRole() const = 0; 50 51 virtual void SetIceTiebreaker(uint64_t tiebreaker) = 0; 52 virtual uint64_t IceTiebreaker() const = 0; 53 54 virtual bool SharedSocket() const = 0; 55 56 virtual bool SupportsProtocol(const std::string& protocol) const = 0; 57 58 // PrepareAddress will attempt to get an address for this port that other 59 // clients can send to. It may take some time before the address is ready. 60 // Once it is ready, we will send SignalAddressReady. If errors are 61 // preventing the port from getting an address, it may send 62 // SignalAddressError. 63 virtual void PrepareAddress() = 0; 64 65 // Returns the connection to the given address or NULL if none exists. 66 virtual Connection* GetConnection( 67 const rtc::SocketAddress& remote_addr) = 0; 68 69 // Creates a new connection to the given address. 70 enum CandidateOrigin { ORIGIN_THIS_PORT, ORIGIN_OTHER_PORT, ORIGIN_MESSAGE }; 71 virtual Connection* CreateConnection( 72 const Candidate& remote_candidate, CandidateOrigin origin) = 0; 73 74 // Functions on the underlying socket(s). 75 virtual int SetOption(rtc::Socket::Option opt, int value) = 0; 76 virtual int GetOption(rtc::Socket::Option opt, int* value) = 0; 77 virtual int GetError() = 0; 78 79 virtual const std::vector<Candidate>& Candidates() const = 0; 80 81 // Sends the given packet to the given address, provided that the address is 82 // that of a connection or an address that has sent to us already. 83 virtual int SendTo(const void* data, size_t size, 84 const rtc::SocketAddress& addr, 85 const rtc::PacketOptions& options, bool payload) = 0; 86 87 // Indicates that we received a successful STUN binding request from an 88 // address that doesn't correspond to any current connection. To turn this 89 // into a real connection, call CreateConnection. 90 sigslot::signal6<PortInterface*, const rtc::SocketAddress&, 91 ProtocolType, IceMessage*, const std::string&, 92 bool> SignalUnknownAddress; 93 94 // Sends a response message (normal or error) to the given request. One of 95 // these methods should be called as a response to SignalUnknownAddress. 96 // NOTE: You MUST call CreateConnection BEFORE SendBindingResponse. 97 virtual void SendBindingResponse(StunMessage* request, 98 const rtc::SocketAddress& addr) = 0; 99 virtual void SendBindingErrorResponse( 100 StunMessage* request, const rtc::SocketAddress& addr, 101 int error_code, const std::string& reason) = 0; 102 103 // Signaled when this port decides to delete itself because it no longer has 104 // any usefulness. 105 sigslot::signal1<PortInterface*> SignalDestroyed; 106 107 // Signaled when Port discovers ice role conflict with the peer. 108 sigslot::signal1<PortInterface*> SignalRoleConflict; 109 110 // Normally, packets arrive through a connection (or they result signaling of 111 // unknown address). Calling this method turns off delivery of packets 112 // through their respective connection and instead delivers every packet 113 // through this port. 114 virtual void EnablePortPackets() = 0; 115 sigslot::signal4<PortInterface*, const char*, size_t, 116 const rtc::SocketAddress&> SignalReadPacket; 117 118 // Emitted each time a packet is sent on this port. 119 sigslot::signal1<const rtc::SentPacket&> SignalSentPacket; 120 121 virtual std::string ToString() const = 0; 122 123 protected: PortInterface()124 PortInterface() {} 125 }; 126 127 } // namespace cricket 128 129 #endif // WEBRTC_P2P_BASE_PORTINTERFACE_H_ 130