Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
c647b2f
ieee80211: advertise AP HT discovery state from the MIB
mgonzalezlopezudc Sep 9, 2026
c5efa92
ieee80211: refresh associated HT state from accepted beacons
mgonzalezlopezudc Sep 8, 2026
843995a
ieee80211: reconcile HT operation across runtime channel changes
mgonzalezlopezudc Sep 8, 2026
1384084
fix(physicallayer): fix IEEE 802.11 HT/VHT MCS definitions and guard …
mgonzalezlopezudc Aug 29, 2026
630fa0e
fix(physicallayer): complete HT mode set guard interval catalog and l…
mgonzalezlopezudc Aug 29, 2026
e4c6b45
fix(physicallayer): support atomic radio and transmitter mode-set swi…
mgonzalezlopezudc Aug 29, 2026
e6d30c4
fix(linklayer): add guard interval configuration to rate selection an…
mgonzalezlopezudc Aug 29, 2026
1328892
fix(ieee80211): coordinate dynamic radio mode switches and enforce SS…
mgonzalezlopezudc Aug 29, 2026
17ac6a1
fix(linklayer): rebuild configured fixed modes on dynamic radio mode-…
mgonzalezlopezudc Aug 29, 2026
abad1d0
ieee80211: use legacy basic rates for group-addressed frames
mgonzalezlopezudc Sep 5, 2026
6a08467
ieee80211: make radio mode-set transitions transactional
mgonzalezlopezudc Sep 5, 2026
b11f35c
ieee80211: mark malformed response AIDs incorrect
mgonzalezlopezudc Sep 5, 2026
8d5bd8e
ieee80211: commit mode-set changes before observer notification
mgonzalezlopezudc Sep 5, 2026
c05e44a
Ieee80211Radio: publish listening changes after observer failures
mgonzalezlopezudc Sep 5, 2026
09c02fd
feature(physicallayer): add HT Greenfield mode set and PHY transmissi…
mgonzalezlopezudc Aug 29, 2026
9fa0f00
feature(linklayer): implement HT control-response rate selection and …
mgonzalezlopezudc Aug 29, 2026
0857b23
fix(ieee80211): negotiate HT Greenfield capability and fall back to H…
mgonzalezlopezudc Aug 30, 2026
e8a70b8
fix(linklayer): accept supported HT-mixed CTS responses in Greenfield…
mgonzalezlopezudc Aug 30, 2026
05c1e30
test(linklayer): add unit tests for Greenfield receiver capability an…
mgonzalezlopezudc Aug 30, 2026
eeceebe
fix(physicallayer): fix transmission duration decomposition for Short…
mgonzalezlopezudc Aug 30, 2026
da7c92d
tests(fingerprint): update baseline for wireless TXOP showcase
mgonzalezlopezudc Aug 30, 2026
b7c8be8
physicallayer: preserve scalar signal phase durations
mgonzalezlopezudc Sep 5, 2026
ef2593a
ieee80211: restore the timed HT and VHT header phase
mgonzalezlopezudc Sep 5, 2026
834a554
ieee80211: bound mandatory multicast rates by the requested rate
mgonzalezlopezudc Sep 5, 2026
a38044c
ieee80211: require unambiguous configured response modes
mgonzalezlopezudc Sep 5, 2026
eb9d3a8
ieee80211: document the packet PHY HT40 limitation
mgonzalezlopezudc Sep 5, 2026
9298bee
queueing: support selective extraction and departure signals
mgonzalezlopezudc Sep 9, 2026
80ee753
ieee80211: track pending queue departures through signals
mgonzalezlopezudc Sep 9, 2026
51699bf
ieee80211: make originator ADDBA transactions explicit
mgonzalezlopezudc Sep 9, 2026
e6b9d9c
ieee80211: reset recipient Block Ack state on renegotiation
mgonzalezlopezudc Sep 9, 2026
9d0bd2a
ieee80211: reassemble fragmented action frames before dispatch
mgonzalezlopezudc Sep 9, 2026
c78058a
ieee80211: cancel superseded management transactions
mgonzalezlopezudc Sep 9, 2026
103cd70
ieee80211: protect Block Ack teardown generations
mgonzalezlopezudc Sep 9, 2026
efbca13
ieee80211: schedule Block Ack inactivity with absolute deadlines
mgonzalezlopezudc Sep 9, 2026
4d117d7
ieee80211: make fragment reassembly generation-safe
mgonzalezlopezudc Sep 9, 2026
5f1c3bf
ieee80211: enforce receive lifetime during Block Ack reordering
mgonzalezlopezudc Sep 9, 2026
e651247
ieee80211: quarantine expired Block Ack agreements
mgonzalezlopezudc Sep 9, 2026
2b7f2b1
ieee80211: fix recipient BAR and ADDBA timeout handling
mgonzalezlopezudc Sep 9, 2026
cc32039
ieee80211: enforce valid A-MSDU fragmentation and sizing
mgonzalezlopezudc Sep 9, 2026
eba9576
tests: record wireless fingerprints for the ADDBA rework
mgonzalezlopezudc Sep 9, 2026
ba89f1b
ieee80211: preserve management bodies during fragmentation
mgonzalezlopezudc Sep 9, 2026
80518e7
feat(ieee80211): add HT compressed Block Ack
mgonzalezlopezudc Aug 15, 2026
6c6a191
fix(ieee80211): select Block Ack rates by base variant
mgonzalezlopezudc Aug 15, 2026
26f65fd
fix(ieee80211): answer valid compressed block ack requests
mgonzalezlopezudc Aug 15, 2026
63e860e
fix(ieee80211): correct Block Ack receive-window handling
mgonzalezlopezudc Aug 16, 2026
ef729f4
fix(ieee80211): make Block Ack receive processing transactional
mgonzalezlopezudc Aug 16, 2026
4e9663b
fix(ieee80211): record frames at Block Ack window start
mgonzalezlopezudc Aug 16, 2026
de757fd
ieee80211: preserve Block Ack transaction state
mgonzalezlopezudc Sep 5, 2026
f742ca7
ieee80211: correlate responses with the active receive step
mgonzalezlopezudc Sep 6, 2026
deff17a
ieee80211: centralize Block Ack receive-window arithmetic
mgonzalezlopezudc Sep 6, 2026
f6d5a59
ieee80211: Enforce compressed BAR eligibility before state changes
mgonzalezlopezudc Sep 6, 2026
dd0d341
ieee80211: Reject ineligible BARs before renewing agreement lifetime
mgonzalezlopezudc Sep 6, 2026
36d851d
ieee80211: correlate Block Ack responses by starting sequence
mgonzalezlopezudc Sep 6, 2026
4418f5d
ieee80211: require HT operation for compressed Block Ack
mgonzalezlopezudc Sep 6, 2026
17b47de
ieee80211: gate compressed BAR selection on the active mode
mgonzalezlopezudc Sep 6, 2026
596ea06
ieee80211: limit Basic BAR acknowledgment transitions to 64 positions
mgonzalezlopezudc Sep 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 78 additions & 0 deletions WHATSNEW
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,77 @@ Notable backward incompatible changes are the following:
adaptive rate control, either where a station transmits to several peers or
where it sends group-addressed traffic.

2. Packet queue extraction and lifecycle signals

IPacketQueue now supports queue-lifecycle signals and predicate-based extraction.
Direct C++ implementations of IPacketQueue must implement findPacket(), the
predicate overload of dequeuePacket(), and must emit packetQueueDeparture
with PacketQueueRemovalDetails exactly once whenever a packet is dequeued,
explicitly removed, or destructively dropped. Listeners subscribe to the queue
module and filter the source to exclude descendant queue emissions. Providers
connected to CompoundPacketQueueBase must also implement IPacketExtractor so
that a compound queue preserves the provider's scheduling policy when it
extracts a matching packet. Direct C++
implementations of IPacketExtractor must replace selected-pointer extraction
with findPacket(predicate) and dequeuePacket(predicate); predicates may be
evaluated repeatedly and must be stable and side-effect free throughout one
logical selection. WrrScheduler, LabelScheduler, and PriorityScheduler accept
ordinary IPassivePacketSource inputs; they require IPacketCollection only when
collection/aggregate access is used and IPacketExtractor only when predicate
extraction is used, reporting the unsupported operation lazily.
PriorityScheduler aggregate queries no longer return -1 when an input lacks
IPacketCollection; getNumPackets() and getTotalLength() now report that
unsupported operation with cRuntimeError. Update callers that treated -1 as
an unknown aggregate size, or connect collection-capable providers.
A-MSDU policies now receive the provider-selected anchor and frame-eligibility
predicate. Additional policy-selected members are removed through exact
predicate dequeues, preserving scheduler/flow accounting without requiring
collection enumeration order to match scheduling order.
BasicMsduAggregationPolicy conservatively considers only collection members
after the anchor and never bypasses an earlier blocked same-flow member.
IPacketBuffer::ICallback also provides an optional handlePacketDropped()
notification. Shared buffers invoke it only after all victims selected by one
overload operation have been detached from their owning queues. Compound
queues propagate destructive drops through arbitrary non-queue wrappers and
nested compound queues exactly once. PacketBuffer rejects packets owned by a
cPacketQueue whose owner cannot participate in the buffer callback contract.

3. Block Ack DELBA agreement ownership

IOriginatorBlockAckAgreementHandler::processReceivedDelba(),
IOriginatorBlockAckAgreementHandler::processTransmittedDelba(), and
IRecipientBlockAckAgreementHandler::processReceivedDelba() now return the
terminated agreement as a unique_ptr. Originator ADDBA response processing
now returns a typed outcome containing the established agreement and, when
local policy vetoes a successful response, its immediately terminated local
agreement and a best-effort initiator DELBA for Hcf to enqueue after emitting
the Added and Deleted signals. Such locally generated DELBAs carry
sender-local agreement-generation metadata (the originator reuses its ADDBA
transaction identity), and ordinary data continues with Normal Ack. They remain
eligible through the
final fragment; aborting one fragment cancels its siblings. After retry backoff,
a replacement ADDBA setup invalidates an older queued DELBA, so an unreported
disposal cannot suppress setup indefinitely and a delayed frame cannot
terminate a newer peer/TID agreement. The replacement setup reports that
obsolete identity so Hcf also removes all of its queued or in-progress packets.
Originator and recipient DELBA transmission handlers now receive the full
Packet so sender-local agreement-generation metadata is retained through
fragmentation and MAC retries. This changes
IRecipientBlockAckAgreementHandler::processTransmittedDelba() from accepting
only a DELBA header to accepting Packet*; custom handler implementations and
callers must migrate to the Packet form. A locally tagged DELBA carrying
agreement-generation metadata remains eligible across MAC retries and is
retired only when its final fragment is acknowledged or the teardown is
terminally aborted. Custom handler
implementations and callers must adopt processAcknowledgedDelba() and the
boolean processAbortedDelba() outcome; processTransmittedDelba() still returns
the agreement removed by an untagged DELBA, or null when none was removed.

OriginatorBlockAckAgreementPolicy now exposes the new `addbaResponseTimeout`
and `addbaRetryBackoff` NED parameters. C++ implementations of
IOriginatorBlockAckAgreementPolicy must replace computeAddbaFailureTimeout()
with getAddbaResponseTimeout() and implement computeAddbaRetryBackoff().

Notable backward compatible changes are the following:

1. IEEE 802.11 per-station rate statistics
Expand Down Expand Up @@ -186,6 +257,13 @@ Notable backward incompatible changes are the following:
These changes are backward incompatible for C++ code that directly references
the old combined ICMP error indication or tag types.

7. 802.11n control-response rate selection

Ordinary ACK and Basic BlockAck responses in the n(mixed-2.4Ghz) profile now
use the mandatory non-HT fallback because BSSBasicRateSet is not modelled.
This can change airtime, timeout trajectories, throughput, and fingerprints
in existing simulations. An HT RTS continues to receive an HT-mixed CTS.

Notable backward compatible changes are the following:

1. IPv6 network configurator
Expand Down
9 changes: 5 additions & 4 deletions doc/src/users-guide/ch-diffserv.rst
Original file line number Diff line number Diff line change
Expand Up @@ -282,9 +282,11 @@ interface is ready to transmit one. They have several input gates and
one output gate.

Modules that are connected to the inputs of a scheduler must implement
the :cpp:`IPacketQueue` C++ interface. Schedulers also implement the
:cpp:`IPacketQueue` interface, so they can be cascaded to other
schedulers and used as the output module of :ned:`IPacketQueue`'s.
the :cpp:`IPassivePacketSource` C++ interface. Collection and predicate
extraction operations additionally require the corresponding input provider
to implement :cpp:`IPacketCollection` and :cpp:`IPacketExtractor`, respectively.
Schedulers can be cascaded and used as the output module of compound packet
queues when those additional interfaces are available.

There are several possible scheduling disciplines (first come/first
served, priority, weighted fair, weighted round-robin, deadline-based,
Expand Down Expand Up @@ -589,4 +591,3 @@ implement three different drop priorities within the class. BE packets are
stored in a drop tail queue. Packets from AFxy and BE queues are
scheduled by a WRR scheduler, which ensures that the remaining bandwidth
is allocated among the classes according to the specified weights.

37 changes: 37 additions & 0 deletions examples/wireless/lan80211/omnetpp-ht-greenfield.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
[General]
network = Lan80211
abstract = true
cmdenv-express-mode = true

**.constraintAreaMinX = 0m
**.constraintAreaMinY = 0m
**.constraintAreaMinZ = 0m
**.constraintAreaMaxX = 600m
**.constraintAreaMaxY = 400m
**.constraintAreaMaxZ = 0m

**.arp.typename = "GlobalArp"
**.opMode = "n(greenfield-2.4Ghz)"
**.wlan[*].bitrate = 13Mbps

*.ap.wlan[*].address = "10:00:00:00:00:00"
*.host[*].**.mgmt.accessPointAddress = "10:00:00:00:00:00"

*.ap.mobility.typename = "StationaryMobility"
*.ap.mobility.initialX = 250m
*.ap.mobility.initialY = 200m
*.host[*].mobility.typename = "StationaryMobility"
*.host[*].mobility.initialY = 200m
*.host[0].mobility.initialX = 260m
*.host[1].mobility.initialX = 270m

[Config HtGreenfield]
description = "HT Greenfield mode exchanging ping traffic through an access point"
sim-time-limit = 2s
*.numHosts = 2
*.host[0].numApps = 0
*.host[1].numApps = 1
*.host[1].app[0].typename = "PingApp"
*.host[1].app[0].destAddr = "host[0]"
*.host[1].app[0].sendInterval = 100ms
*.host[1].app[0].printPing = true
23 changes: 23 additions & 0 deletions examples/wireless/qos/omnetpp.ini
Original file line number Diff line number Diff line change
Expand Up @@ -85,3 +85,26 @@ extends = MacQos

# radio medium
*.radioMedium.sameTransmissionStartTimeCheck = "ignore"

[Config MacQosWithTransactionalBlockAck]
description = "Exercises successful and timed-out ADDBA transactions"
extends = MacQosWithoutAggregation
sim-time-limit = 3s

# Use one voice flow so each wireless hop has a single peer/TID data flow.
*.cliHost.numApps = 1
*.cliHost.app[0].destPort = 5000
*.cliHost.app[0].packetName = "TransactionalBlockAck"
*.cliHost.app[0].startTime = 1s
*.cliHost.app[0].stopTime = 2s
*.cliHost.app[0].sendInterval = 10ms
*.srvHost.numApps = 1
*.srvHost.app[0].localPort = 5000

# The client-to-AP transaction succeeds. The AP-to-server transaction times
# out, because the server deliberately does not support Block Ack.
*.cliHost.wlan[0].mac.hcf.isBlockAckSupported = true
*.ap.wlan[0].mac.hcf.isBlockAckSupported = true
*.srvHost.wlan[0].mac.hcf.isBlockAckSupported = false
**.mac.hcf.originatorAckPolicy.blockAckReqThreshold = 2
**.mac.hcf.originatorBlockAckAgreementPolicy.addbaResponseTimeout = 250ms
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ module ExtUpperIeee80211Interface extends ExtInterface like IWirelessInterface
{
parameters:
string energySourceModule = default("");
string opMode @enum("a","b","g(erp)","g(mixed)","n(mixed-2.4Ghz)","p","ac") = default("g(mixed)");
string opMode @enum("a","b","g(erp)","g(mixed)","n(mixed-2.4Ghz)","n(greenfield-2.4Ghz)","p","ac") = default("g(mixed)");
double bitrate @unit(bps) = default(-1bps);
**.opMode = this.opMode;
**.bitrate = this.bitrate;
Expand Down Expand Up @@ -92,4 +92,3 @@ module ExtUpperIeee80211Interface extends ExtInterface like IWirelessInterface

classifier.in <-- { @display("m=n"); } <-- tap.lowerLayerOut;
}

3 changes: 1 addition & 2 deletions src/inet/linklayer/ieee80211/Ieee80211Interface.ned
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ module Ieee80211Interface extends NetworkInterface like IWirelessInterface
parameters:
string interfaceTableModule;
string energySourceModule = default("");
string opMode @enum("a","b","g(erp)","g(mixed)","n(mixed-2.4Ghz)","p","ac") = default("g(mixed)");
string opMode @enum("a","b","g(erp)","g(mixed)","n(mixed-2.4Ghz)","n(greenfield-2.4Ghz)","p","ac") = default("g(mixed)");
string address @mutable = default("auto"); // MAC address as hex string (12 hex digits), or
// "auto". "auto" values will be replaced by
// a generated MAC address in init stage 0.
Expand Down Expand Up @@ -129,4 +129,3 @@ module Ieee80211Interface extends NetworkInterface like IWirelessInterface

classifier.in <-- { @display("m=n"); } <-- upperLayerIn;
}

9 changes: 5 additions & 4 deletions src/inet/linklayer/ieee80211/mac/Ieee80211Frame.msg
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ const b LENGTH_ADDBAREQ = LENGTH_MGMT + B(9); // mgmt length + action body lengt
const b LENGTH_ADDBARESP = LENGTH_MGMT + B(9); // mgmt length + action body length
const b LENGTH_DELBA = LENGTH_MGMT + B(6); // mgmt length + action body length
const b LENGTH_BASIC_BLOCKACK = B(16 + 2 + (2 + 128) + 4); // header + ba control + ba information + fcs
const b LENGTH_COMPRESSED_BLOCKACK = B(16 + 2 + (2 + 8) + 4); // header + ba control + ba information + fcs
const b DATAFRAME_HEADER_MINLENGTH = B(2 + 2 + 3 * 6 + 2); //bits without QoS, without Address4: 2 + 2 + 3*6(addresses) + 2
const b QOSCONTROL_PART_LENGTH = b(2 * 8); // QoS Control field length (bits)
const short int MAX_NUM_FRAGMENTS = 16;
Expand Down Expand Up @@ -312,7 +313,7 @@ class Ieee80211AddbaResponse extends Ieee80211ActionFrame
//
class Ieee80211Delba extends Ieee80211ActionFrame
{
chunkLength = LENGTH_DELBA;
chunkLength = LENGTH_DELBA - B(4);
category = 3; // Category field is set to 3 (representing DELBA). (1 byte)
blockAckAction = 2; // Block Ack Action field is set to 2 (representing DELBA). (1 byte)

Expand Down Expand Up @@ -345,7 +346,7 @@ class Ieee80211BlockAckReq extends Ieee80211TwoAddressHeader

class Ieee80211BasicBlockAckReq extends Ieee80211BlockAckReq
{
chunkLength = B(38);
chunkLength = B(20);

int tidInfo; // The TID_INFO subfield of the BAR Control field of the Basic BlockAckReq frame contains the TID for which a Basic BlockAck frame is requested.

Expand All @@ -362,7 +363,7 @@ class Ieee80211BasicBlockAckReq extends Ieee80211BlockAckReq

class Ieee80211CompressedBlockAckReq extends Ieee80211BlockAckReq
{
chunkLength = B(38);
chunkLength = B(20);

int tidInfo; // The TID_INFO subfield of the BAR Control field of the Compressed BlockAckReq frame contains the TID for which a BlockAck frame is requested.
// The BAR Information field of the Compressed BlockAckReq frame contains the Block Ack Starting
Expand Down Expand Up @@ -444,7 +445,7 @@ class Ieee80211BasicBlockAck extends Ieee80211BlockAck
//
class Ieee80211CompressedBlockAck extends Ieee80211BlockAck
{
// chunkLength TODO
chunkLength = LENGTH_COMPRESSED_BLOCKACK - B(4);
multiTid = 0;
compressedBitmap = 1;

Expand Down
69 changes: 55 additions & 14 deletions src/inet/linklayer/ieee80211/mac/Ieee80211Mac.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

#include "inet/linklayer/ieee80211/mac/Ieee80211Mac.h"

#include <tuple>

#include <algorithm>

#include "inet/common/INETUtils.h"
Expand Down Expand Up @@ -67,24 +69,12 @@ void Ieee80211Mac::initialize(int stage)
radioModule->subscribe(IRadio::receptionStateChangedSignal, this);
radioModule->subscribe(IRadio::transmissionStateChangedSignal, this);
radioModule->subscribe(IRadio::receivedSignalPartChangedSignal, this);
getContainingNicModule(this)->subscribe(modesetChangedSignal, this);
radio = check_and_cast<IRadio *>(radioModule);
ds = check_and_cast<IDs *>(getSubmodule("ds"));
rx = check_and_cast<IRx *>(getSubmodule("rx"));
tx = check_and_cast<ITx *>(getSubmodule("tx"));
int operationalHtSpatialStreamLimit = std::min(radio->getAntenna()->getNumAntennas(),
modeSet->getMaximumNumberOfSpatialStreams());
std::set<Hz> operationalChannelWidths;
if (modeSet->isHtOperationSupported()) {
const auto *transmitter = dynamic_cast<const Ieee80211Transmitter *>(radio->getTransmitter());
const auto *receiver = dynamic_cast<const Ieee80211Receiver *>(radio->getReceiver());
if (transmitter == nullptr || receiver == nullptr)
throw cRuntimeError("HT operation requires Ieee80211Transmitter and Ieee80211Receiver");
for (auto channelWidth : modeSet->getHtSupportedChannelWidths())
if (transmitter->isHtChannelWidthSupported(channelWidth) &&
receiver->isHtChannelWidthSupported(channelWidth))
operationalChannelWidths.insert(channelWidth);
}
mib->updateLocalHtCapabilities(modeSet, operationalChannelWidths, operationalHtSpatialStreamLimit);
updateLocalHtCapabilities();
emit(modesetChangedSignal, modeSet);
if (isUp())
initializeRadioMode();
Expand All @@ -97,6 +87,24 @@ void Ieee80211Mac::initialize(int stage)
}
}

void Ieee80211Mac::updateLocalHtCapabilities()
{
int operationalHtSpatialStreamLimit = std::min(radio->getAntenna()->getNumAntennas(),
modeSet->getMaximumNumberOfSpatialStreams());
std::set<Hz> operationalChannelWidths;
if (modeSet->isHtOperationSupported()) {
const auto *transmitter = dynamic_cast<const Ieee80211Transmitter *>(radio->getTransmitter());
const auto *receiver = dynamic_cast<const Ieee80211Receiver *>(radio->getReceiver());
if (transmitter == nullptr || receiver == nullptr)
throw cRuntimeError("HT operation requires Ieee80211Transmitter and Ieee80211Receiver");
for (auto channelWidth : modeSet->getHtSupportedChannelWidths())
if (transmitter->isHtChannelWidthSupported(channelWidth) &&
receiver->isHtChannelWidthSupported(channelWidth))
operationalChannelWidths.insert(channelWidth);
}
mib->updateLocalHtCapabilities(modeSet, operationalChannelWidths, operationalHtSpatialStreamLimit);
}

void Ieee80211Mac::initializeRadioMode()
{
const char *initialRadioMode = par("initialRadioMode");
Expand Down Expand Up @@ -346,6 +354,30 @@ void Ieee80211Mac::receiveSignal(cComponent *source, simsignal_t signalID, intva
}
}

void Ieee80211Mac::receiveSignal(cComponent *source, simsignal_t signalID, cObject *obj, cObject *details)
{
Enter_Method("%s", cComponent::getSignalName(signalID));
if (signalID == modesetChangedSignal && obj != modeSet)
applyModeSet(check_and_cast<physicallayer::Ieee80211ModeSet *>(obj));
}

void Ieee80211Mac::applyModeSet(const physicallayer::Ieee80211ModeSet *newModeSet)
{
Enter_Method_Silent();
modeSet = const_cast<physicallayer::Ieee80211ModeSet *>(newModeSet);
updateLocalHtCapabilities();
}

std::function<void()> Ieee80211Mac::saveModeSetState()
{
Enter_Method_Silent();
auto restoreMib = mib->saveHtState();
return [this, state = std::make_tuple(modeSet), restoreMib]() mutable {
std::tie(modeSet) = std::move(state);
restoreMib();
};
}

void Ieee80211Mac::configureRadioMode(IRadio::RadioMode radioMode)
{
if (radio->getRadioMode() != radioMode) {
Expand Down Expand Up @@ -393,6 +425,15 @@ void Ieee80211Mac::sendDownPendingRadioConfigMsg()
}
}

void Ieee80211Mac::cancelManagementTransaction(uint64_t transactionId)
{
Enter_Method("cancelManagementTransaction");
if (mib->qos)
hcf->cancelManagementTransaction(transactionId);
else
dcf->cancelManagementTransaction(transactionId);
}

void Ieee80211Mac::processUpperFrame(Packet *packet, const Ptr<const Ieee80211DataOrMgmtHeader>& header)
{
Enter_Method("processUpperFrame(\"%s\")", packet->getName());
Expand Down
Loading
Loading