Skip to content

Commit a8f59be

Browse files
mgonzalezlopezudclevy
authored andcommitted
refactor(802.11): 24-bit OFDM SIGNAL layout helpers
Added [Ieee80211OfdmSignalField.h](src/inet/physicallayer/wireless/ieee80211/packetlevel/Ieee80211OfdmSignalField.h) with shared `packIeee80211OfdmSignalField()` / `unpackIeee80211OfdmSignalField()` helpers for the 24-bit OFDM SIGNAL layout. Then updated: - [Ieee80211PhyHeaderSerializer.cc](src/inet/physicallayer/wireless/ieee80211/packetlevel/Ieee80211PhyHeaderSerializer.cc) to use the shared helper instead of its private `packOfdmSignal()` logic. - [Ieee80211OfdmRadio.cc](src/inet/physicallayer/wireless/ieee80211/bitlevel/Ieee80211OfdmRadio.cc) to use the same unpack helper in `decapsulate()` instead of duplicating the bit masks inline.
1 parent 14a71f5 commit a8f59be

3 files changed

Lines changed: 74 additions & 21 deletions

File tree

src/inet/physicallayer/wireless/ieee80211/bitlevel/Ieee80211OfdmRadio.cc

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "inet/common/packet/chunk/BytesChunk.h"
1313
#include "inet/physicallayer/wireless/ieee80211/bitlevel/Ieee80211LayeredOfdmReceiver.h"
1414
#include "inet/physicallayer/wireless/ieee80211/bitlevel/Ieee80211LayeredOfdmTransmitter.h"
15+
#include "inet/physicallayer/wireless/ieee80211/packetlevel/Ieee80211OfdmSignalField.h"
1516
#include "inet/physicallayer/wireless/ieee80211/packetlevel/Ieee80211PhyHeader_m.h"
1617
#include "inet/physicallayer/wireless/ieee80211/packetlevel/Ieee80211Tag_m.h"
1718

@@ -45,13 +46,13 @@ void Ieee80211OfdmRadio::decapsulate(Packet *packet) const
4546
if (!packet->hasBitError()) {
4647
auto ofdmReceiver = check_and_cast<const Ieee80211LayeredOfdmReceiver *>(receiver);
4748
const auto& phyHeaderBytes = packet->peekDataAt<BytesChunk>(b(0), B(5), Chunk::PF_ALLOW_IMPROPERLY_REPRESENTED);
48-
auto signal = phyHeaderBytes->getByte(0) | (phyHeaderBytes->getByte(1) << 8) | (phyHeaderBytes->getByte(2) << 16);
49+
auto signalField = unpackIeee80211OfdmSignalField(phyHeaderBytes->getByte(0), phyHeaderBytes->getByte(1), phyHeaderBytes->getByte(2));
4950
const auto& phyHeader = makeShared<Ieee80211OfdmPhyHeader>();
50-
phyHeader->setRate(signal & 0xF);
51-
phyHeader->setReserved((signal & 0x10) != 0);
52-
phyHeader->setLengthField(B((signal >> 5) & 0xFFF));
53-
phyHeader->setParity((signal & 0x20000) != 0);
54-
phyHeader->setTail((signal >> 18) & 0x3F);
51+
phyHeader->setRate(signalField.rate);
52+
phyHeader->setReserved(signalField.reserved);
53+
phyHeader->setLengthField(B(signalField.length));
54+
phyHeader->setParity(signalField.parity);
55+
phyHeader->setTail(signalField.tail);
5556
phyHeader->setService(phyHeaderBytes->getByte(3) | (phyHeaderBytes->getByte(4) << 8));
5657
packet->eraseAtFront(B(5));
5758
auto mode = ofdmReceiver->getMode(packet);
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//
2+
// Copyright (C) 2026
3+
//
4+
// SPDX-License-Identifier: LGPL-3.0-or-later
5+
//
6+
7+
#ifndef __INET_IEEE80211OFDMSIGNALFIELD_H
8+
#define __INET_IEEE80211OFDMSIGNALFIELD_H
9+
10+
#include <cstdint>
11+
12+
namespace inet {
13+
14+
namespace physicallayer {
15+
16+
struct Ieee80211OfdmSignalField
17+
{
18+
uint8_t rate = 0;
19+
bool reserved = false;
20+
uint16_t length = 0;
21+
bool parity = false;
22+
uint8_t tail = 0;
23+
};
24+
25+
inline uint32_t packIeee80211OfdmSignalField(uint8_t rate, bool reserved, uint16_t length, bool parity, uint8_t tail)
26+
{
27+
// IEEE Std 802.11-2024 Figure 17-5 and 17.3.4: SIGNAL bit 0 is RATE bit
28+
// R1 and the LSB is transmitted first.
29+
return static_cast<uint32_t>(rate & 0xF) |
30+
(reserved ? 0x10 : 0) |
31+
(static_cast<uint32_t>(length & 0xFFF) << 5) |
32+
(parity ? 0x20000 : 0) |
33+
(static_cast<uint32_t>(tail & 0x3F) << 18);
34+
}
35+
36+
inline Ieee80211OfdmSignalField unpackIeee80211OfdmSignalField(uint32_t signal)
37+
{
38+
Ieee80211OfdmSignalField field;
39+
field.rate = static_cast<uint8_t>(signal & 0xF);
40+
field.reserved = (signal & 0x10) != 0;
41+
field.length = static_cast<uint16_t>((signal >> 5) & 0xFFF);
42+
field.parity = (signal & 0x20000) != 0;
43+
field.tail = static_cast<uint8_t>((signal >> 18) & 0x3F);
44+
return field;
45+
}
46+
47+
inline Ieee80211OfdmSignalField unpackIeee80211OfdmSignalField(uint8_t byte0, uint8_t byte1, uint8_t byte2)
48+
{
49+
uint32_t signal = static_cast<uint32_t>(byte0) |
50+
(static_cast<uint32_t>(byte1) << 8) |
51+
(static_cast<uint32_t>(byte2) << 16);
52+
return unpackIeee80211OfdmSignalField(signal);
53+
}
54+
55+
} // namespace physicallayer
56+
57+
} // namespace inet
58+
59+
#endif

src/inet/physicallayer/wireless/ieee80211/packetlevel/Ieee80211PhyHeaderSerializer.cc

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "inet/physicallayer/wireless/ieee80211/packetlevel/Ieee80211PhyHeaderSerializer.h"
99

1010
#include "inet/common/packet/serializer/ChunkSerializerRegistry.h"
11+
#include "inet/physicallayer/wireless/ieee80211/packetlevel/Ieee80211OfdmSignalField.h"
1112
#include "inet/physicallayer/wireless/ieee80211/packetlevel/Ieee80211PhyHeader_m.h"
1213

1314
namespace inet {
@@ -16,18 +17,9 @@ namespace physicallayer {
1617

1718
namespace {
1819

19-
uint32_t packOfdmSignal(uint8_t rate, bool reserved, uint16_t length, bool parity, uint8_t tail)
20-
{
21-
return (rate & 0xF) |
22-
(reserved ? 0x10 : 0) |
23-
((length & 0xFFF) << 5) |
24-
(parity ? 0x20000 : 0) |
25-
((tail & 0x3F) << 18);
26-
}
27-
2820
void writeOfdmSignal(MemoryOutputStream& stream, uint8_t rate, bool reserved, uint16_t length, bool parity, uint8_t tail)
2921
{
30-
auto signal = packOfdmSignal(rate, reserved, length, parity, tail);
22+
auto signal = packIeee80211OfdmSignalField(rate, reserved, length, parity, tail);
3123
stream.writeByte(signal & 0xFF);
3224
stream.writeByte((signal >> 8) & 0xFF);
3325
stream.writeByte((signal >> 16) & 0xFF);
@@ -38,11 +30,12 @@ void readOfdmSignal(MemoryInputStream& stream, uint8_t& rate, bool& reserved, ui
3830
uint32_t signal = stream.readByte();
3931
signal |= stream.readByte() << 8;
4032
signal |= stream.readByte() << 16;
41-
rate = signal & 0xF;
42-
reserved = (signal & 0x10) != 0;
43-
length = (signal >> 5) & 0xFFF;
44-
parity = (signal & 0x20000) != 0;
45-
tail = (signal >> 18) & 0x3F;
33+
auto field = unpackIeee80211OfdmSignalField(signal);
34+
rate = field.rate;
35+
reserved = field.reserved;
36+
length = field.length;
37+
parity = field.parity;
38+
tail = field.tail;
4639
}
4740

4841
} // namespace

0 commit comments

Comments
 (0)