1 // 2 // Copyright (C) 2014 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #include "shill/wifi/wake_on_wifi.h" 18 19 #include <linux/nl80211.h> 20 21 #include <set> 22 #include <string> 23 #include <utility> 24 25 #include <base/message_loop/message_loop.h> 26 #if defined(__ANDROID__) 27 #include <dbus/service_constants.h> 28 #else 29 #include <chromeos/dbus/service_constants.h> 30 #endif // __ANDROID__ 31 #include <gmock/gmock.h> 32 #include <gtest/gtest.h> 33 34 #include "shill/error.h" 35 #include "shill/event_dispatcher.h" 36 #include "shill/ip_address_store.h" 37 #include "shill/logging.h" 38 #include "shill/mock_event_dispatcher.h" 39 #include "shill/mock_log.h" 40 #include "shill/mock_metrics.h" 41 #include "shill/net/byte_string.h" 42 #include "shill/net/ip_address.h" 43 #include "shill/net/mock_netlink_manager.h" 44 #include "shill/net/mock_time.h" 45 #include "shill/net/netlink_message_matchers.h" 46 #include "shill/net/netlink_packet.h" 47 #include "shill/net/nl80211_message.h" 48 #include "shill/net/shill_time.h" 49 #include "shill/nice_mock_control.h" 50 #include "shill/test_event_dispatcher.h" 51 #include "shill/testing.h" 52 53 using base::Bind; 54 using base::Closure; 55 using base::Unretained; 56 using std::set; 57 using std::string; 58 using std::vector; 59 using testing::_; 60 using ::testing::AnyNumber; 61 using ::testing::HasSubstr; 62 using ::testing::Return; 63 64 namespace shill { 65 66 namespace { 67 68 const uint16_t kNl80211FamilyId = 0x13; 69 70 const uint8_t kSSIDBytes1[] = {0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 71 0x47, 0x75, 0x65, 0x73, 0x74}; 72 // Bytes representing a NL80211_CMD_SET_WOWLAN reporting that the system woke 73 // up because of an SSID match. The net detect results report a single SSID 74 // match represented by kSSIDBytes1, occurring in the frequencies in 75 // kSSID1FreqMatches. 76 const uint8_t kWakeReasonSSIDNlMsg[] = { 77 0x90, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 78 0x00, 0x00, 0x00, 0x00, 0x4a, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 79 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 80 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 81 0x60, 0x00, 0x75, 0x00, 0x5c, 0x00, 0x13, 0x00, 0x58, 0x00, 0x00, 0x00, 82 0x0f, 0x00, 0x34, 0x00, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x47, 0x75, 83 0x65, 0x73, 0x74, 0x00, 0x44, 0x00, 0x2c, 0x00, 0x08, 0x00, 0x00, 0x00, 84 0x6c, 0x09, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x85, 0x09, 0x00, 0x00, 85 0x08, 0x00, 0x02, 0x00, 0x9e, 0x09, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 86 0x3c, 0x14, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x78, 0x14, 0x00, 0x00, 87 0x08, 0x00, 0x05, 0x00, 0x71, 0x16, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 88 0xad, 0x16, 0x00, 0x00, 0x08, 0x00, 0x07, 0x00, 0xc1, 0x16, 0x00, 0x00}; 89 const uint32_t kTimeToNextLeaseRenewalShort = 1; 90 const uint32_t kTimeToNextLeaseRenewalLong = 1000; 91 const uint32_t kNetDetectScanIntervalSeconds = 120; 92 // These blobs represent NL80211 messages from the kernel reporting the NIC's 93 // wake-on-packet settings, sent in response to NL80211_CMD_GET_WOWLAN requests. 94 const uint8_t kResponseNoIPAddresses[] = { 95 0x14, 0x00, 0x00, 0x00, 0x13, 0x00, 0x01, 0x00, 0x01, 0x00, 96 0x00, 0x00, 0x57, 0x40, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00}; 97 const uint8_t kResponseIPV40[] = { 98 0x4C, 0x00, 0x00, 0x00, 0x13, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 99 0x00, 0x57, 0x40, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0x38, 0x00, 100 0x75, 0x00, 0x34, 0x00, 0x04, 0x00, 0x30, 0x00, 0x01, 0x00, 0x08, 101 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x22, 0x00, 0x02, 0x00, 102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 104 0x00, 0x00, 0x00, 0x00, 0xC0, 0xA8, 0x0A, 0x14, 0x00, 0x00}; 105 const uint8_t kResponseIPV40WakeOnDisconnect[] = { 106 0x50, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 107 0x57, 0x40, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0x3C, 0x00, 0x75, 0x00, 108 0x04, 0x00, 0x02, 0x00, 0x34, 0x00, 0x04, 0x00, 0x30, 0x00, 0x01, 0x00, 109 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x22, 0x00, 0x02, 0x00, 110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 112 0x00, 0x00, 0xC0, 0xA8, 0x0A, 0x14, 0x00, 0x00}; 113 const uint8_t kResponseIPV401[] = { 114 0x7C, 0x00, 0x00, 0x00, 0x13, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 115 0x57, 0x40, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0x68, 0x00, 0x75, 0x00, 116 0x64, 0x00, 0x04, 0x00, 0x30, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 117 0x00, 0x00, 0x00, 0x3C, 0x22, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 120 0x03, 0x04, 0x00, 0x00, 0x30, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 121 0x00, 0x00, 0x00, 0x3C, 0x22, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xA8, 124 0x0A, 0x14, 0x00, 0x00}; 125 const uint8_t kResponseIPV401IPV60[] = { 126 0xB8, 0x00, 0x00, 0x00, 0x13, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 127 0x57, 0x40, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0xA4, 0x00, 0x75, 0x00, 128 0xA0, 0x00, 0x04, 0x00, 0x30, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 129 0x00, 0x00, 0x00, 0x3C, 0x22, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 130 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 132 0x03, 0x04, 0x00, 0x00, 0x30, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 133 0x00, 0x00, 0x00, 0x3C, 0x22, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xA8, 136 0x0A, 0x14, 0x00, 0x00, 0x3C, 0x00, 0x03, 0x00, 0x09, 0x00, 0x01, 0x00, 137 0x00, 0x00, 0xC0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x02, 0x00, 138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xDC, 140 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 141 0x32, 0x10, 0x00, 0x00}; 142 const uint8_t kResponseIPV401IPV601[] = { 143 0xF4, 0x00, 0x00, 0x00, 0x13, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 144 0x57, 0x40, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0xE0, 0x00, 0x75, 0x00, 145 0xDC, 0x00, 0x04, 0x00, 0x30, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 146 0x00, 0x00, 0x00, 0x3C, 0x22, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 147 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 148 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 149 0x03, 0x04, 0x00, 0x00, 0x3C, 0x00, 0x02, 0x00, 0x09, 0x00, 0x01, 0x00, 150 0x00, 0x00, 0xC0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x02, 0x00, 151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x20, 0x0C, 154 0x41, 0x7A, 0x00, 0x00, 0x30, 0x00, 0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 155 0x00, 0x00, 0x00, 0x3C, 0x22, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xA8, 158 0x0A, 0x14, 0x00, 0x00, 0x3C, 0x00, 0x04, 0x00, 0x09, 0x00, 0x01, 0x00, 159 0x00, 0x00, 0xC0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x02, 0x00, 160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xDC, 162 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 163 0x32, 0x10, 0x00, 0x00}; 164 // This blob represents an NL80211 messages from the kernel reporting that the 165 // NIC is programmed to wake on the SSIDs represented by kSSIDBytes1 and 166 // kSSIDBytes2, and scans for these SSIDs at interval 167 // kNetDetectScanIntervalSeconds. 168 const uint8_t kResponseWakeOnSSID[] = { 169 0x60, 0x01, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x9a, 0x01, 0x00, 0x00, 170 0xfa, 0x02, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0x4c, 0x01, 0x75, 0x00, 171 0x48, 0x01, 0x12, 0x00, 0x08, 0x00, 0x77, 0x00, 0xc0, 0xd4, 0x01, 0x00, 172 0x0c, 0x01, 0x2c, 0x00, 0x08, 0x00, 0x00, 0x00, 0x6c, 0x09, 0x00, 0x00, 173 0x08, 0x00, 0x01, 0x00, 0x71, 0x09, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 174 0x76, 0x09, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x7b, 0x09, 0x00, 0x00, 175 0x08, 0x00, 0x04, 0x00, 0x80, 0x09, 0x00, 0x00, 0x08, 0x00, 0x05, 0x00, 176 0x85, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x8a, 0x09, 0x00, 0x00, 177 0x08, 0x00, 0x07, 0x00, 0x8f, 0x09, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 178 0x94, 0x09, 0x00, 0x00, 0x08, 0x00, 0x09, 0x00, 0x99, 0x09, 0x00, 0x00, 179 0x08, 0x00, 0x0a, 0x00, 0x9e, 0x09, 0x00, 0x00, 0x08, 0x00, 0x0b, 0x00, 180 0x3c, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x50, 0x14, 0x00, 0x00, 181 0x08, 0x00, 0x0d, 0x00, 0x64, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0e, 0x00, 182 0x78, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x8c, 0x14, 0x00, 0x00, 183 0x08, 0x00, 0x10, 0x00, 0xa0, 0x14, 0x00, 0x00, 0x08, 0x00, 0x11, 0x00, 184 0xb4, 0x14, 0x00, 0x00, 0x08, 0x00, 0x12, 0x00, 0xc8, 0x14, 0x00, 0x00, 185 0x08, 0x00, 0x13, 0x00, 0x7c, 0x15, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 186 0x90, 0x15, 0x00, 0x00, 0x08, 0x00, 0x15, 0x00, 0xa4, 0x15, 0x00, 0x00, 187 0x08, 0x00, 0x16, 0x00, 0xb8, 0x15, 0x00, 0x00, 0x08, 0x00, 0x17, 0x00, 188 0xcc, 0x15, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x1c, 0x16, 0x00, 0x00, 189 0x08, 0x00, 0x19, 0x00, 0x30, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1a, 0x00, 190 0x44, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1b, 0x00, 0x58, 0x16, 0x00, 0x00, 191 0x08, 0x00, 0x1c, 0x00, 0x71, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1d, 0x00, 192 0x85, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1e, 0x00, 0x99, 0x16, 0x00, 0x00, 193 0x08, 0x00, 0x1f, 0x00, 0xad, 0x16, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 194 0xc1, 0x16, 0x00, 0x00, 0x30, 0x00, 0x84, 0x00, 0x14, 0x00, 0x00, 0x00, 195 0x0f, 0x00, 0x01, 0x00, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x47, 0x75, 196 0x65, 0x73, 0x74, 0x00, 0x18, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, 0x00, 197 0x54, 0x50, 0x2d, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x38, 0x37, 0x36, 0x44, 198 0x33, 0x35, 0x00, 0x00}; 199 const uint8_t kSSIDBytes2[] = {0x54, 0x50, 0x2d, 0x4c, 0x49, 0x4e, 0x4b, 200 0x5f, 0x38, 0x37, 0x36, 0x44, 0x33, 0x35}; 201 202 // Bytes representing a NL80211_CMD_NEW_WIPHY message reporting the WiFi 203 // capabilities of a NIC. This message reports that the NIC supports wake on 204 // pattern (on up to |kNewWiphyNlMsg_MaxPatterns| registered patterns), supports 205 // wake on SSID (on up to |kNewWiphyNlMsg_MaxSSIDs| SSIDs), and supports wake on 206 // disconnect. 207 const uint8_t kNewWiphyNlMsg[] = { 208 0xb8, 0x0d, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 209 0xd9, 0x53, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 210 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x02, 0x00, 0x70, 0x68, 0x79, 0x30, 211 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x2e, 0x00, 0x01, 0x00, 0x00, 0x00, 212 0x05, 0x00, 0x3d, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x3e, 0x00, 213 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3f, 0x00, 0xff, 0xff, 0xff, 0xff, 214 0x08, 0x00, 0x40, 0x00, 0xff, 0xff, 0xff, 0xff, 0x05, 0x00, 0x59, 0x00, 215 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x2b, 0x00, 0x14, 0x00, 0x00, 0x00, 216 0x05, 0x00, 0x7b, 0x00, 0x14, 0x00, 0x00, 0x00, 0x06, 0x00, 0x38, 0x00, 217 0xa9, 0x01, 0x00, 0x00, 0x06, 0x00, 0x7c, 0x00, 0xe6, 0x01, 0x00, 0x00, 218 0x05, 0x00, 0x85, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x68, 0x00, 219 0x04, 0x00, 0x82, 0x00, 0x1c, 0x00, 0x39, 0x00, 0x04, 0xac, 0x0f, 0x00, 220 0x02, 0xac, 0x0f, 0x00, 0x01, 0xac, 0x0f, 0x00, 0x05, 0xac, 0x0f, 0x00, 221 0x06, 0xac, 0x0f, 0x00, 0x01, 0x72, 0x14, 0x00, 0x05, 0x00, 0x56, 0x00, 222 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x66, 0x00, 0x08, 0x00, 0x71, 0x00, 223 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 224 0x24, 0x00, 0x20, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 225 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 226 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x09, 0x00, 0x04, 0x00, 0x0a, 0x00, 227 0x94, 0x05, 0x16, 0x00, 0xe8, 0x01, 0x00, 0x00, 0x14, 0x00, 0x03, 0x00, 228 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x01, 229 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 0xe2, 0x11, 0x00, 0x00, 230 0x05, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, 231 0x05, 0x00, 0x00, 0x00, 0x18, 0x01, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 232 0x08, 0x00, 0x01, 0x00, 0x6c, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 233 0x98, 0x08, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 234 0x71, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 235 0x14, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x76, 0x09, 0x00, 0x00, 236 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 0x14, 0x00, 0x03, 0x00, 237 0x08, 0x00, 0x01, 0x00, 0x7b, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 238 0x98, 0x08, 0x00, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, 0x01, 0x00, 239 0x80, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 240 0x14, 0x00, 0x05, 0x00, 0x08, 0x00, 0x01, 0x00, 0x85, 0x09, 0x00, 0x00, 241 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 0x14, 0x00, 0x06, 0x00, 242 0x08, 0x00, 0x01, 0x00, 0x8a, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 243 0x98, 0x08, 0x00, 0x00, 0x14, 0x00, 0x07, 0x00, 0x08, 0x00, 0x01, 0x00, 244 0x8f, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 245 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x01, 0x00, 0x94, 0x09, 0x00, 0x00, 246 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 0x14, 0x00, 0x09, 0x00, 247 0x08, 0x00, 0x01, 0x00, 0x99, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 248 0x98, 0x08, 0x00, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x01, 0x00, 249 0x9e, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 250 0x1c, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x01, 0x00, 0xa3, 0x09, 0x00, 0x00, 251 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00, 252 0x98, 0x08, 0x00, 0x00, 0x1c, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x01, 0x00, 253 0xa8, 0x09, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 254 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 0xa0, 0x00, 0x02, 0x00, 255 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 256 0x10, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 257 0x04, 0x00, 0x02, 0x00, 0x10, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 258 0x37, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x10, 0x00, 0x03, 0x00, 259 0x08, 0x00, 0x01, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 260 0x0c, 0x00, 0x04, 0x00, 0x08, 0x00, 0x01, 0x00, 0x3c, 0x00, 0x00, 0x00, 261 0x0c, 0x00, 0x05, 0x00, 0x08, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x00, 262 0x0c, 0x00, 0x06, 0x00, 0x08, 0x00, 0x01, 0x00, 0x78, 0x00, 0x00, 0x00, 263 0x0c, 0x00, 0x07, 0x00, 0x08, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x00, 264 0x0c, 0x00, 0x08, 0x00, 0x08, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 265 0x0c, 0x00, 0x09, 0x00, 0x08, 0x00, 0x01, 0x00, 0x68, 0x01, 0x00, 0x00, 266 0x0c, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x01, 0x00, 0xe0, 0x01, 0x00, 0x00, 267 0x0c, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x01, 0x00, 0x1c, 0x02, 0x00, 0x00, 268 0xa8, 0x03, 0x01, 0x00, 0x14, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x00, 269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x01, 0x01, 0x00, 0x00, 0x00, 270 0x06, 0x00, 0x04, 0x00, 0xe2, 0x11, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 271 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x00, 0x00, 272 0x0c, 0x00, 0x07, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 273 0x08, 0x00, 0x08, 0x00, 0xa0, 0x71, 0x80, 0x03, 0x00, 0x03, 0x01, 0x00, 274 0x1c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x3c, 0x14, 0x00, 0x00, 275 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00, 276 0x98, 0x08, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 277 0x50, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 278 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 0x1c, 0x00, 0x02, 0x00, 279 0x08, 0x00, 0x01, 0x00, 0x64, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 280 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 281 0x1c, 0x00, 0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 0x78, 0x14, 0x00, 0x00, 282 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00, 283 0x98, 0x08, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x08, 0x00, 0x01, 0x00, 284 0x8c, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 285 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 286 0x20, 0x00, 0x05, 0x00, 0x08, 0x00, 0x01, 0x00, 0xa0, 0x14, 0x00, 0x00, 287 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 288 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 0x20, 0x00, 0x06, 0x00, 289 0x08, 0x00, 0x01, 0x00, 0xb4, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 290 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 291 0x98, 0x08, 0x00, 0x00, 0x20, 0x00, 0x07, 0x00, 0x08, 0x00, 0x01, 0x00, 292 0xc8, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 293 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 294 0x20, 0x00, 0x08, 0x00, 0x08, 0x00, 0x01, 0x00, 0x7c, 0x15, 0x00, 0x00, 295 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 296 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 0x20, 0x00, 0x09, 0x00, 297 0x08, 0x00, 0x01, 0x00, 0x90, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 298 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 299 0x98, 0x08, 0x00, 0x00, 0x20, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x01, 0x00, 300 0xa4, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 301 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 302 0x20, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x01, 0x00, 0xb8, 0x15, 0x00, 0x00, 303 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 304 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 0x20, 0x00, 0x0c, 0x00, 305 0x08, 0x00, 0x01, 0x00, 0xcc, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 306 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 307 0x98, 0x08, 0x00, 0x00, 0x20, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x01, 0x00, 308 0xe0, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 309 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 310 0x20, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x01, 0x00, 0xf4, 0x15, 0x00, 0x00, 311 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 312 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x00, 313 0x08, 0x00, 0x01, 0x00, 0x08, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 314 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 315 0x98, 0x08, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x01, 0x00, 316 0x1c, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 317 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 318 0x20, 0x00, 0x11, 0x00, 0x08, 0x00, 0x01, 0x00, 0x30, 0x16, 0x00, 0x00, 319 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 320 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 0x20, 0x00, 0x12, 0x00, 321 0x08, 0x00, 0x01, 0x00, 0x44, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 322 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 323 0x98, 0x08, 0x00, 0x00, 0x20, 0x00, 0x13, 0x00, 0x08, 0x00, 0x01, 0x00, 324 0x58, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 325 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 326 0x1c, 0x00, 0x14, 0x00, 0x08, 0x00, 0x01, 0x00, 0x71, 0x16, 0x00, 0x00, 327 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00, 328 0x98, 0x08, 0x00, 0x00, 0x1c, 0x00, 0x15, 0x00, 0x08, 0x00, 0x01, 0x00, 329 0x85, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 330 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 0x1c, 0x00, 0x16, 0x00, 331 0x08, 0x00, 0x01, 0x00, 0x99, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 332 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 333 0x1c, 0x00, 0x17, 0x00, 0x08, 0x00, 0x01, 0x00, 0xad, 0x16, 0x00, 0x00, 334 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00, 335 0x98, 0x08, 0x00, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x08, 0x00, 0x01, 0x00, 336 0xc1, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 337 0x08, 0x00, 0x06, 0x00, 0x98, 0x08, 0x00, 0x00, 0x64, 0x00, 0x02, 0x00, 338 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x3c, 0x00, 0x00, 0x00, 339 0x0c, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x00, 340 0x0c, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x78, 0x00, 0x00, 0x00, 341 0x0c, 0x00, 0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x00, 342 0x0c, 0x00, 0x04, 0x00, 0x08, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 343 0x0c, 0x00, 0x05, 0x00, 0x08, 0x00, 0x01, 0x00, 0x68, 0x01, 0x00, 0x00, 344 0x0c, 0x00, 0x06, 0x00, 0x08, 0x00, 0x01, 0x00, 0xe0, 0x01, 0x00, 0x00, 345 0x0c, 0x00, 0x07, 0x00, 0x08, 0x00, 0x01, 0x00, 0x1c, 0x02, 0x00, 0x00, 346 0xdc, 0x00, 0x32, 0x00, 0x08, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 347 0x08, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 348 0x0b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, 349 0x08, 0x00, 0x05, 0x00, 0x13, 0x00, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 350 0x19, 0x00, 0x00, 0x00, 0x08, 0x00, 0x07, 0x00, 0x25, 0x00, 0x00, 0x00, 351 0x08, 0x00, 0x08, 0x00, 0x26, 0x00, 0x00, 0x00, 0x08, 0x00, 0x09, 0x00, 352 0x27, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x28, 0x00, 0x00, 0x00, 353 0x08, 0x00, 0x0b, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 354 0x37, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x39, 0x00, 0x00, 0x00, 355 0x08, 0x00, 0x0e, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0f, 0x00, 356 0x43, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x31, 0x00, 0x00, 0x00, 357 0x08, 0x00, 0x11, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x12, 0x00, 358 0x42, 0x00, 0x00, 0x00, 0x08, 0x00, 0x13, 0x00, 0x4b, 0x00, 0x00, 0x00, 359 0x08, 0x00, 0x14, 0x00, 0x54, 0x00, 0x00, 0x00, 0x08, 0x00, 0x15, 0x00, 360 0x57, 0x00, 0x00, 0x00, 0x08, 0x00, 0x16, 0x00, 0x55, 0x00, 0x00, 0x00, 361 0x08, 0x00, 0x17, 0x00, 0x59, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 362 0x5c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x19, 0x00, 0x2d, 0x00, 0x00, 0x00, 363 0x08, 0x00, 0x1a, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1b, 0x00, 364 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x6f, 0x00, 0x10, 0x27, 0x00, 0x00, 365 0x04, 0x00, 0x6c, 0x00, 0x30, 0x04, 0x63, 0x00, 0x04, 0x00, 0x00, 0x00, 366 0x84, 0x00, 0x01, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 367 0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 368 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 369 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 370 0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 371 0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 372 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 373 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 374 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 375 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 376 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 377 0x84, 0x00, 0x02, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 378 0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 379 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 380 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 381 0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 382 0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 383 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 384 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 385 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 386 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 387 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 388 0x84, 0x00, 0x03, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 389 0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 390 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 391 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 392 0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 393 0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 394 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 395 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 396 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 397 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 398 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 399 0x84, 0x00, 0x04, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 400 0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 401 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 402 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 403 0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 404 0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 405 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 406 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 407 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 408 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 409 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 410 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x84, 0x00, 0x07, 0x00, 411 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 412 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 413 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 414 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x50, 0x00, 0x00, 0x00, 415 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 416 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x80, 0x00, 0x00, 0x00, 417 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 418 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 419 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 420 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x00, 0x00, 421 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x84, 0x00, 0x08, 0x00, 422 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 423 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 424 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 425 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x50, 0x00, 0x00, 0x00, 426 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 427 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x80, 0x00, 0x00, 0x00, 428 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 429 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 430 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 431 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x00, 0x00, 432 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x84, 0x00, 0x09, 0x00, 433 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 434 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 435 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 436 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x50, 0x00, 0x00, 0x00, 437 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 438 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x80, 0x00, 0x00, 0x00, 439 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 440 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 441 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 442 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x00, 0x00, 443 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x84, 0x00, 0x0a, 0x00, 444 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 445 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 446 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 447 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x50, 0x00, 0x00, 0x00, 448 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 449 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x80, 0x00, 0x00, 0x00, 450 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 451 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 452 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 453 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x00, 0x00, 454 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x40, 0x01, 0x64, 0x00, 455 0x04, 0x00, 0x00, 0x00, 0x24, 0x00, 0x01, 0x00, 0x06, 0x00, 0x65, 0x00, 456 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 457 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 458 0xd0, 0x00, 0x00, 0x00, 0x14, 0x00, 0x02, 0x00, 0x06, 0x00, 0x65, 0x00, 459 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 460 0x3c, 0x00, 0x03, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 461 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 462 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 463 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 464 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 465 0x3c, 0x00, 0x04, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 466 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 467 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 468 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 469 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 470 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x1c, 0x00, 0x07, 0x00, 471 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 472 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 473 0x14, 0x00, 0x08, 0x00, 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 474 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x09, 0x00, 475 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 476 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 477 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 478 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 479 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x14, 0x00, 0x0a, 0x00, 480 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 481 0xd0, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x76, 0x00, 0x04, 0x00, 0x02, 0x00, 482 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 483 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x09, 0x00, 484 0x14, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 485 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x12, 0x00, 486 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x79, 0x00, 0x04, 0x00, 0x04, 0x00, 487 0x04, 0x00, 0x06, 0x00, 0x60, 0x00, 0x78, 0x00, 0x5c, 0x00, 0x01, 0x00, 488 0x48, 0x00, 0x01, 0x00, 0x14, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 489 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 490 0x1c, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 491 0x10, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x08, 0x00, 492 0x04, 0x00, 0x09, 0x00, 0x14, 0x00, 0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 493 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x04, 0x00, 0x0a, 0x00, 494 0x08, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 495 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x8f, 0x00, 0xe3, 0x1a, 0x00, 0x07, 496 0x1e, 0x00, 0x94, 0x00, 0x63, 0x48, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 497 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 498 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xa9, 0x00, 499 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x0c, 0x00, 0xaa, 0x00, 500 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40}; 501 const char kIPV4Address0[] = "192.168.10.20"; 502 const char kIPV4Address1[] = "1.2.3.4"; 503 const char kIPV6Address0[] = "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210"; 504 const char kIPV6Address1[] = "1080:0:0:0:8:800:200C:417A"; 505 506 #if !defined(DISABLE_WAKE_ON_WIFI) 507 508 // Zero-byte pattern prefixes to match the offsetting bytes in the Ethernet 509 // frame that lie before the source IP address field. 510 const uint8_t kIPV4PatternPrefix[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 511 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 512 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 513 0x00, 0x00, 0x00, 0x00, 0x00}; 514 const uint8_t kIPV6PatternPrefix[] = { 515 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 516 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 517 518 // These masks have bits set to 1 to match bytes in an IP address pattern that 519 // represent the source IP address of the frame. They are padded with zero 520 // bits in front to ignore the frame offset and at the end to byte-align the 521 // mask itself. 522 const uint8_t kIPV4MaskBytes[] = {0x00, 0x00, 0x00, 0x3c}; 523 const uint8_t kIPV6MaskBytes[] = {0x00, 0x00, 0xc0, 0xff, 0x3f}; 524 525 const uint8_t kIPV4Address0Bytes[] = {0xc0, 0xa8, 0x0a, 0x14}; 526 const uint8_t kIPV4Address1Bytes[] = {0x01, 0x02, 0x03, 0x04}; 527 528 const uint8_t kIPV6Address0Bytes[] = {0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 529 0x32, 0x10, 0xfe, 0xdc, 0xba, 0x98, 530 0x76, 0x54, 0x32, 0x10}; 531 const uint8_t kIPV6Address1Bytes[] = {0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 532 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 533 0x20, 0x0c, 0x41, 0x7a}; 534 const char kIPV6Address2[] = "1080::8:800:200C:417A"; 535 const uint8_t kIPV6Address2Bytes[] = {0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 536 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 537 0x20, 0x0c, 0x41, 0x7a}; 538 const char kIPV6Address3[] = "FF01::101"; 539 const uint8_t kIPV6Address3Bytes[] = {0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 540 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 541 0x00, 0x00, 0x01, 0x01}; 542 const char kIPV6Address4[] = "::1"; 543 const uint8_t kIPV6Address4Bytes[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 544 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 545 0x00, 0x00, 0x00, 0x01}; 546 const char kIPV6Address5[] = "::"; 547 const uint8_t kIPV6Address5Bytes[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 548 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 549 0x00, 0x00, 0x00, 0x00}; 550 const char kIPV6Address6[] = "0:0:0:0:0:FFFF:129.144.52.38"; 551 const uint8_t kIPV6Address6Bytes[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 552 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 553 0x81, 0x90, 0x34, 0x26}; 554 const char kIPV6Address7[] = "::DEDE:190.144.52.38"; 555 const uint8_t kIPV6Address7Bytes[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 556 0x00, 0x00, 0x00, 0x00, 0xde, 0xde, 557 0xbe, 0x90, 0x34, 0x26}; 558 559 const uint32_t kNewWiphyNlMsg_MaxPatterns = 20; 560 const uint32_t kNewWiphyNlMsg_MaxSSIDs = 11; 561 const int kNewWiphyNlMsg_PattSupportOffset = 3300; 562 const int kNewWiphyNlMsg_WowlanTrigNetDetectAttributeOffset = 3316; 563 const int kNewWiphyNlMsg_WowlanTrigDisconnectAttributeOffset = 3268; 564 565 const uint32_t kSSID1FreqMatches[] = {2412, 2437, 2462, 5180, 566 5240, 5745, 5805, 5825}; 567 568 const uint32_t kWakeReasonNlMsg_WiphyIndex = 0; 569 // NL80211_CMD_GET_WOWLAN message with nlmsg_type 0x16, which is different from 570 // kNl80211FamilyId (0x13). 571 const uint8_t kWrongMessageTypeNlMsg[] = { 572 0x14, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x01, 0x00, 573 0x00, 0x00, 0x57, 0x40, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00}; 574 // Bytes representing a NL80211_CMD_SET_WOWLAN reporting that the system woke 575 // up because of a reason other than wake on WiFi. 576 const uint8_t kWakeReasonUnsupportedNlMsg[] = { 577 0x30, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 578 0x00, 0x00, 0x00, 0x00, 0x4a, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 579 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 580 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00}; 581 // Bytes representing a NL80211_CMD_SET_WOWLAN reporting that the system woke 582 // up because of a disconnect. 583 const uint8_t kWakeReasonDisconnectNlMsg[] = { 584 0x38, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 585 0x00, 0x00, 0x00, 0x00, 0x4a, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 586 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 587 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 588 0x08, 0x00, 0x75, 0x00, 0x04, 0x00, 0x02, 0x00}; 589 // Bytes representing a NL80211_CMD_SET_WOWLAN reporting that the system woke 590 // up because of a a match with packet pattern index 591 // kWakeReasonPatternNlMsg_PattIndex. 592 const uint8_t kWakeReasonPatternNlMsg[] = { 593 0xac, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 594 0x00, 0x00, 0x00, 0x00, 0x4a, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 595 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 596 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 597 0x7c, 0x00, 0x75, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 598 0x08, 0x00, 0x0d, 0x00, 0x62, 0x00, 0x00, 0x00, 0x66, 0x00, 0x0c, 0x00, 599 0x6c, 0x29, 0x95, 0x16, 0x54, 0x68, 0x6c, 0x71, 0xd9, 0x8b, 0x3c, 0x6c, 600 0x08, 0x00, 0x45, 0x00, 0x00, 0x54, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 601 0xb7, 0xdd, 0xc0, 0xa8, 0x00, 0xfe, 0xc0, 0xa8, 0x00, 0x7d, 0x08, 0x00, 602 0x3f, 0x51, 0x28, 0x64, 0x00, 0x01, 0xb1, 0x0b, 0xd0, 0x54, 0x00, 0x00, 603 0x00, 0x00, 0x4b, 0x16, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x11, 604 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 605 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 606 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 607 0x36, 0x37, 0x00, 0x00}; 608 const uint32_t kWakeReasonPatternNlMsg_PattIndex = 0; 609 610 #endif // DISABLE_WAKE_ON_WIFI 611 612 } // namespace 613 614 class WakeOnWiFiTest : public ::testing::Test { 615 public: 616 WakeOnWiFiTest() : metrics_(nullptr) {} 617 virtual ~WakeOnWiFiTest() {} 618 619 virtual void SetUp() { 620 Nl80211Message::SetMessageType(kNl80211FamilyId); 621 // Assume our NIC has reported its wiphy index, and that it supports wake 622 // all wake triggers. 623 wake_on_wifi_->wiphy_index_received_ = true; 624 wake_on_wifi_->wake_on_wifi_triggers_supported_.insert( 625 WakeOnWiFi::kWakeTriggerPattern); 626 wake_on_wifi_->wake_on_wifi_triggers_supported_.insert( 627 WakeOnWiFi::kWakeTriggerDisconnect); 628 wake_on_wifi_->wake_on_wifi_triggers_supported_.insert( 629 WakeOnWiFi::kWakeTriggerSSID); 630 // By default our tests assume that the NIC supports more SSIDs than 631 // whitelisted SSIDs. 632 wake_on_wifi_->wake_on_wifi_max_ssids_ = 999; 633 wake_on_wifi_->dark_resume_history_.time_ = &time_; 634 635 ON_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)) 636 .WillByDefault(Return(true)); 637 } 638 639 void SetWakeOnWiFiMaxSSIDs(uint32_t max_ssids) { 640 wake_on_wifi_->wake_on_wifi_max_ssids_ = max_ssids; 641 } 642 643 void EnableWakeOnWiFiFeaturesPacket() { 644 wake_on_wifi_->wake_on_wifi_features_enabled_ = 645 kWakeOnWiFiFeaturesEnabledPacket; 646 } 647 648 void EnableWakeOnWiFiFeaturesDarkConnect() { 649 wake_on_wifi_->wake_on_wifi_features_enabled_ = 650 kWakeOnWiFiFeaturesEnabledDarkConnect; 651 } 652 653 void EnableWakeOnWiFiFeaturesPacketDarkConnect() { 654 wake_on_wifi_->wake_on_wifi_features_enabled_ = 655 kWakeOnWiFiFeaturesEnabledPacketDarkConnect; 656 } 657 658 void SetWakeOnWiFiFeaturesNotSupported() { 659 wake_on_wifi_->wake_on_wifi_features_enabled_ = 660 kWakeOnWiFiFeaturesEnabledNotSupported; 661 } 662 663 void DisableWakeOnWiFiFeatures() { 664 wake_on_wifi_->wake_on_wifi_features_enabled_ = 665 kWakeOnWiFiFeaturesEnabledNone; 666 } 667 668 void AddWakeOnPacketConnection(const string& ip_endpoint, Error* error) { 669 wake_on_wifi_->AddWakeOnPacketConnection(ip_endpoint, error); 670 } 671 672 void RemoveWakeOnPacketConnection(const string& ip_endpoint, Error* error) { 673 wake_on_wifi_->RemoveWakeOnPacketConnection(ip_endpoint, error); 674 } 675 676 void RemoveAllWakeOnPacketConnections(Error* error) { 677 wake_on_wifi_->RemoveAllWakeOnPacketConnections(error); 678 } 679 680 bool CreateIPAddressPatternAndMask(const IPAddress& ip_addr, 681 ByteString* pattern, ByteString* mask) { 682 return WakeOnWiFi::CreateIPAddressPatternAndMask(ip_addr, pattern, mask); 683 } 684 685 bool ConfigureWiphyIndex(Nl80211Message* msg, int32_t index) { 686 return WakeOnWiFi::ConfigureWiphyIndex(msg, index); 687 } 688 689 bool ConfigureDisableWakeOnWiFiMessage(SetWakeOnPacketConnMessage* msg, 690 uint32_t wiphy_index, Error* error) { 691 return WakeOnWiFi::ConfigureDisableWakeOnWiFiMessage(msg, wiphy_index, 692 error); 693 } 694 695 bool WakeOnWiFiSettingsMatch(const Nl80211Message& msg, 696 const set<WakeOnWiFi::WakeOnWiFiTrigger>& trigs, 697 const IPAddressStore& addrs, 698 uint32_t net_detect_scan_period_seconds, 699 const vector<ByteString>& ssid_whitelist) { 700 return WakeOnWiFi::WakeOnWiFiSettingsMatch( 701 msg, trigs, addrs, net_detect_scan_period_seconds, ssid_whitelist); 702 } 703 704 bool ConfigureSetWakeOnWiFiSettingsMessage( 705 SetWakeOnPacketConnMessage* msg, 706 const set<WakeOnWiFi::WakeOnWiFiTrigger>& trigs, 707 const IPAddressStore& addrs, uint32_t wiphy_index, 708 uint32_t net_detect_scan_period_seconds, 709 const vector<ByteString>& ssid_whitelist, Error* error) { 710 return WakeOnWiFi::ConfigureSetWakeOnWiFiSettingsMessage( 711 msg, trigs, addrs, wiphy_index, net_detect_scan_period_seconds, 712 ssid_whitelist, error); 713 } 714 715 void RequestWakeOnPacketSettings() { 716 wake_on_wifi_->RequestWakeOnPacketSettings(); 717 } 718 719 void VerifyWakeOnWiFiSettings(const Nl80211Message& nl80211_message) { 720 wake_on_wifi_->VerifyWakeOnWiFiSettings(nl80211_message); 721 } 722 723 size_t GetWakeOnWiFiMaxPatterns() { 724 return wake_on_wifi_->wake_on_wifi_max_patterns_; 725 } 726 727 uint32_t GetWakeOnWiFiMaxSSIDs() { 728 return wake_on_wifi_->wake_on_wifi_max_ssids_; 729 } 730 731 void SetWakeOnWiFiMaxPatterns(size_t max_patterns) { 732 wake_on_wifi_->wake_on_wifi_max_patterns_ = max_patterns; 733 } 734 735 void ApplyWakeOnWiFiSettings() { wake_on_wifi_->ApplyWakeOnWiFiSettings(); } 736 737 void DisableWakeOnWiFi() { wake_on_wifi_->DisableWakeOnWiFi(); } 738 739 set<WakeOnWiFi::WakeOnWiFiTrigger>* GetWakeOnWiFiTriggers() { 740 return &wake_on_wifi_->wake_on_wifi_triggers_; 741 } 742 743 set<WakeOnWiFi::WakeOnWiFiTrigger>* GetWakeOnWiFiTriggersSupported() { 744 return &wake_on_wifi_->wake_on_wifi_triggers_supported_; 745 } 746 747 void ClearWakeOnWiFiTriggersSupported() { 748 wake_on_wifi_->wake_on_wifi_triggers_supported_.clear(); 749 } 750 751 IPAddressStore* GetWakeOnPacketConnections() { 752 return &wake_on_wifi_->wake_on_packet_connections_; 753 } 754 755 void RetrySetWakeOnPacketConnections() { 756 wake_on_wifi_->RetrySetWakeOnPacketConnections(); 757 } 758 759 void SetSuspendActionsDoneCallback() { 760 wake_on_wifi_->suspend_actions_done_callback_ = 761 Bind(&WakeOnWiFiTest::DoneCallback, Unretained(this)); 762 } 763 764 void ResetSuspendActionsDoneCallback() { 765 wake_on_wifi_->suspend_actions_done_callback_.Reset(); 766 } 767 768 bool SuspendActionsCallbackIsNull() { 769 return wake_on_wifi_->suspend_actions_done_callback_.is_null(); 770 } 771 772 void RunSuspendActionsCallback(const Error& error) { 773 wake_on_wifi_->suspend_actions_done_callback_.Run(error); 774 } 775 776 int GetNumSetWakeOnPacketRetries() { 777 return wake_on_wifi_->num_set_wake_on_packet_retries_; 778 } 779 780 void SetNumSetWakeOnPacketRetries(int retries) { 781 wake_on_wifi_->num_set_wake_on_packet_retries_ = retries; 782 } 783 784 void OnBeforeSuspend(bool is_connected, 785 const vector<ByteString>& ssid_whitelist, 786 bool have_dhcp_lease, 787 uint32_t time_to_next_lease_renewal) { 788 ResultCallback done_callback( 789 Bind(&WakeOnWiFiTest::DoneCallback, Unretained(this))); 790 Closure renew_dhcp_lease_callback( 791 Bind(&WakeOnWiFiTest::RenewDHCPLeaseCallback, Unretained(this))); 792 Closure remove_supplicant_networks_callback(Bind( 793 &WakeOnWiFiTest::RemoveSupplicantNetworksCallback, Unretained(this))); 794 wake_on_wifi_->OnBeforeSuspend(is_connected, ssid_whitelist, done_callback, 795 renew_dhcp_lease_callback, 796 remove_supplicant_networks_callback, 797 have_dhcp_lease, time_to_next_lease_renewal); 798 } 799 800 void OnDarkResume(bool is_connected, 801 const vector<ByteString>& ssid_whitelist) { 802 ResultCallback done_callback( 803 Bind(&WakeOnWiFiTest::DoneCallback, Unretained(this))); 804 Closure renew_dhcp_lease_callback( 805 Bind(&WakeOnWiFiTest::RenewDHCPLeaseCallback, Unretained(this))); 806 WakeOnWiFi::InitiateScanCallback initiate_scan_callback( 807 Bind(&WakeOnWiFiTest::InitiateScanCallback, Unretained(this))); 808 Closure remove_supplicant_networks_callback(Bind( 809 &WakeOnWiFiTest::RemoveSupplicantNetworksCallback, Unretained(this))); 810 wake_on_wifi_->OnDarkResume( 811 is_connected, ssid_whitelist, done_callback, renew_dhcp_lease_callback, 812 initiate_scan_callback, remove_supplicant_networks_callback); 813 } 814 815 void OnAfterResume() { wake_on_wifi_->OnAfterResume(); } 816 817 void BeforeSuspendActions(bool is_connected, bool start_lease_renewal_timer, 818 uint32_t time_to_next_lease_renewal) { 819 SetDarkResumeActionsTimeOutCallback(); 820 EXPECT_FALSE(DarkResumeActionsTimeOutCallbackIsCancelled()); 821 EXPECT_CALL(metrics_, 822 NotifyBeforeSuspendActions(is_connected, GetInDarkResume())); 823 Closure remove_supplicant_networks_callback(Bind( 824 &WakeOnWiFiTest::RemoveSupplicantNetworksCallback, Unretained(this))); 825 wake_on_wifi_->BeforeSuspendActions(is_connected, start_lease_renewal_timer, 826 time_to_next_lease_renewal, 827 remove_supplicant_networks_callback); 828 EXPECT_TRUE(DarkResumeActionsTimeOutCallbackIsCancelled()); 829 } 830 831 void OnConnectedAndReachable(bool start_lease_renewal_timer, 832 uint32_t time_to_next_lease_renewal) { 833 wake_on_wifi_->OnConnectedAndReachable(start_lease_renewal_timer, 834 time_to_next_lease_renewal); 835 } 836 837 void SetInDarkResume(bool val) { wake_on_wifi_->in_dark_resume_ = val; } 838 839 bool GetInDarkResume() { return wake_on_wifi_->in_dark_resume_; } 840 841 void SetWiphyIndexReceivedToFalse() { 842 wake_on_wifi_->wiphy_index_received_ = false; 843 } 844 845 void SetWiphyIndex(uint32_t wiphy_index) { 846 wake_on_wifi_->wiphy_index_ = wiphy_index; 847 } 848 849 void ParseWakeOnWiFiCapabilities(const Nl80211Message& nl80211_message) { 850 wake_on_wifi_->ParseWakeOnWiFiCapabilities(nl80211_message); 851 } 852 853 bool SetWakeOnWiFiFeaturesEnabled(const std::string& enabled, Error* error) { 854 return wake_on_wifi_->SetWakeOnWiFiFeaturesEnabled(enabled, error); 855 } 856 857 const string& GetWakeOnWiFiFeaturesEnabled() { 858 return wake_on_wifi_->wake_on_wifi_features_enabled_; 859 } 860 861 void SetDarkResumeActionsTimeOutCallback() { 862 wake_on_wifi_->dark_resume_actions_timeout_callback_.Reset(Bind( 863 &WakeOnWiFiTest::DarkResumeActionsTimeoutCallback, Unretained(this))); 864 } 865 866 bool DarkResumeActionsTimeOutCallbackIsCancelled() { 867 return wake_on_wifi_->dark_resume_actions_timeout_callback_.IsCancelled(); 868 } 869 870 void StartDHCPLeaseRenewalTimer() { 871 wake_on_wifi_->dhcp_lease_renewal_timer_.Start( 872 FROM_HERE, base::TimeDelta::FromSeconds(kTimeToNextLeaseRenewalLong), 873 Bind(&WakeOnWiFiTest::OnTimerWakeDoNothing, Unretained(this))); 874 } 875 876 void StartWakeToScanTimer() { 877 wake_on_wifi_->wake_to_scan_timer_.Start( 878 FROM_HERE, base::TimeDelta::FromSeconds(kTimeToNextLeaseRenewalLong), 879 Bind(&WakeOnWiFiTest::OnTimerWakeDoNothing, Unretained(this))); 880 } 881 882 void StopDHCPLeaseRenewalTimer() { 883 wake_on_wifi_->dhcp_lease_renewal_timer_.Stop(); 884 } 885 886 void StopWakeToScanTimer() { wake_on_wifi_->wake_to_scan_timer_.Stop(); } 887 888 bool DHCPLeaseRenewalTimerIsRunning() { 889 return wake_on_wifi_->dhcp_lease_renewal_timer_.IsRunning(); 890 } 891 892 bool WakeToScanTimerIsRunning() { 893 return wake_on_wifi_->wake_to_scan_timer_.IsRunning(); 894 } 895 896 void SetDarkResumeActionsTimeoutMilliseconds(int64_t timeout) { 897 wake_on_wifi_->DarkResumeActionsTimeoutMilliseconds = timeout; 898 } 899 900 void InitStateForDarkResume() { 901 SetInDarkResume(true); 902 GetWakeOnPacketConnections()->AddUnique(IPAddress("1.1.1.1")); 903 EnableWakeOnWiFiFeaturesPacketDarkConnect(); 904 SetDarkResumeActionsTimeoutMilliseconds(0); 905 } 906 907 void SetExpectationsDisconnectedBeforeSuspend() { 908 EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty()); 909 EXPECT_CALL(*this, DoneCallback(_)).Times(0); 910 EXPECT_CALL(*this, RemoveSupplicantNetworksCallback()).Times(1); 911 EXPECT_CALL(netlink_manager_, 912 SendNl80211Message( 913 IsNl80211Command(kNl80211FamilyId, 914 SetWakeOnPacketConnMessage::kCommand), 915 _, _, _)); 916 } 917 918 void SetExpectationsConnectedBeforeSuspend() { 919 EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty()); 920 EXPECT_CALL(*this, DoneCallback(_)).Times(0); 921 EXPECT_CALL(netlink_manager_, 922 SendNl80211Message( 923 IsNl80211Command(kNl80211FamilyId, 924 SetWakeOnPacketConnMessage::kCommand), 925 _, _, _)); 926 } 927 928 void VerifyStateConnectedBeforeSuspend() { 929 EXPECT_TRUE(DarkResumeActionsTimeOutCallbackIsCancelled()); 930 EXPECT_FALSE(GetInDarkResume()); 931 EXPECT_EQ(GetWakeOnWiFiTriggers()->size(), 2); 932 EXPECT_TRUE( 933 GetWakeOnWiFiTriggers()->find(WakeOnWiFi::kWakeTriggerPattern) != 934 GetWakeOnWiFiTriggers()->end()); 935 EXPECT_TRUE( 936 GetWakeOnWiFiTriggers()->find(WakeOnWiFi::kWakeTriggerDisconnect) != 937 GetWakeOnWiFiTriggers()->end()); 938 } 939 940 void VerifyStateDisconnectedBeforeSuspend() { 941 EXPECT_TRUE(DarkResumeActionsTimeOutCallbackIsCancelled()); 942 EXPECT_FALSE(GetInDarkResume()); 943 EXPECT_EQ(GetWakeOnWiFiTriggers()->size(), 1); 944 EXPECT_FALSE( 945 GetWakeOnWiFiTriggers()->find(WakeOnWiFi::kWakeTriggerPattern) != 946 GetWakeOnWiFiTriggers()->end()); 947 EXPECT_TRUE(GetWakeOnWiFiTriggers()->find(WakeOnWiFi::kWakeTriggerSSID) != 948 GetWakeOnWiFiTriggers()->end()); 949 } 950 951 void ReportConnectedToServiceAfterWake(bool is_connected) { 952 wake_on_wifi_->ReportConnectedToServiceAfterWake(is_connected); 953 } 954 955 void OnNoAutoConnectableServicesAfterScan( 956 const vector<ByteString>& ssid_whitelist) { 957 Closure remove_supplicant_networks_callback(Bind( 958 &WakeOnWiFiTest::RemoveSupplicantNetworksCallback, Unretained(this))); 959 WakeOnWiFi::InitiateScanCallback initiate_scan_callback( 960 Bind(&WakeOnWiFiTest::InitiateScanCallback, Unretained(this))); 961 wake_on_wifi_->OnNoAutoConnectableServicesAfterScan( 962 ssid_whitelist, remove_supplicant_networks_callback, 963 initiate_scan_callback); 964 } 965 966 EventHistory* GetDarkResumeHistory() { 967 return &wake_on_wifi_->dark_resume_history_; 968 } 969 970 void SetNetDetectScanPeriodSeconds(uint32_t period) { 971 wake_on_wifi_->net_detect_scan_period_seconds_ = period; 972 } 973 974 void AddSSIDToWhitelist(const uint8_t* ssid, int num_bytes, 975 vector<ByteString>* whitelist) { 976 vector<uint8_t> ssid_vector(ssid, ssid + num_bytes); 977 whitelist->push_back(ByteString(ssid_vector)); 978 } 979 980 vector<ByteString>* GetWakeOnSSIDWhitelist() { 981 return &wake_on_wifi_->wake_on_ssid_whitelist_; 982 } 983 984 void OnWakeupReasonReceived(const NetlinkMessage& netlink_message) { 985 wake_on_wifi_->OnWakeupReasonReceived(netlink_message); 986 } 987 988 WiFi::FreqSet ParseWakeOnSSIDResults(AttributeListConstRefPtr results_list) { 989 return wake_on_wifi_->ParseWakeOnSSIDResults(results_list); 990 } 991 992 NetlinkMessage::MessageContext GetWakeupReportMsgContext() { 993 NetlinkMessage::MessageContext context; 994 context.nl80211_cmd = NL80211_CMD_SET_WOWLAN; 995 context.is_broadcast = true; 996 return context; 997 } 998 999 void SetLastWakeReason(WakeOnWiFi::WakeOnWiFiTrigger reason) { 1000 wake_on_wifi_->last_wake_reason_ = reason; 1001 } 1002 1003 WakeOnWiFi::WakeOnWiFiTrigger GetLastWakeReason() { 1004 return wake_on_wifi_->last_wake_reason_; 1005 } 1006 1007 void OnScanStarted(bool is_active_scan) { 1008 wake_on_wifi_->OnScanStarted(is_active_scan); 1009 } 1010 1011 const WiFi::FreqSet& GetLastSSIDMatchFreqs() { 1012 return wake_on_wifi_->last_ssid_match_freqs_; 1013 } 1014 1015 void AddResultToLastSSIDResults() { 1016 wake_on_wifi_->last_ssid_match_freqs_.insert(1); 1017 } 1018 1019 void InitiateScanInDarkResume(const WiFi::FreqSet& freqs) { 1020 wake_on_wifi_->InitiateScanInDarkResume( 1021 Bind(&WakeOnWiFiTest::InitiateScanCallback, Unretained(this)), freqs); 1022 } 1023 1024 int GetDarkResumeScanRetriesLeft() { 1025 return wake_on_wifi_->dark_resume_scan_retries_left_; 1026 } 1027 1028 void SetDarkResumeScanRetriesLeft(int retries) { 1029 wake_on_wifi_->dark_resume_scan_retries_left_ = retries; 1030 } 1031 1032 Timestamp GetTimestampBootTime(int boottime_seconds) { 1033 struct timeval monotonic = {.tv_sec = 0, .tv_usec = 0}; 1034 struct timeval boottime = {.tv_sec = boottime_seconds, .tv_usec = 0}; 1035 return Timestamp(monotonic, boottime, ""); 1036 } 1037 1038 MOCK_METHOD1(DoneCallback, void(const Error &)); 1039 MOCK_METHOD0(RenewDHCPLeaseCallback, void(void)); 1040 MOCK_METHOD1(InitiateScanCallback, void(const WiFi::FreqSet&)); 1041 MOCK_METHOD0(RemoveSupplicantNetworksCallback, void(void)); 1042 MOCK_METHOD0(DarkResumeActionsTimeoutCallback, void(void)); 1043 MOCK_METHOD0(OnTimerWakeDoNothing, void(void)); 1044 MOCK_METHOD1(RecordDarkResumeWakeReasonCallback, 1045 void(const string& wake_reason)); 1046 1047 protected: 1048 NiceMockControl control_interface_; 1049 MockMetrics metrics_; 1050 MockNetlinkManager netlink_manager_; 1051 MockTime time_; 1052 std::unique_ptr<WakeOnWiFi> wake_on_wifi_; 1053 }; 1054 1055 class WakeOnWiFiTestWithDispatcher : public WakeOnWiFiTest { 1056 public: 1057 WakeOnWiFiTestWithDispatcher() : WakeOnWiFiTest() { 1058 wake_on_wifi_.reset( 1059 new WakeOnWiFi(&netlink_manager_, &dispatcher_, &metrics_, 1060 Bind(&WakeOnWiFiTest::RecordDarkResumeWakeReasonCallback, 1061 Unretained(this)))); 1062 } 1063 virtual ~WakeOnWiFiTestWithDispatcher() {} 1064 1065 protected: 1066 EventDispatcherForTest dispatcher_; 1067 }; 1068 1069 class WakeOnWiFiTestWithMockDispatcher : public WakeOnWiFiTest { 1070 public: 1071 WakeOnWiFiTestWithMockDispatcher() : WakeOnWiFiTest() { 1072 wake_on_wifi_.reset( 1073 new WakeOnWiFi(&netlink_manager_, &mock_dispatcher_, &metrics_, 1074 Bind(&WakeOnWiFiTest::RecordDarkResumeWakeReasonCallback, 1075 Unretained(this)))); 1076 } 1077 virtual ~WakeOnWiFiTestWithMockDispatcher() {} 1078 1079 protected: 1080 // TODO(zqiu): message loop is needed by AlarmTimer, should restructure the 1081 // code so that it can be mocked out. 1082 base::MessageLoopForIO message_loop_; 1083 MockEventDispatcher mock_dispatcher_; 1084 }; 1085 1086 ByteString CreatePattern(const unsigned char* prefix, size_t prefix_len, 1087 const unsigned char* addr, size_t addr_len) { 1088 ByteString result(prefix, prefix_len); 1089 result.Append(ByteString(addr, addr_len)); 1090 return result; 1091 } 1092 1093 #if !defined(DISABLE_WAKE_ON_WIFI) 1094 1095 TEST_F(WakeOnWiFiTestWithMockDispatcher, CreateIPAddressPatternAndMask) { 1096 ByteString pattern; 1097 ByteString mask; 1098 ByteString expected_pattern; 1099 1100 CreateIPAddressPatternAndMask(IPAddress(kIPV4Address0), &pattern, &mask); 1101 expected_pattern = 1102 CreatePattern(kIPV4PatternPrefix, sizeof(kIPV4PatternPrefix), 1103 kIPV4Address0Bytes, sizeof(kIPV4Address0Bytes)); 1104 EXPECT_TRUE(pattern.Equals(expected_pattern)); 1105 EXPECT_TRUE(mask.Equals(ByteString(kIPV4MaskBytes, sizeof(kIPV4MaskBytes)))); 1106 1107 pattern.Clear(); 1108 expected_pattern.Clear(); 1109 mask.Clear(); 1110 CreateIPAddressPatternAndMask(IPAddress(kIPV4Address1), &pattern, &mask); 1111 expected_pattern = 1112 CreatePattern(kIPV4PatternPrefix, sizeof(kIPV4PatternPrefix), 1113 kIPV4Address1Bytes, sizeof(kIPV4Address1Bytes)); 1114 EXPECT_TRUE(pattern.Equals(expected_pattern)); 1115 EXPECT_TRUE(mask.Equals(ByteString(kIPV4MaskBytes, sizeof(kIPV4MaskBytes)))); 1116 1117 pattern.Clear(); 1118 expected_pattern.Clear(); 1119 mask.Clear(); 1120 CreateIPAddressPatternAndMask(IPAddress(kIPV6Address0), &pattern, &mask); 1121 expected_pattern = 1122 CreatePattern(kIPV6PatternPrefix, sizeof(kIPV6PatternPrefix), 1123 kIPV6Address0Bytes, sizeof(kIPV6Address0Bytes)); 1124 EXPECT_TRUE(pattern.Equals(expected_pattern)); 1125 EXPECT_TRUE(mask.Equals(ByteString(kIPV6MaskBytes, sizeof(kIPV6MaskBytes)))); 1126 1127 pattern.Clear(); 1128 expected_pattern.Clear(); 1129 mask.Clear(); 1130 CreateIPAddressPatternAndMask(IPAddress(kIPV6Address1), &pattern, &mask); 1131 expected_pattern = 1132 CreatePattern(kIPV6PatternPrefix, sizeof(kIPV6PatternPrefix), 1133 kIPV6Address1Bytes, sizeof(kIPV6Address1Bytes)); 1134 EXPECT_TRUE(pattern.Equals(expected_pattern)); 1135 EXPECT_TRUE(mask.Equals(ByteString(kIPV6MaskBytes, sizeof(kIPV6MaskBytes)))); 1136 1137 pattern.Clear(); 1138 expected_pattern.Clear(); 1139 mask.Clear(); 1140 CreateIPAddressPatternAndMask(IPAddress(kIPV6Address2), &pattern, &mask); 1141 expected_pattern = 1142 CreatePattern(kIPV6PatternPrefix, sizeof(kIPV6PatternPrefix), 1143 kIPV6Address2Bytes, sizeof(kIPV6Address2Bytes)); 1144 EXPECT_TRUE(pattern.Equals(expected_pattern)); 1145 EXPECT_TRUE(mask.Equals(ByteString(kIPV6MaskBytes, sizeof(kIPV6MaskBytes)))); 1146 1147 pattern.Clear(); 1148 expected_pattern.Clear(); 1149 mask.Clear(); 1150 CreateIPAddressPatternAndMask(IPAddress(kIPV6Address3), &pattern, &mask); 1151 expected_pattern = 1152 CreatePattern(kIPV6PatternPrefix, sizeof(kIPV6PatternPrefix), 1153 kIPV6Address3Bytes, sizeof(kIPV6Address3Bytes)); 1154 EXPECT_TRUE(pattern.Equals(expected_pattern)); 1155 EXPECT_TRUE(mask.Equals(ByteString(kIPV6MaskBytes, sizeof(kIPV6MaskBytes)))); 1156 1157 pattern.Clear(); 1158 expected_pattern.Clear(); 1159 mask.Clear(); 1160 CreateIPAddressPatternAndMask(IPAddress(kIPV6Address4), &pattern, &mask); 1161 expected_pattern = 1162 CreatePattern(kIPV6PatternPrefix, sizeof(kIPV6PatternPrefix), 1163 kIPV6Address4Bytes, sizeof(kIPV6Address4Bytes)); 1164 EXPECT_TRUE(pattern.Equals(expected_pattern)); 1165 EXPECT_TRUE(mask.Equals(ByteString(kIPV6MaskBytes, sizeof(kIPV6MaskBytes)))); 1166 1167 pattern.Clear(); 1168 expected_pattern.Clear(); 1169 mask.Clear(); 1170 CreateIPAddressPatternAndMask(IPAddress(kIPV6Address5), &pattern, &mask); 1171 expected_pattern = 1172 CreatePattern(kIPV6PatternPrefix, sizeof(kIPV6PatternPrefix), 1173 kIPV6Address5Bytes, sizeof(kIPV6Address5Bytes)); 1174 EXPECT_TRUE(pattern.Equals(expected_pattern)); 1175 EXPECT_TRUE(mask.Equals(ByteString(kIPV6MaskBytes, sizeof(kIPV6MaskBytes)))); 1176 1177 pattern.Clear(); 1178 expected_pattern.Clear(); 1179 mask.Clear(); 1180 CreateIPAddressPatternAndMask(IPAddress(kIPV6Address6), &pattern, &mask); 1181 expected_pattern = 1182 CreatePattern(kIPV6PatternPrefix, sizeof(kIPV6PatternPrefix), 1183 kIPV6Address6Bytes, sizeof(kIPV6Address6Bytes)); 1184 EXPECT_TRUE(pattern.Equals(expected_pattern)); 1185 EXPECT_TRUE(mask.Equals(ByteString(kIPV6MaskBytes, sizeof(kIPV6MaskBytes)))); 1186 1187 pattern.Clear(); 1188 expected_pattern.Clear(); 1189 mask.Clear(); 1190 CreateIPAddressPatternAndMask(IPAddress(kIPV6Address7), &pattern, &mask); 1191 expected_pattern = 1192 CreatePattern(kIPV6PatternPrefix, sizeof(kIPV6PatternPrefix), 1193 kIPV6Address7Bytes, sizeof(kIPV6Address7Bytes)); 1194 EXPECT_TRUE(pattern.Equals(expected_pattern)); 1195 EXPECT_TRUE(mask.Equals(ByteString(kIPV6MaskBytes, sizeof(kIPV6MaskBytes)))); 1196 } 1197 1198 TEST_F(WakeOnWiFiTestWithMockDispatcher, ConfigureWiphyIndex) { 1199 SetWakeOnPacketConnMessage msg; 1200 uint32_t value; 1201 EXPECT_FALSE( 1202 msg.attributes()->GetU32AttributeValue(NL80211_ATTR_WIPHY, &value)); 1203 1204 ConfigureWiphyIndex(&msg, 137); 1205 EXPECT_TRUE( 1206 msg.attributes()->GetU32AttributeValue(NL80211_ATTR_WIPHY, &value)); 1207 EXPECT_EQ(value, 137); 1208 } 1209 1210 TEST_F(WakeOnWiFiTestWithMockDispatcher, ConfigureDisableWakeOnWiFiMessage) { 1211 SetWakeOnPacketConnMessage msg; 1212 Error e; 1213 uint32_t value; 1214 EXPECT_FALSE( 1215 msg.attributes()->GetU32AttributeValue(NL80211_ATTR_WIPHY, &value)); 1216 1217 ConfigureDisableWakeOnWiFiMessage(&msg, 57, &e); 1218 EXPECT_EQ(e.type(), Error::Type::kSuccess); 1219 EXPECT_TRUE( 1220 msg.attributes()->GetU32AttributeValue(NL80211_ATTR_WIPHY, &value)); 1221 EXPECT_EQ(value, 57); 1222 } 1223 1224 TEST_F(WakeOnWiFiTestWithMockDispatcher, WakeOnWiFiSettingsMatch) { 1225 IPAddressStore all_addresses; 1226 set<WakeOnWiFi::WakeOnWiFiTrigger> trigs; 1227 vector<ByteString> whitelist; 1228 const uint32_t interval = kNetDetectScanIntervalSeconds; 1229 1230 GetWakeOnPacketConnMessage msg0; 1231 NetlinkPacket packet0(kResponseNoIPAddresses, sizeof(kResponseNoIPAddresses)); 1232 msg0.InitFromPacket(&packet0, NetlinkMessage::MessageContext()); 1233 EXPECT_TRUE( 1234 WakeOnWiFiSettingsMatch(msg0, trigs, all_addresses, interval, whitelist)); 1235 1236 trigs.insert(WakeOnWiFi::kWakeTriggerPattern); 1237 all_addresses.AddUnique( 1238 IPAddress(string(kIPV4Address0, sizeof(kIPV4Address0)))); 1239 GetWakeOnPacketConnMessage msg1; 1240 NetlinkPacket packet1(kResponseIPV40, sizeof(kResponseIPV40)); 1241 msg1.InitFromPacket(&packet1, NetlinkMessage::MessageContext()); 1242 EXPECT_TRUE( 1243 WakeOnWiFiSettingsMatch(msg1, trigs, all_addresses, interval, whitelist)); 1244 EXPECT_FALSE( 1245 WakeOnWiFiSettingsMatch(msg0, trigs, all_addresses, interval, whitelist)); 1246 1247 // Test matching of wake on disconnect trigger. 1248 trigs.insert(WakeOnWiFi::kWakeTriggerDisconnect); 1249 GetWakeOnPacketConnMessage msg2; 1250 NetlinkPacket packet2( 1251 kResponseIPV40WakeOnDisconnect, sizeof(kResponseIPV40WakeOnDisconnect)); 1252 msg2.InitFromPacket(&packet2, NetlinkMessage::MessageContext()); 1253 EXPECT_TRUE( 1254 WakeOnWiFiSettingsMatch(msg2, trigs, all_addresses, interval, whitelist)); 1255 EXPECT_FALSE( 1256 WakeOnWiFiSettingsMatch(msg1, trigs, all_addresses, interval, whitelist)); 1257 EXPECT_FALSE( 1258 WakeOnWiFiSettingsMatch(msg0, trigs, all_addresses, interval, whitelist)); 1259 1260 trigs.erase(WakeOnWiFi::kWakeTriggerDisconnect); 1261 all_addresses.AddUnique( 1262 IPAddress(string(kIPV4Address1, sizeof(kIPV4Address1)))); 1263 GetWakeOnPacketConnMessage msg3; 1264 NetlinkPacket packet3(kResponseIPV401, sizeof(kResponseIPV401)); 1265 msg3.InitFromPacket(&packet3, NetlinkMessage::MessageContext()); 1266 EXPECT_TRUE( 1267 WakeOnWiFiSettingsMatch(msg3, trigs, all_addresses, interval, whitelist)); 1268 EXPECT_FALSE( 1269 WakeOnWiFiSettingsMatch(msg2, trigs, all_addresses, interval, whitelist)); 1270 EXPECT_FALSE( 1271 WakeOnWiFiSettingsMatch(msg1, trigs, all_addresses, interval, whitelist)); 1272 EXPECT_FALSE( 1273 WakeOnWiFiSettingsMatch(msg0, trigs, all_addresses, interval, whitelist)); 1274 1275 all_addresses.AddUnique( 1276 IPAddress(string(kIPV6Address0, sizeof(kIPV6Address0)))); 1277 GetWakeOnPacketConnMessage msg4; 1278 NetlinkPacket packet4(kResponseIPV401IPV60, sizeof(kResponseIPV401IPV60)); 1279 msg4.InitFromPacket(&packet4, NetlinkMessage::MessageContext()); 1280 EXPECT_TRUE( 1281 WakeOnWiFiSettingsMatch(msg4, trigs, all_addresses, interval, whitelist)); 1282 EXPECT_FALSE( 1283 WakeOnWiFiSettingsMatch(msg3, trigs, all_addresses, interval, whitelist)); 1284 EXPECT_FALSE( 1285 WakeOnWiFiSettingsMatch(msg2, trigs, all_addresses, interval, whitelist)); 1286 EXPECT_FALSE( 1287 WakeOnWiFiSettingsMatch(msg1, trigs, all_addresses, interval, whitelist)); 1288 EXPECT_FALSE( 1289 WakeOnWiFiSettingsMatch(msg0, trigs, all_addresses, interval, whitelist)); 1290 1291 all_addresses.AddUnique( 1292 IPAddress(string(kIPV6Address1, sizeof(kIPV6Address1)))); 1293 GetWakeOnPacketConnMessage msg5; 1294 NetlinkPacket packet5(kResponseIPV401IPV601, sizeof(kResponseIPV401IPV601)); 1295 msg5.InitFromPacket(&packet5, NetlinkMessage::MessageContext()); 1296 EXPECT_TRUE( 1297 WakeOnWiFiSettingsMatch(msg5, trigs, all_addresses, interval, whitelist)); 1298 EXPECT_FALSE( 1299 WakeOnWiFiSettingsMatch(msg4, trigs, all_addresses, interval, whitelist)); 1300 EXPECT_FALSE( 1301 WakeOnWiFiSettingsMatch(msg3, trigs, all_addresses, interval, whitelist)); 1302 EXPECT_FALSE( 1303 WakeOnWiFiSettingsMatch(msg2, trigs, all_addresses, interval, whitelist)); 1304 EXPECT_FALSE( 1305 WakeOnWiFiSettingsMatch(msg1, trigs, all_addresses, interval, whitelist)); 1306 EXPECT_FALSE( 1307 WakeOnWiFiSettingsMatch(msg0, trigs, all_addresses, interval, whitelist)); 1308 1309 // Test matching of wake on SSID trigger. 1310 all_addresses.Clear(); 1311 trigs.clear(); 1312 trigs.insert(WakeOnWiFi::kWakeTriggerSSID); 1313 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 1314 AddSSIDToWhitelist(kSSIDBytes2, sizeof(kSSIDBytes2), &whitelist); 1315 GetWakeOnPacketConnMessage msg6; 1316 NetlinkPacket packet6(kResponseWakeOnSSID, sizeof(kResponseWakeOnSSID)); 1317 msg6.InitFromPacket(&packet6, NetlinkMessage::MessageContext()); 1318 EXPECT_TRUE( 1319 WakeOnWiFiSettingsMatch(msg6, trigs, all_addresses, interval, whitelist)); 1320 EXPECT_FALSE( 1321 WakeOnWiFiSettingsMatch(msg5, trigs, all_addresses, interval, whitelist)); 1322 EXPECT_FALSE( 1323 WakeOnWiFiSettingsMatch(msg4, trigs, all_addresses, interval, whitelist)); 1324 EXPECT_FALSE( 1325 WakeOnWiFiSettingsMatch(msg3, trigs, all_addresses, interval, whitelist)); 1326 EXPECT_FALSE( 1327 WakeOnWiFiSettingsMatch(msg2, trigs, all_addresses, interval, whitelist)); 1328 EXPECT_FALSE( 1329 WakeOnWiFiSettingsMatch(msg1, trigs, all_addresses, interval, whitelist)); 1330 EXPECT_FALSE( 1331 WakeOnWiFiSettingsMatch(msg0, trigs, all_addresses, interval, whitelist)); 1332 1333 // Test that we get a mismatch if triggers are present in the message that we 1334 // don't expect. 1335 trigs.clear(); 1336 EXPECT_FALSE( 1337 WakeOnWiFiSettingsMatch(msg6, trigs, all_addresses, interval, whitelist)); 1338 EXPECT_FALSE( 1339 WakeOnWiFiSettingsMatch(msg5, trigs, all_addresses, interval, whitelist)); 1340 EXPECT_FALSE( 1341 WakeOnWiFiSettingsMatch(msg4, trigs, all_addresses, interval, whitelist)); 1342 EXPECT_FALSE( 1343 WakeOnWiFiSettingsMatch(msg3, trigs, all_addresses, interval, whitelist)); 1344 EXPECT_FALSE( 1345 WakeOnWiFiSettingsMatch(msg2, trigs, all_addresses, interval, whitelist)); 1346 EXPECT_FALSE( 1347 WakeOnWiFiSettingsMatch(msg1, trigs, all_addresses, interval, whitelist)); 1348 } 1349 1350 TEST_F(WakeOnWiFiTestWithMockDispatcher, 1351 ConfigureSetWakeOnWiFiSettingsMessage) { 1352 IPAddressStore all_addresses; 1353 set<WakeOnWiFi::WakeOnWiFiTrigger> trigs; 1354 const int index = 1; // wiphy device number 1355 vector<ByteString> whitelist; 1356 const uint32_t interval = kNetDetectScanIntervalSeconds; 1357 SetWakeOnPacketConnMessage msg0; 1358 Error e; 1359 trigs.insert(WakeOnWiFi::kWakeTriggerPattern); 1360 all_addresses.AddUnique( 1361 IPAddress(string(kIPV4Address0, sizeof(kIPV4Address0)))); 1362 EXPECT_TRUE(ConfigureSetWakeOnWiFiSettingsMessage( 1363 &msg0, trigs, all_addresses, index, interval, whitelist, &e)); 1364 EXPECT_TRUE( 1365 WakeOnWiFiSettingsMatch(msg0, trigs, all_addresses, interval, whitelist)); 1366 1367 SetWakeOnPacketConnMessage msg1; 1368 all_addresses.AddUnique( 1369 IPAddress(string(kIPV4Address1, sizeof(kIPV4Address1)))); 1370 EXPECT_TRUE(ConfigureSetWakeOnWiFiSettingsMessage( 1371 &msg1, trigs, all_addresses, index, interval, whitelist, &e)); 1372 EXPECT_TRUE( 1373 WakeOnWiFiSettingsMatch(msg1, trigs, all_addresses, interval, whitelist)); 1374 1375 SetWakeOnPacketConnMessage msg2; 1376 all_addresses.AddUnique( 1377 IPAddress(string(kIPV6Address0, sizeof(kIPV6Address0)))); 1378 EXPECT_TRUE(ConfigureSetWakeOnWiFiSettingsMessage( 1379 &msg2, trigs, all_addresses, index, interval, whitelist, &e)); 1380 EXPECT_TRUE( 1381 WakeOnWiFiSettingsMatch(msg2, trigs, all_addresses, interval, whitelist)); 1382 1383 SetWakeOnPacketConnMessage msg3; 1384 all_addresses.AddUnique( 1385 IPAddress(string(kIPV6Address1, sizeof(kIPV6Address1)))); 1386 EXPECT_TRUE(ConfigureSetWakeOnWiFiSettingsMessage( 1387 &msg3, trigs, all_addresses, index, interval, whitelist, &e)); 1388 EXPECT_TRUE( 1389 WakeOnWiFiSettingsMatch(msg3, trigs, all_addresses, interval, whitelist)); 1390 1391 SetWakeOnPacketConnMessage msg4; 1392 all_addresses.AddUnique( 1393 IPAddress(string(kIPV6Address2, sizeof(kIPV6Address2)))); 1394 EXPECT_TRUE(ConfigureSetWakeOnWiFiSettingsMessage( 1395 &msg4, trigs, all_addresses, index, interval, whitelist, &e)); 1396 EXPECT_TRUE( 1397 WakeOnWiFiSettingsMatch(msg4, trigs, all_addresses, interval, whitelist)); 1398 1399 SetWakeOnPacketConnMessage msg5; 1400 all_addresses.AddUnique( 1401 IPAddress(string(kIPV6Address3, sizeof(kIPV6Address3)))); 1402 EXPECT_TRUE(ConfigureSetWakeOnWiFiSettingsMessage( 1403 &msg5, trigs, all_addresses, index, interval, whitelist, &e)); 1404 EXPECT_TRUE( 1405 WakeOnWiFiSettingsMatch(msg5, trigs, all_addresses, interval, whitelist)); 1406 1407 SetWakeOnPacketConnMessage msg6; 1408 all_addresses.AddUnique( 1409 IPAddress(string(kIPV6Address4, sizeof(kIPV6Address4)))); 1410 EXPECT_TRUE(ConfigureSetWakeOnWiFiSettingsMessage( 1411 &msg6, trigs, all_addresses, index, interval, whitelist, &e)); 1412 EXPECT_TRUE( 1413 WakeOnWiFiSettingsMatch(msg6, trigs, all_addresses, interval, whitelist)); 1414 1415 SetWakeOnPacketConnMessage msg7; 1416 all_addresses.AddUnique( 1417 IPAddress(string(kIPV6Address5, sizeof(kIPV6Address5)))); 1418 EXPECT_TRUE(ConfigureSetWakeOnWiFiSettingsMessage( 1419 &msg7, trigs, all_addresses, index, interval, whitelist, &e)); 1420 EXPECT_TRUE( 1421 WakeOnWiFiSettingsMatch(msg7, trigs, all_addresses, interval, whitelist)); 1422 1423 SetWakeOnPacketConnMessage msg8; 1424 all_addresses.AddUnique( 1425 IPAddress(string(kIPV6Address6, sizeof(kIPV6Address6)))); 1426 EXPECT_TRUE(ConfigureSetWakeOnWiFiSettingsMessage( 1427 &msg8, trigs, all_addresses, index, interval, whitelist, &e)); 1428 EXPECT_TRUE( 1429 WakeOnWiFiSettingsMatch(msg8, trigs, all_addresses, interval, whitelist)); 1430 1431 SetWakeOnPacketConnMessage msg9; 1432 all_addresses.AddUnique( 1433 IPAddress(string(kIPV6Address7, sizeof(kIPV6Address7)))); 1434 EXPECT_TRUE(ConfigureSetWakeOnWiFiSettingsMessage( 1435 &msg9, trigs, all_addresses, index, interval, whitelist, &e)); 1436 EXPECT_TRUE( 1437 WakeOnWiFiSettingsMatch(msg9, trigs, all_addresses, interval, whitelist)); 1438 1439 SetWakeOnPacketConnMessage msg10; 1440 all_addresses.Clear(); 1441 trigs.clear(); 1442 trigs.insert(WakeOnWiFi::kWakeTriggerSSID); 1443 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 1444 AddSSIDToWhitelist(kSSIDBytes2, sizeof(kSSIDBytes2), &whitelist); 1445 EXPECT_TRUE(ConfigureSetWakeOnWiFiSettingsMessage( 1446 &msg10, trigs, all_addresses, index, interval, whitelist, &e)); 1447 EXPECT_TRUE(WakeOnWiFiSettingsMatch(msg10, trigs, all_addresses, interval, 1448 whitelist)); 1449 } 1450 1451 TEST_F(WakeOnWiFiTestWithMockDispatcher, RequestWakeOnPacketSettings) { 1452 EXPECT_CALL( 1453 netlink_manager_, 1454 SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 1455 GetWakeOnPacketConnMessage::kCommand), 1456 _, _, _)).Times(1); 1457 RequestWakeOnPacketSettings(); 1458 } 1459 1460 TEST_F(WakeOnWiFiTestWithMockDispatcher, 1461 VerifyWakeOnWiFiSettings_NoWakeOnPacketRules) { 1462 ScopedMockLog log; 1463 // Create an Nl80211 response to a NL80211_CMD_GET_WOWLAN request 1464 // indicating that there are no wake-on-packet rules programmed into the NIC. 1465 GetWakeOnPacketConnMessage msg; 1466 NetlinkPacket packet(kResponseNoIPAddresses, sizeof(kResponseNoIPAddresses)); 1467 msg.InitFromPacket(&packet, NetlinkMessage::MessageContext()); 1468 // Successful verification and consequent invocation of callback. 1469 SetSuspendActionsDoneCallback(); 1470 ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1471 ScopeLogger::GetInstance()->set_verbose_level(2); 1472 EXPECT_TRUE(GetWakeOnPacketConnections()->Empty()); 1473 EXPECT_FALSE(SuspendActionsCallbackIsNull()); 1474 EXPECT_CALL(*this, DoneCallback(ErrorTypeIs(Error::kSuccess))).Times(1); 1475 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1476 EXPECT_CALL( 1477 log, Log(_, _, HasSubstr("Wake on WiFi settings successfully verified"))); 1478 EXPECT_CALL(metrics_, NotifyVerifyWakeOnWiFiSettingsResult( 1479 Metrics::kVerifyWakeOnWiFiSettingsResultSuccess)); 1480 VerifyWakeOnWiFiSettings(msg); 1481 // Suspend action callback cleared after being invoked. 1482 EXPECT_TRUE(SuspendActionsCallbackIsNull()); 1483 ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1484 ScopeLogger::GetInstance()->set_verbose_level(0); 1485 1486 // Unsuccessful verification if locally stored settings do not match. 1487 GetWakeOnPacketConnections()->AddUnique(IPAddress("1.1.1.1")); 1488 GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kWakeTriggerPattern); 1489 EXPECT_CALL(log, 1490 Log(logging::LOG_ERROR, _, 1491 HasSubstr( 1492 " failed: discrepancy between wake-on-packet settings on " 1493 "NIC and those in local data structure detected"))); 1494 EXPECT_CALL(metrics_, NotifyVerifyWakeOnWiFiSettingsResult( 1495 Metrics::kVerifyWakeOnWiFiSettingsResultFailure)); 1496 VerifyWakeOnWiFiSettings(msg); 1497 } 1498 1499 TEST_F(WakeOnWiFiTestWithMockDispatcher, 1500 VerifyWakeOnWiFiSettings_WakeOnPatternAndDisconnectRules) { 1501 ScopedMockLog log; 1502 // Create a non-trivial Nl80211 response to a NL80211_CMD_GET_WOWLAN request 1503 // indicating that that the NIC wakes on packets from 192.168.10.20 and on 1504 // disconnects. 1505 GetWakeOnPacketConnMessage msg; 1506 NetlinkPacket packet( 1507 kResponseIPV40WakeOnDisconnect, sizeof(kResponseIPV40WakeOnDisconnect)); 1508 msg.InitFromPacket(&packet, NetlinkMessage::MessageContext()); 1509 // Successful verification and consequent invocation of callback. 1510 SetSuspendActionsDoneCallback(); 1511 EXPECT_FALSE(SuspendActionsCallbackIsNull()); 1512 GetWakeOnPacketConnections()->AddUnique(IPAddress("192.168.10.20")); 1513 GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kWakeTriggerPattern); 1514 GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kWakeTriggerDisconnect); 1515 ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1516 ScopeLogger::GetInstance()->set_verbose_level(2); 1517 EXPECT_CALL(*this, DoneCallback(ErrorTypeIs(Error::kSuccess))).Times(1); 1518 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1519 EXPECT_CALL( 1520 log, Log(_, _, HasSubstr("Wake on WiFi settings successfully verified"))); 1521 EXPECT_CALL(metrics_, NotifyVerifyWakeOnWiFiSettingsResult( 1522 Metrics::kVerifyWakeOnWiFiSettingsResultSuccess)); 1523 VerifyWakeOnWiFiSettings(msg); 1524 // Suspend action callback cleared after being invoked. 1525 EXPECT_TRUE(SuspendActionsCallbackIsNull()); 1526 ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1527 ScopeLogger::GetInstance()->set_verbose_level(0); 1528 1529 // Unsuccessful verification if locally stored settings do not match. 1530 GetWakeOnWiFiTriggers()->erase(WakeOnWiFi::kWakeTriggerDisconnect); 1531 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1532 EXPECT_CALL(log, 1533 Log(logging::LOG_ERROR, _, 1534 HasSubstr( 1535 " failed: discrepancy between wake-on-packet settings on " 1536 "NIC and those in local data structure detected"))); 1537 EXPECT_CALL(metrics_, NotifyVerifyWakeOnWiFiSettingsResult( 1538 Metrics::kVerifyWakeOnWiFiSettingsResultFailure)); 1539 VerifyWakeOnWiFiSettings(msg); 1540 } 1541 1542 TEST_F(WakeOnWiFiTestWithMockDispatcher, 1543 VerifyWakeOnWiFiSettings_WakeOnSSIDRules) { 1544 ScopedMockLog log; 1545 // Create a non-trivial Nl80211 response to a NL80211_CMD_GET_WOWLAN request 1546 // indicating that that the NIC wakes on two SSIDs represented by kSSIDBytes1 1547 // and kSSIDBytes2 and scans for them at interval 1548 // kNetDetectScanIntervalSeconds. 1549 GetWakeOnPacketConnMessage msg; 1550 NetlinkPacket packet(kResponseWakeOnSSID, sizeof(kResponseWakeOnSSID)); 1551 msg.InitFromPacket(&packet, NetlinkMessage::MessageContext()); 1552 // Successful verification and consequent invocation of callback. 1553 SetSuspendActionsDoneCallback(); 1554 EXPECT_FALSE(SuspendActionsCallbackIsNull()); 1555 GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kWakeTriggerSSID); 1556 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), 1557 GetWakeOnSSIDWhitelist()); 1558 AddSSIDToWhitelist(kSSIDBytes2, sizeof(kSSIDBytes2), 1559 GetWakeOnSSIDWhitelist()); 1560 SetNetDetectScanPeriodSeconds(kNetDetectScanIntervalSeconds); 1561 ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1562 ScopeLogger::GetInstance()->set_verbose_level(2); 1563 EXPECT_CALL(*this, DoneCallback(ErrorTypeIs(Error::kSuccess))).Times(1); 1564 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1565 EXPECT_CALL( 1566 log, Log(_, _, HasSubstr("Wake on WiFi settings successfully verified"))); 1567 EXPECT_CALL(metrics_, NotifyVerifyWakeOnWiFiSettingsResult( 1568 Metrics::kVerifyWakeOnWiFiSettingsResultSuccess)); 1569 VerifyWakeOnWiFiSettings(msg); 1570 // Suspend action callback cleared after being invoked. 1571 EXPECT_TRUE(SuspendActionsCallbackIsNull()); 1572 ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1573 ScopeLogger::GetInstance()->set_verbose_level(0); 1574 } 1575 1576 TEST_F(WakeOnWiFiTestWithMockDispatcher, 1577 VerifyWakeOnWiFiSettingsSuccess_NoDoneCallback) { 1578 ScopedMockLog log; 1579 // Create an Nl80211 response to a NL80211_CMD_GET_WOWLAN request 1580 // indicating that there are no wake-on-packet rules programmed into the NIC. 1581 GetWakeOnPacketConnMessage msg; 1582 NetlinkPacket packet(kResponseNoIPAddresses, sizeof(kResponseNoIPAddresses)); 1583 msg.InitFromPacket(&packet, NetlinkMessage::MessageContext()); 1584 // Successful verification, but since there is no suspend action callback 1585 // set, no callback is invoked. 1586 EXPECT_TRUE(SuspendActionsCallbackIsNull()); 1587 EXPECT_TRUE(GetWakeOnPacketConnections()->Empty()); 1588 ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1589 ScopeLogger::GetInstance()->set_verbose_level(2); 1590 EXPECT_CALL(*this, DoneCallback(_)).Times(0); 1591 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1592 EXPECT_CALL( 1593 log, Log(_, _, HasSubstr("Wake on WiFi settings successfully verified"))); 1594 EXPECT_CALL(metrics_, NotifyVerifyWakeOnWiFiSettingsResult( 1595 Metrics::kVerifyWakeOnWiFiSettingsResultSuccess)); 1596 VerifyWakeOnWiFiSettings(msg); 1597 ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1598 ScopeLogger::GetInstance()->set_verbose_level(0); 1599 } 1600 1601 TEST_F(WakeOnWiFiTestWithMockDispatcher, 1602 RetrySetWakeOnPacketConnections_LessThanMaxRetries) { 1603 ScopedMockLog log; 1604 // Max retries not reached yet, so send Nl80211 message to program NIC again. 1605 GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kWakeTriggerDisconnect); 1606 SetNumSetWakeOnPacketRetries(WakeOnWiFi::kMaxSetWakeOnPacketRetries - 1); 1607 EXPECT_CALL( 1608 netlink_manager_, 1609 SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 1610 SetWakeOnPacketConnMessage::kCommand), 1611 _, _, _)).Times(1); 1612 RetrySetWakeOnPacketConnections(); 1613 EXPECT_EQ(GetNumSetWakeOnPacketRetries(), 1614 WakeOnWiFi::kMaxSetWakeOnPacketRetries); 1615 } 1616 1617 TEST_F(WakeOnWiFiTestWithMockDispatcher, 1618 RetrySetWakeOnPacketConnections_MaxAttemptsWithCallbackSet) { 1619 ScopedMockLog log; 1620 // Max retry attempts reached. Suspend actions done callback is set, so it 1621 // is invoked. 1622 SetNumSetWakeOnPacketRetries(WakeOnWiFi::kMaxSetWakeOnPacketRetries); 1623 SetSuspendActionsDoneCallback(); 1624 ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1625 ScopeLogger::GetInstance()->set_verbose_level(3); 1626 EXPECT_FALSE(SuspendActionsCallbackIsNull()); 1627 EXPECT_CALL(*this, DoneCallback(ErrorTypeIs(Error::kOperationFailed))) 1628 .Times(1); 1629 EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0); 1630 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1631 EXPECT_CALL(log, Log(_, _, HasSubstr("max retry attempts reached"))); 1632 RetrySetWakeOnPacketConnections(); 1633 EXPECT_TRUE(SuspendActionsCallbackIsNull()); 1634 EXPECT_EQ(GetNumSetWakeOnPacketRetries(), 0); 1635 ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1636 ScopeLogger::GetInstance()->set_verbose_level(0); 1637 } 1638 1639 TEST_F(WakeOnWiFiTestWithMockDispatcher, 1640 RetrySetWakeOnPacketConnections_MaxAttemptsCallbackUnset) { 1641 ScopedMockLog log; 1642 // If there is no suspend action callback set, no suspend callback should be 1643 // invoked. 1644 SetNumSetWakeOnPacketRetries(WakeOnWiFi::kMaxSetWakeOnPacketRetries); 1645 ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1646 ScopeLogger::GetInstance()->set_verbose_level(3); 1647 EXPECT_TRUE(SuspendActionsCallbackIsNull()); 1648 EXPECT_CALL(*this, DoneCallback(_)).Times(0); 1649 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1650 EXPECT_CALL(log, Log(_, _, HasSubstr("max retry attempts reached"))); 1651 RetrySetWakeOnPacketConnections(); 1652 ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1653 ScopeLogger::GetInstance()->set_verbose_level(0); 1654 } 1655 1656 TEST_F(WakeOnWiFiTestWithMockDispatcher, 1657 ParseWakeOnWiFiCapabilities_DisconnectPatternSSIDSupported) { 1658 ClearWakeOnWiFiTriggersSupported(); 1659 NewWiphyMessage msg; 1660 NetlinkPacket packet(kNewWiphyNlMsg, sizeof(kNewWiphyNlMsg)); 1661 msg.InitFromPacket(&packet, NetlinkMessage::MessageContext()); 1662 ParseWakeOnWiFiCapabilities(msg); 1663 EXPECT_TRUE(GetWakeOnWiFiTriggersSupported()->find( 1664 WakeOnWiFi::kWakeTriggerDisconnect) != 1665 GetWakeOnWiFiTriggersSupported()->end()); 1666 EXPECT_TRUE( 1667 GetWakeOnWiFiTriggersSupported()->find(WakeOnWiFi::kWakeTriggerPattern) != 1668 GetWakeOnWiFiTriggersSupported()->end()); 1669 EXPECT_TRUE( 1670 GetWakeOnWiFiTriggersSupported()->find(WakeOnWiFi::kWakeTriggerSSID) != 1671 GetWakeOnWiFiTriggersSupported()->end()); 1672 EXPECT_EQ(GetWakeOnWiFiMaxPatterns(), kNewWiphyNlMsg_MaxPatterns); 1673 EXPECT_EQ(GetWakeOnWiFiMaxSSIDs(), kNewWiphyNlMsg_MaxSSIDs); 1674 } 1675 1676 TEST_F(WakeOnWiFiTestWithMockDispatcher, 1677 ParseWakeOnWiFiCapabilities_UnsupportedPatternLen) { 1678 ClearWakeOnWiFiTriggersSupported(); 1679 NewWiphyMessage msg; 1680 // Modify the range of support pattern lengths to [0-1] bytes, which is less 1681 // than what we need to use our IPV4 (30 bytes) or IPV6 (38 bytes) patterns. 1682 MutableNetlinkPacket packet(kNewWiphyNlMsg, sizeof(kNewWiphyNlMsg)); 1683 struct nl80211_pattern_support* patt_support = 1684 reinterpret_cast<struct nl80211_pattern_support*>( 1685 &packet.GetMutablePayload()->GetData()[ 1686 kNewWiphyNlMsg_PattSupportOffset]); 1687 patt_support->min_pattern_len = 0; 1688 patt_support->max_pattern_len = 1; 1689 msg.InitFromPacket(&packet, NetlinkMessage::MessageContext()); 1690 ParseWakeOnWiFiCapabilities(msg); 1691 EXPECT_TRUE(GetWakeOnWiFiTriggersSupported()->find( 1692 WakeOnWiFi::kWakeTriggerDisconnect) != 1693 GetWakeOnWiFiTriggersSupported()->end()); 1694 EXPECT_TRUE( 1695 GetWakeOnWiFiTriggersSupported()->find(WakeOnWiFi::kWakeTriggerSSID) != 1696 GetWakeOnWiFiTriggersSupported()->end()); 1697 // Ensure that ParseWakeOnWiFiCapabilities realizes that our IP address 1698 // patterns cannot be used given the support pattern length range reported. 1699 EXPECT_FALSE( 1700 GetWakeOnWiFiTriggersSupported()->find(WakeOnWiFi::kWakeTriggerPattern) != 1701 GetWakeOnWiFiTriggersSupported()->end()); 1702 } 1703 1704 TEST_F(WakeOnWiFiTestWithMockDispatcher, 1705 ParseWakeOnWiFiCapabilities_DisconnectNotSupported) { 1706 ClearWakeOnWiFiTriggersSupported(); 1707 NewWiphyMessage msg; 1708 // Change the NL80211_WOWLAN_TRIG_DISCONNECT flag attribute into the 1709 // NL80211_WOWLAN_TRIG_MAGIC_PKT flag attribute, so that this message 1710 // no longer reports wake on disconnect as a supported capability. 1711 MutableNetlinkPacket packet(kNewWiphyNlMsg, sizeof(kNewWiphyNlMsg)); 1712 struct nlattr* wowlan_trig_disconnect_attr = 1713 reinterpret_cast<struct nlattr*>( 1714 &packet.GetMutablePayload()->GetData()[ 1715 kNewWiphyNlMsg_WowlanTrigDisconnectAttributeOffset]); 1716 wowlan_trig_disconnect_attr->nla_type = NL80211_WOWLAN_TRIG_MAGIC_PKT; 1717 msg.InitFromPacket(&packet, NetlinkMessage::MessageContext()); 1718 ParseWakeOnWiFiCapabilities(msg); 1719 EXPECT_TRUE( 1720 GetWakeOnWiFiTriggersSupported()->find(WakeOnWiFi::kWakeTriggerPattern) != 1721 GetWakeOnWiFiTriggersSupported()->end()); 1722 EXPECT_TRUE( 1723 GetWakeOnWiFiTriggersSupported()->find(WakeOnWiFi::kWakeTriggerSSID) != 1724 GetWakeOnWiFiTriggersSupported()->end()); 1725 // Ensure that ParseWakeOnWiFiCapabilities realizes that wake on disconnect 1726 // is not supported. 1727 EXPECT_FALSE(GetWakeOnWiFiTriggersSupported()->find( 1728 WakeOnWiFi::kWakeTriggerDisconnect) != 1729 GetWakeOnWiFiTriggersSupported()->end()); 1730 } 1731 1732 TEST_F(WakeOnWiFiTestWithMockDispatcher, 1733 ParseWakeOnWiFiCapabilities_SSIDNotSupported) { 1734 ClearWakeOnWiFiTriggersSupported(); 1735 NewWiphyMessage msg; 1736 // Change the NL80211_WOWLAN_TRIG_NET_DETECT flag attribute type to an invalid 1737 // attribute type (0), so that this message no longer reports wake on SSID 1738 // as a supported capability. 1739 MutableNetlinkPacket packet(kNewWiphyNlMsg, sizeof(kNewWiphyNlMsg)); 1740 struct nlattr* wowlan_trig_net_detect_attr = 1741 reinterpret_cast<struct nlattr*>( 1742 &packet.GetMutablePayload()->GetData()[ 1743 kNewWiphyNlMsg_WowlanTrigNetDetectAttributeOffset]); 1744 wowlan_trig_net_detect_attr->nla_type = 0; 1745 msg.InitFromPacket(&packet, NetlinkMessage::MessageContext()); 1746 ParseWakeOnWiFiCapabilities(msg); 1747 EXPECT_TRUE( 1748 GetWakeOnWiFiTriggersSupported()->find(WakeOnWiFi::kWakeTriggerPattern) != 1749 GetWakeOnWiFiTriggersSupported()->end()); 1750 EXPECT_TRUE(GetWakeOnWiFiTriggersSupported()->find( 1751 WakeOnWiFi::kWakeTriggerDisconnect) != 1752 GetWakeOnWiFiTriggersSupported()->end()); 1753 // Ensure that ParseWakeOnWiFiCapabilities realizes that wake on SSID is not 1754 // supported. 1755 EXPECT_FALSE( 1756 GetWakeOnWiFiTriggersSupported()->find(WakeOnWiFi::kWakeTriggerSSID) != 1757 GetWakeOnWiFiTriggersSupported()->end()); 1758 } 1759 1760 TEST_F(WakeOnWiFiTestWithMockDispatcher, 1761 ApplyWakeOnWiFiSettings_WiphyIndexNotReceived) { 1762 ScopedMockLog log; 1763 // ApplyWakeOnWiFiSettings should return immediately if the wifi interface 1764 // index has not been received when the function is called. 1765 SetWiphyIndexReceivedToFalse(); 1766 EXPECT_CALL(netlink_manager_, 1767 SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(0); 1768 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1769 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 1770 HasSubstr("Interface index not yet received"))); 1771 ApplyWakeOnWiFiSettings(); 1772 } 1773 1774 TEST_F(WakeOnWiFiTestWithMockDispatcher, 1775 ApplyWakeOnWiFiSettings_WiphyIndexReceived) { 1776 // Disable wake on WiFi if there are no wake on WiFi triggers registered. 1777 EXPECT_CALL( 1778 netlink_manager_, 1779 SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 1780 SetWakeOnPacketConnMessage::kCommand), 1781 _, _, _)).Times(0); 1782 EXPECT_CALL(netlink_manager_, 1783 SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1); 1784 ApplyWakeOnWiFiSettings(); 1785 1786 // Otherwise, program the NIC. 1787 IPAddress ip_addr("1.1.1.1"); 1788 GetWakeOnPacketConnections()->AddUnique(ip_addr); 1789 GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kWakeTriggerPattern); 1790 EXPECT_FALSE(GetWakeOnPacketConnections()->Empty()); 1791 EXPECT_CALL( 1792 netlink_manager_, 1793 SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 1794 SetWakeOnPacketConnMessage::kCommand), 1795 _, _, _)).Times(1); 1796 EXPECT_CALL(netlink_manager_, 1797 SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(0); 1798 ApplyWakeOnWiFiSettings(); 1799 } 1800 1801 TEST_F(WakeOnWiFiTestWithMockDispatcher, 1802 BeforeSuspendActions_ReportDoneImmediately) { 1803 ScopedMockLog log; 1804 const bool is_connected = true; 1805 const bool start_lease_renewal_timer = true; 1806 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), 1807 GetWakeOnSSIDWhitelist()); 1808 // If no triggers are supported, no triggers will be programmed into the NIC. 1809 ClearWakeOnWiFiTriggersSupported(); 1810 SetSuspendActionsDoneCallback(); 1811 SetInDarkResume(true); 1812 SetLastWakeReason(WakeOnWiFi::kWakeTriggerPattern); 1813 AddResultToLastSSIDResults(); 1814 // Do not report done immediately in dark resume, since we need to program it 1815 // to disable wake on WiFi. 1816 EXPECT_CALL(*this, DoneCallback(_)).Times(0); 1817 BeforeSuspendActions(is_connected, start_lease_renewal_timer, 1818 kTimeToNextLeaseRenewalLong); 1819 EXPECT_FALSE(GetInDarkResume()); 1820 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 1821 EXPECT_TRUE(GetLastSSIDMatchFreqs().empty()); 1822 1823 SetInDarkResume(false); 1824 SetLastWakeReason(WakeOnWiFi::kWakeTriggerPattern); 1825 AddResultToLastSSIDResults(); 1826 // Report done immediately on normal suspend, since wake on WiFi should 1827 // already have been disabled on the NIC on a previous resume. 1828 EXPECT_CALL(*this, DoneCallback(_)).Times(1); 1829 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1830 ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 1831 ScopeLogger::GetInstance()->set_verbose_level(1); 1832 EXPECT_CALL( 1833 log, 1834 Log(_, _, 1835 HasSubstr( 1836 "No need to disable wake on WiFi on NIC in regular suspend"))); 1837 BeforeSuspendActions(is_connected, start_lease_renewal_timer, 1838 kTimeToNextLeaseRenewalLong); 1839 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 1840 EXPECT_TRUE(GetLastSSIDMatchFreqs().empty()); 1841 ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 1842 ScopeLogger::GetInstance()->set_verbose_level(0); 1843 } 1844 1845 TEST_F(WakeOnWiFiTestWithMockDispatcher, 1846 BeforeSuspendActions_FeaturesDisabledOrTriggersUnsupported) { 1847 const bool is_connected = true; 1848 const bool start_lease_renewal_timer = true; 1849 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), 1850 GetWakeOnSSIDWhitelist()); 1851 SetInDarkResume(false); 1852 SetSuspendActionsDoneCallback(); 1853 // No features enabled, so no triggers programmed. 1854 DisableWakeOnWiFiFeatures(); 1855 SetLastWakeReason(WakeOnWiFi::kWakeTriggerPattern); 1856 AddResultToLastSSIDResults(); 1857 EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty()); 1858 EXPECT_CALL(*this, DoneCallback(_)); 1859 BeforeSuspendActions(is_connected, start_lease_renewal_timer, 1860 kTimeToNextLeaseRenewalLong); 1861 EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty()); 1862 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 1863 EXPECT_TRUE(GetLastSSIDMatchFreqs().empty()); 1864 1865 // No triggers supported, so no triggers programmed. 1866 SetSuspendActionsDoneCallback(); 1867 EnableWakeOnWiFiFeaturesPacketDarkConnect(); 1868 GetWakeOnWiFiTriggersSupported()->clear(); 1869 SetLastWakeReason(WakeOnWiFi::kWakeTriggerPattern); 1870 AddResultToLastSSIDResults(); 1871 EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty()); 1872 EXPECT_CALL(*this, DoneCallback(_)); 1873 BeforeSuspendActions(is_connected, start_lease_renewal_timer, 1874 kTimeToNextLeaseRenewalLong); 1875 EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty()); 1876 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 1877 EXPECT_TRUE(GetLastSSIDMatchFreqs().empty()); 1878 1879 // Only wake on packet feature enabled and supported. 1880 EnableWakeOnWiFiFeaturesPacket(); 1881 GetWakeOnWiFiTriggersSupported()->insert(WakeOnWiFi::kWakeTriggerPattern); 1882 GetWakeOnPacketConnections()->AddUnique(IPAddress("1.1.1.1")); 1883 SetLastWakeReason(WakeOnWiFi::kWakeTriggerPattern); 1884 AddResultToLastSSIDResults(); 1885 EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty()); 1886 BeforeSuspendActions(is_connected, start_lease_renewal_timer, 1887 kTimeToNextLeaseRenewalLong); 1888 EXPECT_EQ(GetWakeOnWiFiTriggers()->size(), 1); 1889 EXPECT_TRUE(GetWakeOnWiFiTriggers()->find(WakeOnWiFi::kWakeTriggerPattern) != 1890 GetWakeOnWiFiTriggers()->end()); 1891 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 1892 EXPECT_TRUE(GetLastSSIDMatchFreqs().empty()); 1893 1894 // Only wake on SSID feature supported. 1895 EnableWakeOnWiFiFeaturesDarkConnect(); 1896 GetWakeOnPacketConnections()->Clear(); 1897 GetWakeOnWiFiTriggersSupported()->clear(); 1898 GetWakeOnWiFiTriggersSupported()->insert(WakeOnWiFi::kWakeTriggerDisconnect); 1899 GetWakeOnWiFiTriggersSupported()->insert(WakeOnWiFi::kWakeTriggerSSID); 1900 GetWakeOnWiFiTriggers()->clear(); 1901 SetLastWakeReason(WakeOnWiFi::kWakeTriggerPattern); 1902 AddResultToLastSSIDResults(); 1903 EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty()); 1904 BeforeSuspendActions(is_connected, start_lease_renewal_timer, 1905 kTimeToNextLeaseRenewalLong); 1906 EXPECT_EQ(GetWakeOnWiFiTriggers()->size(), 1); 1907 EXPECT_TRUE( 1908 GetWakeOnWiFiTriggers()->find(WakeOnWiFi::kWakeTriggerDisconnect) != 1909 GetWakeOnWiFiTriggers()->end()); 1910 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 1911 EXPECT_TRUE(GetLastSSIDMatchFreqs().empty()); 1912 } 1913 1914 TEST_F(WakeOnWiFiTestWithMockDispatcher, 1915 BeforeSuspendActions_ConnectedBeforeSuspend) { 1916 const bool is_connected = true; 1917 const bool start_lease_renewal_timer = true; 1918 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), 1919 GetWakeOnSSIDWhitelist()); 1920 SetSuspendActionsDoneCallback(); 1921 EnableWakeOnWiFiFeaturesPacketDarkConnect(); 1922 GetWakeOnPacketConnections()->AddUnique(IPAddress("1.1.1.1")); 1923 1924 SetInDarkResume(true); 1925 GetWakeOnWiFiTriggers()->clear(); 1926 EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty()); 1927 StartWakeToScanTimer(); 1928 StopDHCPLeaseRenewalTimer(); 1929 SetLastWakeReason(WakeOnWiFi::kWakeTriggerPattern); 1930 AddResultToLastSSIDResults(); 1931 EXPECT_TRUE(WakeToScanTimerIsRunning()); 1932 EXPECT_FALSE(DHCPLeaseRenewalTimerIsRunning()); 1933 EXPECT_CALL(*this, DoneCallback(_)).Times(0); 1934 BeforeSuspendActions(is_connected, start_lease_renewal_timer, 1935 kTimeToNextLeaseRenewalLong); 1936 EXPECT_FALSE(GetInDarkResume()); 1937 EXPECT_EQ(GetWakeOnWiFiTriggers()->size(), 2); 1938 EXPECT_TRUE( 1939 GetWakeOnWiFiTriggers()->find(WakeOnWiFi::kWakeTriggerDisconnect) != 1940 GetWakeOnWiFiTriggers()->end()); 1941 EXPECT_TRUE(GetWakeOnWiFiTriggers()->find(WakeOnWiFi::kWakeTriggerPattern) != 1942 GetWakeOnWiFiTriggers()->end()); 1943 EXPECT_TRUE(DHCPLeaseRenewalTimerIsRunning()); 1944 EXPECT_FALSE(WakeToScanTimerIsRunning()); 1945 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 1946 EXPECT_TRUE(GetLastSSIDMatchFreqs().empty()); 1947 } 1948 1949 TEST_F(WakeOnWiFiTestWithMockDispatcher, 1950 BeforeSuspendActions_DisconnectedBeforeSuspend) { 1951 const bool is_connected = false; 1952 const bool start_lease_renewal_timer = true; 1953 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), 1954 GetWakeOnSSIDWhitelist()); 1955 AddSSIDToWhitelist(kSSIDBytes2, sizeof(kSSIDBytes2), 1956 GetWakeOnSSIDWhitelist()); 1957 SetSuspendActionsDoneCallback(); 1958 EnableWakeOnWiFiFeaturesPacketDarkConnect(); 1959 1960 // Do not start wake to scan timer if there are less whitelisted SSIDs (2) 1961 // than net detect SSIDs we support (10). 1962 SetInDarkResume(true); 1963 GetWakeOnWiFiTriggers()->clear(); 1964 StopWakeToScanTimer(); 1965 StartDHCPLeaseRenewalTimer(); 1966 SetWakeOnWiFiMaxSSIDs(10); 1967 SetLastWakeReason(WakeOnWiFi::kWakeTriggerPattern); 1968 AddResultToLastSSIDResults(); 1969 EXPECT_EQ(2, GetWakeOnSSIDWhitelist()->size()); 1970 EXPECT_FALSE(WakeToScanTimerIsRunning()); 1971 EXPECT_TRUE(DHCPLeaseRenewalTimerIsRunning()); 1972 EXPECT_CALL(*this, DoneCallback(_)).Times(0); 1973 BeforeSuspendActions(is_connected, start_lease_renewal_timer, 1974 kTimeToNextLeaseRenewalLong); 1975 EXPECT_EQ(2, GetWakeOnSSIDWhitelist()->size()); 1976 EXPECT_FALSE(GetInDarkResume()); 1977 EXPECT_EQ(GetWakeOnWiFiTriggers()->size(), 1); 1978 EXPECT_TRUE(GetWakeOnWiFiTriggers()->find(WakeOnWiFi::kWakeTriggerSSID) != 1979 GetWakeOnWiFiTriggers()->end()); 1980 EXPECT_FALSE(DHCPLeaseRenewalTimerIsRunning()); 1981 EXPECT_FALSE(WakeToScanTimerIsRunning()); 1982 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 1983 EXPECT_TRUE(GetLastSSIDMatchFreqs().empty()); 1984 1985 // Start wake to scan timer if there are more whitelisted SSIDs (2) than 1986 // net detect SSIDs we support (1). Also, truncate the wake on SSID whitelist 1987 // so that it only contains as many SSIDs as we support (1). 1988 SetInDarkResume(true); 1989 GetWakeOnWiFiTriggers()->clear(); 1990 StopWakeToScanTimer(); 1991 StartDHCPLeaseRenewalTimer(); 1992 SetWakeOnWiFiMaxSSIDs(1); 1993 SetLastWakeReason(WakeOnWiFi::kWakeTriggerPattern); 1994 AddResultToLastSSIDResults(); 1995 EXPECT_EQ(2, GetWakeOnSSIDWhitelist()->size()); 1996 EXPECT_FALSE(WakeToScanTimerIsRunning()); 1997 EXPECT_TRUE(DHCPLeaseRenewalTimerIsRunning()); 1998 EXPECT_CALL(*this, DoneCallback(_)).Times(0); 1999 BeforeSuspendActions(is_connected, start_lease_renewal_timer, 2000 kTimeToNextLeaseRenewalLong); 2001 EXPECT_EQ(1, GetWakeOnSSIDWhitelist()->size()); 2002 EXPECT_FALSE(GetInDarkResume()); 2003 EXPECT_EQ(GetWakeOnWiFiTriggers()->size(), 1); 2004 EXPECT_TRUE(GetWakeOnWiFiTriggers()->find(WakeOnWiFi::kWakeTriggerSSID) != 2005 GetWakeOnWiFiTriggers()->end()); 2006 EXPECT_FALSE(DHCPLeaseRenewalTimerIsRunning()); 2007 EXPECT_TRUE(WakeToScanTimerIsRunning()); 2008 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 2009 EXPECT_TRUE(GetLastSSIDMatchFreqs().empty()); 2010 2011 // Neither add the wake on SSID trigger nor start the wake to scan timer if 2012 // there are no whitelisted SSIDs. 2013 SetInDarkResume(true); 2014 GetWakeOnSSIDWhitelist()->clear(); 2015 StopWakeToScanTimer(); 2016 StartDHCPLeaseRenewalTimer(); 2017 SetWakeOnWiFiMaxSSIDs(10); 2018 SetLastWakeReason(WakeOnWiFi::kWakeTriggerPattern); 2019 AddResultToLastSSIDResults(); 2020 EXPECT_TRUE(GetWakeOnSSIDWhitelist()->empty()); 2021 EXPECT_FALSE(WakeToScanTimerIsRunning()); 2022 EXPECT_TRUE(DHCPLeaseRenewalTimerIsRunning()); 2023 EXPECT_CALL(*this, DoneCallback(_)).Times(0); 2024 BeforeSuspendActions(is_connected, start_lease_renewal_timer, 2025 kTimeToNextLeaseRenewalLong); 2026 EXPECT_TRUE(GetWakeOnSSIDWhitelist()->empty()); 2027 EXPECT_FALSE(GetInDarkResume()); 2028 EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty()); 2029 EXPECT_FALSE(DHCPLeaseRenewalTimerIsRunning()); 2030 EXPECT_FALSE(WakeToScanTimerIsRunning()); 2031 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 2032 EXPECT_TRUE(GetLastSSIDMatchFreqs().empty()); 2033 } 2034 2035 TEST_F(WakeOnWiFiTestWithMockDispatcher, DisableWakeOnWiFi_ClearsTriggers) { 2036 GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kWakeTriggerPattern); 2037 EXPECT_FALSE(GetWakeOnWiFiTriggers()->empty()); 2038 DisableWakeOnWiFi(); 2039 EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty()); 2040 } 2041 2042 TEST_F(WakeOnWiFiTestWithMockDispatcher, ParseWakeOnSSIDResults) { 2043 SetWakeOnPacketConnMessage msg; 2044 NetlinkPacket packet(kWakeReasonSSIDNlMsg, sizeof(kWakeReasonSSIDNlMsg)); 2045 msg.InitFromPacket(&packet, GetWakeupReportMsgContext()); 2046 AttributeListConstRefPtr triggers; 2047 ASSERT_TRUE(msg.const_attributes()->ConstGetNestedAttributeList( 2048 NL80211_ATTR_WOWLAN_TRIGGERS, &triggers)); 2049 AttributeListConstRefPtr results_list; 2050 ASSERT_TRUE(triggers->ConstGetNestedAttributeList( 2051 NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS, &results_list)); 2052 WiFi::FreqSet freqs = ParseWakeOnSSIDResults(results_list); 2053 EXPECT_EQ(arraysize(kSSID1FreqMatches), freqs.size()); 2054 for (uint32_t freq : kSSID1FreqMatches) { 2055 EXPECT_TRUE(freqs.find(freq) != freqs.end()); 2056 } 2057 } 2058 2059 TEST_F(WakeOnWiFiTestWithMockDispatcher, OnScanStarted_NotInDarkResume) { 2060 SetInDarkResume(false); 2061 EXPECT_CALL(metrics_, NotifyScanStartedInDarkResume(_)).Times(0); 2062 OnScanStarted(false); 2063 } 2064 2065 TEST_F(WakeOnWiFiTestWithMockDispatcher, OnScanStarted_IgnoredWakeReasons) { 2066 // Do not log metrics if we entered dark resume because of wake on SSID or 2067 // wake on disconnect. 2068 SetInDarkResume(true); 2069 SetLastWakeReason(WakeOnWiFi::kWakeTriggerSSID); 2070 EXPECT_CALL(metrics_, NotifyScanStartedInDarkResume(_)).Times(0); 2071 OnScanStarted(false); 2072 2073 SetLastWakeReason(WakeOnWiFi::kWakeTriggerDisconnect); 2074 EXPECT_CALL(metrics_, NotifyScanStartedInDarkResume(_)).Times(0); 2075 OnScanStarted(false); 2076 } 2077 2078 TEST_F(WakeOnWiFiTestWithMockDispatcher, OnScanStarted_LogMetrics) { 2079 // Log metrics if we entered dark resume because of wake on pattern or an 2080 // unsupported wake reason. 2081 SetInDarkResume(true); 2082 SetLastWakeReason(WakeOnWiFi::kWakeTriggerUnsupported); 2083 EXPECT_CALL(metrics_, NotifyScanStartedInDarkResume(_)); 2084 OnScanStarted(false); 2085 2086 SetLastWakeReason(WakeOnWiFi::kWakeTriggerPattern); 2087 EXPECT_CALL(metrics_, NotifyScanStartedInDarkResume(_)); 2088 OnScanStarted(false); 2089 2090 // Log error if an active scan is launched. 2091 ScopedMockLog log; 2092 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 2093 EXPECT_CALL(log, 2094 Log(logging::LOG_ERROR, _, 2095 HasSubstr("Unexpected active scan launched in dark resume"))); 2096 EXPECT_CALL(metrics_, NotifyScanStartedInDarkResume(_)); 2097 OnScanStarted(true); 2098 } 2099 2100 TEST_F(WakeOnWiFiTestWithDispatcher, InitiateScanInDarkResume) { 2101 WiFi::FreqSet freqs; 2102 2103 // If we are not scanning on specific frequencies, do not enable the retry 2104 // mechanism. 2105 EXPECT_EQ(0, GetDarkResumeScanRetriesLeft()); 2106 EXPECT_CALL(*this, InitiateScanCallback(freqs)); 2107 InitiateScanInDarkResume(freqs); 2108 EXPECT_EQ(0, GetDarkResumeScanRetriesLeft()); 2109 2110 // Otherwise, start channel specific passive scan with retries. 2111 freqs.insert(1); 2112 EXPECT_LE(freqs.size(), WakeOnWiFi::kMaxFreqsForDarkResumeScanRetries); 2113 EXPECT_EQ(0, GetDarkResumeScanRetriesLeft()); 2114 EXPECT_CALL(*this, InitiateScanCallback(freqs)); 2115 InitiateScanInDarkResume(freqs); 2116 EXPECT_EQ(WakeOnWiFi::kMaxDarkResumeScanRetries, 2117 GetDarkResumeScanRetriesLeft()); 2118 } 2119 2120 TEST_F(WakeOnWiFiTestWithMockDispatcher, AddRemoveWakeOnPacketConnection) { 2121 const string bad_ip_string("1.1"); 2122 const string ip_string1("192.168.0.19"); 2123 const string ip_string2("192.168.0.55"); 2124 const string ip_string3("192.168.0.74"); 2125 IPAddress ip_addr1(ip_string1); 2126 IPAddress ip_addr2(ip_string2); 2127 IPAddress ip_addr3(ip_string3); 2128 Error e; 2129 2130 // Add and remove operations will fail if we provide an invalid IP address 2131 // string. 2132 EnableWakeOnWiFiFeaturesPacket(); 2133 AddWakeOnPacketConnection(bad_ip_string, &e); 2134 EXPECT_EQ(e.type(), Error::kInvalidArguments); 2135 EXPECT_STREQ(e.message().c_str(), 2136 ("Invalid ip_address " + bad_ip_string).c_str()); 2137 RemoveWakeOnPacketConnection(bad_ip_string, &e); 2138 EXPECT_EQ(e.type(), Error::kInvalidArguments); 2139 EXPECT_STREQ(e.message().c_str(), 2140 ("Invalid ip_address " + bad_ip_string).c_str()); 2141 2142 // Add and remove operations will fail if WiFi device does not support 2143 // pattern matching functionality, even if the feature is enabled. 2144 EnableWakeOnWiFiFeaturesPacket(); 2145 ClearWakeOnWiFiTriggersSupported(); 2146 AddWakeOnPacketConnection(ip_string1, &e); 2147 EXPECT_EQ(e.type(), Error::kNotSupported); 2148 EXPECT_STREQ(e.message().c_str(), 2149 "Wake on IP address patterns not supported by this WiFi device"); 2150 RemoveAllWakeOnPacketConnections(&e); 2151 EXPECT_EQ(e.type(), Error::kNotSupported); 2152 EXPECT_STREQ(e.message().c_str(), 2153 "Wake on IP address patterns not supported by this WiFi device"); 2154 RemoveWakeOnPacketConnection(ip_string2, &e); 2155 EXPECT_EQ(e.type(), Error::kNotSupported); 2156 EXPECT_STREQ(e.message().c_str(), 2157 "Wake on IP address patterns not supported by this WiFi device"); 2158 2159 // Add operation will fail if pattern matching is supported but the max number 2160 // of IP address patterns have already been registered. 2161 EnableWakeOnWiFiFeaturesPacketDarkConnect(); 2162 GetWakeOnWiFiTriggersSupported()->insert(WakeOnWiFi::kWakeTriggerPattern); 2163 SetWakeOnWiFiMaxPatterns(1); 2164 GetWakeOnPacketConnections()->AddUnique(IPAddress(ip_string1)); 2165 AddWakeOnPacketConnection(ip_string2, &e); 2166 EXPECT_EQ(e.type(), Error::kOperationFailed); 2167 EXPECT_STREQ(e.message().c_str(), 2168 "Max number of IP address patterns already registered"); 2169 2170 // Add and remove operations will still execute even when the wake on packet 2171 // feature has been disabled. 2172 GetWakeOnPacketConnections()->Clear(); 2173 SetWakeOnWiFiMaxPatterns(50); 2174 DisableWakeOnWiFiFeatures(); 2175 GetWakeOnWiFiTriggersSupported()->insert(WakeOnWiFi::kWakeTriggerPattern); 2176 AddWakeOnPacketConnection(ip_string1, &e); 2177 EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 1); 2178 EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 2179 AddWakeOnPacketConnection(ip_string2, &e); 2180 EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2); 2181 EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 2182 RemoveWakeOnPacketConnection(ip_string1, &e); 2183 EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 1); 2184 RemoveAllWakeOnPacketConnections(&e); 2185 EXPECT_TRUE(GetWakeOnPacketConnections()->Empty()); 2186 2187 // Normal functioning of add/remove operations when wake on WiFi features 2188 // are enabled, the NIC supports pattern matching, and the max number 2189 // of patterns have not been registered yet. 2190 EnableWakeOnWiFiFeaturesPacketDarkConnect(); 2191 GetWakeOnPacketConnections()->Clear(); 2192 EXPECT_TRUE(GetWakeOnPacketConnections()->Empty()); 2193 AddWakeOnPacketConnection(ip_string1, &e); 2194 EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 1); 2195 EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 2196 EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 2197 EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 2198 2199 AddWakeOnPacketConnection(ip_string2, &e); 2200 EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2); 2201 EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 2202 EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 2203 EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 2204 2205 AddWakeOnPacketConnection(ip_string3, &e); 2206 EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 3); 2207 EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 2208 EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 2209 EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 2210 2211 RemoveWakeOnPacketConnection(ip_string2, &e); 2212 EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2); 2213 EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 2214 EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 2215 EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 2216 2217 // Remove fails if no such address is registered. 2218 RemoveWakeOnPacketConnection(ip_string2, &e); 2219 EXPECT_EQ(e.type(), Error::kNotFound); 2220 EXPECT_STREQ(e.message().c_str(), 2221 "No such IP address match registered to wake device"); 2222 EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2); 2223 2224 RemoveWakeOnPacketConnection(ip_string1, &e); 2225 EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 1); 2226 EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 2227 EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 2228 EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 2229 2230 AddWakeOnPacketConnection(ip_string2, &e); 2231 EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2); 2232 EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 2233 EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 2234 EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 2235 2236 RemoveAllWakeOnPacketConnections(&e); 2237 EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 0); 2238 EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr1)); 2239 EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2)); 2240 EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr3)); 2241 } 2242 2243 TEST_F(WakeOnWiFiTestWithDispatcher, OnBeforeSuspend_ClearsEventHistory) { 2244 const int kNumEvents = WakeOnWiFi::kMaxDarkResumesPerPeriodShort - 1; 2245 vector<ByteString> whitelist; 2246 for (int i = 0; i < kNumEvents; ++i) { 2247 GetDarkResumeHistory()->RecordEvent(); 2248 } 2249 EXPECT_EQ(kNumEvents, GetDarkResumeHistory()->Size()); 2250 OnBeforeSuspend(true, whitelist, true, 0); 2251 EXPECT_TRUE(GetDarkResumeHistory()->Empty()); 2252 } 2253 2254 TEST_F(WakeOnWiFiTestWithDispatcher, OnBeforeSuspend_SetsWakeOnSSIDWhitelist) { 2255 vector<ByteString> whitelist; 2256 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 2257 EXPECT_TRUE(GetWakeOnSSIDWhitelist()->empty()); 2258 OnBeforeSuspend(true, whitelist, true, 0); 2259 EXPECT_FALSE(GetWakeOnSSIDWhitelist()->empty()); 2260 EXPECT_EQ(1, GetWakeOnSSIDWhitelist()->size()); 2261 } 2262 2263 TEST_F(WakeOnWiFiTestWithDispatcher, OnBeforeSuspend_SetsDoneCallback) { 2264 vector<ByteString> whitelist; 2265 EXPECT_TRUE(SuspendActionsCallbackIsNull()); 2266 OnBeforeSuspend(true, whitelist, true, 0); 2267 EXPECT_FALSE(SuspendActionsCallbackIsNull()); 2268 } 2269 2270 TEST_F(WakeOnWiFiTestWithMockDispatcher, OnBeforeSuspend_DHCPLeaseRenewal) { 2271 bool is_connected; 2272 bool have_dhcp_lease; 2273 vector<ByteString> whitelist; 2274 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 2275 // If we are connected the time to next lease renewal is short enough, we will 2276 // initiate DHCP lease renewal immediately. 2277 is_connected = true; 2278 have_dhcp_lease = true; 2279 EXPECT_CALL(*this, RenewDHCPLeaseCallback()).Times(1); 2280 EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(1); 2281 OnBeforeSuspend(is_connected, whitelist, have_dhcp_lease, 2282 kTimeToNextLeaseRenewalShort); 2283 2284 // No immediate DHCP lease renewal because we are not connected. 2285 is_connected = false; 2286 have_dhcp_lease = true; 2287 EXPECT_CALL(*this, RenewDHCPLeaseCallback()).Times(0); 2288 EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(1); 2289 OnBeforeSuspend(is_connected, whitelist, have_dhcp_lease, 2290 kTimeToNextLeaseRenewalShort); 2291 2292 // No immediate DHCP lease renewal because the time to the next lease renewal 2293 // is longer than the threshold. 2294 is_connected = true; 2295 have_dhcp_lease = true; 2296 EXPECT_CALL(*this, RenewDHCPLeaseCallback()).Times(0); 2297 EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(1); 2298 OnBeforeSuspend(is_connected, whitelist, have_dhcp_lease, 2299 kTimeToNextLeaseRenewalLong); 2300 2301 // No immediate DHCP lease renewal because we do not have a DHCP lease that 2302 // needs to be renewed. 2303 is_connected = true; 2304 have_dhcp_lease = false; 2305 EXPECT_CALL(*this, RenewDHCPLeaseCallback()).Times(0); 2306 EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(1); 2307 OnBeforeSuspend(is_connected, whitelist, have_dhcp_lease, 2308 kTimeToNextLeaseRenewalLong); 2309 } 2310 2311 TEST_F(WakeOnWiFiTestWithDispatcher, OnDarkResume_ResetsDarkResumeScanRetries) { 2312 const bool is_connected = true; 2313 vector<ByteString> whitelist; 2314 SetDarkResumeScanRetriesLeft(3); 2315 EXPECT_EQ(3, GetDarkResumeScanRetriesLeft()); 2316 OnDarkResume(is_connected, whitelist); 2317 EXPECT_EQ(0, GetDarkResumeScanRetriesLeft()); 2318 } 2319 2320 TEST_F(WakeOnWiFiTestWithDispatcher, OnDarkResume_SetsWakeOnSSIDWhitelist) { 2321 const bool is_connected = true; 2322 vector<ByteString> whitelist; 2323 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 2324 EXPECT_TRUE(GetWakeOnSSIDWhitelist()->empty()); 2325 OnDarkResume(is_connected, whitelist); 2326 EXPECT_FALSE(GetWakeOnSSIDWhitelist()->empty()); 2327 EXPECT_EQ(1, GetWakeOnSSIDWhitelist()->size()); 2328 } 2329 2330 TEST_F(WakeOnWiFiTestWithDispatcher, 2331 OnDarkResume_WakeReasonUnsupported_Connected_Timeout) { 2332 // Test that correct actions are taken if we enter OnDarkResume on an 2333 // unsupported wake trigger while connected, then timeout on suspend actions 2334 // before suspending again. 2335 const bool is_connected = true; 2336 SetLastWakeReason(WakeOnWiFi::kWakeTriggerUnsupported); 2337 vector<ByteString> whitelist; 2338 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 2339 InitStateForDarkResume(); 2340 EXPECT_TRUE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2341 // Renew DHCP lease if we are connected in dark resume. 2342 EXPECT_CALL(*this, RenewDHCPLeaseCallback()); 2343 EXPECT_CALL(metrics_, NotifyWakeOnWiFiOnDarkResume( 2344 WakeOnWiFi::kWakeTriggerUnsupported)); 2345 OnDarkResume(is_connected, whitelist); 2346 EXPECT_FALSE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2347 // Trigger timeout callback. 2348 // Since we timeout, we are disconnected before suspend. 2349 StartDHCPLeaseRenewalTimer(); 2350 SetExpectationsDisconnectedBeforeSuspend(); 2351 dispatcher_.DispatchPendingEvents(); 2352 EXPECT_FALSE(DHCPLeaseRenewalTimerIsRunning()); 2353 VerifyStateDisconnectedBeforeSuspend(); 2354 } 2355 2356 TEST_F(WakeOnWiFiTestWithDispatcher, 2357 OnDarkResume_WakeReasonUnsupported_Connected_NoAutoconnectableServices) { 2358 // Test that correct actions are taken if we enter OnDarkResume on an 2359 // unsupported wake trigger while connected, then go back to suspend because 2360 // we could not find any services available for autoconnect. 2361 const bool is_connected = true; 2362 SetLastWakeReason(WakeOnWiFi::kWakeTriggerUnsupported); 2363 vector<ByteString> whitelist; 2364 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 2365 InitStateForDarkResume(); 2366 EXPECT_TRUE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2367 // Renew DHCP lease if we are connected in dark resume. 2368 EXPECT_CALL(*this, RenewDHCPLeaseCallback()); 2369 EXPECT_CALL(metrics_, NotifyWakeOnWiFiOnDarkResume( 2370 WakeOnWiFi::kWakeTriggerUnsupported)); 2371 OnDarkResume(is_connected, whitelist); 2372 EXPECT_FALSE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2373 2374 StartDHCPLeaseRenewalTimer(); 2375 SetExpectationsDisconnectedBeforeSuspend(); 2376 OnNoAutoConnectableServicesAfterScan(whitelist); 2377 EXPECT_FALSE(DHCPLeaseRenewalTimerIsRunning()); 2378 VerifyStateDisconnectedBeforeSuspend(); 2379 } 2380 2381 TEST_F(WakeOnWiFiTestWithDispatcher, 2382 OnDarkResume_WakeReasonUnsupported_Connected_LeaseObtained) { 2383 // Test that correct actions are taken if we enter OnDarkResume on an 2384 // unsupported wake trigger while connected, then connect and obtain a DHCP 2385 // lease before suspending again. 2386 const bool is_connected = true; 2387 const bool have_dhcp_lease = true; 2388 const uint32_t time_to_next_lease_renewal = 10; 2389 SetLastWakeReason(WakeOnWiFi::kWakeTriggerUnsupported); 2390 vector<ByteString> whitelist; 2391 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 2392 InitStateForDarkResume(); 2393 EXPECT_TRUE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2394 // Renew DHCP lease if we are connected in dark resume. 2395 EXPECT_CALL(*this, RenewDHCPLeaseCallback()); 2396 EXPECT_CALL(metrics_, NotifyWakeOnWiFiOnDarkResume( 2397 WakeOnWiFi::kWakeTriggerUnsupported)); 2398 OnDarkResume(is_connected, whitelist); 2399 EXPECT_FALSE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2400 // Lease obtained. 2401 // Since a lease is obtained, we are connected before suspend. 2402 StopDHCPLeaseRenewalTimer(); 2403 StartWakeToScanTimer(); 2404 SetExpectationsConnectedBeforeSuspend(); 2405 OnConnectedAndReachable(have_dhcp_lease, time_to_next_lease_renewal); 2406 EXPECT_TRUE(DHCPLeaseRenewalTimerIsRunning()); 2407 EXPECT_FALSE(WakeToScanTimerIsRunning()); 2408 VerifyStateConnectedBeforeSuspend(); 2409 } 2410 2411 TEST_F(WakeOnWiFiTestWithDispatcher, 2412 OnDarkResume_WakeReasonUnsupported_NotConnected_Timeout) { 2413 // Test that correct actions are taken if we enter OnDarkResume on an 2414 // unsupported wake trigger while not connected, then timeout on suspend 2415 // actions before suspending again. 2416 const bool is_connected = false; 2417 SetLastWakeReason(WakeOnWiFi::kWakeTriggerUnsupported); 2418 vector<ByteString> whitelist; 2419 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 2420 InitStateForDarkResume(); 2421 EXPECT_TRUE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2422 // Initiate scan if we are not connected in dark resume. 2423 EXPECT_CALL(*this, RemoveSupplicantNetworksCallback()); 2424 EXPECT_CALL(metrics_, NotifyDarkResumeInitiateScan()); 2425 EXPECT_CALL(*this, InitiateScanCallback(_)); 2426 EXPECT_CALL(metrics_, NotifyWakeOnWiFiOnDarkResume( 2427 WakeOnWiFi::kWakeTriggerUnsupported)); 2428 OnDarkResume(is_connected, whitelist); 2429 EXPECT_FALSE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2430 // Trigger timeout callback. 2431 // Since we timeout, we are disconnected before suspend. 2432 StartDHCPLeaseRenewalTimer(); 2433 SetExpectationsDisconnectedBeforeSuspend(); 2434 dispatcher_.DispatchPendingEvents(); 2435 EXPECT_FALSE(DHCPLeaseRenewalTimerIsRunning()); 2436 VerifyStateDisconnectedBeforeSuspend(); 2437 } 2438 2439 TEST_F( 2440 WakeOnWiFiTestWithDispatcher, 2441 OnDarkResume_WakeReasonUnsupported_NotConnected_NoAutoconnectableServices) { 2442 // Test that correct actions are taken if we enter OnDarkResume on an 2443 // unsupported wake trigger while not connected, then go back to suspend 2444 // because we could not find any services available for autoconnect. 2445 const bool is_connected = false; 2446 SetLastWakeReason(WakeOnWiFi::kWakeTriggerUnsupported); 2447 vector<ByteString> whitelist; 2448 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 2449 InitStateForDarkResume(); 2450 EXPECT_TRUE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2451 // Initiate scan if we are not connected in dark resume. 2452 EXPECT_CALL(*this, RemoveSupplicantNetworksCallback()); 2453 EXPECT_CALL(metrics_, NotifyDarkResumeInitiateScan()); 2454 EXPECT_CALL(*this, InitiateScanCallback(_)); 2455 EXPECT_CALL(metrics_, NotifyWakeOnWiFiOnDarkResume( 2456 WakeOnWiFi::kWakeTriggerUnsupported)); 2457 OnDarkResume(is_connected, whitelist); 2458 EXPECT_FALSE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2459 2460 StartDHCPLeaseRenewalTimer(); 2461 SetExpectationsDisconnectedBeforeSuspend(); 2462 OnNoAutoConnectableServicesAfterScan(whitelist); 2463 EXPECT_FALSE(DHCPLeaseRenewalTimerIsRunning()); 2464 VerifyStateDisconnectedBeforeSuspend(); 2465 } 2466 2467 TEST_F(WakeOnWiFiTestWithDispatcher, 2468 OnDarkResume_WakeReasonUnsupported_NotConnected_LeaseObtained) { 2469 // Test that correct actions are taken if we enter OnDarkResume on an 2470 // unsupported wake trigger while connected, then connect and obtain a DHCP 2471 // lease before suspending again. 2472 const bool is_connected = false; 2473 const bool have_dhcp_lease = true; 2474 const uint32_t time_to_next_lease_renewal = 10; 2475 SetLastWakeReason(WakeOnWiFi::kWakeTriggerUnsupported); 2476 vector<ByteString> whitelist; 2477 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 2478 InitStateForDarkResume(); 2479 EXPECT_TRUE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2480 // Initiate scan if we are not connected in dark resume. 2481 EXPECT_CALL(*this, RemoveSupplicantNetworksCallback()); 2482 EXPECT_CALL(metrics_, NotifyDarkResumeInitiateScan()); 2483 EXPECT_CALL(*this, InitiateScanCallback(_)); 2484 EXPECT_CALL(metrics_, NotifyWakeOnWiFiOnDarkResume( 2485 WakeOnWiFi::kWakeTriggerUnsupported)); 2486 OnDarkResume(is_connected, whitelist); 2487 EXPECT_FALSE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2488 // Lease obtained. 2489 // Since a lease is obtained, we are connected before suspend. 2490 StopDHCPLeaseRenewalTimer(); 2491 StartWakeToScanTimer(); 2492 SetExpectationsConnectedBeforeSuspend(); 2493 OnConnectedAndReachable(have_dhcp_lease, time_to_next_lease_renewal); 2494 EXPECT_TRUE(DHCPLeaseRenewalTimerIsRunning()); 2495 EXPECT_FALSE(WakeToScanTimerIsRunning()); 2496 VerifyStateConnectedBeforeSuspend(); 2497 } 2498 2499 TEST_F(WakeOnWiFiTestWithDispatcher, OnDarkResume_WakeReasonPattern) { 2500 // Test that correct actions are taken if we enter dark resume because the 2501 // system woke on a packet pattern match. We assume that we wake connected and 2502 // and go back to sleep connected if we wake on pattern. 2503 const bool is_connected = true; 2504 SetLastWakeReason(WakeOnWiFi::kWakeTriggerPattern); 2505 vector<ByteString> whitelist; 2506 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 2507 2508 InitStateForDarkResume(); 2509 EXPECT_TRUE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2510 EXPECT_CALL(metrics_, 2511 NotifyWakeOnWiFiOnDarkResume(WakeOnWiFi::kWakeTriggerPattern)); 2512 OnDarkResume(is_connected, whitelist); 2513 EXPECT_FALSE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2514 2515 StartWakeToScanTimer(); 2516 SetExpectationsConnectedBeforeSuspend(); 2517 dispatcher_.DispatchPendingEvents(); 2518 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 2519 EXPECT_FALSE(WakeToScanTimerIsRunning()); 2520 VerifyStateConnectedBeforeSuspend(); 2521 } 2522 2523 TEST_F(WakeOnWiFiTestWithDispatcher, 2524 OnDarkResume_WakeReasonDisconnect_NoAutoconnectableServices) { 2525 // Test that correct actions are taken if we enter dark resume because the 2526 // system woke on a disconnect, and go back to suspend because we could not 2527 // find any networks available for autoconnect. 2528 const bool is_connected = false; 2529 SetLastWakeReason(WakeOnWiFi::kWakeTriggerDisconnect); 2530 vector<ByteString> whitelist; 2531 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 2532 2533 InitStateForDarkResume(); 2534 EXPECT_TRUE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2535 EXPECT_CALL(*this, RemoveSupplicantNetworksCallback()); 2536 EXPECT_CALL(metrics_, NotifyDarkResumeInitiateScan()); 2537 EXPECT_CALL(*this, InitiateScanCallback(_)); 2538 EXPECT_CALL(metrics_, 2539 NotifyWakeOnWiFiOnDarkResume(WakeOnWiFi::kWakeTriggerDisconnect)); 2540 OnDarkResume(is_connected, whitelist); 2541 EXPECT_FALSE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2542 2543 StartDHCPLeaseRenewalTimer(); 2544 SetExpectationsDisconnectedBeforeSuspend(); 2545 OnNoAutoConnectableServicesAfterScan(whitelist); 2546 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 2547 EXPECT_FALSE(DHCPLeaseRenewalTimerIsRunning()); 2548 VerifyStateDisconnectedBeforeSuspend(); 2549 } 2550 2551 TEST_F(WakeOnWiFiTestWithDispatcher, 2552 OnDarkResume_WakeReasonDisconnect_Timeout) { 2553 // Test that correct actions are taken if we enter dark resume because the 2554 // system woke on a disconnect, then timeout on suspend actions before 2555 // suspending again. 2556 const bool is_connected = false; 2557 SetLastWakeReason(WakeOnWiFi::kWakeTriggerDisconnect); 2558 vector<ByteString> whitelist; 2559 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 2560 2561 InitStateForDarkResume(); 2562 EXPECT_TRUE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2563 EXPECT_CALL(*this, RemoveSupplicantNetworksCallback()); 2564 EXPECT_CALL(metrics_, NotifyDarkResumeInitiateScan()); 2565 EXPECT_CALL(*this, InitiateScanCallback(_)); 2566 EXPECT_CALL(metrics_, 2567 NotifyWakeOnWiFiOnDarkResume(WakeOnWiFi::kWakeTriggerDisconnect)); 2568 OnDarkResume(is_connected, whitelist); 2569 EXPECT_FALSE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2570 2571 StartDHCPLeaseRenewalTimer(); 2572 SetExpectationsDisconnectedBeforeSuspend(); 2573 dispatcher_.DispatchPendingEvents(); 2574 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 2575 EXPECT_FALSE(DHCPLeaseRenewalTimerIsRunning()); 2576 VerifyStateDisconnectedBeforeSuspend(); 2577 } 2578 2579 TEST_F(WakeOnWiFiTestWithDispatcher, 2580 OnDarkResume_WakeReasonDisconnect_LeaseObtained) { 2581 // Test that correct actions are taken if we enter dark resume because the 2582 // system woke on a disconnect, then connect and obtain a DHCP lease before 2583 // suspending again. 2584 const bool is_connected = false; 2585 const bool have_dhcp_lease = true; 2586 const uint32_t time_to_next_lease_renewal = 10; 2587 SetLastWakeReason(WakeOnWiFi::kWakeTriggerDisconnect); 2588 vector<ByteString> whitelist; 2589 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 2590 2591 InitStateForDarkResume(); 2592 EXPECT_TRUE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2593 EXPECT_CALL(*this, RemoveSupplicantNetworksCallback()); 2594 EXPECT_CALL(metrics_, NotifyDarkResumeInitiateScan()); 2595 EXPECT_CALL(*this, InitiateScanCallback(_)); 2596 EXPECT_CALL(metrics_, 2597 NotifyWakeOnWiFiOnDarkResume(WakeOnWiFi::kWakeTriggerDisconnect)); 2598 OnDarkResume(is_connected, whitelist); 2599 EXPECT_FALSE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2600 2601 StopDHCPLeaseRenewalTimer(); 2602 StartWakeToScanTimer(); 2603 SetExpectationsConnectedBeforeSuspend(); 2604 OnConnectedAndReachable(have_dhcp_lease, time_to_next_lease_renewal); 2605 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 2606 EXPECT_TRUE(DHCPLeaseRenewalTimerIsRunning()); 2607 EXPECT_FALSE(WakeToScanTimerIsRunning()); 2608 VerifyStateConnectedBeforeSuspend(); 2609 } 2610 2611 TEST_F(WakeOnWiFiTestWithDispatcher, 2612 OnDarkResume_WakeReasonSSID_NoAutoconnectableServices) { 2613 // Test that correct actions are taken if we enter dark resume because the 2614 // system woke on SSID, and go back to suspend because we could not find any 2615 // networks available for autoconnect. 2616 const bool is_connected = false; 2617 SetLastWakeReason(WakeOnWiFi::kWakeTriggerSSID); 2618 vector<ByteString> whitelist; 2619 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 2620 2621 InitStateForDarkResume(); 2622 EXPECT_TRUE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2623 EXPECT_CALL(*this, RemoveSupplicantNetworksCallback()); 2624 EXPECT_CALL(metrics_, NotifyDarkResumeInitiateScan()); 2625 EXPECT_CALL(*this, InitiateScanCallback(_)); 2626 EXPECT_CALL(metrics_, 2627 NotifyWakeOnWiFiOnDarkResume(WakeOnWiFi::kWakeTriggerSSID)); 2628 OnDarkResume(is_connected, whitelist); 2629 EXPECT_FALSE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2630 2631 StartDHCPLeaseRenewalTimer(); 2632 SetExpectationsDisconnectedBeforeSuspend(); 2633 OnNoAutoConnectableServicesAfterScan(whitelist); 2634 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 2635 EXPECT_FALSE(DHCPLeaseRenewalTimerIsRunning()); 2636 VerifyStateDisconnectedBeforeSuspend(); 2637 } 2638 2639 TEST_F(WakeOnWiFiTestWithDispatcher, OnDarkResume_WakeReasonSSID_Timeout) { 2640 // Test that correct actions are taken if we enter dark resume because the 2641 // system woke on SSID, then timeout on suspend actions before suspending 2642 // again. 2643 const bool is_connected = false; 2644 SetLastWakeReason(WakeOnWiFi::kWakeTriggerSSID); 2645 vector<ByteString> whitelist; 2646 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 2647 2648 InitStateForDarkResume(); 2649 EXPECT_TRUE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2650 EXPECT_CALL(*this, RemoveSupplicantNetworksCallback()); 2651 EXPECT_CALL(metrics_, NotifyDarkResumeInitiateScan()); 2652 EXPECT_CALL(*this, InitiateScanCallback(GetLastSSIDMatchFreqs())); 2653 EXPECT_CALL(metrics_, 2654 NotifyWakeOnWiFiOnDarkResume(WakeOnWiFi::kWakeTriggerSSID)); 2655 OnDarkResume(is_connected, whitelist); 2656 EXPECT_FALSE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2657 2658 StartDHCPLeaseRenewalTimer(); 2659 SetExpectationsDisconnectedBeforeSuspend(); 2660 dispatcher_.DispatchPendingEvents(); 2661 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 2662 EXPECT_FALSE(DHCPLeaseRenewalTimerIsRunning()); 2663 VerifyStateDisconnectedBeforeSuspend(); 2664 } 2665 2666 TEST_F(WakeOnWiFiTestWithDispatcher, 2667 OnDarkResume_WakeReasonSSID_LeaseObtained) { 2668 // Test that correct actions are taken if we enter dark resume because the 2669 // system woke on SSID, then connect and obtain a DHCP lease before suspending 2670 // again. 2671 const bool is_connected = false; 2672 const bool have_dhcp_lease = true; 2673 const uint32_t time_to_next_lease_renewal = 10; 2674 SetLastWakeReason(WakeOnWiFi::kWakeTriggerSSID); 2675 vector<ByteString> whitelist; 2676 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 2677 2678 InitStateForDarkResume(); 2679 EXPECT_TRUE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2680 EXPECT_CALL(*this, RemoveSupplicantNetworksCallback()); 2681 EXPECT_CALL(metrics_, NotifyDarkResumeInitiateScan()); 2682 EXPECT_CALL(*this, InitiateScanCallback(GetLastSSIDMatchFreqs())); 2683 EXPECT_CALL(metrics_, 2684 NotifyWakeOnWiFiOnDarkResume(WakeOnWiFi::kWakeTriggerSSID)); 2685 OnDarkResume(is_connected, whitelist); 2686 EXPECT_FALSE(DarkResumeActionsTimeOutCallbackIsCancelled()); 2687 2688 StopDHCPLeaseRenewalTimer(); 2689 StartWakeToScanTimer(); 2690 SetExpectationsConnectedBeforeSuspend(); 2691 OnConnectedAndReachable(have_dhcp_lease, time_to_next_lease_renewal); 2692 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 2693 EXPECT_TRUE(DHCPLeaseRenewalTimerIsRunning()); 2694 EXPECT_FALSE(WakeToScanTimerIsRunning()); 2695 VerifyStateConnectedBeforeSuspend(); 2696 } 2697 2698 TEST_F(WakeOnWiFiTestWithDispatcher, OnDarkResume_Connected_DoNotRecordEvent) { 2699 const bool is_connected = true; 2700 vector<ByteString> whitelist; 2701 EXPECT_TRUE(GetDarkResumeHistory()->Empty()); 2702 OnDarkResume(is_connected, whitelist); 2703 EXPECT_TRUE(GetDarkResumeHistory()->Empty()); 2704 } 2705 2706 TEST_F(WakeOnWiFiTestWithDispatcher, OnDarkResume_NotConnected_RecordEvent) { 2707 const bool is_connected = false; 2708 vector<ByteString> whitelist; 2709 EXPECT_TRUE(GetDarkResumeHistory()->Empty()); 2710 OnDarkResume(is_connected, whitelist); 2711 EXPECT_EQ(1, GetDarkResumeHistory()->Size()); 2712 } 2713 2714 TEST_F(WakeOnWiFiTestWithDispatcher, 2715 OnDarkResume_NotConnected_MaxDarkResumes_ShortPeriod) { 2716 // These 3 dark resume timings are within a 1 minute interval, so as to 2717 // trigger the short throttling threshold (3 in 1 minute). 2718 const int kTimeSeconds[] = {10, 20, 30}; 2719 CHECK_EQ(static_cast<const unsigned int>( 2720 WakeOnWiFi::kMaxDarkResumesPerPeriodShort), 2721 arraysize(kTimeSeconds)); 2722 vector<ByteString> whitelist; 2723 2724 // This test assumes that throttling takes place when 3 dark resumes have 2725 // been triggered in the last 1 minute. 2726 EXPECT_EQ(3, WakeOnWiFi::kMaxDarkResumesPerPeriodShort); 2727 EXPECT_EQ(1, WakeOnWiFi::kDarkResumeFrequencySamplingPeriodShortMinutes); 2728 2729 // Wake on SSID dark resumes should be recorded in the dark resume history. 2730 const bool is_connected = false; 2731 SetLastWakeReason(WakeOnWiFi::kWakeTriggerSSID); 2732 EXPECT_TRUE(GetDarkResumeHistory()->Empty()); 2733 2734 // First two dark resumes take place at 10 and 20 seconds respectively. This 2735 // is still within the throttling threshold. 2736 for (int i = 0; i < WakeOnWiFi::kMaxDarkResumesPerPeriodShort - 1; ++i) { 2737 EXPECT_CALL(metrics_, NotifyWakeOnWiFiThrottled()).Times(0); 2738 EXPECT_CALL(time_, GetNow()) 2739 .WillRepeatedly(Return(GetTimestampBootTime(kTimeSeconds[i]))); 2740 OnDarkResume(is_connected, whitelist); 2741 } 2742 SetInDarkResume(false); // this happens after BeforeSuspendActions 2743 EXPECT_EQ(WakeOnWiFi::kMaxDarkResumesPerPeriodShort - 1, 2744 GetDarkResumeHistory()->Size()); 2745 2746 // The 3rd dark resume takes place at 30 seconds, which makes 3 dark resumes 2747 // in the past minute. Disable wake on WiFi and start wake to scan timer. 2748 ResetSuspendActionsDoneCallback(); 2749 StartDHCPLeaseRenewalTimer(); 2750 StopWakeToScanTimer(); 2751 EXPECT_TRUE(SuspendActionsCallbackIsNull()); 2752 EXPECT_TRUE(DHCPLeaseRenewalTimerIsRunning()); 2753 EXPECT_FALSE(WakeToScanTimerIsRunning()); 2754 EXPECT_FALSE(GetDarkResumeHistory()->Empty()); 2755 EXPECT_CALL(metrics_, NotifyWakeOnWiFiThrottled()); 2756 EXPECT_CALL(time_, GetNow()) 2757 .WillRepeatedly(Return(GetTimestampBootTime( 2758 kTimeSeconds[WakeOnWiFi::kMaxDarkResumesPerPeriodShort - 1]))); 2759 OnDarkResume(is_connected, whitelist); 2760 EXPECT_FALSE(SuspendActionsCallbackIsNull()); 2761 EXPECT_FALSE(DHCPLeaseRenewalTimerIsRunning()); 2762 EXPECT_TRUE(WakeToScanTimerIsRunning()); 2763 EXPECT_TRUE(GetDarkResumeHistory()->Empty()); 2764 EXPECT_FALSE(GetInDarkResume()); 2765 } 2766 2767 TEST_F(WakeOnWiFiTestWithDispatcher, 2768 OnDarkResume_NotConnected_MaxDarkResumes_LongPeriod) { 2769 // These 10 dark resume timings are spaced 1 minute apart so as to trigger the 2770 // long throttling threshold (10 in 10 minute) without triggering the short 2771 // throttling threshold (3 in 1 minute). 2772 const int kTimeSeconds[] = {10, 70, 130, 190, 250, 310, 370, 430, 490, 550}; 2773 CHECK_EQ( 2774 static_cast<const unsigned int>(WakeOnWiFi::kMaxDarkResumesPerPeriodLong), 2775 arraysize(kTimeSeconds)); 2776 vector<ByteString> whitelist; 2777 2778 // This test assumes that throttling takes place when 3 dark resumes have been 2779 // triggered in the last 1 minute, or when 10 dark resumes have been triggered 2780 // in the last 10 minutes. 2781 EXPECT_EQ(3, WakeOnWiFi::kMaxDarkResumesPerPeriodShort); 2782 EXPECT_EQ(1, WakeOnWiFi::kDarkResumeFrequencySamplingPeriodShortMinutes); 2783 EXPECT_EQ(10, WakeOnWiFi::kMaxDarkResumesPerPeriodLong); 2784 EXPECT_EQ(10, WakeOnWiFi::kDarkResumeFrequencySamplingPeriodLongMinutes); 2785 2786 // Wake on SSID dark resumes should be recorded in the dark resume history. 2787 const bool is_connected = false; 2788 SetLastWakeReason(WakeOnWiFi::kWakeTriggerSSID); 2789 EXPECT_TRUE(GetDarkResumeHistory()->Empty()); 2790 2791 // The first 9 dark resumes happen once per minute. This is still within the 2792 // throttling threshold. 2793 for (int i = 0; i < WakeOnWiFi::kMaxDarkResumesPerPeriodLong - 1; ++i) { 2794 EXPECT_CALL(metrics_, NotifyWakeOnWiFiThrottled()).Times(0); 2795 EXPECT_CALL(time_, GetNow()) 2796 .WillRepeatedly(Return(GetTimestampBootTime(kTimeSeconds[i]))); 2797 OnDarkResume(is_connected, whitelist); 2798 } 2799 SetInDarkResume(false); // this happens after BeforeSuspendActions 2800 EXPECT_EQ(WakeOnWiFi::kMaxDarkResumesPerPeriodLong - 1, 2801 GetDarkResumeHistory()->Size()); 2802 2803 // The occurrence of the 10th dark resume makes 10 dark resumes in the past 10 2804 // minutes. Disable wake on WiFi and start wake to scan timer. 2805 ResetSuspendActionsDoneCallback(); 2806 StartDHCPLeaseRenewalTimer(); 2807 StopWakeToScanTimer(); 2808 EXPECT_TRUE(SuspendActionsCallbackIsNull()); 2809 EXPECT_TRUE(DHCPLeaseRenewalTimerIsRunning()); 2810 EXPECT_FALSE(WakeToScanTimerIsRunning()); 2811 EXPECT_FALSE(GetDarkResumeHistory()->Empty()); 2812 EXPECT_CALL(metrics_, NotifyWakeOnWiFiThrottled()); 2813 EXPECT_CALL(time_, GetNow()) 2814 .WillRepeatedly(Return(GetTimestampBootTime( 2815 kTimeSeconds[WakeOnWiFi::kMaxDarkResumesPerPeriodLong - 1]))); 2816 OnDarkResume(is_connected, whitelist); 2817 EXPECT_FALSE(SuspendActionsCallbackIsNull()); 2818 EXPECT_FALSE(DHCPLeaseRenewalTimerIsRunning()); 2819 EXPECT_TRUE(WakeToScanTimerIsRunning()); 2820 EXPECT_TRUE(GetDarkResumeHistory()->Empty()); 2821 EXPECT_FALSE(GetInDarkResume()); 2822 EXPECT_TRUE(GetLastSSIDMatchFreqs().empty()); 2823 } 2824 2825 TEST_F(WakeOnWiFiTestWithMockDispatcher, OnConnectedAndReachable) { 2826 const bool start_lease_renewal_timer = true; 2827 ScopedMockLog log; 2828 2829 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 2830 SetInDarkResume(true); 2831 ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2832 ScopeLogger::GetInstance()->set_verbose_level(3); 2833 EXPECT_CALL(log, Log(_, _, HasSubstr("BeforeSuspendActions"))); 2834 OnConnectedAndReachable(start_lease_renewal_timer, 2835 kTimeToNextLeaseRenewalLong); 2836 2837 SetInDarkResume(false); 2838 EXPECT_CALL(log, Log(_, _, HasSubstr("Not in dark resume, so do nothing"))); 2839 OnConnectedAndReachable(start_lease_renewal_timer, 2840 kTimeToNextLeaseRenewalLong); 2841 ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2842 ScopeLogger::GetInstance()->set_verbose_level(0); 2843 } 2844 2845 TEST_F(WakeOnWiFiTestWithMockDispatcher, WakeOnWiFiDisabledAfterResume) { 2846 // At least one wake on WiFi trigger supported and Wake on WiFi features 2847 // are enabled, so disable Wake on WiFi on resume.] 2848 EnableWakeOnWiFiFeaturesPacketDarkConnect(); 2849 GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kWakeTriggerPattern); 2850 EXPECT_CALL(netlink_manager_, 2851 SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1); 2852 EXPECT_CALL(metrics_, NotifySuspendWithWakeOnWiFiEnabledDone()).Times(1); 2853 OnAfterResume(); 2854 2855 // No wake no WiFi triggers supported, so do nothing. 2856 ClearWakeOnWiFiTriggersSupported(); 2857 EXPECT_CALL(netlink_manager_, 2858 SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(0); 2859 EXPECT_CALL(metrics_, NotifySuspendWithWakeOnWiFiEnabledDone()).Times(0); 2860 OnAfterResume(); 2861 2862 // Wake on WiFi features disabled, so do nothing. 2863 GetWakeOnWiFiTriggersSupported()->insert(WakeOnWiFi::kWakeTriggerPattern); 2864 DisableWakeOnWiFiFeatures(); 2865 EXPECT_CALL(netlink_manager_, 2866 SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(0); 2867 EXPECT_CALL(metrics_, NotifySuspendWithWakeOnWiFiEnabledDone()).Times(0); 2868 OnAfterResume(); 2869 2870 // Both WakeOnWiFi triggers are empty and Wake on WiFi features are disabled, 2871 // so do nothing. 2872 ClearWakeOnWiFiTriggersSupported(); 2873 DisableWakeOnWiFiFeatures(); 2874 EXPECT_CALL(netlink_manager_, 2875 SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(0); 2876 EXPECT_CALL(metrics_, NotifySuspendWithWakeOnWiFiEnabledDone()).Times(0); 2877 OnAfterResume(); 2878 } 2879 2880 TEST_F(WakeOnWiFiTestWithMockDispatcher, SetWakeOnWiFiFeaturesEnabled) { 2881 const string bad_feature("blahblah"); 2882 Error e; 2883 EnableWakeOnWiFiFeaturesPacketDarkConnect(); 2884 EXPECT_STREQ(GetWakeOnWiFiFeaturesEnabled().c_str(), 2885 kWakeOnWiFiFeaturesEnabledPacketDarkConnect); 2886 EXPECT_FALSE(SetWakeOnWiFiFeaturesEnabled( 2887 kWakeOnWiFiFeaturesEnabledPacketDarkConnect, &e)); 2888 EXPECT_STREQ(GetWakeOnWiFiFeaturesEnabled().c_str(), 2889 kWakeOnWiFiFeaturesEnabledPacketDarkConnect); 2890 2891 EXPECT_FALSE(SetWakeOnWiFiFeaturesEnabled(bad_feature, &e)); 2892 EXPECT_EQ(e.type(), Error::kInvalidArguments); 2893 EXPECT_STREQ(e.message().c_str(), "Invalid Wake on WiFi feature"); 2894 EXPECT_STREQ(GetWakeOnWiFiFeaturesEnabled().c_str(), 2895 kWakeOnWiFiFeaturesEnabledPacketDarkConnect); 2896 2897 EXPECT_TRUE( 2898 SetWakeOnWiFiFeaturesEnabled(kWakeOnWiFiFeaturesEnabledPacket, &e)); 2899 EXPECT_STREQ(GetWakeOnWiFiFeaturesEnabled().c_str(), 2900 kWakeOnWiFiFeaturesEnabledPacket); 2901 } 2902 2903 TEST_F(WakeOnWiFiTestWithMockDispatcher, 2904 ReportConnectedToServiceAfterWake_WakeOnDarkConnectEnabledAndConnected) { 2905 const bool is_connected = true; 2906 EnableWakeOnWiFiFeaturesPacketDarkConnect(); 2907 EXPECT_CALL( 2908 metrics_, 2909 NotifyConnectedToServiceAfterWake( 2910 Metrics::kWiFiConnetionStatusAfterWakeOnWiFiEnabledWakeConnected)); 2911 ReportConnectedToServiceAfterWake(is_connected); 2912 2913 EnableWakeOnWiFiFeaturesDarkConnect(); 2914 EXPECT_CALL( 2915 metrics_, 2916 NotifyConnectedToServiceAfterWake( 2917 Metrics::kWiFiConnetionStatusAfterWakeOnWiFiEnabledWakeConnected)); 2918 ReportConnectedToServiceAfterWake(is_connected); 2919 } 2920 2921 TEST_F( 2922 WakeOnWiFiTestWithMockDispatcher, 2923 ReportConnectedToServiceAfterWake_WakeOnDarkConnectEnabledAndNotConnected) { 2924 const bool is_connected = false; 2925 EnableWakeOnWiFiFeaturesPacketDarkConnect(); 2926 EXPECT_CALL( 2927 metrics_, 2928 NotifyConnectedToServiceAfterWake( 2929 Metrics::kWiFiConnetionStatusAfterWakeOnWiFiEnabledWakeNotConnected)); 2930 ReportConnectedToServiceAfterWake(is_connected); 2931 2932 EnableWakeOnWiFiFeaturesDarkConnect(); 2933 EXPECT_CALL( 2934 metrics_, 2935 NotifyConnectedToServiceAfterWake( 2936 Metrics::kWiFiConnetionStatusAfterWakeOnWiFiEnabledWakeNotConnected)); 2937 ReportConnectedToServiceAfterWake(is_connected); 2938 } 2939 2940 TEST_F( 2941 WakeOnWiFiTestWithMockDispatcher, 2942 ReportConnectedToServiceAfterWake_WakeOnDarkConnectDisabledAndConnected) { 2943 const bool is_connected = true; 2944 EnableWakeOnWiFiFeaturesPacket(); 2945 EXPECT_CALL( 2946 metrics_, 2947 NotifyConnectedToServiceAfterWake( 2948 Metrics::kWiFiConnetionStatusAfterWakeOnWiFiDisabledWakeConnected)); 2949 ReportConnectedToServiceAfterWake(is_connected); 2950 2951 DisableWakeOnWiFiFeatures(); 2952 EXPECT_CALL( 2953 metrics_, 2954 NotifyConnectedToServiceAfterWake( 2955 Metrics::kWiFiConnetionStatusAfterWakeOnWiFiDisabledWakeConnected)); 2956 ReportConnectedToServiceAfterWake(is_connected); 2957 } 2958 2959 TEST_F( 2960 WakeOnWiFiTestWithMockDispatcher, 2961 ReportConnectedToServiceAfterWake_WakeOnDarkConnectDisabledAndNotConnected) 2962 { 2963 const bool is_connected = false; 2964 EnableWakeOnWiFiFeaturesPacket(); 2965 EXPECT_CALL( 2966 metrics_, 2967 NotifyConnectedToServiceAfterWake( 2968 Metrics:: 2969 kWiFiConnetionStatusAfterWakeOnWiFiDisabledWakeNotConnected)); 2970 ReportConnectedToServiceAfterWake(is_connected); 2971 2972 DisableWakeOnWiFiFeatures(); 2973 EXPECT_CALL( 2974 metrics_, 2975 NotifyConnectedToServiceAfterWake( 2976 Metrics:: 2977 kWiFiConnetionStatusAfterWakeOnWiFiDisabledWakeNotConnected)); 2978 ReportConnectedToServiceAfterWake(is_connected); 2979 } 2980 2981 TEST_F(WakeOnWiFiTestWithMockDispatcher, 2982 OnNoAutoConnectableServicesAfterScan_InDarkResume) { 2983 vector<ByteString> whitelist; 2984 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 2985 EnableWakeOnWiFiFeaturesDarkConnect(); 2986 SetInDarkResume(true); 2987 2988 // Perform disconnect before suspend actions if we are in dark resume. 2989 GetWakeOnWiFiTriggers()->clear(); 2990 StartDHCPLeaseRenewalTimer(); 2991 StopWakeToScanTimer(); 2992 OnNoAutoConnectableServicesAfterScan(whitelist); 2993 EXPECT_FALSE(DHCPLeaseRenewalTimerIsRunning()); 2994 EXPECT_FALSE(WakeToScanTimerIsRunning()); 2995 EXPECT_EQ(GetWakeOnWiFiTriggers()->size(), 1); 2996 EXPECT_TRUE(GetWakeOnWiFiTriggers()->find(WakeOnWiFi::kWakeTriggerSSID) != 2997 GetWakeOnWiFiTriggers()->end()); 2998 } 2999 3000 TEST_F(WakeOnWiFiTestWithMockDispatcher, 3001 OnNoAutoConnectableServicesAfterScan_NotInDarkResume) { 3002 vector<ByteString> whitelist; 3003 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 3004 EnableWakeOnWiFiFeaturesDarkConnect(); 3005 SetInDarkResume(false); 3006 3007 // If we are not in dark resume, do nothing. 3008 GetWakeOnWiFiTriggers()->clear(); 3009 StartDHCPLeaseRenewalTimer(); 3010 StopWakeToScanTimer(); 3011 OnNoAutoConnectableServicesAfterScan(whitelist); 3012 EXPECT_TRUE(DHCPLeaseRenewalTimerIsRunning()); 3013 EXPECT_EQ(GetWakeOnWiFiTriggers()->size(), 0); 3014 } 3015 3016 TEST_F(WakeOnWiFiTestWithMockDispatcher, 3017 OnNoAutoConnectableServicesAfterScan_Retry) { 3018 vector<ByteString> whitelist; 3019 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 3020 EnableWakeOnWiFiFeaturesDarkConnect(); 3021 SetInDarkResume(true); 3022 SetDarkResumeScanRetriesLeft(1); 3023 3024 // Perform a retry. 3025 EXPECT_EQ(1, GetDarkResumeScanRetriesLeft()); 3026 EXPECT_CALL(metrics_, NotifyDarkResumeScanRetry()); 3027 EXPECT_CALL(*this, InitiateScanCallback(GetLastSSIDMatchFreqs())); 3028 OnNoAutoConnectableServicesAfterScan(whitelist); 3029 EXPECT_EQ(0, GetDarkResumeScanRetriesLeft()); 3030 3031 // Still no auto-connectable services after retry. No more retries, so perform 3032 // disconnect before suspend actions. 3033 GetWakeOnWiFiTriggers()->clear(); 3034 StartDHCPLeaseRenewalTimer(); 3035 StopWakeToScanTimer(); 3036 EXPECT_CALL(*this, InitiateScanCallback(GetLastSSIDMatchFreqs())).Times(0); 3037 OnNoAutoConnectableServicesAfterScan(whitelist); 3038 EXPECT_FALSE(DHCPLeaseRenewalTimerIsRunning()); 3039 EXPECT_FALSE(WakeToScanTimerIsRunning()); 3040 EXPECT_EQ(GetWakeOnWiFiTriggers()->size(), 1); 3041 EXPECT_TRUE(GetWakeOnWiFiTriggers()->find(WakeOnWiFi::kWakeTriggerSSID) != 3042 GetWakeOnWiFiTriggers()->end()); 3043 } 3044 3045 TEST_F(WakeOnWiFiTestWithMockDispatcher, OnWakeupReasonReceived_Unsupported) { 3046 ScopedMockLog log; 3047 ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3048 ScopeLogger::GetInstance()->set_verbose_level(3); 3049 SetWiphyIndex(kWakeReasonNlMsg_WiphyIndex); 3050 3051 SetWakeOnPacketConnMessage msg; 3052 NetlinkPacket packet( 3053 kWakeReasonUnsupportedNlMsg, sizeof(kWakeReasonUnsupportedNlMsg)); 3054 msg.InitFromPacket(&packet, GetWakeupReportMsgContext()); 3055 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3056 EXPECT_CALL(log, 3057 Log(_, _, HasSubstr("Wakeup reason: Not wake on WiFi related"))); 3058 EXPECT_CALL(metrics_, NotifyWakeupReasonReceived()); 3059 EXPECT_CALL(*this, RecordDarkResumeWakeReasonCallback(_)).Times(0); 3060 OnWakeupReasonReceived(msg); 3061 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 3062 3063 ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3064 ScopeLogger::GetInstance()->set_verbose_level(0); 3065 } 3066 3067 TEST_F(WakeOnWiFiTestWithMockDispatcher, OnWakeupReasonReceived_Disconnect) { 3068 ScopedMockLog log; 3069 ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3070 ScopeLogger::GetInstance()->set_verbose_level(3); 3071 SetWiphyIndex(kWakeReasonNlMsg_WiphyIndex); 3072 3073 SetWakeOnPacketConnMessage msg; 3074 NetlinkPacket packet( 3075 kWakeReasonDisconnectNlMsg, sizeof(kWakeReasonDisconnectNlMsg)); 3076 msg.InitFromPacket(&packet, GetWakeupReportMsgContext()); 3077 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3078 EXPECT_CALL(log, Log(_, _, HasSubstr("Wakeup reason: Disconnect"))); 3079 EXPECT_CALL(metrics_, NotifyWakeupReasonReceived()); 3080 EXPECT_CALL(*this, RecordDarkResumeWakeReasonCallback( 3081 WakeOnWiFi::kWakeReasonStringDisconnect)); 3082 OnWakeupReasonReceived(msg); 3083 EXPECT_EQ(WakeOnWiFi::kWakeTriggerDisconnect, GetLastWakeReason()); 3084 3085 ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3086 ScopeLogger::GetInstance()->set_verbose_level(0); 3087 } 3088 3089 TEST_F(WakeOnWiFiTestWithMockDispatcher, OnWakeupReasonReceived_SSID) { 3090 ScopedMockLog log; 3091 ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3092 ScopeLogger::GetInstance()->set_verbose_level(3); 3093 SetWiphyIndex(kWakeReasonNlMsg_WiphyIndex); 3094 3095 SetWakeOnPacketConnMessage msg; 3096 NetlinkPacket packet(kWakeReasonSSIDNlMsg, sizeof(kWakeReasonSSIDNlMsg)); 3097 msg.InitFromPacket(&packet, GetWakeupReportMsgContext()); 3098 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3099 EXPECT_CALL(log, Log(_, _, HasSubstr("Wakeup reason: SSID"))); 3100 EXPECT_CALL(metrics_, NotifyWakeupReasonReceived()); 3101 EXPECT_CALL(*this, RecordDarkResumeWakeReasonCallback( 3102 WakeOnWiFi::kWakeReasonStringSSID)); 3103 OnWakeupReasonReceived(msg); 3104 EXPECT_EQ(WakeOnWiFi::kWakeTriggerSSID, GetLastWakeReason()); 3105 EXPECT_EQ(arraysize(kSSID1FreqMatches), GetLastSSIDMatchFreqs().size()); 3106 for (uint32_t freq : kSSID1FreqMatches) { 3107 EXPECT_TRUE(GetLastSSIDMatchFreqs().find(freq) != 3108 GetLastSSIDMatchFreqs().end()); 3109 } 3110 3111 ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3112 ScopeLogger::GetInstance()->set_verbose_level(0); 3113 } 3114 3115 TEST_F(WakeOnWiFiTestWithMockDispatcher, OnWakeupReasonReceived_Pattern) { 3116 ScopedMockLog log; 3117 ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3118 ScopeLogger::GetInstance()->set_verbose_level(3); 3119 SetWiphyIndex(kWakeReasonNlMsg_WiphyIndex); 3120 3121 SetWakeOnPacketConnMessage msg; 3122 NetlinkPacket packet( 3123 kWakeReasonPatternNlMsg, sizeof(kWakeReasonPatternNlMsg)); 3124 msg.InitFromPacket(&packet, GetWakeupReportMsgContext()); 3125 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3126 EXPECT_CALL(log, Log(_, _, HasSubstr("Wakeup reason: Pattern " + 3127 kWakeReasonPatternNlMsg_PattIndex))); 3128 EXPECT_CALL(metrics_, NotifyWakeupReasonReceived()); 3129 EXPECT_CALL(*this, RecordDarkResumeWakeReasonCallback( 3130 WakeOnWiFi::kWakeReasonStringPattern)); 3131 OnWakeupReasonReceived(msg); 3132 EXPECT_EQ(WakeOnWiFi::kWakeTriggerPattern, GetLastWakeReason()); 3133 3134 ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3135 ScopeLogger::GetInstance()->set_verbose_level(0); 3136 } 3137 3138 TEST_F(WakeOnWiFiTestWithMockDispatcher, OnWakeupReasonReceived_Error) { 3139 ScopedMockLog log; 3140 ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3141 ScopeLogger::GetInstance()->set_verbose_level(7); 3142 SetWiphyIndex(kWakeReasonNlMsg_WiphyIndex); 3143 3144 // kWrongMessageTypeNlMsg has an nlmsg_type of 0x16, which is different from 3145 // the 0x13 (i.e. kNl80211FamilyId) that we expect in these unittests. 3146 GetWakeOnPacketConnMessage msg0; 3147 NetlinkPacket packet0(kWrongMessageTypeNlMsg, sizeof(kWrongMessageTypeNlMsg)); 3148 msg0.InitFromPacket(&packet0, GetWakeupReportMsgContext()); 3149 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3150 EXPECT_CALL(log, Log(_, _, HasSubstr("Not a NL80211 Message"))); 3151 EXPECT_CALL(metrics_, NotifyWakeupReasonReceived()).Times(0); 3152 EXPECT_CALL(*this, RecordDarkResumeWakeReasonCallback(_)).Times(0); 3153 OnWakeupReasonReceived(msg0); 3154 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 3155 3156 // This message has command NL80211_CMD_GET_WOWLAN, not a 3157 // NL80211_CMD_SET_WOWLAN. 3158 GetWakeOnPacketConnMessage msg1; 3159 NetlinkPacket packet1(kResponseNoIPAddresses, sizeof(kResponseNoIPAddresses)); 3160 msg1.InitFromPacket(&packet1, GetWakeupReportMsgContext()); 3161 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3162 EXPECT_CALL(log, 3163 Log(_, _, HasSubstr("Not a NL80211_CMD_SET_WOWLAN message"))); 3164 EXPECT_CALL(metrics_, NotifyWakeupReasonReceived()).Times(0); 3165 EXPECT_CALL(*this, RecordDarkResumeWakeReasonCallback(_)).Times(0); 3166 OnWakeupReasonReceived(msg1); 3167 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 3168 3169 // Valid message, but wrong wiphy index. 3170 SetWiphyIndex(kWakeReasonNlMsg_WiphyIndex + 1); 3171 SetWakeOnPacketConnMessage msg2; 3172 NetlinkPacket packet( 3173 kWakeReasonDisconnectNlMsg, sizeof(kWakeReasonDisconnectNlMsg)); 3174 msg2.InitFromPacket(&packet, GetWakeupReportMsgContext()); 3175 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3176 EXPECT_CALL( 3177 log, Log(_, _, HasSubstr("Wakeup reason not meant for this interface"))); 3178 EXPECT_CALL(metrics_, NotifyWakeupReasonReceived()).Times(0); 3179 EXPECT_CALL(*this, RecordDarkResumeWakeReasonCallback(_)).Times(0); 3180 OnWakeupReasonReceived(msg2); 3181 EXPECT_EQ(WakeOnWiFi::kWakeTriggerUnsupported, GetLastWakeReason()); 3182 3183 ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3184 ScopeLogger::GetInstance()->set_verbose_level(0); 3185 } 3186 3187 #else // DISABLE_WAKE_ON_WIFI 3188 3189 TEST_F(WakeOnWiFiTestWithMockDispatcher, 3190 WakeOnWiFiDisabled_AddWakeOnPacketConnection_ReturnsError) { 3191 DisableWakeOnWiFiFeatures(); 3192 Error e; 3193 AddWakeOnPacketConnection("1.1.1.1", &e); 3194 EXPECT_EQ(e.type(), Error::kNotSupported); 3195 EXPECT_STREQ(e.message().c_str(), WakeOnWiFi::kWakeOnWiFiNotSupported); 3196 } 3197 3198 TEST_F(WakeOnWiFiTestWithMockDispatcher, 3199 WakeOnWiFiDisabled_RemoveWakeOnPacketConnection_ReturnsError) { 3200 DisableWakeOnWiFiFeatures(); 3201 Error e; 3202 RemoveWakeOnPacketConnection("1.1.1.1", &e); 3203 EXPECT_EQ(e.type(), Error::kNotSupported); 3204 EXPECT_STREQ(e.message().c_str(), WakeOnWiFi::kWakeOnWiFiNotSupported); 3205 } 3206 3207 TEST_F(WakeOnWiFiTestWithMockDispatcher, 3208 WakeOnWiFiDisabled_RemoveAllWakeOnPacketConnections_ReturnsError) { 3209 DisableWakeOnWiFiFeatures(); 3210 Error e; 3211 RemoveAllWakeOnPacketConnections(&e); 3212 EXPECT_EQ(e.type(), Error::kNotSupported); 3213 EXPECT_STREQ(e.message().c_str(), WakeOnWiFi::kWakeOnWiFiNotSupported); 3214 } 3215 3216 TEST_F(WakeOnWiFiTestWithMockDispatcher, 3217 WakeOnWiFiDisabled_OnBeforeSuspend_ReportsDoneImmediately) { 3218 const bool is_connected = true; 3219 const bool have_dhcp_lease = true; 3220 vector<ByteString> whitelist; 3221 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 3222 EXPECT_CALL(*this, DoneCallback(ErrorTypeIs(Error::kSuccess))).Times(1); 3223 EXPECT_CALL(*this, RenewDHCPLeaseCallback()).Times(0); 3224 OnBeforeSuspend(is_connected, whitelist, have_dhcp_lease, 3225 kTimeToNextLeaseRenewalShort); 3226 3227 EXPECT_CALL(*this, DoneCallback(ErrorTypeIs(Error::kSuccess))).Times(1); 3228 EXPECT_CALL(*this, RenewDHCPLeaseCallback()).Times(0); 3229 OnBeforeSuspend(is_connected, whitelist, have_dhcp_lease, 3230 kTimeToNextLeaseRenewalLong); 3231 } 3232 3233 TEST_F(WakeOnWiFiTestWithMockDispatcher, 3234 WakeOnWiFiDisabled_OnDarkResume_ReportsDoneImmediately) { 3235 const bool is_connected = true; 3236 vector<ByteString> whitelist; 3237 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 3238 EXPECT_CALL(*this, DoneCallback(ErrorTypeIs(Error::kSuccess))).Times(1); 3239 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0); 3240 EXPECT_CALL(metrics_, NotifyWakeOnWiFiOnDarkResume(_)).Times(0); 3241 OnDarkResume(is_connected, whitelist); 3242 3243 EXPECT_CALL(*this, DoneCallback(ErrorTypeIs(Error::kSuccess))).Times(1); 3244 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0); 3245 EXPECT_CALL(metrics_, NotifyWakeOnWiFiOnDarkResume(_)).Times(0); 3246 OnDarkResume(is_connected, whitelist); 3247 } 3248 3249 TEST_F(WakeOnWiFiTestWithMockDispatcher, 3250 WakeOnWiFiDisabled_OnAfterResume_DoesNothing) { 3251 DisableWakeOnWiFiFeatures(); 3252 EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0); 3253 EXPECT_CALL(metrics_, NotifySuspendWithWakeOnWiFiEnabledDone()).Times(0); 3254 OnAfterResume(); 3255 } 3256 3257 TEST_F(WakeOnWiFiTestWithMockDispatcher, 3258 WakeOnWiFiDisabled_SetWakeOnWiFiFeaturesEnabled) { 3259 Error e; 3260 SetWakeOnWiFiFeaturesNotSupported(); 3261 EXPECT_STREQ(GetWakeOnWiFiFeaturesEnabled().c_str(), 3262 kWakeOnWiFiFeaturesEnabledNotSupported); 3263 EXPECT_FALSE( 3264 SetWakeOnWiFiFeaturesEnabled(kWakeOnWiFiFeaturesEnabledNotSupported, &e)); 3265 EXPECT_STREQ(GetWakeOnWiFiFeaturesEnabled().c_str(), 3266 kWakeOnWiFiFeaturesEnabledNotSupported); 3267 EXPECT_EQ(e.type(), Error::kNotSupported); 3268 EXPECT_STREQ(e.message().c_str(), WakeOnWiFi::kWakeOnWiFiNotSupported); 3269 3270 EXPECT_FALSE( 3271 SetWakeOnWiFiFeaturesEnabled(kWakeOnWiFiFeaturesEnabledPacket, &e)); 3272 EXPECT_STREQ(GetWakeOnWiFiFeaturesEnabled().c_str(), 3273 kWakeOnWiFiFeaturesEnabledNotSupported); 3274 EXPECT_EQ(e.type(), Error::kNotSupported); 3275 EXPECT_STREQ(e.message().c_str(), WakeOnWiFi::kWakeOnWiFiNotSupported); 3276 } 3277 3278 TEST_F(WakeOnWiFiTestWithMockDispatcher, 3279 WakeOnWiFiDisabled_OnConnectedAndReachable) { 3280 ScopedMockLog log; 3281 const bool start_lease_renewal_timer = true; 3282 ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3283 ScopeLogger::GetInstance()->set_verbose_level(3); 3284 3285 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3286 SetInDarkResume(true); 3287 EXPECT_CALL( 3288 log, Log(_, _, HasSubstr("Wake on WiFi not supported, so do nothing"))); 3289 OnConnectedAndReachable(start_lease_renewal_timer, 3290 kTimeToNextLeaseRenewalLong); 3291 3292 SetInDarkResume(false); 3293 EXPECT_CALL(log, Log(_, _, HasSubstr("Not in dark resume, so do nothing"))); 3294 OnConnectedAndReachable(start_lease_renewal_timer, 3295 kTimeToNextLeaseRenewalLong); 3296 ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3297 ScopeLogger::GetInstance()->set_verbose_level(0); 3298 } 3299 3300 TEST_F(WakeOnWiFiTestWithMockDispatcher, 3301 WakeOnWiFiDisabled_ReportConnectedToServiceAfterWakeAndConnected) { 3302 const bool is_connected = true; 3303 EXPECT_CALL( 3304 metrics_, 3305 NotifyConnectedToServiceAfterWake( 3306 Metrics::kWiFiConnetionStatusAfterWakeOnWiFiDisabledWakeConnected)); 3307 ReportConnectedToServiceAfterWake(is_connected); 3308 } 3309 3310 TEST_F(WakeOnWiFiTestWithMockDispatcher, 3311 WakeOnWiFiDisabled_ReportConnectedToServiceAfterWakeAndNotConnected) { 3312 const bool is_connected = false; 3313 EXPECT_CALL( 3314 metrics_, 3315 NotifyConnectedToServiceAfterWake( 3316 Metrics:: 3317 kWiFiConnetionStatusAfterWakeOnWiFiDisabledWakeNotConnected)); 3318 ReportConnectedToServiceAfterWake(is_connected); 3319 } 3320 3321 TEST_F(WakeOnWiFiTestWithMockDispatcher, 3322 WakeOnWiFiDisabled_OnNoAutoConnectableServicesAfterScan) { 3323 vector<ByteString> whitelist; 3324 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 3325 3326 // Do nothing (i.e. do not invoke WakeOnWiFi::BeforeSuspendActions) if wake 3327 // on WiFi is not supported, whether or not we are in dark resume. 3328 SetInDarkResume(true); 3329 GetWakeOnWiFiTriggers()->clear(); 3330 StartDHCPLeaseRenewalTimer(); 3331 StopWakeToScanTimer(); 3332 OnNoAutoConnectableServicesAfterScan(whitelist); 3333 EXPECT_FALSE(WakeToScanTimerIsRunning()); 3334 EXPECT_TRUE(DHCPLeaseRenewalTimerIsRunning()); 3335 EXPECT_EQ(GetWakeOnWiFiTriggers()->size(), 0); 3336 3337 SetInDarkResume(false); 3338 GetWakeOnWiFiTriggers()->clear(); 3339 StartDHCPLeaseRenewalTimer(); 3340 StopWakeToScanTimer(); 3341 OnNoAutoConnectableServicesAfterScan(whitelist); 3342 EXPECT_FALSE(WakeToScanTimerIsRunning()); 3343 EXPECT_TRUE(DHCPLeaseRenewalTimerIsRunning()); 3344 EXPECT_EQ(GetWakeOnWiFiTriggers()->size(), 0); 3345 } 3346 3347 TEST_F(WakeOnWiFiTestWithMockDispatcher, 3348 WakeOnWiFiDisabled_OnWakeupReasonReceived_DoesNothing) { 3349 ScopedMockLog log; 3350 ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 3351 ScopeLogger::GetInstance()->set_verbose_level(7); 3352 3353 SetWakeOnPacketConnMessage msg; 3354 NetlinkPacket packet(kWakeReasonSSIDNlMsg, sizeof(kWakeReasonSSIDNlMsg)); 3355 msg.InitFromPacket(&packet, GetWakeupReportMsgContext()); 3356 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3357 EXPECT_CALL( 3358 log, Log(_, _, HasSubstr("Wake on WiFi not supported, so do nothing"))); 3359 EXPECT_CALL(metrics_, NotifyWakeupReasonReceived()).Times(0); 3360 EXPECT_CALL(*this, RecordDarkResumeWakeReasonCallback(_)).Times(0); 3361 OnWakeupReasonReceived(msg); 3362 3363 ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 3364 ScopeLogger::GetInstance()->set_verbose_level(0); 3365 } 3366 3367 TEST_F(WakeOnWiFiTestWithMockDispatcher, 3368 WakeOnWiFiDisabled_ConfigureSetWakeOnWiFiSettingsMessage_ReturnsFalse) { 3369 IPAddressStore no_addresses; 3370 IPAddressStore one_address; 3371 const char kIPv4AddrString[] = "1.1.1.1"; 3372 one_address.AddUnique( 3373 IPAddress(string(kIPv4AddrString, sizeof(kIPv4AddrString)))); 3374 set<WakeOnWiFi::WakeOnWiFiTrigger> no_trigs; 3375 set<WakeOnWiFi::WakeOnWiFiTrigger> one_trig; 3376 one_trig.insert(WakeOnWiFi::kWakeTriggerPattern); 3377 const int index = 1; // wiphy device number 3378 vector<ByteString> whitelist; 3379 const uint32_t interval = kNetDetectScanIntervalSeconds; 3380 SetWakeOnPacketConnMessage msg; 3381 Error e; 3382 EXPECT_FALSE(ConfigureSetWakeOnWiFiSettingsMessage( 3383 &msg, no_trigs, no_addresses, index, interval, whitelist, &e)); 3384 EXPECT_FALSE(ConfigureSetWakeOnWiFiSettingsMessage( 3385 &msg, one_trig, one_address, index, interval, whitelist, &e)); 3386 } 3387 3388 TEST_F(WakeOnWiFiTestWithMockDispatcher, 3389 WakeOnWiFiDisabled_WakeOnWiFiSettingsMatch_ReturnsFalse) { 3390 // Test that WakeOnWiFi::WakeOnWiFiSettingsMatch unconditionally returns false 3391 // when wake-on-WiFi is disabled by testing it against several cases where we 3392 // expect it to return true. 3393 IPAddressStore all_addresses; 3394 set<WakeOnWiFi::WakeOnWiFiTrigger> trigs; 3395 vector<ByteString> whitelist; 3396 const uint32_t interval = kNetDetectScanIntervalSeconds; 3397 3398 GetWakeOnPacketConnMessage msg0; 3399 NetlinkPacket packet0(kResponseNoIPAddresses, sizeof(kResponseNoIPAddresses)); 3400 msg0.InitFromPacket(&packet0, NetlinkMessage::MessageContext()); 3401 EXPECT_FALSE( 3402 WakeOnWiFiSettingsMatch(msg0, trigs, all_addresses, interval, whitelist)); 3403 3404 trigs.insert(WakeOnWiFi::kWakeTriggerPattern); 3405 all_addresses.AddUnique( 3406 IPAddress(string(kIPV4Address0, sizeof(kIPV4Address0)))); 3407 GetWakeOnPacketConnMessage msg1; 3408 NetlinkPacket packet1(kResponseIPV40, sizeof(kResponseIPV40)); 3409 msg1.InitFromPacket(&packet1, NetlinkMessage::MessageContext()); 3410 EXPECT_FALSE( 3411 WakeOnWiFiSettingsMatch(msg1, trigs, all_addresses, interval, whitelist)); 3412 3413 trigs.insert(WakeOnWiFi::kWakeTriggerDisconnect); 3414 GetWakeOnPacketConnMessage msg2; 3415 NetlinkPacket packet2(kResponseIPV40WakeOnDisconnect, 3416 sizeof(kResponseIPV40WakeOnDisconnect)); 3417 msg2.InitFromPacket(&packet2, NetlinkMessage::MessageContext()); 3418 EXPECT_FALSE( 3419 WakeOnWiFiSettingsMatch(msg2, trigs, all_addresses, interval, whitelist)); 3420 3421 trigs.erase(WakeOnWiFi::kWakeTriggerDisconnect); 3422 all_addresses.AddUnique( 3423 IPAddress(string(kIPV4Address1, sizeof(kIPV4Address1)))); 3424 GetWakeOnPacketConnMessage msg3; 3425 NetlinkPacket packet3(kResponseIPV401, sizeof(kResponseIPV401)); 3426 msg3.InitFromPacket(&packet3, NetlinkMessage::MessageContext()); 3427 EXPECT_FALSE( 3428 WakeOnWiFiSettingsMatch(msg3, trigs, all_addresses, interval, whitelist)); 3429 3430 all_addresses.AddUnique( 3431 IPAddress(string(kIPV6Address0, sizeof(kIPV6Address0)))); 3432 GetWakeOnPacketConnMessage msg4; 3433 NetlinkPacket packet4(kResponseIPV401IPV60, sizeof(kResponseIPV401IPV60)); 3434 msg4.InitFromPacket(&packet4, NetlinkMessage::MessageContext()); 3435 EXPECT_FALSE( 3436 WakeOnWiFiSettingsMatch(msg4, trigs, all_addresses, interval, whitelist)); 3437 3438 all_addresses.AddUnique( 3439 IPAddress(string(kIPV6Address1, sizeof(kIPV6Address1)))); 3440 GetWakeOnPacketConnMessage msg5; 3441 NetlinkPacket packet5(kResponseIPV401IPV601, sizeof(kResponseIPV401IPV601)); 3442 msg5.InitFromPacket(&packet5, NetlinkMessage::MessageContext()); 3443 EXPECT_FALSE( 3444 WakeOnWiFiSettingsMatch(msg5, trigs, all_addresses, interval, whitelist)); 3445 3446 all_addresses.Clear(); 3447 trigs.clear(); 3448 trigs.insert(WakeOnWiFi::kWakeTriggerSSID); 3449 AddSSIDToWhitelist(kSSIDBytes1, sizeof(kSSIDBytes1), &whitelist); 3450 AddSSIDToWhitelist(kSSIDBytes2, sizeof(kSSIDBytes2), &whitelist); 3451 GetWakeOnPacketConnMessage msg6; 3452 NetlinkPacket packet6(kResponseWakeOnSSID, sizeof(kResponseWakeOnSSID)); 3453 msg6.InitFromPacket(&packet6, NetlinkMessage::MessageContext()); 3454 EXPECT_FALSE( 3455 WakeOnWiFiSettingsMatch(msg6, trigs, all_addresses, interval, whitelist)); 3456 } 3457 3458 TEST_F(WakeOnWiFiTestWithMockDispatcher, 3459 WakeOnWiFiDisabled_ParseWakeOnWiFiCapabilities_DoesNothing) { 3460 // |kNewWiphyNlMsg| should indicate that the NIC supports wake on pattern 3461 // (on up to |kNewWiphyNlMsg_MaxPatterns| registered patterns), 3462 // supports wake on SSID (on up to |kNewWiphyNlMsg_MaxSSIDs| SSIDs), and 3463 // supports wake on disconnect. Test that 3464 // WakeOnWiFi::ParseWakeOnWiFiCapabilities does nothing and does not parse 3465 // these capabilities when wake-on-WiFi is disabled. 3466 ClearWakeOnWiFiTriggersSupported(); 3467 SetWakeOnWiFiMaxSSIDs(0); 3468 NewWiphyMessage msg; 3469 NetlinkPacket packet(kNewWiphyNlMsg, sizeof(kNewWiphyNlMsg)); 3470 msg.InitFromPacket(&packet, NetlinkMessage::MessageContext()); 3471 ParseWakeOnWiFiCapabilities(msg); 3472 EXPECT_TRUE(GetWakeOnWiFiTriggersSupported()->empty()); 3473 EXPECT_EQ(0, GetWakeOnWiFiMaxPatterns()); 3474 EXPECT_EQ(0, GetWakeOnWiFiMaxSSIDs()); 3475 } 3476 3477 #endif // DISABLE_WAKE_ON_WIFI 3478 3479 } // namespace shill 3480