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