blob: 4de7a156062735ef2896a6154d4d3d98c8edb4a2 [file] [log] [blame]
Thieu Lee41a72d2012-02-06 20:46:51 +00001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
mukesh agrawalb54601c2011-06-07 17:39:22 -07002// 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_WIFI_ENDPOINT_
6#define SHILL_WIFI_ENDPOINT_
7
8#include <map>
mukesh agrawal6e277772011-09-29 15:04:23 -07009#include <set>
mukesh agrawalb54601c2011-06-07 17:39:22 -070010#include <string>
11#include <vector>
12
13#include <base/memory/ref_counted.h>
14#include <dbus-c++/dbus.h>
mukesh agrawal6e277772011-09-29 15:04:23 -070015#include <gtest/gtest_prod.h> // for FRIEND_TEST
mukesh agrawalb54601c2011-06-07 17:39:22 -070016
17#include "shill/endpoint.h"
Paul Stewart26b327e2011-10-19 11:38:09 -070018#include "shill/event_dispatcher.h"
Thieu Le1df7f4e2012-02-10 15:21:45 -080019#include "shill/metrics.h"
mukesh agrawalb54601c2011-06-07 17:39:22 -070020
21namespace shill {
22
23class WiFiEndpoint : public Endpoint {
24 public:
25 WiFiEndpoint(const std::map<std::string, ::DBus::Variant> &properties);
26 virtual ~WiFiEndpoint();
Chris Masone092df3e2011-08-22 09:41:39 -070027
28 // Maps mode strings from flimflam's nomenclature, as defined
29 // in chromeos/dbus/service_constants.h, to uints used by supplicant
30 static uint32_t ModeStringToUint(const std::string &mode_string);
31
mukesh agrawalb54601c2011-06-07 17:39:22 -070032 const std::vector<uint8_t> &ssid() const;
33 const std::string &ssid_string() const;
34 const std::string &ssid_hex() const;
35 const std::string &bssid_string() const;
36 const std::string &bssid_hex() const;
37 int16_t signal_strength() const;
Thieu Lee41a72d2012-02-06 20:46:51 +000038 uint16 frequency() const;
Thieu Le1df7f4e2012-02-10 15:21:45 -080039 uint16 physical_mode() const;
Chris Masone092df3e2011-08-22 09:41:39 -070040 const std::string &network_mode() const;
mukesh agrawal6e277772011-09-29 15:04:23 -070041 const std::string &security_mode() const;
mukesh agrawalb54601c2011-06-07 17:39:22 -070042
43 private:
mukesh agrawal6e277772011-09-29 15:04:23 -070044 friend class WiFiEndpointTest;
mukesh agrawal8a3188d2011-12-01 20:56:44 +000045 friend class WiFiMainTest; // for MakeOpenEndpoint
46 friend class WiFiServiceTest; // for MakeOpenEndpoint
mukesh agrawal16bc1b82012-02-09 18:38:26 -080047 FRIEND_TEST(WiFiEndpointTest, SSIDWithNull); // for MakeOpenEndpoint
mukesh agrawal6e277772011-09-29 15:04:23 -070048 // these test cases need access to the KeyManagement enum
49 FRIEND_TEST(WiFiEndpointTest, ParseKeyManagementMethodsEAP);
50 FRIEND_TEST(WiFiEndpointTest, ParseKeyManagementMethodsPSK);
51 FRIEND_TEST(WiFiEndpointTest, ParseKeyManagementMethodsEAPAndPSK);
Thieu Le1df7f4e2012-02-10 15:21:45 -080052 FRIEND_TEST(WiFiEndpointTest, DeterminePhyMode);
mukesh agrawalb54601c2011-06-07 17:39:22 -070053
mukesh agrawal6e277772011-09-29 15:04:23 -070054 enum KeyManagement {
55 kKeyManagement802_1x,
56 kKeyManagementPSK
57 };
mukesh agrawalb54601c2011-06-07 17:39:22 -070058
mukesh agrawal8a3188d2011-12-01 20:56:44 +000059 // Build a simple WiFiEndpoint, for testing purposes.
60 static WiFiEndpoint *MakeOpenEndpoint(
61 const std::string &ssid, const std::string &bssid);
Chris Masone092df3e2011-08-22 09:41:39 -070062 // Maps mode strings from supplicant into flimflam's nomenclature, as defined
63 // in chromeos/dbus/service_constants.h
64 static const char *ParseMode(const std::string &mode_string);
mukesh agrawal6e277772011-09-29 15:04:23 -070065 // Parses an Endpoint's properties to identify approprirate flimflam
66 // security property value, as defined in chromeos/dbus/service_constants.h
67 static const char *ParseSecurity(
68 const std::map<std::string, ::DBus::Variant> &properties);
69 // Parses and Endpoint's properties' "RSN" or "WPA" sub-dictionary, to
70 // identify supported key management methods (802.1x or PSK).
71 static void ParseKeyManagementMethods(
72 const std::map<std::string, ::DBus::Variant> &security_method_properties,
73 std::set<KeyManagement> *key_management_methods);
Thieu Le1df7f4e2012-02-10 15:21:45 -080074 // Determine the negotiated operating mode for the channel by looking at
75 // the information elements, frequency and data rates. The information
76 // elements and data rates live in |properties|.
77 static Metrics::WiFiNetworkPhyMode DeterminePhyMode(
78 const std::map<std::string, ::DBus::Variant> &properties,
79 uint16 frequency);
80 // Parse information elements to determine the physical mode.
81 static Metrics::WiFiNetworkPhyMode ParseIEsForPhyMode(
82 const std::vector<uint8_t> &ies);
mukesh agrawalb54601c2011-06-07 17:39:22 -070083
mukesh agrawal6e277772011-09-29 15:04:23 -070084 // TODO(quiche): make const?
mukesh agrawalb54601c2011-06-07 17:39:22 -070085 std::vector<uint8_t> ssid_;
86 std::vector<uint8_t> bssid_;
87 std::string ssid_string_;
88 std::string ssid_hex_;
89 std::string bssid_string_;
90 std::string bssid_hex_;
91 int16_t signal_strength_;
Thieu Lee41a72d2012-02-06 20:46:51 +000092 uint16 frequency_;
Thieu Le1df7f4e2012-02-10 15:21:45 -080093 uint16 physical_mode_;
mukesh agrawal6e277772011-09-29 15:04:23 -070094 // network_mode_ and security_mode_ are represented as flimflam names
95 // (not necessarily the same as wpa_supplicant names)
Chris Masone092df3e2011-08-22 09:41:39 -070096 std::string network_mode_;
mukesh agrawal6e277772011-09-29 15:04:23 -070097 std::string security_mode_;
mukesh agrawalb54601c2011-06-07 17:39:22 -070098
99 DISALLOW_COPY_AND_ASSIGN(WiFiEndpoint);
100};
101
102} // namespace shill
103
104#endif // SHILL_WIFI_ENDPOINT_