A Discrete-Event Network Simulator
Home
Tutorials ▼
English
Documentation ▼
Installation
Manual
Models
Contributing
Wiki
Development ▼
API Docs
Issue Tracker
Merge Requests
API
Loading...
Searching...
No Matches
radiotap-header.cc
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2009 CTTC
3
*
4
* SPDX-License-Identifier: GPL-2.0-only
5
*
6
* Authors: Nicola Baldo <nbaldo@cttc.es>
7
* Sébastien Deronne <sebastien.deronne@gmail.com>
8
*/
9
10
#include "
radiotap-header.h
"
11
12
#include "ns3/log.h"
13
14
#include <bit>
15
#include <cmath>
16
#include <iomanip>
17
18
namespace
ns3
19
{
20
21
NS_LOG_COMPONENT_DEFINE
(
"RadiotapHeader"
);
22
23
NS_OBJECT_ENSURE_REGISTERED
(RadiotapHeader);
24
25
RadiotapHeader::RadiotapHeader
()
26
{
27
NS_LOG_FUNCTION
(
this
);
28
}
29
30
TypeId
31
RadiotapHeader::GetTypeId
()
32
{
33
static
TypeId
tid =
TypeId
(
"ns3::RadiotapHeader"
)
34
.
SetParent
<
Header
>()
35
.SetGroupName(
"Network"
)
36
37
.AddConstructor<
RadiotapHeader
>();
38
return
tid;
39
}
40
41
TypeId
42
RadiotapHeader::GetInstanceTypeId
()
const
43
{
44
return
GetTypeId
();
45
}
46
47
uint32_t
48
RadiotapHeader::GetSerializedSize
()
const
49
{
50
NS_LOG_FUNCTION
(
this
);
51
return
m_length
;
52
}
53
54
void
55
RadiotapHeader::Serialize
(
Buffer::Iterator
start)
const
56
{
57
NS_LOG_FUNCTION
(
this
<< &start);
58
59
start.WriteU8(0);
// major version of radiotap header
60
start.WriteU8(0);
// pad field
61
start.WriteU16(
m_length
);
// entire length of radiotap data + header
62
start.WriteU32(
m_present
);
// bits describing which fields follow header
63
if
(
m_presentExt
)
64
{
65
start.WriteU32(*
m_presentExt
);
// extended bitmasks
66
}
67
68
//
69
// Time Synchronization Function Timer (when the first bit of the MPDU
70
// arrived at the MAC)
71
// Reference: https://www.radiotap.org/fields/TSFT.html
72
//
73
if
(
m_present
&
RADIOTAP_TSFT
)
// bit 0
74
{
75
start.WriteU64(
m_tsft
);
76
}
77
78
//
79
// Properties of transmitted and received frames.
80
// Reference: https://www.radiotap.org/fields/Flags.html
81
//
82
if
(
m_present
&
RADIOTAP_FLAGS
)
// bit 1
83
{
84
start.WriteU8(
m_flags
);
85
}
86
87
//
88
// TX/RX data rate in units of 500 kbps
89
// Reference: https://www.radiotap.org/fields/Rate.html
90
//
91
if
(
m_present
&
RADIOTAP_RATE
)
// bit 2
92
{
93
start.WriteU8(
m_rate
);
94
}
95
96
//
97
// Tx/Rx frequency in MHz, followed by flags.
98
// Reference: https://www.radiotap.org/fields/Channel.html
99
//
100
if
(
m_present
&
RADIOTAP_CHANNEL
)
// bit 3
101
{
102
SerializeChannel
(start);
103
}
104
105
//
106
// The hop set and pattern for frequency-hopping radios. We don't need it but
107
// still need to account for it.
108
// Reference: https://www.radiotap.org/fields/FHSS.html
109
//
110
if
(
m_present
&
RADIOTAP_FHSS
)
// bit 4
111
{
112
start.WriteU8(0);
// not yet implemented
113
}
114
115
//
116
// RF signal power at the antenna, decibel difference from an arbitrary, fixed
117
// reference.
118
// Reference: https://www.radiotap.org/fields/Antenna%20signal.html
119
//
120
if
(
m_present
&
RADIOTAP_DBM_ANTSIGNAL
)
// bit 5
121
{
122
start.WriteU8(
m_antennaSignal
);
123
}
124
125
//
126
// RF noise power at the antenna, decibel difference from an arbitrary, fixed
127
// reference.
128
// Reference: https://www.radiotap.org/fields/Antenna%20noise.html
129
//
130
if
(
m_present
&
RADIOTAP_DBM_ANTNOISE
)
// bit 6
131
{
132
start.WriteU8(
m_antennaNoise
);
133
}
134
135
//
136
// Quality of Barker code lock.
137
// Reference: https://www.radiotap.org/fields/Lock%20quality.html
138
//
139
if
(
m_present
&
RADIOTAP_LOCK_QUALITY
)
// bit 7
140
{
141
start.WriteU16(0);
// not yet implemented
142
}
143
144
//
145
// Transmit power expressed as unitless distance from max power
146
// set at factory calibration (0 is max power).
147
// Reference: https://www.radiotap.org/fields/TX%20attenuation.html
148
//
149
if
(
m_present
&
RADIOTAP_TX_ATTENUATION
)
// bit 8
150
{
151
start.WriteU16(0);
// not yet implemented
152
}
153
154
//
155
// Transmit power expressed as decibel distance from max power
156
// set at factory calibration (0 is max power).
157
// Reference: https://www.radiotap.org/fields/dB%20TX%20attenuation.html
158
//
159
if
(
m_present
&
RADIOTAP_DB_TX_ATTENUATION
)
// bit 9
160
{
161
start.WriteU16(0);
// not yet implemented
162
}
163
164
//
165
// Transmit power expressed as dBm (decibels from a 1 milliwatt reference).
166
// This is the absolute power level measured at the antenna port.
167
// Reference: https://www.radiotap.org/fields/dBm%20TX%20power.html
168
//
169
if
(
m_present
&
RADIOTAP_DBM_TX_POWER
)
// bit 10
170
{
171
start.WriteU8(0);
// not yet implemented
172
}
173
174
//
175
// Unitless indication of the Rx/Tx antenna for this packet.
176
// The first antenna is antenna 0.
177
// Reference: https://www.radiotap.org/fields/Antenna.html
178
//
179
if
(
m_present
&
RADIOTAP_ANTENNA
)
// bit 11
180
{
181
start.WriteU8(0);
// not yet implemented
182
}
183
184
//
185
// RF signal power at the antenna (decibel difference from an arbitrary fixed reference).
186
// Reference: https://www.radiotap.org/fields/dB%20antenna%20signal.html
187
//
188
if
(
m_present
&
RADIOTAP_DB_ANTSIGNAL
)
// bit 12
189
{
190
start.WriteU8(0);
// not yet implemented
191
}
192
193
//
194
// RF noise power at the antenna (decibel difference from an arbitrary fixed reference).
195
// Reference: https://www.radiotap.org/fields/dB%20antenna%20noise.html
196
//
197
if
(
m_present
&
RADIOTAP_DB_ANTNOISE
)
// bit 13
198
{
199
start.WriteU8(0);
// not yet implemented
200
}
201
202
//
203
// Properties of received frames.
204
// Reference: https://www.radiotap.org/fields/RX%20flags.html
205
//
206
if
(
m_present
&
RADIOTAP_RX_FLAGS
)
// bit 14
207
{
208
start.WriteU16(0);
// not yet implemented
209
}
210
211
//
212
// MCS field.
213
// Reference: https://www.radiotap.org/fields/MCS.html
214
//
215
if
(
m_present
&
RADIOTAP_MCS
)
// bit 19
216
{
217
SerializeMcs
(start);
218
}
219
220
//
221
// A-MPDU Status, information about the received or transmitted A-MPDU.
222
// Reference: https://www.radiotap.org/fields/A-MPDU%20status.html
223
//
224
if
(
m_present
&
RADIOTAP_AMPDU_STATUS
)
// bit 20
225
{
226
SerializeAmpduStatus
(start);
227
}
228
229
//
230
// Information about the received or transmitted VHT frame.
231
// Reference: https://www.radiotap.org/fields/VHT.html
232
//
233
if
(
m_present
&
RADIOTAP_VHT
)
// bit 21
234
{
235
SerializeVht
(start);
236
}
237
238
//
239
// HE field.
240
// Reference: https://www.radiotap.org/fields/HE.html
241
//
242
if
(
m_present
&
RADIOTAP_HE
)
// bit 23
243
{
244
SerializeHe
(start);
245
}
246
247
//
248
// HE MU field.
249
// Reference: https://www.radiotap.org/fields/HE-MU.html
250
//
251
if
(
m_present
&
RADIOTAP_HE_MU
)
// bit 24
252
{
253
SerializeHeMu
(start);
254
}
255
256
//
257
// HE MU other user field.
258
// Reference: https://www.radiotap.org/fields/HE-MU-other-user.html
259
//
260
if
(
m_present
&
RADIOTAP_HE_MU_OTHER_USER
)
// bit 25
261
{
262
SerializeHeMuOtherUser
(start);
263
}
264
265
//
266
// U-SIG field.
267
// Reference: https://www.radiotap.org/fields/U-SIG.html
268
//
269
if
(
m_presentExt
&& (*
m_presentExt
&
RADIOTAP_USIG
))
// bit 33
270
{
271
SerializeUsig
(start);
272
}
273
274
//
275
// EHT field.
276
// Reference: https://www.radiotap.org/fields/EHT.html
277
//
278
if
(
m_presentExt
&& (*
m_presentExt
&
RADIOTAP_EHT_SIG
))
// bit 34
279
{
280
SerializeEht
(start);
281
}
282
}
283
284
uint32_t
285
RadiotapHeader::Deserialize
(
Buffer::Iterator
start)
286
{
287
NS_LOG_FUNCTION
(
this
<< &start);
288
289
uint8_t tmp = start.ReadU8();
// major version of radiotap header
290
NS_ASSERT_MSG
(tmp == 0x00,
"RadiotapHeader::Deserialize(): Unexpected major version"
);
291
start.ReadU8();
// pad field
292
293
m_length
= start.ReadU16();
// entire length of radiotap data + header
294
m_present
= start.ReadU32();
// bits describing which fields follow header
295
uint32_t
bytesRead = 8;
296
297
if
(
m_present
&
RADIOTAP_EXT
)
298
{
299
// If bit 31 of the it_present field is set, an extended it_present bitmask is present.
300
m_presentExt
= start.ReadU32();
301
bytesRead += 4;
302
}
303
304
//
305
// Time Synchronization Function Timer (when the first bit of the MPDU arrived at the MAC)
306
// Reference: https://www.radiotap.org/fields/TSFT.html
307
//
308
if
(
m_present
&
RADIOTAP_TSFT
)
// bit 0
309
{
310
m_tsft
= start.ReadU64();
311
bytesRead += 8;
312
}
313
314
//
315
// Properties of transmitted and received frames.
316
// Reference: https://www.radiotap.org/fields/Flags.html
317
//
318
if
(
m_present
&
RADIOTAP_FLAGS
)
// bit 1
319
{
320
m_flags
= start.ReadU8();
321
++bytesRead;
322
}
323
324
//
325
// TX/RX data rate in units of 500 kbps
326
// Reference: https://www.radiotap.org/fields/Rate.html
327
//
328
if
(
m_present
&
RADIOTAP_RATE
)
// bit 2
329
{
330
m_rate
= start.ReadU8();
331
++bytesRead;
332
}
333
334
//
335
// Tx/Rx frequency in MHz, followed by flags.
336
// Reference: https://www.radiotap.org/fields/Channel.html
337
//
338
if
(
m_present
&
RADIOTAP_CHANNEL
)
// bit 3
339
{
340
bytesRead +=
DeserializeChannel
(start, bytesRead);
341
}
342
343
//
344
// The hop set and pattern for frequency-hopping radios. We don't need it but
345
// still need to account for it.
346
// Reference: https://www.radiotap.org/fields/FHSS.html
347
//
348
if
(
m_present
&
RADIOTAP_FHSS
)
// bit 4
349
{
350
// not yet implemented
351
start.ReadU8();
352
++bytesRead;
353
}
354
355
//
356
// RF signal power at the antenna, decibel difference from an arbitrary, fixed
357
// reference.
358
// Reference: https://www.radiotap.org/fields/Antenna%20signal.html
359
//
360
if
(
m_present
&
RADIOTAP_DBM_ANTSIGNAL
)
// bit 5
361
{
362
m_antennaSignal
= start.ReadU8();
363
++bytesRead;
364
}
365
366
//
367
// RF noise power at the antenna, decibel difference from an arbitrary, fixed
368
// reference.
369
// Reference: https://www.radiotap.org/fields/Antenna%20noise.html
370
//
371
if
(
m_present
&
RADIOTAP_DBM_ANTNOISE
)
// bit 6
372
{
373
m_antennaNoise
= start.ReadU8();
374
++bytesRead;
375
}
376
377
//
378
// Quality of Barker code lock.
379
// Reference: https://www.radiotap.org/fields/Lock%20quality.html
380
//
381
if
(
m_present
&
RADIOTAP_LOCK_QUALITY
)
// bit 7
382
{
383
// not yet implemented
384
start.ReadU16();
385
bytesRead += 2;
386
}
387
388
//
389
// Transmit power expressed as unitless distance from max power
390
// set at factory calibration (0 is max power).
391
// Reference: https://www.radiotap.org/fields/TX%20attenuation.html
392
//
393
if
(
m_present
&
RADIOTAP_TX_ATTENUATION
)
// bit 8
394
{
395
// not yet implemented
396
start.ReadU16();
397
bytesRead += 2;
398
}
399
400
//
401
// Transmit power expressed as decibel distance from max power
402
// set at factory calibration (0 is max power).
403
// Reference: https://www.radiotap.org/fields/dB%20TX%20attenuation.html
404
//
405
if
(
m_present
&
RADIOTAP_DB_TX_ATTENUATION
)
// bit 9
406
{
407
// not yet implemented
408
start.ReadU16();
409
bytesRead += 2;
410
}
411
412
//
413
// Transmit power expressed as dBm (decibels from a 1 milliwatt reference).
414
// This is the absolute power level measured at the antenna port.
415
// Reference: https://www.radiotap.org/fields/dBm%20TX%20power.html
416
//
417
if
(
m_present
&
RADIOTAP_DBM_TX_POWER
)
// bit 10
418
{
419
// not yet implemented
420
start.ReadU8();
421
++bytesRead;
422
}
423
424
//
425
// Unitless indication of the Rx/Tx antenna for this packet.
426
// The first antenna is antenna 0.
427
// Reference: https://www.radiotap.org/fields/Antenna.html
428
//
429
if
(
m_present
&
RADIOTAP_ANTENNA
)
// bit 11
430
{
431
// not yet implemented
432
start.ReadU8();
433
++bytesRead;
434
}
435
436
//
437
// RF signal power at the antenna (decibel difference from an arbitrary fixed reference).
438
// Reference: https://www.radiotap.org/fields/dB%20antenna%20signal.html
439
//
440
if
(
m_present
&
RADIOTAP_DB_ANTSIGNAL
)
// bit 12
441
{
442
// not yet implemented
443
start.ReadU8();
444
++bytesRead;
445
}
446
447
//
448
// RF noise power at the antenna (decibel difference from an arbitrary fixed reference).
449
// Reference: https://www.radiotap.org/fields/dB%20antenna%20noise.html
450
//
451
if
(
m_present
&
RADIOTAP_DB_ANTNOISE
)
// bit 13
452
{
453
// not yet implemented
454
start.ReadU8();
455
++bytesRead;
456
}
457
458
//
459
// Properties of received frames.
460
// Reference: https://www.radiotap.org/fields/RX%20flags.html
461
//
462
if
(
m_present
&
RADIOTAP_RX_FLAGS
)
// bit 14
463
{
464
// not yet implemented
465
start.ReadU16();
466
bytesRead += 2;
467
}
468
469
//
470
// MCS field.
471
// Reference: https://www.radiotap.org/fields/MCS.html
472
//
473
if
(
m_present
&
RADIOTAP_MCS
)
// bit 19
474
{
475
bytesRead +=
DeserializeMcs
(start, bytesRead);
476
}
477
478
//
479
// A-MPDU Status, information about the received or transmitted A-MPDU.
480
// Reference: https://www.radiotap.org/fields/A-MPDU%20status.html
481
//
482
if
(
m_present
&
RADIOTAP_AMPDU_STATUS
)
483
{
484
bytesRead +=
DeserializeAmpduStatus
(start, bytesRead);
485
}
486
487
//
488
// Information about the received or transmitted VHT frame.
489
// Reference: https://www.radiotap.org/fields/VHT.html
490
//
491
if
(
m_present
&
RADIOTAP_VHT
)
// bit 21
492
{
493
bytesRead +=
DeserializeVht
(start, bytesRead);
494
}
495
496
//
497
// HE field.
498
// Reference: https://www.radiotap.org/fields/HE.html
499
//
500
if
(
m_present
&
RADIOTAP_HE
)
// bit 23
501
{
502
bytesRead +=
DeserializeHe
(start, bytesRead);
503
}
504
505
//
506
// HE MU field.
507
// Reference: https://www.radiotap.org/fields/HE-MU.html
508
//
509
if
(
m_present
&
RADIOTAP_HE_MU
)
// bit 24
510
{
511
bytesRead +=
DeserializeHeMu
(start, bytesRead);
512
}
513
514
//
515
// HE MU other user field.
516
// Reference: https://www.radiotap.org/fields/HE-MU-other-user.html
517
//
518
if
(
m_present
&
RADIOTAP_HE_MU_OTHER_USER
)
// bit 25
519
{
520
bytesRead +=
DeserializeHeMuOtherUser
(start, bytesRead);
521
}
522
523
//
524
// U-SIG field.
525
// Reference: https://www.radiotap.org/fields/U-SIG.html
526
//
527
if
(
m_presentExt
&& (*
m_presentExt
&
RADIOTAP_USIG
))
// bit 33
528
{
529
bytesRead +=
DeserializeUsig
(start, bytesRead);
530
}
531
532
//
533
// EHT field.
534
// Reference: https://www.radiotap.org/fields/EHT.html
535
//
536
if
(
m_presentExt
&& (*
m_presentExt
&
RADIOTAP_EHT_SIG
))
// bit 34
537
{
538
bytesRead +=
DeserializeEht
(start, bytesRead);
539
}
540
541
NS_ASSERT_MSG
(
m_length
== bytesRead,
542
"RadiotapHeader::Deserialize(): expected and actual lengths inconsistent"
);
543
return
bytesRead;
544
}
545
546
void
547
RadiotapHeader::Print
(std::ostream& os)
const
548
{
549
NS_LOG_FUNCTION
(
this
<< &os);
550
os <<
" tsft="
<<
m_tsft
<<
" flags="
<< std::hex <<
m_flags
<< std::dec <<
" rate="
<< +
m_rate
;
551
if
(
m_present
&
RADIOTAP_CHANNEL
)
552
{
553
PrintChannel
(os);
554
}
555
os << std::dec <<
" signal="
<< +
m_antennaSignal
<<
" noise="
<< +
m_antennaNoise
;
556
if
(
m_present
&
RADIOTAP_MCS
)
557
{
558
PrintMcs
(os);
559
}
560
if
(
m_present
&
RADIOTAP_AMPDU_STATUS
)
561
{
562
PrintAmpduStatus
(os);
563
}
564
if
(
m_present
&
RADIOTAP_VHT
)
565
{
566
PrintVht
(os);
567
}
568
if
(
m_present
&
RADIOTAP_HE
)
569
{
570
PrintHe
(os);
571
}
572
if
(
m_present
&
RADIOTAP_HE_MU
)
573
{
574
PrintHeMu
(os);
575
}
576
if
(
m_present
&
RADIOTAP_HE_MU_OTHER_USER
)
577
{
578
PrintHeMuOtherUser
(os);
579
}
580
if
(
m_presentExt
&& (*
m_presentExt
&
RADIOTAP_USIG
))
581
{
582
PrintUsig
(os);
583
}
584
if
(
m_presentExt
&& (*
m_presentExt
&
RADIOTAP_EHT_SIG
))
585
{
586
PrintEht
(os);
587
}
588
}
589
590
void
591
RadiotapHeader::SetTsft
(uint64_t value)
592
{
593
NS_LOG_FUNCTION
(
this
<< value);
594
595
NS_ASSERT_MSG
(!(
m_present
&
RADIOTAP_TSFT
),
"TSFT radiotap field already present"
);
596
m_present
|=
RADIOTAP_TSFT
;
597
m_length
+= 8;
598
m_tsft
= value;
599
600
NS_LOG_LOGIC
(
this
<<
" m_length="
<<
m_length
<<
" m_present=0x"
<< std::hex <<
m_present
601
<< std::dec);
602
}
603
604
void
605
RadiotapHeader::SetFrameFlags
(uint8_t flags)
606
{
607
NS_LOG_FUNCTION
(
this
<< +flags);
608
609
NS_ASSERT_MSG
(!(
m_present
&
RADIOTAP_FLAGS
),
"Flags radiotap field already present"
);
610
m_present
|=
RADIOTAP_FLAGS
;
611
m_length
+= 1;
612
m_flags
= flags;
613
614
NS_LOG_LOGIC
(
this
<<
" m_length="
<<
m_length
<<
" m_present=0x"
<< std::hex <<
m_present
615
<< std::dec);
616
}
617
618
void
619
RadiotapHeader::SetRate
(uint8_t rate)
620
{
621
NS_LOG_FUNCTION
(
this
<< +rate);
622
623
NS_ASSERT_MSG
(!(
m_present
&
RADIOTAP_RATE
),
"Rate radiotap field already present"
);
624
m_present
|=
RADIOTAP_RATE
;
625
m_length
+= 1;
626
m_rate
= rate;
627
628
NS_LOG_LOGIC
(
this
<<
" m_length="
<<
m_length
<<
" m_present=0x"
<< std::hex <<
m_present
629
<< std::dec);
630
}
631
632
void
633
RadiotapHeader::SetChannelFields
(
const
ChannelFields
& channelFields)
634
{
635
NS_LOG_FUNCTION
(
this
<< channelFields.
frequency
<< channelFields.
flags
);
636
637
NS_ASSERT_MSG
(!(
m_present
&
RADIOTAP_CHANNEL
),
"Channel radiotap field already present"
);
638
m_channelPad
= ((2 -
m_length
% 2) % 2);
639
m_present
|=
RADIOTAP_CHANNEL
;
640
m_length
+= (
sizeof
(
ChannelFields
) +
m_channelPad
);
641
m_channelFields
= channelFields;
642
643
NS_LOG_LOGIC
(
this
<<
" m_length="
<<
m_length
<<
" m_present=0x"
<< std::hex <<
m_present
644
<< std::dec);
645
}
646
647
void
648
RadiotapHeader::SerializeChannel
(
Buffer::Iterator
& start)
const
649
{
650
start.WriteU8(0,
m_channelPad
);
651
start.WriteU16(
m_channelFields
.
frequency
);
652
start.WriteU16(
m_channelFields
.
flags
);
653
}
654
655
uint32_t
656
RadiotapHeader::DeserializeChannel
(
Buffer::Iterator
start,
uint32_t
bytesRead)
657
{
658
m_channelPad
= ((2 - bytesRead % 2) % 2);
659
start.Next(
m_channelPad
);
660
m_channelFields
.
frequency
= start.ReadU16();
661
m_channelFields
.
flags
= start.ReadU16();
662
return
sizeof
(
ChannelFields
) +
m_channelPad
;
663
}
664
665
void
666
RadiotapHeader::PrintChannel
(std::ostream& os)
const
667
{
668
os <<
" channel.frequency="
<<
m_channelFields
.
frequency
<<
" channel.flags=0x"
<< std::hex
669
<<
m_channelFields
.
flags
<< std::dec;
670
}
671
672
void
673
RadiotapHeader::SetAntennaSignalPower
(
double
signal)
674
{
675
NS_LOG_FUNCTION
(
this
<< signal);
676
677
NS_ASSERT_MSG
(!(
m_present
&
RADIOTAP_DBM_ANTSIGNAL
),
678
"Antenna signal radiotap field already present"
);
679
m_present
|=
RADIOTAP_DBM_ANTSIGNAL
;
680
m_length
+= 1;
681
682
if
(signal > 127)
683
{
684
m_antennaSignal
= 127;
685
}
686
else
if
(signal < -128)
687
{
688
m_antennaSignal
= -128;
689
}
690
else
691
{
692
m_antennaSignal
=
static_cast<
int8_t
>
(floor(signal + 0.5));
693
}
694
695
NS_LOG_LOGIC
(
this
<<
" m_length="
<<
m_length
<<
" m_present=0x"
<< std::hex <<
m_present
696
<< std::dec);
697
}
698
699
void
700
RadiotapHeader::SetAntennaNoisePower
(
double
noise)
701
{
702
NS_LOG_FUNCTION
(
this
<< noise);
703
704
NS_ASSERT_MSG
(!(
m_present
&
RADIOTAP_DBM_ANTNOISE
),
705
"Antenna noise radiotap field already present"
);
706
m_present
|=
RADIOTAP_DBM_ANTNOISE
;
707
m_length
+= 1;
708
709
if
(noise > 127.0)
710
{
711
m_antennaNoise
= 127;
712
}
713
else
if
(noise < -128.0)
714
{
715
m_antennaNoise
= -128;
716
}
717
else
718
{
719
m_antennaNoise
=
static_cast<
int8_t
>
(floor(noise + 0.5));
720
}
721
722
NS_LOG_LOGIC
(
this
<<
" m_length="
<<
m_length
<<
" m_present=0x"
<< std::hex <<
m_present
723
<< std::dec);
724
}
725
726
void
727
RadiotapHeader::SetMcsFields
(
const
McsFields
& mcsFields)
728
{
729
NS_LOG_FUNCTION
(
this
<< +mcsFields.
known
<< +mcsFields.
flags
<< +mcsFields.
mcs
);
730
731
NS_ASSERT_MSG
(!(
m_present
&
RADIOTAP_MCS
),
"MCS radiotap field already present"
);
732
m_present
|=
RADIOTAP_MCS
;
733
m_length
+=
sizeof
(
McsFields
);
734
m_mcsFields
= mcsFields;
735
736
NS_LOG_LOGIC
(
this
<<
" m_length="
<<
m_length
<<
" m_present=0x"
<< std::hex <<
m_present
737
<< std::dec);
738
}
739
740
void
741
RadiotapHeader::SerializeMcs
(
Buffer::Iterator
& start)
const
742
{
743
start.WriteU8(
m_mcsFields
.
known
);
744
start.WriteU8(
m_mcsFields
.
flags
);
745
start.WriteU8(
m_mcsFields
.
mcs
);
746
}
747
748
uint32_t
749
RadiotapHeader::DeserializeMcs
(
Buffer::Iterator
start,
uint32_t
bytesRead)
750
{
751
m_mcsFields
.
known
= start.ReadU8();
752
m_mcsFields
.
flags
= start.ReadU8();
753
m_mcsFields
.
mcs
= start.ReadU8();
754
return
sizeof
(
McsFields
);
755
}
756
757
void
758
RadiotapHeader::PrintMcs
(std::ostream& os)
const
759
{
760
os <<
" mcs.known=0x"
<< std::hex << +
m_mcsFields
.
known
<<
" mcs.flags0x="
<< +
m_mcsFields
.
flags
761
<<
" mcsRate="
<< std::dec << +
m_mcsFields
.
mcs
;
762
}
763
764
void
765
RadiotapHeader::SetAmpduStatus
(
const
AmpduStatusFields
& ampduStatusFields)
766
{
767
NS_LOG_FUNCTION
(
this
<< ampduStatusFields.
referenceNumber
<< ampduStatusFields.
flags
);
768
769
NS_ASSERT_MSG
(!(
m_present
&
RADIOTAP_AMPDU_STATUS
),
770
"A-MPDU status radiotap field already present"
);
771
m_ampduStatusPad
= ((4 -
m_length
% 4) % 4);
772
m_present
|=
RADIOTAP_AMPDU_STATUS
;
773
m_length
+= (
sizeof
(ampduStatusFields) +
m_ampduStatusPad
);
774
m_ampduStatusFields
= ampduStatusFields;
775
776
NS_LOG_LOGIC
(
this
<<
" m_length="
<<
m_length
<<
" m_present=0x"
<< std::hex <<
m_present
777
<< std::dec);
778
}
779
780
void
781
RadiotapHeader::SerializeAmpduStatus
(
Buffer::Iterator
& start)
const
782
{
783
start.WriteU8(0,
m_ampduStatusPad
);
784
start.WriteU32(
m_ampduStatusFields
.
referenceNumber
);
785
start.WriteU16(
m_ampduStatusFields
.
flags
);
786
start.WriteU8(
m_ampduStatusFields
.
crc
);
787
start.WriteU8(
m_ampduStatusFields
.
reserved
);
788
}
789
790
uint32_t
791
RadiotapHeader::DeserializeAmpduStatus
(
Buffer::Iterator
start,
uint32_t
bytesRead)
792
{
793
m_ampduStatusPad
= ((4 - bytesRead % 4) % 4);
794
start.Next(
m_ampduStatusPad
);
795
m_ampduStatusFields
.
referenceNumber
= start.ReadU32();
796
m_ampduStatusFields
.
flags
= start.ReadU16();
797
m_ampduStatusFields
.
crc
= start.ReadU8();
798
m_ampduStatusFields
.
reserved
= start.ReadU8();
799
return
sizeof
(
AmpduStatusFields
) +
m_ampduStatusPad
;
800
}
801
802
void
803
RadiotapHeader::PrintAmpduStatus
(std::ostream& os)
const
804
{
805
os <<
" ampduStatus.flags=0x"
<< std::hex <<
m_ampduStatusFields
.
flags
<< std::dec;
806
}
807
808
void
809
RadiotapHeader::SetVhtFields
(
const
VhtFields
& vhtFields)
810
{
811
NS_LOG_FUNCTION
(
this
<< vhtFields.
known
<< vhtFields.
flags
<< +vhtFields.
mcsNss
.at(0)
812
<< +vhtFields.
mcsNss
.at(1) << +vhtFields.
mcsNss
.at(2)
813
<< +vhtFields.
mcsNss
.at(3) << +vhtFields.
coding
<< +vhtFields.
groupId
814
<< +vhtFields.
partialAid
);
815
816
NS_ASSERT_MSG
(!(
m_present
&
RADIOTAP_VHT
),
"VHT radiotap field already present"
);
817
m_vhtPad
= ((2 -
m_length
% 2) % 2);
818
m_present
|=
RADIOTAP_VHT
;
819
m_length
+= (
sizeof
(
VhtFields
) +
m_vhtPad
);
820
m_vhtFields
= vhtFields;
821
822
NS_LOG_LOGIC
(
this
<<
" m_length="
<<
m_length
<<
" m_present=0x"
<< std::hex <<
m_present
823
<< std::dec);
824
}
825
826
void
827
RadiotapHeader::SerializeVht
(
Buffer::Iterator
& start)
const
828
{
829
start.WriteU8(0,
m_vhtPad
);
830
start.WriteU16(
m_vhtFields
.
known
);
831
start.WriteU8(
m_vhtFields
.
flags
);
832
start.WriteU8(
m_vhtFields
.
bandwidth
);
833
for
(
const
auto
mcsNss :
m_vhtFields
.
mcsNss
)
834
{
835
start.WriteU8(mcsNss);
836
}
837
start.WriteU8(
m_vhtFields
.
coding
);
838
start.WriteU8(
m_vhtFields
.
groupId
);
839
start.WriteU16(
m_vhtFields
.
partialAid
);
840
}
841
842
uint32_t
843
RadiotapHeader::DeserializeVht
(
Buffer::Iterator
start,
uint32_t
bytesRead)
844
{
845
m_vhtPad
= ((2 - bytesRead % 2) % 2);
846
start.Next(
m_vhtPad
);
847
m_vhtFields
.
known
= start.ReadU16();
848
m_vhtFields
.
flags
= start.ReadU8();
849
m_vhtFields
.
bandwidth
= start.ReadU8();
850
for
(
auto
& mcsNss :
m_vhtFields
.
mcsNss
)
851
{
852
mcsNss = start.ReadU8();
853
}
854
m_vhtFields
.
coding
= start.ReadU8();
855
m_vhtFields
.
groupId
= start.ReadU8();
856
m_vhtFields
.
partialAid
= start.ReadU16();
857
return
sizeof
(
VhtFields
) +
m_vhtPad
;
858
}
859
860
void
861
RadiotapHeader::PrintVht
(std::ostream& os)
const
862
{
863
os <<
" vht.known=0x"
<<
m_vhtFields
.
known
<<
" vht.flags=0x"
<<
m_vhtFields
.
flags
864
<<
" vht.bandwidth="
<< std::dec <<
m_vhtFields
.
bandwidth
865
<<
" vht.mcsNss[0]="
<< +
m_vhtFields
.
mcsNss
.at(0)
866
<<
" vht.mcsNss[1]="
<< +
m_vhtFields
.
mcsNss
.at(1)
867
<<
" vht.mcsNss[2]="
<< +
m_vhtFields
.
mcsNss
.at(2)
868
<<
" vht.mcsNss[3]="
<< +
m_vhtFields
.
mcsNss
.at(3) <<
" vht.coding="
<<
m_vhtFields
.
coding
869
<<
" vht.groupId="
<<
m_vhtFields
.
groupId
<<
" vht.partialAid="
<<
m_vhtFields
.
partialAid
;
870
}
871
872
void
873
RadiotapHeader::SetHeFields
(
const
HeFields
& heFields)
874
{
875
NS_LOG_FUNCTION
(
this
<< heFields.
data1
<< heFields.
data2
<< heFields.
data3
<< heFields.
data4
876
<< heFields.
data5
<< heFields.
data6
);
877
878
NS_ASSERT_MSG
(!(
m_present
&
RADIOTAP_HE
),
"HE radiotap field already present"
);
879
m_hePad
= ((2 -
m_length
% 2) % 2);
880
m_present
|=
RADIOTAP_HE
;
881
m_length
+= (
sizeof
(heFields) +
m_hePad
);
882
m_heFields
= heFields;
883
884
NS_LOG_LOGIC
(
this
<<
" m_length="
<<
m_length
<<
" m_present=0x"
<< std::hex <<
m_present
885
<< std::dec);
886
}
887
888
void
889
RadiotapHeader::SerializeHe
(
Buffer::Iterator
& start)
const
890
{
891
start.WriteU8(0,
m_hePad
);
892
start.WriteU16(
m_heFields
.
data1
);
893
start.WriteU16(
m_heFields
.
data2
);
894
start.WriteU16(
m_heFields
.
data3
);
895
start.WriteU16(
m_heFields
.
data4
);
896
start.WriteU16(
m_heFields
.
data5
);
897
start.WriteU16(
m_heFields
.
data6
);
898
}
899
900
uint32_t
901
RadiotapHeader::DeserializeHe
(
Buffer::Iterator
start,
uint32_t
bytesRead)
902
{
903
m_hePad
= ((2 - bytesRead % 2) % 2);
904
start.Next(
m_hePad
);
905
m_heFields
.
data1
= start.ReadU16();
906
m_heFields
.
data2
= start.ReadU16();
907
m_heFields
.
data3
= start.ReadU16();
908
m_heFields
.
data4
= start.ReadU16();
909
m_heFields
.
data5
= start.ReadU16();
910
m_heFields
.
data6
= start.ReadU16();
911
return
sizeof
(
HeFields
) +
m_hePad
;
912
}
913
914
void
915
RadiotapHeader::PrintHe
(std::ostream& os)
const
916
{
917
os <<
" he.data1=0x"
<< std::hex <<
m_heFields
.
data1
<<
" he.data2=0x"
<< std::hex
918
<<
m_heFields
.
data2
<<
" he.data3=0x"
<< std::hex <<
m_heFields
.
data3
<<
" he.data4=0x"
919
<< std::hex <<
m_heFields
.
data4
<<
" he.data5=0x"
<< std::hex <<
m_heFields
.
data5
920
<<
" he.data6=0x"
<< std::hex <<
m_heFields
.
data6
<< std::dec;
921
}
922
923
void
924
RadiotapHeader::SetHeMuFields
(
const
HeMuFields
& heMuFields)
925
{
926
NS_LOG_FUNCTION
(
this
<< heMuFields.
flags1
<< heMuFields.
flags2
);
927
928
NS_ASSERT_MSG
(!(
m_present
&
RADIOTAP_HE_MU
),
"HE-MU radiotap field already present"
);
929
m_heMuPad
= ((2 -
m_length
% 2) % 2);
930
m_present
|=
RADIOTAP_HE_MU
;
931
m_length
+= (
sizeof
(heMuFields) +
m_heMuPad
);
932
m_heMuFields
= heMuFields;
933
934
NS_LOG_LOGIC
(
this
<<
" m_length="
<<
m_length
<<
" m_present=0x"
<< std::hex <<
m_present
935
<< std::dec);
936
}
937
938
void
939
RadiotapHeader::SerializeHeMu
(
Buffer::Iterator
& start)
const
940
{
941
start.WriteU8(0,
m_heMuPad
);
942
start.WriteU16(
m_heMuFields
.
flags1
);
943
start.WriteU16(
m_heMuFields
.
flags2
);
944
for
(
const
auto
ruChannel :
m_heMuFields
.
ruChannel1
)
945
{
946
start.WriteU8(ruChannel);
947
}
948
for
(
const
auto
ruChannel :
m_heMuFields
.
ruChannel2
)
949
{
950
start.WriteU8(ruChannel);
951
}
952
}
953
954
uint32_t
955
RadiotapHeader::DeserializeHeMu
(
Buffer::Iterator
start,
uint32_t
bytesRead)
956
{
957
m_heMuPad
= ((2 - bytesRead % 2) % 2);
958
start.Next(
m_heMuPad
);
959
m_heMuFields
.
flags1
= start.ReadU16();
960
m_heMuFields
.
flags2
= start.ReadU16();
961
for
(
auto
& ruChannel :
m_heMuFields
.
ruChannel1
)
962
{
963
ruChannel = start.ReadU8();
964
}
965
for
(
auto
& ruChannel :
m_heMuFields
.
ruChannel2
)
966
{
967
ruChannel = start.ReadU8();
968
}
969
return
sizeof
(
HeMuFields
) +
m_heMuPad
;
970
}
971
972
void
973
RadiotapHeader::PrintHeMu
(std::ostream& os)
const
974
{
975
os <<
" heMu.flags1=0x"
<< std::hex <<
m_heMuFields
.
flags1
<<
" heMu.flags2=0x"
976
<<
m_heMuFields
.
flags2
<< std::dec;
977
}
978
979
void
980
RadiotapHeader::SetHeMuOtherUserFields
(
const
HeMuOtherUserFields
& heMuOtherUserFields)
981
{
982
NS_LOG_FUNCTION
(
this
<< heMuOtherUserFields.
perUser1
<< heMuOtherUserFields.
perUser2
983
<< +heMuOtherUserFields.
perUserPosition
984
<< +heMuOtherUserFields.
perUserKnown
);
985
986
NS_ASSERT_MSG
(!(
m_present
&
RADIOTAP_HE_MU_OTHER_USER
),
987
"HE-MU-other-user radiotap field already present"
);
988
m_heMuOtherUserPad
= ((2 -
m_length
% 2) % 2);
989
m_present
|=
RADIOTAP_HE_MU_OTHER_USER
;
990
m_length
+= (
sizeof
(
HeMuOtherUserFields
) +
m_heMuOtherUserPad
);
991
m_heMuOtherUserFields
= heMuOtherUserFields;
992
993
NS_LOG_LOGIC
(
this
<<
" m_length="
<<
m_length
<<
" m_present=0x"
<< std::hex <<
m_present
994
<< std::dec);
995
}
996
997
void
998
RadiotapHeader::SerializeHeMuOtherUser
(
Buffer::Iterator
& start)
const
999
{
1000
start.WriteU8(0,
m_heMuOtherUserPad
);
1001
start.WriteU16(
m_heMuOtherUserFields
.
perUser1
);
1002
start.WriteU16(
m_heMuOtherUserFields
.
perUser2
);
1003
start.WriteU8(
m_heMuOtherUserFields
.
perUserPosition
);
1004
start.WriteU8(
m_heMuOtherUserFields
.
perUserKnown
);
1005
}
1006
1007
uint32_t
1008
RadiotapHeader::DeserializeHeMuOtherUser
(
Buffer::Iterator
start,
uint32_t
bytesRead)
1009
{
1010
m_heMuOtherUserPad
= ((2 - bytesRead % 2) % 2);
1011
start.Next(
m_heMuOtherUserPad
);
1012
m_heMuOtherUserFields
.
perUser1
= start.ReadU16();
1013
m_heMuOtherUserFields
.
perUser2
= start.ReadU16();
1014
m_heMuOtherUserFields
.
perUserPosition
= start.ReadU8();
1015
m_heMuOtherUserFields
.
perUserKnown
= start.ReadU8();
1016
return
sizeof
(
HeMuOtherUserFields
) +
m_heMuOtherUserPad
;
1017
}
1018
1019
void
1020
RadiotapHeader::PrintHeMuOtherUser
(std::ostream& os)
const
1021
{
1022
os <<
" heMuOtherUser.perUser1="
<<
m_heMuOtherUserFields
.
perUser1
1023
<<
" heMuOtherUser.perUser2="
<<
m_heMuOtherUserFields
.
perUser2
1024
<<
" heMuOtherUser.perUserPosition="
<<
m_heMuOtherUserFields
.
perUserPosition
1025
<<
" heMuOtherUser.perUserKnown=0x"
<< std::hex <<
m_heMuOtherUserFields
.
perUserKnown
1026
<< std::dec;
1027
}
1028
1029
void
1030
RadiotapHeader::SetUsigFields
(
const
UsigFields
& usigFields)
1031
{
1032
NS_LOG_FUNCTION
(
this
<< usigFields.
common
<< usigFields.
mask
<< usigFields.
value
);
1033
if
(!
m_presentExt
)
1034
{
1035
m_present
|=
RADIOTAP_TLV
|
RADIOTAP_EXT
;
1036
m_presentExt
= 0;
1037
m_length
+=
sizeof
(
RadiotapExtFlags
);
1038
}
1039
1040
NS_ASSERT_MSG
(!(*
m_presentExt
&
RADIOTAP_USIG
),
"U-SIG radiotap field already present"
);
1041
*
m_presentExt
|=
RADIOTAP_USIG
;
1042
1043
m_usigTlvPad
= ((8 -
m_length
% 8) % 8);
1044
m_usigTlv
.
type
= 32 + std::countr_zero<uint16_t>(
RADIOTAP_USIG
);
1045
m_usigTlv
.
length
=
sizeof
(
UsigFields
);
1046
m_length
+=
sizeof
(
TlvFields
) +
m_usigTlvPad
;
1047
1048
m_usigPad
= ((4 -
m_length
% 4) % 4);
1049
m_usigFields
= usigFields;
1050
m_length
+=
m_usigTlv
.
length
+
m_usigPad
;
1051
1052
NS_LOG_LOGIC
(
this
<<
" m_length="
<<
m_length
<<
" m_present=0x"
<< std::hex <<
m_present
1053
<<
" m_presentExt=0x"
<< *
m_presentExt
<< std::dec);
1054
}
1055
1056
void
1057
RadiotapHeader::SerializeUsig
(
Buffer::Iterator
& start)
const
1058
{
1059
start.WriteU8(0,
m_usigTlvPad
);
1060
start.WriteU16(
m_usigTlv
.
type
);
1061
start.WriteU16(
m_usigTlv
.
length
);
1062
start.WriteU8(0,
m_usigPad
);
1063
start.WriteU32(
m_usigFields
.
common
);
1064
start.WriteU32(
m_usigFields
.
value
);
1065
start.WriteU32(
m_usigFields
.
mask
);
1066
}
1067
1068
uint32_t
1069
RadiotapHeader::DeserializeUsig
(
Buffer::Iterator
start,
uint32_t
bytesRead)
1070
{
1071
const
auto
startBytesRead = bytesRead;
1072
m_usigTlvPad
= ((8 - bytesRead % 8) % 8);
1073
start.Next(
m_usigTlvPad
);
1074
bytesRead +=
m_usigTlvPad
;
1075
m_usigTlv
.
type
= start.ReadU16();
1076
m_usigTlv
.
length
= start.ReadU16();
1077
bytesRead +=
sizeof
(
TlvFields
);
1078
m_usigPad
= ((4 - bytesRead % 4) % 4);
1079
start.Next(
m_usigPad
);
1080
bytesRead +=
m_usigPad
;
1081
m_usigFields
.
common
= start.ReadU32();
1082
m_usigFields
.
value
= start.ReadU32();
1083
m_usigFields
.
mask
= start.ReadU32();
1084
bytesRead +=
sizeof
(
UsigFields
);
1085
return
bytesRead - startBytesRead;
1086
}
1087
1088
void
1089
RadiotapHeader::PrintUsig
(std::ostream& os)
const
1090
{
1091
os <<
" usig.common=0x"
<< std::hex <<
m_usigFields
.
common
<<
" usig.value=0x"
1092
<<
m_usigFields
.
value
<<
" usig.mask=0x"
<<
m_usigFields
.
mask
<< std::dec;
1093
}
1094
1095
void
1096
RadiotapHeader::SetEhtFields
(
const
EhtFields
& ehtFields)
1097
{
1098
NS_LOG_FUNCTION
(
this
<< ehtFields.
known
);
1099
if
(!
m_presentExt
)
1100
{
1101
m_present
|=
RADIOTAP_TLV
|
RADIOTAP_EXT
;
1102
m_presentExt
= 0;
1103
m_length
+=
sizeof
(
RadiotapExtFlags
);
1104
}
1105
1106
NS_ASSERT_MSG
(!(*
m_presentExt
&
RADIOTAP_EHT_SIG
),
"EHT radiotap field already present"
);
1107
*
m_presentExt
|=
RADIOTAP_EHT_SIG
;
1108
1109
m_ehtTlvPad
= ((8 -
m_length
% 8) % 8);
1110
m_ehtTlv
.
type
= 32 + std::countr_zero<uint16_t>(
RADIOTAP_EHT_SIG
);
1111
m_ehtTlv
.
length
= (40 + ehtFields.
userInfo
.size() * 4);
1112
m_length
+=
sizeof
(
TlvFields
) +
m_ehtTlvPad
;
1113
1114
m_ehtPad
= ((4 -
m_length
% 4) % 4);
1115
m_ehtFields
= ehtFields;
1116
m_length
+=
m_ehtTlv
.
length
+
m_ehtPad
;
1117
1118
NS_LOG_LOGIC
(
this
<<
" m_length="
<<
m_length
<<
" m_present=0x"
<< std::hex <<
m_present
1119
<<
" m_presentExt=0x"
<< *
m_presentExt
<< std::dec);
1120
}
1121
1122
void
1123
RadiotapHeader::SerializeEht
(
Buffer::Iterator
& start)
const
1124
{
1125
start.WriteU8(0,
m_ehtTlvPad
);
1126
start.WriteU16(
m_ehtTlv
.
type
);
1127
start.WriteU16(
m_ehtTlv
.
length
);
1128
start.WriteU8(0,
m_ehtPad
);
1129
start.WriteU32(
m_ehtFields
.
known
);
1130
for
(
const
auto
dataField :
m_ehtFields
.
data
)
1131
{
1132
start.WriteU32(dataField);
1133
}
1134
for
(
const
auto
userInfoField :
m_ehtFields
.
userInfo
)
1135
{
1136
start.WriteU32(userInfoField);
1137
}
1138
}
1139
1140
uint32_t
1141
RadiotapHeader::DeserializeEht
(
Buffer::Iterator
start,
uint32_t
bytesRead)
1142
{
1143
const
auto
startBytesRead = bytesRead;
1144
1145
m_ehtTlvPad
= ((8 - bytesRead % 8) % 8);
1146
start.Next(
m_ehtTlvPad
);
1147
bytesRead +=
m_ehtTlvPad
;
1148
m_ehtTlv
.
type
= start.ReadU16();
1149
m_ehtTlv
.
length
= start.ReadU16();
1150
bytesRead +=
sizeof
(
TlvFields
);
1151
1152
m_ehtPad
= ((4 - bytesRead % 4) % 4);
1153
start.Next(
m_ehtPad
);
1154
bytesRead +=
m_ehtPad
;
1155
m_ehtFields
.
known
= start.ReadU32();
1156
bytesRead += 4;
1157
for
(
auto
& dataField :
m_ehtFields
.
data
)
1158
{
1159
dataField = start.ReadU32();
1160
bytesRead += 4;
1161
}
1162
const
auto
userInfosBytes =
m_ehtTlv
.
length
- bytesRead -
m_ehtTlvPad
;
1163
NS_ASSERT
(userInfosBytes % 4 == 0);
1164
const
std::size_t numUsers = userInfosBytes / 4;
1165
for
(std::size_t i = 0; i < numUsers; ++i)
1166
{
1167
m_ehtFields
.
userInfo
.push_back(start.ReadU32());
1168
bytesRead += 4;
1169
}
1170
1171
return
bytesRead - startBytesRead;
1172
}
1173
1174
void
1175
RadiotapHeader::PrintEht
(std::ostream& os)
const
1176
{
1177
os <<
" eht.known=0x"
<< std::hex <<
m_ehtFields
.
known
;
1178
std::size_t index = 0;
1179
for
(
const
auto
dataField :
m_ehtFields
.
data
)
1180
{
1181
os <<
" eht.data"
<< index++ <<
"=0x"
<< dataField;
1182
}
1183
index = 0;
1184
for
(
const
auto
userInfoField :
m_ehtFields
.
userInfo
)
1185
{
1186
os <<
" eht.userInfo"
<< index++ <<
"=0x"
<< userInfoField;
1187
}
1188
os << std::dec;
1189
}
1190
1191
}
// namespace ns3
int8_t
ns3::Buffer::Iterator
iterator in a Buffer instance
Definition
buffer.h:89
ns3::Header
Protocol header serialization and deserialization.
Definition
header.h:33
ns3::RadiotapHeader
Radiotap header implementation.
Definition
radiotap-header.h:31
ns3::RadiotapHeader::SerializeMcs
void SerializeMcs(Buffer::Iterator &start) const
Serialize the MCS radiotap header.
Definition
radiotap-header.cc:741
ns3::RadiotapHeader::m_presentExt
std::optional< uint32_t > m_presentExt
optional extended present bitmask
Definition
radiotap-header.h:1036
ns3::RadiotapHeader::m_heMuFields
HeMuFields m_heMuFields
HE MU fields.
Definition
radiotap-header.h:1065
ns3::RadiotapHeader::DeserializeHe
uint32_t DeserializeHe(Buffer::Iterator start, uint32_t bytesRead)
Deserialize the HE radiotap header.
Definition
radiotap-header.cc:901
ns3::RadiotapHeader::PrintHeMu
void PrintHeMu(std::ostream &os) const
Add HE-MU subfield/value pairs to the output stream.
Definition
radiotap-header.cc:973
ns3::RadiotapHeader::SerializeHe
void SerializeHe(Buffer::Iterator &start) const
Serialize the HE radiotap header.
Definition
radiotap-header.cc:889
ns3::RadiotapHeader::m_rate
uint8_t m_rate
TX/RX data rate in units of 500 kbps.
Definition
radiotap-header.h:1043
ns3::RadiotapHeader::PrintMcs
void PrintMcs(std::ostream &os) const
Add MCS subfield/value pairs to the output stream.
Definition
radiotap-header.cc:758
ns3::RadiotapHeader::SetAmpduStatus
void SetAmpduStatus(const AmpduStatusFields &duStatusFields)
Set the subfields of the A-MPDU status field.
Definition
radiotap-header.cc:765
ns3::RadiotapHeader::DeserializeUsig
uint32_t DeserializeUsig(Buffer::Iterator start, uint32_t bytesRead)
Deserialize the U-SIG radiotap header.
Definition
radiotap-header.cc:1069
ns3::RadiotapHeader::PrintEht
void PrintEht(std::ostream &os) const
Add EHT subfield/value pairs to the output stream.
Definition
radiotap-header.cc:1175
ns3::RadiotapHeader::GetTypeId
static TypeId GetTypeId()
Get the type ID.
Definition
radiotap-header.cc:31
ns3::RadiotapHeader::m_ampduStatusPad
uint8_t m_ampduStatusPad
A-MPDU Status Flags, padding before A-MPDU Status Field.
Definition
radiotap-header.h:1055
ns3::RadiotapHeader::PrintHeMuOtherUser
void PrintHeMuOtherUser(std::ostream &os) const
Add HE-MU-other-user subfield/value pairs to the output stream.
Definition
radiotap-header.cc:1020
ns3::RadiotapHeader::SetHeMuOtherUserFields
void SetHeMuOtherUserFields(const HeMuOtherUserFields &heMuOtherUserFields)
Set the subfields of the HE-MU-other-user field.
Definition
radiotap-header.cc:980
ns3::RadiotapHeader::m_ehtPad
uint8_t m_ehtPad
EHT padding.
Definition
radiotap-header.h:1077
ns3::RadiotapHeader::m_heFields
HeFields m_heFields
HE fields.
Definition
radiotap-header.h:1062
ns3::RadiotapHeader::m_heMuPad
uint8_t m_heMuPad
HE MU padding.
Definition
radiotap-header.h:1064
ns3::RadiotapHeader::Print
void Print(std::ostream &os) const override
This method is used by Packet::Print to print the content of the header as ascii data to a C++ output...
Definition
radiotap-header.cc:547
ns3::RadiotapHeader::m_usigPad
uint8_t m_usigPad
U-SIG padding.
Definition
radiotap-header.h:1072
ns3::RadiotapHeader::m_heMuOtherUserPad
uint8_t m_heMuOtherUserPad
HE MU other user padding.
Definition
radiotap-header.h:1067
ns3::RadiotapHeader::SetHeFields
void SetHeFields(const HeFields &heFields)
Set the subfields of the HE field.
Definition
radiotap-header.cc:873
ns3::RadiotapHeader::m_hePad
uint8_t m_hePad
HE padding.
Definition
radiotap-header.h:1061
ns3::RadiotapHeader::SerializeHeMuOtherUser
void SerializeHeMuOtherUser(Buffer::Iterator &start) const
Serialize the HE-MU-other-user radiotap header.
Definition
radiotap-header.cc:998
ns3::RadiotapHeader::m_ehtFields
EhtFields m_ehtFields
EHT fields.
Definition
radiotap-header.h:1078
ns3::RadiotapHeader::SetMcsFields
void SetMcsFields(const McsFields &mcsFields)
Set the subfields of the MCS field.
Definition
radiotap-header.cc:727
ns3::RadiotapHeader::SetRate
void SetRate(uint8_t rate)
Set the transmit/receive channel frequency in units of megahertz.
Definition
radiotap-header.cc:619
ns3::RadiotapHeader::m_ehtTlvPad
uint8_t m_ehtTlvPad
EHT TLV padding.
Definition
radiotap-header.h:1075
ns3::RadiotapHeader::m_antennaSignal
int8_t m_antennaSignal
RF signal power at the antenna, dB difference from an arbitrary, fixed reference.
Definition
radiotap-header.h:1048
ns3::RadiotapHeader::SetAntennaSignalPower
void SetAntennaSignalPower(double signal)
Set the RF signal power at the antenna as a decibel difference from an arbitrary, fixed reference.
Definition
radiotap-header.cc:673
ns3::RadiotapHeader::DeserializeAmpduStatus
uint32_t DeserializeAmpduStatus(Buffer::Iterator start, uint32_t bytesRead)
Deserialize the A-MPDU Status radiotap header.
Definition
radiotap-header.cc:791
ns3::RadiotapHeader::DeserializeVht
uint32_t DeserializeVht(Buffer::Iterator start, uint32_t bytesRead)
Deserialize the VHT radiotap header.
Definition
radiotap-header.cc:843
ns3::RadiotapHeader::DeserializeHeMuOtherUser
uint32_t DeserializeHeMuOtherUser(Buffer::Iterator start, uint32_t bytesRead)
Deserialize the HE-MU-other-user radiotap header.
Definition
radiotap-header.cc:1008
ns3::RadiotapHeader::SetTsft
void SetTsft(uint64_t tsft)
Set the Time Synchronization Function Timer (TSFT) value.
Definition
radiotap-header.cc:591
ns3::RadiotapHeader::PrintHe
void PrintHe(std::ostream &os) const
Add HE subfield/value pairs to the output stream.
Definition
radiotap-header.cc:915
ns3::RadiotapHeader::m_usigTlv
TlvFields m_usigTlv
U-SIG TLV fields.
Definition
radiotap-header.h:1071
ns3::RadiotapHeader::m_length
uint16_t m_length
entire length of radiotap data + header
Definition
radiotap-header.h:1034
ns3::RadiotapHeader::Serialize
void Serialize(Buffer::Iterator start) const override
This method is used by Packet::AddHeader to store the header into the byte buffer of a packet.
Definition
radiotap-header.cc:55
ns3::RadiotapHeader::m_present
uint32_t m_present
bits describing which fields follow header
Definition
radiotap-header.h:1035
ns3::RadiotapHeader::SetUsigFields
void SetUsigFields(const UsigFields &usigFields)
Set the subfields of the U-SIG field.
Definition
radiotap-header.cc:1030
ns3::RadiotapHeader::SerializeUsig
void SerializeUsig(Buffer::Iterator &start) const
Serialize the U-SIG radiotap header.
Definition
radiotap-header.cc:1057
ns3::RadiotapHeader::Deserialize
uint32_t Deserialize(Buffer::Iterator start) override
This method is used by Packet::RemoveHeader to re-create a header from the byte buffer of a packet.
Definition
radiotap-header.cc:285
ns3::RadiotapHeader::PrintUsig
void PrintUsig(std::ostream &os) const
Add U-SIG subfield/value pairs to the output stream.
Definition
radiotap-header.cc:1089
ns3::RadiotapHeader::PrintChannel
void PrintChannel(std::ostream &os) const
Add Channel subfield/value pairs to the output stream.
Definition
radiotap-header.cc:666
ns3::RadiotapHeader::GetInstanceTypeId
TypeId GetInstanceTypeId() const override
Get the most derived TypeId for this Object.
Definition
radiotap-header.cc:42
ns3::RadiotapHeader::DeserializeMcs
uint32_t DeserializeMcs(Buffer::Iterator start, uint32_t bytesRead)
Deserialize the MCS radiotap header.
Definition
radiotap-header.cc:749
ns3::RadiotapHeader::SerializeHeMu
void SerializeHeMu(Buffer::Iterator &start) const
Serialize the HE-MU radiotap header.
Definition
radiotap-header.cc:939
ns3::RadiotapHeader::m_mcsFields
McsFields m_mcsFields
MCS fields.
Definition
radiotap-header.h:1053
ns3::RadiotapHeader::SerializeAmpduStatus
void SerializeAmpduStatus(Buffer::Iterator &start) const
Serialize the A-MPDU Status radiotap header.
Definition
radiotap-header.cc:781
ns3::RadiotapHeader::SetVhtFields
void SetVhtFields(const VhtFields &vhtFields)
Set the subfields of the VHT field.
Definition
radiotap-header.cc:809
ns3::RadiotapHeader::SerializeEht
void SerializeEht(Buffer::Iterator &start) const
Serialize the EHT radiotap header.
Definition
radiotap-header.cc:1123
ns3::RadiotapHeader::DeserializeChannel
uint32_t DeserializeChannel(Buffer::Iterator start, uint32_t bytesRead)
Deserialize the Channel radiotap header.
Definition
radiotap-header.cc:656
ns3::RadiotapHeader::m_usigFields
UsigFields m_usigFields
U-SIG fields.
Definition
radiotap-header.h:1073
ns3::RadiotapHeader::RadiotapExtFlags
RadiotapExtFlags
Radiotap extended flags.
Definition
radiotap-header.h:1028
ns3::RadiotapHeader::RADIOTAP_USIG
@ RADIOTAP_USIG
Definition
radiotap-header.h:1030
ns3::RadiotapHeader::RADIOTAP_EHT_SIG
@ RADIOTAP_EHT_SIG
Definition
radiotap-header.h:1031
ns3::RadiotapHeader::SerializeChannel
void SerializeChannel(Buffer::Iterator &start) const
Serialize the Channel radiotap header.
Definition
radiotap-header.cc:648
ns3::RadiotapHeader::RADIOTAP_DB_ANTNOISE
@ RADIOTAP_DB_ANTNOISE
Definition
radiotap-header.h:1010
ns3::RadiotapHeader::RADIOTAP_HE_MU_OTHER_USER
@ RADIOTAP_HE_MU_OTHER_USER
Definition
radiotap-header.h:1017
ns3::RadiotapHeader::RADIOTAP_AMPDU_STATUS
@ RADIOTAP_AMPDU_STATUS
Definition
radiotap-header.h:1013
ns3::RadiotapHeader::RADIOTAP_DBM_ANTSIGNAL
@ RADIOTAP_DBM_ANTSIGNAL
Definition
radiotap-header.h:1002
ns3::RadiotapHeader::RADIOTAP_RX_FLAGS
@ RADIOTAP_RX_FLAGS
Definition
radiotap-header.h:1011
ns3::RadiotapHeader::RADIOTAP_VHT
@ RADIOTAP_VHT
Definition
radiotap-header.h:1014
ns3::RadiotapHeader::RADIOTAP_RATE
@ RADIOTAP_RATE
Definition
radiotap-header.h:999
ns3::RadiotapHeader::RADIOTAP_HE
@ RADIOTAP_HE
Definition
radiotap-header.h:1015
ns3::RadiotapHeader::RADIOTAP_HE_MU
@ RADIOTAP_HE_MU
Definition
radiotap-header.h:1016
ns3::RadiotapHeader::RADIOTAP_CHANNEL
@ RADIOTAP_CHANNEL
Definition
radiotap-header.h:1000
ns3::RadiotapHeader::RADIOTAP_TSFT
@ RADIOTAP_TSFT
Definition
radiotap-header.h:997
ns3::RadiotapHeader::RADIOTAP_DBM_TX_POWER
@ RADIOTAP_DBM_TX_POWER
Definition
radiotap-header.h:1007
ns3::RadiotapHeader::RADIOTAP_FLAGS
@ RADIOTAP_FLAGS
Definition
radiotap-header.h:998
ns3::RadiotapHeader::RADIOTAP_DB_ANTSIGNAL
@ RADIOTAP_DB_ANTSIGNAL
Definition
radiotap-header.h:1009
ns3::RadiotapHeader::RADIOTAP_DB_TX_ATTENUATION
@ RADIOTAP_DB_TX_ATTENUATION
Definition
radiotap-header.h:1006
ns3::RadiotapHeader::RADIOTAP_ANTENNA
@ RADIOTAP_ANTENNA
Definition
radiotap-header.h:1008
ns3::RadiotapHeader::RADIOTAP_TLV
@ RADIOTAP_TLV
Definition
radiotap-header.h:1020
ns3::RadiotapHeader::RADIOTAP_TX_ATTENUATION
@ RADIOTAP_TX_ATTENUATION
Definition
radiotap-header.h:1005
ns3::RadiotapHeader::RADIOTAP_MCS
@ RADIOTAP_MCS
Definition
radiotap-header.h:1012
ns3::RadiotapHeader::RADIOTAP_FHSS
@ RADIOTAP_FHSS
Definition
radiotap-header.h:1001
ns3::RadiotapHeader::RADIOTAP_DBM_ANTNOISE
@ RADIOTAP_DBM_ANTNOISE
Definition
radiotap-header.h:1003
ns3::RadiotapHeader::RADIOTAP_EXT
@ RADIOTAP_EXT
Definition
radiotap-header.h:1021
ns3::RadiotapHeader::RADIOTAP_LOCK_QUALITY
@ RADIOTAP_LOCK_QUALITY
Definition
radiotap-header.h:1004
ns3::RadiotapHeader::SetAntennaNoisePower
void SetAntennaNoisePower(double noise)
Set the RF noise power at the antenna as a decibel difference from an arbitrary, fixed reference.
Definition
radiotap-header.cc:700
ns3::RadiotapHeader::RadiotapHeader
RadiotapHeader()
Definition
radiotap-header.cc:25
ns3::RadiotapHeader::PrintVht
void PrintVht(std::ostream &os) const
Add VHT subfield/value pairs to the output stream.
Definition
radiotap-header.cc:861
ns3::RadiotapHeader::GetSerializedSize
uint32_t GetSerializedSize() const override
This method is used by Packet::AddHeader to store the header into the byte buffer of a packet.
Definition
radiotap-header.cc:48
ns3::RadiotapHeader::m_ehtTlv
TlvFields m_ehtTlv
EHT TLV fields.
Definition
radiotap-header.h:1076
ns3::RadiotapHeader::SetEhtFields
void SetEhtFields(const EhtFields &ehtFields)
Set the subfields of the EHT-SIG field.
Definition
radiotap-header.cc:1096
ns3::RadiotapHeader::m_channelFields
ChannelFields m_channelFields
Channel fields.
Definition
radiotap-header.h:1046
ns3::RadiotapHeader::m_usigTlvPad
uint8_t m_usigTlvPad
U-SIG TLV padding.
Definition
radiotap-header.h:1070
ns3::RadiotapHeader::m_channelPad
uint8_t m_channelPad
Channel padding.
Definition
radiotap-header.h:1045
ns3::RadiotapHeader::DeserializeHeMu
uint32_t DeserializeHeMu(Buffer::Iterator start, uint32_t bytesRead)
Deserialize the HE-MU radiotap header.
Definition
radiotap-header.cc:955
ns3::RadiotapHeader::m_vhtPad
uint8_t m_vhtPad
VHT padding.
Definition
radiotap-header.h:1058
ns3::RadiotapHeader::m_ampduStatusFields
AmpduStatusFields m_ampduStatusFields
A-MPDU Status fields.
Definition
radiotap-header.h:1056
ns3::RadiotapHeader::SerializeVht
void SerializeVht(Buffer::Iterator &start) const
Serialize the VHT radiotap header.
Definition
radiotap-header.cc:827
ns3::RadiotapHeader::PrintAmpduStatus
void PrintAmpduStatus(std::ostream &os) const
Add A-MPDU Status subfield/value pairs to the output stream.
Definition
radiotap-header.cc:803
ns3::RadiotapHeader::m_flags
uint8_t m_flags
Properties of transmitted and received frames.
Definition
radiotap-header.h:1041
ns3::RadiotapHeader::SetHeMuFields
void SetHeMuFields(const HeMuFields &heMuFields)
Set the subfields of the HE-MU field.
Definition
radiotap-header.cc:924
ns3::RadiotapHeader::SetChannelFields
void SetChannelFields(const ChannelFields &channelFields)
Set the subfields of the Channel field.
Definition
radiotap-header.cc:633
ns3::RadiotapHeader::m_heMuOtherUserFields
HeMuOtherUserFields m_heMuOtherUserFields
HE MU other user fields.
Definition
radiotap-header.h:1068
ns3::RadiotapHeader::SetFrameFlags
void SetFrameFlags(uint8_t flags)
Set the frame flags of the transmitted or received frame.
Definition
radiotap-header.cc:605
ns3::RadiotapHeader::m_vhtFields
VhtFields m_vhtFields
VHT fields.
Definition
radiotap-header.h:1059
ns3::RadiotapHeader::m_tsft
uint64_t m_tsft
Time Synchronization Function Timer (when the first bit of the MPDU arrived at the MAC)
Definition
radiotap-header.h:1038
ns3::RadiotapHeader::DeserializeEht
uint32_t DeserializeEht(Buffer::Iterator start, uint32_t bytesRead)
Deserialize the EHT radiotap header.
Definition
radiotap-header.cc:1141
ns3::RadiotapHeader::m_antennaNoise
int8_t m_antennaNoise
RF noise power at the antenna, dB difference from an arbitrary, fixed reference.
Definition
radiotap-header.h:1050
ns3::TypeId
a unique identifier for an interface.
Definition
type-id.h:49
ns3::TypeId::SetParent
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition
type-id.cc:1001
uint32_t
NS_ASSERT
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition
assert.h:55
NS_ASSERT_MSG
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition
assert.h:75
NS_LOG_COMPONENT_DEFINE
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition
log.h:191
NS_LOG_LOGIC
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition
log.h:271
NS_LOG_FUNCTION
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
Definition
log-macros-enabled.h:229
NS_OBJECT_ENSURE_REGISTERED
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition
object-base.h:35
ns3
Every class exported by the ns3 library is enclosed in the ns3 namespace.
radiotap-header.h
ns3::RadiotapHeader::AmpduStatusFields
structure that contains the subfields of the A-MPDU status field.
Definition
radiotap-header.h:247
ns3::RadiotapHeader::AmpduStatusFields::referenceNumber
uint32_t referenceNumber
A-MPDU reference number to identify all subframes belonging to the same A-MPDU.
Definition
radiotap-header.h:248
ns3::RadiotapHeader::AmpduStatusFields::crc
uint8_t crc
CRC field.
Definition
radiotap-header.h:251
ns3::RadiotapHeader::AmpduStatusFields::reserved
uint8_t reserved
Reserved field.
Definition
radiotap-header.h:252
ns3::RadiotapHeader::AmpduStatusFields::flags
uint16_t flags
flags field
Definition
radiotap-header.h:250
ns3::RadiotapHeader::ChannelFields
structure that contains the subfields of the Channel field.
Definition
radiotap-header.h:144
ns3::RadiotapHeader::ChannelFields::flags
uint16_t flags
flags field (
Definition
radiotap-header.h:146
ns3::RadiotapHeader::ChannelFields::frequency
uint16_t frequency
Tx/Rx frequency in MHz.
Definition
radiotap-header.h:145
ns3::RadiotapHeader::EhtFields
structure that contains the subfields of the EHT field.
Definition
radiotap-header.h:600
ns3::RadiotapHeader::EhtFields::userInfo
std::vector< uint32_t > userInfo
user info fields.
Definition
radiotap-header.h:603
ns3::RadiotapHeader::EhtFields::data
std::array< uint32_t, 9 > data
data fields.
Definition
radiotap-header.h:602
ns3::RadiotapHeader::EhtFields::known
uint32_t known
known field.
Definition
radiotap-header.h:601
ns3::RadiotapHeader::HeFields
structure that contains the subfields of the HE field.
Definition
radiotap-header.h:398
ns3::RadiotapHeader::HeFields::data1
uint16_t data1
data1 field
Definition
radiotap-header.h:399
ns3::RadiotapHeader::HeFields::data6
uint16_t data6
data6 field
Definition
radiotap-header.h:404
ns3::RadiotapHeader::HeFields::data4
uint16_t data4
data4 field
Definition
radiotap-header.h:402
ns3::RadiotapHeader::HeFields::data2
uint16_t data2
data2 field
Definition
radiotap-header.h:400
ns3::RadiotapHeader::HeFields::data3
uint16_t data3
data3 field
Definition
radiotap-header.h:401
ns3::RadiotapHeader::HeFields::data5
uint16_t data5
data5 field
Definition
radiotap-header.h:403
ns3::RadiotapHeader::HeMuFields
structure that contains the subfields of the HE-MU field.
Definition
radiotap-header.h:454
ns3::RadiotapHeader::HeMuFields::flags1
uint16_t flags1
flags1 field
Definition
radiotap-header.h:455
ns3::RadiotapHeader::HeMuFields::ruChannel2
std::array< uint8_t, 4 > ruChannel2
RU_channel2 field.
Definition
radiotap-header.h:458
ns3::RadiotapHeader::HeMuFields::flags2
uint16_t flags2
flags2 field
Definition
radiotap-header.h:456
ns3::RadiotapHeader::HeMuFields::ruChannel1
std::array< uint8_t, 4 > ruChannel1
RU_channel1 field.
Definition
radiotap-header.h:457
ns3::RadiotapHeader::HeMuOtherUserFields
structure that contains the subfields of the HE-MU-other-user field.
Definition
radiotap-header.h:487
ns3::RadiotapHeader::HeMuOtherUserFields::perUserKnown
uint8_t perUserKnown
per_user_known field
Definition
radiotap-header.h:491
ns3::RadiotapHeader::HeMuOtherUserFields::perUser2
uint16_t perUser2
per_user_2 field
Definition
radiotap-header.h:489
ns3::RadiotapHeader::HeMuOtherUserFields::perUserPosition
uint8_t perUserPosition
per_user_position field
Definition
radiotap-header.h:490
ns3::RadiotapHeader::HeMuOtherUserFields::perUser1
uint16_t perUser1
per_user_1 field
Definition
radiotap-header.h:488
ns3::RadiotapHeader::McsFields
structure that contains the subfields of the MCS field.
Definition
radiotap-header.h:213
ns3::RadiotapHeader::McsFields::flags
uint8_t flags
flags field
Definition
radiotap-header.h:215
ns3::RadiotapHeader::McsFields::mcs
uint8_t mcs
MCS index value.
Definition
radiotap-header.h:216
ns3::RadiotapHeader::McsFields::known
uint8_t known
known flags
Definition
radiotap-header.h:214
ns3::RadiotapHeader::TlvFields
structure that contains the subfields of the TLV fields.
Definition
radiotap-header.h:505
ns3::RadiotapHeader::TlvFields::length
uint16_t length
length field.
Definition
radiotap-header.h:507
ns3::RadiotapHeader::TlvFields::type
uint16_t type
type field.
Definition
radiotap-header.h:506
ns3::RadiotapHeader::UsigFields
structure that contains the subfields of the U-SIG field.
Definition
radiotap-header.h:514
ns3::RadiotapHeader::UsigFields::mask
uint32_t mask
mask field.
Definition
radiotap-header.h:517
ns3::RadiotapHeader::UsigFields::value
uint32_t value
value field.
Definition
radiotap-header.h:516
ns3::RadiotapHeader::UsigFields::common
uint32_t common
common field.
Definition
radiotap-header.h:515
ns3::RadiotapHeader::VhtFields
structure that contains the subfields of the VHT field.
Definition
radiotap-header.h:304
ns3::RadiotapHeader::VhtFields::coding
uint8_t coding
coding field
Definition
radiotap-header.h:309
ns3::RadiotapHeader::VhtFields::flags
uint8_t flags
flags field
Definition
radiotap-header.h:306
ns3::RadiotapHeader::VhtFields::groupId
uint8_t groupId
group_id field
Definition
radiotap-header.h:310
ns3::RadiotapHeader::VhtFields::bandwidth
uint8_t bandwidth
bandwidth field
Definition
radiotap-header.h:307
ns3::RadiotapHeader::VhtFields::mcsNss
std::array< uint8_t, 4 > mcsNss
mcs_nss field
Definition
radiotap-header.h:308
ns3::RadiotapHeader::VhtFields::partialAid
uint16_t partialAid
partial_aid field
Definition
radiotap-header.h:311
ns3::RadiotapHeader::VhtFields::known
uint16_t known
known flags field
Definition
radiotap-header.h:305
src
network
utils
radiotap-header.cc
Generated on Tue Apr 8 2025 15:27:17 for ns-3 by
1.11.0