| echo "" |
| echo "*******************************" |
| echo "PcapPlusPlus setup DPDK script " |
| echo "*******************************" |
| echo "" |
| |
| |
| show_help() { |
| echo "usage: setup-dpdk.sh -g AMOUNT_OF_HUGE_PAGES_TO_ALLOCATE -n NICS_TO_BIND_IN_COMMA_SEPARATED_LIST [-s] [-h]" |
| echo "options:" |
| echo " -p : amount of huge pages to allocate (huge pages are needed for DPDK's memory allocations)" |
| echo " -n : a comma-separated list of all NICs that will be unbinded from Linux and move to DPDK control" |
| echo " only these NICs will be used by DPDK. Example: eth0,eth1" |
| echo " -s : display current Ethernet device settings (which are binded to Linux and which to DPDK)" |
| echo " -h : show this help screen" |
| } |
| |
| |
| # setup DPDK variables |
| export RTE_SDK=###RTE_SDK### |
| |
| # in DPDK 16.11 help scripts are stil in 'tools' dir but in 17.02 dir was renamed to 'usertools' |
| TOOLS_DIR="" |
| if [ -d $RTE_SDK/tools ]; then TOOLS_DIR=tools; else TOOLS_DIR=usertools; fi |
| |
| |
| # read and parse arguments |
| |
| OPTIND=1 # Reset in case getopts has been used previously in the shell. |
| |
| HUGE_PAGE_TO_ALLOCATE=0 |
| NICS_TO_BIND="" |
| |
| while getopts "h?sp:n:" opt; do |
| case "$opt" in |
| h|\?) |
| show_help |
| exit 0 |
| ;; |
| p) HUGE_PAGE_TO_ALLOCATE=$OPTARG |
| ;; |
| n) NICS_TO_BIND=$OPTARG |
| ;; |
| s) ${RTE_SDK}/${TOOLS_DIR}/dpdk-devbind.py --status |
| exit 0 |
| ;; |
| esac |
| done |
| |
| shift $((OPTIND-1)) |
| |
| [ "$1" = "--" ] && shift |
| |
| |
| # verify huge page amount is indeed a string |
| re='^[0-9]+$' |
| if ! [[ $HUGE_PAGE_TO_ALLOCATE =~ $re ]] ; then |
| echo "Error: Huge-page amount is not a number" |
| echo |
| show_help |
| exit 1 |
| fi |
| |
| #verify nic list was given |
| if [[ $NICS_TO_BIND == "" ]] ; then |
| echo "Error: List of NICs to bind was not given" |
| echo |
| show_help |
| exit 1 |
| fi |
| |
| |
| # setup huge-pages |
| CUR_HUGE=$(cat /proc/meminfo | grep -s HugePages_Total | awk '{print $2}') |
| if [ $CUR_HUGE != $HUGE_PAGE_TO_ALLOCATE ] ; then |
| HUGEPAGE_MOUNT=/mnt/huge |
| echo "echo $HUGE_PAGE_TO_ALLOCATE > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages" > .echo_tmp |
| sudo sh .echo_tmp |
| rm -f .echo_tmp |
| sudo mkdir -p ${HUGEPAGE_MOUNT} |
| sudo mount -t hugetlbfs nodev ${HUGEPAGE_MOUNT} |
| echo "1. Reserve huge-pages - DONE!" |
| else |
| echo "1. Huge-pages already allocated" |
| fi |
| |
| # install kernel modules |
| IFS="," |
| for NIC_TO_BIND in $NICS_TO_BIND ; do |
| ifconfig | grep -s "^$NIC_TO_BIND" > /dev/null |
| if [ $? -eq 1 ] ; then |
| echo "2. $NIC_TO_BIND is already binded to DPDK or doesn't exist. Exiting" |
| echo |
| ${RTE_SDK}/${TOOLS_DIR}/dpdk-devbind.py --status |
| exit 1 |
| fi |
| done |
| |
| lsmod | grep -s igb_uio > /dev/null |
| if [ $? -eq 0 ] ; then |
| sudo rmmod igb_uio |
| fi |
| |
| sudo modprobe uio |
| sudo insmod ${RTE_SDK}/build/kmod/igb_uio.ko |
| echo "2. Install kernel module - DONE!" |
| |
| |
| # bind network adapter |
| IFS="," |
| for NIC_TO_BIND in $NICS_TO_BIND ; do |
| sudo ifconfig ${NIC_TO_BIND} down |
| sudo ${RTE_SDK}/${TOOLS_DIR}/dpdk-devbind.py --bind=igb_uio ${NIC_TO_BIND} |
| done |
| echo "3. Bind network adapters - DONE!" |
| |
| ${RTE_SDK}/${TOOLS_DIR}/dpdk-devbind.py --status |
| |
| echo "Setup DPDK completed" |