Index: webrtc/p2p/base/udptransportchannel.cc |
diff --git a/webrtc/p2p/base/udptransportchannel.cc b/webrtc/p2p/base/udptransportchannel.cc |
index 736021777878cd7c4358808d27f593b3f3c854c1..20fc4030c4a3b718ed2462c0db0f67a830f3ce76 100644 |
--- a/webrtc/p2p/base/udptransportchannel.cc |
+++ b/webrtc/p2p/base/udptransportchannel.cc |
@@ -15,130 +15,89 @@ |
#include "webrtc/base/asyncudpsocket.h" |
#include "webrtc/base/asyncpacketsocket.h" |
#include "webrtc/base/logging.h" |
-#include "webrtc/base/physicalsocketserver.h" |
#include "webrtc/base/socketaddress.h" |
#include "webrtc/base/thread.h" |
#include "webrtc/base/thread_checker.h" |
-#include "webrtc/p2p/base/basicpacketsocketfactory.h" |
-#include "webrtc/p2p/base/packettransportinterface.h" |
namespace cricket { |
-UdpTransportChannel::UdpTransportChannel(const std::string& transport_name) |
- : UdpTransportChannel(transport_name, |
- rtc::Thread::Current()->socketserver()) {} |
+UdpTransport::UdpTransport(const std::string& transport_name, |
+ std::unique_ptr<rtc::AsyncPacketSocket> socket) |
+ : transport_name_(transport_name), socket_(std::move(socket)) { |
+ RTC_DCHECK(socket_); |
+ socket_->SignalReadPacket.connect(this, &UdpTransport::OnSocketReadPacket); |
+ socket_->SignalSentPacket.connect(this, &UdpTransport::OnSocketSentPacket); |
+} |
-UdpTransportChannel::UdpTransportChannel(const std::string& transport_name, |
- rtc::SocketServer* socket_server) |
- : transport_name_(transport_name), socket_server_(socket_server) {} |
+UdpTransport::~UdpTransport() { |
+ RTC_DCHECK_RUN_ON(&network_thread_checker_); |
+} |
-UdpTransportChannel::~UdpTransportChannel() { |
+rtc::SocketAddress UdpTransport::GetLocalAddress() const { |
RTC_DCHECK_RUN_ON(&network_thread_checker_); |
+ return socket_->GetLocalAddress(); |
} |
-void UdpTransportChannel::OnSocketReadPacket( |
- rtc::AsyncPacketSocket* socket, |
- const char* data, |
- size_t len, |
- const rtc::SocketAddress& remote_addr, |
- const rtc::PacketTime& packet_time) { |
- // No thread_checker in high frequency network function. |
- SignalReadPacket(this, data, len, packet_time, 0); |
+bool UdpTransport::SetRemoteAddress(const rtc::SocketAddress& addr) { |
+ RTC_DCHECK_RUN_ON(&network_thread_checker_); |
+ if (!addr.IsComplete()) { |
+ LOG(LS_WARNING) << "RemoteAddress address not complete."; |
+ return false; |
+ } |
+ // TODO(johan): check for ipv4, other settings. |
+ bool prev_destination_nil = remote_address_.IsNil(); |
+ remote_address_ = addr; |
+ // Going from "didn't have destination" to "have destination" or vice versa. |
+ if (prev_destination_nil != remote_address_.IsNil()) { |
+ SignalWritableState(this); |
+ if (prev_destination_nil) { |
+ SignalReadyToSend(this); |
+ } |
+ } |
+ return true; |
} |
-void UdpTransportChannel::OnSocketSentPacket(rtc::AsyncPacketSocket* socket, |
- const rtc::SentPacket& packet) { |
- RTC_DCHECK_EQ(socket_.get(), socket); |
- SignalSentPacket(this, packet); |
+rtc::SocketAddress UdpTransport::GetRemoteAddress() const { |
+ RTC_DCHECK_RUN_ON(&network_thread_checker_); |
+ return remote_address_; |
} |
-bool UdpTransportChannel::writable() const { |
- return state_ == State::CONNECTED; |
+bool UdpTransport::writable() const { |
+ RTC_DCHECK_RUN_ON(&network_thread_checker_); |
+ return !remote_address_.IsNil(); |
} |
-int UdpTransportChannel::SendPacket(const char* data, |
- size_t len, |
- const rtc::PacketOptions& options, |
- int flags) { |
+int UdpTransport::SendPacket(const char* data, |
+ size_t len, |
+ const rtc::PacketOptions& options, |
+ int flags) { |
// No thread_checker in high frequency network function. |
- if (!remote_parameters_) { |
- LOG(LS_WARNING) << "Remote parameters not set."; |
+ if (remote_address_.IsNil()) { |
+ LOG(LS_WARNING) << "Remote address not set."; |
send_error_ = ENOTCONN; |
return -1; |
} |
- const rtc::SocketAddress& remote_addr_ = *remote_parameters_; |
- int result = socket_->SendTo((const void*)data, len, remote_addr_, options); |
+ int result = |
+ socket_->SendTo((const void*)data, len, remote_address_, options); |
if (result <= 0) { |
LOG(LS_VERBOSE) << "SendPacket() " << result; |
} |
return result; |
} |
-void UdpTransportChannel::Start() { |
- RTC_DCHECK_RUN_ON(&network_thread_checker_); |
- if (socket_) { |
- LOG(LS_WARNING) << "Local socket already allocated."; |
- return; |
- } |
- static constexpr uint16_t kMaxTries = 100; |
- static constexpr uint16_t kMinPortNumber = 2000; |
- // TODO(johan) provide configuration option for kMinPortNumber. |
- rtc::SocketAddress socket_addr("0.0.0.0", 0); |
- // TODO(johan): Replace BasicPacketSocketFactory by something that honors RFC |
- // 3550 Section 11 port number requirements like |
- // {port_{RTP} is even, port_{RTCP} := port{RTP} + 1}. |
- rtc::BasicPacketSocketFactory socket_factory(socket_server_); |
- socket_.reset(socket_factory.CreateUdpSocket(socket_addr, kMinPortNumber, |
- kMinPortNumber + kMaxTries)); |
- if (socket_) { |
- local_parameters_ = |
- rtc::Optional<rtc::SocketAddress>(socket_->GetLocalAddress()); |
- LOG(INFO) << "Created UDP socket with addr " << local_parameters_->ipaddr() |
- << " port " << local_parameters_->port() << "."; |
- socket_->SignalReadPacket.connect(this, |
- &UdpTransportChannel::OnSocketReadPacket); |
- socket_->SignalSentPacket.connect(this, |
- &UdpTransportChannel::OnSocketSentPacket); |
- } else { |
- LOG(INFO) << "Local socket allocation failure"; |
- } |
- UpdateState(); |
- return; |
-} |
- |
-void UdpTransportChannel::UpdateState() { |
- RTC_DCHECK_RUN_ON(&network_thread_checker_); |
- RTC_DCHECK(!(local_parameters_ && !socket_)); |
- RTC_DCHECK(!(!local_parameters_ && socket_)); |
- if (!local_parameters_) { |
- SetState(State::INIT); |
- } else if (!remote_parameters_) { |
- SetState(State::CONNECTING); |
- } else { |
- SetState(State::CONNECTED); |
- } |
+void UdpTransport::OnSocketReadPacket(rtc::AsyncPacketSocket* socket, |
+ const char* data, |
+ size_t len, |
+ const rtc::SocketAddress& remote_addr, |
+ const rtc::PacketTime& packet_time) { |
+ // No thread_checker in high frequency network function. |
+ SignalReadPacket(this, data, len, packet_time, 0); |
} |
-void UdpTransportChannel::SetRemoteParameters(const rtc::SocketAddress& addr) { |
- RTC_DCHECK_RUN_ON(&network_thread_checker_); |
- if (!addr.IsComplete()) { |
- LOG(INFO) << "remote address not complete"; |
- return; |
- } |
- // TODO(johan) check for ipv4, other settings. |
- remote_parameters_ = rtc::Optional<rtc::SocketAddress>(addr); |
- UpdateState(); |
+void UdpTransport::OnSocketSentPacket(rtc::AsyncPacketSocket* socket, |
+ const rtc::SentPacket& packet) { |
+ RTC_DCHECK_EQ(socket_.get(), socket); |
+ SignalSentPacket(this, packet); |
} |
-void UdpTransportChannel::SetState(State state) { |
- RTC_DCHECK_RUN_ON(&network_thread_checker_); |
- if (state_ == state) { |
- return; |
- } |
- state_ = state; |
- if (state == State::CONNECTED) { |
- SignalWritableState(this); |
- SignalReadyToSend(this); |
- } |
-} |
} // namespace cricket |