Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/dns/mdns_client_impl.h" | 5 #include "net/dns/mdns_client_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <queue> | 8 #include <queue> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 37 // The fractions of the record's original TTL after which an active listener | 37 // The fractions of the record's original TTL after which an active listener |
| 38 // (one that had |SetActiveRefresh(true)| called) will send a query to refresh | 38 // (one that had |SetActiveRefresh(true)| called) will send a query to refresh |
| 39 // its cache. This happens both at 85% of the original TTL and again at 95% of | 39 // its cache. This happens both at 85% of the original TTL and again at 95% of |
| 40 // the original TTL. | 40 // the original TTL. |
| 41 const double kListenerRefreshRatio1 = 0.85; | 41 const double kListenerRefreshRatio1 = 0.85; |
| 42 const double kListenerRefreshRatio2 = 0.95; | 42 const double kListenerRefreshRatio2 = 0.95; |
| 43 | 43 |
| 44 } // namespace | 44 } // namespace |
| 45 | 45 |
| 46 void MDnsSocketFactoryImpl::CreateSockets( | 46 void MDnsSocketFactoryImpl::CreateSockets( |
| 47 ScopedVector<DatagramServerSocket>* sockets) { | 47 std::vector<scoped_ptr<DatagramServerSocket>>* sockets) { |
| 48 InterfaceIndexFamilyList interfaces(GetMDnsInterfacesToBind()); | 48 InterfaceIndexFamilyList interfaces(GetMDnsInterfacesToBind()); |
| 49 for (size_t i = 0; i < interfaces.size(); ++i) { | 49 for (size_t i = 0; i < interfaces.size(); ++i) { |
| 50 DCHECK(interfaces[i].second == ADDRESS_FAMILY_IPV4 || | 50 DCHECK(interfaces[i].second == ADDRESS_FAMILY_IPV4 || |
| 51 interfaces[i].second == ADDRESS_FAMILY_IPV6); | 51 interfaces[i].second == ADDRESS_FAMILY_IPV6); |
| 52 scoped_ptr<DatagramServerSocket> socket( | 52 scoped_ptr<DatagramServerSocket> socket( |
| 53 CreateAndBindMDnsSocket(interfaces[i].second, interfaces[i].first)); | 53 CreateAndBindMDnsSocket(interfaces[i].second, interfaces[i].first)); |
| 54 if (socket) | 54 if (socket) |
| 55 sockets->push_back(socket.Pass()); | 55 sockets->push_back(socket.Pass()); |
| 56 } | 56 } |
| 57 } | 57 } |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 135 } | 135 } |
| 136 | 136 |
| 137 MDnsConnection::MDnsConnection(MDnsConnection::Delegate* delegate) | 137 MDnsConnection::MDnsConnection(MDnsConnection::Delegate* delegate) |
| 138 : delegate_(delegate), weak_ptr_factory_(this) { | 138 : delegate_(delegate), weak_ptr_factory_(this) { |
| 139 } | 139 } |
| 140 | 140 |
| 141 MDnsConnection::~MDnsConnection() { | 141 MDnsConnection::~MDnsConnection() { |
| 142 } | 142 } |
| 143 | 143 |
| 144 bool MDnsConnection::Init(MDnsSocketFactory* socket_factory) { | 144 bool MDnsConnection::Init(MDnsSocketFactory* socket_factory) { |
| 145 ScopedVector<DatagramServerSocket> sockets; | 145 std::vector<scoped_ptr<DatagramServerSocket>> sockets; |
| 146 socket_factory->CreateSockets(&sockets); | 146 socket_factory->CreateSockets(&sockets); |
| 147 | 147 |
| 148 for (size_t i = 0; i < sockets.size(); ++i) { | 148 for (scoped_ptr<DatagramServerSocket>& socket : sockets) { |
| 149 socket_handlers_.push_back( | 149 socket_handlers_.push_back(make_scoped_ptr( |
| 150 new MDnsConnection::SocketHandler(make_scoped_ptr(sockets[i]), this)); | 150 new MDnsConnection::SocketHandler(std::move(socket), this))); |
| 151 } | 151 } |
| 152 sockets.weak_clear(); | |
| 153 | 152 |
| 154 // All unbound sockets need to be bound before processing untrusted input. | 153 // All unbound sockets need to be bound before processing untrusted input. |
| 155 // This is done for security reasons, so that an attacker can't get an unbound | 154 // This is done for security reasons, so that an attacker can't get an unbound |
| 156 // socket. | 155 // socket. |
| 157 for (size_t i = 0; i < socket_handlers_.size();) { | 156 for (size_t i = 0; i < socket_handlers_.size();) { |
| 158 int rv = socket_handlers_[i]->Start(); | 157 int rv = socket_handlers_[i]->Start(); |
| 159 if (rv != OK) { | 158 if (rv != OK) { |
| 160 socket_handlers_.erase(socket_handlers_.begin() + i); | 159 socket_handlers_.erase(socket_handlers_.begin() + i); |
| 161 VLOG(1) << "Start failed, socket=" << i << ", error=" << rv; | 160 VLOG(1) << "Start failed, socket=" << i << ", error=" << rv; |
| 162 } else { | 161 } else { |
| 163 ++i; | 162 ++i; |
| 164 } | 163 } |
| 165 } | 164 } |
| 166 VLOG(1) << "Sockets ready:" << socket_handlers_.size(); | 165 VLOG(1) << "Sockets ready:" << socket_handlers_.size(); |
| 167 return !socket_handlers_.empty(); | 166 return !socket_handlers_.empty(); |
| 168 } | 167 } |
| 169 | 168 |
| 170 void MDnsConnection::Send(const scoped_refptr<IOBuffer>& buffer, | 169 void MDnsConnection::Send(const scoped_refptr<IOBuffer>& buffer, |
| 171 unsigned size) { | 170 unsigned size) { |
| 172 for (size_t i = 0; i < socket_handlers_.size(); ++i) | 171 for (scoped_ptr<SocketHandler>& handler : socket_handlers_) |
| 173 socket_handlers_[i]->Send(buffer, size); | 172 handler->Send(buffer, size); |
| 174 } | 173 } |
| 175 | 174 |
| 176 void MDnsConnection::PostOnError(SocketHandler* loop, int rv) { | 175 void MDnsConnection::PostOnError(SocketHandler* loop, int rv) { |
| 177 VLOG(1) << "Socket error. id=" | 176 int id = 0; |
| 178 << std::find(socket_handlers_.begin(), socket_handlers_.end(), loop) - | 177 for (auto& it : socket_handlers_) { |
|
mmenke
2015/11/24 17:39:33
const? Not that it gets us a whole lot here.
| |
| 179 socket_handlers_.begin() << ", error=" << rv; | 178 if (it.get() == loop) { |
| 179 break; | |
| 180 } | |
|
mmenke
2015/11/24 17:39:33
nit: Don't use braces for two-line ifs.
| |
| 181 id++; | |
| 182 } | |
| 183 VLOG(1) << "Socket error. id=" << id << ", error=" << rv; | |
| 180 // Post to allow deletion of this object by delegate. | 184 // Post to allow deletion of this object by delegate. |
| 181 base::ThreadTaskRunnerHandle::Get()->PostTask( | 185 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 182 FROM_HERE, | 186 FROM_HERE, |
| 183 base::Bind(&MDnsConnection::OnError, weak_ptr_factory_.GetWeakPtr(), rv)); | 187 base::Bind(&MDnsConnection::OnError, weak_ptr_factory_.GetWeakPtr(), rv)); |
| 184 } | 188 } |
| 185 | 189 |
| 186 void MDnsConnection::OnError(int rv) { | 190 void MDnsConnection::OnError(int rv) { |
| 187 // TODO(noamsml): Specific handling of intermittent errors that can be handled | 191 // TODO(noamsml): Specific handling of intermittent errors that can be handled |
| 188 // in the connection. | 192 // in the connection. |
| 189 delegate_->OnConnectionError(rv); | 193 delegate_->OnConnectionError(rv); |
| (...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 741 | 745 |
| 742 void MDnsTransactionImpl::OnNsecRecord(const std::string& name, unsigned type) { | 746 void MDnsTransactionImpl::OnNsecRecord(const std::string& name, unsigned type) { |
| 743 TriggerCallback(RESULT_NSEC, NULL); | 747 TriggerCallback(RESULT_NSEC, NULL); |
| 744 } | 748 } |
| 745 | 749 |
| 746 void MDnsTransactionImpl::OnCachePurged() { | 750 void MDnsTransactionImpl::OnCachePurged() { |
| 747 // TODO(noamsml): Cache purge situations not yet implemented | 751 // TODO(noamsml): Cache purge situations not yet implemented |
| 748 } | 752 } |
| 749 | 753 |
| 750 } // namespace net | 754 } // namespace net |
| OLD | NEW |