blob: 3791bdcdcba54a2281412f2662bb201655783a01 [file] [log] [blame]
mukesh agrawalb54601c2011-06-07 17:39:22 -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
Chris Masone092df3e2011-08-22 09:41:39 -07005#include "shill/wifi_endpoint.h"
6
7#include <base/logging.h>
mukesh agrawal6e277772011-09-29 15:04:23 -07008#include <base/stl_util-inl.h>
mukesh agrawalb54601c2011-06-07 17:39:22 -07009#include <base/stringprintf.h>
10#include <base/string_number_conversions.h>
mukesh agrawal6e277772011-09-29 15:04:23 -070011#include <base/string_util.h>
Chris Masone092df3e2011-08-22 09:41:39 -070012#include <chromeos/dbus/service_constants.h>
mukesh agrawalb54601c2011-06-07 17:39:22 -070013
mukesh agrawal6e277772011-09-29 15:04:23 -070014#include "shill/wpa_supplicant.h"
15
16using std::map;
17using std::set;
mukesh agrawalb54601c2011-06-07 17:39:22 -070018using std::string;
mukesh agrawal6e277772011-09-29 15:04:23 -070019using std::vector;
mukesh agrawalb54601c2011-06-07 17:39:22 -070020
21namespace shill {
22
mukesh agrawalb54601c2011-06-07 17:39:22 -070023WiFiEndpoint::WiFiEndpoint(
mukesh agrawal6e277772011-09-29 15:04:23 -070024 const map<string, ::DBus::Variant> &properties) {
mukesh agrawalb54601c2011-06-07 17:39:22 -070025 // XXX will segfault on missing properties
26 ssid_ =
mukesh agrawal6e277772011-09-29 15:04:23 -070027 properties.find(wpa_supplicant::kBSSPropertySSID)->second.
mukesh agrawalb54601c2011-06-07 17:39:22 -070028 operator std::vector<uint8_t>();
29 bssid_ =
mukesh agrawal6e277772011-09-29 15:04:23 -070030 properties.find(wpa_supplicant::kBSSPropertyBSSID)->second.
mukesh agrawalb54601c2011-06-07 17:39:22 -070031 operator std::vector<uint8_t>();
32 signal_strength_ =
mukesh agrawal6e277772011-09-29 15:04:23 -070033 properties.find(wpa_supplicant::kBSSPropertySignal)->second;
Chris Masone092df3e2011-08-22 09:41:39 -070034 network_mode_ = ParseMode(
mukesh agrawal6e277772011-09-29 15:04:23 -070035 properties.find(wpa_supplicant::kBSSPropertyMode)->second);
36 security_mode_ = ParseSecurity(properties);
mukesh agrawalb54601c2011-06-07 17:39:22 -070037
Chris Masone092df3e2011-08-22 09:41:39 -070038 if (network_mode_.empty()) {
mukesh agrawalb54601c2011-06-07 17:39:22 -070039 // XXX log error?
40 }
41
42 ssid_string_ = string(ssid_.begin(), ssid_.end());
43 ssid_hex_ = base::HexEncode(&(*ssid_.begin()), ssid_.size());
44 bssid_string_ = StringPrintf("%02x:%02x:%02x:%02x:%02x:%02x",
45 bssid_[0], bssid_[1], bssid_[2],
46 bssid_[3], bssid_[4], bssid_[5]);
47 bssid_hex_ = base::HexEncode(&(*bssid_.begin()), bssid_.size());
48}
49
50WiFiEndpoint::~WiFiEndpoint() {}
51
Chris Masone092df3e2011-08-22 09:41:39 -070052// static
53uint32_t WiFiEndpoint::ModeStringToUint(const std::string &mode_string) {
54 if (mode_string == flimflam::kModeManaged)
mukesh agrawal6e277772011-09-29 15:04:23 -070055 return wpa_supplicant::kNetworkModeInfrastructureInt;
Chris Masone092df3e2011-08-22 09:41:39 -070056 else if (mode_string == flimflam::kModeAdhoc)
mukesh agrawal6e277772011-09-29 15:04:23 -070057 return wpa_supplicant::kNetworkModeAdHocInt;
Chris Masone092df3e2011-08-22 09:41:39 -070058 else
59 NOTIMPLEMENTED() << "Shill dos not support " << mode_string
60 << " mode at this time.";
61 return 0;
62}
63
mukesh agrawal6e277772011-09-29 15:04:23 -070064const vector<uint8_t> &WiFiEndpoint::ssid() const {
mukesh agrawalb54601c2011-06-07 17:39:22 -070065 return ssid_;
66}
67
68const string &WiFiEndpoint::ssid_string() const {
69 return ssid_string_;
70}
71
72const string &WiFiEndpoint::ssid_hex() const {
73 return ssid_hex_;
74}
75
76const string &WiFiEndpoint::bssid_string() const {
77 return bssid_string_;
78}
79
80const string &WiFiEndpoint::bssid_hex() const {
81 return bssid_hex_;
82}
83
84int16_t WiFiEndpoint::signal_strength() const {
85 return signal_strength_;
86}
87
Chris Masone092df3e2011-08-22 09:41:39 -070088const string &WiFiEndpoint::network_mode() const {
mukesh agrawal6e277772011-09-29 15:04:23 -070089 return network_mode_;
90}
91
92const string &WiFiEndpoint::security_mode() const {
93 return security_mode_;
mukesh agrawalb54601c2011-06-07 17:39:22 -070094}
95
Chris Masone092df3e2011-08-22 09:41:39 -070096// static
mukesh agrawal6e277772011-09-29 15:04:23 -070097const char *WiFiEndpoint::ParseMode(const string &mode_string) {
98 if (mode_string == wpa_supplicant::kNetworkModeInfrastructure) {
Chris Masone092df3e2011-08-22 09:41:39 -070099 return flimflam::kModeManaged;
mukesh agrawal6e277772011-09-29 15:04:23 -0700100 } else if (mode_string == wpa_supplicant::kNetworkModeAdHoc) {
Chris Masone092df3e2011-08-22 09:41:39 -0700101 return flimflam::kModeAdhoc;
mukesh agrawal6e277772011-09-29 15:04:23 -0700102 } else if (mode_string == wpa_supplicant::kNetworkModeAccessPoint) {
Chris Masone092df3e2011-08-22 09:41:39 -0700103 NOTREACHED() << "Shill does not support AP mode at this time.";
104 return NULL;
mukesh agrawalb54601c2011-06-07 17:39:22 -0700105 } else {
Chris Masone092df3e2011-08-22 09:41:39 -0700106 NOTREACHED() << "Unknown WiFi endpoint mode!";
107 return NULL;
mukesh agrawalb54601c2011-06-07 17:39:22 -0700108 }
109}
110
mukesh agrawal6e277772011-09-29 15:04:23 -0700111// static
112const char *WiFiEndpoint::ParseSecurity(
113 const map<string, ::DBus::Variant> &properties) {
114 set<KeyManagement> rsn_key_management_methods;
115 if (ContainsKey(properties, wpa_supplicant::kPropertyRSN)) {
116 // TODO(quiche): check type before casting
117 const map<string, ::DBus::Variant> rsn_properties(
118 properties.find(wpa_supplicant::kPropertyRSN)->second.
119 operator map<string, ::DBus::Variant>());
120 ParseKeyManagementMethods(rsn_properties, &rsn_key_management_methods);
121 }
122
123 set<KeyManagement> wpa_key_management_methods;
124 if (ContainsKey(properties, wpa_supplicant::kPropertyWPA)) {
125 // TODO(qucihe): check type before casting
126 const map<string, ::DBus::Variant> rsn_properties(
127 properties.find(wpa_supplicant::kPropertyWPA)->second.
128 operator map<string, ::DBus::Variant>());
129 ParseKeyManagementMethods(rsn_properties, &wpa_key_management_methods);
130 }
131
132 bool wep_privacy = false;
133 if (ContainsKey(properties, wpa_supplicant::kPropertyPrivacy)) {
134 wep_privacy = properties.find(wpa_supplicant::kPropertyPrivacy)->second.
135 reader().get_bool();
136 }
137
138 if (ContainsKey(rsn_key_management_methods, kKeyManagement802_1x) ||
139 ContainsKey(wpa_key_management_methods, kKeyManagement802_1x)) {
140 return flimflam::kSecurity8021x;
141 } else if (ContainsKey(rsn_key_management_methods, kKeyManagementPSK)) {
142 return flimflam::kSecurityRsn;
143 } else if (ContainsKey(wpa_key_management_methods, kKeyManagementPSK)) {
144 return flimflam::kSecurityWpa;
145 } else if (wep_privacy) {
146 return flimflam::kSecurityWep;
147 } else {
148 return flimflam::kSecurityNone;
149 }
150}
151
152// static
153void WiFiEndpoint::ParseKeyManagementMethods(
154 const map<string, ::DBus::Variant> &security_method_properties,
155 set<KeyManagement> *key_management_methods) {
156 if (!ContainsKey(security_method_properties,
157 wpa_supplicant::kSecurityMethodPropertyKeyManagement)) {
158 return;
159 }
160
161 // TODO(quiche): check type before cast
162 const vector<string> key_management_vec =
163 security_method_properties.
164 find(wpa_supplicant::kSecurityMethodPropertyKeyManagement)->second.
165 operator vector<string>();
166 for (vector<string>::const_iterator it = key_management_vec.begin();
167 it != key_management_vec.end();
168 ++it) {
169 if (EndsWith(*it, wpa_supplicant::kKeyManagementMethodSuffixEAP, true)) {
170 key_management_methods->insert(kKeyManagement802_1x);
171 } else if (
172 EndsWith(*it, wpa_supplicant::kKeyManagementMethodSuffixPSK, true)) {
173 key_management_methods->insert(kKeyManagementPSK);
174 }
175 }
176}
177
mukesh agrawalb54601c2011-06-07 17:39:22 -0700178} // namespace shill