Skip to content
Open
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
15 changes: 5 additions & 10 deletions src/inet/linklayer/ieee80211/mac/rateselection/QosRateSelection.cc
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ void QosRateSelection::initialize(int stage)
double multicastFrameBitrate = par("multicastFrameBitrate");
multicastFrameMode = (multicastFrameBitrate == -1) ? nullptr : modeSet->getMode(bps(multicastFrameBitrate));
double dataFrameBitrate = par("dataFrameBitrate");
dataFrameMode = (dataFrameBitrate == -1) ? nullptr : modeSet->getMode(bps(dataFrameBitrate), Hz(par("dataFrameBandwidth")), par("dataFrameNumSpatialStreams"));
dataFrameMode = (dataFrameBitrate == -1) ? nullptr : modeSet->getMode(bps(dataFrameBitrate), Hz(par("dataFrameBandwidth")), par("dataFrameNumSpatialStreams"), par("dataFrameGuardInterval"));
double mgmtFrameBitrate = par("mgmtFrameBitrate");
mgmtFrameMode = (mgmtFrameBitrate == -1) ? nullptr : modeSet->getMode(bps(mgmtFrameBitrate));
double controlFrameBitrate = par("controlFrameBitrate");
Expand Down Expand Up @@ -75,10 +75,8 @@ const IIeee80211Mode *QosRateSelection::computeResponseAckFrameMode(Packet *pack
auto mode = getMode(packet, dataOrMgmtHeader);
ASSERT(modeSet->containsMode(mode));
if (!responseAckFrameMode) {
if (modeSet->getIsMandatory(mode))
return mode;
else if (auto slowerMode = modeSet->getSlowerMandatoryMode(mode))
return slowerMode;
if (auto mandatoryMode = modeSet->getMandatoryModeAtOrBelow(mode))
return mandatoryMode;
else
throw cRuntimeError("Mandatory mode not found");
}
Expand All @@ -92,10 +90,8 @@ const IIeee80211Mode *QosRateSelection::computeResponseCtsFrameMode(Packet *pack
auto mode = getMode(packet, rtsFrame);
ASSERT(modeSet->containsMode(mode));
if (!responseCtsFrameMode) {
if (modeSet->getIsMandatory(mode))
return mode;
else if (auto slowerMode = modeSet->getSlowerMandatoryMode(mode))
return slowerMode;
if (auto mandatoryMode = modeSet->getMandatoryModeAtOrBelow(mode))
return mandatoryMode;
else
throw cRuntimeError("Mandatory mode not found");
}
Expand Down Expand Up @@ -248,4 +244,3 @@ void QosRateSelection::frameTransmitted(Packet *packet, const Ptr<const Ieee8021

} /* namespace ieee80211 */
} /* namespace inet */

Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,11 @@ simple QosRateSelection extends SimpleModule
double responseCtsFrameBitrate @unit(bps) = default(-1bps);

double dataFrameBitrate @unit(bps) = default(-1bps); // Fastest
double dataFrameBandwidth @unit(Hz) = default(nan Hz); // Unspecified by default
int dataFrameNumSpatialStreams = default(-1); // Unspecified by default
double dataFrameBandwidth @unit(Hz) = default(nan Hz); // Explicit mode qualifier when dataFrameBitrate is specified
int dataFrameNumSpatialStreams = default(-1); // Explicit mode qualifier when dataFrameBitrate is specified
double dataFrameGuardInterval @unit(s) = default(-1s); // Explicit mode qualifier when dataFrameBitrate is specified; negative means unspecified, otherwise it must equal the selected PHY mode's modeled GI

double mgmtFrameBitrate @unit(bps) = default(-1bps); // Fastest
double controlFrameBitrate @unit(bps) = default(-1bps);
@display("i=block/cogwheel");
}

Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ void RateSelection::initialize(int stage)
double multicastFrameBitrate = par("multicastFrameBitrate");
multicastFrameMode = (multicastFrameBitrate == -1) ? nullptr : modeSet->getMode(bps(multicastFrameBitrate));
double dataFrameBitrate = par("dataFrameBitrate");
dataFrameMode = (dataFrameBitrate == -1) ? nullptr : modeSet->getMode(bps(dataFrameBitrate), Hz(par("dataFrameBandwidth")), par("dataFrameNumSpatialStreams"));
dataFrameMode = (dataFrameBitrate == -1) ? nullptr : modeSet->getMode(bps(dataFrameBitrate), Hz(par("dataFrameBandwidth")), par("dataFrameNumSpatialStreams"), par("dataFrameGuardInterval"));
double mgmtFrameBitrate = par("mgmtFrameBitrate");
mgmtFrameMode = (mgmtFrameBitrate == -1) ? nullptr : modeSet->getMode(bps(mgmtFrameBitrate));
double controlFrameBitrate = par("controlFrameBitrate");
Expand Down Expand Up @@ -84,7 +84,7 @@ const IIeee80211Mode *RateSelection::computeResponseAckFrameMode(Packet *packet,
else {
auto mode = getMode(packet, dataOrMgmtHeader);
ASSERT(modeSet->containsMode(mode));
return modeSet->getIsMandatory(mode) ? mode : modeSet->getSlowerMandatoryMode(mode); // TODO BSSBasicRateSet
return modeSet->getMandatoryModeAtOrBelow(mode); // TODO BSSBasicRateSet
}
}

Expand All @@ -95,7 +95,7 @@ const IIeee80211Mode *RateSelection::computeResponseCtsFrameMode(Packet *packet,
else {
auto mode = getMode(packet, rtsFrame);
ASSERT(modeSet->containsMode(mode));
return modeSet->getIsMandatory(mode) ? mode : modeSet->getSlowerMandatoryMode(mode); // TODO BSSBasicRateSet
return modeSet->getMandatoryModeAtOrBelow(mode); // TODO BSSBasicRateSet
}
}

Expand Down Expand Up @@ -170,4 +170,3 @@ void RateSelection::setFrameMode(Packet *packet, const Ptr<const Ieee80211MacHea

} // namespace ieee80211
} // namespace inet

Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@ simple RateSelection extends SimpleModule like IRateSelection
double responseCtsFrameBitrate @unit(bps) = default(-1bps);

double dataFrameBitrate @unit(bps) = default(-1bps); // Fastest
double dataFrameBandwidth @unit(Hz) = default(nan Hz); // Unspecified by default
int dataFrameNumSpatialStreams = default(-1); // Unspecified by default
double dataFrameBandwidth @unit(Hz) = default(nan Hz); // Explicit mode qualifier when dataFrameBitrate is specified
int dataFrameNumSpatialStreams = default(-1); // Explicit mode qualifier when dataFrameBitrate is specified
double dataFrameGuardInterval @unit(s) = default(-1s); // Explicit mode qualifier when dataFrameBitrate is specified; negative means unspecified, otherwise it must equal the selected PHY mode's modeled GI

double mgmtFrameBitrate @unit(bps) = default(-1bps); // Fastest
double controlFrameBitrate @unit(bps) = default(-1bps);
@display("i=block/cogwheel");
}

22 changes: 17 additions & 5 deletions src/inet/linklayer/ieee80211/mgmt/Ieee80211MgmtBase.cc
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,24 @@ void Ieee80211MgmtBase::receiveSignal(cComponent *source, simsignal_t signalID,

if (signalID == modesetChangedSignal) {
modeSet = check_and_cast<physicallayer::Ieee80211ModeSet *>(obj);
supportedRates.numRates = std::min(8, modeSet->getNumModes());
for (int i = 0; i < 8; i++)
supportedRates.rate[i] = 0;
int rateIndex = 0;
for (int i = 0; i < supportedRates.numRates; i++)
if (modeSet->isMandatory(i))
supportedRates.rate[rateIndex++] = modeSet->getMode(i)->getDataMode()->getNetBitrate().get<Mbps>();
for (int i = 0; i < modeSet->getNumModes() && rateIndex < 8; i++) {
if (!modeSet->isMandatory(i))
continue;
double rate = modeSet->getMode(i)->getDataMode()->getNetBitrate().get<Mbps>();
bool alreadyStored = false;
for (int j = 0; j < rateIndex; j++) {
if (supportedRates.rate[j] == rate) {
alreadyStored = true;
break;
}
}
if (!alreadyStored)
supportedRates.rate[rateIndex++] = rate;
}
supportedRates.numRates = rateIndex;
}
}

Expand Down Expand Up @@ -163,4 +176,3 @@ void Ieee80211MgmtBase::stop()
} // namespace ieee80211

} // namespace inet

Original file line number Diff line number Diff line change
Expand Up @@ -312,7 +312,7 @@ const ITransmission *Ieee80211LayeredOfdmTransmitter::createTransmission(const I
// TODO: compute channel
const simtime_t preambleDuration = mode->getPreambleLength();
const simtime_t headerDuration = mode->getHeaderMode()->getDuration();
const simtime_t dataDuration = mode->getDataMode()->getDuration(packet->getDataLength());
const simtime_t dataDuration = mode->getDataDuration(packet->getDataLength());
return new Ieee80211Transmission(transmitter, packet, startTime, endTime, preambleDuration, headerDuration, dataDuration, startPosition, endPosition, startOrientation, endOrientation, packetModel, bitModel, symbolModel, sampleModel, analogModel, mode, nullptr);
}

Expand All @@ -331,4 +331,3 @@ Ieee80211LayeredOfdmTransmitter::~Ieee80211LayeredOfdmTransmitter()
} // namespace physicallayer

} // namespace inet

Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,13 @@ class INET_API IIeee80211DataMode : public cObject, public IPrintableObject
virtual bps getGrossBitrate() const = 0;
virtual b getPaddingLength(b dataLength) const = 0;
virtual b getCompleteLength(b dataLength) const = 0;
// Returns the raw duration of the encoded data symbol train. PPDU-format
// rules may round this duration at the enclosing mode level.
virtual const simtime_t getDuration(b dataLength) const = 0;
virtual const simtime_t getSymbolInterval() const = 0;
// Returns the guard interval used by the data symbols, or -1 when the PHY
// has no meaningful guard interval (for example, non-OFDM modes).
virtual const simtime_t getGuardInterval() const { return -1; }
virtual const IModulation *getModulation() const = 0;
virtual int getNumberOfSpatialStreams() const = 0;
};
Expand All @@ -61,6 +66,9 @@ class INET_API IIeee80211Mode : public cObject, public IPrintableObject
IIeee80211HeaderMode *_getHeaderMode() const { return const_cast<IIeee80211HeaderMode *>(getHeaderMode()); }
IIeee80211DataMode *_getDataMode() const { return const_cast<IIeee80211DataMode *>(getDataMode()); }
virtual const simtime_t getDuration(b dataLength) const = 0;
virtual const simtime_t getPreambleDuration() const { return getPreambleMode()->getDuration(); }
virtual const simtime_t getHeaderDuration() const { return getHeaderMode()->getDuration(); }
virtual const simtime_t getDataDuration(b dataLength) const { return getDuration(dataLength) - getPreambleDuration() - getHeaderDuration(); }
virtual const simtime_t getSlotTime() const = 0;
virtual const simtime_t getSifsTime() const = 0;
virtual const simtime_t getRifsTime() const = 0;
Expand All @@ -77,4 +85,3 @@ class INET_API IIeee80211Mode : public cObject, public IPrintableObject
} // namespace inet

#endif

Loading
Loading