793 MacLow::ReceiveError (Ptr<const Packet> packet, double rxSnr) |
797 MacLow::ReceiveError (Ptr<const Packet> packet, double rxSnr) |
794 { |
798 { |
795 NS_LOG_FUNCTION (this << packet << rxSnr); |
799 NS_LOG_FUNCTION (this << packet << rxSnr); |
796 NS_LOG_DEBUG ("rx failed "); |
800 NS_LOG_DEBUG ("rx failed "); |
797 AmpduTag ampdu; |
801 AmpduTag ampdu; |
798 Ptr<Packet> pkt = packet->Copy(); |
802 Ptr<Packet> pkt = packet->Copy (); |
799 bool isInAmpdu = pkt->RemovePacketTag(ampdu); |
803 bool isInAmpdu = pkt->RemovePacketTag (ampdu); |
800 |
804 |
801 if(isInAmpdu && m_receivedAtLeastOneMpdu && (ampdu.GetNoOfMpdus() == 1)) |
805 if (isInAmpdu && m_receivedAtLeastOneMpdu && (ampdu.GetNoOfMpdus () == 1)) |
802 { |
806 { |
803 MpduAggregator::DeaggregatedMpdus packets = MpduAggregator::Deaggregate (pkt); |
807 MpduAggregator::DeaggregatedMpdus packets = MpduAggregator::Deaggregate (pkt); |
804 MpduAggregator::DeaggregatedMpdusCI n = packets.begin (); |
808 MpduAggregator::DeaggregatedMpdusCI n = packets.begin (); |
805 WifiMacHeader hdr; |
809 WifiMacHeader hdr; |
806 (*n).first->PeekHeader(hdr); |
810 (*n).first->PeekHeader (hdr); |
807 if(hdr.IsQosData()) |
811 if (hdr.IsQosData ()) |
808 { |
812 { |
809 NS_LOG_DEBUG ("last a-mpdu subframe detected/sendImmediateBlockAck from=" << hdr.GetAddr2 ()); |
813 NS_LOG_DEBUG ("last a-mpdu subframe detected/sendImmediateBlockAck from=" << hdr.GetAddr2 ()); |
810 m_sendAckEvent = Simulator::Schedule (GetSifs (), |
814 m_sendAckEvent = Simulator::Schedule (GetSifs (), |
811 &MacLow::SendBlockAckAfterAmpdu, this, |
815 &MacLow::SendBlockAckAfterAmpdu, this, |
812 hdr.GetQosTid (), |
816 hdr.GetQosTid (), |
813 hdr.GetAddr2 (), |
817 hdr.GetAddr2 (), |
814 hdr.GetDuration (), |
818 hdr.GetDuration (), |
815 m_currentTxVector); |
819 m_currentTxVector); |
816 } |
820 } |
817 else if (hdr.IsBlockAckReq()) |
821 else if (hdr.IsBlockAckReq ()) |
818 { |
822 { |
819 NS_LOG_DEBUG("last a-mpdu subframe is BAR"); |
823 NS_LOG_DEBUG ("last a-mpdu subframe is BAR"); |
820 } |
824 } |
821 m_receivedAtLeastOneMpdu = false; |
825 m_receivedAtLeastOneMpdu = false; |
822 } |
826 } |
823 else if (m_txParams.MustWaitFastAck ()) |
827 else if (m_txParams.MustWaitFastAck ()) |
824 { |
828 { |
825 NS_ASSERT (m_fastAckFailedTimeoutEvent.IsExpired ()); |
829 NS_ASSERT (m_fastAckFailedTimeoutEvent.IsExpired ()); |
1557 last = true; |
1583 last = true; |
1558 packetType = 2; |
1584 packetType = 2; |
1559 } |
1585 } |
1560 m_mpduAggregator->AddHeaderAndPad (newPacket, last); |
1586 m_mpduAggregator->AddHeaderAndPad (newPacket, last); |
1561 |
1587 |
1562 ampdutag.SetNoOfMpdus(queueSize); |
1588 ampdutag.SetNoOfMpdus (queueSize); |
1563 newPacket->AddPacketTag(ampdutag); |
1589 newPacket->AddPacketTag (ampdutag); |
1564 if (delay == Seconds (0)) |
1590 if (delay == Seconds (0)) |
1565 { |
1591 { |
1566 NS_LOG_DEBUG("Sending MPDU as part of A-MPDU"); |
1592 NS_LOG_DEBUG ("Sending MPDU as part of A-MPDU"); |
1567 packetType = 1; |
1593 packetType = 1; |
1568 m_phy->SendPacket (newPacket, txVector, preamble, packetType); |
1594 m_phy->SendPacket (newPacket, txVector, preamble, packetType); |
1569 } |
1595 } |
1570 else |
1596 else |
1571 { |
1597 { |
1572 Simulator::Schedule (delay, &MacLow::SendPacket, this, newPacket, txVector, preamble, packetType); |
1598 Simulator::Schedule (delay, &MacLow::SendPacket, this, newPacket, txVector, preamble, packetType); |
1573 } |
1599 } |
1574 if(queueSize > 1) |
1600 if (queueSize > 1) |
1575 delay = delay + m_phy->CalculateTxDuration (GetSize (newPacket, &newHdr), txVector, preamble, m_phy->GetFrequency (), packetType, 0); |
1601 { |
|
1602 delay = delay + m_phy->CalculateTxDuration (GetSize (newPacket, &newHdr), txVector, preamble, m_phy->GetFrequency (), packetType, 0); |
|
1603 } |
1576 preamble = WIFI_PREAMBLE_NONE; |
1604 preamble = WIFI_PREAMBLE_NONE; |
1577 } |
1605 } |
1578 } |
1606 } |
1579 } |
1607 } |
1580 |
1608 |
1581 void |
1609 void |
1582 MacLow::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType) |
1610 MacLow::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType) |
1583 { |
1611 { |
1584 NS_LOG_DEBUG("Sending MPDU as part of A-MPDU"); |
1612 NS_LOG_DEBUG ("Sending MPDU as part of A-MPDU"); |
1585 m_phy->SendPacket (packet, txVector, preamble, packetType); |
1613 m_phy->SendPacket (packet, txVector, preamble, packetType); |
1586 } |
1614 } |
1587 |
1615 |
1588 void |
1616 void |
1589 MacLow::CtsTimeout (void) |
1617 MacLow::CtsTimeout (void) |
1590 { |
1618 { |
1802 NotifyAckTimeoutStartNow (timerDelay); |
1840 NotifyAckTimeoutStartNow (timerDelay); |
1803 m_blockAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::BlockAckTimeout, this); |
1841 m_blockAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::BlockAckTimeout, this); |
1804 } |
1842 } |
1805 else if (m_txParams.HasNextPacket ()) |
1843 else if (m_txParams.HasNextPacket ()) |
1806 { |
1844 { |
1807 if (m_stationManager->HasHtSupported()) |
1845 if (m_stationManager->HasHtSupported ()) |
1808 { |
1846 { |
1809 Time delay = txDuration + GetRifs (); |
1847 Time delay = txDuration + GetRifs (); |
1810 NS_ASSERT (m_waitRifsEvent.IsExpired ()); |
1848 NS_ASSERT (m_waitRifsEvent.IsExpired ()); |
1811 m_waitRifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTx, this); |
1849 m_waitRifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTx, this); |
1812 } |
1850 } |
1813 else |
1851 else |
1814 { |
1852 { |
1815 Time delay = txDuration + GetSifs (); |
1853 Time delay = txDuration + GetSifs (); |
1816 NS_ASSERT (m_waitSifsEvent.IsExpired ()); |
1854 NS_ASSERT (m_waitSifsEvent.IsExpired ()); |
1817 m_waitSifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTx, this); |
1855 m_waitSifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTx, this); |
1818 } |
1856 } |
1819 } |
1857 } |
1820 else |
1858 else |
1821 { |
1859 { |
1822 // since we do not expect any timer to be triggered. |
1860 // since we do not expect any timer to be triggered. |
1823 Simulator::Schedule(txDuration, &MacLow::EndTxNoAck, this); |
1861 Simulator::Schedule (txDuration, &MacLow::EndTxNoAck, this); |
1824 } |
1862 } |
1825 } |
1863 } |
1826 |
1864 |
1827 void |
1865 void |
1828 MacLow::SendDataPacket (void) |
1866 MacLow::SendDataPacket (void) |
1829 { |
1867 { |
1830 NS_LOG_FUNCTION (this); |
1868 NS_LOG_FUNCTION (this); |
1831 /* send this packet directly. No RTS is needed. */ |
1869 /* send this packet directly. No RTS is needed. */ |
1832 WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr); |
1870 WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr); |
1833 WifiPreamble preamble; |
1871 WifiPreamble preamble; |
1834 |
1872 |
1835 if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ())) |
1873 if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ())) |
1836 //In the future has to make sure that receiver has greenfield enabled |
1874 { |
1837 preamble = WIFI_PREAMBLE_HT_GF; |
1875 //In the future has to make sure that receiver has greenfield enabled |
|
1876 preamble = WIFI_PREAMBLE_HT_GF; |
|
1877 } |
1838 else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT) |
1878 else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT) |
1839 preamble = WIFI_PREAMBLE_HT_MF; |
1879 { |
|
1880 preamble = WIFI_PREAMBLE_HT_MF; |
|
1881 } |
1840 else |
1882 else |
1841 preamble = WIFI_PREAMBLE_LONG; |
1883 { |
1842 |
1884 preamble = WIFI_PREAMBLE_LONG; |
|
1885 } |
|
1886 |
1843 StartDataTxTimers (dataTxVector); |
1887 StartDataTxTimers (dataTxVector); |
1844 |
1888 |
1845 Time duration = Seconds (0.0); |
1889 Time duration = Seconds (0.0); |
1846 if (m_txParams.HasDurationId ()) |
1890 if (m_txParams.HasDurationId ()) |
1847 { |
1891 { |
2031 /* send the third step in a |
2079 /* send the third step in a |
2032 * RTS/CTS/DATA/ACK hanshake |
2080 * RTS/CTS/DATA/ACK hanshake |
2033 */ |
2081 */ |
2034 NS_ASSERT (m_currentPacket != 0); |
2082 NS_ASSERT (m_currentPacket != 0); |
2035 WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr); |
2083 WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr); |
2036 |
2084 |
2037 if (m_aggregateQueue->GetSize () != 0) |
2085 if (m_aggregateQueue->GetSize () != 0) |
2038 { |
2086 { |
2039 for (std::vector<Item>::size_type i = 0; i != m_txPackets.size(); i++) |
2087 for (std::vector<Item>::size_type i = 0; i != m_txPackets.size (); i++) |
2040 { |
2088 { |
2041 uint8_t tid = GetTid (m_txPackets.at(i).packet, m_txPackets.at(i).hdr); |
2089 uint8_t tid = GetTid (m_txPackets.at (i).packet, m_txPackets.at (i).hdr); |
2042 AcIndex ac = QosUtilsMapTidToAc (tid); |
2090 AcIndex ac = QosUtilsMapTidToAc (tid); |
2043 std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt = m_edcaListeners.find (ac); |
2091 std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt = m_edcaListeners.find (ac); |
2044 |
2092 |
2045 listenerIt->second->CompleteMpduTx (m_txPackets.at(i).packet, m_txPackets.at(i).hdr, m_txPackets.at(i).timestamp); |
2093 listenerIt->second->CompleteMpduTx (m_txPackets.at (i).packet, m_txPackets.at (i).hdr, m_txPackets.at (i).timestamp); |
2046 } |
2094 } |
2047 m_txPackets.clear (); |
2095 m_txPackets.clear (); |
2048 } |
2096 } |
2049 |
2097 |
2050 WifiPreamble preamble; |
2098 WifiPreamble preamble; |
2051 if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ())) |
2099 if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ())) |
2052 //In the future has to make sure that receiver has greenfield enabled |
2100 { |
2053 preamble = WIFI_PREAMBLE_HT_GF; |
2101 //In the future has to make sure that receiver has greenfield enabled |
|
2102 preamble = WIFI_PREAMBLE_HT_GF; |
|
2103 } |
2054 else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT) |
2104 else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT) |
2055 preamble = WIFI_PREAMBLE_HT_MF; |
2105 { |
|
2106 preamble = WIFI_PREAMBLE_HT_MF; |
|
2107 } |
2056 else |
2108 else |
2057 preamble = WIFI_PREAMBLE_LONG; |
2109 { |
2058 |
2110 preamble = WIFI_PREAMBLE_LONG; |
|
2111 } |
|
2112 |
2059 StartDataTxTimers (dataTxVector); |
2113 StartDataTxTimers (dataTxVector); |
2060 Time newDuration = Seconds (0); |
2114 Time newDuration = Seconds (0); |
2061 if (m_txParams.MustWaitBasicBlockAck ()) |
2115 if (m_txParams.MustWaitBasicBlockAck ()) |
2062 { |
2116 { |
2063 newDuration += GetSifs (); |
2117 newDuration += GetSifs (); |
2172 MacLow::IsInWindow (uint16_t seq, uint16_t winstart, uint16_t winsize) |
2226 MacLow::IsInWindow (uint16_t seq, uint16_t winstart, uint16_t winsize) |
2173 { |
2227 { |
2174 return ((seq - winstart + 4096) % 4096) < winsize; |
2228 return ((seq - winstart + 4096) % 4096) < winsize; |
2175 } |
2229 } |
2176 |
2230 |
2177 bool |
2231 bool |
2178 MacLow::ReceiveMpdu (Ptr<Packet> packet, WifiMacHeader hdr) |
2232 MacLow::ReceiveMpdu (Ptr<Packet> packet, WifiMacHeader hdr) |
2179 { |
2233 { |
2180 if (m_stationManager->HasHtSupported ()) |
2234 if (m_stationManager->HasHtSupported ()) |
2181 { |
2235 { |
2182 Mac48Address originator = hdr.GetAddr2 (); |
2236 Mac48Address originator = hdr.GetAddr2 (); |
2183 uint8_t tid = 0; |
2237 uint8_t tid = 0; |
2184 if (hdr.IsQosData ()) |
2238 if (hdr.IsQosData ()) |
2185 tid = hdr.GetQosTid (); |
2239 { |
|
2240 tid = hdr.GetQosTid (); |
|
2241 } |
2186 uint16_t seqNumber = hdr.GetSequenceNumber (); |
2242 uint16_t seqNumber = hdr.GetSequenceNumber (); |
2187 AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid)); |
2243 AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid)); |
2188 if (it != m_bAckAgreements.end ()) |
2244 if (it != m_bAckAgreements.end ()) |
2189 { |
2245 { |
2190 //Implement HT immediate Block Ack support for HT Delayed Block Ack is not added yet |
2246 //Implement HT immediate Block Ack support for HT Delayed Block Ack is not added yet |
2191 if (!QosUtilsIsOldPacket ((*it).second.first.GetStartingSequence (), seqNumber)) |
2247 if (!QosUtilsIsOldPacket ((*it).second.first.GetStartingSequence (), seqNumber)) |
2192 { |
2248 { |
2193 StoreMpduIfNeeded (packet, hdr); |
2249 StoreMpduIfNeeded (packet, hdr); |
2194 if (!IsInWindow(hdr.GetSequenceNumber (), (*it).second.first.GetStartingSequence (), (*it).second.first.GetBufferSize ())) |
2250 if (!IsInWindow (hdr.GetSequenceNumber (), (*it).second.first.GetStartingSequence (), (*it).second.first.GetBufferSize ())) |
2195 { |
2251 { |
2196 uint16_t delta = (seqNumber - (*it).second.first.GetWinEnd() + 4096) % 4096; |
2252 uint16_t delta = (seqNumber - (*it).second.first.GetWinEnd () + 4096) % 4096; |
2197 if (delta > 1) |
2253 if (delta > 1) |
2198 { |
2254 { |
2199 (*it).second.first.SetWinEnd (seqNumber); |
2255 (*it).second.first.SetWinEnd (seqNumber); |
2200 int16_t winEnd = (*it).second.first.GetWinEnd (); |
2256 int16_t winEnd = (*it).second.first.GetWinEnd (); |
2201 int16_t bufferSize = (*it).second.first.GetBufferSize (); |
2257 int16_t bufferSize = (*it).second.first.GetBufferSize (); |
2202 uint16_t sum = ((uint16_t)(std::abs(winEnd - bufferSize + 1))) % 4096; |
2258 uint16_t sum = ((uint16_t)(std::abs (winEnd - bufferSize + 1))) % 4096; |
2203 (*it).second.first.SetStartingSequence (sum); |
2259 (*it).second.first.SetStartingSequence (sum); |
2204 RxCompleteBufferedPacketsWithSmallerSequence ((*it).second.first.GetStartingSequence (), originator, tid); |
2260 RxCompleteBufferedPacketsWithSmallerSequence ((*it).second.first.GetStartingSequence (), originator, tid); |
2205 } |
2261 } |
2206 } |
2262 } |
2207 RxCompleteBufferedPacketsUntilFirstLost (originator, tid); //forwards up packets starting from winstart and set winstart to last +1 |
2263 RxCompleteBufferedPacketsUntilFirstLost (originator, tid); //forwards up packets starting from winstart and set winstart to last +1 |
2208 (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence()+(*it).second.first.GetBufferSize() - 1) % 4096); |
2264 (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence () + (*it).second.first.GetBufferSize () - 1) % 4096); |
2209 } |
2265 } |
2210 return true; |
2266 return true; |
2211 } |
2267 } |
2212 return false; |
2268 return false; |
2213 } |
2269 } |
2214 else |
2270 else |
2215 return StoreMpduIfNeeded (packet, hdr); |
2271 { |
|
2272 return StoreMpduIfNeeded (packet, hdr); |
|
2273 } |
2216 } |
2274 } |
2217 |
2275 |
2218 bool |
2276 bool |
2219 MacLow::StoreMpduIfNeeded (Ptr<Packet> packet, WifiMacHeader hdr) |
2277 MacLow::StoreMpduIfNeeded (Ptr<Packet> packet, WifiMacHeader hdr) |
2220 { |
2278 { |
2513 BlockAckCachesI i = m_bAckCaches.find (std::make_pair (originator, tid)); |
2574 BlockAckCachesI i = m_bAckCaches.find (std::make_pair (originator, tid)); |
2514 NS_ASSERT (i != m_bAckCaches.end ()); |
2575 NS_ASSERT (i != m_bAckCaches.end ()); |
2515 (*i).second.FillBlockAckBitmap (&blockAck); |
2576 (*i).second.FillBlockAckBitmap (&blockAck); |
2516 NS_LOG_DEBUG ("Got block Ack Req with seq " << reqHdr.GetStartingSequence ()); |
2577 NS_LOG_DEBUG ("Got block Ack Req with seq " << reqHdr.GetStartingSequence ()); |
2517 |
2578 |
2518 if (!m_stationManager->HasHtSupported()) |
2579 if (!m_stationManager->HasHtSupported ()) |
2519 { |
2580 { |
2520 /* All packets with smaller sequence than starting sequence control must be passed up to Wifimac |
2581 /* All packets with smaller sequence than starting sequence control must be passed up to Wifimac |
2521 * See 9.10.3 in IEEE 802.11e standard. |
2582 * See 9.10.3 in IEEE 802.11e standard. |
2522 */ |
2583 */ |
2523 RxCompleteBufferedPacketsWithSmallerSequence (reqHdr.GetStartingSequence (), originator, tid); |
2584 RxCompleteBufferedPacketsWithSmallerSequence (reqHdr.GetStartingSequence (), originator, tid); |
2524 RxCompleteBufferedPacketsUntilFirstLost (originator, tid); |
2585 RxCompleteBufferedPacketsUntilFirstLost (originator, tid); |
2525 } |
2586 } |
2526 else |
2587 else |
2527 { |
2588 { |
2528 if (!QosUtilsIsOldPacket ((*it).second.first.GetStartingSequence(), reqHdr.GetStartingSequence ())) |
2589 if (!QosUtilsIsOldPacket ((*it).second.first.GetStartingSequence (), reqHdr.GetStartingSequence ())) |
2529 { |
2590 { |
2530 (*it).second.first.SetStartingSequence (reqHdr.GetStartingSequence ()); |
2591 (*it).second.first.SetStartingSequence (reqHdr.GetStartingSequence ()); |
2531 (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence()+(*it).second.first.GetBufferSize() - 1) % 4096); |
2592 (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence () + (*it).second.first.GetBufferSize () - 1) % 4096); |
2532 RxCompleteBufferedPacketsWithSmallerSequence (reqHdr.GetStartingSequence (), originator, tid); |
2593 RxCompleteBufferedPacketsWithSmallerSequence (reqHdr.GetStartingSequence (), originator, tid); |
2533 RxCompleteBufferedPacketsUntilFirstLost (originator, tid); |
2594 RxCompleteBufferedPacketsUntilFirstLost (originator, tid); |
2534 (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence()+(*it).second.first.GetBufferSize() - 1) % 4096); |
2595 (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence () + (*it).second.first.GetBufferSize () - 1) % 4096); |
2535 } |
2596 } |
2536 } |
2597 } |
2537 } |
2598 } |
2538 else |
2599 else |
2539 { |
2600 { |
2582 { |
2643 { |
2583 m_currentTxVector = txVector; |
2644 m_currentTxVector = txVector; |
2584 AmpduTag ampdu; |
2645 AmpduTag ampdu; |
2585 bool normalAck = false; |
2646 bool normalAck = false; |
2586 bool ampduSubframe = false; |
2647 bool ampduSubframe = false; |
2587 if (aggregatedPacket->RemovePacketTag(ampdu)) |
2648 if (aggregatedPacket->RemovePacketTag (ampdu)) |
2588 { |
2649 { |
2589 ampduSubframe = true; |
2650 ampduSubframe = true; |
2590 MpduAggregator::DeaggregatedMpdus packets = MpduAggregator::Deaggregate (aggregatedPacket); |
2651 MpduAggregator::DeaggregatedMpdus packets = MpduAggregator::Deaggregate (aggregatedPacket); |
2591 MpduAggregator::DeaggregatedMpdusCI n = packets.begin (); |
2652 MpduAggregator::DeaggregatedMpdusCI n = packets.begin (); |
2592 |
2653 |
2593 WifiMacHeader firsthdr; |
2654 WifiMacHeader firsthdr; |
2594 (*n).first->PeekHeader (firsthdr); |
2655 (*n).first->PeekHeader (firsthdr); |
2595 NS_LOG_DEBUG ("duration/id=" << firsthdr.GetDuration ()); |
2656 NS_LOG_DEBUG ("duration/id=" << firsthdr.GetDuration ()); |
2596 NotifyNav ((*n).first, firsthdr, preamble); |
2657 NotifyNav ((*n).first, firsthdr, preamble); |
2597 |
2658 |
2598 if (firsthdr.GetAddr1 () == m_self) |
2659 if (firsthdr.GetAddr1 () == m_self) |
2599 { |
2660 { |
2600 m_receivedAtLeastOneMpdu = true; |
2661 m_receivedAtLeastOneMpdu = true; |
2601 if (firsthdr.IsAck () || firsthdr.IsBlockAck () || firsthdr.IsBlockAckReq ()) |
2662 if (firsthdr.IsAck () || firsthdr.IsBlockAck () || firsthdr.IsBlockAckReq ()) |
|
2663 { |
2602 ReceiveOk ((*n).first, rxSnr, txVector, preamble, ampduSubframe); |
2664 ReceiveOk ((*n).first, rxSnr, txVector, preamble, ampduSubframe); |
|
2665 } |
2603 else if (firsthdr.IsData () || firsthdr.IsQosData ()) |
2666 else if (firsthdr.IsData () || firsthdr.IsQosData ()) |
2604 { |
2667 { |
2605 NS_LOG_DEBUG ("Deaggregate packet with sequence=" << firsthdr.GetSequenceNumber ()); |
2668 NS_LOG_DEBUG ("Deaggregate packet with sequence=" << firsthdr.GetSequenceNumber ()); |
2606 ReceiveOk ((*n).first, rxSnr, txVector, preamble, ampduSubframe); |
2669 ReceiveOk ((*n).first, rxSnr, txVector, preamble, ampduSubframe); |
2607 if (firsthdr.IsQosAck ()) |
2670 if (firsthdr.IsQosAck ()) |
2608 { |
2671 { |
2609 NS_LOG_DEBUG ("Normal Ack"); |
2672 NS_LOG_DEBUG ("Normal Ack"); |
2610 normalAck = true; |
2673 normalAck = true; |
2611 } |
2674 } |
2612 } |
2675 } |
2613 else |
2676 else |
|
2677 { |
2614 NS_FATAL_ERROR ("Received A-MPDU with invalid first MPDU type"); |
2678 NS_FATAL_ERROR ("Received A-MPDU with invalid first MPDU type"); |
|
2679 } |
2615 } |
2680 } |
2616 |
2681 |
2617 if (normalAck && (ampdu.GetNoOfMpdus () == 1)) |
2682 if (normalAck && (ampdu.GetNoOfMpdus () == 1)) |
2618 { |
2683 { |
2619 //send block Ack |
2684 //send block Ack |
2620 if (firsthdr.IsBlockAckReq ()) |
2685 if (firsthdr.IsBlockAckReq ()) |
2621 { |
2686 { |
2622 NS_FATAL_ERROR ("Sending a BlockAckReq with QosPolicy equal to Normal Ack"); |
2687 NS_FATAL_ERROR ("Sending a BlockAckReq with QosPolicy equal to Normal Ack"); |
2623 } |
2688 } |
2624 uint8_t tid = firsthdr.GetQosTid (); |
2689 uint8_t tid = firsthdr.GetQosTid (); |
2625 AgreementsI it = m_bAckAgreements.find (std::make_pair (firsthdr.GetAddr2 (), tid)); |
2690 AgreementsI it = m_bAckAgreements.find (std::make_pair (firsthdr.GetAddr2 (), tid)); |
2626 if (it != m_bAckAgreements.end ()) |
2691 if (it != m_bAckAgreements.end ()) |
2627 { |
2692 { |
2628 NS_ASSERT (m_sendAckEvent.IsExpired ()); |
2693 NS_ASSERT (m_sendAckEvent.IsExpired ()); |
2629 /* See section 11.5.3 in IEEE 802.11 for mean of this timer */ |
2694 /* See section 11.5.3 in IEEE 802.11 for mean of this timer */ |
2630 ResetBlockAckInactivityTimerIfNeeded (it->second.first); |
2695 ResetBlockAckInactivityTimerIfNeeded (it->second.first); |
2631 NS_LOG_DEBUG ("rx A-MPDU/sendImmediateBlockAck from=" << firsthdr.GetAddr2 ()); |
2696 NS_LOG_DEBUG ("rx A-MPDU/sendImmediateBlockAck from=" << firsthdr.GetAddr2 ()); |
2632 m_sendAckEvent = Simulator::Schedule (GetSifs (), |
2697 m_sendAckEvent = Simulator::Schedule (GetSifs (), |
2633 &MacLow::SendBlockAckAfterAmpdu, this, |
2698 &MacLow::SendBlockAckAfterAmpdu, this, |
2634 firsthdr.GetQosTid (), |
2699 firsthdr.GetQosTid (), |
2635 firsthdr.GetAddr2 (), |
2700 firsthdr.GetAddr2 (), |
2636 firsthdr.GetDuration (), |
2701 firsthdr.GetDuration (), |
2637 txVector); |
2702 txVector); |
2638 } |
2703 } |
2639 else |
2704 else |
2640 { |
2705 { |
2641 NS_LOG_DEBUG ("There's not a valid agreement for this block ack request."); |
2706 NS_LOG_DEBUG ("There's not a valid agreement for this block ack request."); |
2642 } |
2707 } |
2643 m_receivedAtLeastOneMpdu = false; |
2708 m_receivedAtLeastOneMpdu = false; |
2644 } |
2709 } |
2645 } |
2710 } |
2646 else |
2711 else |
2647 { |
2712 { |
2648 ReceiveOk (aggregatedPacket, rxSnr, txVector, preamble, ampduSubframe); |
2713 ReceiveOk (aggregatedPacket, rxSnr, txVector, preamble, ampduSubframe); |
2649 } |
2714 } |
2650 } |
2715 } |
2651 |
2716 |
2652 bool |
2717 bool |
2653 MacLow::StopMpduAggregation(Ptr<const Packet> peekedPacket, WifiMacHeader peekedHdr, Ptr<Packet> aggregatedPacket, uint16_t size) const |
2718 MacLow::StopMpduAggregation (Ptr<const Packet> peekedPacket, WifiMacHeader peekedHdr, Ptr<Packet> aggregatedPacket, uint16_t size) const |
2654 { |
2719 { |
2655 WifiPreamble preamble; |
2720 WifiPreamble preamble; |
2656 WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr); |
2721 WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr); |
2657 if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ())) |
2722 if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ())) |
2658 preamble = WIFI_PREAMBLE_HT_GF; |
2723 { |
2659 else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT) |
2724 preamble = WIFI_PREAMBLE_HT_GF; |
2660 preamble = WIFI_PREAMBLE_HT_MF; |
2725 } |
2661 else |
2726 else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT) |
2662 preamble = WIFI_PREAMBLE_LONG; |
2727 { |
2663 |
2728 preamble = WIFI_PREAMBLE_HT_MF; |
2664 if (peekedPacket == 0) |
2729 } |
2665 return true; |
2730 else |
2666 |
2731 { |
2667 //An HT STA shall not transmit a PPDU that has a duration that is greater than aPPDUMaxTime (10 milliseconds) |
2732 preamble = WIFI_PREAMBLE_LONG; |
2668 if(m_phy->CalculateTxDuration (aggregatedPacket->GetSize () + peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, dataTxVector, preamble, m_phy->GetFrequency (), 0, 0) > MilliSeconds(10)) |
2733 } |
2669 return true; |
2734 |
2670 |
2735 if (peekedPacket == 0) |
2671 if (!m_mpduAggregator->CanBeAggregated (peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, aggregatedPacket, size)) |
2736 { |
2672 return true; |
2737 return true; |
2673 |
2738 } |
2674 return false; |
2739 |
|
2740 //An HT STA shall not transmit a PPDU that has a duration that is greater than aPPDUMaxTime (10 milliseconds) |
|
2741 if (m_phy->CalculateTxDuration (aggregatedPacket->GetSize () + peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, dataTxVector, preamble, m_phy->GetFrequency (), 0, 0) > MilliSeconds (10)) |
|
2742 { |
|
2743 return true; |
|
2744 } |
|
2745 |
|
2746 if (!m_mpduAggregator->CanBeAggregated (peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, aggregatedPacket, size)) |
|
2747 { |
|
2748 return true; |
|
2749 } |
|
2750 |
|
2751 return false; |
2675 } |
2752 } |
2676 |
2753 |
2677 Ptr<Packet> |
2754 Ptr<Packet> |
2678 MacLow::AggregateToAmpdu (Ptr<const Packet> packet, const WifiMacHeader hdr) |
2755 MacLow::AggregateToAmpdu (Ptr<const Packet> packet, const WifiMacHeader hdr) |
2679 { |
2756 { |
2680 NS_ASSERT (m_aggregateQueue->GetSize () == 0); |
2757 NS_ASSERT (m_aggregateQueue->GetSize () == 0); |
2681 bool isAmpdu = false; |
2758 bool isAmpdu = false; |
2682 Ptr<Packet> newPacket, tempPacket; |
2759 Ptr<Packet> newPacket, tempPacket; |
2683 WifiMacHeader peekedHdr; |
2760 WifiMacHeader peekedHdr; |
2684 newPacket = packet->Copy(); |
2761 newPacket = packet->Copy (); |
2685 //missing hdr.IsAck() since we have no means of knowing the Tid of the Ack yet |
2762 //missing hdr.IsAck() since we have no means of knowing the Tid of the Ack yet |
2686 if (hdr.IsQosData() || hdr.IsBlockAck()|| hdr.IsBlockAckReq()) |
2763 if (hdr.IsQosData () || hdr.IsBlockAck ()|| hdr.IsBlockAckReq ()) |
2687 { |
2764 { |
2688 Time tstamp; |
2765 Time tstamp; |
2689 uint8_t tid = GetTid (packet, hdr); |
2766 uint8_t tid = GetTid (packet, hdr); |
2690 Ptr<WifiMacQueue> queue; |
2767 Ptr<WifiMacQueue> queue; |
2691 AcIndex ac = QosUtilsMapTidToAc (tid); |
2768 AcIndex ac = QosUtilsMapTidToAc (tid); |
2692 //since a blockack agreement always preceeds mpdu aggregation there should always exist blockAck listener |
2769 //since a blockack agreement always preceeds mpdu aggregation there should always exist blockAck listener |
2693 std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt= m_edcaListeners.find(ac); |
2770 std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt = m_edcaListeners.find (ac); |
2694 NS_ASSERT (listenerIt != m_edcaListeners.end ()); |
2771 NS_ASSERT (listenerIt != m_edcaListeners.end ()); |
2695 queue = listenerIt->second->GetQueue(); |
2772 queue = listenerIt->second->GetQueue (); |
2696 |
2773 |
2697 if (!hdr.GetAddr1 ().IsBroadcast () && m_mpduAggregator!= 0) |
2774 if (!hdr.GetAddr1 ().IsBroadcast () && m_mpduAggregator != 0) |
2698 { |
2775 { |
2699 //Have to make sure that their exist a block Ack agreement before sending an AMPDU (BlockAck Manager) |
2776 //Have to make sure that their exist a block Ack agreement before sending an AMPDU (BlockAck Manager) |
2700 if (listenerIt->second->GetBlockAckAgreementExists (hdr.GetAddr1(), tid)) |
2777 if (listenerIt->second->GetBlockAckAgreementExists (hdr.GetAddr1 (), tid)) |
2701 { |
2778 { |
2702 /* here is performed mpdu aggregation */ |
2779 /* here is performed mpdu aggregation */ |
2703 /* MSDU aggregation happened in edca if the user asked for it so m_currentPacket may contains a normal packet or a A-MSDU*/ |
2780 /* MSDU aggregation happened in edca if the user asked for it so m_currentPacket may contains a normal packet or a A-MSDU*/ |
2704 Ptr<Packet> currentAggregatedPacket = Create<Packet> (); |
2781 Ptr<Packet> currentAggregatedPacket = Create<Packet> (); |
2705 peekedHdr = hdr; |
2782 peekedHdr = hdr; |
2709 uint16_t blockAckSize = 0; |
2786 uint16_t blockAckSize = 0; |
2710 bool aggregated = false; |
2787 bool aggregated = false; |
2711 int i = 0; |
2788 int i = 0; |
2712 Ptr<Packet> aggPacket = newPacket->Copy (); |
2789 Ptr<Packet> aggPacket = newPacket->Copy (); |
2713 |
2790 |
2714 if (!hdr.IsBlockAckReq()) |
2791 if (!hdr.IsBlockAckReq ()) |
2715 { |
2792 { |
2716 if (!hdr.IsBlockAck()) |
2793 if (!hdr.IsBlockAck ()) |
2717 { |
2794 { |
2718 startingSequenceNumber = peekedHdr.GetSequenceNumber(); |
2795 startingSequenceNumber = peekedHdr.GetSequenceNumber (); |
2719 peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK); |
2796 peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK); |
2720 } |
2797 } |
2721 currentSequenceNumber = peekedHdr.GetSequenceNumber(); |
2798 currentSequenceNumber = peekedHdr.GetSequenceNumber (); |
2722 newPacket->AddHeader (peekedHdr); |
2799 newPacket->AddHeader (peekedHdr); |
2723 WifiMacTrailer fcs; |
2800 WifiMacTrailer fcs; |
2724 newPacket->AddTrailer (fcs); |
2801 newPacket->AddTrailer (fcs); |
2725 |
2802 |
2726 aggregated=m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket); |
2803 aggregated = m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket); |
2727 |
2804 |
2728 if (aggregated) |
2805 if (aggregated) |
2729 { |
2806 { |
2730 NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber()<<" to A-MPDU, packet size = " << newPacket->GetSize ()<< ", A-MPDU size = " << currentAggregatedPacket->GetSize ()); |
2807 NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber () << " to A-MPDU, packet size = " << newPacket->GetSize () << ", A-MPDU size = " << currentAggregatedPacket->GetSize ()); |
2731 i++; |
2808 i++; |
2732 m_sentMpdus++; |
2809 m_sentMpdus++; |
2733 m_aggregateQueue->Enqueue (aggPacket, peekedHdr); |
2810 m_aggregateQueue->Enqueue (aggPacket, peekedHdr); |
2734 } |
2811 } |
2735 } |
2812 } |
2736 else if (hdr.IsBlockAckReq()) |
2813 else if (hdr.IsBlockAckReq ()) |
2737 { |
2814 { |
2738 blockAckSize = packet->GetSize() + hdr.GetSize() + WIFI_MAC_FCS_LENGTH; |
2815 blockAckSize = packet->GetSize () + hdr.GetSize () + WIFI_MAC_FCS_LENGTH; |
2739 qosPolicy = 3; //if the last subrame is block ack req then set ack policy of all frames to blockack |
2816 qosPolicy = 3; //if the last subrame is block ack req then set ack policy of all frames to blockack |
2740 CtrlBAckRequestHeader blockAckReq; |
2817 CtrlBAckRequestHeader blockAckReq; |
2741 packet->PeekHeader (blockAckReq); |
2818 packet->PeekHeader (blockAckReq); |
2742 startingSequenceNumber = blockAckReq.GetStartingSequence (); |
2819 startingSequenceNumber = blockAckReq.GetStartingSequence (); |
2743 } |
2820 } |
2749 { |
2826 { |
2750 peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid, |
2827 peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid, |
2751 WifiMacHeader::ADDR1, |
2828 WifiMacHeader::ADDR1, |
2752 hdr.GetAddr1 (), &tstamp); |
2829 hdr.GetAddr1 (), &tstamp); |
2753 currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr); |
2830 currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr); |
2754 |
2831 |
2755 /* here is performed MSDU aggregation (two-level aggregation) */ |
2832 /* here is performed MSDU aggregation (two-level aggregation) */ |
2756 if (peekedPacket != 0 && listenerIt->second->GetMsduAggregator () != 0) |
2833 if (peekedPacket != 0 && listenerIt->second->GetMsduAggregator () != 0) |
2757 { |
2834 { |
2758 tempPacket = PerformMsduAggregation(peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize); |
2835 tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize); |
2759 if (tempPacket != 0) //MSDU aggregation |
2836 if (tempPacket != 0) //MSDU aggregation |
2760 peekedPacket = tempPacket->Copy(); |
2837 { |
|
2838 peekedPacket = tempPacket->Copy (); |
|
2839 } |
2761 } |
2840 } |
2762 } |
2841 } |
2763 else |
2842 else |
2764 { |
2843 { |
2765 retry = true; |
2844 retry = true; |
2766 currentSequenceNumber = peekedHdr.GetSequenceNumber(); |
2845 currentSequenceNumber = peekedHdr.GetSequenceNumber (); |
2767 } |
2846 } |
2768 |
2847 |
2769 while (IsInWindow (currentSequenceNumber, startingSequenceNumber, 64) && !StopMpduAggregation (peekedPacket, peekedHdr, currentAggregatedPacket, blockAckSize)) |
2848 while (IsInWindow (currentSequenceNumber, startingSequenceNumber, 64) && !StopMpduAggregation (peekedPacket, peekedHdr, currentAggregatedPacket, blockAckSize)) |
2770 { |
2849 { |
2771 //for now always send AMPDU with normal ACK |
2850 //for now always send AMPDU with normal ACK |
2772 if (retry == false) |
2851 if (retry == false) |
2773 { |
2852 { |
2774 currentSequenceNumber = listenerIt->second->GetNextSequenceNumberfor (&peekedHdr); |
2853 currentSequenceNumber = listenerIt->second->GetNextSequenceNumberfor (&peekedHdr); |
2775 peekedHdr.SetSequenceNumber (currentSequenceNumber); |
2854 peekedHdr.SetSequenceNumber (currentSequenceNumber); |
2776 peekedHdr.SetFragmentNumber (0); |
2855 peekedHdr.SetFragmentNumber (0); |
2777 peekedHdr.SetNoMoreFragments (); |
2856 peekedHdr.SetNoMoreFragments (); |
2778 peekedHdr.SetNoRetry (); |
2857 peekedHdr.SetNoRetry (); |
2779 } |
2858 } |
2780 if (qosPolicy == 0) |
2859 if (qosPolicy == 0) |
|
2860 { |
2781 peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK); |
2861 peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK); |
|
2862 } |
2782 else |
2863 else |
|
2864 { |
2783 peekedHdr.SetQosAckPolicy (WifiMacHeader::BLOCK_ACK); |
2865 peekedHdr.SetQosAckPolicy (WifiMacHeader::BLOCK_ACK); |
|
2866 } |
2784 |
2867 |
2785 newPacket = peekedPacket->Copy (); |
2868 newPacket = peekedPacket->Copy (); |
2786 Ptr<Packet> aggPacket = newPacket->Copy (); |
2869 Ptr<Packet> aggPacket = newPacket->Copy (); |
2787 |
2870 |
2788 newPacket->AddHeader (peekedHdr); |
2871 newPacket->AddHeader (peekedHdr); |
2789 WifiMacTrailer fcs; |
2872 WifiMacTrailer fcs; |
2790 newPacket->AddTrailer (fcs); |
2873 newPacket->AddTrailer (fcs); |
2791 aggregated = m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket); |
2874 aggregated = m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket); |
2792 if (aggregated) |
2875 if (aggregated) |
2793 { |
2876 { |
2794 m_aggregateQueue->Enqueue (aggPacket, peekedHdr); |
2877 m_aggregateQueue->Enqueue (aggPacket, peekedHdr); |
2795 if (i == 1 && hdr.IsQosData ()) |
2878 if (i == 1 && hdr.IsQosData ()) |
2796 { |
|
2797 if (!m_txParams.MustSendRts ()) |
|
2798 { |
2879 { |
2799 listenerIt->second->CompleteMpduTx (packet, hdr, tstamp); |
2880 if (!m_txParams.MustSendRts ()) |
|
2881 { |
|
2882 listenerIt->second->CompleteMpduTx (packet, hdr, tstamp); |
|
2883 } |
|
2884 else |
|
2885 { |
|
2886 InsertInTxQueue (packet, hdr, tstamp); |
|
2887 } |
2800 } |
2888 } |
2801 else |
2889 NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber () << " to A-MPDU, packet size = " << newPacket->GetSize () << ", A-MPDU size = " << currentAggregatedPacket->GetSize ()); |
2802 { |
|
2803 InsertInTxQueue (packet, hdr, tstamp); |
|
2804 } |
|
2805 } |
|
2806 NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber () <<" to A-MPDU, packet size = " << newPacket->GetSize ()<< ", A-MPDU size = " << currentAggregatedPacket->GetSize ()); |
|
2807 i++; |
2890 i++; |
2808 isAmpdu = true; |
2891 isAmpdu = true; |
2809 m_sentMpdus++; |
2892 m_sentMpdus++; |
2810 if (!m_txParams.MustSendRts ()) |
2893 if (!m_txParams.MustSendRts ()) |
2811 { |
2894 { |
2812 listenerIt->second->CompleteMpduTx (peekedPacket, peekedHdr, tstamp); |
2895 listenerIt->second->CompleteMpduTx (peekedPacket, peekedHdr, tstamp); |
2813 } |
2896 } |
2814 else |
2897 else |
2815 { |
2898 { |
2816 InsertInTxQueue (peekedPacket, peekedHdr, tstamp); |
2899 InsertInTxQueue (peekedPacket, peekedHdr, tstamp); |
2817 } |
2900 } |
2818 if (retry) |
2901 if (retry) |
|
2902 { |
2819 listenerIt->second->RemoveFromBaQueue (tid, hdr.GetAddr1 (), peekedHdr.GetSequenceNumber ()); |
2903 listenerIt->second->RemoveFromBaQueue (tid, hdr.GetAddr1 (), peekedHdr.GetSequenceNumber ()); |
|
2904 } |
2820 else |
2905 else |
|
2906 { |
2821 queue->Remove (peekedPacket); |
2907 queue->Remove (peekedPacket); |
|
2908 } |
2822 newPacket = 0; |
2909 newPacket = 0; |
2823 } |
2910 } |
2824 else |
2911 else |
|
2912 { |
2825 break; |
2913 break; |
|
2914 } |
2826 if (retry == true) |
2915 if (retry == true) |
2827 { |
2916 { |
2828 peekedPacket = listenerIt->second->PeekNextPacketInBaQueue(peekedHdr, hdr.GetAddr1(), tid, &tstamp); |
2917 peekedPacket = listenerIt->second->PeekNextPacketInBaQueue (peekedHdr, hdr.GetAddr1 (), tid, &tstamp); |
2829 if (peekedPacket == 0) |
2918 if (peekedPacket == 0) |
2830 { |
2919 { |
2831 //I reached the first packet that I added to this A-MPDU |
2920 //I reached the first packet that I added to this A-MPDU |
2832 retry = false; |
2921 retry = false; |
2833 peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid, |
2922 peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid, |
2834 WifiMacHeader::ADDR1, hdr.GetAddr1 (), &tstamp); |
2923 WifiMacHeader::ADDR1, hdr.GetAddr1 (), &tstamp); |
2835 if (peekedPacket != 0) |
2924 if (peekedPacket != 0) |
2836 { |
2925 { |
2837 //find what will the sequence number be so that we don't send more than 64 packets apart |
2926 //find what will the sequence number be so that we don't send more than 64 packets apart |
2838 currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr); |
2927 currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr); |
2839 |
2928 |
2840 if (listenerIt->second->GetMsduAggregator () != 0) |
2929 if (listenerIt->second->GetMsduAggregator () != 0) |
2841 { |
2930 { |
2842 tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize); |
2931 tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize); |
2843 if (tempPacket != 0) //MSDU aggregation |
2932 if (tempPacket != 0) //MSDU aggregation |
2844 peekedPacket = tempPacket->Copy(); |
2933 { |
2845 } |
2934 peekedPacket = tempPacket->Copy (); |
2846 } |
2935 } |
|
2936 } |
|
2937 } |
2847 } |
2938 } |
2848 else |
2939 else |
2849 currentSequenceNumber = peekedHdr.GetSequenceNumber(); |
2940 { |
|
2941 currentSequenceNumber = peekedHdr.GetSequenceNumber (); |
|
2942 } |
2850 } |
2943 } |
2851 else |
2944 else |
2852 { |
2945 { |
2853 peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid, |
2946 peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid, |
2854 WifiMacHeader::ADDR1, hdr.GetAddr1 (), &tstamp); |
2947 WifiMacHeader::ADDR1, hdr.GetAddr1 (), &tstamp); |
2855 if (peekedPacket != 0) |
2948 if (peekedPacket != 0) |
2856 { |
2949 { |
2857 //find what will the sequence number be so that we don't send more than 64 packets apart |
2950 //find what will the sequence number be so that we don't send more than 64 packets apart |
2858 currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr); |
2951 currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr); |
2859 |
2952 |
2860 if (listenerIt->second->GetMsduAggregator () != 0 && IsInWindow (currentSequenceNumber, startingSequenceNumber, 64)) |
2953 if (listenerIt->second->GetMsduAggregator () != 0 && IsInWindow (currentSequenceNumber, startingSequenceNumber, 64)) |
2861 { |
2954 { |
2862 tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize); |
2955 tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize); |
2863 if (tempPacket != 0) //MSDU aggregation |
2956 if (tempPacket != 0) //MSDU aggregation |
2864 peekedPacket = tempPacket->Copy(); |
2957 { |
2865 } |
2958 peekedPacket = tempPacket->Copy (); |
2866 } |
2959 } |
|
2960 } |
|
2961 } |
2867 } |
2962 } |
2868 } |
2963 } |
2869 if (isAmpdu) |
2964 if (isAmpdu) |
2870 { |
2965 { |
2871 if (hdr.IsBlockAckReq()) |
2966 if (hdr.IsBlockAckReq ()) |
2872 { |
2967 { |
2873 newPacket = packet->Copy(); |
2968 newPacket = packet->Copy (); |
2874 peekedHdr = hdr; |
2969 peekedHdr = hdr; |
2875 Ptr<Packet> aggPacket = newPacket->Copy(); |
2970 Ptr<Packet> aggPacket = newPacket->Copy (); |
2876 m_aggregateQueue->Enqueue (aggPacket, peekedHdr); |
2971 m_aggregateQueue->Enqueue (aggPacket, peekedHdr); |
2877 newPacket->AddHeader (peekedHdr); |
2972 newPacket->AddHeader (peekedHdr); |
2878 WifiMacTrailer fcs; |
2973 WifiMacTrailer fcs; |
2879 newPacket->AddTrailer (fcs); |
2974 newPacket->AddTrailer (fcs); |
2880 m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket); |
2975 m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket); |
2881 } |
2976 } |
2882 if (qosPolicy==0) |
2977 if (qosPolicy == 0) |
2883 { |
2978 { |
2884 listenerIt->second->CompleteTransfer (hdr.GetAddr1 (), tid); |
2979 listenerIt->second->CompleteTransfer (hdr.GetAddr1 (), tid); |
2885 } |
2980 } |
2886 //Add packet tag |
2981 //Add packet tag |
2887 AmpduTag ampdutag; |
2982 AmpduTag ampdutag; |
2888 ampdutag.SetAmpdu (true); |
2983 ampdutag.SetAmpdu (true); |
2889 ampdutag.SetNoOfMpdus(i); |
2984 ampdutag.SetNoOfMpdus (i); |
2890 newPacket = currentAggregatedPacket; |
2985 newPacket = currentAggregatedPacket; |
2891 newPacket->AddPacketTag(ampdutag); |
2986 newPacket->AddPacketTag (ampdutag); |
2892 currentAggregatedPacket = 0; |
2987 currentAggregatedPacket = 0; |
2893 NS_LOG_DEBUG ("tx unicast A-MPDU"); |
2988 NS_LOG_DEBUG ("tx unicast A-MPDU"); |
2894 listenerIt->second->SetAmpdu(true); |
2989 listenerIt->second->SetAmpdu (true); |
2895 } |
2990 } |
2896 else |
2991 else |
2897 { |
2992 { |
2898 uint32_t queueSize = m_aggregateQueue->GetSize (); |
2993 uint32_t queueSize = m_aggregateQueue->GetSize (); |
2899 NS_ASSERT (queueSize <= 2); //since it is not an A-MPDU then only 2 packets should have been added to the queue no more |
2994 NS_ASSERT (queueSize <= 2); //since it is not an A-MPDU then only 2 packets should have been added to the queue no more |
2911 |
3006 |
2912 void |
3007 void |
2913 MacLow::FlushAggregateQueue (void) |
3008 MacLow::FlushAggregateQueue (void) |
2914 { |
3009 { |
2915 if (m_aggregateQueue->GetSize () > 0) |
3010 if (m_aggregateQueue->GetSize () > 0) |
2916 { |
3011 { |
2917 NS_LOG_DEBUG("Flush aggregate queue"); |
3012 NS_LOG_DEBUG ("Flush aggregate queue"); |
2918 m_aggregateQueue->Flush (); |
3013 m_aggregateQueue->Flush (); |
2919 } |
3014 } |
2920 m_txPackets.clear (); |
3015 m_txPackets.clear (); |
2921 } |
3016 } |
2922 |
3017 |
2923 void |
3018 void |
2924 MacLow::InsertInTxQueue (Ptr<const Packet> packet, const WifiMacHeader &hdr, Time tStamp) |
3019 MacLow::InsertInTxQueue (Ptr<const Packet> packet, const WifiMacHeader &hdr, Time tStamp) |
2925 { |
3020 { |
2926 Item item; |
3021 Item item; |
2927 |
3022 |
2928 item.packet = packet; |
3023 item.packet = packet; |
2929 item.hdr = hdr; |
3024 item.hdr = hdr; |
2930 item.timestamp = tStamp; |
3025 item.timestamp = tStamp; |
2931 |
3026 |
2932 m_txPackets.push_back (item); |
3027 m_txPackets.push_back (item); |
2933 } |
3028 } |
2934 |
3029 |
2935 Ptr<Packet> |
3030 Ptr<Packet> |
2936 MacLow::PerformMsduAggregation(Ptr<const Packet> packet, WifiMacHeader *hdr, Time *tstamp, Ptr<Packet> currentAmpduPacket, uint16_t blockAckSize) |
3031 MacLow::PerformMsduAggregation (Ptr<const Packet> packet, WifiMacHeader *hdr, Time *tstamp, Ptr<Packet> currentAmpduPacket, uint16_t blockAckSize) |
2937 { |
3032 { |
2938 bool msduAggregation = false; |
3033 bool msduAggregation = false; |
2939 bool isAmsdu = false; |
3034 bool isAmsdu = false; |
2940 Ptr<Packet> currentAmsduPacket = Create<Packet> (); |
3035 Ptr<Packet> currentAmsduPacket = Create<Packet> (); |
2941 Ptr<Packet> tempPacket = Create<Packet> (); |
3036 Ptr<Packet> tempPacket = Create<Packet> (); |
2942 |
3037 |
2943 Ptr<WifiMacQueue> queue; |
3038 Ptr<WifiMacQueue> queue; |
2944 AcIndex ac = QosUtilsMapTidToAc (GetTid (packet, *hdr)); |
3039 AcIndex ac = QosUtilsMapTidToAc (GetTid (packet, *hdr)); |
2945 std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt = m_edcaListeners.find (ac); |
3040 std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt = m_edcaListeners.find (ac); |
2946 NS_ASSERT (listenerIt != m_edcaListeners.end ()); |
3041 NS_ASSERT (listenerIt != m_edcaListeners.end ()); |
2947 queue = listenerIt->second->GetQueue(); |
3042 queue = listenerIt->second->GetQueue (); |
2948 |
3043 |
2949 listenerIt->second->GetMsduAggregator ()->Aggregate (packet, currentAmsduPacket, |
3044 listenerIt->second->GetMsduAggregator ()->Aggregate (packet, currentAmsduPacket, |
2950 listenerIt->second->GetSrcAddressForAggregation (*hdr), |
3045 listenerIt->second->GetSrcAddressForAggregation (*hdr), |
2951 listenerIt->second->GetDestAddressForAggregation (*hdr)); |
3046 listenerIt->second->GetDestAddressForAggregation (*hdr)); |
2952 |
3047 |
2953 Ptr<const Packet> peekedPacket = queue->PeekByTidAndAddress (hdr, hdr->GetQosTid (), |
3048 Ptr<const Packet> peekedPacket = queue->PeekByTidAndAddress (hdr, hdr->GetQosTid (), |
2954 WifiMacHeader::ADDR1, hdr->GetAddr1 (), tstamp); |
3049 WifiMacHeader::ADDR1, hdr->GetAddr1 (), tstamp); |
2955 while (peekedPacket != 0) |
3050 while (peekedPacket != 0) |
2956 { |
3051 { |
2957 tempPacket = currentAmsduPacket; |
3052 tempPacket = currentAmsduPacket; |
2958 |
3053 |
2959 msduAggregation = listenerIt->second->GetMsduAggregator ()->Aggregate (peekedPacket, tempPacket, |
3054 msduAggregation = listenerIt->second->GetMsduAggregator ()->Aggregate (peekedPacket, tempPacket, |
2960 listenerIt->second->GetSrcAddressForAggregation (*hdr), |
3055 listenerIt->second->GetSrcAddressForAggregation (*hdr), |
2961 listenerIt->second->GetDestAddressForAggregation (*hdr)); |
3056 listenerIt->second->GetDestAddressForAggregation (*hdr)); |
2962 |
3057 |
2963 if (msduAggregation && !StopMpduAggregation (tempPacket, *hdr, currentAmpduPacket, blockAckSize)) |
3058 if (msduAggregation && !StopMpduAggregation (tempPacket, *hdr, currentAmpduPacket, blockAckSize)) |
2964 { |
3059 { |
2965 isAmsdu = true; |
3060 isAmsdu = true; |
2966 currentAmsduPacket = tempPacket; |
3061 currentAmsduPacket = tempPacket; |
2967 queue->Remove (peekedPacket); |
3062 queue->Remove (peekedPacket); |
2968 } |
3063 } |
2969 else |
3064 else |
2970 { |
3065 { |
2971 break; |
3066 break; |
2972 } |
3067 } |
2973 peekedPacket = queue->PeekByTidAndAddress (hdr, hdr->GetQosTid (), WifiMacHeader::ADDR1, hdr->GetAddr1 (), tstamp); |
3068 peekedPacket = queue->PeekByTidAndAddress (hdr, hdr->GetQosTid (), WifiMacHeader::ADDR1, hdr->GetAddr1 (), tstamp); |
2974 } |
3069 } |
2975 |
3070 |
2976 if (isAmsdu) |
3071 if (isAmsdu) |
2977 { |
3072 { |
2978 NS_LOG_DEBUG ("A-MSDU with size = " << currentAmsduPacket->GetSize ()); |
3073 NS_LOG_DEBUG ("A-MSDU with size = " << currentAmsduPacket->GetSize ()); |
2979 hdr->SetQosAmsdu (); |
3074 hdr->SetQosAmsdu (); |
2980 hdr->SetAddr3 (GetBssid ()); |
3075 hdr->SetAddr3 (GetBssid ()); |
2981 return currentAmsduPacket; |
3076 return currentAmsduPacket; |
2982 } |
3077 } |
2983 else |
3078 else |
2984 { |
3079 { |
2985 return 0; |
3080 return 0; |
2986 } |
3081 } |
2987 } |
3082 } |
2988 |
3083 |
2989 } // namespace ns3 |
3084 } //namespace ns3 |