|
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 |