xref: /aosp_15_r20/external/openthread/tests/unit/test_mac_frame.cpp (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker  *  Copyright (c) 2016, The OpenThread Authors.
3*cfb92d14SAndroid Build Coastguard Worker  *  All rights reserved.
4*cfb92d14SAndroid Build Coastguard Worker  *
5*cfb92d14SAndroid Build Coastguard Worker  *  Redistribution and use in source and binary forms, with or without
6*cfb92d14SAndroid Build Coastguard Worker  *  modification, are permitted provided that the following conditions are met:
7*cfb92d14SAndroid Build Coastguard Worker  *  1. Redistributions of source code must retain the above copyright
8*cfb92d14SAndroid Build Coastguard Worker  *     notice, this list of conditions and the following disclaimer.
9*cfb92d14SAndroid Build Coastguard Worker  *  2. Redistributions in binary form must reproduce the above copyright
10*cfb92d14SAndroid Build Coastguard Worker  *     notice, this list of conditions and the following disclaimer in the
11*cfb92d14SAndroid Build Coastguard Worker  *     documentation and/or other materials provided with the distribution.
12*cfb92d14SAndroid Build Coastguard Worker  *  3. Neither the name of the copyright holder nor the
13*cfb92d14SAndroid Build Coastguard Worker  *     names of its contributors may be used to endorse or promote products
14*cfb92d14SAndroid Build Coastguard Worker  *     derived from this software without specific prior written permission.
15*cfb92d14SAndroid Build Coastguard Worker  *
16*cfb92d14SAndroid Build Coastguard Worker  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*cfb92d14SAndroid Build Coastguard Worker  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*cfb92d14SAndroid Build Coastguard Worker  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*cfb92d14SAndroid Build Coastguard Worker  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20*cfb92d14SAndroid Build Coastguard Worker  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*cfb92d14SAndroid Build Coastguard Worker  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*cfb92d14SAndroid Build Coastguard Worker  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*cfb92d14SAndroid Build Coastguard Worker  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*cfb92d14SAndroid Build Coastguard Worker  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*cfb92d14SAndroid Build Coastguard Worker  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*cfb92d14SAndroid Build Coastguard Worker  *  POSSIBILITY OF SUCH DAMAGE.
27*cfb92d14SAndroid Build Coastguard Worker  */
28*cfb92d14SAndroid Build Coastguard Worker 
29*cfb92d14SAndroid Build Coastguard Worker #include "common/code_utils.hpp"
30*cfb92d14SAndroid Build Coastguard Worker #include "common/debug.hpp"
31*cfb92d14SAndroid Build Coastguard Worker #include "mac/mac.hpp"
32*cfb92d14SAndroid Build Coastguard Worker #include "mac/mac_frame.hpp"
33*cfb92d14SAndroid Build Coastguard Worker #include "radio/radio.hpp"
34*cfb92d14SAndroid Build Coastguard Worker 
35*cfb92d14SAndroid Build Coastguard Worker #include "test_platform.h"
36*cfb92d14SAndroid Build Coastguard Worker #include "test_util.hpp"
37*cfb92d14SAndroid Build Coastguard Worker 
38*cfb92d14SAndroid Build Coastguard Worker namespace ot {
39*cfb92d14SAndroid Build Coastguard Worker 
CompareReversed(const uint8_t * aFirst,const uint8_t * aSecond,uint16_t aLength)40*cfb92d14SAndroid Build Coastguard Worker bool CompareReversed(const uint8_t *aFirst, const uint8_t *aSecond, uint16_t aLength)
41*cfb92d14SAndroid Build Coastguard Worker {
42*cfb92d14SAndroid Build Coastguard Worker     bool matches = true;
43*cfb92d14SAndroid Build Coastguard Worker 
44*cfb92d14SAndroid Build Coastguard Worker     for (uint16_t i = 0; i < aLength; i++)
45*cfb92d14SAndroid Build Coastguard Worker     {
46*cfb92d14SAndroid Build Coastguard Worker         if (aFirst[i] != aSecond[aLength - 1 - i])
47*cfb92d14SAndroid Build Coastguard Worker         {
48*cfb92d14SAndroid Build Coastguard Worker             matches = false;
49*cfb92d14SAndroid Build Coastguard Worker             break;
50*cfb92d14SAndroid Build Coastguard Worker         }
51*cfb92d14SAndroid Build Coastguard Worker     }
52*cfb92d14SAndroid Build Coastguard Worker 
53*cfb92d14SAndroid Build Coastguard Worker     return matches;
54*cfb92d14SAndroid Build Coastguard Worker }
55*cfb92d14SAndroid Build Coastguard Worker 
CompareAddresses(const Mac::Address & aFirst,const Mac::Address & aSecond)56*cfb92d14SAndroid Build Coastguard Worker bool CompareAddresses(const Mac::Address &aFirst, const Mac::Address &aSecond)
57*cfb92d14SAndroid Build Coastguard Worker {
58*cfb92d14SAndroid Build Coastguard Worker     bool matches = false;
59*cfb92d14SAndroid Build Coastguard Worker 
60*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(aFirst.GetType() == aSecond.GetType());
61*cfb92d14SAndroid Build Coastguard Worker 
62*cfb92d14SAndroid Build Coastguard Worker     switch (aFirst.GetType())
63*cfb92d14SAndroid Build Coastguard Worker     {
64*cfb92d14SAndroid Build Coastguard Worker     case Mac::Address::kTypeNone:
65*cfb92d14SAndroid Build Coastguard Worker         break;
66*cfb92d14SAndroid Build Coastguard Worker     case Mac::Address::kTypeShort:
67*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(aFirst.GetShort() == aSecond.GetShort());
68*cfb92d14SAndroid Build Coastguard Worker         break;
69*cfb92d14SAndroid Build Coastguard Worker     case Mac::Address::kTypeExtended:
70*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(aFirst.GetExtended() == aSecond.GetExtended());
71*cfb92d14SAndroid Build Coastguard Worker         break;
72*cfb92d14SAndroid Build Coastguard Worker     }
73*cfb92d14SAndroid Build Coastguard Worker 
74*cfb92d14SAndroid Build Coastguard Worker     matches = true;
75*cfb92d14SAndroid Build Coastguard Worker 
76*cfb92d14SAndroid Build Coastguard Worker exit:
77*cfb92d14SAndroid Build Coastguard Worker     return matches;
78*cfb92d14SAndroid Build Coastguard Worker }
79*cfb92d14SAndroid Build Coastguard Worker 
TestMacAddress(void)80*cfb92d14SAndroid Build Coastguard Worker void TestMacAddress(void)
81*cfb92d14SAndroid Build Coastguard Worker {
82*cfb92d14SAndroid Build Coastguard Worker     const uint8_t           kExtAddr[OT_EXT_ADDRESS_SIZE] = {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0};
83*cfb92d14SAndroid Build Coastguard Worker     const Mac::ShortAddress kShortAddr                    = 0x1234;
84*cfb92d14SAndroid Build Coastguard Worker 
85*cfb92d14SAndroid Build Coastguard Worker     Instance       *instance;
86*cfb92d14SAndroid Build Coastguard Worker     Mac::Address    addr;
87*cfb92d14SAndroid Build Coastguard Worker     Mac::ExtAddress extAddr;
88*cfb92d14SAndroid Build Coastguard Worker     uint8_t         buffer[OT_EXT_ADDRESS_SIZE];
89*cfb92d14SAndroid Build Coastguard Worker 
90*cfb92d14SAndroid Build Coastguard Worker     instance = testInitInstance();
91*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(instance != nullptr, "nullptr instance\n");
92*cfb92d14SAndroid Build Coastguard Worker 
93*cfb92d14SAndroid Build Coastguard Worker     // Mac::ExtAddress
94*cfb92d14SAndroid Build Coastguard Worker 
95*cfb92d14SAndroid Build Coastguard Worker     extAddr.GenerateRandom();
96*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(extAddr.IsLocal(), "Random Extended Address should have its Local bit set");
97*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!extAddr.IsGroup(), "Random Extended Address should not have its Group bit set");
98*cfb92d14SAndroid Build Coastguard Worker 
99*cfb92d14SAndroid Build Coastguard Worker     extAddr.CopyTo(buffer);
100*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(extAddr.m8, buffer, OT_EXT_ADDRESS_SIZE) == 0);
101*cfb92d14SAndroid Build Coastguard Worker 
102*cfb92d14SAndroid Build Coastguard Worker     extAddr.CopyTo(buffer, Mac::ExtAddress::kReverseByteOrder);
103*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(CompareReversed(extAddr.m8, buffer, OT_EXT_ADDRESS_SIZE));
104*cfb92d14SAndroid Build Coastguard Worker 
105*cfb92d14SAndroid Build Coastguard Worker     extAddr.Set(kExtAddr);
106*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(memcmp(extAddr.m8, kExtAddr, OT_EXT_ADDRESS_SIZE) == 0);
107*cfb92d14SAndroid Build Coastguard Worker 
108*cfb92d14SAndroid Build Coastguard Worker     extAddr.Set(kExtAddr, Mac::ExtAddress::kReverseByteOrder);
109*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(CompareReversed(extAddr.m8, kExtAddr, OT_EXT_ADDRESS_SIZE));
110*cfb92d14SAndroid Build Coastguard Worker 
111*cfb92d14SAndroid Build Coastguard Worker     extAddr.SetLocal(true);
112*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(extAddr.IsLocal());
113*cfb92d14SAndroid Build Coastguard Worker     extAddr.SetLocal(false);
114*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!extAddr.IsLocal());
115*cfb92d14SAndroid Build Coastguard Worker     extAddr.ToggleLocal();
116*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(extAddr.IsLocal());
117*cfb92d14SAndroid Build Coastguard Worker     extAddr.ToggleLocal();
118*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!extAddr.IsLocal());
119*cfb92d14SAndroid Build Coastguard Worker 
120*cfb92d14SAndroid Build Coastguard Worker     extAddr.SetGroup(true);
121*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(extAddr.IsGroup());
122*cfb92d14SAndroid Build Coastguard Worker     extAddr.SetGroup(false);
123*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!extAddr.IsGroup());
124*cfb92d14SAndroid Build Coastguard Worker     extAddr.ToggleGroup();
125*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(extAddr.IsGroup());
126*cfb92d14SAndroid Build Coastguard Worker     extAddr.ToggleGroup();
127*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!extAddr.IsGroup());
128*cfb92d14SAndroid Build Coastguard Worker 
129*cfb92d14SAndroid Build Coastguard Worker     // Mac::Address
130*cfb92d14SAndroid Build Coastguard Worker 
131*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(addr.IsNone(), "Address constructor failed");
132*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(addr.GetType() == Mac::Address::kTypeNone);
133*cfb92d14SAndroid Build Coastguard Worker 
134*cfb92d14SAndroid Build Coastguard Worker     addr.SetShort(kShortAddr);
135*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(addr.GetType() == Mac::Address::kTypeShort);
136*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(addr.IsShort(), "Address::SetShort() failed");
137*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!addr.IsExtended(), "Address::SetShort() failed");
138*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(addr.GetShort() == kShortAddr);
139*cfb92d14SAndroid Build Coastguard Worker 
140*cfb92d14SAndroid Build Coastguard Worker     addr.SetExtended(extAddr);
141*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(addr.GetType() == Mac::Address::kTypeExtended);
142*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!addr.IsShort(), "Address::SetExtended() failed");
143*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(addr.IsExtended(), "Address::SetExtended() failed");
144*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(addr.GetExtended() == extAddr);
145*cfb92d14SAndroid Build Coastguard Worker 
146*cfb92d14SAndroid Build Coastguard Worker     addr.SetExtended(extAddr.m8, Mac::ExtAddress::kReverseByteOrder);
147*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(addr.GetType() == Mac::Address::kTypeExtended);
148*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!addr.IsShort(), "Address::SetExtended() failed");
149*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(addr.IsExtended(), "Address::SetExtended() failed");
150*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(CompareReversed(addr.GetExtended().m8, extAddr.m8, OT_EXT_ADDRESS_SIZE),
151*cfb92d14SAndroid Build Coastguard Worker                  "Address::SetExtended() reverse byte order failed");
152*cfb92d14SAndroid Build Coastguard Worker 
153*cfb92d14SAndroid Build Coastguard Worker     addr.SetNone();
154*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(addr.GetType() == Mac::Address::kTypeNone);
155*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(addr.IsNone(), "Address:SetNone() failed");
156*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!addr.IsShort(), "Address::SetNone() failed");
157*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!addr.IsExtended(), "Address::SetNone() failed");
158*cfb92d14SAndroid Build Coastguard Worker 
159*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!addr.IsBroadcast(), "Address:SetNone() failed");
160*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!addr.IsShortAddrInvalid());
161*cfb92d14SAndroid Build Coastguard Worker 
162*cfb92d14SAndroid Build Coastguard Worker     addr.SetExtended(extAddr);
163*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!addr.IsBroadcast());
164*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!addr.IsShortAddrInvalid());
165*cfb92d14SAndroid Build Coastguard Worker 
166*cfb92d14SAndroid Build Coastguard Worker     addr.SetShort(kShortAddr);
167*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!addr.IsBroadcast());
168*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!addr.IsShortAddrInvalid());
169*cfb92d14SAndroid Build Coastguard Worker 
170*cfb92d14SAndroid Build Coastguard Worker     addr.SetShort(Mac::kShortAddrBroadcast);
171*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(addr.IsBroadcast());
172*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!addr.IsShortAddrInvalid());
173*cfb92d14SAndroid Build Coastguard Worker 
174*cfb92d14SAndroid Build Coastguard Worker     addr.SetShort(Mac::kShortAddrInvalid);
175*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!addr.IsBroadcast());
176*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(addr.IsShortAddrInvalid());
177*cfb92d14SAndroid Build Coastguard Worker 
178*cfb92d14SAndroid Build Coastguard Worker     testFreeInstance(instance);
179*cfb92d14SAndroid Build Coastguard Worker }
180*cfb92d14SAndroid Build Coastguard Worker 
TestMacHeader(void)181*cfb92d14SAndroid Build Coastguard Worker void TestMacHeader(void)
182*cfb92d14SAndroid Build Coastguard Worker {
183*cfb92d14SAndroid Build Coastguard Worker     enum AddrType : uint8_t
184*cfb92d14SAndroid Build Coastguard Worker     {
185*cfb92d14SAndroid Build Coastguard Worker         kNoneAddr,
186*cfb92d14SAndroid Build Coastguard Worker         kShrtAddr,
187*cfb92d14SAndroid Build Coastguard Worker         kExtdAddr,
188*cfb92d14SAndroid Build Coastguard Worker     };
189*cfb92d14SAndroid Build Coastguard Worker 
190*cfb92d14SAndroid Build Coastguard Worker     enum PanIdMode
191*cfb92d14SAndroid Build Coastguard Worker     {
192*cfb92d14SAndroid Build Coastguard Worker         kNoPanId,
193*cfb92d14SAndroid Build Coastguard Worker         kUsePanId1,
194*cfb92d14SAndroid Build Coastguard Worker         kUsePanId2,
195*cfb92d14SAndroid Build Coastguard Worker     };
196*cfb92d14SAndroid Build Coastguard Worker 
197*cfb92d14SAndroid Build Coastguard Worker     struct TestCase
198*cfb92d14SAndroid Build Coastguard Worker     {
199*cfb92d14SAndroid Build Coastguard Worker         Mac::Frame::Version       mVersion;
200*cfb92d14SAndroid Build Coastguard Worker         AddrType                  mSrcAddrType;
201*cfb92d14SAndroid Build Coastguard Worker         PanIdMode                 mSrcPanIdMode;
202*cfb92d14SAndroid Build Coastguard Worker         AddrType                  mDstAddrType;
203*cfb92d14SAndroid Build Coastguard Worker         PanIdMode                 mDstPanIdMode;
204*cfb92d14SAndroid Build Coastguard Worker         Mac::Frame::SecurityLevel mSecurity;
205*cfb92d14SAndroid Build Coastguard Worker         Mac::Frame::KeyIdMode     mKeyIdMode;
206*cfb92d14SAndroid Build Coastguard Worker         uint8_t                   mHeaderLength;
207*cfb92d14SAndroid Build Coastguard Worker         uint8_t                   mFooterLength;
208*cfb92d14SAndroid Build Coastguard Worker         bool                      mSuppressSequence;
209*cfb92d14SAndroid Build Coastguard Worker     };
210*cfb92d14SAndroid Build Coastguard Worker 
211*cfb92d14SAndroid Build Coastguard Worker     static constexpr Mac::Frame::Version kVer2006 = Mac::Frame::kVersion2006;
212*cfb92d14SAndroid Build Coastguard Worker     static constexpr Mac::Frame::Version kVer2015 = Mac::Frame::kVersion2015;
213*cfb92d14SAndroid Build Coastguard Worker 
214*cfb92d14SAndroid Build Coastguard Worker     static constexpr Mac::Frame::SecurityLevel kNoSec = Mac::Frame::kSecurityNone;
215*cfb92d14SAndroid Build Coastguard Worker     static constexpr Mac::Frame::SecurityLevel kMic32 = Mac::Frame::kSecurityMic32;
216*cfb92d14SAndroid Build Coastguard Worker 
217*cfb92d14SAndroid Build Coastguard Worker     static constexpr Mac::Frame::KeyIdMode kModeId1 = Mac::Frame::kKeyIdMode1;
218*cfb92d14SAndroid Build Coastguard Worker     static constexpr Mac::Frame::KeyIdMode kModeId2 = Mac::Frame::kKeyIdMode2;
219*cfb92d14SAndroid Build Coastguard Worker 
220*cfb92d14SAndroid Build Coastguard Worker     static const char *kAddrTypeStrings[]  = {"None", "Short", "Extd"};
221*cfb92d14SAndroid Build Coastguard Worker     static const char *kPanIdModeStrings[] = {"No", "Id1", "Id2"};
222*cfb92d14SAndroid Build Coastguard Worker 
223*cfb92d14SAndroid Build Coastguard Worker     static constexpr TestCase kTestCases[] = {
224*cfb92d14SAndroid Build Coastguard Worker         {kVer2006, kNoneAddr, kNoPanId, kNoneAddr, kNoPanId, kNoSec, kModeId1, 3, 2},
225*cfb92d14SAndroid Build Coastguard Worker         {kVer2006, kShrtAddr, kUsePanId1, kNoneAddr, kNoPanId, kNoSec, kModeId1, 7, 2},
226*cfb92d14SAndroid Build Coastguard Worker         {kVer2006, kExtdAddr, kUsePanId1, kNoneAddr, kNoPanId, kNoSec, kModeId1, 13, 2},
227*cfb92d14SAndroid Build Coastguard Worker         {kVer2006, kNoneAddr, kNoPanId, kShrtAddr, kUsePanId1, kNoSec, kModeId1, 7, 2},
228*cfb92d14SAndroid Build Coastguard Worker         {kVer2006, kNoneAddr, kNoPanId, kExtdAddr, kUsePanId1, kNoSec, kModeId1, 13, 2},
229*cfb92d14SAndroid Build Coastguard Worker         {kVer2006, kShrtAddr, kUsePanId1, kShrtAddr, kUsePanId2, kNoSec, kModeId1, 11, 2},
230*cfb92d14SAndroid Build Coastguard Worker         {kVer2006, kShrtAddr, kUsePanId1, kExtdAddr, kUsePanId2, kNoSec, kModeId1, 17, 2},
231*cfb92d14SAndroid Build Coastguard Worker         {kVer2006, kExtdAddr, kUsePanId1, kShrtAddr, kUsePanId2, kNoSec, kModeId1, 17, 2},
232*cfb92d14SAndroid Build Coastguard Worker         {kVer2006, kExtdAddr, kUsePanId1, kExtdAddr, kUsePanId2, kNoSec, kModeId1, 23, 2},
233*cfb92d14SAndroid Build Coastguard Worker         {kVer2006, kShrtAddr, kUsePanId1, kShrtAddr, kUsePanId1, kNoSec, kModeId1, 9, 2},
234*cfb92d14SAndroid Build Coastguard Worker         {kVer2006, kShrtAddr, kUsePanId1, kExtdAddr, kUsePanId1, kNoSec, kModeId1, 15, 2},
235*cfb92d14SAndroid Build Coastguard Worker         {kVer2006, kExtdAddr, kUsePanId1, kShrtAddr, kUsePanId1, kNoSec, kModeId1, 15, 2},
236*cfb92d14SAndroid Build Coastguard Worker         {kVer2006, kExtdAddr, kUsePanId1, kExtdAddr, kUsePanId1, kNoSec, kModeId1, 21, 2},
237*cfb92d14SAndroid Build Coastguard Worker         {kVer2006, kShrtAddr, kUsePanId1, kShrtAddr, kUsePanId1, kMic32, kModeId1, 15, 6},
238*cfb92d14SAndroid Build Coastguard Worker         {kVer2006, kShrtAddr, kUsePanId1, kShrtAddr, kUsePanId1, kMic32, kModeId2, 19, 6},
239*cfb92d14SAndroid Build Coastguard Worker 
240*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kNoneAddr, kNoPanId, kNoneAddr, kNoPanId, kNoSec, kModeId1, 3, 2},
241*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kShrtAddr, kUsePanId1, kNoneAddr, kNoPanId, kNoSec, kModeId1, 7, 2},
242*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kExtdAddr, kUsePanId1, kNoneAddr, kNoPanId, kNoSec, kModeId1, 13, 2},
243*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kNoneAddr, kNoPanId, kShrtAddr, kUsePanId1, kNoSec, kModeId1, 7, 2},
244*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kNoneAddr, kNoPanId, kExtdAddr, kUsePanId1, kNoSec, kModeId1, 13, 2},
245*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kShrtAddr, kUsePanId1, kShrtAddr, kUsePanId2, kNoSec, kModeId1, 11, 2},
246*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kShrtAddr, kUsePanId1, kExtdAddr, kUsePanId2, kNoSec, kModeId1, 17, 2},
247*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kExtdAddr, kUsePanId1, kShrtAddr, kUsePanId2, kNoSec, kModeId1, 17, 2},
248*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kShrtAddr, kUsePanId1, kShrtAddr, kUsePanId1, kNoSec, kModeId1, 9, 2},
249*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kShrtAddr, kUsePanId1, kExtdAddr, kUsePanId1, kNoSec, kModeId1, 15, 2},
250*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kExtdAddr, kUsePanId1, kShrtAddr, kUsePanId1, kNoSec, kModeId1, 15, 2},
251*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kExtdAddr, kUsePanId1, kExtdAddr, kUsePanId1, kNoSec, kModeId1, 21, 2},
252*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kShrtAddr, kUsePanId1, kShrtAddr, kUsePanId1, kMic32, kModeId1, 15, 6},
253*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kShrtAddr, kUsePanId1, kShrtAddr, kUsePanId1, kMic32, kModeId2, 19, 6},
254*cfb92d14SAndroid Build Coastguard Worker 
255*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kNoneAddr, kNoPanId, kShrtAddr, kNoPanId, kNoSec, kModeId1, 5, 2},
256*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kNoneAddr, kNoPanId, kShrtAddr, kNoPanId, kMic32, kModeId1, 11, 6},
257*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kNoneAddr, kNoPanId, kNoneAddr, kUsePanId1, kNoSec, kModeId1, 5, 2},
258*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kNoneAddr, kNoPanId, kNoneAddr, kUsePanId1, kMic32, kModeId1, 11, 6},
259*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kNoneAddr, kNoPanId, kShrtAddr, kNoPanId, kNoSec, kModeId1, 5, 2},
260*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kNoneAddr, kNoPanId, kExtdAddr, kNoPanId, kNoSec, kModeId1, 11, 2},
261*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kNoneAddr, kNoPanId, kShrtAddr, kNoPanId, kMic32, kModeId1, 11, 6},
262*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kNoneAddr, kNoPanId, kExtdAddr, kNoPanId, kMic32, kModeId1, 17, 6},
263*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kShrtAddr, kNoPanId, kNoneAddr, kNoPanId, kNoSec, kModeId1, 5, 2},
264*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kShrtAddr, kNoPanId, kNoneAddr, kNoPanId, kMic32, kModeId1, 11, 6},
265*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kExtdAddr, kNoPanId, kNoneAddr, kNoPanId, kNoSec, kModeId1, 11, 2},
266*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kExtdAddr, kNoPanId, kNoneAddr, kNoPanId, kMic32, kModeId1, 17, 6},
267*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kExtdAddr, kNoPanId, kExtdAddr, kNoPanId, kNoSec, kModeId1, 19, 2},
268*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kExtdAddr, kNoPanId, kExtdAddr, kNoPanId, kMic32, kModeId1, 25, 6},
269*cfb92d14SAndroid Build Coastguard Worker         {kVer2015, kExtdAddr, kNoPanId, kExtdAddr, kNoPanId, kMic32, kModeId1, 24, 6, true},
270*cfb92d14SAndroid Build Coastguard Worker     };
271*cfb92d14SAndroid Build Coastguard Worker 
272*cfb92d14SAndroid Build Coastguard Worker     const uint16_t kPanId1     = 0xbaba;
273*cfb92d14SAndroid Build Coastguard Worker     const uint16_t kPanId2     = 0xdede;
274*cfb92d14SAndroid Build Coastguard Worker     const uint16_t kShortAddr1 = 0x1234;
275*cfb92d14SAndroid Build Coastguard Worker     const uint16_t kShortAddr2 = 0x5678;
276*cfb92d14SAndroid Build Coastguard Worker     const uint8_t  kExtAddr1[] = {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0};
277*cfb92d14SAndroid Build Coastguard Worker     const uint8_t  kExtAddr2[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
278*cfb92d14SAndroid Build Coastguard Worker 
279*cfb92d14SAndroid Build Coastguard Worker     char            string[100];
280*cfb92d14SAndroid Build Coastguard Worker     Mac::ExtAddress extAddr1;
281*cfb92d14SAndroid Build Coastguard Worker     Mac::ExtAddress extAddr2;
282*cfb92d14SAndroid Build Coastguard Worker 
283*cfb92d14SAndroid Build Coastguard Worker     extAddr1.Set(kExtAddr1);
284*cfb92d14SAndroid Build Coastguard Worker     extAddr2.Set(kExtAddr2);
285*cfb92d14SAndroid Build Coastguard Worker 
286*cfb92d14SAndroid Build Coastguard Worker     printf("TestMacHeader\n");
287*cfb92d14SAndroid Build Coastguard Worker 
288*cfb92d14SAndroid Build Coastguard Worker     for (const TestCase &testCase : kTestCases)
289*cfb92d14SAndroid Build Coastguard Worker     {
290*cfb92d14SAndroid Build Coastguard Worker         uint8_t psdu[OT_RADIO_FRAME_MAX_SIZE];
291*cfb92d14SAndroid Build Coastguard Worker         uint8_t offset;
292*cfb92d14SAndroid Build Coastguard Worker 
293*cfb92d14SAndroid Build Coastguard Worker         Mac::TxFrame   frame;
294*cfb92d14SAndroid Build Coastguard Worker         Mac::Addresses addresses;
295*cfb92d14SAndroid Build Coastguard Worker         Mac::Address   address;
296*cfb92d14SAndroid Build Coastguard Worker         Mac::PanIds    panIds;
297*cfb92d14SAndroid Build Coastguard Worker         Mac::PanId     panId;
298*cfb92d14SAndroid Build Coastguard Worker 
299*cfb92d14SAndroid Build Coastguard Worker         frame.mPsdu      = psdu;
300*cfb92d14SAndroid Build Coastguard Worker         frame.mLength    = 0;
301*cfb92d14SAndroid Build Coastguard Worker         frame.mRadioType = 0;
302*cfb92d14SAndroid Build Coastguard Worker 
303*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(addresses.mSource.IsNone());
304*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(addresses.mDestination.IsNone());
305*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(!panIds.IsSourcePresent());
306*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(!panIds.IsDestinationPresent());
307*cfb92d14SAndroid Build Coastguard Worker 
308*cfb92d14SAndroid Build Coastguard Worker         switch (testCase.mSrcAddrType)
309*cfb92d14SAndroid Build Coastguard Worker         {
310*cfb92d14SAndroid Build Coastguard Worker         case kNoneAddr:
311*cfb92d14SAndroid Build Coastguard Worker             addresses.mSource.SetNone();
312*cfb92d14SAndroid Build Coastguard Worker             break;
313*cfb92d14SAndroid Build Coastguard Worker         case kShrtAddr:
314*cfb92d14SAndroid Build Coastguard Worker             addresses.mSource.SetShort(kShortAddr1);
315*cfb92d14SAndroid Build Coastguard Worker             break;
316*cfb92d14SAndroid Build Coastguard Worker         case kExtdAddr:
317*cfb92d14SAndroid Build Coastguard Worker             addresses.mSource.SetExtended(extAddr1);
318*cfb92d14SAndroid Build Coastguard Worker             break;
319*cfb92d14SAndroid Build Coastguard Worker         }
320*cfb92d14SAndroid Build Coastguard Worker 
321*cfb92d14SAndroid Build Coastguard Worker         switch (testCase.mDstAddrType)
322*cfb92d14SAndroid Build Coastguard Worker         {
323*cfb92d14SAndroid Build Coastguard Worker         case kNoneAddr:
324*cfb92d14SAndroid Build Coastguard Worker             addresses.mDestination.SetNone();
325*cfb92d14SAndroid Build Coastguard Worker             break;
326*cfb92d14SAndroid Build Coastguard Worker         case kShrtAddr:
327*cfb92d14SAndroid Build Coastguard Worker             addresses.mDestination.SetShort(kShortAddr2);
328*cfb92d14SAndroid Build Coastguard Worker             break;
329*cfb92d14SAndroid Build Coastguard Worker         case kExtdAddr:
330*cfb92d14SAndroid Build Coastguard Worker             addresses.mDestination.SetExtended(extAddr2);
331*cfb92d14SAndroid Build Coastguard Worker             break;
332*cfb92d14SAndroid Build Coastguard Worker         }
333*cfb92d14SAndroid Build Coastguard Worker 
334*cfb92d14SAndroid Build Coastguard Worker         switch (testCase.mSrcPanIdMode)
335*cfb92d14SAndroid Build Coastguard Worker         {
336*cfb92d14SAndroid Build Coastguard Worker         case kNoPanId:
337*cfb92d14SAndroid Build Coastguard Worker             break;
338*cfb92d14SAndroid Build Coastguard Worker         case kUsePanId1:
339*cfb92d14SAndroid Build Coastguard Worker             panIds.SetSource(kPanId1);
340*cfb92d14SAndroid Build Coastguard Worker             break;
341*cfb92d14SAndroid Build Coastguard Worker         case kUsePanId2:
342*cfb92d14SAndroid Build Coastguard Worker             panIds.SetSource(kPanId2);
343*cfb92d14SAndroid Build Coastguard Worker             break;
344*cfb92d14SAndroid Build Coastguard Worker         }
345*cfb92d14SAndroid Build Coastguard Worker 
346*cfb92d14SAndroid Build Coastguard Worker         switch (testCase.mDstPanIdMode)
347*cfb92d14SAndroid Build Coastguard Worker         {
348*cfb92d14SAndroid Build Coastguard Worker         case kNoPanId:
349*cfb92d14SAndroid Build Coastguard Worker             break;
350*cfb92d14SAndroid Build Coastguard Worker         case kUsePanId1:
351*cfb92d14SAndroid Build Coastguard Worker             panIds.SetDestination(kPanId1);
352*cfb92d14SAndroid Build Coastguard Worker             break;
353*cfb92d14SAndroid Build Coastguard Worker         case kUsePanId2:
354*cfb92d14SAndroid Build Coastguard Worker             panIds.SetDestination(kPanId2);
355*cfb92d14SAndroid Build Coastguard Worker             break;
356*cfb92d14SAndroid Build Coastguard Worker         }
357*cfb92d14SAndroid Build Coastguard Worker 
358*cfb92d14SAndroid Build Coastguard Worker         frame.InitMacHeader(Mac::Frame::kTypeData, testCase.mVersion, addresses, panIds, testCase.mSecurity,
359*cfb92d14SAndroid Build Coastguard Worker                             testCase.mKeyIdMode, testCase.mSuppressSequence);
360*cfb92d14SAndroid Build Coastguard Worker 
361*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(frame.GetHeaderLength() == testCase.mHeaderLength);
362*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(frame.GetFooterLength() == testCase.mFooterLength);
363*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(frame.GetLength() == testCase.mHeaderLength + testCase.mFooterLength);
364*cfb92d14SAndroid Build Coastguard Worker 
365*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(frame.GetType() == Mac::Frame::kTypeData);
366*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(!frame.IsAck());
367*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(frame.GetVersion() == testCase.mVersion);
368*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(frame.GetSecurityEnabled() == (testCase.mSecurity != kNoSec));
369*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(!frame.GetFramePending());
370*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(!frame.IsIePresent());
371*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(frame.GetAckRequest() == (testCase.mDstAddrType != kNoneAddr));
372*cfb92d14SAndroid Build Coastguard Worker 
373*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(frame.IsSrcAddrPresent() == (testCase.mSrcAddrType != kNoneAddr));
374*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(frame.GetSrcAddr(address));
375*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(CompareAddresses(address, addresses.mSource));
376*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(frame.IsDstAddrPresent() == (testCase.mDstAddrType != kNoneAddr));
377*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(frame.GetDstAddr(address));
378*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(CompareAddresses(address, addresses.mDestination));
379*cfb92d14SAndroid Build Coastguard Worker 
380*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(frame.IsDstPanIdPresent() == (testCase.mDstPanIdMode != kNoPanId));
381*cfb92d14SAndroid Build Coastguard Worker 
382*cfb92d14SAndroid Build Coastguard Worker         if (frame.IsDstPanIdPresent())
383*cfb92d14SAndroid Build Coastguard Worker         {
384*cfb92d14SAndroid Build Coastguard Worker             SuccessOrQuit(frame.GetDstPanId(panId));
385*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(panId == panIds.GetDestination());
386*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(panIds.IsDestinationPresent());
387*cfb92d14SAndroid Build Coastguard Worker         }
388*cfb92d14SAndroid Build Coastguard Worker 
389*cfb92d14SAndroid Build Coastguard Worker         if (frame.IsSrcPanIdPresent())
390*cfb92d14SAndroid Build Coastguard Worker         {
391*cfb92d14SAndroid Build Coastguard Worker             SuccessOrQuit(frame.GetSrcPanId(panId));
392*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(panId == panIds.GetSource());
393*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(panIds.IsSourcePresent());
394*cfb92d14SAndroid Build Coastguard Worker         }
395*cfb92d14SAndroid Build Coastguard Worker 
396*cfb92d14SAndroid Build Coastguard Worker         if (frame.GetSecurityEnabled())
397*cfb92d14SAndroid Build Coastguard Worker         {
398*cfb92d14SAndroid Build Coastguard Worker             uint8_t security;
399*cfb92d14SAndroid Build Coastguard Worker             uint8_t keyIdMode;
400*cfb92d14SAndroid Build Coastguard Worker 
401*cfb92d14SAndroid Build Coastguard Worker             SuccessOrQuit(frame.GetSecurityLevel(security));
402*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(security == testCase.mSecurity);
403*cfb92d14SAndroid Build Coastguard Worker 
404*cfb92d14SAndroid Build Coastguard Worker             SuccessOrQuit(frame.GetKeyIdMode(keyIdMode));
405*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(keyIdMode == testCase.mKeyIdMode);
406*cfb92d14SAndroid Build Coastguard Worker         }
407*cfb92d14SAndroid Build Coastguard Worker 
408*cfb92d14SAndroid Build Coastguard Worker         offset = snprintf(string, sizeof(string), "\nver:%s, src[addr:%s, pan:%s], dst[addr:%s, pan:%s], sec:%s",
409*cfb92d14SAndroid Build Coastguard Worker                           (testCase.mVersion == kVer2006) ? "2006" : "2015", kAddrTypeStrings[testCase.mSrcAddrType],
410*cfb92d14SAndroid Build Coastguard Worker                           kPanIdModeStrings[testCase.mSrcPanIdMode], kAddrTypeStrings[testCase.mDstAddrType],
411*cfb92d14SAndroid Build Coastguard Worker                           kPanIdModeStrings[testCase.mDstPanIdMode], testCase.mSecurity == kNoSec ? "no" : "mic32");
412*cfb92d14SAndroid Build Coastguard Worker 
413*cfb92d14SAndroid Build Coastguard Worker         if (!testCase.mSuppressSequence)
414*cfb92d14SAndroid Build Coastguard Worker         {
415*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(frame.IsSequencePresent());
416*cfb92d14SAndroid Build Coastguard Worker             offset += snprintf(string + offset, sizeof(string) - offset, ", seq:%u", frame.GetSequence());
417*cfb92d14SAndroid Build Coastguard Worker         }
418*cfb92d14SAndroid Build Coastguard Worker         else
419*cfb92d14SAndroid Build Coastguard Worker         {
420*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(!frame.IsSequencePresent());
421*cfb92d14SAndroid Build Coastguard Worker         }
422*cfb92d14SAndroid Build Coastguard Worker         DumpBuffer(string, frame.GetPsdu(), frame.GetLength());
423*cfb92d14SAndroid Build Coastguard Worker     }
424*cfb92d14SAndroid Build Coastguard Worker }
425*cfb92d14SAndroid Build Coastguard Worker 
VerifyChannelMaskContent(const Mac::ChannelMask & aMask,uint8_t * aChannels,uint8_t aLength)426*cfb92d14SAndroid Build Coastguard Worker void VerifyChannelMaskContent(const Mac::ChannelMask &aMask, uint8_t *aChannels, uint8_t aLength)
427*cfb92d14SAndroid Build Coastguard Worker {
428*cfb92d14SAndroid Build Coastguard Worker     uint8_t index = 0;
429*cfb92d14SAndroid Build Coastguard Worker     uint8_t channel;
430*cfb92d14SAndroid Build Coastguard Worker 
431*cfb92d14SAndroid Build Coastguard Worker     for (channel = Radio::kChannelMin; channel <= Radio::kChannelMax; channel++)
432*cfb92d14SAndroid Build Coastguard Worker     {
433*cfb92d14SAndroid Build Coastguard Worker         if (index < aLength)
434*cfb92d14SAndroid Build Coastguard Worker         {
435*cfb92d14SAndroid Build Coastguard Worker             if (channel == aChannels[index])
436*cfb92d14SAndroid Build Coastguard Worker             {
437*cfb92d14SAndroid Build Coastguard Worker                 index++;
438*cfb92d14SAndroid Build Coastguard Worker                 VerifyOrQuit(aMask.ContainsChannel(channel));
439*cfb92d14SAndroid Build Coastguard Worker             }
440*cfb92d14SAndroid Build Coastguard Worker             else
441*cfb92d14SAndroid Build Coastguard Worker             {
442*cfb92d14SAndroid Build Coastguard Worker                 VerifyOrQuit(!aMask.ContainsChannel(channel));
443*cfb92d14SAndroid Build Coastguard Worker             }
444*cfb92d14SAndroid Build Coastguard Worker         }
445*cfb92d14SAndroid Build Coastguard Worker     }
446*cfb92d14SAndroid Build Coastguard Worker 
447*cfb92d14SAndroid Build Coastguard Worker     index   = 0;
448*cfb92d14SAndroid Build Coastguard Worker     channel = Mac::ChannelMask::kChannelIteratorFirst;
449*cfb92d14SAndroid Build Coastguard Worker 
450*cfb92d14SAndroid Build Coastguard Worker     while (aMask.GetNextChannel(channel) == kErrorNone)
451*cfb92d14SAndroid Build Coastguard Worker     {
452*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(channel == aChannels[index++], "ChannelMask.GetNextChannel() failed");
453*cfb92d14SAndroid Build Coastguard Worker     }
454*cfb92d14SAndroid Build Coastguard Worker 
455*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(index == aLength, "ChannelMask.GetNextChannel() failed");
456*cfb92d14SAndroid Build Coastguard Worker 
457*cfb92d14SAndroid Build Coastguard Worker     if (aLength == 1)
458*cfb92d14SAndroid Build Coastguard Worker     {
459*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(aMask.IsSingleChannel());
460*cfb92d14SAndroid Build Coastguard Worker     }
461*cfb92d14SAndroid Build Coastguard Worker     else
462*cfb92d14SAndroid Build Coastguard Worker     {
463*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(!aMask.IsSingleChannel());
464*cfb92d14SAndroid Build Coastguard Worker     }
465*cfb92d14SAndroid Build Coastguard Worker 
466*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(aLength == aMask.GetNumberOfChannels());
467*cfb92d14SAndroid Build Coastguard Worker }
468*cfb92d14SAndroid Build Coastguard Worker 
TestMacChannelMask(void)469*cfb92d14SAndroid Build Coastguard Worker void TestMacChannelMask(void)
470*cfb92d14SAndroid Build Coastguard Worker {
471*cfb92d14SAndroid Build Coastguard Worker     uint8_t allChannels[] = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26};
472*cfb92d14SAndroid Build Coastguard Worker     uint8_t channels1[]   = {11, 14, 15, 16, 17, 20, 21, 22, 24, 25};
473*cfb92d14SAndroid Build Coastguard Worker     uint8_t channels2[]   = {14, 21, 26};
474*cfb92d14SAndroid Build Coastguard Worker     uint8_t channels3[]   = {14, 21};
475*cfb92d14SAndroid Build Coastguard Worker     uint8_t channles4[]   = {20};
476*cfb92d14SAndroid Build Coastguard Worker 
477*cfb92d14SAndroid Build Coastguard Worker     static const char kEmptyMaskString[]   = "{ }";
478*cfb92d14SAndroid Build Coastguard Worker     static const char kAllChannelsString[] = "{ 11-26 }";
479*cfb92d14SAndroid Build Coastguard Worker     static const char kChannels1String[]   = "{ 11, 14-17, 20-22, 24, 25 }";
480*cfb92d14SAndroid Build Coastguard Worker     static const char kChannels2String[]   = "{ 14, 21, 26 }";
481*cfb92d14SAndroid Build Coastguard Worker     static const char kChannels3String[]   = "{ 14, 21 }";
482*cfb92d14SAndroid Build Coastguard Worker     static const char kChannels4String[]   = "{ 20 }";
483*cfb92d14SAndroid Build Coastguard Worker 
484*cfb92d14SAndroid Build Coastguard Worker     Mac::ChannelMask mask1;
485*cfb92d14SAndroid Build Coastguard Worker     Mac::ChannelMask mask2(Radio::kSupportedChannels);
486*cfb92d14SAndroid Build Coastguard Worker 
487*cfb92d14SAndroid Build Coastguard Worker     printf("Testing Mac::ChannelMask\n");
488*cfb92d14SAndroid Build Coastguard Worker 
489*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(mask1.IsEmpty());
490*cfb92d14SAndroid Build Coastguard Worker     printf("empty = %s\n", mask1.ToString().AsCString());
491*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(strcmp(mask1.ToString().AsCString(), kEmptyMaskString) == 0);
492*cfb92d14SAndroid Build Coastguard Worker 
493*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!mask2.IsEmpty());
494*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(mask2.GetMask() == Radio::kSupportedChannels);
495*cfb92d14SAndroid Build Coastguard Worker     printf("allChannels = %s\n", mask2.ToString().AsCString());
496*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(strcmp(mask2.ToString().AsCString(), kAllChannelsString) == 0);
497*cfb92d14SAndroid Build Coastguard Worker 
498*cfb92d14SAndroid Build Coastguard Worker     mask1.SetMask(Radio::kSupportedChannels);
499*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!mask1.IsEmpty());
500*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(mask1.GetMask() == Radio::kSupportedChannels);
501*cfb92d14SAndroid Build Coastguard Worker 
502*cfb92d14SAndroid Build Coastguard Worker     VerifyChannelMaskContent(mask1, allChannels, sizeof(allChannels));
503*cfb92d14SAndroid Build Coastguard Worker 
504*cfb92d14SAndroid Build Coastguard Worker     // Test ChannelMask::RemoveChannel()
505*cfb92d14SAndroid Build Coastguard Worker     for (size_t index = 0; index < sizeof(allChannels) - 1; index++)
506*cfb92d14SAndroid Build Coastguard Worker     {
507*cfb92d14SAndroid Build Coastguard Worker         mask1.RemoveChannel(allChannels[index]);
508*cfb92d14SAndroid Build Coastguard Worker         VerifyChannelMaskContent(mask1, &allChannels[index + 1], sizeof(allChannels) - 1 - index);
509*cfb92d14SAndroid Build Coastguard Worker     }
510*cfb92d14SAndroid Build Coastguard Worker 
511*cfb92d14SAndroid Build Coastguard Worker     mask1.Clear();
512*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(mask1.IsEmpty());
513*cfb92d14SAndroid Build Coastguard Worker     VerifyChannelMaskContent(mask1, nullptr, 0);
514*cfb92d14SAndroid Build Coastguard Worker 
515*cfb92d14SAndroid Build Coastguard Worker     for (uint8_t channel : channels1)
516*cfb92d14SAndroid Build Coastguard Worker     {
517*cfb92d14SAndroid Build Coastguard Worker         mask1.AddChannel(channel);
518*cfb92d14SAndroid Build Coastguard Worker     }
519*cfb92d14SAndroid Build Coastguard Worker 
520*cfb92d14SAndroid Build Coastguard Worker     printf("channels1 = %s\n", mask1.ToString().AsCString());
521*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(strcmp(mask1.ToString().AsCString(), kChannels1String) == 0);
522*cfb92d14SAndroid Build Coastguard Worker 
523*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!mask1.IsEmpty());
524*cfb92d14SAndroid Build Coastguard Worker     VerifyChannelMaskContent(mask1, channels1, sizeof(channels1));
525*cfb92d14SAndroid Build Coastguard Worker 
526*cfb92d14SAndroid Build Coastguard Worker     mask2.Clear();
527*cfb92d14SAndroid Build Coastguard Worker 
528*cfb92d14SAndroid Build Coastguard Worker     for (uint8_t channel : channels2)
529*cfb92d14SAndroid Build Coastguard Worker     {
530*cfb92d14SAndroid Build Coastguard Worker         mask2.AddChannel(channel);
531*cfb92d14SAndroid Build Coastguard Worker     }
532*cfb92d14SAndroid Build Coastguard Worker 
533*cfb92d14SAndroid Build Coastguard Worker     printf("channels2 = %s\n", mask2.ToString().AsCString());
534*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(strcmp(mask2.ToString().AsCString(), kChannels2String) == 0);
535*cfb92d14SAndroid Build Coastguard Worker 
536*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!mask2.IsEmpty());
537*cfb92d14SAndroid Build Coastguard Worker     VerifyChannelMaskContent(mask2, channels2, sizeof(channels2));
538*cfb92d14SAndroid Build Coastguard Worker 
539*cfb92d14SAndroid Build Coastguard Worker     mask1.Intersect(mask2);
540*cfb92d14SAndroid Build Coastguard Worker     VerifyChannelMaskContent(mask1, channels3, sizeof(channels3));
541*cfb92d14SAndroid Build Coastguard Worker     printf("channels3 = %s\n", mask1.ToString().AsCString());
542*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(strcmp(mask1.ToString().AsCString(), kChannels3String) == 0);
543*cfb92d14SAndroid Build Coastguard Worker 
544*cfb92d14SAndroid Build Coastguard Worker     mask2.Clear();
545*cfb92d14SAndroid Build Coastguard Worker     mask2.AddChannel(channles4[0]);
546*cfb92d14SAndroid Build Coastguard Worker     VerifyChannelMaskContent(mask2, channles4, sizeof(channles4));
547*cfb92d14SAndroid Build Coastguard Worker 
548*cfb92d14SAndroid Build Coastguard Worker     printf("channels4 = %s\n", mask2.ToString().AsCString());
549*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(strcmp(mask2.ToString().AsCString(), kChannels4String) == 0);
550*cfb92d14SAndroid Build Coastguard Worker 
551*cfb92d14SAndroid Build Coastguard Worker     mask1.Clear();
552*cfb92d14SAndroid Build Coastguard Worker     mask2.Clear();
553*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(mask1 == mask2);
554*cfb92d14SAndroid Build Coastguard Worker 
555*cfb92d14SAndroid Build Coastguard Worker     mask1.SetMask(Radio::kSupportedChannels);
556*cfb92d14SAndroid Build Coastguard Worker     mask2.SetMask(Radio::kSupportedChannels);
557*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(mask1 == mask2);
558*cfb92d14SAndroid Build Coastguard Worker 
559*cfb92d14SAndroid Build Coastguard Worker     mask1.Clear();
560*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(mask1 != mask2);
561*cfb92d14SAndroid Build Coastguard Worker }
562*cfb92d14SAndroid Build Coastguard Worker 
TestMacFrameApi(void)563*cfb92d14SAndroid Build Coastguard Worker void TestMacFrameApi(void)
564*cfb92d14SAndroid Build Coastguard Worker {
565*cfb92d14SAndroid Build Coastguard Worker     uint8_t ack_psdu1[]     = {0x02, 0x10, 0x5e, 0xd2, 0x9b};
566*cfb92d14SAndroid Build Coastguard Worker     uint8_t mac_cmd_psdu1[] = {0x6b, 0xdc, 0x85, 0xce, 0xfa, 0x47, 0x36, 0x07, 0xd9, 0x74, 0x45, 0x8d,
567*cfb92d14SAndroid Build Coastguard Worker                                0xb2, 0x6e, 0x81, 0x25, 0xc9, 0xdb, 0xac, 0x2b, 0x0a, 0x0d, 0x00, 0x00,
568*cfb92d14SAndroid Build Coastguard Worker                                0x00, 0x00, 0x01, 0x04, 0xaf, 0x14, 0xce, 0xaa, 0x5a, 0xe5};
569*cfb92d14SAndroid Build Coastguard Worker 
570*cfb92d14SAndroid Build Coastguard Worker     Mac::Frame frame;
571*cfb92d14SAndroid Build Coastguard Worker 
572*cfb92d14SAndroid Build Coastguard Worker #if (OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2)
573*cfb92d14SAndroid Build Coastguard Worker     uint8_t data_psdu1[]    = {0x29, 0xee, 0x53, 0xce, 0xfa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x6e, 0x16, 0x05,
574*cfb92d14SAndroid Build Coastguard Worker                                0x00, 0x00, 0x00, 0x00, 0x0a, 0x6e, 0x16, 0x0d, 0x01, 0x00, 0x00, 0x00, 0x01};
575*cfb92d14SAndroid Build Coastguard Worker     uint8_t mac_cmd_psdu2[] = {0x6b, 0xaa, 0x8d, 0xce, 0xfa, 0x00, 0x68, 0x01, 0x68, 0x0d,
576*cfb92d14SAndroid Build Coastguard Worker                                0x08, 0x00, 0x00, 0x00, 0x01, 0x04, 0x0d, 0xed, 0x0b, 0x35,
577*cfb92d14SAndroid Build Coastguard Worker                                0x0c, 0x80, 0x3f, 0x04, 0x4b, 0x88, 0x89, 0xd6, 0x59, 0xe1};
578*cfb92d14SAndroid Build Coastguard Worker     uint8_t scf; // SecurityControlField
579*cfb92d14SAndroid Build Coastguard Worker #endif
580*cfb92d14SAndroid Build Coastguard Worker 
581*cfb92d14SAndroid Build Coastguard Worker     // Imm-Ack, Sequence Number: 94
582*cfb92d14SAndroid Build Coastguard Worker     //   Frame Control Field: 0x1002
583*cfb92d14SAndroid Build Coastguard Worker     //     .... .... .... .010 = Frame Type: Ack (0x2)
584*cfb92d14SAndroid Build Coastguard Worker     //     .... .... .... 0... = Security Enabled: False
585*cfb92d14SAndroid Build Coastguard Worker     //     .... .... ...0 .... = Frame Pending: False
586*cfb92d14SAndroid Build Coastguard Worker     //     .... .... ..0. .... = Acknowledge Request: False
587*cfb92d14SAndroid Build Coastguard Worker     //     .... .... .0.. .... = PAN ID Compression: False
588*cfb92d14SAndroid Build Coastguard Worker     //     .... ...0 .... .... = Sequence Number Suppression: False
589*cfb92d14SAndroid Build Coastguard Worker     //     .... ..0. .... .... = Information Elements Present: False
590*cfb92d14SAndroid Build Coastguard Worker     //     .... 00.. .... .... = Destination Addressing Mode: None (0x0)
591*cfb92d14SAndroid Build Coastguard Worker     //     ..01 .... .... .... = Frame Version: IEEE Std 802.15.4-2006 (1)
592*cfb92d14SAndroid Build Coastguard Worker     //     00.. .... .... .... = Source Addressing Mode: None (0x0)
593*cfb92d14SAndroid Build Coastguard Worker     //   Sequence Number: 94
594*cfb92d14SAndroid Build Coastguard Worker     //   FCS: 0x9bd2 (Correct)
595*cfb92d14SAndroid Build Coastguard Worker     frame.mPsdu   = ack_psdu1;
596*cfb92d14SAndroid Build Coastguard Worker     frame.mLength = sizeof(ack_psdu1);
597*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frame.GetType() == Mac::Frame::kTypeAck);
598*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frame.GetSecurityEnabled());
599*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frame.GetFramePending());
600*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frame.GetAckRequest());
601*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frame.IsIePresent());
602*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frame.IsDstPanIdPresent());
603*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frame.IsDstAddrPresent());
604*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frame.GetVersion() == Mac::Frame::kVersion2006);
605*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!frame.IsSrcAddrPresent());
606*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frame.IsSequencePresent());
607*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frame.GetSequence() == 94);
608*cfb92d14SAndroid Build Coastguard Worker 
609*cfb92d14SAndroid Build Coastguard Worker #if (OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2)
610*cfb92d14SAndroid Build Coastguard Worker     // IEEE 802.15.4-2015 Data
611*cfb92d14SAndroid Build Coastguard Worker     //   Sequence Number: 83
612*cfb92d14SAndroid Build Coastguard Worker     //   Destination PAN: 0xface
613*cfb92d14SAndroid Build Coastguard Worker     //   Destination: 16:6e:0a:00:00:00:00:01
614*cfb92d14SAndroid Build Coastguard Worker     //   Extended Source: 16:6e:0a:00:00:00:00:05
615*cfb92d14SAndroid Build Coastguard Worker     //   Auxiliary Security Header
616*cfb92d14SAndroid Build Coastguard Worker     //     Security Control Field: 0x0d
617*cfb92d14SAndroid Build Coastguard Worker     frame.mPsdu   = data_psdu1;
618*cfb92d14SAndroid Build Coastguard Worker     frame.mLength = sizeof(data_psdu1);
619*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frame.IsVersion2015());
620*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frame.IsDstPanIdPresent());
621*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frame.IsDstAddrPresent());
622*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frame.IsSrcAddrPresent());
623*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frame.GetSecurityControlField(scf));
624*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(scf == 0x0d);
625*cfb92d14SAndroid Build Coastguard Worker     frame.SetSecurityControlField(0xff);
626*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frame.GetSecurityControlField(scf));
627*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(scf == 0xff);
628*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2
629*cfb92d14SAndroid Build Coastguard Worker 
630*cfb92d14SAndroid Build Coastguard Worker     // IEEE 802.15.4-2006 Mac Command
631*cfb92d14SAndroid Build Coastguard Worker     //   Sequence Number: 133
632*cfb92d14SAndroid Build Coastguard Worker     //   Command Identifier: Data Request (0x04)
633*cfb92d14SAndroid Build Coastguard Worker     uint8_t commandId;
634*cfb92d14SAndroid Build Coastguard Worker     frame.mPsdu   = mac_cmd_psdu1;
635*cfb92d14SAndroid Build Coastguard Worker     frame.mLength = sizeof(mac_cmd_psdu1);
636*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frame.IsSequencePresent());
637*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frame.GetSequence() == 133);
638*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frame.GetVersion() == Mac::Frame::kVersion2006);
639*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frame.GetType() == Mac::Frame::kTypeMacCmd);
640*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frame.GetCommandId(commandId));
641*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(commandId == Mac::Frame::kMacCmdDataRequest);
642*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frame.SetCommandId(Mac::Frame::kMacCmdBeaconRequest));
643*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frame.GetCommandId(commandId));
644*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(commandId == Mac::Frame::kMacCmdBeaconRequest);
645*cfb92d14SAndroid Build Coastguard Worker 
646*cfb92d14SAndroid Build Coastguard Worker #if (OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2)
647*cfb92d14SAndroid Build Coastguard Worker     // IEEE 802.15.4-2015 Mac Command
648*cfb92d14SAndroid Build Coastguard Worker     //   Sequence Number: 141
649*cfb92d14SAndroid Build Coastguard Worker     //   Header IEs
650*cfb92d14SAndroid Build Coastguard Worker     //     CSL IE
651*cfb92d14SAndroid Build Coastguard Worker     //     Header Termination 2 IE (Payload follows)
652*cfb92d14SAndroid Build Coastguard Worker     //   Command Identifier: Data Request (0x04)
653*cfb92d14SAndroid Build Coastguard Worker     frame.mPsdu   = mac_cmd_psdu2;
654*cfb92d14SAndroid Build Coastguard Worker     frame.mLength = sizeof(mac_cmd_psdu2);
655*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frame.IsSequencePresent());
656*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frame.GetSequence() == 141);
657*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frame.IsVersion2015());
658*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(frame.GetType() == Mac::Frame::kTypeMacCmd);
659*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frame.GetCommandId(commandId));
660*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(commandId == Mac::Frame::kMacCmdDataRequest);
661*cfb92d14SAndroid Build Coastguard Worker     printf("commandId:%d\n", commandId);
662*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frame.SetCommandId(Mac::Frame::kMacCmdOrphanNotification));
663*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(frame.GetCommandId(commandId));
664*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(commandId == Mac::Frame::kMacCmdOrphanNotification);
665*cfb92d14SAndroid Build Coastguard Worker 
666*cfb92d14SAndroid Build Coastguard Worker #endif
667*cfb92d14SAndroid Build Coastguard Worker }
668*cfb92d14SAndroid Build Coastguard Worker 
TestMacFrameAckGeneration(void)669*cfb92d14SAndroid Build Coastguard Worker void TestMacFrameAckGeneration(void)
670*cfb92d14SAndroid Build Coastguard Worker {
671*cfb92d14SAndroid Build Coastguard Worker     constexpr uint8_t kImmAckLength = 5;
672*cfb92d14SAndroid Build Coastguard Worker 
673*cfb92d14SAndroid Build Coastguard Worker     Mac::RxFrame receivedFrame;
674*cfb92d14SAndroid Build Coastguard Worker     Mac::TxFrame ackFrame;
675*cfb92d14SAndroid Build Coastguard Worker     uint8_t      ackFrameBuffer[100];
676*cfb92d14SAndroid Build Coastguard Worker 
677*cfb92d14SAndroid Build Coastguard Worker     ackFrame.mPsdu   = ackFrameBuffer;
678*cfb92d14SAndroid Build Coastguard Worker     ackFrame.mLength = sizeof(ackFrameBuffer);
679*cfb92d14SAndroid Build Coastguard Worker 
680*cfb92d14SAndroid Build Coastguard Worker     // Received Frame 1
681*cfb92d14SAndroid Build Coastguard Worker     // IEEE 802.15.4 Data
682*cfb92d14SAndroid Build Coastguard Worker     //   Frame Control Field: 0xdc61
683*cfb92d14SAndroid Build Coastguard Worker     //     .... .... .... .001 = Frame Type: Data (0x1)
684*cfb92d14SAndroid Build Coastguard Worker     //     .... .... .... 0... = Security Enabled: False
685*cfb92d14SAndroid Build Coastguard Worker     //     .... .... ...0 .... = Frame Pending: False
686*cfb92d14SAndroid Build Coastguard Worker     //     .... .... ..1. .... = Acknowledge Request: True
687*cfb92d14SAndroid Build Coastguard Worker     //     .... .... .1.. .... = PAN ID Compression: True
688*cfb92d14SAndroid Build Coastguard Worker     //     .... ...0 .... .... = Sequence Number Suppression: False
689*cfb92d14SAndroid Build Coastguard Worker     //     .... ..0. .... .... = Information Elements Present: False
690*cfb92d14SAndroid Build Coastguard Worker     //     .... 11.. .... .... = Destination Addressing Mode: Long/64-bit (0x3)
691*cfb92d14SAndroid Build Coastguard Worker     //     ..01 .... .... .... = Frame Version: IEEE Std 802.15.4-2006 (1)
692*cfb92d14SAndroid Build Coastguard Worker     //     11.. .... .... .... = Source Addressing Mode: Long/64-bit (0x3)
693*cfb92d14SAndroid Build Coastguard Worker     //  Sequence Number: 189
694*cfb92d14SAndroid Build Coastguard Worker     //  Destination PAN: 0xface
695*cfb92d14SAndroid Build Coastguard Worker     //  Destination: 16:6e:0a:00:00:00:00:01 (16:6e:0a:00:00:00:00:01)
696*cfb92d14SAndroid Build Coastguard Worker     //  Extended Source: 16:6e:0a:00:00:00:00:02 (16:6e:0a:00:00:00:00:02)
697*cfb92d14SAndroid Build Coastguard Worker     uint8_t data_psdu1[]  = {0x61, 0xdc, 0xbd, 0xce, 0xfa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x6e, 0x16, 0x02,
698*cfb92d14SAndroid Build Coastguard Worker                              0x00, 0x00, 0x00, 0x00, 0x0a, 0x6e, 0x16, 0x7f, 0x33, 0xf0, 0x4d, 0x4c, 0x4d, 0x4c,
699*cfb92d14SAndroid Build Coastguard Worker                              0x8b, 0xf0, 0x00, 0x15, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc2,
700*cfb92d14SAndroid Build Coastguard Worker                              0x57, 0x9c, 0x31, 0xb3, 0x2a, 0xa1, 0x86, 0xba, 0x9a, 0xed, 0x5a, 0xb9, 0xa3, 0x59,
701*cfb92d14SAndroid Build Coastguard Worker                              0x88, 0xeb, 0xbb, 0x0d, 0xc3, 0xed, 0xeb, 0x8a, 0x53, 0xa6, 0xed, 0xf7, 0xdd, 0x45,
702*cfb92d14SAndroid Build Coastguard Worker                              0x6e, 0xf7, 0x9a, 0x17, 0xb4, 0xab, 0xc6, 0x75, 0x71, 0x46, 0x37, 0x93, 0x4a, 0x32,
703*cfb92d14SAndroid Build Coastguard Worker                              0xb1, 0x21, 0x9f, 0x9d, 0xb3, 0x65, 0x27, 0xd5, 0xfc, 0x50, 0x16, 0x90, 0xd2, 0xd4};
704*cfb92d14SAndroid Build Coastguard Worker     receivedFrame.mPsdu   = data_psdu1;
705*cfb92d14SAndroid Build Coastguard Worker     receivedFrame.mLength = sizeof(data_psdu1);
706*cfb92d14SAndroid Build Coastguard Worker 
707*cfb92d14SAndroid Build Coastguard Worker     ackFrame.GenerateImmAck(receivedFrame, false);
708*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(ackFrame.mLength == kImmAckLength);
709*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(ackFrame.GetType() == Mac::Frame::kTypeAck);
710*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!ackFrame.GetSecurityEnabled());
711*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!ackFrame.GetFramePending());
712*cfb92d14SAndroid Build Coastguard Worker 
713*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!ackFrame.GetAckRequest());
714*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!ackFrame.IsIePresent());
715*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!ackFrame.IsDstPanIdPresent());
716*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!ackFrame.IsDstAddrPresent());
717*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!ackFrame.IsSrcAddrPresent());
718*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(ackFrame.GetVersion() == Mac::Frame::kVersion2006);
719*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(ackFrame.IsSequencePresent());
720*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(ackFrame.GetSequence() == 189);
721*cfb92d14SAndroid Build Coastguard Worker 
722*cfb92d14SAndroid Build Coastguard Worker #if (OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2)
723*cfb92d14SAndroid Build Coastguard Worker     // Received Frame 2
724*cfb92d14SAndroid Build Coastguard Worker     // IEEE 802.15.4 Data
725*cfb92d14SAndroid Build Coastguard Worker     //   Frame Control Field: 0xa869, Frame Type: Data, Security Enabled, Acknowledge Request, PAN ID Compression,
726*cfb92d14SAndroid Build Coastguard Worker     //   Destination Addressing Mode: Short/16-bit, Frame Version: IEEE Std 802.15.4-2015, Source Addressing Mode:
727*cfb92d14SAndroid Build Coastguard Worker     //   Short/16-bit
728*cfb92d14SAndroid Build Coastguard Worker     //     .... .... .... .001 = Frame Type: Data (0x1)
729*cfb92d14SAndroid Build Coastguard Worker     //     .... .... .... 1... = Security Enabled: True
730*cfb92d14SAndroid Build Coastguard Worker     //     .... .... ...0 .... = Frame Pending: False
731*cfb92d14SAndroid Build Coastguard Worker     //     .... .... ..1. .... = Acknowledge Request: True
732*cfb92d14SAndroid Build Coastguard Worker     //     .... .... .1.. .... = PAN ID Compression: True
733*cfb92d14SAndroid Build Coastguard Worker     //     .... ...0 .... .... = Sequence Number Suppression: False
734*cfb92d14SAndroid Build Coastguard Worker     //     .... ..0. .... .... = Information Elements Present: False
735*cfb92d14SAndroid Build Coastguard Worker     //     .... 10.. .... .... = Destination Addressing Mode: Short/16-bit (0x2)
736*cfb92d14SAndroid Build Coastguard Worker     //     ..10 .... .... .... = Frame Version: IEEE Std 802.15.4-2015 (2)
737*cfb92d14SAndroid Build Coastguard Worker     //     10.. .... .... .... = Source Addressing Mode: Short/16-bit (0x2)
738*cfb92d14SAndroid Build Coastguard Worker     //   Sequence Number: 142
739*cfb92d14SAndroid Build Coastguard Worker     //   Destination PAN: 0xface
740*cfb92d14SAndroid Build Coastguard Worker     //   Destination: 0x2402
741*cfb92d14SAndroid Build Coastguard Worker     //   Source: 0x2400
742*cfb92d14SAndroid Build Coastguard Worker     //   [Extended Source: 16:6e:0a:00:00:00:00:01 (16:6e:0a:00:00:00:00:01)]
743*cfb92d14SAndroid Build Coastguard Worker     //   [Origin: 2]
744*cfb92d14SAndroid Build Coastguard Worker     //   Auxiliary Security Header
745*cfb92d14SAndroid Build Coastguard Worker     //     Security Control Field: 0x0d, Security Level: Encryption with 32-bit Message Integrity Code, Key Identifier
746*cfb92d14SAndroid Build Coastguard Worker     //     Mode: Indexed Key using the Default Key Source
747*cfb92d14SAndroid Build Coastguard Worker     //       .... .101 = Security Level: Encryption with 32-bit Message Integrity Code (0x5)
748*cfb92d14SAndroid Build Coastguard Worker     //       ...0 1... = Key Identifier Mode: Indexed Key using the Default Key Source (0x1)
749*cfb92d14SAndroid Build Coastguard Worker     //       ..0. .... = Frame Counter Suppression: False
750*cfb92d14SAndroid Build Coastguard Worker     //       .0.. .... = ASN in Nonce: False
751*cfb92d14SAndroid Build Coastguard Worker     //       0... .... = Reserved: 0x0
752*cfb92d14SAndroid Build Coastguard Worker     //     Frame Counter: 2
753*cfb92d14SAndroid Build Coastguard Worker     //     Key Identifier Field
754*cfb92d14SAndroid Build Coastguard Worker     //       Key Index: 0x01
755*cfb92d14SAndroid Build Coastguard Worker     //   MIC: f94e5870
756*cfb92d14SAndroid Build Coastguard Worker     //   [Key Number: 0]
757*cfb92d14SAndroid Build Coastguard Worker     //   FCS: 0x8c40 (Correct)
758*cfb92d14SAndroid Build Coastguard Worker     uint8_t data_psdu2[]  = {0x69, 0xa8, 0x8e, 0xce, 0xfa, 0x02, 0x24, 0x00, 0x24, 0x0d, 0x02,
759*cfb92d14SAndroid Build Coastguard Worker                              0x00, 0x00, 0x00, 0x01, 0x6b, 0x64, 0x60, 0x08, 0x55, 0xb8, 0x10,
760*cfb92d14SAndroid Build Coastguard Worker                              0x18, 0xc7, 0x40, 0x2e, 0xfb, 0xf3, 0xda, 0xf9, 0x4e, 0x58, 0x70};
761*cfb92d14SAndroid Build Coastguard Worker     receivedFrame.mPsdu   = data_psdu2;
762*cfb92d14SAndroid Build Coastguard Worker     receivedFrame.mLength = sizeof(data_psdu2);
763*cfb92d14SAndroid Build Coastguard Worker 
764*cfb92d14SAndroid Build Coastguard Worker     uint8_t     ie_data[6] = {0x04, 0x0d, 0x21, 0x0c, 0x35, 0x0c};
765*cfb92d14SAndroid Build Coastguard Worker     Mac::CslIe *csl;
766*cfb92d14SAndroid Build Coastguard Worker 
767*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(ackFrame.GenerateEnhAck(receivedFrame, false, ie_data, sizeof(ie_data)));
768*cfb92d14SAndroid Build Coastguard Worker 
769*cfb92d14SAndroid Build Coastguard Worker     csl = reinterpret_cast<Mac::CslIe *>(ackFrame.GetHeaderIe(Mac::CslIe::kHeaderIeId) + sizeof(Mac::HeaderIe));
770*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(ackFrame.mLength == 25);
771*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(ackFrame.GetType() == Mac::Frame::kTypeAck);
772*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(ackFrame.GetSecurityEnabled());
773*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(ackFrame.IsIePresent());
774*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(ackFrame.IsDstPanIdPresent());
775*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(ackFrame.IsDstAddrPresent());
776*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!ackFrame.IsSrcAddrPresent());
777*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(ackFrame.GetVersion() == Mac::Frame::kVersion2015);
778*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(ackFrame.IsSequencePresent());
779*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(ackFrame.GetSequence() == 142);
780*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(csl->GetPeriod() == 3125 && csl->GetPhase() == 3105);
781*cfb92d14SAndroid Build Coastguard Worker 
782*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
783*cfb92d14SAndroid Build Coastguard Worker     ackFrame.SetCslIe(123, 456);
784*cfb92d14SAndroid Build Coastguard Worker     csl = reinterpret_cast<Mac::CslIe *>(ackFrame.GetHeaderIe(Mac::CslIe::kHeaderIeId) + sizeof(Mac::HeaderIe));
785*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(csl->GetPeriod() == 123 && csl->GetPhase() == 456);
786*cfb92d14SAndroid Build Coastguard Worker #endif
787*cfb92d14SAndroid Build Coastguard Worker #endif // (OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2)
788*cfb92d14SAndroid Build Coastguard Worker }
789*cfb92d14SAndroid Build Coastguard Worker 
790*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
791*cfb92d14SAndroid Build Coastguard Worker 
main(void)792*cfb92d14SAndroid Build Coastguard Worker int main(void)
793*cfb92d14SAndroid Build Coastguard Worker {
794*cfb92d14SAndroid Build Coastguard Worker     ot::TestMacAddress();
795*cfb92d14SAndroid Build Coastguard Worker     ot::TestMacHeader();
796*cfb92d14SAndroid Build Coastguard Worker     ot::TestMacChannelMask();
797*cfb92d14SAndroid Build Coastguard Worker     ot::TestMacFrameApi();
798*cfb92d14SAndroid Build Coastguard Worker     ot::TestMacFrameAckGeneration();
799*cfb92d14SAndroid Build Coastguard Worker     printf("All tests passed\n");
800*cfb92d14SAndroid Build Coastguard Worker     return 0;
801*cfb92d14SAndroid Build Coastguard Worker }
802