112 bool mgmtFrame =
false;
113 bool mgmtFrameWithNoAck =
false;
114 bool groupAddressed = dataOrMgmtHeader->getReceiverAddress().isMulticast();
115 if (dynamicPtrCast<const Ieee80211MgmtHeader>(dataOrMgmtHeader)) {
117 mgmtFrameWithNoAck =
false;
119 bool nonQoSData = dataOrMgmtHeader->getType() ==
ST_DATA;
120 bool individuallyAddressedDataWithNormalAck =
false;
121 bool individuallyAddressedDataWithNoAckOrBlockAck =
false;
122 if (
auto dataHeader = dynamicPtrCast<const Ieee80211DataHeader>(dataOrMgmtHeader)) {
123 individuallyAddressedDataWithNormalAck = !groupAddressed && dataHeader->getAckPolicy() ==
AckPolicy::NORMAL_ACK;
126 if (mgmtFrame || nonQoSData || individuallyAddressedDataWithNormalAck) {
128 if (txop->isFinalFragment(dataOrMgmtHeader)) {
136 simtime_t pendingFrameDuration = pendingFrameMode->
getDuration(pendingPacket->getDataLength());
138 if (ackPolicy->isAckNeeded(pendingHeader)) {
147 if (individuallyAddressedDataWithNoAckOrBlockAck || mgmtFrameWithNoAck || groupAddressed) {
148 if (txop->isFinalFragment(dataOrMgmtHeader))
151 simtime_t duration = 0;
154 simtime_t pendingFrameDuration = pendingFrameMode->
getDuration(pendingPacket->getDataLength());
156 if (ackPolicy->isAckNeeded(pendingHeader)) {
165 throw cRuntimeError(
"Unknown frame");