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