Skip to content

Commit 4c31e89

Browse files
mgonzalezlopezudclevy
authored andcommitted
fix(802.11): ACK-gated association update in [Ieee80211MgmtAp.cc](src/inet/linklayer/ieee80211/mgmt/Ieee80211MgmtAp.cc) and added the needed signal overload in [Ieee80211MgmtAp.h](src/inet/linklayer/ieee80211/mgmt/Ieee80211MgmtAp.h).
The AP now waits for `frameSequenceFinishedSignal`, verifies the response frame was ACKed, then marks the STA associated. I removed the eager association/reassociation state writes and the TODO comments.
1 parent a8f59be commit 4c31e89

2 files changed

Lines changed: 33 additions & 10 deletions

File tree

src/inet/linklayer/ieee80211/mgmt/Ieee80211MgmtAp.cc

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@
88
#include "inet/common/ModuleAccess.h"
99
#include "inet/common/Simsignals.h"
1010
#include "inet/linklayer/common/MacAddressTag_m.h"
11-
1211
#ifdef INET_WITH_ETHERNET
1312
#include "inet/linklayer/ethernet/common/EthernetMacHeader_m.h"
1413
#endif // ifdef INET_WITH_ETHERNET
1514

15+
#include "inet/linklayer/ieee80211/mac/contract/IFrameSequenceHandler.h"
16+
#include "inet/linklayer/ieee80211/mac/framesequence/FrameSequenceContext.h"
1617
#include "inet/linklayer/ieee80211/mac/Ieee80211Frame_m.h"
1718
#include "inet/linklayer/ieee80211/mac/Ieee80211SubtypeTag_m.h"
1819
#include "inet/linklayer/ieee80211/mgmt/Ieee80211MgmtAp.h"
20+
#include "inet/networklayer/common/NetworkInterface.h"
1921
#include "inet/physicallayer/wireless/ieee80211/packetlevel/Ieee80211Radio.h"
2022

2123
namespace inet {
@@ -61,6 +63,7 @@ void Ieee80211MgmtAp::initialize(int stage)
6163
// subscribe for notifications
6264
cModule *radioModule = getModuleFromPar<cModule>(par("radioModule"), this);
6365
radioModule->subscribe(Ieee80211Radio::radioChannelChangedSignal, this);
66+
getContainingNicModule(this)->subscribe(IFrameSequenceHandler::frameSequenceFinishedSignal, this);
6467

6568
// start beacon timer (randomize startup time)
6669
beaconTimer = new cMessage("beaconTimer");
@@ -93,6 +96,34 @@ void Ieee80211MgmtAp::receiveSignal(cComponent *source, simsignal_t signalID, in
9396
}
9497
}
9598

99+
void Ieee80211MgmtAp::receiveSignal(cComponent *source, simsignal_t signalID, cObject *obj, cObject *details)
100+
{
101+
Enter_Method("%s", cComponent::getSignalName(signalID));
102+
103+
if (signalID == IFrameSequenceHandler::frameSequenceFinishedSignal) {
104+
auto context = check_and_cast<FrameSequenceContext *>(obj);
105+
if (context->getNumSteps() >= 2) {
106+
auto transmitStep = dynamic_cast<ITransmitStep *>(context->getStepBeforeLast());
107+
auto receiveStep = dynamic_cast<IReceiveStep *>(context->getLastStep());
108+
if (transmitStep && receiveStep &&
109+
transmitStep->getCompletion() == IFrameSequenceStep::Completion::ACCEPTED &&
110+
receiveStep->getCompletion() == IFrameSequenceStep::Completion::ACCEPTED) {
111+
auto responseHeader = dynamicPtrCast<const Ieee80211MgmtHeader>(transmitStep->getFrameToTransmit()->peekAtFront<Ieee80211MacHeader>());
112+
if (responseHeader != nullptr && (responseHeader->getType() == ST_ASSOCIATIONRESPONSE || responseHeader->getType() == ST_REASSOCIATIONRESPONSE)) {
113+
auto ackHeader = receiveStep->getReceivedFrame()->peekAtFront<Ieee80211MacHeader>();
114+
if (ackHeader->getType() == ST_ACK) {
115+
if (responseHeader->getType() == ST_ASSOCIATIONRESPONSE && mib->bssAccessPointData.stations[responseHeader->getReceiverAddress()] != Ieee80211Mib::ASSOCIATED)
116+
sendAssocNotification(responseHeader->getReceiverAddress());
117+
mib->bssAccessPointData.stations[responseHeader->getReceiverAddress()] = Ieee80211Mib::ASSOCIATED;
118+
}
119+
}
120+
}
121+
}
122+
}
123+
else
124+
Ieee80211MgmtApBase::receiveSignal(source, signalID, obj, details);
125+
}
126+
96127
Ieee80211MgmtAp::StaInfo *Ieee80211MgmtAp::lookupSenderSTA(const Ptr<const Ieee80211MgmtHeader>& header)
97128
{
98129
auto it = staList.find(header->getTransmitterAddress());
@@ -229,11 +260,6 @@ void Ieee80211MgmtAp::handleAssociationRequestFrame(Packet *packet, const Ptr<co
229260

230261
delete packet;
231262

232-
// mark STA as associated
233-
if (mib->bssAccessPointData.stations[sta->address] != Ieee80211Mib::ASSOCIATED)
234-
sendAssocNotification(sta->address);
235-
mib->bssAccessPointData.stations[sta->address] = Ieee80211Mib::ASSOCIATED; // TODO this should only take place when MAC receives the ACK for the response
236-
237263
// send OK response
238264
const auto& body = makeShared<Ieee80211AssociationResponseFrame>();
239265
body->setStatusCode(SC_SUCCESSFUL);
@@ -265,9 +291,6 @@ void Ieee80211MgmtAp::handleReassociationRequestFrame(Packet *packet, const Ptr<
265291

266292
delete packet;
267293

268-
// mark STA as associated
269-
mib->bssAccessPointData.stations[sta->address] = Ieee80211Mib::ASSOCIATED; // TODO this should only take place when MAC receives the ACK for the response
270-
271294
// send OK response
272295
const auto& body = makeShared<Ieee80211ReassociationResponseFrame>();
273296
body->setStatusCode(SC_SUCCESSFUL);

src/inet/linklayer/ieee80211/mgmt/Ieee80211MgmtAp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class INET_API Ieee80211MgmtAp : public Ieee80211MgmtApBase
7575

7676
/** Called by the signal handler whenever a change occurs we're interested in */
7777
virtual void receiveSignal(cComponent *source, simsignal_t signalID, intval_t value, cObject *details) override;
78+
virtual void receiveSignal(cComponent *source, simsignal_t signalID, cObject *obj, cObject *details) override;
7879

7980
/** Utility function: return sender STA's entry from our STA list, or nullptr if not in there */
8081
virtual StaInfo *lookupSenderSTA(const Ptr<const Ieee80211MgmtHeader>& header);
@@ -117,4 +118,3 @@ class INET_API Ieee80211MgmtAp : public Ieee80211MgmtApBase
117118
} // namespace inet
118119

119120
#endif
120-

0 commit comments

Comments
 (0)