bug 2259: GSL not successfully enabled for WiFi DSSS error rate model
authorTom Henderson <tomh@tomh.org>
Thu, 14 Jan 2016 14:30:52 -0800
changeset 11817 908a1df3879d
parent 11816 f53d727421ff
child 11818 1df885710050
bug 2259: GSL not successfully enabled for WiFi DSSS error rate model
RELEASE_NOTES
src/wifi/model/dsss-error-rate-model.cc
src/wifi/model/dsss-error-rate-model.h
src/wifi/test/wifi-error-rate-models-test.cc
src/wifi/wscript
--- a/RELEASE_NOTES	Thu Jan 14 14:23:17 2016 -0800
+++ b/RELEASE_NOTES	Thu Jan 14 14:30:52 2016 -0800
@@ -80,6 +80,7 @@
 - Bug 2254 - Ipv[4,6]RawSocket can return the wrong number of bytes sent.
 - Bug 2255 - Ipv6RawSocket does not call data sent callbacks.
 - Bug 2257 - Ipv[4,6]InterfaceContainer::Add are not consistent
+- Bug 2259 - GSL not successfully enabled for Wi-Fi DSSS error rate model
 
 Known issues
 ------------
--- a/src/wifi/model/dsss-error-rate-model.cc	Thu Jan 14 14:23:17 2016 -0800
+++ b/src/wifi/model/dsss-error-rate-model.cc	Thu Jan 14 14:30:52 2016 -0800
@@ -26,7 +26,7 @@
 
 NS_LOG_COMPONENT_DEFINE ("DsssErrorRateModel");
 
-#ifndef ENABLE_GSL
+#ifndef HAVE_GSL
 const double DsssErrorRateModel::WLAN_SIR_PERFECT = 10.0;
 const double DsssErrorRateModel::WLAN_SIR_IMPOSSIBLE = 0.1;
 #endif
@@ -61,7 +61,7 @@
 DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (double sinr, uint32_t nbits)
 {
   NS_LOG_FUNCTION_NOARGS ();
-#ifdef ENABLE_GSL
+#ifdef HAVE_GSL
   //symbol error probability
   double EbN0 = sinr * 22000000.0 / 1375000.0 / 4.0;
   double sep = SymbolErrorProb16Cck (4.0 * EbN0 / 2.0);
@@ -95,7 +95,8 @@
 DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (double sinr, uint32_t nbits)
 {
   NS_LOG_FUNCTION_NOARGS ();
-#ifdef ENABLE_GSL
+#ifdef HAVE_GSL
+  NS_LOG_DEBUG ("GSL enabled ");
   //symbol error probability
   double EbN0 = sinr * 22000000.0 / 1375000.0 / 8.0;
   double sep = SymbolErrorProb256Cck (8.0 * EbN0 / 2.0);
@@ -127,7 +128,7 @@
 #endif
 }
 
-#ifdef ENABLE_GSL
+#ifdef HAVE_GSL
 double
 IntegralFunction (double x, void *params)
 {
--- a/src/wifi/model/dsss-error-rate-model.h	Thu Jan 14 14:23:17 2016 -0800
+++ b/src/wifi/model/dsss-error-rate-model.h	Thu Jan 14 14:30:52 2016 -0800
@@ -22,7 +22,7 @@
 #define DSS_ERROR_RATE_MODEL_H
 
 #include <stdint.h>
-#ifdef ENABLE_GSL
+#ifdef HAVE_GSL
 #include <gsl/gsl_math.h>
 #include <gsl/gsl_integration.h>
 #include <gsl/gsl_cdf.h>
@@ -31,7 +31,7 @@
 
 namespace ns3 {
 
-#ifdef ENABLE_GSL
+#ifdef HAVE_GSL
 typedef struct FunctionParameterType
 {
   double beta;
@@ -113,7 +113,7 @@
    * \return the chunk success rate of the differential encoded QPSK for
    */
   static double GetDsssDqpskCck11SuccessRate (double sinr,uint32_t nbits);
-#ifdef ENABLE_GSL
+#ifdef HAVE_GSL
   static double SymbolErrorProb16Cck (double e2); /// equation (18) in Pursley's paper
   static double SymbolErrorProb256Cck (double e1); /// equation (17) in Pursley's paper
 #else
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/wifi/test/wifi-error-rate-models-test.cc	Thu Jan 14 14:30:52 2016 -0800
@@ -0,0 +1,296 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2016 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tom Henderson (tomhend@u.washington.edu)
+ */
+
+#include <cmath>
+#include "ns3/test.h"
+#include "ns3/dsss-error-rate-model.h"
+#include "ns3/yans-error-rate-model.h"
+#include "ns3/nist-error-rate-model.h"
+
+using namespace ns3;
+
+double
+FromRss (double rssDbw)
+{
+  // SINR is based on receiver noise figure of 7 dB and thermal noise
+  // of -100.5522786 dBm in this 22 MHz bandwidth at 290K
+  double noisePowerDbw = -100.5522786 + 7;
+
+  double sinrDb = rssDbw - noisePowerDbw;
+  // return SINR expressed as ratio
+  return pow (10.0, sinrDb / 10.0);
+}
+
+class WifiErrorRateModelsTestCaseDsss : public TestCase
+{
+public:
+  WifiErrorRateModelsTestCaseDsss ();
+  virtual ~WifiErrorRateModelsTestCaseDsss ();
+
+private:
+  virtual void DoRun (void);
+};
+
+WifiErrorRateModelsTestCaseDsss::WifiErrorRateModelsTestCaseDsss ()
+  : TestCase ("WifiErrorRateModel test case DSSS")
+{
+}
+
+WifiErrorRateModelsTestCaseDsss::~WifiErrorRateModelsTestCaseDsss ()
+{
+}
+
+void
+WifiErrorRateModelsTestCaseDsss::DoRun (void)
+{
+
+  // 1024 bytes plus headers
+  uint32_t size = (1024 + 40 + 14) * 8;
+  // Spot test some values returned from DsssErrorRateModel
+  // Values taken from sample 80211b.c program used in validation paper
+  double value;
+  // DBPSK
+  value = DsssErrorRateModel::GetDsssDbpskSuccessRate (FromRss (-105.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0, 1e-13, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDbpskSuccessRate (FromRss (-100.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 1.5e-13, 1e-13, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDbpskSuccessRate (FromRss (-99.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.0003, 0.0001, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDbpskSuccessRate (FromRss (-98.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.202, 0.005, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDbpskSuccessRate (FromRss (-97.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.813, 0.005, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDbpskSuccessRate (FromRss (-96.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.984, 0.005, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDbpskSuccessRate (FromRss (-95.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.999, 0.001, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDbpskSuccessRate (FromRss (-90.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 1, 0.001, "Not equal within tolerance");
+
+  // DQPSK
+  //
+  value = DsssErrorRateModel::GetDsssDqpskSuccessRate (FromRss (-96.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0, 1e-13, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskSuccessRate (FromRss (-95.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 4.5e-6, 1e-6, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskSuccessRate (FromRss (-94.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.036, 0.005, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskSuccessRate (FromRss (-93.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.519, 0.005, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskSuccessRate (FromRss (-92.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.915, 0.005, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskSuccessRate (FromRss (-91.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.993, 0.005, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskSuccessRate (FromRss (-90.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.999, 0.001, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskSuccessRate (FromRss (-89.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 1, 0.001, "Not equal within tolerance");
+
+#ifdef HAVE_GSL
+  // DQPSK_CCK5.5
+  value = DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (FromRss (-94.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0, 1e-13, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (FromRss (-93.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 6.6e-14, 5e-14, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (FromRss (-92.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.0001, 0.00005, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (FromRss (-91.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.132, 0.005, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (FromRss (-90.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.744, 0.005, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (FromRss (-89.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.974, 0.005, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (FromRss (-88.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.999, 0.001, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (FromRss (-87.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 1, 0.001, "Not equal within tolerance");
+
+  // DQPSK_CCK11
+  value = DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (FromRss (-91.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0, 1e-14, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (FromRss (-90.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 4.7e-14, 1e-14, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (FromRss (-89.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 8.85e-5, 1e-5, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (FromRss (-88.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.128, 0.005, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (FromRss (-87.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.739, 0.005, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (FromRss (-86.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.973, 0.005, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (FromRss (-85.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 0.999, 0.001, "Not equal within tolerance");
+  value = DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (FromRss (-84.0), size);
+  NS_TEST_ASSERT_MSG_EQ_TOL (value, 1, 0.001, "Not equal within tolerance");
+#endif
+}
+
+class WifiErrorRateModelsTestCaseNist : public TestCase
+{
+public:
+  WifiErrorRateModelsTestCaseNist ();
+  virtual ~WifiErrorRateModelsTestCaseNist ();
+
+private:
+  virtual void DoRun (void);
+};
+
+WifiErrorRateModelsTestCaseNist::WifiErrorRateModelsTestCaseNist ()
+  : TestCase ("WifiErrorRateModel test case NIST")
+{
+}
+
+WifiErrorRateModelsTestCaseNist::~WifiErrorRateModelsTestCaseNist ()
+{
+}
+
+void
+WifiErrorRateModelsTestCaseNist::DoRun (void)
+{
+
+  uint32_t FrameSize = 2000;
+  WifiTxVector txVector;
+  Ptr<NistErrorRateModel> nist = CreateObject<NistErrorRateModel> ();
+
+  double ps; // probability of success
+  double snr; // dB
+
+  // Spot test some values returned from NistErrorRateModel
+  // values can be generated by the example program ofdm-validation.cc
+  snr = 2.5;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate6Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 2.04e-10, 1e-10, "Not equal within tolerance");
+  snr = 3.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate6Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.020, 0.001, "Not equal within tolerance");
+  snr = 4.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate6Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.885, 0.001, "Not equal within tolerance");
+  snr = 5.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate6Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.997, 0.001, "Not equal within tolerance");
+
+  snr = 6.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate9Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.097, 0.001, "Not equal within tolerance");
+  snr = 7.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate9Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.918, 0.001, "Not equal within tolerance");
+  snr = 8.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate9Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.998, 0.001, "Not equal within tolerance");
+  snr = 9.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate9Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.999, 0.001, "Not equal within tolerance");
+
+  snr = 6.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate12Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.0174, 0.001, "Not equal within tolerance");
+  snr = 7.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate12Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.881, 0.001, "Not equal within tolerance");
+  snr = 8.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate12Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.997, 0.001, "Not equal within tolerance");
+  snr = 9.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate12Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.999, 0.001, "Not equal within tolerance");
+
+  snr = 8.5;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate18Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 2.85e-6, 1e-6, "Not equal within tolerance");
+  snr = 9.5;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate18Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.623, 0.001, "Not equal within tolerance");
+  snr = 10.5;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate18Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.985, 0.001, "Not equal within tolerance");
+  snr = 11.5;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate18Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.999, 0.001, "Not equal within tolerance");
+
+  snr = 12.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate24Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 2.22e-7, 1e-7, "Not equal within tolerance");
+  snr = 13.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate24Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.495, 0.001, "Not equal within tolerance");
+  snr = 14.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate24Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.974, 0.001, "Not equal within tolerance");
+  snr = 15.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate24Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.999, 0.001, "Not equal within tolerance");
+
+  snr = 15.5;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate36Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.012, 0.001, "Not equal within tolerance");
+  snr = 16.5;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate36Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.818, 0.001, "Not equal within tolerance");
+  snr = 17.5;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate36Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.993, 0.001, "Not equal within tolerance");
+  snr = 18.5;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate36Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.999, 0.001, "Not equal within tolerance");
+
+  snr = 20.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate48Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 1.3e-4, 1e-4, "Not equal within tolerance");
+  snr = 21.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate48Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.649, 0.001, "Not equal within tolerance");
+  snr = 22.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate48Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.983, 0.001, "Not equal within tolerance");
+  snr = 23.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate48Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.999, 0.001, "Not equal within tolerance");
+
+  snr = 21.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate54Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 5.44e-8, 1e-8, "Not equal within tolerance");
+  snr = 22.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate54Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.410, 0.001, "Not equal within tolerance");
+  snr = 23.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate54Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.958, 0.001, "Not equal within tolerance");
+  snr = 24.0;
+  ps = nist->GetChunkSuccessRate (WifiMode ("OfdmRate54Mbps"), txVector, std::pow (10.0, snr / 10.0), FrameSize * 8);
+  NS_TEST_ASSERT_MSG_EQ_TOL (ps, 0.999, 0.001, "Not equal within tolerance");
+}
+
+class WifiErrorRateModelsTestSuite : public TestSuite
+{
+public:
+  WifiErrorRateModelsTestSuite ();
+};
+
+WifiErrorRateModelsTestSuite::WifiErrorRateModelsTestSuite ()
+  : TestSuite ("wifi-error-rate-models", UNIT)
+{
+  AddTestCase (new WifiErrorRateModelsTestCaseDsss, TestCase::QUICK);
+  AddTestCase (new WifiErrorRateModelsTestCaseNist, TestCase::QUICK);
+}
+
+static WifiErrorRateModelsTestSuite wifiErrorRateModelsTestSuite;
+
--- a/src/wifi/wscript	Thu Jan 14 14:23:17 2016 -0800
+++ b/src/wifi/wscript	Thu Jan 14 14:30:52 2016 -0800
@@ -90,6 +90,7 @@
         'test/power-rate-adaptation-test.cc',
         'test/wifi-test.cc',
         'test/wifi-aggregation-test.cc',
+        'test/wifi-error-rate-models-test.cc',
         ]
 
     headers = bld(features='ns3header')