1 // Copyright 2023 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14
15 #include "pw_bluetooth_sapphire/internal/host/l2cap/frame_headers.h"
16
17 #include "pw_bluetooth_sapphire/internal/host/common/byte_buffer.h"
18 #include "pw_unit_test/framework.h"
19
20 namespace bt::l2cap::internal {
21 namespace {
22
TEST(FrameHeadersEnhancedControlFieldTest,IdentifiesInformationFrame)23 TEST(FrameHeadersEnhancedControlFieldTest, IdentifiesInformationFrame) {
24 // See Core Spec, v5, Vol 3, Part A, Table 3.2.
25 EXPECT_TRUE(StaticByteBuffer(0b0000'0000, 0)
26 .To<EnhancedControlField>()
27 .designates_information_frame());
28 }
29
TEST(FrameHeadersEnhancedControlFieldTest,IdentifiesNonInformationFrame)30 TEST(FrameHeadersEnhancedControlFieldTest, IdentifiesNonInformationFrame) {
31 // See Core Spec, v5, Vol 3, Part A, Table 3.2.
32 EXPECT_FALSE(StaticByteBuffer(0b0000'0001, 0)
33 .To<EnhancedControlField>()
34 .designates_information_frame());
35 }
36
TEST(FrameHeadersEnhancedControlFieldTest,IdentifiesSupervisoryFrame)37 TEST(FrameHeadersEnhancedControlFieldTest, IdentifiesSupervisoryFrame) {
38 // See Core Spec, v5, Vol 3, Part A, Table 3.2.
39 EXPECT_TRUE(StaticByteBuffer(0b00000001, 0)
40 .To<EnhancedControlField>()
41 .designates_supervisory_frame());
42 }
43
TEST(FrameHeadersEnhancedControlFieldTest,IdentifiesNonSupervisoryFrame)44 TEST(FrameHeadersEnhancedControlFieldTest, IdentifiesNonSupervisoryFrame) {
45 // See Core Spec, v5, Vol 3, Part A, Table 3.2.
46 EXPECT_FALSE(StaticByteBuffer(0b00000000, 1)
47 .To<EnhancedControlField>()
48 .designates_supervisory_frame());
49 }
50
TEST(FrameHeadersEnhancedControlFieldTest,IdentifiesStartOfSegmentedSdu)51 TEST(FrameHeadersEnhancedControlFieldTest, IdentifiesStartOfSegmentedSdu) {
52 // See Core Spec, v5, Vol 3, Part A, Tables 3.2 and 3.4.
53 EXPECT_TRUE(StaticByteBuffer(0, 0b01000000)
54 .To<EnhancedControlField>()
55 .designates_start_of_segmented_sdu());
56 }
57
TEST(FrameHeadersEnhancedControlFieldTest,IdentifiesNonStartOfSegmentedSdu)58 TEST(FrameHeadersEnhancedControlFieldTest, IdentifiesNonStartOfSegmentedSdu) {
59 // See Core Spec, v5, Vol 3, Part A, Tables 3.2 and 3.4.
60 EXPECT_FALSE(StaticByteBuffer(0, 0b00000000)
61 .To<EnhancedControlField>()
62 .designates_start_of_segmented_sdu());
63 EXPECT_FALSE(StaticByteBuffer(0, 0b10000000)
64 .To<EnhancedControlField>()
65 .designates_start_of_segmented_sdu());
66 EXPECT_FALSE(StaticByteBuffer(0, 0b11000000)
67 .To<EnhancedControlField>()
68 .designates_start_of_segmented_sdu());
69 EXPECT_FALSE(StaticByteBuffer(1, 0b01000000)
70 .To<EnhancedControlField>()
71 .designates_start_of_segmented_sdu());
72 }
73
TEST(FrameHeadersEnhancedControlFieldTest,IdentifiesPartOfSegmentedSdu)74 TEST(FrameHeadersEnhancedControlFieldTest, IdentifiesPartOfSegmentedSdu) {
75 // See Core Spec, v5, Vol 3, Part A, Tables 3.2 and 3.4.
76 EXPECT_TRUE(StaticByteBuffer(0, 0b01000000)
77 .To<EnhancedControlField>()
78 .designates_part_of_segmented_sdu());
79 EXPECT_TRUE(StaticByteBuffer(0, 0b10000000)
80 .To<EnhancedControlField>()
81 .designates_part_of_segmented_sdu());
82 EXPECT_TRUE(StaticByteBuffer(0, 0b11000000)
83 .To<EnhancedControlField>()
84 .designates_part_of_segmented_sdu());
85 }
86
TEST(FrameHeadersEnhancedControlFieldTest,IdentifiesNotPartOfSegmentedSdu)87 TEST(FrameHeadersEnhancedControlFieldTest, IdentifiesNotPartOfSegmentedSdu) {
88 // See Core Spec, v5, Vol 3, Part A, Tables 3.2 and 3.4.
89 EXPECT_FALSE(StaticByteBuffer(0, 0b00000000)
90 .To<EnhancedControlField>()
91 .designates_part_of_segmented_sdu());
92 EXPECT_FALSE(StaticByteBuffer(1, 0b01000000)
93 .To<EnhancedControlField>()
94 .designates_part_of_segmented_sdu());
95 EXPECT_FALSE(StaticByteBuffer(1, 0b10000000)
96 .To<EnhancedControlField>()
97 .designates_part_of_segmented_sdu());
98 EXPECT_FALSE(StaticByteBuffer(1, 0b11000000)
99 .To<EnhancedControlField>()
100 .designates_part_of_segmented_sdu());
101 }
102
TEST(FrameHeadersEnhancedControlFieldTest,ReadsRequestSequenceNumber)103 TEST(FrameHeadersEnhancedControlFieldTest, ReadsRequestSequenceNumber) {
104 // See Core Spec, v5, Vol 3, Part A, Table 3.2, and Core Spec v5, Vol 3, Part
105 // A, Sec 8.3.
106 for (uint8_t seq_num = 0; seq_num < 64; ++seq_num) {
107 EXPECT_EQ(seq_num,
108 StaticByteBuffer(0, seq_num)
109 .To<EnhancedControlField>()
110 .receive_seq_num());
111 }
112 }
113
TEST(FrameHeadersEnhancedControlFieldTest,IsConstructedProperly)114 TEST(FrameHeadersEnhancedControlFieldTest, IsConstructedProperly) {
115 EnhancedControlField ecf;
116 EXPECT_EQ(StaticByteBuffer(0, 0), BufferView(&ecf, sizeof(ecf)));
117 }
118
TEST(FrameHeadersEnhancedControlFieldTest,SetSupervisoryFrameSetsBitCorrectly)119 TEST(FrameHeadersEnhancedControlFieldTest,
120 SetSupervisoryFrameSetsBitCorrectly) {
121 EnhancedControlField ecf;
122 ecf.set_supervisory_frame();
123 // See Core Spec, v5, Vol 3, Part A, Table 3.2.
124 EXPECT_EQ(StaticByteBuffer(0b1, 0), BufferView(&ecf, sizeof(ecf)));
125 }
126
TEST(FrameHeadersEnhancedControlFieldTest,SetRequestSeqNumSetsBitsCorrectly)127 TEST(FrameHeadersEnhancedControlFieldTest, SetRequestSeqNumSetsBitsCorrectly) {
128 for (uint8_t seq_num = 0; seq_num < 64; ++seq_num) {
129 EnhancedControlField ecf;
130 ecf.set_receive_seq_num(seq_num);
131 // See Core Spec, v5, Vol 3, Part A, Table 3.2.
132 EXPECT_EQ(StaticByteBuffer(0, seq_num), BufferView(&ecf, sizeof(ecf)));
133 }
134 }
135
TEST(FrameHeadersEnhancedControlFieldTest,SetSegmentationStatusWorksCorrectlyOnFreshFrame)136 TEST(FrameHeadersEnhancedControlFieldTest,
137 SetSegmentationStatusWorksCorrectlyOnFreshFrame) {
138 // See Core Spec, v5, Vol 3, Part A, Tables 3.2 and 3.4.
139
140 {
141 EnhancedControlField ecf;
142 ecf.set_segmentation_status(SegmentationStatus::Unsegmented);
143 EXPECT_EQ(StaticByteBuffer(0, 0), BufferView(&ecf, sizeof(ecf)));
144 }
145
146 {
147 EnhancedControlField ecf;
148 ecf.set_segmentation_status(SegmentationStatus::FirstSegment);
149 EXPECT_EQ(StaticByteBuffer(0, 0b0100'0000), BufferView(&ecf, sizeof(ecf)));
150 }
151
152 {
153 EnhancedControlField ecf;
154 ecf.set_segmentation_status(SegmentationStatus::LastSegment);
155 EXPECT_EQ(StaticByteBuffer(0, 0b1000'0000), BufferView(&ecf, sizeof(ecf)));
156 }
157
158 {
159 EnhancedControlField ecf;
160 ecf.set_segmentation_status(SegmentationStatus::MiddleSegment);
161 EXPECT_EQ(StaticByteBuffer(0, 0b1100'0000), BufferView(&ecf, sizeof(ecf)));
162 }
163 }
164
TEST(FrameHeadersEnhancedControlFieldTest,SetSegmentationStatusWorksCorrectlyOnRecycledFrame)165 TEST(FrameHeadersEnhancedControlFieldTest,
166 SetSegmentationStatusWorksCorrectlyOnRecycledFrame) {
167 // See Core Spec, v5, Vol 3, Part A, Tables 3.2 and 3.4.
168
169 {
170 EnhancedControlField ecf;
171 ecf.set_segmentation_status(SegmentationStatus::MiddleSegment);
172 ecf.set_segmentation_status(SegmentationStatus::Unsegmented);
173 EXPECT_EQ(StaticByteBuffer(0, 0), BufferView(&ecf, sizeof(ecf)));
174 }
175
176 {
177 EnhancedControlField ecf;
178 ecf.set_segmentation_status(SegmentationStatus::MiddleSegment);
179 ecf.set_segmentation_status(SegmentationStatus::FirstSegment);
180 EXPECT_EQ(StaticByteBuffer(0, 0b0100'0000), BufferView(&ecf, sizeof(ecf)));
181 }
182
183 {
184 EnhancedControlField ecf;
185 ecf.set_segmentation_status(SegmentationStatus::MiddleSegment);
186 ecf.set_segmentation_status(SegmentationStatus::LastSegment);
187 EXPECT_EQ(StaticByteBuffer(0, 0b1000'0000), BufferView(&ecf, sizeof(ecf)));
188 }
189
190 {
191 EnhancedControlField ecf;
192 ecf.set_segmentation_status(SegmentationStatus::MiddleSegment);
193 ecf.set_segmentation_status(SegmentationStatus::MiddleSegment);
194 EXPECT_EQ(StaticByteBuffer(0, 0b1100'0000), BufferView(&ecf, sizeof(ecf)));
195 }
196 }
197
TEST(FrameHeadersEnhancedControlFieldTest,SetSegmentationStatusPreservesRequestSeqNum)198 TEST(FrameHeadersEnhancedControlFieldTest,
199 SetSegmentationStatusPreservesRequestSeqNum) {
200 EnhancedControlField ecf;
201 ecf.set_receive_seq_num(EnhancedControlField::kMaxSeqNum);
202 ecf.set_segmentation_status(SegmentationStatus::Unsegmented);
203 EXPECT_EQ(EnhancedControlField::kMaxSeqNum, ecf.receive_seq_num());
204 }
205
TEST(FrameHeadersSimpleInformationFrameHeaderTest,ReadsTxSequenceNumber)206 TEST(FrameHeadersSimpleInformationFrameHeaderTest, ReadsTxSequenceNumber) {
207 // See Core Spec, v5, Vol 3, Part A, Table 3.2, and Core Spec v5, Vol 3, Part
208 // A, Sec 8.3.
209 for (uint8_t seq_num = 0; seq_num < 64; ++seq_num) {
210 EXPECT_EQ(seq_num,
211 StaticByteBuffer(seq_num << 1, 0)
212 .To<SimpleInformationFrameHeader>()
213 .tx_seq());
214 }
215 }
216
TEST(FrameHeadersSimpleInformationFrameHeaderTest,IsConstructedProperly)217 TEST(FrameHeadersSimpleInformationFrameHeaderTest, IsConstructedProperly) {
218 constexpr uint8_t kTxSeq = 63;
219 SimpleInformationFrameHeader frame(kTxSeq);
220 // See Core Spec, v5, Vol 3, Part A, Table 3.2.
221 EXPECT_EQ(StaticByteBuffer(0b111'1110, 0), BufferView(&frame, sizeof(frame)));
222 }
223
TEST(FrameHeadersSimpleInformationFrameHeaderTest,SetSegmentationStatusPreservesTxSeq)224 TEST(FrameHeadersSimpleInformationFrameHeaderTest,
225 SetSegmentationStatusPreservesTxSeq) {
226 constexpr uint8_t kTxSeq = 63;
227 SimpleInformationFrameHeader frame(kTxSeq);
228 frame.set_segmentation_status(SegmentationStatus::Unsegmented);
229 EXPECT_EQ(kTxSeq, frame.tx_seq());
230 }
231
TEST(FrameHeadersSimpleStartOfSduFrameHeaderTest,IsConstructedProperly)232 TEST(FrameHeadersSimpleStartOfSduFrameHeaderTest, IsConstructedProperly) {
233 constexpr uint8_t kTxSeq = 63;
234 SimpleStartOfSduFrameHeader frame(kTxSeq);
235 // See Core Spec, v5, Vol 3, Part A, Table 3.2, and Figure 3.3.
236 EXPECT_EQ(StaticByteBuffer(0b111'1110, 0b0100'0000, 0, 0),
237 BufferView(&frame, sizeof(frame)));
238 }
239
TEST(FrameHeadersSimpleSupervisoryFrameTest,IsConstructedProperly)240 TEST(FrameHeadersSimpleSupervisoryFrameTest, IsConstructedProperly) {
241 // See Core Spec, v5, Vol 3, Part A, Table 3.2.
242
243 {
244 SimpleSupervisoryFrame frame(SupervisoryFunction::ReceiverReady);
245 EXPECT_EQ(StaticByteBuffer(0b0001, 0), BufferView(&frame, sizeof(frame)));
246 }
247
248 {
249 SimpleSupervisoryFrame frame(SupervisoryFunction::Reject);
250 EXPECT_EQ(StaticByteBuffer(0b0101, 0), BufferView(&frame, sizeof(frame)));
251 }
252
253 {
254 SimpleSupervisoryFrame frame(SupervisoryFunction::ReceiverNotReady);
255 EXPECT_EQ(StaticByteBuffer(0b1001, 0), BufferView(&frame, sizeof(frame)));
256 }
257
258 {
259 SimpleSupervisoryFrame frame(SupervisoryFunction::SelectiveReject);
260 EXPECT_EQ(StaticByteBuffer(0b1101, 0), BufferView(&frame, sizeof(frame)));
261 }
262 }
263
TEST(FrameHeadersSimpleSupervisoryFrameTest,IdentifiesPollRequest)264 TEST(FrameHeadersSimpleSupervisoryFrameTest, IdentifiesPollRequest) {
265 // See Core Spec, v5, Vol 3, Part A, Table 3.2.
266 EXPECT_FALSE(StaticByteBuffer(0b0'0001, 0)
267 .To<SimpleSupervisoryFrame>()
268 .is_poll_request());
269 EXPECT_TRUE(StaticByteBuffer(0b1'0001, 0)
270 .To<SimpleSupervisoryFrame>()
271 .is_poll_request());
272 }
273
TEST(FrameHeadersSimpleSupervisoryFrameTest,IdentifiesPollResponse)274 TEST(FrameHeadersSimpleSupervisoryFrameTest, IdentifiesPollResponse) {
275 // See Core Spec, v5, Vol 3, Part A, Table 3.2.
276 EXPECT_FALSE(StaticByteBuffer(0b0000'0001, 0)
277 .To<SimpleSupervisoryFrame>()
278 .is_poll_response());
279 EXPECT_TRUE(StaticByteBuffer(0b1000'0001, 0)
280 .To<SimpleSupervisoryFrame>()
281 .is_poll_response());
282 }
283
TEST(FrameHeadersSimpleSupervisoryFrameTest,FunctionReadsSupervisoryFunction)284 TEST(FrameHeadersSimpleSupervisoryFrameTest, FunctionReadsSupervisoryFunction) {
285 // See Core Spec, v5, Vol 3, Part A, Table 3.2 and Table 3.5.
286 EXPECT_EQ(
287 SupervisoryFunction::ReceiverReady,
288 StaticByteBuffer(0b0001, 0).To<SimpleSupervisoryFrame>().function());
289 EXPECT_EQ(
290 SupervisoryFunction::Reject,
291 StaticByteBuffer(0b0101, 0).To<SimpleSupervisoryFrame>().function());
292 EXPECT_EQ(
293 SupervisoryFunction::ReceiverNotReady,
294 StaticByteBuffer(0b1001, 0).To<SimpleSupervisoryFrame>().function());
295 EXPECT_EQ(
296 SupervisoryFunction::SelectiveReject,
297 StaticByteBuffer(0b1101, 0).To<SimpleSupervisoryFrame>().function());
298 }
299
TEST(FrameHeadersSimpleSupervisoryFrameTest,SetIsPollRequestSetsCorrectBit)300 TEST(FrameHeadersSimpleSupervisoryFrameTest, SetIsPollRequestSetsCorrectBit) {
301 SimpleSupervisoryFrame sframe(SupervisoryFunction::ReceiverReady);
302 sframe.set_is_poll_request();
303 // See Core Spec, v5, Vol 3, Part A, Table 3.2.
304 EXPECT_EQ(StaticByteBuffer(0b1'0001, 0), BufferView(&sframe, sizeof(sframe)));
305 }
306
TEST(FrameHeadersSimpleSupervisoryFrameTest,SetIsPollResponseSetsCorrectBit)307 TEST(FrameHeadersSimpleSupervisoryFrameTest, SetIsPollResponseSetsCorrectBit) {
308 SimpleSupervisoryFrame sframe(SupervisoryFunction::ReceiverReady);
309 sframe.set_is_poll_response();
310 // See Core Spec, v5, Vol 3, Part A, Table 3.2.
311 EXPECT_EQ(StaticByteBuffer(0b1000'0001, 0),
312 BufferView(&sframe, sizeof(sframe)));
313 }
314
TEST(FrameHeadersSimpleReceiverReadyFrameTest,IsConstructedProperly)315 TEST(FrameHeadersSimpleReceiverReadyFrameTest, IsConstructedProperly) {
316 SimpleReceiverReadyFrame frame;
317 // See Core Spec, v5, Vol 3, Part A, Table 3.2 and Table 3.5.
318 EXPECT_EQ(StaticByteBuffer(0b0001, 0), BufferView(&frame, sizeof(frame)));
319 }
320
321 } // namespace
322 } // namespace bt::l2cap::internal
323