blob: 4e1e41a0e737dde7e0141caf7e0611223ffd8537 [file] [log] [blame]
Paul Stewart0af98bf2011-05-10 17:38:08 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef SHILL_DEVICE_INFO_
6#define SHILL_DEVICE_INFO_
7
Darin Petkove6193c02011-08-11 12:42:40 -07008#include <map>
mukesh agrawal8f317b62011-07-15 11:53:23 -07009#include <set>
10#include <string>
Paul Stewart9a908082011-08-31 12:18:48 -070011#include <vector>
mukesh agrawal8f317b62011-07-15 11:53:23 -070012
Chris Masone487b8bf2011-05-13 16:27:57 -070013#include <base/callback_old.h>
Paul Stewartb50f0b92011-05-16 16:31:42 -070014#include <base/memory/ref_counted.h>
Chris Masone487b8bf2011-05-13 16:27:57 -070015#include <base/memory/scoped_ptr.h>
Darin Petkov0828f5f2011-08-11 10:18:52 -070016#include <gtest/gtest_prod.h> // for FRIEND_TEST
Paul Stewart0af98bf2011-05-10 17:38:08 -070017
Darin Petkove3e1cfa2011-08-11 13:41:17 -070018#include "shill/byte_string.h"
Chris Masone9be4a9d2011-05-16 15:44:09 -070019#include "shill/device.h"
Paul Stewart9a908082011-08-31 12:18:48 -070020#include "shill/ip_address.h"
Paul Stewarta3c56f92011-05-26 07:08:52 -070021#include "shill/rtnl_listener.h"
Paul Stewart0af98bf2011-05-10 17:38:08 -070022
23namespace shill {
24
Paul Stewartb50f0b92011-05-16 16:31:42 -070025class Manager;
Paul Stewart9a908082011-08-31 12:18:48 -070026class RTNLHandler;
Chris Masone2aa97072011-08-09 17:35:08 -070027class RTNLMessage;
Paul Stewartb50f0b92011-05-16 16:31:42 -070028
Paul Stewart0af98bf2011-05-10 17:38:08 -070029class DeviceInfo {
30 public:
Paul Stewart9a908082011-08-31 12:18:48 -070031 struct AddressData {
32 AddressData()
Paul Stewart7355ce12011-09-02 10:47:01 -070033 : address(IPAddress::kFamilyUnknown), flags(0), scope(0) {}
Paul Stewart9a908082011-08-31 12:18:48 -070034 AddressData(const IPAddress &address_in,
35 unsigned char flags_in,
36 unsigned char scope_in)
37 : address(address_in), flags(flags_in), scope(scope_in) {}
38 IPAddress address;
39 unsigned char flags;
40 unsigned char scope;
41 };
42
Paul Stewartb50f0b92011-05-16 16:31:42 -070043 DeviceInfo(ControlInterface *control_interface,
44 EventDispatcher *dispatcher,
45 Manager *manager);
Paul Stewart0af98bf2011-05-10 17:38:08 -070046 ~DeviceInfo();
Darin Petkov887f2982011-07-14 16:10:17 -070047
mukesh agrawal8f317b62011-07-15 11:53:23 -070048 void AddDeviceToBlackList(const std::string &device_name);
Paul Stewart0af98bf2011-05-10 17:38:08 -070049 void Start();
50 void Stop();
Darin Petkov887f2982011-07-14 16:10:17 -070051
Darin Petkov6f9eaa32011-08-09 15:26:44 -070052 // Adds |device| to this DeviceInfo instance so that we can handle its link
53 // messages, and registers it with the manager.
54 void RegisterDevice(const DeviceRefPtr &device);
55
Darin Petkove3e1cfa2011-08-11 13:41:17 -070056 DeviceRefPtr GetDevice(int interface_index) const;
Paul Stewart32852962011-08-30 14:06:53 -070057 virtual bool GetMACAddress(int interface_index, ByteString *address) const;
Chris Masone626719f2011-08-18 16:58:48 -070058 virtual bool GetFlags(int interface_index, unsigned int *flags) const;
Paul Stewart9a908082011-08-31 12:18:48 -070059 virtual bool GetAddresses(int interface_index,
60 std::vector<AddressData> *addresses) const;
61 virtual void FlushAddresses(int interface_index) const;
Paul Stewart0af98bf2011-05-10 17:38:08 -070062
63 private:
Darin Petkov887f2982011-07-14 16:10:17 -070064 friend class DeviceInfoTest;
Darin Petkov0828f5f2011-08-11 10:18:52 -070065 FRIEND_TEST(CellularTest, StartLinked);
Darin Petkov887f2982011-07-14 16:10:17 -070066
Darin Petkove6193c02011-08-11 12:42:40 -070067 struct Info {
68 Info() : flags(0) {}
69
70 DeviceRefPtr device;
Paul Stewart32852962011-08-30 14:06:53 -070071 ByteString mac_address;
Paul Stewart9a908082011-08-31 12:18:48 -070072 std::vector<AddressData> ip_addresses;
Darin Petkove6193c02011-08-11 12:42:40 -070073 unsigned int flags;
74 };
75
Paul Stewartbf1861b2011-08-23 15:45:35 -070076 static const char kInterfaceUevent[];
77 static const char kInterfaceDriver[];
Paul Stewartb50f0b92011-05-16 16:31:42 -070078 static const char *kModemDrivers[];
Paul Stewartbf1861b2011-08-23 15:45:35 -070079 static const char kInterfaceIPv6Privacy[];
Paul Stewartb50f0b92011-05-16 16:31:42 -070080
Chris Masone2aa97072011-08-09 17:35:08 -070081 static Device::Technology GetDeviceTechnology(const std::string &face_name);
Darin Petkov6f9eaa32011-08-09 15:26:44 -070082
Chris Masone2aa97072011-08-09 17:35:08 -070083 void AddLinkMsgHandler(const RTNLMessage &msg);
84 void DelLinkMsgHandler(const RTNLMessage &msg);
85 void LinkMsgHandler(const RTNLMessage &msg);
Paul Stewart9a908082011-08-31 12:18:48 -070086 void AddressMsgHandler(const RTNLMessage &msg);
Paul Stewart0af98bf2011-05-10 17:38:08 -070087
Darin Petkove3e1cfa2011-08-11 13:41:17 -070088 const Info *GetInfo(int interface_index) const;
Darin Petkove6193c02011-08-11 12:42:40 -070089 void RemoveInfo(int interface_index);
Paul Stewartbf1861b2011-08-23 15:45:35 -070090 void EnableDeviceIPv6Privacy(const std::string &link_name);
Darin Petkov67d8ecf2011-07-26 16:03:30 -070091
Paul Stewartb50f0b92011-05-16 16:31:42 -070092 ControlInterface *control_interface_;
Paul Stewart0af98bf2011-05-10 17:38:08 -070093 EventDispatcher *dispatcher_;
Paul Stewartb50f0b92011-05-16 16:31:42 -070094 Manager *manager_;
Darin Petkove6193c02011-08-11 12:42:40 -070095 std::map<int, Info> infos_;
Chris Masone2aa97072011-08-09 17:35:08 -070096 scoped_ptr<Callback1<const RTNLMessage &>::Type> link_callback_;
Paul Stewart9a908082011-08-31 12:18:48 -070097 scoped_ptr<Callback1<const RTNLMessage &>::Type> address_callback_;
Paul Stewarta3c56f92011-05-26 07:08:52 -070098 scoped_ptr<RTNLListener> link_listener_;
Paul Stewart9a908082011-08-31 12:18:48 -070099 scoped_ptr<RTNLListener> address_listener_;
mukesh agrawal8f317b62011-07-15 11:53:23 -0700100 std::set<std::string> black_list_;
Darin Petkove6193c02011-08-11 12:42:40 -0700101
Paul Stewart9a908082011-08-31 12:18:48 -0700102 // Cache copy of singleton
103 RTNLHandler *rtnl_handler_;
104
Darin Petkove6193c02011-08-11 12:42:40 -0700105 DISALLOW_COPY_AND_ASSIGN(DeviceInfo);
Paul Stewart0af98bf2011-05-10 17:38:08 -0700106};
107
Paul Stewart0af98bf2011-05-10 17:38:08 -0700108} // namespace shill
109
110#endif // SHILL_DEVICE_INFO_