问题描述:

I am trying to create a network topology of n wireless networks and attach a single node to each of the wifi-ap nodes(as point to point connection) of all wireless networks.

I created an echo application to send datas between the single node(remote node) and one of the wifi nodes.

But I am getting an error as below when i try to run this code

assert failed. cond="w_lsa", file=../src/internet/model/global-route-manager-impl.cc, line=809

terminate called without an active exception

The propose topology is attached as image.topology

How to route the packets in this topology?

Here is the code.

#include "ns3/core-module.h"

#include "ns3/mobility-module.h"

#include "ns3/applications-module.h"

#include "ns3/point-to-point-module.h"

#include "ns3/wifi-module.h"

#include "ns3/network-module.h"

#include "ns3/csma-module.h"

#include "ns3/internet-module.h"

#include "ns3/bridge-helper.h"

#include "ns3/netanim-module.h"

#include <vector>

#include <stdint.h>

#include <sstream>

#include <fstream>

using namespace ns3;

int main (int argc, char *argv[])

{

uint32_t nWifis = 2;

uint32_t nStas = 2;

bool sendIp = true;

bool writeMobility = false;

CommandLine cmd;

cmd.AddValue ("nWifis", "Number of wifi networks", nWifis);

cmd.AddValue ("nStas", "Number of stations per wifi network", nStas);

cmd.AddValue ("SendIp", "Send Ipv4 or raw packets", sendIp);

cmd.AddValue ("writeMobility", "Write mobility trace", writeMobility);

cmd.Parse (argc, argv);

NodeContainer backboneNodes;

NetDeviceContainer backboneDevices;

Ipv4InterfaceContainer backboneInterfaces;

std::vector<NodeContainer> staNodes;

std::vector<NetDeviceContainer> staDevices;

std::vector<NetDeviceContainer> apDevices;

std::vector<Ipv4InterfaceContainer> staInterfaces;

std::vector<Ipv4InterfaceContainer> apInterfaces;

InternetStackHelper stack;

CsmaHelper csma;

Ipv4AddressHelper ip;

ip.SetBase ("192.168.0.0", "255.255.255.0");

backboneNodes.Create (nWifis);

stack.Install (backboneNodes);

backboneDevices = csma.Install (backboneNodes);

double wifiX = 0.0;

YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();

wifiPhy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO);

for (uint32_t i = 0; i < nWifis; ++i)

{

// calculate ssid for wifi subnetwork

std::ostringstream oss;

oss << "wifi-default-" << i;

Ssid ssid = Ssid (oss.str ());

NodeContainer remoteHost;

remoteHost.Create(1);

Ptr<Node> remote=remoteHost.Get(0);

Ptr<Node> apnode=backboneNodes.Get(i);

PointToPointHelper p2p;

p2p.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));

p2p.SetChannelAttribute ("Delay", StringValue ("2ms"));

NetDeviceContainer p2pDevices = p2p.Install(apnode,remote);

//setup remotenode

stack.Install (remoteHost);

// assign AP IP address to bridge, not wifi

//Ipv4InterfaceContainer

NodeContainer sta;

NetDeviceContainer staDev;

NetDeviceContainer apDev;

Ipv4InterfaceContainer staInterface;

Ipv4InterfaceContainer apInterface;

Ipv4InterfaceContainer remoteInterface;

MobilityHelper mobility;

BridgeHelper bridge;

WifiHelper wifi;

WifiMacHelper wifiMac;

YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();

wifiPhy.SetChannel (wifiChannel.Create ());

sta.Create (nStas);

mobility.SetPositionAllocator ("ns3::GridPositionAllocator",

"MinX", DoubleValue (wifiX),

"MinY", DoubleValue (0.0),

"DeltaX", DoubleValue (5.0),

"DeltaY", DoubleValue (5.0),

"GridWidth", UintegerValue (1),

"LayoutType", StringValue ("RowFirst"));

// setup the AP.

mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");

mobility.Install (remoteHost);

mobility.Install (backboneNodes.Get (i));

wifiMac.SetType ("ns3::ApWifiMac",

"Ssid", SsidValue (ssid));

apDev = wifi.Install (wifiPhy, wifiMac, backboneNodes.Get (i));

NetDeviceContainer bridgeDev;

bridgeDev = bridge.Install (backboneNodes.Get (i), NetDeviceContainer (apDev, backboneDevices.Get (i)));

// assign AP IP address to bridge, not wifi

apInterface = ip.Assign (bridgeDev);

remoteInterface = ip.Assign (p2pDevices);

// setup the STAs

stack.Install (sta);

mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");

mobility.Install (sta);

wifiMac.SetType ("ns3::StaWifiMac",

"Ssid", SsidValue (ssid),

"ActiveProbing", BooleanValue (false));

staDev = wifi.Install (wifiPhy, wifiMac, sta);

staInterface = ip.Assign (staDev);

//creating udp applications

UdpEchoServerHelper echoServer (9);

ApplicationContainer serverApps = echoServer.Install(remoteHost.Get(0));

serverApps.Start (Seconds (1.0));

serverApps.Stop (Seconds (10.0));

UdpEchoClientHelper echoClient (remoteInterface.GetAddress(1), 9);

echoClient.SetAttribute ("MaxPackets", UintegerValue (1));

echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));

echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

ApplicationContainer clientApps = echoClient.Install(sta.Get(0));

clientApps.Start (Seconds (2.0));

clientApps.Stop (Seconds (10.0));

// save everything in containers.

staNodes.push_back (sta);

apDevices.push_back (apDev);

apInterfaces.push_back (apInterface);

staDevices.push_back (staDev);

staInterfaces.push_back (staInterface);

wifiX += 20.0;

}

Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

/* Address dest;

std::string protocol;

if (sendIp)

{

dest = InetSocketAddress (staInterfaces[1].GetAddress (1), 1025);

protocol = "ns3::UdpSocketFactory";

}

else

{

PacketSocketAddress tmp;

tmp.SetSingleDevice (staDevices[0].Get (0)->GetIfIndex ());

tmp.SetPhysicalAddress (staDevices[1].Get (0)->GetAddress ());

tmp.SetProtocol (0x807);

dest = tmp;

protocol = "ns3::PacketSocketFactory";

}

OnOffHelper onoff = OnOffHelper (protocol, dest);

onoff.SetConstantRate (DataRate ("500kb/s"));

ApplicationContainer apps = onoff.Install (staNodes[0].Get (0));

apps.Start (Seconds (0.5));

apps.Stop (Seconds (3.0));

wifiPhy.EnablePcap ("wifi-wired-bridging", apDevices[0]);

wifiPhy.EnablePcap ("wifi-wired-bridging", apDevices[1]);*/

if (writeMobility)

{

AsciiTraceHelper ascii;

MobilityHelper::EnableAsciiAll (ascii.CreateFileStream ("wifi-wired-bridging.mob"));

}

AnimationInterface anim("edgecomp2.xml");

Simulator::Stop (Seconds (5.0));

Simulator::Run ();

Simulator::Destroy ();

}

网友答案:

I encountered this problem before but you could check this out here as follows. Global Routing problem with wifi infrastructure mode

GlobalRouting does NOT work with Wi-Fi

相关阅读:
Top