Wade Guthrie | 5020b57 | 2012-10-12 15:51:14 -0700 | [diff] [blame] | 1 | // Copyright (c) 2012 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 | #include "shill/callback80211_metrics.h" |
| 6 | |
Wade Guthrie | 5020b57 | 2012-10-12 15:51:14 -0700 | [diff] [blame] | 7 | #include "shill/ieee80211.h" |
Wade Guthrie | 5020b57 | 2012-10-12 15:51:14 -0700 | [diff] [blame] | 8 | #include "shill/logging.h" |
| 9 | #include "shill/metrics.h" |
Wade Guthrie | bb9fca2 | 2013-04-10 17:21:42 -0700 | [diff] [blame] | 10 | #include "shill/netlink_manager.h" |
repo sync | dc085c8 | 2012-12-28 08:54:41 -0800 | [diff] [blame] | 11 | #include "shill/nl80211_message.h" |
Wade Guthrie | 5020b57 | 2012-10-12 15:51:14 -0700 | [diff] [blame] | 12 | |
Wade Guthrie | 5020b57 | 2012-10-12 15:51:14 -0700 | [diff] [blame] | 13 | namespace shill { |
| 14 | |
Wade Guthrie | bb9fca2 | 2013-04-10 17:21:42 -0700 | [diff] [blame] | 15 | Callback80211Metrics::Callback80211Metrics( |
| 16 | const NetlinkManager &netlink_manager, Metrics *metrics) |
Wade Guthrie | c6c8196 | 2013-03-06 15:47:13 -0800 | [diff] [blame] | 17 | : metrics_(metrics), |
| 18 | nl80211_message_type_(NetlinkMessage::kIllegalMessageType) {} |
| 19 | |
| 20 | void Callback80211Metrics::InitNl80211FamilyId( |
Wade Guthrie | bb9fca2 | 2013-04-10 17:21:42 -0700 | [diff] [blame] | 21 | const NetlinkManager &netlink_manager) { |
Wade Guthrie | c6c8196 | 2013-03-06 15:47:13 -0800 | [diff] [blame] | 22 | nl80211_message_type_ = |
Wade Guthrie | bb9fca2 | 2013-04-10 17:21:42 -0700 | [diff] [blame] | 23 | netlink_manager.GetMessageType(Nl80211Message::kMessageTypeString); |
Wade Guthrie | 5020b57 | 2012-10-12 15:51:14 -0700 | [diff] [blame] | 24 | } |
| 25 | |
Wade Guthrie | c6c8196 | 2013-03-06 15:47:13 -0800 | [diff] [blame] | 26 | void Callback80211Metrics::CollectDisconnectStatistics( |
| 27 | const NetlinkMessage &netlink_message) { |
| 28 | if (nl80211_message_type_ == NetlinkMessage::kIllegalMessageType) { |
| 29 | LOG(ERROR) << "Somehow, nl80211_message_type_ didn't get set correctly"; |
| 30 | return; |
| 31 | } |
| 32 | |
| 33 | // We only handle deauthenticate messages, which are nl80211 messages. |
| 34 | if (netlink_message.message_type() != nl80211_message_type_) { |
| 35 | return; |
| 36 | } |
| 37 | const Nl80211Message &message = |
| 38 | * reinterpret_cast<const Nl80211Message *>(&netlink_message); |
| 39 | |
Christopher Wiley | 764538d | 2012-11-09 10:58:23 -0800 | [diff] [blame] | 40 | if (metrics_ && |
Wade Guthrie | bdcdaa7 | 2013-03-04 12:47:12 -0800 | [diff] [blame] | 41 | message.command() == DeauthenticateMessage::kCommand) { |
Wade Guthrie | 0b1ebf1 | 2013-04-12 09:53:33 -0700 | [diff] [blame] | 42 | SLOG(WiFi, 3) << "Handling Deauthenticate Message"; |
Wade Guthrie | 5020b57 | 2012-10-12 15:51:14 -0700 | [diff] [blame] | 43 | Metrics::WiFiDisconnectByWhom by_whom = |
Wade Guthrie | efe1f0c | 2013-02-26 17:42:01 -0800 | [diff] [blame] | 44 | message.const_attributes()->IsFlagAttributeTrue( |
repo sync | 90ee0fa | 2012-12-18 10:08:08 -0800 | [diff] [blame] | 45 | NL80211_ATTR_DISCONNECTED_BY_AP) ? |
Wade Guthrie | 5020b57 | 2012-10-12 15:51:14 -0700 | [diff] [blame] | 46 | Metrics::kDisconnectedByAp : Metrics::kDisconnectedNotByAp; |
| 47 | uint16_t reason = static_cast<uint16_t>( |
| 48 | IEEE_80211::kReasonCodeInvalid); |
Wade Guthrie | 8343f7f | 2012-12-04 13:52:32 -0800 | [diff] [blame] | 49 | ByteString rawdata; |
Wade Guthrie | efe1f0c | 2013-02-26 17:42:01 -0800 | [diff] [blame] | 50 | if (message.const_attributes()->GetRawAttributeValue(NL80211_ATTR_FRAME, |
Wade Guthrie | c6c8196 | 2013-03-06 15:47:13 -0800 | [diff] [blame] | 51 | &rawdata)) { |
Wade Guthrie | 8343f7f | 2012-12-04 13:52:32 -0800 | [diff] [blame] | 52 | Nl80211Frame frame(rawdata); |
Wade Guthrie | 5020b57 | 2012-10-12 15:51:14 -0700 | [diff] [blame] | 53 | reason = frame.reason(); |
| 54 | } |
| 55 | IEEE_80211::WiFiReasonCode reason_enum = |
| 56 | static_cast<IEEE_80211::WiFiReasonCode>(reason); |
| 57 | metrics_->Notify80211Disconnect(by_whom, reason_enum); |
| 58 | } |
| 59 | } |
| 60 | |
Wade Guthrie | 5020b57 | 2012-10-12 15:51:14 -0700 | [diff] [blame] | 61 | } // namespace shill. |