|
|
| 37 |
#include "ns3/packet-socket-server.h" |
37 |
#include "ns3/packet-socket-server.h" |
| 38 |
#include "ns3/packet-socket-client.h" |
38 |
#include "ns3/packet-socket-client.h" |
| 39 |
#include "ns3/packet-socket-helper.h" |
39 |
#include "ns3/packet-socket-helper.h" |
|
|
40 |
#include "ns3/spectrum-wifi-helper.h" |
| 41 |
#include "ns3/spectrum-value.h" |
| 42 |
#include "ns3/multi-model-spectrum-channel.h" |
| 43 |
#include "ns3/wifi-spectrum-signal-parameters.h" |
| 44 |
#include "ns3/wifi-phy-tag.h" |
| 45 |
#include <tuple> |
| 46 |
#include <vector> |
| 40 |
|
47 |
|
| 41 |
using namespace ns3; |
48 |
using namespace ns3; |
| 42 |
|
49 |
|
|
Lines 1154-1159
Bug2222TestCase::DoRun (void)
|
Link Here
|
|---|
|
| 1154 |
NS_TEST_ASSERT_MSG_EQ (m_countInternalCollisions, 1, "unexpected number of internal collisions!"); |
1161 |
NS_TEST_ASSERT_MSG_EQ (m_countInternalCollisions, 1, "unexpected number of internal collisions!"); |
| 1155 |
} |
1162 |
} |
| 1156 |
|
1163 |
|
|
|
1164 |
//----------------------------------------------------------------------------- |
| 1165 |
/** |
| 1166 |
* Make sure that the correct channel width and center frequency have been set |
| 1167 |
* for OFDM basic rate transmissions and BSS channel widths larger than 20 MHz. |
| 1168 |
* |
| 1169 |
* The scenario considers a UDP transmission between a 40 MHz 802.11ac station and a |
| 1170 |
* 40 MHz 802.11ac access point. All transmission parameters are checked so as |
| 1171 |
* to ensure that only 2 {starting frequency, channelWidth, Number of subbands |
| 1172 |
* in SpectrumModel, modulation type} tuples are used. |
| 1173 |
* |
| 1174 |
* See \bugid{2483} |
| 1175 |
*/ |
| 1176 |
|
| 1177 |
class Bug2483TestCase : public TestCase |
| 1178 |
{ |
| 1179 |
public: |
| 1180 |
Bug2483TestCase (); |
| 1181 |
virtual ~Bug2483TestCase (); |
| 1182 |
virtual void DoRun (void); |
| 1183 |
|
| 1184 |
private: |
| 1185 |
/** |
| 1186 |
* A tuple of {starting frequency, channelWidth, Number of subbands in SpectrumModel, modulation type} |
| 1187 |
*/ |
| 1188 |
typedef std::tuple<double, uint8_t, uint32_t, WifiModulationClass> FreqWidthSubbandModulationTuple; |
| 1189 |
std::vector<FreqWidthSubbandModulationTuple> m_distinctTuples; ///< vector of distinct {starting frequency, channelWidth, Number of subbands in SpectrumModel, modulation type} tuples |
| 1190 |
|
| 1191 |
/** |
| 1192 |
* Stores the distinct {starting frequency, channelWidth, Number of subbands in SpectrumModel, modulation type} tuples |
| 1193 |
* that have been used during the testcase run. |
| 1194 |
* \param txParams spectrum signal parameters set by transmitter |
| 1195 |
*/ |
| 1196 |
void StoreDistinctTuple (std::string context, Ptr<SpectrumSignalParameters> txParams); |
| 1197 |
/** |
| 1198 |
* Triggers the arrival of a burst of 1000 Byte-long packets in the source device |
| 1199 |
* \param numPackets number of packets in burst (maximum: 255) |
| 1200 |
* \param sourceDevice pointer to the source NetDevice |
| 1201 |
* \param destination address of the destination device |
| 1202 |
*/ |
| 1203 |
void SendPacketBurst (uint8_t numPackets, Ptr<NetDevice> sourceDevice, Address& destination) const; |
| 1204 |
}; |
| 1205 |
|
| 1206 |
Bug2483TestCase::Bug2483TestCase () |
| 1207 |
: TestCase ("Test case for Bug 2483") |
| 1208 |
{ |
| 1209 |
} |
| 1210 |
|
| 1211 |
Bug2483TestCase::~Bug2483TestCase () |
| 1212 |
{ |
| 1213 |
} |
| 1214 |
|
| 1215 |
void |
| 1216 |
Bug2483TestCase::StoreDistinctTuple (std::string context, Ptr<SpectrumSignalParameters> txParams) |
| 1217 |
{ |
| 1218 |
// Extract starting frequency and number of subbands |
| 1219 |
Ptr<const SpectrumModel> c = txParams->psd->GetSpectrumModel (); |
| 1220 |
uint32_t numBands = c->GetNumBands (); |
| 1221 |
double startingFreq = c->Begin ()->fl; |
| 1222 |
|
| 1223 |
// Get channel bandwidth and modulation class |
| 1224 |
Ptr<const WifiSpectrumSignalParameters> wifiTxParams = DynamicCast<WifiSpectrumSignalParameters> (txParams); |
| 1225 |
Ptr<Packet> packet = wifiTxParams->packet->Copy (); |
| 1226 |
WifiPhyTag tag; |
| 1227 |
if (!packet->RemovePacketTag (tag)) |
| 1228 |
{ |
| 1229 |
NS_FATAL_ERROR ("Received Wi-Fi Signal with no WifiPhyTag"); |
| 1230 |
return; |
| 1231 |
} |
| 1232 |
WifiTxVector txVector = tag.GetWifiTxVector (); |
| 1233 |
uint8_t channelWidth = txVector.GetChannelWidth (); |
| 1234 |
WifiModulationClass modulationClass = txVector.GetMode ().GetModulationClass (); |
| 1235 |
|
| 1236 |
// Build a tuple and check if seen before (if so store it) |
| 1237 |
FreqWidthSubbandModulationTuple tupleForCurrentTx = std::make_tuple (startingFreq, channelWidth, |
| 1238 |
numBands, modulationClass); |
| 1239 |
bool found = false; |
| 1240 |
for (std::vector<FreqWidthSubbandModulationTuple>::const_iterator it = m_distinctTuples.begin (); it != m_distinctTuples.end (); it++) |
| 1241 |
{ |
| 1242 |
if (*it == tupleForCurrentTx) |
| 1243 |
{ |
| 1244 |
found = true; |
| 1245 |
} |
| 1246 |
} |
| 1247 |
if (!found) |
| 1248 |
{ |
| 1249 |
m_distinctTuples.push_back (tupleForCurrentTx); |
| 1250 |
} |
| 1251 |
} |
| 1252 |
|
| 1253 |
void |
| 1254 |
Bug2483TestCase::SendPacketBurst (uint8_t numPackets, Ptr<NetDevice> sourceDevice, |
| 1255 |
Address& destination) const |
| 1256 |
{ |
| 1257 |
for (uint8_t i = 0; i < numPackets; i++) |
| 1258 |
{ |
| 1259 |
Ptr<Packet> pkt = Create<Packet> (1000); // 1000 dummy bytes of data |
| 1260 |
sourceDevice->Send (pkt, destination, 0); |
| 1261 |
} |
| 1262 |
} |
| 1263 |
|
| 1264 |
void |
| 1265 |
Bug2483TestCase::DoRun (void) |
| 1266 |
{ |
| 1267 |
Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("500")); // so as to force RTS/CTS for data frames |
| 1268 |
Config::SetDefault ("ns3::WifiPhy::CcaMode1Threshold", DoubleValue (-62.0)); |
| 1269 |
|
| 1270 |
NodeContainer wifiStaNode; |
| 1271 |
wifiStaNode.Create (1); |
| 1272 |
|
| 1273 |
NodeContainer wifiApNode; |
| 1274 |
wifiApNode.Create (1); |
| 1275 |
|
| 1276 |
SpectrumWifiPhyHelper spectrumPhy = SpectrumWifiPhyHelper::Default (); |
| 1277 |
Ptr<MultiModelSpectrumChannel> spectrumChannel = CreateObject<MultiModelSpectrumChannel> (); |
| 1278 |
Ptr<FriisPropagationLossModel> lossModel = CreateObject<FriisPropagationLossModel> (); |
| 1279 |
lossModel->SetFrequency (5.180e9); |
| 1280 |
spectrumChannel->AddPropagationLossModel (lossModel); |
| 1281 |
|
| 1282 |
Ptr<ConstantSpeedPropagationDelayModel> delayModel |
| 1283 |
= CreateObject<ConstantSpeedPropagationDelayModel> (); |
| 1284 |
spectrumChannel->SetPropagationDelayModel (delayModel); |
| 1285 |
|
| 1286 |
spectrumPhy.SetChannel (spectrumChannel); |
| 1287 |
spectrumPhy.SetErrorRateModel ("ns3::NistErrorRateModel"); |
| 1288 |
spectrumPhy.Set ("Frequency", UintegerValue (5180)); |
| 1289 |
spectrumPhy.Set ("ChannelWidth", UintegerValue (40)); // at least 40 MHz expected here |
| 1290 |
spectrumPhy.Set ("TxPowerStart", DoubleValue (10)); |
| 1291 |
spectrumPhy.Set ("TxPowerEnd", DoubleValue (10)); |
| 1292 |
|
| 1293 |
WifiHelper wifi; |
| 1294 |
wifi.SetStandard (WIFI_PHY_STANDARD_80211ac); |
| 1295 |
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", |
| 1296 |
"DataMode", StringValue ("VhtMcs8"), |
| 1297 |
"ControlMode", StringValue ("VhtMcs8")); |
| 1298 |
|
| 1299 |
WifiMacHelper mac; |
| 1300 |
mac.SetType ("ns3::StaWifiMac"); |
| 1301 |
NetDeviceContainer staDevice; |
| 1302 |
staDevice = wifi.Install (spectrumPhy, mac, wifiStaNode); |
| 1303 |
|
| 1304 |
mac.SetType ("ns3::ApWifiMac"); |
| 1305 |
NetDeviceContainer apDevice; |
| 1306 |
apDevice = wifi.Install (spectrumPhy, mac, wifiApNode); |
| 1307 |
|
| 1308 |
MobilityHelper mobility; |
| 1309 |
Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> (); |
| 1310 |
positionAlloc->Add (Vector (0.0, 0.0, 0.0)); |
| 1311 |
positionAlloc->Add (Vector (1.0, 0.0, 0.0)); // put close enough in order to use MCS |
| 1312 |
mobility.SetPositionAllocator (positionAlloc); |
| 1313 |
|
| 1314 |
mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel"); |
| 1315 |
mobility.Install (wifiApNode); |
| 1316 |
mobility.Install (wifiStaNode); |
| 1317 |
|
| 1318 |
// Send two 5 packet-bursts |
| 1319 |
Simulator::Schedule (Seconds (0.5), &Bug2483TestCase::SendPacketBurst, this, 5, apDevice.Get (0), staDevice.Get (0)->GetAddress ()); |
| 1320 |
Simulator::Schedule (Seconds (0.6), &Bug2483TestCase::SendPacketBurst, this, 5, apDevice.Get (0), staDevice.Get (0)->GetAddress ()); |
| 1321 |
|
| 1322 |
Config::Connect ("/ChannelList/*/$ns3::MultiModelSpectrumChannel/TxSigParams", MakeCallback (&Bug2483TestCase::StoreDistinctTuple, this)); |
| 1323 |
|
| 1324 |
Simulator::Stop (Seconds (0.8)); |
| 1325 |
Simulator::Run (); |
| 1326 |
|
| 1327 |
Simulator::Destroy (); |
| 1328 |
|
| 1329 |
// {starting frequency, channelWidth, Number of subbands in SpectrumModel, modulation type} tuples |
| 1330 |
uint8_t numberTuples = m_distinctTuples.size (); |
| 1331 |
NS_TEST_ASSERT_MSG_EQ (numberTuples, 2, "Only two distinct tuples expected"); |
| 1332 |
// Note that the first tuple should the one initiated by the beacon |
| 1333 |
NS_TEST_ASSERT_MSG_EQ (std::get<0> (m_distinctTuples[0]), std::get<0> (m_distinctTuples[1]), "Both tuples should have same starting frequency"); |
| 1334 |
NS_TEST_ASSERT_MSG_EQ (2 * std::get<1> (m_distinctTuples[0]), std::get<1> (m_distinctTuples[1]), "Second tuple's channel width should be double that of first"); |
| 1335 |
NS_TEST_ASSERT_MSG_EQ (std::get<2> (m_distinctTuples[0]), 129, "First tuple should have 129 subbands (64+DC, 20MHz+DC, inband and 32*2 out-of-band, 10MHz on each side)"); |
| 1336 |
NS_TEST_ASSERT_MSG_EQ (std::get<2> (m_distinctTuples[1]), 193, "Second tuple should have 193 subbands (128+DC, 40MHz+DC, inband and 32*2 out-of-band, 10MHz on each side)"); |
| 1337 |
NS_TEST_ASSERT_MSG_EQ (std::get<3> (m_distinctTuples[0]), WifiModulationClass::WIFI_MOD_CLASS_OFDM, "First tuple should be OFDM"); |
| 1338 |
NS_TEST_ASSERT_MSG_EQ (std::get<3> (m_distinctTuples[1]), WifiModulationClass::WIFI_MOD_CLASS_VHT, "Second tuple should be VHT_OFDM"); |
| 1339 |
} |
| 1340 |
|
| 1157 |
/** |
1341 |
/** |
| 1158 |
* \ingroup wifi-test |
1342 |
* \ingroup wifi-test |
| 1159 |
* \ingroup tests |
1343 |
* \ingroup tests |
|
Lines 1176-1181
WifiTestSuite::WifiTestSuite ()
|
Link Here
|
|---|
|
| 1176 |
AddTestCase (new Bug730TestCase, TestCase::QUICK); //Bug 730 |
1360 |
AddTestCase (new Bug730TestCase, TestCase::QUICK); //Bug 730 |
| 1177 |
AddTestCase (new SetChannelFrequencyTest, TestCase::QUICK); |
1361 |
AddTestCase (new SetChannelFrequencyTest, TestCase::QUICK); |
| 1178 |
AddTestCase (new Bug2222TestCase, TestCase::QUICK); //Bug 2222 |
1362 |
AddTestCase (new Bug2222TestCase, TestCase::QUICK); //Bug 2222 |
|
|
1363 |
AddTestCase (new Bug2483TestCase, TestCase::QUICK); //Bug 2483 |
| 1179 |
} |
1364 |
} |
| 1180 |
|
1365 |
|
| 1181 |
static WifiTestSuite g_wifiTestSuite; ///< the test suite |
1366 |
static WifiTestSuite g_wifiTestSuite; ///< the test suite |