|
|
Chromium Code Reviews|
Created:
7 years ago by imcheng Modified:
7 years ago CC:
chromium-reviews, chromium-apps-reviews_chromium.org, extensions-reviews_chromium.org Base URL:
https://chromium.googlesource.com/chromium/src.git@master Visibility:
Public. |
Description"Reland" of r241209.
DialServiceImpl now binds to all ipv4 interfaces instead of just the first ipv4 found. Dedup is done using address family + interface index.
It now also checks if there are any other open sockets when notifying observers on error and sends a different error code (DIAL_SERVICE_NO_INTERFACES instead of the usual DIAL_SERVICE_SOCKET_ERROR) if there are no other open sockets. The error codes are treated the same upstream currently. Later we should make sure DIAL_SERVICE_SOCKET_ERROR doesn't clear the device list.
Added unit tests for multiple interfaces and open sockets checking.
TEST=unit tests, did some manual testing at the lab.
Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=242090
Patch Set 1 : #
Total comments: 2
Messages
Total messages: 13 (0 generated)
On 2013/12/19 00:04:29, imcheng1 wrote: LGTM.
CQ is trying da patch. Follow status at https://chromium-status.appspot.com/cq/imcheng@chromium.org/117853004/40001
Failed to apply patch for chrome/browser/extensions/api/dial/dial_service.cc:
While running patch -p1 --forward --force --no-backup-if-mismatch;
patching file chrome/browser/extensions/api/dial/dial_service.cc
Hunk #2 FAILED at 134.
Hunk #3 FAILED at 158.
Hunk #4 FAILED at 263.
Hunk #5 FAILED at 284.
Hunk #6 FAILED at 341.
Hunk #7 FAILED at 353.
Hunk #8 FAILED at 365.
Hunk #9 FAILED at 375.
Hunk #10 FAILED at 449.
Hunk #11 FAILED at 481.
10 out of 11 hunks FAILED -- saving rejects to file
chrome/browser/extensions/api/dial/dial_service.cc.rej
Patch: chrome/browser/extensions/api/dial/dial_service.cc
Index: chrome/browser/extensions/api/dial/dial_service.cc
diff --git a/chrome/browser/extensions/api/dial/dial_service.cc
b/chrome/browser/extensions/api/dial/dial_service.cc
index
f7f8112487036375de952dd597e88c60da11bcd1..96f5402500c0d4dd55bdad893c88adfd9665b1fc
100644
--- a/chrome/browser/extensions/api/dial/dial_service.cc
+++ b/chrome/browser/extensions/api/dial/dial_service.cc
@@ -5,6 +5,8 @@
#include "chrome/browser/extensions/api/dial/dial_service.h"
#include <algorithm>
+#include <set>
+#include <utility>
#include "base/basictypes.h"
#include "base/callback.h"
@@ -132,7 +134,6 @@ IPAddressNumber GetBestBindAddressByType(
return IPAddressNumber();
}
if (bind_ip_address.size() != net::kIPv4AddressSize) {
- LOG(ERROR) << "Default network is not using IPv4.";
return IPAddressNumber();
}
@@ -156,102 +157,36 @@ IPAddressNumber GetBestBindAddressChromeOS() {
} // namespace
-DialServiceImpl::DialServiceImpl(net::NetLog* net_log)
- : is_writing_(false),
- is_reading_(false),
- discovery_active_(false),
- num_requests_sent_(0),
- max_requests_(kDialMaxRequests),
- finish_delay_(TimeDelta::FromMilliseconds((kDialMaxRequests - 1) *
- kDialRequestIntervalMillis) +
- TimeDelta::FromSeconds(kDialResponseTimeoutSecs)),
- request_interval_(TimeDelta::FromMilliseconds(kDialRequestIntervalMillis))
{
- IPAddressNumber address;
- bool result = net::ParseIPLiteralToNumber(kDialRequestAddress, &address);
- DCHECK(result);
- send_address_ = IPEndPoint(address, kDialRequestPort);
- send_buffer_ = new StringIOBuffer(BuildRequest());
- net_log_ = net_log;
- net_log_source_.type = net::NetLog::SOURCE_UDP_SOCKET;
- net_log_source_.id = net_log_->NextID();
-}
-
-DialServiceImpl::~DialServiceImpl() {
- DCHECK(thread_checker_.CalledOnValidThread());
+DialServiceImpl::DialSocket::DialSocket(
+ const base::Closure& discovery_request_cb,
+ const base::Callback<void(const DialDeviceData&)>& device_discovered_cb,
+ const base::Closure& on_error_cb)
+ : discovery_request_cb_(discovery_request_cb),
+ device_discovered_cb_(device_discovered_cb),
+ on_error_cb_(on_error_cb),
+ is_writing_(false),
+ is_reading_(false) {
}
-void DialServiceImpl::AddObserver(Observer* observer) {
+DialServiceImpl::DialSocket::~DialSocket() {
DCHECK(thread_checker_.CalledOnValidThread());
- observer_list_.AddObserver(observer);
}
-void DialServiceImpl::RemoveObserver(Observer* observer) {
- DCHECK(thread_checker_.CalledOnValidThread());
- observer_list_.RemoveObserver(observer);
-}
-
-bool DialServiceImpl::HasObserver(Observer* observer) {
- DCHECK(thread_checker_.CalledOnValidThread());
- return observer_list_.HasObserver(observer);
-}
-
-bool DialServiceImpl::Discover() {
- DCHECK(thread_checker_.CalledOnValidThread());
- if (discovery_active_)
- return false;
- discovery_active_ = true;
-
- VLOG(2) << "Discovery started.";
-
- StartDiscovery();
- return true;
-}
-
-void DialServiceImpl::StartDiscovery() {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(discovery_active_);
- if (socket_.get())
- return;
-
-#if defined(OS_CHROMEOS)
- // The ChromeOS specific version of getting network interfaces does not
- // require trampolining to another thread, and contains additional interface
- // information such as interface types (i.e. wifi vs cellular).
- BindSocketAndSendRequest(GetBestBindAddressChromeOS());
-#else
- BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, base::Bind(
- &GetNetworkListOnFileThread,
- base::MessageLoopProxy::current(), base::Bind(
- &DialServiceImpl::SendNetworkList, AsWeakPtr())));
-#endif
-}
-
-bool DialServiceImpl::BindSocketAndSendRequest(
- const IPAddressNumber& bind_ip_address) {
+bool DialServiceImpl::DialSocket::CreateAndBindSocket(
+ const IPAddressNumber& bind_ip_address,
+ net::NetLog* net_log,
+ net::NetLog::Source net_log_source) {
DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(!socket_.get());
-
- if (bind_ip_address.size() == 0) {
- DVLOG(1) << "Could not find a valid interface to bind.";
- FinishDiscovery();
- return false;
- }
+ DCHECK(bind_ip_address.size() == net::kIPv4AddressSize);
net::RandIntCallback rand_cb = base::Bind(&base::RandInt);
socket_.reset(new UDPSocket(net::DatagramSocket::RANDOM_BIND,
rand_cb,
- net_log_,
- net_log_source_));
+ net_log,
+ net_log_source));
socket_->AllowBroadcast();
- // Schedule a timer to finish the discovery process (and close the socket).
- if (finish_delay_ > TimeDelta::FromSeconds(0)) {
- finish_timer_.Start(FROM_HERE,
- finish_delay_,
- this,
- &DialServiceImpl::FinishDiscovery);
- }
-
// 0 means bind a random port
IPEndPoint address(bind_ip_address, 0);
@@ -261,18 +196,12 @@ bool DialServiceImpl::BindSocketAndSendRequest(
DCHECK(socket_.get());
recv_buffer_ = new IOBufferWithSize(kDialRecvBufferSize);
- if (!ReadSocket())
- return false;
- SendOneRequest();
- return true;
+ return ReadSocket();
}
-void DialServiceImpl::SendOneRequest() {
- if (num_requests_sent_ == max_requests_) {
- request_timer_.Stop();
- return;
- }
- num_requests_sent_++;
+void DialServiceImpl::DialSocket::SendOneRequest(
+ const net::IPEndPoint& send_address,
+ const scoped_refptr<net::StringIOBuffer>& send_buffer) {
if (!socket_.get()) {
DLOG(WARNING) << "Socket not connected.";
return;
@@ -282,45 +211,60 @@ void DialServiceImpl::SendOneRequest() {
VLOG(2) << "Already writing.";
return;
}
- VLOG(2) << "Sending request " << num_requests_sent_ << "/"
- << max_requests_;
+
is_writing_ = true;
int result = socket_->SendTo(
- send_buffer_.get(), send_buffer_->size(), send_address_,
- base::Bind(&DialServiceImpl::OnSocketWrite, AsWeakPtr()));
+ send_buffer.get(), send_buffer->size(), send_address,
+ base::Bind(&DialServiceImpl::DialSocket::OnSocketWrite,
+ base::Unretained(this),
+ send_buffer->size()));
bool result_ok = CheckResult("SendTo", result);
if (result_ok && result > 0) {
// Synchronous write.
- OnSocketWrite(result);
+ OnSocketWrite(send_buffer->size(), result);
}
}
-void DialServiceImpl::OnSocketWrite(int result) {
+bool DialServiceImpl::DialSocket::IsClosed() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ return !socket_.get();
+}
+
+bool DialServiceImpl::DialSocket::CheckResult(const char* operation,
+ int result) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ VLOG(2) << "Operation " << operation << " result " << result;
+ if (result < net::OK && result != net::ERR_IO_PENDING) {
+ Close();
+ std::string error_str(net::ErrorToString(result));
+ DVLOG(0) << "dial socket error: " << error_str;
+ on_error_cb_.Run();
+ return false;
+ }
+ return true;
+}
+
+void DialServiceImpl::DialSocket::Close() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ is_reading_ = false;
+ is_writing_ = false;
+ socket_.reset();
+}
+
+void DialServiceImpl::DialSocket::OnSocketWrite(int send_buffer_size,
+ int result) {
DCHECK(thread_checker_.CalledOnValidThread());
is_writing_ = false;
if (!CheckResult("OnSocketWrite", result))
return;
-
- if (result != send_buffer_->size()) {
+ if (result != send_buffer_size) {
DLOG(ERROR) << "Sent " << result << " chars, expected "
- << send_buffer_->size() << " chars";
- }
- // If discovery is inactive, no reason to notify observers.
- if (!discovery_active_) {
- VLOG(2) << "Request sent after discovery finished. Ignoring.";
- return;
- }
- FOR_EACH_OBSERVER(Observer, observer_list_, OnDiscoveryRequest(this));
- // If we need to send additional requests, schedule a timer to do so.
- if (num_requests_sent_ < max_requests_ && num_requests_sent_ == 1) {
- request_timer_.Start(FROM_HERE,
- request_interval_,
- this,
- &DialServiceImpl::SendOneRequest);
+ << send_buffer_size << " chars";
}
+ discovery_request_cb_.Run();
}
-bool DialServiceImpl::ReadSocket() {
+bool DialServiceImpl::DialSocket::ReadSocket() {
DCHECK(thread_checker_.CalledOnValidThread());
if (!socket_.get()) {
DLOG(WARNING) << "Socket not connected.";
@@ -339,7 +283,8 @@ bool DialServiceImpl::ReadSocket() {
result = socket_->RecvFrom(
recv_buffer_.get(),
kDialRecvBufferSize, &recv_address_,
- base::Bind(&DialServiceImpl::OnSocketRead, AsWeakPtr()));
+ base::Bind(&DialServiceImpl::DialSocket::OnSocketRead,
+ base::Unretained(this)));
result_ok = CheckResult("RecvFrom", result);
if (result != net::ERR_IO_PENDING)
is_reading_ = false;
@@ -351,7 +296,7 @@ bool DialServiceImpl::ReadSocket() {
return result_ok;
}
-void DialServiceImpl::OnSocketRead(int result) {
+void DialSeā¦
(message too large)
Hey Alpha, I fixed the merge issue. Mark, can you please take a look as well? Thanks.
LGTM https://codereview.chromium.org/117853004/diff/200001/chrome/browser/extensio... File chrome/browser/extensions/api/dial/dial_service_unittest.cc (right): https://codereview.chromium.org/117853004/diff/200001/chrome/browser/extensio... chrome/browser/extensions/api/dial/dial_service_unittest.cc:70: EXPECT_EQ(1u, dial_service_.dial_sockets_.size()); I don't think it's necessary to designate constants as unsigned here. https://codereview.chromium.org/117853004/diff/200001/chrome/browser/extensio... chrome/browser/extensions/api/dial/dial_service_unittest.cc:98: EXPECT_EQ(3u, dial_service_.dial_sockets_.size()); Ditto.
On 2013/12/19 17:27:41, mark a. foltz wrote: > LGTM > > https://codereview.chromium.org/117853004/diff/200001/chrome/browser/extensio... > File chrome/browser/extensions/api/dial/dial_service_unittest.cc (right): > > https://codereview.chromium.org/117853004/diff/200001/chrome/browser/extensio... > chrome/browser/extensions/api/dial/dial_service_unittest.cc:70: EXPECT_EQ(1u, > dial_service_.dial_sockets_.size()); > I don't think it's necessary to designate constants as unsigned here. > > https://codereview.chromium.org/117853004/diff/200001/chrome/browser/extensio... > chrome/browser/extensions/api/dial/dial_service_unittest.cc:98: EXPECT_EQ(3u, > dial_service_.dial_sockets_.size()); > Ditto. RSLGTM given Mark's LGTM.
CQ is trying da patch. Follow status at https://chromium-status.appspot.com/cq/imcheng@chromium.org/117853004/200001
Retried try job too often on linux_aura for step(s) browser_tests http://build.chromium.org/p/tryserver.chromium/buildstatus?builder=linux_aura...
CQ is trying da patch. Follow status at https://chromium-status.appspot.com/cq/imcheng@chromium.org/117853004/200001
Retried try job too often on linux_aura for step(s) browser_tests http://build.chromium.org/p/tryserver.chromium/buildstatus?builder=linux_aura...
CQ is trying da patch. Follow status at https://chromium-status.appspot.com/cq/imcheng@chromium.org/117853004/200001
Message was sent while issue was closed.
Change committed as 242090 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
