1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file. 4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef CLOUD_PRINT_GCP20_PROTOTYPE_DNS_SD_SERVER_H_ 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define CLOUD_PRINT_GCP20_PROTOTYPE_DNS_SD_SERVER_H_ 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <string> 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <vector> 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/basictypes.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/scoped_ptr.h" 13a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/memory/weak_ptr.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cloud_print/gcp20/prototype/service_parameters.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/ip_endpoint.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/udp/udp_socket.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace net { 19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass IOBufferWithSize; 21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 22ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} // namespace net 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstruct DnsQueryRecord; 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass DnsResponseBuilder; 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Class for sending multicast announcements, receiving queries and answering on 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// them. 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// TODO(maksymb): Implement probing. 30a3f7b4e666c476898878fa745f637129375cd889Ben Murdochclass DnsSdServer : public base::SupportsWeakPtr<DnsSdServer> { 31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Constructor does not start server. 33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DnsSdServer(); 34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Stops the server and destroys the object. 36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ~DnsSdServer(); 37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Starts the server. Returns |true| if server works. Also sends 39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // announcement. 40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bool Start(const ServiceParameters& serv_params, 41558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch uint32 full_ttl, 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<std::string>& metadata) WARN_UNUSED_RESULT; 43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Sends announcement if server works. 45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void Update(); 46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Stops server with announcement. 48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void Shutdown(); 49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Returns |true| if server works. 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool IsOnline() { return !!socket_; } 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Updates data for TXT respond. 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void UpdateMetadata(const std::vector<std::string>& metadata); 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Binds a socket to multicast address. Returns |true| on success. 58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool CreateSocket(); 59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Processes single query. 61558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch void ProccessQuery(uint32 current_ttl, 62558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const DnsQueryRecord& query, 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DnsResponseBuilder* builder) const; 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Processes DNS message. 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void ProcessMessage(int len, net::IOBufferWithSize* buf); 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // CompletionCallback for receiving data from DNS. 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void DoLoop(int rv); 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Function to start listening to socket (delegate to DoLoop function). 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void OnDatagramReceived(); 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Sends announcement. 75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void SendAnnouncement(uint32 ttl); 76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Calculates and returns current TTL (with accordance to last send 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // announcement time. 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch uint32 GetCurrentTLL() const; 80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Stores socket to multicast address. 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<net::UDPSocket> socket_; 83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Stores multicast address end point. 85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::IPEndPoint multicast_address_; 86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Stores time until last announcement is live. 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Time time_until_live_; 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Stores service parameters (like service-name and service-type etc.) 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ServiceParameters serv_params_; 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Stores the buffer for receiving messages. 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<net::IOBufferWithSize> recv_buf_; 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Stores address from where last message was sent. 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch net::IPEndPoint recv_address_; 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Stores information for TXT respond. 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string> metadata_; 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // TTL for announcements 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch uint32 full_ttl_; 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DnsSdServer); 106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // CLOUD_PRINT_GCP20_PROTOTYPE_DNS_SD_SERVER_H_ 109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 110