1#! /bin/bash 2 3############################ Common Utilities ################################ 4GREEN='\033[0;32m' 5RED='\033[0;31m' 6NC='\033[0m' 7 8FL_PCAP=1 9FL_DPDK=2 10FL_NETMAP=3 11 12# vercomp returns 0 (=), 1 (>), or 2 (<) 13vercomp () { 14 if [[ $1 == $2 ]] 15 then 16 return 0 17 fi 18 local IFS=. 19 local i ver1=($1) ver2=($2) 20 # fill empty fields in ver1 with zeros 21 for ((i=${#ver1[@]}; i<${#ver2[@]}; i++)) 22 do 23 ver1[i]=0 24 done 25 for ((i=0; i<${#ver1[@]}; i++)) 26 do 27 if [[ -z ${ver2[i]} ]] 28 then 29 # fill empty fields in ver2 with zeros 30 ver2[i]=0 31 fi 32 if ((10#${ver1[i]} > 10#${ver2[i]})) 33 then 34 return 1 35 fi 36 if ((10#${ver1[i]} < 10#${ver2[i]})) 37 then 38 return 2 39 fi 40 done 41 return 0 42} 43 44# valid_ip_addr returns 1 for valid ip address 45valid_ip_addr() 46{ 47 local ip=$1 48 local stat=1 49 50 if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then 51 OIFS=$IFS 52 IFS='.' 53 ip=($ip) 54 IFS=$OIFS 55 [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \ 56 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]] 57 stat=$? 58 fi 59 return $stat 60} 61 62# Create a mos.conf file 63create_config() 64{ 65 cd $CUR_DIR 66 mkdir -p $2 67 CONF_FILE=$2/mos.conf 68 CONF_MASTER_FILE=$2/mos-master.conf 69 CONF_SLAVE_FILE=$2/mos-slave.conf 70 71 echo 72 echo "----------------------------------------" 73 echo "Creating mos.conf file in $2" 74 echo "----------------------------------------" 75 76 if [ -f $CONF_FILE ]; then 77 echo 78 echo "The config file $2/mos.conf already exists." 79 echo "Skip writing a new config file.." 80 return 81 fi 82 83 # Get the number of CPUs and translate it into CPU mask 84 let "z=2**$(nproc)-1" 85 CPU_MASK=$(printf '0x%04X\n' $z) 86 87 # Get # of CPU sockets 88 let "sockets=$(cat /proc/cpuinfo | grep "physical id" | awk '{print $4}' | sort -ur | head -n 1) + 1" 89 90 # Get the number of memory channels 91 command -v dmidecode >/dev/null && 92 let "NUM_MEMCH=($(sudo dmidecode -t 17 | grep -c 'Size:')-$(sudo dmidecode -t 17 | grep -c 'Size: No Module'))/$sockets" || 93 { echo "dmidecode command not found. setting num_mem_ch = 4"; let "NUM_MEMCH=4"; } 94 95 # Get the number of interfaces 96 counter=0 97 if [[ $1 == $FL_DPDK ]]; then 98 cd /sys/module/igb_uio/drivers/pci:igb_uio/ 99 DEV_NAME="dpdk" 100 elif [[ ( $1 != $FL_PCAP ) && ( $1 != $FL_NETMAP ) ]]; then 101 echo "invalid function call 1" 102 exit 1 103 fi 104 for i in * 105 do 106 if [[ $i == *":"* ]] 107 then 108 let "counter=$counter + 1" 109 fi 110 done 111 cd $CUR_DIR 112 113 # Write up a new configuration file 114 if [[ $1 == $FL_PCAP ]]; then 115 cat .standalone-template.conf > $CONF_FILE 116 DEVLIST=`ifconfig -s | grep -Eo '^[^ ]+' | tail -n+2` 117 for dev in $DEVLIST; do 118 printf "Found $dev. Press y to select [y/N]: " 119 read option 120 if [[ "$option" == y* ]]; then 121 DEVICE="\n\t\t$dev" 122 DEVICEMASK="__coremask__devicemask" 123 FMT=$(printf 's/__devicemask/%s %s/g' $DEVICE $DEVICEMASK) 124 sed -i -e "$FMT" $CONF_FILE 125 126 DEVICE="$dev""__devicelist" 127 FMT=$(printf 's/__devicelist/ %s/g' $DEVICE) 128 sed -i -e "$FMT" $CONF_FILE 129 fi 130 done 131 sed -i -e 's/__devicemask//g' $CONF_FILE 132 sed -i -e 's/__devicelist//g' $CONF_FILE 133 sed -i -e 's/__coremask/0x0001/g' $CONF_FILE 134 sed -i -e 's/__num_memch//g' $CONF_FILE 135 sed -i -e 's/__forward/1/g' $CONF_FILE 136 sed -i -e 's/__multiprocess//g' $CONF_FILE 137 138 elif [[ $1 == $FL_NETMAP ]]; then 139 if [ "$3" = "epserver" ] || [ "$3" = "epwget" ] ; then 140 cat .end-template.conf > $CONF_FILE 141 else 142 cat .standalone-template.conf > $CONF_FILE 143 fi 144 145 DEVLIST=`ifconfig -s | grep -Eo '^[^ ]+' | tail -n+2` 146 for dev in $DEVLIST; do 147 printf "Found $dev. Press y to select [y/N]: " 148 read option 149 if [[ "$option" == y* ]]; then 150 DEVICE="\n\t\t$dev" 151 DEVICEMASK="__coremask__devicemask" 152 FMT=$(printf 's/__devicemask/%s %s/g' $DEVICE $DEVICEMASK) 153 sed -i -e "$FMT" $CONF_FILE 154 155 DEVICE="$dev""__devicelist" 156 FMT=$(printf 's/__devicelist/ %s/g' $DEVICE) 157 sed -i -e "$FMT" $CONF_FILE 158 fi 159 done 160 sed -i -e 's/__devicemask//g' $CONF_FILE 161 sed -i -e 's/__devicelist//g' $CONF_FILE 162 sed -i -e 's/__coremask/'$CPU_MASK'/g' $CONF_FILE 163 sed -i -e 's/__num_memch//g' $CONF_FILE 164 sed -i -e 's/__forward/1/g' $CONF_FILE 165 sed -i -e 's/__app/'$3'/g' $CONF_FILE 166 sed -i -e 's/__multiprocess//g' $CONF_FILE 167 168 if [ "$3" = "nat" ] ; then 169 sed -i -e 's/\# tcp_tw_interval = 30/tcp_tw_interval = 30/g' $CONF_FILE 170 fi 171 else 172 if [ "$3" = "epserver" ] || [ "$3" = "epwget" ] ; then 173 cat .end-template.conf > $CONF_FILE 174 cat .end-template.conf > $CONF_MASTER_FILE 175 cat .end-template.conf > $CONF_SLAVE_FILE 176 else 177 cat .standalone-template.conf > $CONF_FILE 178 fi 179 start=0 180 while [ $start -lt $counter ] 181 do 182 DEVICE="\n\t\t$DEV_NAME$(($start))" 183 DEVICEMASK="__coremask__devicemask" 184 FMT=$(printf 's/__devicemask/%s %s/g' $DEVICE $DEVICEMASK) 185 sed -i -e "$FMT" $CONF_FILE 186 187 DEVICE="$DEV_NAME$(($start))__devicelist" 188 FMT=$(printf 's/__devicelist/ %s/g' $DEVICE) 189 sed -i -e "$FMT" $CONF_FILE 190 191 let "start=$start + 1" 192 done 193 sed -i -e 's/__devicemask//g' $CONF_FILE 194 sed -i -e 's/__devicelist//g' $CONF_FILE 195 sed -i -e 's/__coremask/'$CPU_MASK'/g' $CONF_FILE 196 sed -i -e 's/__forward/1/g' $CONF_FILE 197 sed -i -e 's/__app/'$3'/g' $CONF_FILE 198 199 if [ "$3" = "nat" ] ; then 200 sed -i -e 's/\# tcp_tw_interval = 30/tcp_tw_interval = 30/g' $CONF_FILE 201 fi 202 203 if [[ $1 == $FL_DPDK ]]; then 204 FMT=$(printf 's/__num_memch/%snb_mem_channels = %d%s/g' '# number of memory channels per socket [mandatory for DPDK]\n\t' $NUM_MEMCH '\n') 205 sed -i -e "$FMT" $CONF_FILE 206 if [ "$3" = "epserver" ] || [ "$3" = "epwget" ] ; then 207 cp $CONF_FILE $CONF_MASTER_FILE 208 cp $CONF_FILE $CONF_SLAVE_FILE 209 sed -i -e 's/__multiprocess/multiprocess = 0 master/g' $CONF_MASTER_FILE 210 sed -i -e 's/__multiprocess/multiprocess = slave/g' $CONF_SLAVE_FILE 211 fi 212 else 213 echo "invalid function call 2" 214 exit 1 215 fi 216 217 sed -i -e 's/__multiprocess//g' $CONF_FILE 218 fi 219 echo 220 cat $CONF_FILE 221} 222 223create_makefile() 224{ 225 cd $CUR_DIR/samples 226 for d in * ; do 227 if [ -f $CUR_DIR/samples/$d/Makefile.in ]; then 228 cp $CUR_DIR/samples/$d/Makefile.in $CUR_DIR/samples/$d/Makefile 229 if [[ $1 == $FL_DPDK ]]; then 230 FMT=$(printf 's/__IO_LIB_ARGS/LIBS += -m64 -g -pthread -lrt -march=native -Wl,-export-dynamic -L\$(RTE_SDK)\/\$(RTE_TARGET)\/lib -Wl,-lnuma -Wl,-lmtcp -Wl,-lpthread -Wl,-lrt -Wl,-ldl -Wl,$(shell cat \$(RTE_SDK)\/\$(RTE_TARGET)\/lib\/ldflags.txt)/g') 231 elif [[ $1 == $FL_PCAP ]]; then 232 FMT=$(printf 's/__IO_LIB_ARGS/GCC_OPT += -D__thread="" -DBE_RESILIENT_TO_PACKET_DROP\\nINC += -DENABLE_PCAP\\nLIBS += -lpcap/g') 233 elif [[ $1 == $FL_NETMAP ]]; then 234 FMT=$(printf 's/__IO_LIB_ARGS/GCC_OPT += -DENABLE_NETMAP/g') 235 fi 236 sed -i -e "$FMT" $CUR_DIR/samples/$d/Makefile 237 fi 238 done 239} 240 241# Setup MOS library 242setup_mos_library() { 243 echo "Start building up the MOS library" 244 cd $CUR_DIR 245 246 if [[ $1 == $FL_DPDK ]]; then 247 cd $CUR_DIR/scripts/ 248 ./configure --enable-dpdk 249 elif [[ $1 == $FL_PCAP ]]; then 250 cd $CUR_DIR/scripts/ 251 ./configure --enable-pcap 252 elif [[ $1 == $FL_NETMAP ]]; then 253 cd $CUR_DIR/scripts/ 254 ./configure --enable-netmap 255 fi 256 cd $CUR_DIR/core/src 257 make clean;make 258 cd $CUR_DIR 259 create_makefile $1 260 echo 261 echo "----------------------------------------------------------" 262 echo "Done with MOS library setup" 263 echo "----------------------------------------------------------" 264 echo 265} 266 267############################################################################# 268 269############################### DPDK Utilities ############################## 270# Creates hugepage filesystem. 271create_mnt_huge() 272{ 273 echo "Creating /mnt/huge and mounting as hugetlbfs" 274 sudo mkdir -p /mnt/huge 275 276 grep -s '/mnt/huge' /proc/mounts > /dev/null 277 if [ $? -ne 0 ] ; then 278 sudo mount -t hugetlbfs nodev /mnt/huge 279 fi 280} 281 282# Removes hugepage filesystem. 283remove_mnt_huge() 284{ 285 echo "Unmounting /mnt/huge and removing directory" 286 grep -s '/mnt/huge' /proc/mounts > /dev/null 287 if [ $? -eq 0 ] ; then 288 sudo umount /mnt/huge 289 fi 290 291 if [ -d /mnt/huge ] ; then 292 sudo rm -R /mnt/huge 293 fi 294} 295 296# Unloads igb_uio.ko. 297remove_igb_uio_module() 298{ 299 echo "Unloading any existing DPDK UIO module" 300 /sbin/lsmod | grep -s igb_uio > /dev/null 301 if [ $? -eq 0 ] ; then 302 sudo /sbin/rmmod igb_uio 303 fi 304 305 /sbin/lsmod | grep -s dpdk_iface > /dev/null 306 if [ $? -eq 0 ] ; then 307 sudo /sbin/rmmod dpdk_iface.ko 308 fi 309} 310 311# Loads new igb_uio.ko (and uio module if needed). 312load_igb_uio_module() 313{ 314 if [ ! -f $RTE_SDK/$RTE_TARGET/kmod/igb_uio.ko ];then 315 echo "## ERROR: Target does not have the DPDK UIO Kernel Module." 316 echo " To fix, please try to rebuild target." 317 return 318 fi 319 320 if lsmod | grep igb_uio &> /dev/null ; then 321 : 322 else 323 /sbin/lsmod | grep -s uio > /dev/null 324 if [ $? -ne 0 ] ; then 325 modinfo uio > /dev/null 326 if [ $? -eq 0 ]; then 327 echo "Loading uio module" 328 sudo /sbin/modprobe uio 329 fi 330 fi 331 332 # UIO may be compiled into kernel, so it may not be an error if it can't 333 # be loaded. 334 echo "Loading DPDK UIO module" 335 sudo /sbin/insmod $RTE_SDK/$RTE_TARGET/kmod/igb_uio.ko 336 if [ $? -ne 0 ] ; then 337 echo "## ERROR: Could not load kmod/igb_uio.ko." 338 quit 339 fi 340 fi 341} 342 343# Removes all reserved hugepages. 344clear_numa_pages() 345{ 346 echo > .echo_tmp 347 for d in /sys/devices/system/node/node? ; do 348 echo "echo 0 > $d/hugepages/hugepages-2048kB/nr_hugepages" >> .echo_tmp 349 done 350 echo "Removing currently reserved hugepages" 351 sudo sh .echo_tmp 352 rm -f .echo_tmp 353 354 remove_mnt_huge 355} 356# Removes all reserved hugepages. 357clear_non_numa_pages() 358{ 359 echo > .echo_tmp 360 echo "echo 0 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages" > .echo_tmp 361 echo "Removing currently reserved hugepages" 362 sudo sh .echo_tmp 363 rm -f .echo_tmp 364 remove_mnt_huge 365} 366 367# 368# Creates hugepages. 369# 370set_non_numa_pages_default() 371{ 372 clear_non_numa_pages 373 echo > .echo_tmp 374 echo "Number of pages : 1024" 375 376 Pages=1024 377 echo "echo $Pages > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages" >> .echo_tmp 378 379 echo "Reserving hugepages" 380 sudo sh .echo_tmp 381 rm -f .echo_tmp 382 383 create_mnt_huge 384} 385 386# 387# Creates hugepages. 388# 389set_non_numa_pages() 390{ 391 392 clear_non_numa_pages 393 394 echo "" 395 echo " Input the number of 2MB pages" 396 echo " Example: to have 128MB of hugepages available, enter '64' to" 397 echo " reserve 64 * 2MB pages" 398 echo -n "Number of pages: " 399 read Pages 400 401 echo "echo $Pages > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages" > .echo_tmp 402 403 echo "Reserving hugepages" 404 sudo sh .echo_tmp 405 rm -f .echo_tmp 406 407 create_mnt_huge 408 409} 410 411# Creates hugepages on specific NUMA nodes. 412set_numa_pages_default() 413{ 414 clear_numa_pages 415 echo > .echo_tmp 416 for d in /sys/devices/system/node/node? ; do 417 node=$(basename $d) 418 echo "Number of pages for $node: 1024" 419 Pages=1024 420 echo "echo $Pages > $d/hugepages/hugepages-2048kB/nr_hugepages" >> .echo_tmp 421 done 422 echo "Reserving hugepages" 423 sudo sh .echo_tmp 424 rm -f .echo_tmp 425 426 create_mnt_huge 427} 428 429# Creates hugepages on specific NUMA nodes. 430set_numa_pages() 431{ 432 clear_numa_pages 433 echo "" 434 echo " Input the number of 2MB pages for each node" 435 echo " Example: to have 128MB of hugepages available per node," 436 echo " enter '64' to reserve 64 * 2MB pages on each node" 437 438 echo > .echo_tmp 439 for d in /sys/devices/system/node/node? ; do 440 node=$(basename $d) 441 echo -n "Number of pages for $node: " 442 read Pages 443 echo "echo $Pages > $d/hugepages/hugepages-2048kB/nr_hugepages" >> .echo_tmp 444 done 445 echo "Reserving hugepages" 446 sudo sh .echo_tmp 447 rm -f .echo_tmp 448 449 create_mnt_huge 450} 451 452# Uses dpdk-devbind.py to move devices to work with igb_uio 453bind_nics_to_igb_uio() 454{ 455 if /sbin/lsmod | grep -q igb_uio ; then 456 ${RTE_SDK}/usertools/dpdk-devbind.py --status 457 echo "" 458 echo "Enter PCI address of device(s) to bind to IGB UIO driver (e.g., \"04:00.0 04:00.1\")." 459 echo -n "> " 460 read PCI_PATH 461 462 463 sudo ${RTE_SDK}/usertools/dpdk-devbind.py -b igb_uio $PCI_PATH && echo "OK" 464 else 465 echo "# Please load the 'igb_uio' kernel module before querying or " 466 echo "# adjusting NIC device bindings" 467 fi 468 469 # Create interfaces 470 printf "Creating ${GREEN}dpdk$NC interface entries\n" 471 cd dpdk-iface-kmod 472 make 473 if lsmod | grep dpdk_iface &> /dev/null ; then 474 : 475 else 476 sudo insmod ./dpdk_iface.ko 477 fi 478 sudo -E make run 479 cd .. 480} 481 482# 483# Uses dpdk-devbind.py to move devices to work with kernel drivers again 484# 485unbind_nics() 486{ 487 DEVLIST=`ifconfig -s | grep -Eo '^[^ ]+' | tail -n+2` 488 for dev in $DEVLIST 489 do 490 echo $dev 491 if [[ "$dev" == dpdk* ]]; then 492 sudo ifconfig $dev down 493 fi 494 done 495 496 ${RTE_SDK}/usertools/dpdk-devbind.py --status 497 echo "" 498 echo -n "Enter PCI address of device to unbind: " 499 read PCI_PATH 500 echo "" 501 echo -n "Enter name of kernel driver to bind the device to: " 502 read DRV 503 sudo ${RTE_SDK}/usertools/dpdk-devbind.py -b $DRV $PCI_PATH && echo "OK" 504} 505 506# Brings up the interface of DPDK devices up 507setup_iface_dpdk() 508{ 509 # First check whether igb_uio module is already loaded 510 MODULE="igb_uio" 511 512 if sudo lsmod | grep "$MODULE" &> /dev/null ; then 513 echo "$MODULE is loaded!" 514 else 515 echo "$MODULE is not loaded!" 516 exit 1 517 fi 518 519 # set ip address for dpdk-enabled interfaces in the system 520 list=`basename -a /sys/class/net/dpdk*` 521 for if_name in ${list//\\n/ }; do 522 523 while [ 1 ]; do 524 echo 525 echo "[$if_name] enter IP address[/mask] (e.g., 10.0.0.1[/24])" 526 echo -n "> " 527 read line 528 ip_addr=`echo $line | awk -F '/' '{print $1}'` 529 mask=`echo $line | awk -F '/' '{print $2}'` 530 valid_ip_addr $ip_addr 531 if [ $? -eq 0 ]; then 532 break 533 fi 534 echo "invalid IP address!" # continue 535 done 536 537 if [ "$mask" == "" ];then 538 echo "sudo /sbin/ifconfig $if_name $ip_addr up" 539 sudo /sbin/ifconfig $if_name $ip_addr up 540 else 541 echo "sudo /sbin/ifconfig $if_name $ip_addr/$mask up" 542 sudo /sbin/ifconfig $if_name $ip_addr/$mask up 543 fi 544 done 545 546} 547############################################################################# 548 549############################### DPDK ######################################## 550step0_func_dpdk() 551{ 552 if [ -d "/sys/devices/system/node" ]; then 553 set_numa_pages_default 554 else 555 set_non_numa_pages_default 556 fi 557 558 step2_func_dpdk 559 step3_func_dpdk 560 step4_func_dpdk 561} 562step1_func_dpdk() 563{ 564 if [ -d "/sys/devices/system/node" ]; then 565 set_numa_pages 566 else 567 set_non_numa_pages 568 fi 569} 570step2_func_dpdk() 571{ 572 load_igb_uio_module 573 bind_nics_to_igb_uio 574} 575step3_func_dpdk() 576{ 577 setup_iface_dpdk $last_octet 578} 579step4_func_dpdk() 580{ 581 cd $CUR_DIR/samples 582 for d in * ; do 583 create_config $FL_DPDK "samples/$d/config" $d 584 done 585 echo 586 echo "------------------------------------------------" 587 echo "Done with configuration file setup." 588 echo "Use the arp command to add static ARP entries" 589 echo "------------------------------------------------" 590} 591step5_func_dpdk() 592{ 593 unbind_nics 594} 595step6_func_dpdk() 596{ 597 echo 598 exit 1 599} 600############################################################################# 601 602############################### PCAP ######################################## 603step0_func_pcap() 604{ 605 cd $CUR_DIR/samples 606 for d in * ; do 607 if [ -d $CUR_DIR/samples/$d/config ]; then 608 create_config $FL_PCAP "samples/$d/config" $d 609 fi 610 done 611 echo 612 echo "------------------------------------------------" 613 echo "Done with configuration file setup." 614 echo "Use the arp command to add static ARP entries" 615 echo "------------------------------------------------" 616 exit 1 617} 618############################################################################# 619 620############################## NETMAP ####################################### 621step0_func_netmap() 622{ 623 cd $CUR_DIR/samples 624 for d in * ; do 625 if [ -d $CUR_DIR/samples/$d/config ]; then 626 create_config $FL_NETMAP "samples/$d/config" $d 627 fi 628 done 629 echo 630 echo "------------------------------------------------" 631 echo "Done with configuration file setup." 632 echo "Use the arp command to add static ARP entries" 633 echo "------------------------------------------------" 634 exit 1 635} 636############################################################################# 637 638############################# Main Script ################################### 639# Get to script directory 640cd $(dirname ${BASH_SOURCE[0]})/ 641export CUR_DIR=$PWD 642kerver=$(uname -r) 643 644if [ "$1" == "--compile-dpdk" ]; then 645 # check if RTE_SDK and RTE_TARGET env variables exist 646 if [[ -z "${RTE_SDK}" ]]; then 647 printf "${RED}Please define RTE_SDK env variable first\n $NC" 648 exit 1 649 fi 650 if [[ -z "${RTE_TARGET}" ]]; then 651 printf "${RED}Please define RTE_TARGET env variable first\n $NC" 652 exit 1 653 fi 654 655 # First download dpdk 656 if [ -z "$(ls -A $PWD/drivers/dpdk)" ]; then 657 cd drivers 658 printf "${GREEN}Cloning dpdk...\n $NC" 659 git submodule init 660 git submodule update 661 cd .. 662 fi 663 664 vercomp $kerver "2.6.33" 665 # if kernel version < 2.6.33 666 if [ "$?" == "2" ]; then 667 echo "[note] current kerner version ("$kerver") does not support DPDK" 668 exit 1 669 fi 670 671 if grep "ldflags.txt" $RTE_SDK/mk/rte.app.mk > /dev/null 672 then 673 : 674 else 675 sed -i -e 's/O_TO_EXE_STR =/\$(shell if [ \! -d \${RTE_SDK}\/\${RTE_TARGET}\/lib ]\; then mkdir \${RTE_SDK}\/\${RTE_TARGET}\/lib\; fi)\nLINKER_FLAGS = \$(call linkerprefix,\$(LDLIBS))\n\$(shell echo \${LINKER_FLAGS} \> \${RTE_SDK}\/\${RTE_TARGET}\/lib\/ldflags\.txt)\nO_TO_EXE_STR =/g' $RTE_SDK/mk/rte.app.mk 676 fi 677 678 # Build and install DPDK library 679 export DESTDIR="." 680 echo 681 echo "Selected DPDK library to be used for MOS" 682 echo "----------------------------------------------------------" 683 echo " RTE_SDK exported as $RTE_SDK" 684 echo " RTE_TARGET exported as $RTE_TARGET" 685 echo "----------------------------------------------------------" 686 echo 687 echo -n "Press enter to continue ..."; read 688 cd $RTE_SDK 689 make install T=$RTE_TARGET 690 echo 691 echo -n "Done with DPDK setup. Press enter to start MOS setup ..."; read 692 # Build and compile MOS library 693 setup_mos_library $FL_DPDK 694 695elif [ "$1" == "--compile-pcap" ]; then 696 setup_mos_library $FL_PCAP 697 698elif [ "$1" == "--compile-netmap" ]; then 699 setup_mos_library $FL_NETMAP 700 701elif [ "$1" == "--run-dpdk" ]; then 702 # check if RTE_SDK and RTE_TARGET env variables exist 703 if [[ -z "${RTE_SDK}" ]]; then 704 printf "${RED}Please define RTE_SDK env variable first\n $NC" 705 exit 1 706 fi 707 if [[ -z "${RTE_TARGET}" ]]; then 708 printf "${RED}Please define RTE_TARGET env variable first\n $NC" 709 exit 1 710 fi 711 712 while [ 1 ]; do 713 clear 714 echo 715 echo "----------------------------------------------------------" 716 echo " Full setup (from start)" 717 echo "----------------------------------------------------------" 718 echo "[0] Full setup for running mOS with DPDK" 719 echo 720 echo "----------------------------------------------------------" 721 echo " Step-by-step setup for running mOS with DPDK" 722 echo "----------------------------------------------------------" 723 echo "[1] Setup hugepage mappings" 724 echo "[2] Load and bind Ethernet devices to IGB_UIO module" 725 echo "[3] Bring the interfaces up (DPDK devices)" 726 echo "[4] Create new MOS configuration files for sample apps" 727 echo "[5] Unbind dpdk-registered NICs" 728 echo 729 echo "[6] Exit script" 730 echo 731 echo -n "Option: " 732 read entry 733 if [ "$entry" ]; then 734 step"$entry"_func_dpdk 735 echo 736 echo -n "Press enter to continue ..."; read 737 fi 738 done 739 740elif [ "$1" == "--run-pcap" ]; then 741 while [ 1 ]; do 742 clear 743 echo 744 echo "----------------------------------------------------------" 745 echo " Full setup (from start)" 746 echo "----------------------------------------------------------" 747 step0_func_pcap 748 echo 749 echo -n "Press enter to continue ..."; read 750 done 751 752elif [ "$1" == "--run-netmap" ]; then 753 while [ 1 ]; do 754 clear 755 echo 756 echo "----------------------------------------------------------" 757 echo " Full setup (from start)" 758 echo "----------------------------------------------------------" 759 step0_func_netmap 760 echo 761 echo -n "Press enter to continue ..."; read 762 done 763 764elif [ "$1" == "--cleanup" ]; then 765 find | grep mos.conf | xargs rm -f 766 find | grep log__* | xargs rm -f 767 find | grep mos-master.conf | xargs rm -f 768 find | grep mos-slave.conf | xargs rm -f 769 770 for d in $CUR_DIR/samples/* ; do 771 cd $d 772 make clean > /dev/null 2> /dev/null 773 cd .. 774 done 775 cd .. 776 cd core/src 777 make clean > /dev/null 2> /dev/null 778 cd bpf 779 rm -rf *.o 780 cd .. 781 rm -rf .*.d 782 rm -f Makefile 783 cd ../.. 784 find ./samples/ -name 'Makefile' | xargs rm -f 785 rm -f scripts/config.log scripts/config.status 786 cd dpdk-iface-kmod/ 787 make clean 788 cd .. 789else 790 echo "[error] please specify one of the following options" 791 echo "--compile-dpdk : compile and build mOS library with dpdk" 792 echo "--compile-pcap : compile and build mOS library with pcap" 793 echo "--compile-netmap : compile and build mOS library with netmap" 794 echo "--run-dpdk : setup environments and configurations for running applications with dpdk" 795 echo "--run-pcap : setup environments and configurations for running applications with pcap" 796 echo "--run-netmap : setup environments and configurations for running applications with netmap" 797 echo "--cleanup : delete all binaries, config and Makefiles" 798fi 799