blob: b57041391c01a9762741830ba05774a65afff5b5 [file] [log] [blame]
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"