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