1d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// found in the LICENSE file. 4d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#ifndef CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_TRAFFIC_DETECTOR_H_ 6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_TRAFFIC_DETECTOR_H_ 7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/callback.h" 9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/cancelable_callback.h" 10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "net/base/address_family.h" 1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "net/base/ip_endpoint.h" 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "net/base/network_change_notifier.h" 14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace net { 16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class DatagramServerSocket; 17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class IOBufferWithSize; 18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace local_discovery { 21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Detects mDns traffic that looks like "Privet" protocol. 23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Can produce false positives results, but main task of the class is to avoid 24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// running full mDns listener if user doesn't have devices. 25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// When traffic is detected, class fires callback and shutdowns itself. 26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class PrivetTrafficDetector 27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) : public base::RefCountedThreadSafe< 28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrivetTrafficDetector, content::BrowserThread::DeleteOnIOThread>, 29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private net::NetworkChangeNotifier::NetworkChangeObserver { 30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public: 31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrivetTrafficDetector(net::AddressFamily address_family, 32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::Closure& on_traffic_detected); 33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void Start(); 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private: 37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) friend struct content::BrowserThread::DeleteOnThread< 38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) content::BrowserThread::IO>; 39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) friend class base::DeleteHelper<PrivetTrafficDetector>; 40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual ~PrivetTrafficDetector(); 41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // net::NetworkChangeNotifier::NetworkChangeObserver implementation. 43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void OnNetworkChanged( 44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) net::NetworkChangeNotifier::ConnectionType type) OVERRIDE; 45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void StartOnIOThread(); 47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void ScheduleRestart(); 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void Restart(const net::NetworkInterfaceList& networks); 49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int Bind(); 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool IsSourceAcceptable() const; 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool IsPrivetPacket(int rv) const; 52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int DoLoop(int rv); 53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::Closure on_traffic_detected_; 55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_refptr<base::TaskRunner> callback_runner_; 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) net::NetworkInterfaceList networks_; 57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) net::AddressFamily address_family_; 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) net::IPEndPoint recv_addr_; 59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<net::DatagramServerSocket> socket_; 60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_refptr<net::IOBufferWithSize> io_buffer_; 6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Time start_time_; 6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int restart_attempts_; 6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::WeakPtrFactory<PrivetTrafficDetector> weak_ptr_factory_; 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PrivetTrafficDetector); 67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}; 68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} // namespace local_discovery 70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif // CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_TRAFFIC_DETECTOR_H_ 72