LEFT | RIGHT |
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ | 1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ |
2 /* | 2 /* |
3 * Copyright (c) 2005,2006 INRIA | 3 * Copyright (c) 2005,2006 INRIA |
4 * Copyright (c) 2009 MIRKO BANCHI | 4 * Copyright (c) 2009 MIRKO BANCHI |
5 * | 5 * |
6 * This program is free software; you can redistribute it and/or modify | 6 * This program is free software; you can redistribute it and/or modify |
7 * it under the terms of the GNU General Public License version 2 as· | 7 * it under the terms of the GNU General Public License version 2 as· |
8 * published by the Free Software Foundation; | 8 * published by the Free Software Foundation; |
9 * | 9 * |
10 * This program is distributed in the hope that it will be useful, | 10 * This program is distributed in the hope that it will be useful, |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 m_sendRts = true; | 198 m_sendRts = true; |
199 } | 199 } |
200 void· | 200 void· |
201 MacLowTransmissionParameters::DisableRts (void) | 201 MacLowTransmissionParameters::DisableRts (void) |
202 { | 202 { |
203 m_sendRts = false; | 203 m_sendRts = false; |
204 } | 204 } |
205 bool· | 205 bool· |
206 MacLowTransmissionParameters::MustWaitAck (void) const | 206 MacLowTransmissionParameters::MustWaitAck (void) const |
207 { | 207 { |
208 return (m_waitAck != ACK_NONE)?true:false; | 208 return (m_waitAck != ACK_NONE); |
209 } | 209 } |
210 bool· | 210 bool· |
211 MacLowTransmissionParameters::MustWaitNormalAck (void) const | 211 MacLowTransmissionParameters::MustWaitNormalAck (void) const |
212 { | 212 { |
213 return (m_waitAck == ACK_NORMAL)?true:false; | 213 return (m_waitAck == ACK_NORMAL); |
214 } | 214 } |
215 bool· | 215 bool· |
216 MacLowTransmissionParameters::MustWaitFastAck (void) const | 216 MacLowTransmissionParameters::MustWaitFastAck (void) const |
217 { | 217 { |
218 return (m_waitAck == ACK_FAST)?true:false; | 218 return (m_waitAck == ACK_FAST); |
219 } | 219 } |
220 bool· | 220 bool· |
221 MacLowTransmissionParameters::MustWaitSuperFastAck (void) const | 221 MacLowTransmissionParameters::MustWaitSuperFastAck (void) const |
222 { | 222 { |
223 return (m_waitAck == ACK_SUPER_FAST)?true:false; | 223 return (m_waitAck == ACK_SUPER_FAST); |
224 } | 224 } |
225 bool | 225 bool |
226 MacLowTransmissionParameters::MustWaitBasicBlockAck (void) const | 226 MacLowTransmissionParameters::MustWaitBasicBlockAck (void) const |
227 { | 227 { |
228 return (m_waitAck == BLOCK_ACK_BASIC)?true:false; | 228 return (m_waitAck == BLOCK_ACK_BASIC)?true:false; |
229 } | 229 } |
230 bool | 230 bool |
231 MacLowTransmissionParameters::MustWaitCompressedBlockAck (void) const | 231 MacLowTransmissionParameters::MustWaitCompressedBlockAck (void) const |
232 { | 232 { |
233 return (m_waitAck == BLOCK_ACK_COMPRESSED)?true:false; | 233 return (m_waitAck == BLOCK_ACK_COMPRESSED)?true:false; |
234 } | 234 } |
235 bool | 235 bool |
236 MacLowTransmissionParameters::MustWaitMultiTidBlockAck (void) const | 236 MacLowTransmissionParameters::MustWaitMultiTidBlockAck (void) const |
237 { | 237 { |
238 return (m_waitAck == BLOCK_ACK_MULTI_TID)?true:false; | 238 return (m_waitAck == BLOCK_ACK_MULTI_TID)?true:false; |
239 } | 239 } |
240 bool· | 240 bool· |
241 MacLowTransmissionParameters::MustSendRts (void) const | 241 MacLowTransmissionParameters::MustSendRts (void) const |
242 { | 242 { |
243 return m_sendRts; | 243 return m_sendRts; |
244 } | 244 } |
245 bool· | 245 bool· |
246 MacLowTransmissionParameters::HasDurationId (void) const | 246 MacLowTransmissionParameters::HasDurationId (void) const |
247 { | 247 { |
248 return (m_overrideDurationId != Seconds (0))?true:false; | 248 return (m_overrideDurationId != Seconds (0)); |
249 } | 249 } |
250 Time | 250 Time |
251 MacLowTransmissionParameters::GetDurationId (void) const | 251 MacLowTransmissionParameters::GetDurationId (void) const |
252 { | 252 { |
253 NS_ASSERT (m_overrideDurationId != Seconds (0)); | 253 NS_ASSERT (m_overrideDurationId != Seconds (0)); |
254 return m_overrideDurationId; | 254 return m_overrideDurationId; |
255 } | 255 } |
256 bool· | 256 bool· |
257 MacLowTransmissionParameters::HasNextPacket (void) const | 257 MacLowTransmissionParameters::HasNextPacket (void) const |
258 { | 258 { |
259 return (m_nextSize != 0)?true:false; | 259 return (m_nextSize != 0); |
260 } | 260 } |
261 uint32_t· | 261 uint32_t· |
262 MacLowTransmissionParameters::GetNextPacketSize (void) const | 262 MacLowTransmissionParameters::GetNextPacketSize (void) const |
263 { | 263 { |
264 NS_ASSERT (HasNextPacket ()); | 264 NS_ASSERT (HasNextPacket ()); |
265 return m_nextSize; | 265 return m_nextSize; |
266 } | 266 } |
267 | 267 |
268 std::ostream &operator << (std::ostream &os, const MacLowTransmissionParameters
¶ms) | 268 std::ostream &operator << (std::ostream &os, const MacLowTransmissionParameters
¶ms) |
269 { | 269 { |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
352 { | 352 { |
353 m_phyMacLowListener = new PhyMacLowListener (this);· | 353 m_phyMacLowListener = new PhyMacLowListener (this);· |
354 phy->RegisterListener (m_phyMacLowListener); | 354 phy->RegisterListener (m_phyMacLowListener); |
355 } | 355 } |
356 | 356 |
357 | 357 |
358 void· | 358 void· |
359 MacLow::DoDispose (void) | 359 MacLow::DoDispose (void) |
360 { | 360 { |
361 NS_LOG_FUNCTION (this); | 361 NS_LOG_FUNCTION (this); |
362 CancelAllEvents (); | 362 m_normalAckTimeoutEvent.Cancel (); |
| 363 m_fastAckTimeoutEvent.Cancel (); |
| 364 m_superFastAckTimeoutEvent.Cancel (); |
| 365 m_fastAckFailedTimeoutEvent.Cancel (); |
| 366 m_blockAckTimeoutEvent.Cancel (); |
| 367 m_ctsTimeoutEvent.Cancel (); |
| 368 m_sendCtsEvent.Cancel (); |
| 369 m_sendAckEvent.Cancel (); |
| 370 m_sendDataEvent.Cancel (); |
| 371 m_waitSifsEvent.Cancel (); |
363 m_phy = 0; | 372 m_phy = 0; |
364 m_stationManager = 0; | 373 m_stationManager = 0; |
365 delete m_phyMacLowListener; | 374 delete m_phyMacLowListener; |
366 m_phyMacLowListener = 0; | 375 m_phyMacLowListener = 0; |
367 } | 376 } |
368 | 377 |
369 void | 378 void |
370 MacLow::CancelAllEvents (void) | 379 MacLow::CancelAllEvents (void) |
371 { | 380 { |
372 NS_LOG_FUNCTION (this); | 381 NS_LOG_FUNCTION (this); |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
540 } | 549 } |
541 void· | 550 void· |
542 MacLow::RegisterDcfListener (MacLowDcfListener *listener) | 551 MacLow::RegisterDcfListener (MacLowDcfListener *listener) |
543 { | 552 { |
544 m_dcfListeners.push_back (listener); | 553 m_dcfListeners.push_back (listener); |
545 } | 554 } |
546 | 555 |
547 | 556 |
548 void· | 557 void· |
549 MacLow::StartTransmission (Ptr<const Packet> packet,· | 558 MacLow::StartTransmission (Ptr<const Packet> packet,· |
550 WifiMacHeader const*hdr,· | 559 const WifiMacHeader* hdr,· |
551 MacLowTransmissionParameters params, | 560 MacLowTransmissionParameters params, |
552 MacLowTransmissionListener *listener) | 561 MacLowTransmissionListener *listener) |
553 { | 562 { |
554 NS_LOG_FUNCTION (this << packet << hdr << params << listener); | 563 NS_LOG_FUNCTION (this << packet << hdr << params << listener); |
555 /* m_currentPacket is not NULL because someone started | 564 /* m_currentPacket is not NULL because someone started |
556 * a transmission and was interrupted before one of: | 565 * a transmission and was interrupted before one of: |
557 * - ctsTimeout | 566 * - ctsTimeout |
558 * - sendDataAfterCTS | 567 * - sendDataAfterCTS |
559 * expired. This means that one of these timers is still | 568 * expired. This means that one of these timers is still |
560 * running. They are all cancelled below anyway by the· | 569 * running. They are all cancelled below anyway by the· |
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
958 } | 967 } |
959 WifiMode | 968 WifiMode |
960 MacLow::GetAckTxModeForData (Mac48Address to, WifiMode dataTxMode) const | 969 MacLow::GetAckTxModeForData (Mac48Address to, WifiMode dataTxMode) const |
961 { | 970 { |
962 return GetStation (to)->GetAckMode (dataTxMode); | 971 return GetStation (to)->GetAckMode (dataTxMode); |
963 } | 972 } |
964 | 973 |
965 | 974 |
966 Time | 975 Time |
967 MacLow::CalculateOverallTxTime (Ptr<const Packet> packet, | 976 MacLow::CalculateOverallTxTime (Ptr<const Packet> packet, |
968 WifiMacHeader const*hdr,· | 977 const WifiMacHeader* hdr,· |
969 MacLowTransmissionParameters const& params) cons
t | 978 const MacLowTransmissionParameters& params) cons
t |
970 { | 979 { |
971 Time txTime = Seconds (0); | 980 Time txTime = Seconds (0); |
972 WifiMode rtsMode = GetRtsTxMode (packet, hdr); | 981 WifiMode rtsMode = GetRtsTxMode (packet, hdr); |
973 WifiMode dataMode = GetDataTxMode (packet, hdr); | 982 WifiMode dataMode = GetDataTxMode (packet, hdr); |
974 if (params.MustSendRts ())· | 983 if (params.MustSendRts ())· |
975 { | 984 { |
976 txTime += m_phy->CalculateTxDuration (GetRtsSize (), rtsMode, WIFI_PREAMBL
E_LONG); | 985 txTime += m_phy->CalculateTxDuration (GetRtsSize (), rtsMode, WIFI_PREAMBL
E_LONG); |
977 txTime += GetCtsDuration (hdr->GetAddr1 (), rtsMode); | 986 txTime += GetCtsDuration (hdr->GetAddr1 (), rtsMode); |
978 txTime += GetSifs () * Scalar (2); | 987 txTime += GetSifs () * Scalar (2); |
979 } | 988 } |
980 uint32_t dataSize = GetSize (packet, hdr); | 989 uint32_t dataSize = GetSize (packet, hdr); |
981 txTime += m_phy->CalculateTxDuration (dataSize, dataMode, WIFI_PREAMBLE_LONG); | 990 txTime += m_phy->CalculateTxDuration (dataSize, dataMode, WIFI_PREAMBLE_LONG); |
982 if (params.MustWaitAck ()) | 991 if (params.MustWaitAck ()) |
983 { | 992 { |
984 txTime += GetSifs (); | 993 txTime += GetSifs (); |
985 txTime += GetAckDuration (hdr->GetAddr1 (), dataMode); | 994 txTime += GetAckDuration (hdr->GetAddr1 (), dataMode); |
986 } | 995 } |
987 return txTime; | 996 return txTime; |
988 } | 997 } |
989 | 998 |
990 Time | 999 Time |
991 MacLow::CalculateTransmissionTime (Ptr<const Packet> packet, | 1000 MacLow::CalculateTransmissionTime (Ptr<const Packet> packet, |
992 WifiMacHeader const*hdr,· | 1001 const WifiMacHeader* hdr,· |
993 MacLowTransmissionParameters const& params) c
onst | 1002 const MacLowTransmissionParameters& params) c
onst |
994 { | 1003 { |
995 Time txTime = CalculateOverallTxTime (packet, hdr, params); | 1004 Time txTime = CalculateOverallTxTime (packet, hdr, params); |
996 if (params.HasNextPacket ())· | 1005 if (params.HasNextPacket ())· |
997 { | 1006 { |
998 WifiMode dataMode = GetDataTxMode (packet, hdr); | 1007 WifiMode dataMode = GetDataTxMode (packet, hdr); |
999 txTime += GetSifs (); | 1008 txTime += GetSifs (); |
1000 txTime += m_phy->CalculateTxDuration (params.GetNextPacketSize (), dataMod
e, WIFI_PREAMBLE_LONG); | 1009 txTime += m_phy->CalculateTxDuration (params.GetNextPacketSize (), dataMod
e, WIFI_PREAMBLE_LONG); |
1001 } | 1010 } |
1002 return txTime; | 1011 return txTime; |
1003 } | 1012 } |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1106 void | 1115 void |
1107 MacLow::NotifyCtsTimeoutResetNow () | 1116 MacLow::NotifyCtsTimeoutResetNow () |
1108 { | 1117 { |
1109 for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i
++)· | 1118 for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i
++)· |
1110 { | 1119 { |
1111 (*i)->CtsTimeoutReset (); | 1120 (*i)->CtsTimeoutReset (); |
1112 } | 1121 } |
1113 } | 1122 } |
1114 | 1123 |
1115 void | 1124 void |
1116 MacLow::ForwardDown (Ptr<const Packet> packet, WifiMacHeader const* hdr,· | 1125 MacLow::ForwardDown (Ptr<const Packet> packet, const WifiMacHeader* hdr,· |
1117 WifiMode txMode) | 1126 WifiMode txMode) |
1118 { | 1127 { |
1119 NS_LOG_FUNCTION (this << packet << hdr << txMode); | 1128 NS_LOG_FUNCTION (this << packet << hdr << txMode); |
1120 NS_LOG_DEBUG ("send " << hdr->GetTypeString () << | 1129 NS_LOG_DEBUG ("send " << hdr->GetTypeString () << |
1121 ", to=" << hdr->GetAddr1 () << | 1130 ", to=" << hdr->GetAddr1 () << |
1122 ", size=" << packet->GetSize () << | 1131 ", size=" << packet->GetSize () << |
1123 ", mode=" << txMode << | 1132 ", mode=" << txMode << |
1124 ", duration=" << hdr->GetDuration () << | 1133 ", duration=" << hdr->GetDuration () << |
1125 ", seq=0x"<< std::hex << m_currentHdr.GetSequenceControl () << std::
dec); | 1134 ", seq=0x"<< std::hex << m_currentHdr.GetSequenceControl () << std::
dec); |
1126 m_phy->SendPacket (packet, txMode, WIFI_PREAMBLE_LONG, 0); | 1135 m_phy->SendPacket (packet, txMode, WIFI_PREAMBLE_LONG, 0); |
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1629 } | 1638 } |
1630 (*it).second.first.SetStartingSequence ((guard>>4)&0x0fff); | 1639 (*it).second.first.SetStartingSequence ((guard>>4)&0x0fff); |
1631 /* All packets already forwarded to WifiMac must be removed from buffer:· | 1640 /* All packets already forwarded to WifiMac must be removed from buffer:· |
1632 [begin (), lastComplete) */ | 1641 [begin (), lastComplete) */ |
1633 (*it).second.second.erase ((*it).second.second.begin (), lastComplete); | 1642 (*it).second.second.erase ((*it).second.second.begin (), lastComplete); |
1634 } | 1643 } |
1635 } | 1644 } |
1636 | 1645 |
1637 void | 1646 void |
1638 MacLow::SendBlockAckResponse (const CtrlBAckResponseHeader* blockAck, Mac48Addre
ss originator, bool immediate, | 1647 MacLow::SendBlockAckResponse (const CtrlBAckResponseHeader* blockAck, Mac48Addre
ss originator, bool immediate, |
1639 Time duration, WifiMode txMode) | 1648 Time duration, WifiMode blockAckReqTxMode) |
1640 { | 1649 { |
1641 Ptr<Packet> packet = Create<Packet> (); | 1650 Ptr<Packet> packet = Create<Packet> (); |
1642 packet->AddHeader (*blockAck); | 1651 packet->AddHeader (*blockAck); |
1643 | 1652 |
1644 WifiMacHeader hdr; | 1653 WifiMacHeader hdr; |
1645 hdr.SetType (WIFI_MAC_CTL_BACKRESP); | 1654 hdr.SetType (WIFI_MAC_CTL_BACKRESP); |
1646 hdr.SetAddr1 (originator); | 1655 hdr.SetAddr1 (originator); |
1647 hdr.SetAddr2 (GetAddress ()); | 1656 hdr.SetAddr2 (GetAddress ()); |
1648 hdr.SetDsNotFrom (); | 1657 hdr.SetDsNotFrom (); |
1649 hdr.SetDsNotTo (); | 1658 hdr.SetDsNotTo (); |
1650 hdr.SetNoRetry (); | 1659 hdr.SetNoRetry (); |
1651 hdr.SetNoMoreFragments (); | 1660 hdr.SetNoMoreFragments (); |
1652 | 1661 |
1653 m_currentPacket = packet; | 1662 m_currentPacket = packet; |
1654 m_currentHdr = hdr; | 1663 m_currentHdr = hdr; |
1655 if (immediate) | 1664 if (immediate) |
1656 { | 1665 { |
1657 m_txParams.DisableAck (); | 1666 m_txParams.DisableAck (); |
1658 duration -= GetSifs (); | 1667 duration -= GetSifs (); |
1659 if (blockAck->IsBasic ()) | 1668 if (blockAck->IsBasic ()) |
1660 { | 1669 { |
1661 duration -= GetBlockAckDuration (originator, txMode, BASIC_BLOCK_ACK); | 1670 duration -= GetBlockAckDuration (originator, blockAckReqTxMode, BASIC_
BLOCK_ACK); |
1662 } | 1671 } |
1663 else if (blockAck->IsCompressed ()) | 1672 else if (blockAck->IsCompressed ()) |
1664 { | 1673 { |
1665 duration -= GetBlockAckDuration (originator, txMode, COMPRESSED_BLOCK_
ACK); | 1674 duration -= GetBlockAckDuration (originator, blockAckReqTxMode, COMPRE
SSED_BLOCK_ACK); |
1666 } | 1675 } |
1667 else if (blockAck->IsMultiTid ()) | 1676 else if (blockAck->IsMultiTid ()) |
1668 { | 1677 { |
1669 NS_FATAL_ERROR ("Multi-tid block ack is not supported."); | 1678 NS_FATAL_ERROR ("Multi-tid block ack is not supported."); |
1670 } | 1679 } |
1671 } | 1680 } |
1672 else | 1681 else |
1673 { | 1682 { |
1674 m_txParams.EnableAck (); | 1683 m_txParams.EnableAck (); |
1675 duration += GetSifs (); | 1684 duration += GetSifs (); |
1676 duration += GetAckDuration (originator, txMode); | 1685 duration += GetAckDuration (originator, blockAckReqTxMode); |
1677 } | 1686 } |
1678 m_txParams.DisableNextData (); | 1687 m_txParams.DisableNextData (); |
1679 | 1688 |
1680 StartDataTxTimers (); | 1689 StartDataTxTimers (); |
1681 | 1690 |
1682 NS_ASSERT (duration >= MicroSeconds (0)); | 1691 NS_ASSERT (duration >= MicroSeconds (0)); |
1683 hdr.SetDuration (duration); | 1692 hdr.SetDuration (duration); |
1684 //here should be present a control about immediate or delayed block ack | 1693 //here should be present a control about immediate or delayed block ack |
1685 //for now we assume immediate | 1694 //for now we assume immediate |
1686 packet->AddHeader (hdr); | 1695 packet->AddHeader (hdr); |
1687 WifiMacTrailer fcs; | 1696 WifiMacTrailer fcs; |
1688 packet->AddTrailer (fcs); | 1697 packet->AddTrailer (fcs); |
1689 ForwardDown (packet, &hdr, txMode); | 1698 ForwardDown (packet, &hdr, blockAckReqTxMode); |
1690 m_currentPacket = 0; | 1699 m_currentPacket = 0; |
1691 } | 1700 } |
1692 | 1701 |
1693 void | 1702 void |
1694 MacLow::SendBlockAckAfterBlockAckRequest (const CtrlBAckRequestHeader reqHdr, Ma
c48Address originator, | 1703 MacLow::SendBlockAckAfterBlockAckRequest (const CtrlBAckRequestHeader reqHdr, Ma
c48Address originator, |
1695 Time duration, WifiMode txMode) | 1704 Time duration, WifiMode blockAckReqTxM
ode) |
1696 { | 1705 { |
1697 NS_LOG_FUNCTION (this); | 1706 NS_LOG_FUNCTION (this); |
1698 CtrlBAckResponseHeader blockAck; | 1707 CtrlBAckResponseHeader blockAck; |
1699 uint8_t tid; | 1708 uint8_t tid; |
1700 bool immediate = false; | 1709 bool immediate = false; |
1701 if (!reqHdr.IsMultiTid ()) | 1710 if (!reqHdr.IsMultiTid ()) |
1702 { | 1711 { |
1703 blockAck.SetStartingSequence (reqHdr.GetStartingSequence ()); | 1712 blockAck.SetStartingSequence (reqHdr.GetStartingSequence ()); |
1704 blockAck.SetTidInfo (reqHdr.GetTidInfo ()); | 1713 blockAck.SetTidInfo (reqHdr.GetTidInfo ()); |
1705 ······ | 1714 ······ |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1810 else | 1819 else |
1811 { | 1820 { |
1812 NS_LOG_DEBUG ("there's not a valid block ack agreement with "<<origina
tor); | 1821 NS_LOG_DEBUG ("there's not a valid block ack agreement with "<<origina
tor); |
1813 } | 1822 } |
1814 } | 1823 } |
1815 else | 1824 else |
1816 { | 1825 { |
1817 NS_FATAL_ERROR ("Multi-tid block ack is not supported."); | 1826 NS_FATAL_ERROR ("Multi-tid block ack is not supported."); |
1818 } | 1827 } |
1819 | 1828 |
1820 SendBlockAckResponse (&blockAck, originator, immediate, duration, txMode); | 1829 SendBlockAckResponse (&blockAck, originator, immediate, duration, blockAckReqT
xMode); |
1821 } | 1830 } |
1822 | 1831 |
1823 void | 1832 void |
1824 MacLow::ResetBlockAckInactivityTimerIfNeeded (BlockAckAgreement &agreement) | 1833 MacLow::ResetBlockAckInactivityTimerIfNeeded (BlockAckAgreement &agreement) |
1825 { | 1834 { |
1826 if (agreement.GetTimeout () != 0) | 1835 if (agreement.GetTimeout () != 0) |
1827 { | 1836 { |
1828 NS_ASSERT (agreement.m_inactivityEvent.IsRunning ()); | 1837 NS_ASSERT (agreement.m_inactivityEvent.IsRunning ()); |
1829 agreement.m_inactivityEvent.Cancel (); | 1838 agreement.m_inactivityEvent.Cancel (); |
1830 Time timeout = MicroSeconds (1024 * agreement.GetTimeout ()); | 1839 Time timeout = MicroSeconds (1024 * agreement.GetTimeout ()); |
(...skipping 10 matching lines...) Expand all Loading... |
1841 } | 1850 } |
1842 } | 1851 } |
1843 | 1852 |
1844 void | 1853 void |
1845 MacLow::RegisterBlockAckListenerForAc (enum AccessClass ac, MacLowBlockAckEventL
istener *listener) | 1854 MacLow::RegisterBlockAckListenerForAc (enum AccessClass ac, MacLowBlockAckEventL
istener *listener) |
1846 { | 1855 { |
1847 m_edcaListeners.insert (std::make_pair (ac, listener)); | 1856 m_edcaListeners.insert (std::make_pair (ac, listener)); |
1848 } | 1857 } |
1849 | 1858 |
1850 } // namespace ns3 | 1859 } // namespace ns3 |
LEFT | RIGHT |