ns-3 模拟与真实和模拟节点

问题描述

我需要用 ns-3 模拟一个网络,其中既有幽灵节点(链接到 Linux 网络命名空间),也有普通节点。 This example我有用,但是当我修改 WiFi 以使用 AP(即不在 adhoc 模式下)时,Linux 网络命名空间无法再进行通信。也许我在 IP 地址或路由设置方面犯了错误

Linux 网络命名空间的设置:

# create netns
ip netns add nns1
ip netns add nns2

# enable loopback
ip netns exec nns1 ip link set dev lo up
ip netns exec nns2 ip link set dev lo up

# create veth pair
ip link add veth1b type veth peer name veth1
ip link add veth2b type veth peer name veth2

# move veth end to netns
ip link set veth1 netns nns1
ip link set veth2 netns nns2

# create tap
ip tuntap add tap1 mode tap
ip tuntap add tap2 mode tap

# bridge veth and tap
ip link add name bridge1 type bridge
ip link add name bridge2 type bridge
ip link set veth1b master bridge1
ip link set tap1 master bridge1
ip link set veth2b master bridge2
ip link set tap2 master bridge2

# assign IP addresses
ip netns exec nns1 ip address add 10.0.0.1/24 dev veth1
ip netns exec nns2 ip address add 10.0.0.2/24 dev veth2

# bring net devices up
ip link set veth1b up
ip link set veth2b up
ip netns exec nns1 ip link set veth1 up
ip netns exec nns2 ip link set veth2 up
ip link set tap1 promisc on up
ip link set tap2 promisc on up
ip link set bridge1 up
ip link set bridge2 up

# set default route
ip netns exec nns1 ip route add default via 10.0.0.1
ip netns exec nns2 ip route add default via 10.0.0.2

ns-3 代码

#include <iostream>

#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/wifi-module.h"
#include "ns3/internet-module.h"
#include "ns3/tap-bridge-module.h"
#include "ns3/mobility-module.h"

/*
 * node0 -> AP
 * node1 -> ghost node for netns "nns1"
 * node2 -> ghost node for netns "nns2"
 */

using namespace ns3;

int
main (int argc,char *argv[])
{
  GlobalValue::Bind ("SimulatorImplementationType",StringValue ("ns3::RealtimeSimulatorImpl"));
  GlobalValue::Bind ("ChecksumEnabled",BooleanValue (true));

  NodeContainer nodes;
  nodes.Create (3);

  YansWifiPhyHelper wifiPhy;
  YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
  wifiPhy.SetChannel (wifiChannel.Create ());

  Ssid ssid = Ssid ("example");
  WifiHelper wifi;
  WifiMacHelper wifiMac;
  wifi.SetRemoteStationManager ("ns3::ArfWifiManager");

  wifiMac.SetType ("ns3::ApWifiMac","Ssid",SsidValue (ssid));
  NetDeviceContainer devices = wifi.Install (wifiPhy,wifiMac,nodes.Get (0));

  wifiMac.SetType ("ns3::StaWifiMac",SsidValue (ssid),"ActiveProbing",BooleanValue (false));
  devices.Add (wifi.Install (wifiPhy,NodeContainer (nodes.Get (1),nodes.Get (2))));

  mobilityHelper mobility;
  mobility.Install (nodes);

  InternetStackHelper internet;
  internet.Install (nodes);

  Ipv4AddressHelper ipv4;
  ipv4.SetBase ("10.1.0.0","255.255.255.0");
  ipv4.Assign (devices);

  TapBridgeHelper tapBridge;
  tapBridge.SetAttribute ("Mode",StringValue ("UseLocal"));
  tapBridge.SetAttribute ("DeviceName",StringValue ("tap1"));
  tapBridge.Install (nodes.Get (1),devices.Get (1));
  tapBridge.SetAttribute ("DeviceName",StringValue ("tap2"));
  tapBridge.Install (nodes.Get (2),devices.Get (2));

  wifiPhy.EnablePcapAll ("tap-wifi-dumbbell");
  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

  Simulator::Run ();
  Simulator::Destroy ();

  return 0;
}

测试沟通:

sudo ip netns exec nns1 /bin/bash
ping 10.0.0.2   # other network namespace,not reachable

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)