Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
22 changes: 22 additions & 0 deletions src/inet/linklayer/ieee80211/mac/Ieee80211Mac.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@


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

#include <algorithm>

Expand Down Expand Up @@ -200,6 +201,27 @@ void Ieee80211Mac::handleUpperPacket(Packet *packet)
processUpperFrame(packet, header);
}

void Ieee80211Mac::notifyClass3FrameRejected(const Ptr<const Ieee80211DataHeader>& header)
{
Enter_Method("notifyClass3FrameRejected");
auto indication = new Ieee80211Class3FrameInd("Class3FrameRejected");
indication->setTransmitterAddress(header->getTransmitterAddress());
indication->setIndividuallyAddressed(!header->getReceiverAddress().isMulticast());
send(indication, "mgmtOut");
}


bool Ieee80211Mac::isDataFrameFromAssociatedStation(const Ptr<const Ieee80211DataHeader>& header) const
{
// IEEE Std 802.11-2024, 11.3.3 and 11.3.5.1: infrastructure data is Class 3.
if (mib->mode != Ieee80211Mib::INFRASTRUCTURE || mib->bssStationData.stationType != Ieee80211Mib::ACCESS_POINT ||
!mib->bssAccessPointData.requireAssociatedTransmitter)
return true;
auto it = mib->bssAccessPointData.stations.find(header->getTransmitterAddress());
return it != mib->bssAccessPointData.stations.end() && it->second == Ieee80211Mib::ASSOCIATED;
}


void Ieee80211Mac::handleLowerPacket(Packet *packet)
{
if (rx->lowerFrameReceived(packet)) {
Expand Down
4 changes: 4 additions & 0 deletions src/inet/linklayer/ieee80211/mac/Ieee80211Mac.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,10 @@ class INET_API Ieee80211Mac : public MacProtocolBase
virtual void sendDownFrame(Packet *frame);
virtual void sendDownPendingRadioConfigMsg();

// Check original MPDU transmitter identity before recipient data processing.
virtual void notifyClass3FrameRejected(const Ptr<const Ieee80211DataHeader>& header);
virtual bool isDataFrameFromAssociatedStation(const Ptr<const Ieee80211DataHeader>& header) const;

virtual void processUpperFrame(Packet *packet, const Ptr<const Ieee80211DataOrMgmtHeader>& header);
virtual void processLowerFrame(Packet *packet, const Ptr<const Ieee80211MacHeader>& header);
};
Expand Down
13 changes: 12 additions & 1 deletion src/inet/linklayer/ieee80211/mac/coordinationfunction/Dcf.cc
Original file line number Diff line number Diff line change
Expand Up @@ -227,8 +227,19 @@ void Dcf::recipientProcessReceivedFrame(Packet *packet, const Ptr<const Ieee8021
emit(packetReceivedFromPeerSignal, packet);
if (auto dataOrMgmtHeader = dynamicPtrCast<const Ieee80211DataOrMgmtHeader>(header))
recipientAckProcedure->processReceivedFrame(packet, dataOrMgmtHeader, recipientAckPolicy, this);
if (auto dataHeader = dynamicPtrCast<const Ieee80211DataHeader>(header))
if (auto dataHeader = dynamicPtrCast<const Ieee80211DataHeader>(header)) {
// Keep the immediate ACK independent of Class-3 data admission (IEEE Std 802.11-2024, 10.3.2.11).
if (!mac->isDataFrameFromAssociatedStation(dataHeader)) {
mac->notifyClass3FrameRejected(dataHeader);
EV_INFO << "Discarding data from unassociated transmitter " << dataHeader->getTransmitterAddress() << "\n";
PacketDropDetails details;
details.setReason(OTHER_PACKET_DROP);
emit(packetDroppedSignal, packet, &details);
delete packet;
return;
}
sendUp(recipientDataService->dataFrameReceived(packet, dataHeader));
}
else if (auto mgmtHeader = dynamicPtrCast<const Ieee80211MgmtHeader>(header))
sendUp(recipientDataService->managementFrameReceived(packet, mgmtHeader));
else { // TODO else if (auto ctrlFrame = dynamic_cast<Ieee80211ControlFrame*>(frame))
Expand Down
10 changes: 10 additions & 0 deletions src/inet/linklayer/ieee80211/mac/coordinationfunction/Hcf.cc
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,16 @@ void Hcf::recipientProcessReceivedFrame(Packet *packet, const Ptr<const Ieee8021
if (auto dataOrMgmtHeader = dynamicPtrCast<const Ieee80211DataOrMgmtHeader>(header))
recipientAckProcedure->processReceivedFrame(packet, dataOrMgmtHeader, check_and_cast<IRecipientAckPolicy *>(recipientAckPolicy), this);
if (auto dataHeader = dynamicPtrCast<const Ieee80211DataHeader>(header)) {
// Keep the immediate ACK independent of Class-3 data admission (IEEE Std 802.11-2024, 10.3.2.11).
if (!mac->isDataFrameFromAssociatedStation(dataHeader)) {
mac->notifyClass3FrameRejected(dataHeader);
EV_INFO << "Discarding data from unassociated transmitter " << dataHeader->getTransmitterAddress() << "\n";
PacketDropDetails details;
details.setReason(OTHER_PACKET_DROP);
emit(packetDroppedSignal, packet, &details);
delete packet;
return;
}
if (dataHeader->getType() == ST_DATA_WITH_QOS && recipientBlockAckAgreementHandler)
recipientBlockAckAgreementHandler->qosFrameReceived(dataHeader, this);
sendUp(recipientDataService->dataFrameReceived(packet, dataHeader, recipientBlockAckAgreementHandler));
Expand Down
16 changes: 16 additions & 0 deletions src/inet/linklayer/ieee80211/mgmt/Ieee80211Class3FrameInd.msg
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// SPDX-License-Identifier: LGPL-3.0-or-later
//

import inet.common.INETDefs;
import inet.linklayer.common.MacAddress;

namespace inet::ieee80211;

// MAC reports a rejected Class-3 MPDU through the management service boundary.
// The original transmitter is captured before any A-MSDU address rewriting.
message Ieee80211Class3FrameInd
{
MacAddress transmitterAddress;
bool individuallyAddressed;
}
15 changes: 15 additions & 0 deletions src/inet/linklayer/ieee80211/mgmt/Ieee80211MgmtAp.cc
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,20 @@ void Ieee80211MgmtAp::sendBeacon()
sendManagementFrame("Beacon", body, ST_BEACON, MacAddress::BROADCAST_ADDRESS);
}

void Ieee80211MgmtAp::handleClass3FrameIndication(Ieee80211Class3FrameInd *indication)
{
// IEEE Std 802.11-2024, 11.3.5.1: authenticated but unassociated
// peers normally receive Disassociation (Table 9-79, reason 7).
auto peer = mib->bssAccessPointData.stations.find(indication->getTransmitterAddress());
if (indication->getIndividuallyAddressed() && peer != mib->bssAccessPointData.stations.end() &&
peer->second == Ieee80211Mib::AUTHENTICATED) {
const auto& body = makeShared<Ieee80211DisassociationFrame>();
body->setReasonCode(RC_NONASS_CLASS3);
sendManagementFrame("Disassoc-Class3", body, ST_DISASSOCIATION, indication->getTransmitterAddress());
}
delete indication;
}

void Ieee80211MgmtAp::handleAuthenticationFrame(Packet *packet, const Ptr<const Ieee80211MgmtHeader>& header)
{
const auto& requestBody = packet->peekData<Ieee80211AuthenticationFrame>();
Expand Down Expand Up @@ -567,6 +581,7 @@ void Ieee80211MgmtAp::stop()
{
cancelEvent(beaconTimer);
staList.clear();
mib->bssAccessPointData.stations.clear();
nextAssociationTransactionId = 0;
mib->clearAssociationIds();
Ieee80211MgmtApBase::stop();
Expand Down
1 change: 1 addition & 0 deletions src/inet/linklayer/ieee80211/mgmt/Ieee80211MgmtAp.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ class INET_API Ieee80211MgmtAp : public Ieee80211MgmtApBase

/** Implements abstract Ieee80211MgmtBase method */
virtual void handleTimer(cMessage *msg) override;
virtual void handleClass3FrameIndication(Ieee80211Class3FrameInd *indication) override;

/** Implements abstract Ieee80211MgmtBase method -- throws an error (no commands supported) */
virtual void handleCommand(int msgkind, cObject *ctrl) override;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,13 @@ namespace ieee80211 {

Define_Module(Ieee80211MgmtApSimplified);

void Ieee80211MgmtApSimplified::initialize(int stage)
{
Ieee80211MgmtApBase::initialize(stage);
if (stage == INITSTAGE_LOCAL)
mib->bssAccessPointData.requireAssociatedTransmitter = false;
}

// FIXME add sequence number handling

void Ieee80211MgmtApSimplified::handleTimer(cMessage *msg)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class INET_API Ieee80211MgmtApSimplified : public Ieee80211MgmtApBase
{
protected:
virtual int numInitStages() const override { return NUM_INIT_STAGES; }
virtual void initialize(int stage) override;

/** Implements abstract Ieee80211MgmtBase method */
virtual void handleTimer(cMessage *msg) override;
Expand Down
7 changes: 7 additions & 0 deletions src/inet/linklayer/ieee80211/mgmt/Ieee80211MgmtBase.cc
Original file line number Diff line number Diff line change
Expand Up @@ -86,13 +86,20 @@ void Ieee80211MgmtBase::addHtOperation(const Ptr<Ieee80211MgmtFrame>& frame, con
setHtOperation(frame, band, mib->getHtOperation());
}

void Ieee80211MgmtBase::handleClass3FrameIndication(Ieee80211Class3FrameInd *indication)
{
delete indication;
}

void Ieee80211MgmtBase::handleMessageWhenUp(cMessage *msg)
{
if (msg->isSelfMessage()) {
// process timers
EV << "Timer expired: " << msg << "\n";
handleTimer(msg);
}
else if (msg->arrivedOn("macIn") && dynamic_cast<Ieee80211Class3FrameInd *>(msg))
handleClass3FrameIndication(static_cast<Ieee80211Class3FrameInd *>(msg));
else if (msg->arrivedOn("macIn")) {
// process incoming frame
EV << "Frame arrived from MAC: " << msg << "\n";
Expand Down
3 changes: 3 additions & 0 deletions src/inet/linklayer/ieee80211/mgmt/Ieee80211MgmtBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include "inet/linklayer/common/MacAddress.h"
#include "inet/linklayer/ieee80211/mac/Ieee80211Frame_m.h"
#include "inet/linklayer/ieee80211/mgmt/Ieee80211MgmtFrame_m.h"
#include "inet/linklayer/ieee80211/mgmt/Ieee80211Class3FrameInd_m.h"
#include "inet/linklayer/ieee80211/mib/Ieee80211Mib.h"
#include "inet/networklayer/contract/IInterfaceTable.h"
#include "inet/physicallayer/wireless/ieee80211/mode/Ieee80211Band.h"
Expand Down Expand Up @@ -57,6 +58,8 @@ class INET_API Ieee80211MgmtBase : public OperationalBase, public cListener
/** Should be redefined to handle commands from the "agent" (if present) */
virtual void handleCommand(int msgkind, cObject *ctrl) = 0;

virtual void handleClass3FrameIndication(Ieee80211Class3FrameInd *indication);

/** Utility method for implementing handleUpperMessage(): send message to MAC */
virtual void sendDown(Packet *frame);

Expand Down
2 changes: 2 additions & 0 deletions src/inet/linklayer/ieee80211/mib/Ieee80211Mib.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ class INET_API Ieee80211Mib : public SimpleModule

class INET_API BssAccessPointData {
public:
// Detailed management enforces association; simplified management may model all peers as associated.
bool requireAssociatedTransmitter = true;
std::map<MacAddress, BssMemberStatus> stations;
std::map<MacAddress, short> associationIds;
};
Expand Down
2 changes: 1 addition & 1 deletion tests/fingerprint/showcases.csv
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@
/showcases/visualizer/canvas/ieee80211/, -f omnetpp.ini -c OneNetwork -r 0, 5s, 46cc-9c41/tplx;c427-dece/~tNl;eae3-92e1/~tND;9c21-dd33/tyf, PASS, wireless
/showcases/visualizer/canvas/ieee80211/, -f omnetpp.ini -c MultipleNetworks -r 0, 5s, 5094-e358/tplx;3c17-6ee0/~tNl;4dff-fa35/~tND;3be5-9494/tyf, PASS, wireless
/showcases/visualizer/canvas/ieee80211/, -f omnetpp.ini -c VisualizingHandover -r 0, 250s, 7fb8-49dc/tplx;2f60-762d/~tNl;0437-f151/~tND;07bb-3973/tyf, PASS, wireless
/showcases/visualizer/canvas/ieee80211/, -f omnetpp.ini -c SignalLevels -r 0, 100s, 51ec-d359/tplx;cec5-d464/~tNl;a0c6-b121/~tND;c099-e5c5/tyf, PASS, Ipv4
/showcases/visualizer/canvas/ieee80211/, -f omnetpp.ini -c SignalLevels -r 0, 100s, 051b-668f/tplx;cec5-d464/~tNl;a0c6-b121/~tND;c099-e5c5/tyf, PASS, Ipv4

/showcases/visualizer/canvas/submoduleinfo/, -f omnetpp.ini -c PacketCounts -r 0, 5s, 271c-6821/tplx;3c0c-db82/~tNl;8315-9723/~tND;b145-6576/tyf, PASS, wireless Ipv4 # VisualizingSubmoduleInformation extended
/showcases/visualizer/canvas/submoduleinfo/, -f omnetpp.ini -c MACStates -r 0, 5s, 271c-6821/tplx;3c0c-db82/~tNl;8315-9723/~tND;4677-fc97/tyf, PASS, wireless Ipv4
Expand Down
Loading