Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1093)

Unified Diff: media/cast/test/utility/udp_proxy.cc

Issue 282333003: Cast: Make the udp proxy actually work for v1 mirroring (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: added missing initializer Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/cast/test/utility/udp_proxy.cc
diff --git a/media/cast/test/utility/udp_proxy.cc b/media/cast/test/utility/udp_proxy.cc
index aa1bb0bd207e1ee7c62939e039672b0c2b158333..05c3b93891aaf93a46fd52e0d490949f12ccf172 100644
--- a/media/cast/test/utility/udp_proxy.cc
+++ b/media/cast/test/utility/udp_proxy.cc
@@ -305,62 +305,20 @@ scoped_ptr<PacketPipe> NewNetworkGlitchPipe(double average_work_time,
.Pass();
}
+class UDPProxyImpl;
+
class PacketSender : public PacketPipe {
public:
- PacketSender(net::UDPSocket* udp_socket,
- const net::IPEndPoint* destination) :
- blocked_(false),
- udp_socket_(udp_socket),
- destination_(destination),
- weak_factory_(this) {
- }
- virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE {
- if (blocked_) {
- LOG(ERROR) << "Cannot write packet right now: blocked";
- return;
- }
-
- VLOG(1) << "Sending packet, len = " << packet->size();
- // We ignore all problems, callbacks and errors.
- // If it didn't work we just drop the packet at and call it a day.
- scoped_refptr<net::IOBuffer> buf =
- new net::WrappedIOBuffer(reinterpret_cast<char*>(&packet->front()));
- size_t buf_size = packet->size();
- int result;
- if (destination_->address().empty()) {
- VLOG(1) << "Destination has not been set yet.";
- result = net::ERR_INVALID_ARGUMENT;
- } else {
- VLOG(1) << "Destination:" << destination_->ToString();
- result = udp_socket_->SendTo(buf,
- static_cast<int>(buf_size),
- *destination_,
- base::Bind(&PacketSender::AllowWrite,
- weak_factory_.GetWeakPtr(),
- buf,
- base::Passed(&packet)));
- }
- if (result == net::ERR_IO_PENDING) {
- blocked_ = true;
- } else if (result < 0) {
- LOG(ERROR) << "Failed to write packet.";
- }
- }
+ PacketSender(UDPProxyImpl* udp_proxy, const net::IPEndPoint* destination)
+ : udp_proxy_(udp_proxy), destination_(destination) {}
+ virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE;
virtual void AppendToPipe(scoped_ptr<PacketPipe> pipe) OVERRIDE {
NOTREACHED();
}
private:
- void AllowWrite(scoped_refptr<net::IOBuffer> buf,
- scoped_ptr<transport::Packet> packet,
- int unused_len) {
- DCHECK(blocked_);
- blocked_ = false;
- }
- bool blocked_;
- net::UDPSocket* udp_socket_;
+ UDPProxyImpl* udp_proxy_;
const net::IPEndPoint* destination_; // not owned
- base::WeakPtrFactory<PacketSender> weak_factory_;
};
namespace {
@@ -431,13 +389,15 @@ class UDPProxyImpl : public UDPProxy {
const net::IPEndPoint& destination,
scoped_ptr<PacketPipe> to_dest_pipe,
scoped_ptr<PacketPipe> from_dest_pipe,
- net::NetLog* net_log) :
- local_port_(local_port),
- destination_(destination),
- destination_is_mutable_(destination.address().empty()),
- proxy_thread_("media::cast::test::UdpProxy Thread"),
- to_dest_pipe_(to_dest_pipe.Pass()),
- from_dest_pipe_(from_dest_pipe.Pass()) {
+ net::NetLog* net_log)
+ : local_port_(local_port),
+ destination_(destination),
+ destination_is_mutable_(destination.address().empty()),
+ proxy_thread_("media::cast::test::UdpProxy Thread"),
+ to_dest_pipe_(to_dest_pipe.Pass()),
+ from_dest_pipe_(from_dest_pipe.Pass()),
+ blocked_(false),
+ weak_factory_(this) {
proxy_thread_.StartWithOptions(
base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
base::WaitableEvent start_event(false, false);
@@ -461,6 +421,40 @@ class UDPProxyImpl : public UDPProxy {
proxy_thread_.Stop();
}
+ void Send(scoped_ptr<transport::Packet> packet,
+ const net::IPEndPoint& destination) {
+ if (blocked_) {
+ LOG(ERROR) << "Cannot write packet right now: blocked";
+ return;
+ }
+
+ VLOG(1) << "Sending packet, len = " << packet->size();
+ // We ignore all problems, callbacks and errors.
+ // If it didn't work we just drop the packet at and call it a day.
+ scoped_refptr<net::IOBuffer> buf =
+ new net::WrappedIOBuffer(reinterpret_cast<char*>(&packet->front()));
+ size_t buf_size = packet->size();
+ int result;
+ if (destination.address().empty()) {
+ VLOG(1) << "Destination has not been set yet.";
+ result = net::ERR_INVALID_ARGUMENT;
+ } else {
+ VLOG(1) << "Destination:" << destination.ToString();
+ result = socket_->SendTo(buf,
+ static_cast<int>(buf_size),
+ destination,
+ base::Bind(&UDPProxyImpl::AllowWrite,
+ weak_factory_.GetWeakPtr(),
+ buf,
+ base::Passed(&packet)));
+ }
+ if (result == net::ERR_IO_PENDING) {
+ blocked_ = true;
+ } else if (result < 0) {
+ LOG(ERROR) << "Failed to write packet.";
+ }
+ }
+
private:
void Start(base::WaitableEvent* start_event,
net::NetLog* net_log) {
@@ -468,9 +462,8 @@ class UDPProxyImpl : public UDPProxy {
net::RandIntCallback(),
net_log,
net::NetLog::Source()));
- BuildPipe(&to_dest_pipe_, new PacketSender(socket_.get(), &destination_));
- BuildPipe(&from_dest_pipe_,
- new PacketSender(socket_.get(), &return_address_));
+ BuildPipe(&to_dest_pipe_, new PacketSender(this, &destination_));
+ BuildPipe(&from_dest_pipe_, new PacketSender(this, &return_address_));
to_dest_pipe_->InitOnIOThread(base::MessageLoopProxy::current(),
&tick_clock_);
from_dest_pipe_->InitOnIOThread(base::MessageLoopProxy::current(),
@@ -501,14 +494,16 @@ class UDPProxyImpl : public UDPProxy {
return;
}
packet_->resize(len);
- if (destination_is_mutable_ &&
+ if (destination_is_mutable_ && set_destination_next_ &&
!(recv_address_ == return_address_) &&
!(recv_address_ == destination_)) {
destination_ = recv_address_;
}
if (recv_address_ == destination_) {
+ set_destination_next_ = false;
from_dest_pipe_->Send(packet_.Pass());
} else {
+ set_destination_next_ = true;
VLOG(1) << "Return address = " << recv_address_.ToString();
return_address_ = recv_address_;
to_dest_pipe_->Send(packet_.Pass());
@@ -538,20 +533,42 @@ class UDPProxyImpl : public UDPProxy {
}
}
+ void AllowWrite(scoped_refptr<net::IOBuffer> buf,
+ scoped_ptr<transport::Packet> packet,
+ int unused_len) {
+ DCHECK(blocked_);
+ blocked_ = false;
+ }
- base::DefaultTickClock tick_clock_;
+ // Input
net::IPEndPoint local_port_;
+
net::IPEndPoint destination_;
bool destination_is_mutable_;
- net::IPEndPoint recv_address_;
+
net::IPEndPoint return_address_;
+ bool set_destination_next_;
+
+ base::DefaultTickClock tick_clock_;
base::Thread proxy_thread_;
scoped_ptr<net::UDPSocket> socket_;
scoped_ptr<PacketPipe> to_dest_pipe_;
scoped_ptr<PacketPipe> from_dest_pipe_;
+
+ // For receiving.
+ net::IPEndPoint recv_address_;
scoped_ptr<transport::Packet> packet_;
+
+ // For sending.
+ bool blocked_;
+
+ base::WeakPtrFactory<UDPProxyImpl> weak_factory_;
};
+void PacketSender::Send(scoped_ptr<transport::Packet> packet) {
+ udp_proxy_->Send(packet.Pass(), *destination_);
+}
+
scoped_ptr<UDPProxy> UDPProxy::Create(
const net::IPEndPoint& local_port,
const net::IPEndPoint& destination,
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698