View | Details | Raw Unified | Return to bug 2511
Collapse All | Expand All

(-)a/src/wifi/model/ap-wifi-mac.cc (+14 lines)
 Lines 239-244    Link Here 
239
  return false;
239
  return false;
240
}
240
}
241
241
242
bool
243
ApWifiMac::IsNonGfHtStasPresent (void) const
244
{
245
  for (std::list<Mac48Address>::const_iterator i = m_staList.begin (); i != m_staList.end (); i++)
246
  {
247
    if (m_stationManager->GetGreenfieldSupported (*i) == false)
248
      {
249
        return true;
250
      }
251
  }
252
  return false;
253
}
254
242
void
255
void
243
ApWifiMac::ForwardDown (Ptr<const Packet> packet, Mac48Address from,
256
ApWifiMac::ForwardDown (Ptr<const Packet> packet, Mac48Address from,
244
                        Mac48Address to)
257
                        Mac48Address to)
 Lines 486-491    Link Here 
486
      if (!m_nonHtStations.empty ())
499
      if (!m_nonHtStations.empty ())
487
        {
500
        {
488
          operations.SetHtProtection (MIXED_MODE_PROTECTION);
501
          operations.SetHtProtection (MIXED_MODE_PROTECTION);
502
          operations.SetNonGfHtStasPresent (IsNonGfHtStasPresent ());
489
        }
503
        }
490
      else
504
      else
491
        {
505
        {
(-)a/src/wifi/model/ap-wifi-mac.h (+5 lines)
 Lines 116-121    Link Here 
116
   * stations support short PLCP preamble.
116
   * stations support short PLCP preamble.
117
   */
117
   */
118
  bool GetShortPreambleEnabled (void) const;
118
  bool GetShortPreambleEnabled (void) const;
119
  /**
120
   * Determine whether non-Greenfield HT stations are present or not.
121
   */
122
  bool IsNonGfHtStasPresent (void) const;
123
119
124
120
  /**
125
  /**
121
   * Assign a fixed random variable stream number to the random variables
126
   * Assign a fixed random variable stream number to the random variables
(-)a/src/wifi/model/interference-helper.cc (-5 / +5 lines)
 Lines 349-355    Link Here 
349
  WifiMode payloadMode = event->GetPayloadMode ();
349
  WifiMode payloadMode = event->GetPayloadMode ();
350
  WifiPreamble preamble = event->GetPreambleType ();
350
  WifiPreamble preamble = event->GetPreambleType ();
351
  WifiMode htHeaderMode;
351
  WifiMode htHeaderMode;
352
  if (preamble == WIFI_PREAMBLE_HT_MF)
352
  if (preamble == WIFI_PREAMBLE_HT_MF || preamble == WIFI_PREAMBLE_HT_GF)
353
    {
353
    {
354
      //mode for PLCP header fields sent with HT modulation
354
      //mode for PLCP header fields sent with HT modulation
355
      htHeaderMode = WifiPhy::GetHtPlcpHeaderMode (payloadMode);
355
      htHeaderMode = WifiPhy::GetHtPlcpHeaderMode (payloadMode);
 Lines 430-436    Link Here 
430
430
431
                  NS_LOG_DEBUG ("Case 3ai - previous is in VHT-SIG-A and current after payload start: VHT mode=" << htHeaderMode << ", non-VHT mode=" << headerMode << ", psr=" << psr);
431
                  NS_LOG_DEBUG ("Case 3ai - previous is in VHT-SIG-A and current after payload start: VHT mode=" << htHeaderMode << ", non-VHT mode=" << headerMode << ", psr=" << psr);
432
                }
432
                }
433
              //Case 3aii: HT mixed format of HT greenfield
433
              //Case 3aii: HT mixed format or HT greenfield
434
              else
434
              else
435
                {
435
                {
436
                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
436
                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
 Lines 463-469    Link Here 
463
463
464
                  NS_LOG_DEBUG ("Case 3bi - previous is in VHT-SIG-A and current is in VHT training or in VHT-SIG-B: VHT mode=" << htHeaderMode << ", non-VHT mode=" << headerMode << ", psr=" << psr);
464
                  NS_LOG_DEBUG ("Case 3bi - previous is in VHT-SIG-A and current is in VHT training or in VHT-SIG-B: VHT mode=" << htHeaderMode << ", non-VHT mode=" << headerMode << ", psr=" << psr);
465
                }
465
                }
466
              //Case 3bii: HT mixed format of HT greenfield
466
              //Case 3bii: HT mixed format or HT greenfield
467
              else
467
              else
468
                {
468
                {
469
                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
469
                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
 Lines 490-496    Link Here 
490
490
491
                  NS_LOG_DEBUG ("Case 3ci - previous with current in VHT-SIG-A: VHT mode=" << htHeaderMode << ", non-VHT mode=" << headerMode << ", psr=" << psr);
491
                  NS_LOG_DEBUG ("Case 3ci - previous with current in VHT-SIG-A: VHT mode=" << htHeaderMode << ", non-VHT mode=" << headerMode << ", psr=" << psr);
492
                }
492
                }
493
              //Case 3bii: HT mixed format of HT greenfield
493
              //Case 3bii: HT mixed format or HT greenfield
494
              else
494
              else
495
                {
495
                {
496
                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
496
                  psr *= CalculateChunkSuccessRate (CalculateSnr (powerW,
 Lines 692-698    Link Here 
692
                                                    plcpHsigHeaderStart - plcpHeaderStart, //HT GF: plcpHsigHeaderStart - plcpHeaderStart = 0
692
                                                    plcpHsigHeaderStart - plcpHeaderStart, //HT GF: plcpHsigHeaderStart - plcpHeaderStart = 0
693
                                                    headerMode, event->GetTxVector ());
693
                                                    headerMode, event->GetTxVector ());
694
694
695
                  NS_LOG_DEBUG ("Case 4a - previous is in the preamble and current is after payload start: HT mode=" << htHeaderMode << ", non-HT mode=" << headerMode << ", psr=" << psr);
695
                  NS_LOG_DEBUG ("Case 5aiii - previous is in the preamble and current is after payload start: HT mode=" << htHeaderMode << ", non-HT mode=" << headerMode << ", psr=" << psr);
696
                }
696
                }
697
            }
697
            }
698
          //Case 5b: current is in (V)HT training or in VHT-SIG-B. Non (V)HT will not come here since it went in previous if or if the previous if is not true this will be not true
698
          //Case 5b: current is in (V)HT training or in VHT-SIG-B. Non (V)HT will not come here since it went in previous if or if the previous if is not true this will be not true
(-)a/src/wifi/model/mac-low.cc (-20 / +8 lines)
 Lines 1424-1436    Link Here 
1424
  if (params.MustSendRts ())
1424
  if (params.MustSendRts ())
1425
    {
1425
    {
1426
      WifiTxVector rtsTxVector = GetRtsTxVector (packet, hdr);
1426
      WifiTxVector rtsTxVector = GetRtsTxVector (packet, hdr);
1427
      //standard says RTS packets can have GF format sec 9.6.0e.1 page 110 bullet b 2
1427
      if (m_stationManager->GetShortPreambleEnabled ())
1428
      if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
1429
        {
1430
          preamble = WIFI_PREAMBLE_HT_GF;
1431
        }
1432
      //Otherwise, RTS should always use non-HT PPDU (HT PPDU cases not supported yet)
1433
      else if (m_stationManager->GetShortPreambleEnabled ())
1434
        {
1428
        {
1435
          preamble = WIFI_PREAMBLE_SHORT;
1429
          preamble = WIFI_PREAMBLE_SHORT;
1436
        }
1430
        }
 Lines 1447-1453    Link Here 
1447
    {
1441
    {
1448
      preamble = WIFI_PREAMBLE_VHT;
1442
      preamble = WIFI_PREAMBLE_VHT;
1449
    }
1443
    }
1450
  else if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
1444
  else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT && m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
1451
    {
1445
    {
1452
      preamble = WIFI_PREAMBLE_HT_GF;
1446
      preamble = WIFI_PREAMBLE_HT_GF;
1453
    }
1447
    }
 Lines 1487-1493    Link Here 
1487
        {
1481
        {
1488
          preamble = WIFI_PREAMBLE_VHT;
1482
          preamble = WIFI_PREAMBLE_VHT;
1489
        }
1483
        }
1490
      if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
1484
      if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT && m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
1491
        {
1485
        {
1492
          preamble = WIFI_PREAMBLE_HT_GF;
1486
          preamble = WIFI_PREAMBLE_HT_GF;
1493
        }
1487
        }
 Lines 1842-1854    Link Here 
1842
  Time duration = Seconds (0);
1836
  Time duration = Seconds (0);
1843
1837
1844
  WifiPreamble preamble;
1838
  WifiPreamble preamble;
1845
  //standard says RTS packets can have GF format sec 9.6.0e.1 page 110 bullet b 2
1839
  if (m_stationManager->GetShortPreambleEnabled ())
1846
  if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
1847
    {
1848
      preamble = WIFI_PREAMBLE_HT_GF;
1849
    }
1850
  //Otherwise, RTS should always use non-HT PPDU (HT PPDU cases not supported yet)
1851
  else if (m_stationManager->GetShortPreambleEnabled ())
1852
    {
1840
    {
1853
      preamble = WIFI_PREAMBLE_SHORT;
1841
      preamble = WIFI_PREAMBLE_SHORT;
1854
    }
1842
    }
 Lines 1921-1927    Link Here 
1921
      preamble = WIFI_PREAMBLE_VHT;
1909
      preamble = WIFI_PREAMBLE_VHT;
1922
    }
1910
    }
1923
  //Since it is data then it can have format = GF
1911
  //Since it is data then it can have format = GF
1924
  else if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
1912
  else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT && m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
1925
    {
1913
    {
1926
      preamble = WIFI_PREAMBLE_HT_GF;
1914
      preamble = WIFI_PREAMBLE_HT_GF;
1927
    }
1915
    }
 Lines 2007-2013    Link Here 
2007
    {
1995
    {
2008
      preamble = WIFI_PREAMBLE_VHT;
1996
      preamble = WIFI_PREAMBLE_VHT;
2009
    }
1997
    }
2010
  else if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
1998
  else if (m_currentTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT && m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
2011
    {
1999
    {
2012
      //In the future has to make sure that receiver has greenfield enabled
2000
      //In the future has to make sure that receiver has greenfield enabled
2013
      preamble = WIFI_PREAMBLE_HT_GF;
2001
      preamble = WIFI_PREAMBLE_HT_GF;
 Lines 2254-2260    Link Here 
2254
    {
2242
    {
2255
      preamble = WIFI_PREAMBLE_VHT;
2243
      preamble = WIFI_PREAMBLE_VHT;
2256
    }
2244
    }
2257
  else if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
2245
  else if (m_currentTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT && m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
2258
    {
2246
    {
2259
      //In the future has to make sure that receiver has greenfield enabled
2247
      //In the future has to make sure that receiver has greenfield enabled
2260
      preamble = WIFI_PREAMBLE_HT_GF;
2248
      preamble = WIFI_PREAMBLE_HT_GF;
 Lines 2925-2931    Link Here 
2925
      preamble = WIFI_PREAMBLE_VHT;
2913
      preamble = WIFI_PREAMBLE_VHT;
2926
      aPPDUMaxTime = MicroSeconds (5484);
2914
      aPPDUMaxTime = MicroSeconds (5484);
2927
    }
2915
    }
2928
  else if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
2916
  else if (m_currentTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT && m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
2929
    {
2917
    {
2930
      preamble = WIFI_PREAMBLE_HT_GF;
2918
      preamble = WIFI_PREAMBLE_HT_GF;
2931
    }
2919
    }

Return to bug 2511