zoukankan      html  css  js  c++  java
  • (OK)(OK) houshoul experiment


    hsl_experiment.txt

    #--------------------------------
    # 3 files
    #--------------------------------
    
    /root/hsl-win7-ns3-root.sh
    /root/hsl_install_6_docker-centos-quagga.sh
    /opt/share-vm/fedora23server-share/seem-6-win7-switch-docker.cc
    
    /opt/tools/network_simulators/ns3/ns-allinone-3.25/ns-3.25/scratch/seem-6-win7-switch-docker.cc
    
    /home/hsl/hsl-win7-ns3-user.sh
    
    #--------------------------------
    # root
    #--------------------------------
    
    # step 1
    # executed by root, create br_w_[1~6], tap_w_[1~6]
    
    /root/hsl-win7-ns3-root.sh 6 create
    /root/hsl-win7-ns3-root.sh 6 destroy
    
    # step 2
    # executed by root, create 6 routers, create br_r_[1~6] , tap_r_ , veth_r_ , deth_
    /root/hsl_install_6_docker-centos-quagga.sh create
    /root/hsl_install_6_docker-centos-quagga.sh destroy
    
    # start NS3
    // [root@localhost ns-3.25]# ./waf --run scratch/seem-6-win7-switch-docker --vis
    
    #--------------------------------
    # hsl
    #--------------------------------
    
    systemctl start vncserver@:1
    vncviewer 10.109.253.80:1
    
    # step 2
    cd /home/hsl
    ./waf-user scratch/seem-6-win7-switch-docker
    
    # step 3
    cd /home/hsl
    ./hsl-win7-ns3-user.sh 6 create
    ./hsl-win7-ns3-user.sh 6 destroy
    
    
    
    
    
    
    
    #--------------------------------
    # routers
    #--------------------------------
    
    # docker_1
    ip route add 10.0.1.0/24 dev eth0
    ip route add 10.0.2.0/24 dev eth0
    ip route add 10.0.3.0/24 dev eth1
    ip route add 10.0.4.0/24 dev eth1
    ip route add 10.1.2.0/24 dev eth1
    
    # docker_2
    ip route add 10.0.1.0/24 dev eth0
    ip route add 10.0.2.0/24 dev eth0
    ip route add 10.0.3.0/24 dev eth1
    ip route add 10.0.4.0/24 dev eth1
    ip route add 10.1.1.0/24 dev eth0
    
    # docker_3
    ip route add 10.0.2.0/24 dev eth0
    ip route add 10.0.3.0/24 dev eth0
    ip route add 10.0.4.0/24 dev eth0
    ip route add 10.1.2.0/24 dev eth0
    ip route add 192.168.1.0/24 dev eth0
    
    # docker_4
    ip route add 10.0.1.0/24 dev eth0
    ip route add 10.0.3.0/24 dev eth0
    ip route add 10.0.4.0/24 dev eth0
    ip route add 10.1.2.0/24 dev eth0
    ip route add 192.168.1.0/24 dev eth0
    
    # docker_5
    ip route add 10.0.1.0/24 dev eth0
    ip route add 10.0.2.0/24 dev eth0
    ip route add 10.0.4.0/24 dev eth0
    ip route add 10.1.1.0/24 dev eth0
    ip route add 192.168.1.0/24 dev eth0
    
    # docker_6
    ip route add 10.0.1.0/24 dev eth0
    ip route add 10.0.2.0/24 dev eth0
    ip route add 10.0.3.0/24 dev eth0
    ip route add 10.1.1.0/24 dev eth0
    ip route add 192.168.1.0/24 dev eth0
    
    #--------------------------------

    hsl_install_6_docker-centos-quagga.sh

    #------------------------------------------------------------------------------------------
    # This tool (hsl_install_6_docker-centos-quagga.sh) is released under GNU GPL v2,v3
    # Author: Tongguang Zhang
    # Date: 2016-08-10
    # first: install_docker-centos-quagga.txt
    #------------------------------------------------------------------------------------------
    
    #!/bin/sh
    
    create_docker(){	
    
    	# $1, that is, docker_node_num
    	# $2, that is, docker_image
    
    	# You will also have to make sure that your kernel has ethernet filtering (ebtables, bridge-nf,
    	# arptables) disabled. If you do not do this, only STP and ARP traffic will be allowed to 
    	# flow across your bridge and your whole scenario will not work.
    	# if directory "/proc/sys/net/bridge" missing, I execute "modprobe br_netfilter" to get this directory again.
    
    	if [ ! -d /proc/sys/net/bridge ]; then
    		modprobe br_netfilter
    	fi
    
    	cd /proc/sys/net/bridge
    	for f in bridge-nf-*; do echo 0 > $f; done
    	cd -
    
    	# [root@localhost ~]# man ip-netns
    	# By convention a named network namespace is an object at /var/run/netns/NAME that can be opened.
    	# The file descriptor resulting from opening /var/run/netns/NAME refers to the specified network
    	# namespace. Holding that file descriptor open keeps the network namespace alive.
    	# The file descriptor can be used with the setns(2) system
    	# call to change the network namespace associated with a task.
    
    	rm /var/run/netns -rf &>/dev/null
    	mkdir -p /var/run/netns &>/dev/null
    
    	# $1, that is, docker_node_num
    	# $2, that is, docker_image
    	#vm_image="$2"
    	vm_image="centos_quagga"
    	vmimage="centos:centos_quagga"
    
    	for((id=1; id<=$1; id++))
    	do
    
    		# to determine whether docker_image exists
    		exists=`docker images | awk -F " '{print $1}' | grep ${vm_image} | wc -l | cat`
    		if [ $exists -eq 0 ]; then
    			echo "${vm_image} does not exist"
    			exit
    		fi
    
    		# docker run -it --rm --net='none' --name "docker_${id}" centos-manet /bin/sh
    		# gnome-terminal -x bash -c "docker run -it --rm --net='none' --name "docker_${id}" centos-manet /bin/sh"
    		# gnome-terminal -x bash -c "docker run -it --rm --net='none' --name "docker_${id}" $2 /bin/sh"
    
    		#gnome-terminal -x bash -c "docker run -it --rm --net='none' --name "docker_${id}" $2"
    		# kernel network capabilities are not enabled by default.
    		# You are going to need to run your container with --privileged
    	#gnome-terminal -x bash -c "docker run --privileged -it -d --net='none' --name "docker_${id}" ${vm_image}"
    		bash -c "docker run --privileged -it -d --net='none' --name "docker_${id}" ${vmimage}" &
    		sleep 2
    
    		# SET VARIABLES
    
    		# get PID of CONTAINER
    		pid=$(docker inspect -f '{{.State.Pid}}' "docker_${id}")
    
    		bridge="br_r_${id}"
    		brctl addbr ${bridge}
    
    		#-----------------------------------------------------
    		# router eth0
    		#-----------------------------------------------------
    		#bridge="br_r_${id}1"
    		tap="tap_r_${id}1"
    		veth="veth_r_${id}1"
    		deth="deth_${id}1"
    
    		#brctl addbr ${bridge}
    
    		ip link add ${veth} type veth peer name ${deth}
    		brctl addif ${bridge} ${veth}
    		ip link set ${veth} up
    		# ifconfig ${veth} 0.0.0.0 promisc up
    
    		ip link set ${deth} netns ${pid}
    
    		tunctl -t ${tap}
    		ifconfig ${tap} up
    		# ifconfig ${tap} promisc up
    		# ifconfig ${tap} 0.0.0.0 promisc up
    
    		brctl addif ${bridge} ${tap}
    		ifconfig ${bridge} up
    		# ifconfig ${bridge} promisc up
    		# ifconfig ${bridge} 0.0.0.0 promisc up
    		#-----------------------------------------------------
    
    		#-----------------------------------------------------
    		# router eth1
    		#-----------------------------------------------------
    		#bridge="br_r_${id}2"
    		tap="tap_r_${id}2"
    		veth="veth_r_${id}2"
    		deth="deth_${id}2"
    
    		#brctl addbr ${bridge}
    
    		ip link add ${veth} type veth peer name ${deth}
    		brctl addif ${bridge} ${veth}
    		ip link set ${veth} up
    		# ifconfig ${veth} 0.0.0.0 promisc up
    
    		ip link set ${deth} netns ${pid}
    
    		tunctl -t ${tap}
    		ifconfig ${tap} up
    		# ifconfig ${tap} promisc up
    		# ifconfig ${tap} 0.0.0.0 promisc up
    
    		brctl addif ${bridge} ${tap}
    		ifconfig ${bridge} up
    		# ifconfig ${bridge} promisc up
    		# ifconfig ${bridge} 0.0.0.0 promisc up
    		#-----------------------------------------------------
    
    		ln -s /proc/${pid}/ns/net /var/run/netns/${pid}
    
    		#-----------------------------------------------------
    		# docker-1
    		#-----------------------------------------------------
    		if [ ${id} -eq 1 ]; then
    			#-----------------------------------------------------
    			# eth0
    			#-----------------------------------------------------
    			eth="eth0"
    			ip="10.1.1.254"
    			deth="deth_${id}1"
    			ip netns exec ${pid} ip link set dev ${deth} name ${eth}
    			ip netns exec ${pid} ip link set ${eth} up
    			# ip netns exec ${pid} ip addr add 192.168.26.${id}/24 dev ${eth}
    			ip netns exec ${pid} ip addr add ${ip}/24 dev ${eth}
    
    			#-----------------------------------------------------
    			# eth1
    			#-----------------------------------------------------
    			eth="eth1"
    			ip="192.168.1.254"
    			deth="deth_${id}2"
    			ip netns exec ${pid} ip link set dev ${deth} name ${eth}
    			ip netns exec ${pid} ip link set ${eth} up
    			# ip netns exec ${pid} ip addr add 192.168.26.${id}/24 dev ${eth}
    			ip netns exec ${pid} ip addr add ${ip}/24 dev ${eth}
    
    			ip netns exec ${pid} ip route add 10.0.1.0/24 dev eth0
    			ip netns exec ${pid} ip route add 10.0.2.0/24 dev eth0
    			ip netns exec ${pid} ip route add 10.0.3.0/24 dev eth1
    			ip netns exec ${pid} ip route add 10.0.4.0/24 dev eth1
    			ip netns exec ${pid} ip route add 10.1.2.0/24 dev eth1
    		fi
    
    		#-----------------------------------------------------
    		# docker-2
    		#-----------------------------------------------------
    		if [ ${id} -eq 2 ]; then
    			#-----------------------------------------------------
    			# eth0
    			#-----------------------------------------------------
    			eth="eth0"
    			ip="192.168.1.253"
    			deth="deth_${id}1"
    			ip netns exec ${pid} ip link set dev ${deth} name ${eth}
    			ip netns exec ${pid} ip link set ${eth} up
    			# ip netns exec ${pid} ip addr add 192.168.26.${id}/24 dev ${eth}
    			ip netns exec ${pid} ip addr add ${ip}/24 dev ${eth}
    
    			#-----------------------------------------------------
    			# eth1
    			#-----------------------------------------------------
    			eth="eth1"
    			ip="10.1.2.254"
    			deth="deth_${id}2"
    			ip netns exec ${pid} ip link set dev ${deth} name ${eth}
    			ip netns exec ${pid} ip link set ${eth} up
    			# ip netns exec ${pid} ip addr add 192.168.26.${id}/24 dev ${eth}
    			ip netns exec ${pid} ip addr add ${ip}/24 dev ${eth}
    
    			ip netns exec ${pid} ip route add 10.0.1.0/24 dev eth0
    			ip netns exec ${pid} ip route add 10.0.2.0/24 dev eth0
    			ip netns exec ${pid} ip route add 10.0.3.0/24 dev eth1
    			ip netns exec ${pid} ip route add 10.0.4.0/24 dev eth1
    			ip netns exec ${pid} ip route add 10.1.1.0/24 dev eth0
    		fi
    
    		#-----------------------------------------------------
    		# docker-3
    		#-----------------------------------------------------
    		if [ ${id} -eq 3 ]; then
    			#-----------------------------------------------------
    			# eth0
    			#-----------------------------------------------------
    			eth="eth0"
    			ip="10.1.1.253"
    			deth="deth_${id}1"
    			ip netns exec ${pid} ip link set dev ${deth} name ${eth}
    			ip netns exec ${pid} ip link set ${eth} up
    			# ip netns exec ${pid} ip addr add 192.168.26.${id}/24 dev ${eth}
    			ip netns exec ${pid} ip addr add ${ip}/24 dev ${eth}
    
    			#-----------------------------------------------------
    			# eth1
    			#-----------------------------------------------------
    			eth="eth1"
    			ip="10.0.1.254"
    			deth="deth_${id}2"
    			ip netns exec ${pid} ip link set dev ${deth} name ${eth}
    			ip netns exec ${pid} ip link set ${eth} up
    			# ip netns exec ${pid} ip addr add 192.168.26.${id}/24 dev ${eth}
    			ip netns exec ${pid} ip addr add ${ip}/24 dev ${eth}
    
    			ip netns exec ${pid} ip route add 10.0.2.0/24 dev eth0
    			ip netns exec ${pid} ip route add 10.0.3.0/24 dev eth0
    			ip netns exec ${pid} ip route add 10.0.4.0/24 dev eth0
    			ip netns exec ${pid} ip route add 10.1.2.0/24 dev eth0
    			ip netns exec ${pid} ip route add 192.168.1.0/24 dev eth0
    		fi
    
    		#-----------------------------------------------------
    		# docker-4
    		#-----------------------------------------------------
    		if [ ${id} -eq 4 ]; then
    			#-----------------------------------------------------
    			# eth0
    			#-----------------------------------------------------
    			eth="eth0"
    			ip="10.1.1.252"
    			deth="deth_${id}1"
    			ip netns exec ${pid} ip link set dev ${deth} name ${eth}
    			ip netns exec ${pid} ip link set ${eth} up
    			# ip netns exec ${pid} ip addr add 192.168.26.${id}/24 dev ${eth}
    			ip netns exec ${pid} ip addr add ${ip}/24 dev ${eth}
    
    			#-----------------------------------------------------
    			# eth1
    			#-----------------------------------------------------
    			eth="eth1"
    			ip="10.0.2.254"
    			deth="deth_${id}2"
    			ip netns exec ${pid} ip link set dev ${deth} name ${eth}
    			ip netns exec ${pid} ip link set ${eth} up
    			# ip netns exec ${pid} ip addr add 192.168.26.${id}/24 dev ${eth}
    			ip netns exec ${pid} ip addr add ${ip}/24 dev ${eth}
    
    			ip netns exec ${pid} ip route add 10.0.1.0/24 dev eth0
    			ip netns exec ${pid} ip route add 10.0.3.0/24 dev eth0
    			ip netns exec ${pid} ip route add 10.0.4.0/24 dev eth0
    			ip netns exec ${pid} ip route add 10.1.2.0/24 dev eth0
    			ip netns exec ${pid} ip route add 192.168.1.0/24 dev eth0
    		fi
    
    		#-----------------------------------------------------
    		# docker-5
    		#-----------------------------------------------------
    		if [ ${id} -eq 5 ]; then
    			#-----------------------------------------------------
    			# eth0
    			#-----------------------------------------------------
    			eth="eth0"
    			ip="10.1.2.253"
    			deth="deth_${id}1"
    			ip netns exec ${pid} ip link set dev ${deth} name ${eth}
    			ip netns exec ${pid} ip link set ${eth} up
    			# ip netns exec ${pid} ip addr add 192.168.26.${id}/24 dev ${eth}
    			ip netns exec ${pid} ip addr add ${ip}/24 dev ${eth}
    
    			#-----------------------------------------------------
    			# eth1
    			#-----------------------------------------------------
    			eth="eth1"
    			ip="10.0.3.254"
    			deth="deth_${id}2"
    			ip netns exec ${pid} ip link set dev ${deth} name ${eth}
    			ip netns exec ${pid} ip link set ${eth} up
    			# ip netns exec ${pid} ip addr add 192.168.26.${id}/24 dev ${eth}
    			ip netns exec ${pid} ip addr add ${ip}/24 dev ${eth}
    
    			ip netns exec ${pid} ip route add 10.0.1.0/24 dev eth0
    			ip netns exec ${pid} ip route add 10.0.2.0/24 dev eth0
    			ip netns exec ${pid} ip route add 10.0.4.0/24 dev eth0
    			ip netns exec ${pid} ip route add 10.1.1.0/24 dev eth0
    			ip netns exec ${pid} ip route add 192.168.1.0/24 dev eth0
    		fi
    
    		#-----------------------------------------------------
    		# docker-6
    		#-----------------------------------------------------
    		if [ ${id} -eq 6 ]; then
    			#-----------------------------------------------------
    			# eth0
    			#-----------------------------------------------------
    			eth="eth0"
    			ip="10.1.2.252"
    			deth="deth_${id}1"
    			ip netns exec ${pid} ip link set dev ${deth} name ${eth}
    			ip netns exec ${pid} ip link set ${eth} up
    			# ip netns exec ${pid} ip addr add 192.168.26.${id}/24 dev ${eth}
    			ip netns exec ${pid} ip addr add ${ip}/24 dev ${eth}
    
    			#-----------------------------------------------------
    			# eth1
    			#-----------------------------------------------------
    			eth="eth1"
    			ip="10.0.4.254"
    			deth="deth_${id}2"
    			ip netns exec ${pid} ip link set dev ${deth} name ${eth}
    			ip netns exec ${pid} ip link set ${eth} up
    			# ip netns exec ${pid} ip addr add 192.168.26.${id}/24 dev ${eth}
    			ip netns exec ${pid} ip addr add ${ip}/24 dev ${eth}
    
    			ip netns exec ${pid} ip route add 10.0.1.0/24 dev eth0
    			ip netns exec ${pid} ip route add 10.0.2.0/24 dev eth0
    			ip netns exec ${pid} ip route add 10.0.3.0/24 dev eth0
    			ip netns exec ${pid} ip route add 10.1.1.0/24 dev eth0
    			ip netns exec ${pid} ip route add 192.168.1.0/24 dev eth0
    		fi
    
    		#-----------------------------------------------------
    		# quagga, // not use quagga, setup routing table manually
    		#-----------------------------------------------------
    #		docker exec docker_${id} /bin/sh -c "sed -i '24a  router-id 10.1.1.${id}' /etc/quagga/ospf6d.conf"
    #		docker exec docker_${id} /bin/sh -c "zebra -d &>/dev/null"
    #		docker exec docker_${id} /bin/sh -c "ospf6d -d &>/dev/null"
    
    	done
    }
    
    #------------------------------------------------------------------------------------------
    # function destroy_docker()
    # Description:
    # destroy $docker_node_num of dockers
    # receive one parameter, that is docker_node_num
    #------------------------------------------------------------------------------------------
    
    destroy_docker(){
    
    	# $1, that is, $docker_node_num
    	for((id=1; id<=$1; id++))
    	do
    		bridge="br_r_${id}"
    
    		#-----------------------------------------------------
    		# router eth0
    		#-----------------------------------------------------
    		#bridge="br_r_${id}1"
    		tap="tap_r_${id}1"
    		veth="veth_r_${id}1"
    
    		ifconfig ${bridge} down &>/dev/null
    		brctl delif ${bridge} ${tap} &>/dev/null
    		#brctl delbr ${bridge} &>/dev/null
    
    		ifconfig ${tap} down &>/dev/null
    		tunctl -d ${tap} &>/dev/null
    		ifconfig ${veth} down &>/dev/null
    		#-----------------------------------------------------
    
    		#-----------------------------------------------------
    		# router eth1
    		#-----------------------------------------------------
    		#bridge="br_r_${id}2"
    		tap="tap_r_${id}2"
    		veth="veth_r_${id}2"
    
    		#ifconfig ${bridge} down &>/dev/null
    		brctl delif ${bridge} ${tap} &>/dev/null
    		brctl delbr ${bridge} &>/dev/null
    
    		ifconfig ${tap} down &>/dev/null
    		tunctl -d ${tap} &>/dev/null
    		ifconfig ${veth} down &>/dev/null
    		#-----------------------------------------------------
    
    		docker stop "docker_${id}" &>/dev/null
    		docker rm "docker_${id}" &>/dev/null
    	done
    }
    
    # ./hsl_install_6_docker-centos-quagga.sh para1
    # para1 ($1), that is, the value is create or destroy
    
    if [ $# -eq 1 ]; then
    
    	if !([ $1 == "create" ]||[ $1 == "destroy" ]); then
    		echo "usage: ./hsl_install_6_docker-centos-quagga.sh para1"
    		exit
    	fi
    
    	case $1 in
    		create)
    			create_docker 6
    		;;
    		destroy)
    			destroy_docker 6
    		;;
    	esac
    else
    	echo "usage: ./hsl_install_6_docker-centos-quagga.sh create"
    	echo "usage: ./hsl_install_6_docker-centos-quagga.sh destroy"
    fi
    
    #-------------------------------------------------
    # docker run --privileged -it -d --name "docker_1" centos-manet
    # docker ps -a
    # docker attach docker_1
    # docker stop docker_1
    # docker rm docker_1
    #-------------------------------------------------
    

    /opt/tools/network_simulators/ns3/ns-allinone-3.25/ns-3.25/scratch/seem-6-win7-switch-docker.cc

    /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
    /*
     * Copyright (c) 2015 - Chip Webb
     *
     * This program is free software; you can redistribute it and/or modify
     * it under the terms of the GNU General Public License version 2 as
     * published by the Free Software Foundation;
     *
     * This program is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU General Public License for more details.
     *
     * You should have received a copy of the GNU General Public License
     * along with this program; if not, write to the Free Software
     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     *
     * Author: Chip Webb  <ns3 (at) chipwebb.com>
     *
     */
    
    #include <iostream>
    #include <fstream>
    
    #include "ns3/core-module.h"
    #include "ns3/network-module.h"
    //#include "ns3/applications-module.h"
    #include "ns3/bridge-module.h"
    #include "ns3/csma-module.h"
    //#include "ns3/point-to-point-module.h"
    //#include "ns3/internet-module.h"
    #include "ns3/tap-bridge-module.h"
    
    using namespace ns3;
    
    // ########################################################################
    // Main routine
    // ########################################################################
    NS_LOG_COMPONENT_DEFINE ("GlobalRoutingMultiSwitchPlusRouter");
    
    #define vssearch(loc,vec) std::find ((vec).begin (), (vec).end (), (loc)) != (vec).end ()
    
    int
    main (int argc, char *argv[])
    {
      // ----------------------------------------------------------------------
      // Default values for command line arguments
      // ----------------------------------------------------------------------
      bool        verbose              = true;
    
      int         simDurationSeconds   = 60;
    
      bool        enableUdpMultiSW     = true;
      bool        enableUdpSingleSW    = true;
    
      std::string pcapLocations        = "";
      uint32_t    snapLen              = PcapFile::SNAPLEN_DEFAULT;
    
      std::string csmaXLinkDataRate    = "100Mbps";
      std::string csmaXLinkDelay       = "500ns";
    
      std::string csmaYLinkDataRate    = "10Mbps";
      std::string csmaYLinkDelay       = "500ns";
    
    //  uint16_t    udpEchoPort          = 9;  // The well-known UDP echo port
    
    
      // ----------------------------------------------------------------------
      // Create command line options and get them
      // ----------------------------------------------------------------------
      CommandLine cmd;
    
      cmd.Usage    ("NOTE: valid --pcap arguments are: 't2,t3,b2,b3,trlan,trwan,brlan,brwan'");
    
      cmd.AddValue ("verbose",      "Enable printing informational messages",        verbose);
    
      cmd.AddValue ("duration",     "Duration of simulation.",                       simDurationSeconds);
    
      cmd.AddValue ("udpMultiSW",   "Enable udp over multi-switch links",            enableUdpMultiSW);
      cmd.AddValue ("udpSingleSW",  "Enable udp over single-switch links",           enableUdpSingleSW);
    
      cmd.AddValue ("pcap",         "Comma separated list of PCAP Locations to tap", pcapLocations);
      cmd.AddValue ("snapLen",      "PCAP packet capture length",                    snapLen);
    
      cmd.AddValue ("csmaXRate",    "CSMA X Link data rate",                         csmaXLinkDataRate);
      cmd.AddValue ("csmaXDelay",   "CSMA X Link delay",                             csmaXLinkDelay);
    
      cmd.AddValue ("csmaYRate",    "CSMA Y Link data rate",                         csmaYLinkDataRate);
      cmd.AddValue ("csmaYDelay",   "CSMA Y Link delay",                             csmaYLinkDelay);
    
      cmd.Parse (argc, argv);
    
      // --------------------------------------------------------------------
      // Users may find it convenient to turn on explicit debugging
      // for selected modules; the below lines suggest how to do this
      // --------------------------------------------------------------------
      if (verbose)
        {
          LogComponentEnable ("GlobalRoutingMultiSwitchPlusRouter", LOG_LEVEL_INFO);
        }
    
    
      // ======================================================================
      // Define the list of valid PCAP taps
      // ----------------------------------------------------------------------
    //  std::vector<std::string> pcapTaps;
    //  pcapTaps.push_back ("t2");              // multi-switch  UDP echo client
    //  pcapTaps.push_back ("t3");              // single-switch UDP echo server
    //  pcapTaps.push_back ("b2");              // multi-switch  UDP echo server
    //  pcapTaps.push_back ("b3");              // single-switch UDP echo client
    //  pcapTaps.push_back ("trlan");           // top router    LAN side
    //  pcapTaps.push_back ("trwan");           // top router    WAN side
    //  pcapTaps.push_back ("brlan");           // bottom router LAN side
    //  pcapTaps.push_back ("brwan");           // bottom router WAN side
    
      // ----------------------------------------------------------------------
      // Parse the pcapLocations string into pcapLocationVec
      // ----------------------------------------------------------------------
    /*
      std::vector<std::string> pcapLocationVec;
      if (pcapLocations != "")
        {
          std::stringstream sStream (pcapLocations);
    
          while ( sStream.good () )
            {
              std::string substr;
              getline ( sStream, substr, ',' );
              if (vssearch (substr,pcapTaps))
                {
                  pcapLocationVec.push_back ( substr );
                }
              else
                {
                  NS_LOG_ERROR ("WARNING: Unrecognized PCAP location: <" + substr + ">");
                }
            }
    
          for (std::vector<std::string>::const_iterator
               ploc = pcapLocationVec.begin ();
               ploc  != pcapLocationVec.end ();
               ++ploc)
            {
              NS_LOG_INFO ("PCAP capture at: <" + *ploc + ">");
            }
        }
    */
      // ======================================================================
      // Set some simulator-wide values
      // ======================================================================
    
      // ----------------------------------------------------------------------
      // Set PCAP packet capture maximum packet length
      // ----------------------------------------------------------------------
    /*
      if (snapLen != PcapFile::SNAPLEN_DEFAULT)
      {
          Config::SetDefault ("ns3::PcapFileWrapper::CaptureSize",   UintegerValue (snapLen));
      }
    */
      // ======================================================================
      // Create the nodes & links required for the topology shown in comments above.
      // ----------------------------------------------------------------------
      NS_LOG_INFO ("INFO: Create nodes.");
    
      // use docker as router, there 6 routers (dockers) totally
      // every docker has two net interfaces, namely, eth0 & eth1
      NodeContainer router_nodes;
      router_nodes.Create (12);
    
      NodeContainer pc_nodes;
      pc_nodes.Create (4);
    
      NodeContainer ser_nodes;
      ser_nodes.Create (2);
    
      Ptr<Node> ts1 = CreateObject<Node> ();  // <no IP>     : Top switch #1 (bridge)
      Ptr<Node> ts2 = CreateObject<Node> ();  // <no IP>     : Top switch #2 (bridge)
    
      Ptr<Node> bs1 = CreateObject<Node> ();  // <no IP>     : Bottom switch #1 (bridge)
      Ptr<Node> bs2 = CreateObject<Node> ();  // <no IP>     : Bottom switch #2 (bridge)
      Ptr<Node> bs3 = CreateObject<Node> ();  // <no IP>     : Bottom switch #3 (bridge)
      Ptr<Node> bs4 = CreateObject<Node> ();  // <no IP>     : Bottom switch #4 (bridge)
    
      // ----------------------------------------------------------------------
      // Give the nodes names
      // ----------------------------------------------------------------------
    //  Names::Add ("t2",  t2);
    //  Names::Add ("t3",  t3);
    //  Names::Add ("ts1", ts1);
    //  Names::Add ("ts2", ts2);
    
    //  Names::Add ("bs1", bs1);
    //  Names::Add ("bs2", bs2);
    //  Names::Add ("bs3", bs3);
    //  Names::Add ("bs4", bs4);
    //  Names::Add ("b2",  b2);
    //  Names::Add ("b3",  b3);
    
      // ======================================================================
      // Create CSMA links to use for connecting LAN nodes together
      // ----------------------------------------------------------------------
    
      // ----------------------------------------
      // CSMA [X]
      // ----------------------------------------
      NS_LOG_INFO ("L2: Create a " <<
                   csmaXLinkDataRate << " " <<
                   csmaXLinkDelay << " CSMA link for csmaX for LANs.");
      CsmaHelper csmaX;
      csmaX.SetChannelAttribute ("DataRate", StringValue (csmaXLinkDataRate));
      csmaX.SetChannelAttribute ("Delay",    StringValue (csmaXLinkDelay));
    
      // ----------------------------------------
      // CSMA [Y]
      // ----------------------------------------
      NS_LOG_INFO ("L2: Create a " <<
                   csmaYLinkDataRate << " " <<
                   csmaYLinkDelay << " CSMA link for csmaY for LANs.");
      CsmaHelper csmaY;
      csmaY.SetChannelAttribute ("DataRate", StringValue (csmaYLinkDataRate));
      csmaY.SetChannelAttribute ("Delay",    StringValue (csmaYLinkDelay));
    
      // ----------------------------------------------------------------------
      // Now, connect the top LAN nodes together with csma links.
      // ----------------------------------------------------------------------
      NS_LOG_INFO ("L2: Connect nodes on top LAN together with half-duplex CSMA links.");
    
      // Multi-switch top LAN chain: t2-ts4-ts3-ts2-ts1-tr
    
      // docker1 <---> docker2
      NetDeviceContainer link_r1_r2   = csmaX.Install (NodeContainer (router_nodes.Get(1), router_nodes.Get(2)));
    
      // ts1
      NetDeviceContainer link_ts1_r0   = csmaX.Install (NodeContainer (ts1, router_nodes.Get(0)));
      NetDeviceContainer link_ts1_r4   = csmaX.Install (NodeContainer (ts1, router_nodes.Get(4)));
      NetDeviceContainer link_ts1_r6   = csmaX.Install (NodeContainer (ts1, router_nodes.Get(6)));
      NetDeviceContainer link_ts1_s0   = csmaX.Install (NodeContainer (ts1, ser_nodes.Get(0)));
    
      // ts2
      NetDeviceContainer link_ts2_r3   = csmaX.Install (NodeContainer (ts2, router_nodes.Get(3)));
      NetDeviceContainer link_ts2_r8   = csmaX.Install (NodeContainer (ts2, router_nodes.Get(8)));
      NetDeviceContainer link_ts2_r10   = csmaX.Install (NodeContainer (ts2, router_nodes.Get(10)));
      NetDeviceContainer link_ts2_s1   = csmaX.Install (NodeContainer (ts2, ser_nodes.Get(1)));
    
      // bs1
      NetDeviceContainer link_bs1_r5   = csmaX.Install (NodeContainer (bs1, router_nodes.Get(5)));
      NetDeviceContainer link_bs1_p0   = csmaX.Install (NodeContainer (bs1, pc_nodes.Get(0)));
    
      // bs2
      NetDeviceContainer link_bs2_r7   = csmaX.Install (NodeContainer (bs2, router_nodes.Get(7)));
      NetDeviceContainer link_bs2_p1   = csmaX.Install (NodeContainer (bs2, pc_nodes.Get(1)));
    
      // bs3
      NetDeviceContainer link_bs3_r9   = csmaX.Install (NodeContainer (bs3, router_nodes.Get(9)));
      NetDeviceContainer link_bs3_p2   = csmaX.Install (NodeContainer (bs3, pc_nodes.Get(2)));
    
      // bs4
      NetDeviceContainer link_bs4_r11   = csmaX.Install (NodeContainer (bs4, router_nodes.Get(11)));
      NetDeviceContainer link_bs4_p3   = csmaX.Install (NodeContainer (bs4, pc_nodes.Get(3)));
    
      // ======================================================================
      // Manually create the list of NetDevices for each switch
      // ----------------------------------------------------------------------
    
      // Top Switch 1 NetDevices (ts1)
      NetDeviceContainer ts1nd;
      ts1nd.Add (link_ts1_r0.Get (0));
      ts1nd.Add (link_ts1_r4.Get (0));
      ts1nd.Add (link_ts1_r6.Get (0));
      ts1nd.Add (link_ts1_s0.Get (0));
    
      // Top Switch 2 NetDevices (ts2)
      NetDeviceContainer ts2nd;
      ts2nd.Add (link_ts2_r3.Get (0));
      ts2nd.Add (link_ts2_r8.Get (0));
      ts2nd.Add (link_ts2_r10.Get (0));
      ts2nd.Add (link_ts2_s1.Get (0));
    
      // Bottom Switch 1 NetDevices (bs1)
      NetDeviceContainer bs1nd;
      bs1nd.Add (link_bs1_r5.Get (0));
      bs1nd.Add (link_bs1_p0.Get (0));
    
      // Bottom Switch 2 NetDevices (bs2)
      NetDeviceContainer bs2nd;
      bs2nd.Add (link_bs2_r7.Get (0));
      bs2nd.Add (link_bs2_p1.Get (0));
    
      // Bottom Switch 3 NetDevices (bs3)
      NetDeviceContainer bs3nd;
      bs3nd.Add (link_bs3_r9.Get (0));
      bs3nd.Add (link_bs3_p2.Get (0));
    
      // Bottom Switch 4 NetDevices (bs4)
      NetDeviceContainer bs4nd;
      bs4nd.Add (link_bs4_r11.Get (0));
      bs4nd.Add (link_bs4_p3.Get (0));
    
      // ======================================================================
      // Install bridging code on each switch
      // ----------------------------------------------------------------------
      BridgeHelper bridge;
    
      bridge.Install (ts1, ts1nd);
      bridge.Install (ts2, ts2nd);
    
      bridge.Install (bs1, bs1nd);
      bridge.Install (bs2, bs2nd);
      bridge.Install (bs3, bs3nd);
      bridge.Install (bs4, bs4nd);
    
      // ======================================================================
      // link Linux bridge
      // ----------------------------------------------------------------------
      NetDeviceContainer RouterNodes;
      NetDeviceContainer PcNodes;
      NetDeviceContainer SerNodes;
    
      RouterNodes.Add (link_ts1_r0.Get (1));
      RouterNodes.Add (link_r1_r2.Get (0));
      RouterNodes.Add (link_r1_r2.Get (1));
      RouterNodes.Add (link_ts2_r3.Get (1));
      RouterNodes.Add (link_ts1_r4.Get (1));
      RouterNodes.Add (link_bs1_r5.Get (1));
      RouterNodes.Add (link_ts1_r6.Get (1));
      RouterNodes.Add (link_bs2_r7.Get (1));
      RouterNodes.Add (link_ts2_r8.Get (1));
      RouterNodes.Add (link_bs3_r9.Get (1));
      RouterNodes.Add (link_ts2_r10.Get (1));
      RouterNodes.Add (link_bs4_r11.Get (1));
    
      PcNodes.Add (link_bs1_p0.Get (1));
      PcNodes.Add (link_bs2_p1.Get (1));
      PcNodes.Add (link_bs3_p2.Get (1));
      PcNodes.Add (link_bs4_p3.Get (1));
    
      SerNodes.Add (link_ts1_s0.Get (1));
      SerNodes.Add (link_ts2_s1.Get (1));
    
      // ======================================================================
      // link VM.
      // ----------------------------------------------------------------------
    
      TapBridgeHelper tapBridge;
      tapBridge.SetAttribute ("Mode", StringValue ("UseBridge"));
    
      // PC Node 0, 1, 2, 3
      tapBridge.SetAttribute ("DeviceName", StringValue ("tap_w_1"));
      tapBridge.Install (pc_nodes.Get (0), PcNodes.Get (0));   //p0
    
      tapBridge.SetAttribute ("DeviceName", StringValue ("tap_w_2"));
      tapBridge.Install (pc_nodes.Get (1), PcNodes.Get (1));   //p1
    
      tapBridge.SetAttribute ("DeviceName", StringValue ("tap_w_3"));
      tapBridge.Install (pc_nodes.Get (2), PcNodes.Get (2));   //p2
    
      tapBridge.SetAttribute ("DeviceName", StringValue ("tap_w_4"));
      tapBridge.Install (pc_nodes.Get (3), PcNodes.Get (3));   //p3
    
      // Ser Node 0, 1
      tapBridge.SetAttribute ("DeviceName", StringValue ("tap_w_5"));
      tapBridge.Install (ser_nodes.Get (0), SerNodes.Get (0));   //s0
    
      tapBridge.SetAttribute ("DeviceName", StringValue ("tap_w_6"));
      tapBridge.Install (ser_nodes.Get (1), SerNodes.Get (1));   //s1
    
      // Router Node 0 ~ 11
      tapBridge.SetAttribute ("DeviceName", StringValue ("tap_r_11"));
      tapBridge.Install (router_nodes.Get (0), RouterNodes.Get (0));   //r0, docker_1
    
      tapBridge.SetAttribute ("DeviceName", StringValue ("tap_r_12"));
      tapBridge.Install (router_nodes.Get (1), RouterNodes.Get (1));   //r1, docker_1
    
      tapBridge.SetAttribute ("DeviceName", StringValue ("tap_r_21"));
      tapBridge.Install (router_nodes.Get (2), RouterNodes.Get (2));   //r2, docker_2
    
      tapBridge.SetAttribute ("DeviceName", StringValue ("tap_r_22"));
      tapBridge.Install (router_nodes.Get (3), RouterNodes.Get (3));   //r3, docker_2
    
      tapBridge.SetAttribute ("DeviceName", StringValue ("tap_r_31"));
      tapBridge.Install (router_nodes.Get (4), RouterNodes.Get (4));   //r4, docker_3
    
      tapBridge.SetAttribute ("DeviceName", StringValue ("tap_r_32"));
      tapBridge.Install (router_nodes.Get (5), RouterNodes.Get (5));   //r5, docker_3
    
      tapBridge.SetAttribute ("DeviceName", StringValue ("tap_r_41"));
      tapBridge.Install (router_nodes.Get (6), RouterNodes.Get (6));   //r6, docker_4
    
      tapBridge.SetAttribute ("DeviceName", StringValue ("tap_r_42"));
      tapBridge.Install (router_nodes.Get (7), RouterNodes.Get (7));   //r7, docker_4
    
      tapBridge.SetAttribute ("DeviceName", StringValue ("tap_r_51"));
      tapBridge.Install (router_nodes.Get (8), RouterNodes.Get (8));   //r8, docker_5
    
      tapBridge.SetAttribute ("DeviceName", StringValue ("tap_r_52"));
      tapBridge.Install (router_nodes.Get (9), RouterNodes.Get (9));   //r9, docker_5
    
      tapBridge.SetAttribute ("DeviceName", StringValue ("tap_r_61"));
      tapBridge.Install (router_nodes.Get (10), RouterNodes.Get (10));   //r10, docker_6
    
      tapBridge.SetAttribute ("DeviceName", StringValue ("tap_r_62"));
      tapBridge.Install (router_nodes.Get (11), RouterNodes.Get (11));   //r11, docker_6
    
      // ======================================================================
      // Now, do the actual simulation.
      // ----------------------------------------------------------------------
    //  NS_LOG_INFO ("Run Simulation for " << simDurationSeconds << " seconds.");
    //  Simulator::Stop (Seconds (simDurationSeconds));
    
      Simulator::Run ();
      Simulator::Destroy ();
      NS_LOG_INFO ("Done.");
    
    }











  • 相关阅读:
    Activator.CreateInstance 反射实例化对象
    MVC Form提交
    Redis 下载
    List<T> 序列化与反序列化
    快速反射DataTable
    数据库特性
    javascript判断文件大小
    MD5
    HttpHelper
    cacheHelper
  • 原文地址:https://www.cnblogs.com/ztguang/p/12645789.html
Copyright © 2011-2022 走看看