• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016, 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 <memory>
18 
19 #include <gtest/gtest.h>
20 
21 #include "wificond/net/kernel-header-latest/nl80211.h"
22 #include "wificond/net/nl80211_attribute.h"
23 
24 namespace android {
25 namespace wificond {
26 
27 namespace {
28 
29 const uint32_t kU8Value1 = 200;
30 const uint32_t kU16Value1 = 5000;
31 const uint32_t kU32Value1 = 250000;
32 const uint32_t kU32Value2 = 500000;
33 const std::string kIFName = "wlan0";
34 const uint8_t kMacAddress[] = {
35     0xc0, 0x3f, 0x0e, 0x77, 0xe8, 0x7f
36 };
37 
38 // This header contains invalid buffer length
39 const uint8_t kBrokenBuffer[] = {
40     0xff, 0xff, // nla_len = 0xffff
41     0x01, 0x11, // nla_type
42     0x15, 0x12, // payload
43     0x00, 0x00  // padding
44 };
45 const uint8_t kValidU32AttrBuffer[] = {
46     0x08, 0x00, // nla_len = 8
47     0x01, 0x00, // nla_type
48     0xf1, 0x12, 0x12, 0x2a // payload
49 };
50 const uint8_t kBufferContainsStringWithTrailingZero[] = {
51     0x0a, 0x00, // nla_len = 10
52     0x01, 0x00, // nla_type
53     'w', 'l', 'a', 'n', '0', '\0',
54     0x00, 0x00  // padding
55 };
56 const uint8_t kBufferContainsStringWithTrailingZeros[] = {
57     0x0c, 0x00, // nla_len = 12
58     0x01, 0x00, // nla_type
59     'w', 'l', 'a', 'n', '0', '\0', '\0', '\0'
60 };
61 const uint8_t kBufferContainsStringWithoutTrailingZero[] = {
62     0x09, 0x00, // nla_len = 9
63     0x01, 0x00, // nla_type
64     'w', 'l', 'a', 'n', '0',
65     0x00, 0x00, 0x00  // padding
66 };
67 
68 const uint8_t kBufferContainsListOfAttributes[] = {
69     0x28, 0x00, // nla_len = 40
70     0x01, 0x00, // nla_type
71     // List of attributes:
72     // They have attribute id from 0 to N.
73     0x0a, 0x00, // nla_len = 10
74     0x00, 0x00, // nla_type = 0
75     'f', 'i', 'r', 's', 't','\0',
76     0x00, 0x00,  // padding
77     0x0b, 0x00, // nla_len = 11
78     0x01, 0x00, // nla_type = 1
79     's', 'e', 'c', 'o', 'n', 'd','\0',
80     0x00, // padding
81     0x0a, 0x00, // nla_len = 10
82     0x02, 0x00, // nla_type = 2
83     't', 'h', 'i', 'r', 'd','\0',
84     0x00, 0x00, // padding
85 };
86 
87 const uint8_t kBufferContainsListOfNestedAttributes[] = {
88     0x28, 0x00, // nla_len = 40
89     0x01, 0x00, // nla_type
90 
91     // List of nested attributes:
92     // They have attribute id from 0 to N.
93 
94     // Nested attribute 1:
95     0x0c, 0x00, // nla_len = 12
96     0x00, 0x00, // nla_type = 0
97         0x06, 0x00, // nla_len = 6
98         0x01, 0x00, // nla_type
99         0x05, 0x00, // uint16_t attribute with value 5
100         0x00, 0x00, // padding
101 
102     // Nested attribute 2:
103     0x0c, 0x00, // nla_len = 12
104     0x01, 0x00, // nla_type = 1
105         0x08, 0x00, // nla_len = 8
106         0x01, 0x00, // nla_type
107         0x0a, 0x00,
108         0x00, 0x00, // uint32_t attribute with value 10
109 
110     // Nested attribute 3:
111     0x0c, 0x00, // nla_len = 12
112     0x02, 0x00, // nla_type = 2
113         0x05, 0x00, // nla_len = 5
114         0x01, 0x00, // nla_type
115         0x08, 0x00, // uint8_t attribute with value 8
116         0x00, 0x00, // padding
117 };
118 
119 }  // namespace
120 
TEST(NL80211AttributeTest,U8AttributesSeriallizeCorrectly)121 TEST(NL80211AttributeTest,U8AttributesSeriallizeCorrectly) {
122   NL80211Attr<uint8_t> u8_attr(1, kU8Value1);
123   EXPECT_EQ(u8_attr.GetValue(), kU8Value1);
124 }
125 
TEST(NL80211AttributeTest,U16AttributesSeriallizeCorrectly)126 TEST(NL80211AttributeTest,U16AttributesSeriallizeCorrectly) {
127   NL80211Attr<uint16_t> u16_attr(1, kU16Value1);
128   EXPECT_EQ(u16_attr.GetValue(), kU16Value1);
129 }
130 
TEST(NL80211AttributeTest,U32AttributesSeriallizeCorrectly)131 TEST(NL80211AttributeTest,U32AttributesSeriallizeCorrectly) {
132   NL80211Attr<uint32_t> u32_attr(1, kU32Value1);
133   EXPECT_EQ(u32_attr.GetValue(), kU32Value1);
134 }
135 
TEST(NL80211AttributeTest,StringAttributesSeriallizeCorrectly)136 TEST(NL80211AttributeTest,StringAttributesSeriallizeCorrectly) {
137   NL80211Attr<std::string> str_attr(1, kIFName);
138   EXPECT_EQ(str_attr.GetValue(), kIFName);
139 }
140 
TEST(NL80211AttributeTest,ByteVectorsSeriallizeCorrectly)141 TEST(NL80211AttributeTest, ByteVectorsSeriallizeCorrectly) {
142   std::vector<uint8_t> mac_address(
143       kMacAddress,
144       kMacAddress + sizeof(kMacAddress));
145   NL80211Attr<std::vector<uint8_t>> byte_vector_attr(1, mac_address);
146   EXPECT_EQ(byte_vector_attr.GetValue(), mac_address);
147 }
148 
TEST(NL80211AttributeTest,CanGetNestedAttributes)149 TEST(NL80211AttributeTest, CanGetNestedAttributes) {
150   NL80211NestedAttr nested_attr(1);
151   NL80211Attr<uint32_t> u32_attr_1(1, kU32Value1);
152   NL80211Attr<uint32_t> u32_attr_2(2, kU32Value2);
153 
154   nested_attr.AddAttribute(u32_attr_1);
155   nested_attr.AddAttribute(u32_attr_2);
156 
157   EXPECT_TRUE(nested_attr.HasAttribute(1));
158   EXPECT_TRUE(nested_attr.HasAttribute(2));
159 
160   uint32_t attr_value;
161   EXPECT_TRUE(nested_attr.GetAttributeValue(1, &attr_value));
162   EXPECT_EQ(attr_value, kU32Value1);
163   EXPECT_TRUE(nested_attr.GetAttributeValue(2, &attr_value));
164   EXPECT_EQ(attr_value, kU32Value2);
165 }
166 
TEST(NL80211AttributeTest,CannotGetDoubleNestedAttributes)167 TEST(NL80211AttributeTest, CannotGetDoubleNestedAttributes) {
168   NL80211NestedAttr nested_attr(1);
169   NL80211NestedAttr deeper_nested_attr(2);
170   NL80211Attr<uint32_t> u32_attr_1(3, kU32Value1);
171 
172   deeper_nested_attr.AddAttribute(u32_attr_1);
173   nested_attr.AddAttribute(deeper_nested_attr);
174 
175   EXPECT_FALSE(nested_attr.HasAttribute(3));
176 }
177 
TEST(NL80211AttributeTest,CannotGetMissingAttribute)178 TEST(NL80211AttributeTest, CannotGetMissingAttribute) {
179   NL80211NestedAttr nested_attr(1);
180   NL80211Attr<uint32_t> u32_attr_1(1, kU32Value1);
181 
182   nested_attr.AddAttribute(u32_attr_1);
183 
184   uint32_t attr_value;
185   EXPECT_FALSE(nested_attr.HasAttribute(2));
186   EXPECT_FALSE(nested_attr.GetAttributeValue(2, &attr_value));
187 }
188 
TEST(NL80211AttributeTest,CannotGetAttributeWithWrongType)189 TEST(NL80211AttributeTest, CannotGetAttributeWithWrongType) {
190   NL80211NestedAttr nested_attr(1);
191   NL80211Attr<uint32_t> u32_attr_1(1, kU32Value1);
192 
193   nested_attr.AddAttribute(u32_attr_1);
194 
195   uint16_t attr_value;
196   EXPECT_TRUE(nested_attr.HasAttribute(1));
197   EXPECT_FALSE(nested_attr.GetAttributeValue(1, &attr_value));
198 }
199 
200 
TEST(NL80211AttributeTest,InvalidU32AttributeWithEmptyBuffer)201 TEST(NL80211AttributeTest, InvalidU32AttributeWithEmptyBuffer) {
202   std::vector<uint8_t> buffer;
203   NL80211Attr<uint32_t> invalid_attr(buffer);
204   EXPECT_FALSE(invalid_attr.IsValid());
205 }
206 
TEST(NL80211AttributeTest,InvalidU32AttributeWithBrokenBuffer)207 TEST(NL80211AttributeTest, InvalidU32AttributeWithBrokenBuffer) {
208   std::vector<uint8_t> buffer(
209       kBrokenBuffer,
210       kBrokenBuffer + sizeof(kBrokenBuffer));
211   NL80211Attr<uint32_t> invalid_attr(buffer);
212   EXPECT_FALSE(invalid_attr.IsValid());
213 }
214 
TEST(NL80211AttributeTest,InvalidU16AttributeWithU32Buffer)215 TEST(NL80211AttributeTest, InvalidU16AttributeWithU32Buffer) {
216   std::vector<uint8_t> buffer(
217       kValidU32AttrBuffer,
218       kValidU32AttrBuffer + sizeof(kValidU32AttrBuffer));
219   NL80211Attr<uint32_t> valid_attr(buffer);
220   NL80211Attr<uint16_t> invalid_attr(buffer);
221   EXPECT_TRUE(valid_attr.IsValid());
222   EXPECT_FALSE(invalid_attr.IsValid());
223 }
224 
TEST(NL80211AttributeTest,InitStringAttributeWithTrailingZeroFromBuffer)225 TEST(NL80211AttributeTest, InitStringAttributeWithTrailingZeroFromBuffer) {
226   std::vector<uint8_t> buffer(
227       kBufferContainsStringWithTrailingZero,
228       kBufferContainsStringWithTrailingZero +
229           sizeof(kBufferContainsStringWithTrailingZero));
230   NL80211Attr<std::string> str_attr(buffer);
231   EXPECT_EQ("wlan0", str_attr.GetValue());
232 }
233 
TEST(NL80211AttributeTest,InitStringAttributeWithTrailingZerosFromBuffer)234 TEST(NL80211AttributeTest, InitStringAttributeWithTrailingZerosFromBuffer) {
235   std::vector<uint8_t> buffer(
236       kBufferContainsStringWithTrailingZeros,
237       kBufferContainsStringWithTrailingZeros +
238           sizeof(kBufferContainsStringWithTrailingZeros));
239   NL80211Attr<std::string> str_attr(buffer);
240   EXPECT_EQ("wlan0", str_attr.GetValue());
241 }
242 
TEST(NL80211AttributeTest,InitStringAttributeWithoutTrailingZeroFromBuffer)243 TEST(NL80211AttributeTest, InitStringAttributeWithoutTrailingZeroFromBuffer) {
244   std::vector<uint8_t> buffer(
245       kBufferContainsStringWithoutTrailingZero,
246       kBufferContainsStringWithoutTrailingZero +
247           sizeof(kBufferContainsStringWithoutTrailingZero));
248   NL80211Attr<std::string> str_attr(buffer);
249   EXPECT_EQ("wlan0", str_attr.GetValue());
250 }
251 
TEST(NL80211AttributeTest,GetListOfStringsFromBuffer)252 TEST(NL80211AttributeTest, GetListOfStringsFromBuffer) {
253   std::vector<uint8_t> buffer(
254       kBufferContainsListOfAttributes,
255       kBufferContainsListOfAttributes +
256           sizeof(kBufferContainsListOfAttributes));
257   std::vector<std::string> strs;
258   std::vector<std::string> expected_strs = {"first", "second", "third"};
259   NL80211NestedAttr nested_attr(buffer);
260   nested_attr.GetListOfAttributeValues(&strs);
261   EXPECT_EQ(expected_strs, strs);
262 }
263 
TEST(NL80211AttributeTest,GetListOfAttributesFromBuffer)264 TEST(NL80211AttributeTest, GetListOfAttributesFromBuffer) {
265   std::vector<uint8_t> buffer(
266       kBufferContainsListOfAttributes,
267       kBufferContainsListOfAttributes +
268           sizeof(kBufferContainsListOfAttributes));
269 
270   std::vector<NL80211Attr<std::string>> attrs;
271   NL80211NestedAttr attr(buffer);
272   EXPECT_TRUE(attr.GetListOfAttributes(&attrs));
273   EXPECT_TRUE(attrs.size() == 3);
274   ASSERT_EQ(0, attrs[0].GetAttributeId());
275   ASSERT_EQ(1, attrs[1].GetAttributeId());
276   ASSERT_EQ(2, attrs[2].GetAttributeId());
277   ASSERT_EQ("first", attrs[0].GetValue());
278   ASSERT_EQ("second", attrs[1].GetValue());
279   ASSERT_EQ("third", attrs[2].GetValue());
280 }
281 
TEST(NL80211AttributeTest,GetListOfNestedAttributesFromBuffer)282 TEST(NL80211AttributeTest, GetListOfNestedAttributesFromBuffer) {
283   std::vector<uint8_t> buffer(
284       kBufferContainsListOfNestedAttributes,
285       kBufferContainsListOfNestedAttributes +
286           sizeof(kBufferContainsListOfNestedAttributes));
287   std::vector<NL80211NestedAttr> nested_attrs;
288   NL80211NestedAttr attr(buffer);
289   EXPECT_TRUE(attr.GetListOfNestedAttributes(&nested_attrs));
290   EXPECT_TRUE(nested_attrs.size() == 3);
291   uint16_t value1 = 0;
292   uint32_t value2 = 0;
293   uint8_t value3 = 0;
294   ASSERT_TRUE(nested_attrs[0].GetAttributeValue(1, &value1));
295   ASSERT_TRUE(nested_attrs[1].GetAttributeValue(1, &value2));
296   ASSERT_TRUE(nested_attrs[2].GetAttributeValue(1, &value3));
297   EXPECT_TRUE(value1 == 5);
298   EXPECT_TRUE(value2 == 10);
299   EXPECT_TRUE(value3 == 8);
300 }
301 
TEST(NL80211AttributeTest,MergeAttributes)302 TEST(NL80211AttributeTest, MergeAttributes) {
303   NL80211Attr<std::vector<uint8_t>> attr1(1, {'a', 'b', 'c'});
304   NL80211Attr<std::vector<uint8_t>> attr2(1, {'d', 'e'});
305   ASSERT_TRUE(attr1.Merge(attr2));
306   std::vector<uint8_t> expected_value{{'a', 'b', 'c', 'd', 'e'}};
307   EXPECT_EQ(expected_value, attr1.GetValue());
308 }
309 
TEST(NL80211AttributeTest,CannotMergeInvalidAttributeWithBrokenBuffer)310 TEST(NL80211AttributeTest, CannotMergeInvalidAttributeWithBrokenBuffer) {
311   NL80211Attr<std::vector<uint8_t>> valid_attr(1, {'a', 'b', 'c'});
312   std::vector<uint8_t> broken_buffer(
313       kBrokenBuffer,
314       kBrokenBuffer + sizeof(kBrokenBuffer));
315   NL80211Attr<std::vector<uint8_t>> invalid_attr(broken_buffer);
316   EXPECT_FALSE(valid_attr.Merge(invalid_attr));
317 }
318 
TEST(NL80211AttributeTest,CannotMergeAttributesWithDifferentIds)319 TEST(NL80211AttributeTest, CannotMergeAttributesWithDifferentIds) {
320   NL80211Attr<std::vector<uint8_t>> attr1(1, {'a', 'b', 'c'});
321   NL80211Attr<std::vector<uint8_t>> attr2(2, {'d', 'e', 'f'});
322   EXPECT_FALSE(attr1.Merge(attr2));
323 }
324 
TEST(NL80211AttributeTest,MergeNestedAttributes)325 TEST(NL80211AttributeTest, MergeNestedAttributes) {
326   NL80211NestedAttr nested_attr1(0);
327   NL80211NestedAttr nested_attr2(0);
328   NL80211Attr<uint32_t> uint32_attr1(1, kU32Value1);
329   NL80211Attr<uint32_t> uint32_attr2(2, kU32Value2);
330   nested_attr1.AddAttribute(uint32_attr1);
331   nested_attr2.AddAttribute(uint32_attr2);
332   ASSERT_TRUE(nested_attr1.Merge(nested_attr2));
333 
334   uint32_t value1, value2;
335   EXPECT_TRUE(nested_attr1.GetAttributeValue(1, &value1));
336   EXPECT_TRUE(value1 == kU32Value1);
337   EXPECT_TRUE(nested_attr1.GetAttributeValue(2, &value2));
338   EXPECT_TRUE(value2 == kU32Value2);
339 }
340 
341 }  // namespace wificond
342 }  // namespace android
343