OLD | NEW |
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 * | 4 * |
5 * This program is free software; you can redistribute it and/or modify | 5 * This program is free software; you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 2 as | 6 * it under the terms of the GNU General Public License version 2 as |
7 * published by the Free Software Foundation; | 7 * published by the Free Software Foundation; |
8 * | 8 * |
9 * This program is distributed in the hope that it will be useful, | 9 * This program is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 18 matching lines...) Expand all Loading... |
29 #include "ns3/packet.h" | 29 #include "ns3/packet.h" |
30 #include "ns3/assert.h" | 30 #include "ns3/assert.h" |
31 #include "ns3/log.h" | 31 #include "ns3/log.h" |
32 #include "ns3/double.h" | 32 #include "ns3/double.h" |
33 #include "ns3/uinteger.h" | 33 #include "ns3/uinteger.h" |
34 #include "ns3/enum.h" | 34 #include "ns3/enum.h" |
35 #include "ns3/pointer.h" | 35 #include "ns3/pointer.h" |
36 #include "ns3/net-device.h" | 36 #include "ns3/net-device.h" |
37 #include "ns3/trace-source-accessor.h" | 37 #include "ns3/trace-source-accessor.h" |
38 #include "ns3/boolean.h" | 38 #include "ns3/boolean.h" |
| 39 #include "ampdu-tag.h" |
39 #include <cmath> | 40 #include <cmath> |
40 | 41 |
41 NS_LOG_COMPONENT_DEFINE ("YansWifiPhy"); | 42 NS_LOG_COMPONENT_DEFINE ("YansWifiPhy"); |
42 | 43 |
43 namespace ns3 { | 44 namespace ns3 { |
44 | 45 |
45 NS_OBJECT_ENSURE_REGISTERED (YansWifiPhy); | 46 NS_OBJECT_ENSURE_REGISTERED (YansWifiPhy); |
46 | 47 |
47 TypeId | 48 TypeId |
48 YansWifiPhy::GetTypeId (void) | 49 YansWifiPhy::GetTypeId (void) |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 MakeBooleanAccessor (&YansWifiPhy::GetChannelBonding, | 162 MakeBooleanAccessor (&YansWifiPhy::GetChannelBonding, |
162 &YansWifiPhy::SetChannelBonding), | 163 &YansWifiPhy::SetChannelBonding), |
163 MakeBooleanChecker ()) | 164 MakeBooleanChecker ()) |
164 | 165 |
165 | 166 |
166 ; | 167 ; |
167 return tid; | 168 return tid; |
168 } | 169 } |
169 | 170 |
170 YansWifiPhy::YansWifiPhy () | 171 YansWifiPhy::YansWifiPhy () |
171 : m_channelNumber (1), | 172 : m_channelNumber (1), |
172 m_endRxEvent (), | 173 m_endRxEvent (), |
173 m_channelStartingFrequency (0) | 174 m_channelStartingFrequency (0), |
| 175 m_mpdusNum(0), |
| 176 m_firstMpduStatus(0) |
174 { | 177 { |
175 NS_LOG_FUNCTION (this); | 178 NS_LOG_FUNCTION (this); |
176 m_random = CreateObject<UniformRandomVariable> (); | 179 m_random = CreateObject<UniformRandomVariable> (); |
177 m_state = CreateObject<WifiPhyStateHelper> (); | 180 m_state = CreateObject<WifiPhyStateHelper> (); |
178 } | 181 } |
179 | 182 |
180 YansWifiPhy::~YansWifiPhy () | 183 YansWifiPhy::~YansWifiPhy () |
181 { | 184 { |
182 NS_LOG_FUNCTION (this); | 185 NS_LOG_FUNCTION (this); |
183 } | 186 } |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
429 YansWifiPhy::GetChannelNumber () const | 432 YansWifiPhy::GetChannelNumber () const |
430 { | 433 { |
431 return m_channelNumber; | 434 return m_channelNumber; |
432 } | 435 } |
433 | 436 |
434 double | 437 double |
435 YansWifiPhy::GetChannelFrequencyMhz () const | 438 YansWifiPhy::GetChannelFrequencyMhz () const |
436 { | 439 { |
437 return m_channelStartingFrequency + 5 * GetChannelNumber (); | 440 return m_channelStartingFrequency + 5 * GetChannelNumber (); |
438 } | 441 } |
439 | |
440 void | 442 void |
441 YansWifiPhy::SetReceiveOkCallback (RxOkCallback callback) | 443 YansWifiPhy::SetReceiveOkCallback (RxOkCallback callback) |
442 { | 444 { |
443 m_state->SetReceiveOkCallback (callback); | 445 m_state->SetReceiveOkCallback (callback); |
444 } | 446 } |
445 void | 447 void |
446 YansWifiPhy::SetReceiveErrorCallback (RxErrorCallback callback) | 448 YansWifiPhy::SetReceiveErrorCallback (RxErrorCallback callback) |
447 { | 449 { |
448 m_state->SetReceiveErrorCallback (callback); | 450 m_state->SetReceiveErrorCallback (callback); |
449 } | 451 } |
450 void | 452 void |
451 YansWifiPhy::StartReceivePacket (Ptr<Packet> packet, | 453 YansWifiPhy::StartReceivePacket (Ptr<Packet> packet, |
452 double rxPowerDbm, | 454 double rxPowerDbm, |
453 WifiTxVector txVector, | 455 WifiTxVector txVector, |
454 enum WifiPreamble preamble) | 456 enum WifiPreamble preamble,uint8_t packetType) |
455 { | 457 { |
456 NS_LOG_FUNCTION (this << packet << rxPowerDbm << txVector.GetMode()<< preamble
); | 458 NS_LOG_FUNCTION (this << packet << rxPowerDbm << txVector.GetMode()<< preamble
<< (uint32_t)packetType); |
| 459 AmpduTag ampduTag; |
457 rxPowerDbm += m_rxGainDb; | 460 rxPowerDbm += m_rxGainDb; |
458 double rxPowerW = DbmToW (rxPowerDbm); | 461 double rxPowerW = DbmToW (rxPowerDbm); |
459 Time rxDuration = CalculateTxDuration (packet->GetSize (), txVector, preamble)
; | 462 Time rxDuration = CalculateTxDuration (packet->GetSize (), txVector, preamble,
packetType,0); |
460 WifiMode txMode=txVector.GetMode(); | 463 WifiMode txMode=txVector.GetMode(); |
461 Time endRx = Simulator::Now () + rxDuration; | 464 Time endRx = Simulator::Now () + rxDuration; |
462 | 465 |
463 Ptr<InterferenceHelper::Event> event; | 466 Ptr<InterferenceHelper::Event> event; |
464 event = m_interference.Add (packet->GetSize (), | 467 event = m_interference.Add (packet->GetSize (), |
465 txMode, | 468 txMode, |
466 preamble, | 469 preamble, |
467 rxDuration, | 470 rxDuration, |
468 rxPowerW, | 471 rxPowerW, |
469 txVector); // we need it to calculate duration of HT
training symbols | 472 txVector); // we need it to calculate duration of HT
training symbols |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
505 NotifyRxDrop (packet); | 508 NotifyRxDrop (packet); |
506 if (endRx > Simulator::Now () + m_state->GetDelayUntilIdle ()) | 509 if (endRx > Simulator::Now () + m_state->GetDelayUntilIdle ()) |
507 { | 510 { |
508 // that packet will be noise _after_ the transmission of the | 511 // that packet will be noise _after_ the transmission of the |
509 // currently-transmitted packet. | 512 // currently-transmitted packet. |
510 goto maybeCcaBusy; | 513 goto maybeCcaBusy; |
511 } | 514 } |
512 break; | 515 break; |
513 case YansWifiPhy::CCA_BUSY: | 516 case YansWifiPhy::CCA_BUSY: |
514 case YansWifiPhy::IDLE: | 517 case YansWifiPhy::IDLE: |
515 if (rxPowerW > m_edThresholdW) | 518 if (rxPowerW > m_edThresholdW )//&& (m_mpdusNum == 0 && preamble !=WIFI_PR
EAMBLE_NONE) |
516 { | 519 { |
| 520 if (preamble != WIFI_PREAMBLE_NONE && packet->PeekPacketTag(ampduTag)&
&m_mpdusNum == 0) |
| 521 { |
| 522 //received the first MPDU in an MPDU |
| 523 m_mpdusNum=ampduTag.GetNoOfMpdus()-1; |
| 524 m_firstMpduStatus=1; |
| 525 } |
| 526 else if (preamble == WIFI_PREAMBLE_NONE && packet->PeekPacketTag(ampdu
Tag)&&m_mpdusNum > 0) |
| 527 { |
| 528 //received the other MPDUs that are part of the A-MPDU |
| 529 if (ampduTag.GetNoOfMpdus() < m_mpdusNum) |
| 530 { |
| 531 NS_LOG_DEBUG ("Missing MPDU from the A-MPDU " << m_mpdusNum- a
mpduTag.GetNoOfMpdus()); |
| 532 m_mpdusNum = ampduTag.GetNoOfMpdus(); |
| 533 } |
| 534 else |
| 535 m_mpdusNum--; |
| 536 } |
| 537 else if (preamble != WIFI_PREAMBLE_NONE && m_mpdusNum > 0 ) |
| 538 { |
| 539 NS_LOG_DEBUG ("Didn't receive the last MPDUs from an A-MPDU " <<
m_mpdusNum); |
| 540 m_firstMpduStatus=0; |
| 541 m_mpdusNum=0; |
| 542 } |
| 543 else //not an A-MPDU |
| 544 m_firstMpduStatus=0; |
517 NS_LOG_DEBUG ("sync to signal (power=" << rxPowerW << "W)"); | 545 NS_LOG_DEBUG ("sync to signal (power=" << rxPowerW << "W)"); |
518 // sync to signal | 546 // sync to signal |
519 m_state->SwitchToRx (rxDuration); | 547 m_state->SwitchToRx (rxDuration); |
520 NS_ASSERT (m_endRxEvent.IsExpired ()); | 548 NS_ASSERT (m_endRxEvent.IsExpired ()); |
521 NotifyRxBegin (packet); | 549 NotifyRxBegin (packet); |
522 m_interference.NotifyRxStart (); | 550 m_interference.NotifyRxStart (); |
523 m_endRxEvent = Simulator::Schedule (rxDuration, &YansWifiPhy::EndRecei
ve, this, | 551 m_endRxEvent = Simulator::Schedule (rxDuration, &YansWifiPhy::EndRecei
ve, this, |
524 packet, | 552 packet, |
525 event); | 553 event); |
526 } | 554 } |
| 555 else if (preamble == WIFI_PREAMBLE_NONE && m_mpdusNum ==0 ) |
| 556 { |
| 557 NS_LOG_DEBUG ("drop packet because no preamble has been received"); |
| 558 NotifyRxDrop (packet); |
| 559 goto maybeCcaBusy; |
| 560 } |
527 else | 561 else |
528 { | 562 { |
529 NS_LOG_DEBUG ("drop packet because signal power too Small (" << | 563 NS_LOG_DEBUG ("drop packet because signal power too Small (" << |
530 rxPowerW << "<" << m_edThresholdW << ")"); | 564 rxPowerW << "<" << m_edThresholdW << ")"); |
531 NotifyRxDrop (packet); | 565 NotifyRxDrop (packet); |
532 goto maybeCcaBusy; | 566 goto maybeCcaBusy; |
533 } | 567 } |
534 break; | 568 break; |
535 } | 569 } |
536 | 570 |
537 return; | 571 return; |
538 | 572 |
539 maybeCcaBusy: | 573 maybeCcaBusy: |
540 // We are here because we have received the first bit of a packet and we are | 574 // We are here because we have received the first bit of a packet and we are |
541 // not going to be able to synchronize on it | 575 // not going to be able to synchronize on it |
542 // In this model, CCA becomes busy when the aggregation of all signals as | 576 // In this model, CCA becomes busy when the aggregation of all signals as |
543 // tracked by the InterferenceHelper class is higher than the CcaBusyThreshold | 577 // tracked by the InterferenceHelper class is higher than the CcaBusyThreshold |
544 | 578 |
545 Time delayUntilCcaEnd = m_interference.GetEnergyDuration (m_ccaMode1ThresholdW
); | 579 Time delayUntilCcaEnd = m_interference.GetEnergyDuration (m_ccaMode1ThresholdW
); |
546 if (!delayUntilCcaEnd.IsZero ()) | 580 if (!delayUntilCcaEnd.IsZero ()) |
547 { | 581 { |
548 m_state->SwitchMaybeToCcaBusy (delayUntilCcaEnd); | 582 m_state->SwitchMaybeToCcaBusy (delayUntilCcaEnd); |
549 } | 583 } |
550 } | 584 } |
551 | 585 |
552 void | 586 void |
553 YansWifiPhy::SendPacket (Ptr<const Packet> packet, WifiMode txMode, WifiPreamble
preamble, WifiTxVector txVector) | 587 YansWifiPhy::SendPacket (Ptr<const Packet> packet, WifiMode txMode, WifiPreamble
preamble, WifiTxVector txVector,uint8_t packetType) |
554 { | 588 { |
555 NS_LOG_FUNCTION (this << packet << txMode << preamble << (uint32_t)txVector.Ge
tTxPowerLevel()); | 589 NS_LOG_FUNCTION (this << packet << txMode << preamble << (uint32_t)txVector.Ge
tTxPowerLevel() << (uint32_t)packetType); |
556 /* Transmission can happen if: | 590 /* Transmission can happen if: |
557 * - we are syncing on a packet. It is the responsability of the | 591 * - we are syncing on a packet. It is the responsability of the |
558 * MAC layer to avoid doing this but the PHY does nothing to | 592 * MAC layer to avoid doing this but the PHY does nothing to |
559 * prevent it. | 593 * prevent it. |
560 * - we are idle | 594 * - we are idle |
561 */ | 595 */ |
562 NS_ASSERT (!m_state->IsStateTx () && !m_state->IsStateSwitching ()); | 596 NS_ASSERT (!m_state->IsStateTx () && !m_state->IsStateSwitching ()); |
563 | 597 |
564 Time txDuration = CalculateTxDuration (packet->GetSize (), txVector, preamble)
; | 598 Time txDuration = CalculateTxDuration (packet->GetSize (), txVector, preamble,
packetType,0); |
565 if (m_state->IsStateRx ()) | 599 if (m_state->IsStateRx ()) |
566 { | 600 { |
567 m_endRxEvent.Cancel (); | 601 m_endRxEvent.Cancel (); |
568 m_interference.NotifyRxEnd (); | 602 m_interference.NotifyRxEnd (); |
569 } | 603 } |
570 NotifyTxBegin (packet); | 604 NotifyTxBegin (packet); |
571 uint32_t dataRate500KbpsUnits = txVector.GetMode().GetDataRate () * txVector.G
etNss() / 500000; | 605 uint32_t dataRate500KbpsUnits = txVector.GetMode().GetDataRate () * txVector.G
etNss() / 500000; |
572 bool isShortPreamble = (WIFI_PREAMBLE_SHORT == preamble); | 606 bool isShortPreamble = (WIFI_PREAMBLE_SHORT == preamble); |
573 NotifyMonitorSniffTx (packet, (uint16_t)GetChannelFrequencyMhz (), GetChannelN
umber (), dataRate500KbpsUnits, isShortPreamble, txVector.GetTxPowerLevel()); | 607 NotifyMonitorSniffTx (packet, (uint16_t)GetChannelFrequencyMhz (), GetChannelN
umber (), dataRate500KbpsUnits, isShortPreamble, txVector.GetTxPowerLevel()); |
574 m_state->SwitchToTx (txDuration, packet, txVector.GetMode(), preamble, txVect
or.GetTxPowerLevel()); | 608 m_state->SwitchToTx (txDuration, packet, txVector.GetMode(), preamble, txVect
or.GetTxPowerLevel()); |
575 m_channel->Send (this, packet, GetPowerDbm ( txVector.GetTxPowerLevel()) + m_t
xGainDb, txVector, preamble); | 609 m_channel->Send (this, packet, GetPowerDbm ( txVector.GetTxPowerLevel()) + m_t
xGainDb, txVector, preamble,packetType); |
576 } | 610 } |
577 | 611 |
578 uint32_t | 612 uint32_t |
579 YansWifiPhy::GetNModes (void) const | 613 YansWifiPhy::GetNModes (void) const |
580 { | 614 { |
581 return m_deviceRateSet.size (); | 615 return m_deviceRateSet.size (); |
582 } | 616 } |
583 WifiMode | 617 WifiMode |
584 YansWifiPhy::GetMode (uint32_t mode) const | 618 YansWifiPhy::GetMode (uint32_t mode) const |
585 { | 619 { |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
827 NS_LOG_FUNCTION (this << packet << event); | 861 NS_LOG_FUNCTION (this << packet << event); |
828 NS_ASSERT (IsStateRx ()); | 862 NS_ASSERT (IsStateRx ()); |
829 NS_ASSERT (event->GetEndTime () == Simulator::Now ()); | 863 NS_ASSERT (event->GetEndTime () == Simulator::Now ()); |
830 | 864 |
831 struct InterferenceHelper::SnrPer snrPer; | 865 struct InterferenceHelper::SnrPer snrPer; |
832 snrPer = m_interference.CalculateSnrPer (event); | 866 snrPer = m_interference.CalculateSnrPer (event); |
833 m_interference.NotifyRxEnd (); | 867 m_interference.NotifyRxEnd (); |
834 | 868 |
835 NS_LOG_DEBUG ("mode=" << (event->GetPayloadMode ().GetDataRate ()) << | 869 NS_LOG_DEBUG ("mode=" << (event->GetPayloadMode ().GetDataRate ()) << |
836 ", snr=" << snrPer.snr << ", per=" << snrPer.per << ", size=" <<
packet->GetSize ()); | 870 ", snr=" << snrPer.snr << ", per=" << snrPer.per << ", size=" <<
packet->GetSize ()); |
837 if (m_random->GetValue () > snrPer.per) | 871 //m_state->SwitchFromRxEnd (packet, snrPer.snr, snrPer.per, event->GetPayloadM
ode (), event->GetPreambleType ());· |
| 872 /* before ns-3.19 the phy layer used to decide if the received packet was rece
ived correctly or not since the |
| 873 * introduction of A-MPDUs this decision is left to the Mac. The phy layer cal
culates the per for the entire A-MPDU |
| 874 * then sends it to the Mac layer. The Mac layer then deaggregtes the A-MPDU a
nd then decides which MPDU insidethe· |
| 875 * A-MPDU is received in error. This is done by drawing and number number and
comparing it against the A-MPDU per |
| 876 */ |
| 877 // NotifyRxEnd (packet); |
| 878 if (m_firstMpduStatus==3) |
| 879 { |
| 880 //the first packet was not received correctly so no MPDUs from the AMPDU
can be received |
| 881 NotifyRxDrop (packet); |
| 882 m_state->SwitchFromRxEndError (packet, snrPer.snr); |
| 883 } |
| 884 else if (m_random->GetValue () > snrPer.per) |
838 { | 885 { |
839 NotifyRxEnd (packet); | 886 NotifyRxEnd (packet); |
840 uint32_t dataRate500KbpsUnits = event->GetPayloadMode ().GetDataRate () *
event->GetTxVector().GetNss()/ 500000; | 887 uint32_t dataRate500KbpsUnits = event->GetPayloadMode ().GetDataRate () *
event->GetTxVector().GetNss()/ 500000; |
841 bool isShortPreamble = (WIFI_PREAMBLE_SHORT == event->GetPreambleType ()); | 888 bool isShortPreamble = (WIFI_PREAMBLE_SHORT == event->GetPreambleType ()); |
842 double signalDbm = RatioToDb (event->GetRxPowerW ()) + 30; | 889 double signalDbm = RatioToDb (event->GetRxPowerW ()) + 30; |
843 double noiseDbm = RatioToDb (event->GetRxPowerW () / snrPer.snr) - GetRxNo
iseFigure () + 30; | 890 double noiseDbm = RatioToDb (event->GetRxPowerW () / snrPer.snr) - GetRxNo
iseFigure () + 30; |
844 NotifyMonitorSniffRx (packet, (uint16_t)GetChannelFrequencyMhz (), GetChan
nelNumber (), dataRate500KbpsUnits, isShortPreamble, signalDbm, noiseDbm); | 891 NotifyMonitorSniffRx (packet, (uint16_t)GetChannelFrequencyMhz (), GetChan
nelNumber (), dataRate500KbpsUnits, isShortPreamble, signalDbm, noiseDbm); |
845 m_state->SwitchFromRxEndOk (packet, snrPer.snr, event->GetPayloadMode (),
event->GetPreambleType ()); | 892 m_state->SwitchFromRxEndOk (packet, snrPer.snr, event->GetPayloadMode (),
event->GetPreambleType ()); |
| 893 if (m_firstMpduStatus==1) |
| 894 //if this packet is the first mpdu in an AMPDU flag that the first packe
t was received correctly |
| 895 m_firstMpduStatus=2; |
846 } | 896 } |
847 else | 897 else |
848 { | 898 { |
849 /* failure. */ | 899 /* failure. */ |
850 NotifyRxDrop (packet); | 900 NotifyRxDrop (packet); |
851 m_state->SwitchFromRxEndError (packet, snrPer.snr); | 901 m_state->SwitchFromRxEndError (packet, snrPer.snr); |
| 902 //if this packet is the first mpdu in an AMPDU flag that the first packet
was not received correctly |
| 903 if (m_firstMpduStatus==1) |
| 904 m_firstMpduStatus=3; |
852 } | 905 } |
853 } | 906 } |
854 | 907 |
855 int64_t | 908 int64_t |
856 YansWifiPhy::AssignStreams (int64_t stream) | 909 YansWifiPhy::AssignStreams (int64_t stream) |
857 { | 910 { |
858 NS_LOG_FUNCTION (this << stream); | 911 NS_LOG_FUNCTION (this << stream); |
859 m_random->SetStream (stream); | 912 m_random->SetStream (stream); |
860 return 1; | 913 return 1; |
861 } | 914 } |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
948 void | 1001 void |
949 YansWifiPhy::SetChannelBonding(bool channelbonding)· | 1002 YansWifiPhy::SetChannelBonding(bool channelbonding)· |
950 { | 1003 { |
951 m_channelBonding= channelbonding; | 1004 m_channelBonding= channelbonding; |
952 } | 1005 } |
953 | 1006 |
954 void | 1007 void |
955 YansWifiPhy::Configure80211n (void) | 1008 YansWifiPhy::Configure80211n (void) |
956 { | 1009 { |
957 NS_LOG_FUNCTION (this); | 1010 NS_LOG_FUNCTION (this); |
958 m_deviceRateSet.push_back (WifiPhy::GetDsssRate1Mbps ()); | 1011 //problem with these is that Ack Timeout is smaller that the TX Duration of a
packet using these rates |
959 m_deviceRateSet.push_back (WifiPhy::GetDsssRate2Mbps ()); | 1012 //m_deviceRateSet.push_back (WifiPhy::GetDsssRate1Mbps ()); |
960 m_deviceRateSet.push_back (WifiPhy::GetDsssRate5_5Mbps ()); | 1013 //m_deviceRateSet.push_back (WifiPhy::GetDsssRate2Mbps ()); |
| 1014 //m_deviceRateSet.push_back (WifiPhy::GetDsssRate5_5Mbps ()); |
961 m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate6Mbps ()); | 1015 m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate6Mbps ()); |
962 m_deviceRateSet.push_back (WifiPhy::GetDsssRate11Mbps ()); | 1016 m_deviceRateSet.push_back (WifiPhy::GetDsssRate11Mbps ()); |
963 m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate12Mbps ()); | 1017 m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate12Mbps ()); |
964 m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate24Mbps ()); | 1018 m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate24Mbps ()); |
965 m_bssMembershipSelectorSet.push_back(HT_PHY); | 1019 m_bssMembershipSelectorSet.push_back(HT_PHY); |
966 for (uint8_t i=0; i <8; i++) | 1020 for (uint8_t i=0; i <8; i++) |
967 { | 1021 { |
968 m_deviceMcsSet.push_back(i); | 1022 m_deviceMcsSet.push_back(i); |
969 } | 1023 } |
970 | 1024 |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1238 } | 1292 } |
1239 else | 1293 else |
1240 { | 1294 { |
1241 mode = WifiPhy::GetOfdmRate15MbpsBW40MHz (); | 1295 mode = WifiPhy::GetOfdmRate15MbpsBW40MHz (); |
1242 } | 1296 } |
1243 break; | 1297 break; |
1244 } | 1298 } |
1245 return mode; | 1299 return mode; |
1246 } | 1300 } |
1247 } // namespace ns3 | 1301 } // namespace ns3 |
OLD | NEW |