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 "cloud_print/gcp20/prototype/dns_sd_server.h" | 5 #include "cloud_print/gcp20/prototype/dns_sd_server.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 void DnsSdServer::UpdateMetadata(const std::vector<std::string>& metadata) { | 91 void DnsSdServer::UpdateMetadata(const std::vector<std::string>& metadata) { |
92 if (!IsOnline()) | 92 if (!IsOnline()) |
93 return; | 93 return; |
94 | 94 |
95 metadata_ = metadata; | 95 metadata_ = metadata; |
96 | 96 |
97 // TODO(maksymb): If less than 20% of full TTL left before next announcement | 97 // TODO(maksymb): If less than 20% of full TTL left before next announcement |
98 // then send it now. | 98 // then send it now. |
99 | 99 |
100 uint32 current_ttl = GetCurrentTLL(); | 100 uint32 current_ttl = GetCurrentTLL(); |
101 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kNoAnnouncement)) { | 101 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 102 switches::kNoAnnouncement)) { |
102 DnsResponseBuilder builder(current_ttl); | 103 DnsResponseBuilder builder(current_ttl); |
103 | 104 |
104 builder.AppendTxt(serv_params_.service_name_, current_ttl, metadata_, true); | 105 builder.AppendTxt(serv_params_.service_name_, current_ttl, metadata_, true); |
105 scoped_refptr<net::IOBufferWithSize> buffer(builder.Build()); | 106 scoped_refptr<net::IOBufferWithSize> buffer(builder.Build()); |
106 | 107 |
107 DCHECK(buffer.get() != NULL); | 108 DCHECK(buffer.get() != NULL); |
108 | 109 |
109 socket_->SendTo(buffer.get(), buffer.get()->size(), multicast_address_, | 110 socket_->SendTo(buffer.get(), buffer.get()->size(), multicast_address_, |
110 base::Bind(&DoNothingAfterSendToSocket)); | 111 base::Bind(&DoNothingAfterSendToSocket)); |
111 } | 112 } |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 break; | 177 break; |
177 } | 178 } |
178 } | 179 } |
179 | 180 |
180 scoped_refptr<net::IOBufferWithSize> buffer(builder.Build()); | 181 scoped_refptr<net::IOBufferWithSize> buffer(builder.Build()); |
181 if (buffer.get() == NULL) | 182 if (buffer.get() == NULL) |
182 return; // No answers. | 183 return; // No answers. |
183 | 184 |
184 VLOG(1) << "Current TTL for respond: " << current_ttl; | 185 VLOG(1) << "Current TTL for respond: " << current_ttl; |
185 | 186 |
186 bool unicast_respond = | 187 bool unicast_respond = base::CommandLine::ForCurrentProcess()->HasSwitch( |
187 CommandLine::ForCurrentProcess()->HasSwitch(switches::kUnicastRespond); | 188 switches::kUnicastRespond); |
188 socket_->SendTo(buffer.get(), buffer.get()->size(), | 189 socket_->SendTo(buffer.get(), buffer.get()->size(), |
189 unicast_respond ? recv_address_ : multicast_address_, | 190 unicast_respond ? recv_address_ : multicast_address_, |
190 base::Bind(&DoNothingAfterSendToSocket)); | 191 base::Bind(&DoNothingAfterSendToSocket)); |
191 VLOG(1) << "Responded to " | 192 VLOG(1) << "Responded to " |
192 << (unicast_respond ? recv_address_ : multicast_address_).ToString(); | 193 << (unicast_respond ? recv_address_ : multicast_address_).ToString(); |
193 } | 194 } |
194 | 195 |
195 void DnsSdServer::ProccessQuery(uint32 current_ttl, const DnsQueryRecord& query, | 196 void DnsSdServer::ProccessQuery(uint32 current_ttl, const DnsQueryRecord& query, |
196 DnsResponseBuilder* builder) const { | 197 DnsResponseBuilder* builder) const { |
197 std::string log; | 198 std::string log; |
198 bool responded = false; | 199 bool responded = false; |
199 switch (query.qtype) { | 200 switch (query.qtype) { |
200 // TODO(maksymb): Add IPv6 support. | 201 // TODO(maksymb): Add IPv6 support. |
201 case net::dns_protocol::kTypePTR: | 202 case net::dns_protocol::kTypePTR: |
202 log = "Processing PTR query"; | 203 log = "Processing PTR query"; |
203 if (query.qname == serv_params_.service_type_ || | 204 if (query.qname == serv_params_.service_type_ || |
204 query.qname == serv_params_.secondary_service_type_) { | 205 query.qname == serv_params_.secondary_service_type_) { |
205 builder->AppendPtr(query.qname, current_ttl, | 206 builder->AppendPtr(query.qname, current_ttl, |
206 serv_params_.service_name_, true); | 207 serv_params_.service_name_, true); |
207 | 208 |
208 if (CommandLine::ForCurrentProcess()->HasSwitch( | 209 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
209 switches::kExtendedResponce)) { | 210 switches::kExtendedResponce)) { |
210 builder->AppendSrv(serv_params_.service_name_, current_ttl, | 211 builder->AppendSrv(serv_params_.service_name_, current_ttl, |
211 kSrvPriority, kSrvWeight, serv_params_.http_port_, | 212 kSrvPriority, kSrvWeight, serv_params_.http_port_, |
212 serv_params_.service_domain_name_, false); | 213 serv_params_.service_domain_name_, false); |
213 builder->AppendA(serv_params_.service_domain_name_, current_ttl, | 214 builder->AppendA(serv_params_.service_domain_name_, current_ttl, |
214 serv_params_.http_ipv4_, false); | 215 serv_params_.http_ipv4_, false); |
215 builder->AppendAAAA(serv_params_.service_domain_name_, current_ttl, | 216 builder->AppendAAAA(serv_params_.service_domain_name_, current_ttl, |
216 serv_params_.http_ipv6_, false); | 217 serv_params_.http_ipv6_, false); |
217 builder->AppendTxt(serv_params_.service_name_, current_ttl, metadata_, | 218 builder->AppendTxt(serv_params_.service_name_, current_ttl, metadata_, |
218 false); | 219 false); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
273 | 274 |
274 // TODO(maksymb): Add handler for errors | 275 // TODO(maksymb): Add handler for errors |
275 DCHECK(rv == net::ERR_IO_PENDING); | 276 DCHECK(rv == net::ERR_IO_PENDING); |
276 } | 277 } |
277 | 278 |
278 void DnsSdServer::OnDatagramReceived() { | 279 void DnsSdServer::OnDatagramReceived() { |
279 DoLoop(0); | 280 DoLoop(0); |
280 } | 281 } |
281 | 282 |
282 void DnsSdServer::SendAnnouncement(uint32 ttl) { | 283 void DnsSdServer::SendAnnouncement(uint32 ttl) { |
283 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kNoAnnouncement)) { | 284 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 285 switches::kNoAnnouncement)) { |
284 DnsResponseBuilder builder(ttl); | 286 DnsResponseBuilder builder(ttl); |
285 | 287 |
286 builder.AppendPtr(serv_params_.service_type_, ttl, | 288 builder.AppendPtr(serv_params_.service_type_, ttl, |
287 serv_params_.service_name_, true); | 289 serv_params_.service_name_, true); |
288 builder.AppendPtr(serv_params_.secondary_service_type_, ttl, | 290 builder.AppendPtr(serv_params_.secondary_service_type_, ttl, |
289 serv_params_.service_name_, true); | 291 serv_params_.service_name_, true); |
290 builder.AppendSrv(serv_params_.service_name_, ttl, kSrvPriority, | 292 builder.AppendSrv(serv_params_.service_name_, ttl, kSrvPriority, |
291 kSrvWeight, serv_params_.http_port_, | 293 kSrvWeight, serv_params_.http_port_, |
292 serv_params_.service_domain_name_, true); | 294 serv_params_.service_domain_name_, true); |
293 builder.AppendA(serv_params_.service_domain_name_, ttl, | 295 builder.AppendA(serv_params_.service_domain_name_, ttl, |
(...skipping 25 matching lines...) Expand all Loading... |
319 | 321 |
320 uint32 DnsSdServer::GetCurrentTLL() const { | 322 uint32 DnsSdServer::GetCurrentTLL() const { |
321 uint32 current_ttl = (time_until_live_ - base::Time::Now()).InSeconds(); | 323 uint32 current_ttl = (time_until_live_ - base::Time::Now()).InSeconds(); |
322 if (time_until_live_ < base::Time::Now() || current_ttl == 0) { | 324 if (time_until_live_ < base::Time::Now() || current_ttl == 0) { |
323 // This should not be reachable. But still we don't need to fail. | 325 // This should not be reachable. But still we don't need to fail. |
324 current_ttl = 1; // Service is still alive. | 326 current_ttl = 1; // Service is still alive. |
325 LOG(ERROR) << "|current_ttl| was equal to zero."; | 327 LOG(ERROR) << "|current_ttl| was equal to zero."; |
326 } | 328 } |
327 return current_ttl; | 329 return current_ttl; |
328 } | 330 } |
OLD | NEW |