venv
nfvbench.egg-info
docs/_build
-nfvbenchvm/dib/
*.qcow2
docs/conf.py
-docs/_static
\ No newline at end of file
+docs/_static
--- /dev/null
+#!/bin/bash
+#
+# A shell script to build the VPP VM image using diskinage-builder
+#
+# The following packages must be installed prior to using this script:
+# sudo apt-get -y install python-virtualenv qemu-utils kpartx
+
+# image version number
+__version__=0.3
+image_name=nfvbenchvm_centos-$__version__
+
+# install diskimage-builder
+if [ -d dib-venv ]; then
+ . dib-venv/bin/activate
+else
+ virtualenv dib-venv
+ . dib-venv/bin/activate
+ pip install diskimage-builder
+fi
+
+# Add nfvbenchvm_centos elements directory to the DIB elements path
+export ELEMENTS_PATH=`pwd`/elements
+
+# canned user/password for direct login
+export DIB_DEV_USER_USERNAME=nfvbench
+export DIB_DEV_USER_PASSWORD=nfvbench
+export DIB_DEV_USER_PWDLESS_SUDO=Y
+
+# Set the data sources to have ConfigDrive only
+export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive"
+
+# Configure VPP REPO
+export DIB_YUM_REPO_CONF=$ELEMENTS_PATH/nfvbenchvm/fdio-release.repo
+
+# Use ELRepo to have latest kernel
+export DIB_USE_ELREPO_KERNEL=True
+
+echo "Building $image_name.qcow2..."
+time disk-image-create -o $image_name centos7 nfvbenchvm
+
+ls -l $image_name.qcow2
--- /dev/null
+vm
+cloud-init-datasources
+install-static
+package-installs
+devuser
--- /dev/null
+[fdio-release]
+name=fd.io release branch latest merge
+baseurl=https://nexus.fd.io/content/repositories/fd.io.stable.1707.centos7/
+enabled=1
+gpgcheck=0
--- /dev/null
+#!/bin/bash
+
+grubby --update-kernel=ALL --args="isolcpus=1 rcu_nocbs=1 nohz=on nohz_full=1 nmi_watchdog=0"
+grubby --update-kernel=ALL --args="default_hugepagesz=1G hugepagesz=1G hugepages=1"
--- /dev/null
+#!/bin/bash
+
+grubby --update-kernel=ALL --args="vga=792"
--- /dev/null
+bc:
+gcc:
+tuna:
+wget:
+screen:
+telnet:
+python-devel:
+libyaml-devel:
+vpp:
+vpp-plugins:
+kernel-firmware:
+kernel-headers:
+kernel-devel:
--- /dev/null
+#!/bin/bash
+
+if [ $DIB_USE_ELREPO_KERNEL != "True" ]; then
+ exit 0
+fi
+
+# Installing the latest kernel from ELRepo
+rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
+rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
+yum remove -y kernel-firmware kernel-headers kernel-devel
+yum install -y --enablerepo=elrepo-kernel kernel-ml kernel-ml-headers kernel-ml-devel
+
+# gcc will be removed with old kernel as dependency, so reinstalling it back
+yum install -y gcc
--- /dev/null
+#!/bin/bash
+
+DPDK=dpdk-17.05
+DPDK_UNTAR=dpdk-17.05
+
+# pick up the kernel version for the target image
+kernel_version=`ls -t /lib/modules | awk 'NR==1 {print}'`
+
+mkdir dpdk
+wget http://fast.dpdk.org/rel/$DPDK.tar.xz
+tar xfJ $DPDK.tar.xz
+cd $DPDK_UNTAR
+
+export RTE_KERNELDIR=/lib/modules/$kernel_version/build
+export ARCH=x86
+make -j4 install T=x86_64-native-linuxapp-gcc
+
+cp usertools/dpdk-devbind.py ../dpdk
+# cp tools/dpdk_nic_bind.py ../dpdk/dpdk-devbind.py
+cp x86_64-native-linuxapp-gcc/app/testpmd ../dpdk
+cp x86_64-native-linuxapp-gcc/kmod/igb_uio.ko ../dpdk
+
+cd ..
+rm -f $DPDK.tar.xz
+rm -rf $DPDK_UNTAR
--- /dev/null
+#!/bin/bash
+
+chmod +x /etc/rc.d/rc.local
+chmod +x /etc/sysconfig/network-scripts/ifcfg-eth0
--- /dev/null
+#!/bin/bash
+
+cd /tmp
+wget https://bootstrap.pypa.io/get-pip.py
+python get-pip.py
+
+pip install setuptools wheel
+pip install pyyaml
--- /dev/null
+#!/usr/bin/env python
+
+import yaml
+cloudcfg = "/etc/cloud/cloud.cfg"
+user = "cloud-user"
+
+with open(cloudcfg) as f:
+ cfg = yaml.load(f)
+
+try:
+ if cfg['system_info']['default_user']['name']:
+ synver = "2"
+except KeyError:
+ synver = "1"
+
+if synver == "1":
+ if cfg['user'] == user:
+ print("No change needed")
+ exit()
+ else:
+ cfg['user'] = user
+elif synver == "2":
+ if cfg['system_info']['default_user']['name'] == user:
+ print("No change needed")
+ exit()
+ else:
+ # Change the user to cloud-user
+ cfg['system_info']['default_user']['name'] = user
+ cfg['system_info']['default_user']['gecos'] = "Cloud User"
+ print cfg['system_info']['default_user']['name']
+
+with open(cloudcfg, "w") as f:
+ yaml.dump(cfg, f, default_flow_style=False)
--- /dev/null
+#!/bin/bash
+
+yum erase -y python-devel libyaml-devel kernel-devel kernel-headers kernel-ml-headers kernel-ml-devel gcc
--- /dev/null
+network: {config: disabled}
+
--- /dev/null
+#!/bin/bash
+
+touch /var/lock/subsys/local
+
+# Waiting for cloud-init to generate $TESTPMD_CONF, retry 60 seconds
+NFVBENCH_CONF=/etc/nfvbenchvm.conf
+retry=30
+until [ $retry -eq 0 ]; do
+ if [ -f $NFVBENCH_CONF ]; then break; fi
+ retry=$[$retry-1]
+ sleep 2
+done
+if [ ! -f $NFVBENCH_CONF ]; then
+ exit 0
+fi
+
+# Parse and obtain all configurations
+echo "Generating configurations for forwarder..."
+eval $(cat $NFVBENCH_CONF)
+touch /nfvbench_configured.flag
+NICS=`lspci -D | grep Ethernet | cut -d' ' -f1 | xargs`
+PCI_ADDRESS_1=`echo $NICS | awk '{ print $1 }'`
+PCI_ADDRESS_2=`echo $NICS | awk '{ print $2 }'`
+CPU_CORES=`grep -c ^processor /proc/cpuinfo`
+CPU_MASKS=0x`echo "obase=16; 2 ^ $CPU_CORES - 1" | bc`
+WORKER_CORES=`expr $CPU_CORES - 1`
+
+# CPU isolation optimizations
+echo 1 > /sys/bus/workqueue/devices/writeback/cpumask
+echo 1 > /sys/devices/virtual/workqueue/cpumask
+echo 1 > /proc/irq/default_smp_affinity
+for irq in `ls /proc/irq/`; do
+ echo 1 > /proc/irq/$irq/smp_affinity
+done
+tuna -c $(seq -s, 1 1 $WORKER_CORES) --isolate
+
+# Configure the forwarder
+if [ "$FORWARDER" == "testpmd" ]; then
+ echo "Configuring testpmd..."
+ if [ -z "`lsmod | grep igb_uio`" ]; then
+ modprobe uio
+ insmod /dpdk/igb_uio.ko
+ fi
+ # Binding ports to DPDK
+ /dpdk/dpdk-devbind.py -b igb_uio $PCI_ADDRESS_1
+ /dpdk/dpdk-devbind.py -b igb_uio $PCI_ADDRESS_2
+ screen -dmSL testpmd /dpdk/testpmd \
+ -c $CPU_MASKS \
+ -n 4 \
+ -- \
+ --burst=32 \
+ --txd=256 \
+ --rxd=1024 \
+ --txqflags=0xf00 \
+ --disable-hw-vlan \
+ --eth-peer=0,$TG_MAC1 \
+ --eth-peer=1,$TG_MAC2 \
+ --forward-mode=mac \
+ --nb-cores=$WORKER_CORES\
+ --max-pkt-len 9000
+else
+ echo "Configuring vpp..."
+ cp /vpp/startup.conf /etc/vpp/startup.conf
+ cp /vpp/vm.conf /etc/vpp/vm.conf
+
+ sed -i "s/{{PCI_ADDRESS_1}}/$PCI_ADDRESS_1/g" /etc/vpp/startup.conf
+ sed -i "s/{{PCI_ADDRESS_2}}/$PCI_ADDRESS_2/g" /etc/vpp/startup.conf
+ sed -i "s/{{WORKER_CORES}}/$WORKER_CORES/g" /etc/vpp/startup.conf
+ service vpp start
+
+ INTFS=`vppctl show int | grep Ethernet | xargs`
+ INTF_1=`echo $INTFS | awk '{ print $1 }'`
+ INTF_2=`echo $INTFS | awk '{ print $4 }'`
+ sed -i "s/{{INTF_1}}/${INTF_1//\//\/}/g" /etc/vpp/vm.conf
+ sed -i "s/{{INTF_2}}/${INTF_2//\//\/}/g" /etc/vpp/vm.conf
+ sed -i "s/{{VNF_GATEWAY1_CIDR}}/${VNF_GATEWAY1_CIDR//\//\/}/g" /etc/vpp/vm.conf
+ sed -i "s/{{VNF_GATEWAY2_CIDR}}/${VNF_GATEWAY2_CIDR//\//\/}/g" /etc/vpp/vm.conf
+ sed -i "s/{{TG_MAC1}}/${TG_MAC1}/g" /etc/vpp/vm.conf
+ sed -i "s/{{TG_MAC2}}/${TG_MAC2}/g" /etc/vpp/vm.conf
+ sed -i "s/{{TG_NET1}}/${TG_NET1//\//\/}/g" /etc/vpp/vm.conf
+ sed -i "s/{{TG_NET2}}/${TG_NET2//\//\/}/g" /etc/vpp/vm.conf
+ sed -i "s/{{TG_GATEWAY1_IP}}/${TG_GATEWAY1_IP}/g" /etc/vpp/vm.conf
+ sed -i "s/{{TG_GATEWAY2_IP}}/${TG_GATEWAY2_IP}/g" /etc/vpp/vm.conf
+
+ service vpp restart
+fi
--- /dev/null
+DEVICE="eth0"
+BOOTPROTO="dhcp"
+ONBOOT="no"
+TYPE="Ethernet"
+USERCTL="yes"
+PEERDNS="yes"
+IPV6INIT="no"
+PERSISTENT_DHCLIENT="0"
--- /dev/null
+DEVICE="eth1"
+BOOTPROTO="dhcp"
+ONBOOT="no"
+TYPE="Ethernet"
+USERCTL="yes"
+PEERDNS="yes"
+IPV6INIT="no"
+PERSISTENT_DHCLIENT="0"
--- /dev/null
+unix {
+ nodaemon
+ log /tmp/vpp.log
+ full-coredump
+ startup-config /etc/vpp/vm.conf
+ cli-listen localhost:5002
+}
+
+api-trace {
+ on
+}
+
+dpdk {
+ dev default {
+ num-rx-desc 1024
+ num-tx-desc 256
+ }
+ socket-mem 1024
+ dev {{PCI_ADDRESS_1}}
+ dev {{PCI_ADDRESS_2}}
+}
+
+api-segment {
+ gid vpp
+}
+
+cpu {
+ main-core 0
+ workers {{WORKER_CORES}}
+}
--- /dev/null
+set int state {{INTF_1}} up
+set int state {{INTF_2}} up
+set interface ip address {{INTF_1}} {{VNF_GATEWAY1_CIDR}}
+set interface ip address {{INTF_2}} {{VNF_GATEWAY2_CIDR}}
+set ip arp {{INTF_1}} {{TG_GATEWAY1_IP}} {{TG_MAC1}} static
+set ip arp {{INTF_2}} {{TG_GATEWAY2_IP}} {{TG_MAC2}} static
+ip route add {{TG_NET1}} via {{TG_GATEWAY1_IP}}
+ip route add {{TG_NET2}} via {{TG_GATEWAY2_IP}}