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 # Create & configure /dev/dpdk-iface 510 sudo rm -rf /dev/dpdk-iface 511 sudo mknod /dev/dpdk-iface c 1110 0 512 sudo chmod 666 /dev/dpdk-iface 513 514 # First check whether igb_uio module is already loaded 515 MODULE="igb_uio" 516 517 if sudo lsmod | grep "$MODULE" &> /dev/null ; then 518 echo "$MODULE is loaded!" 519 else 520 echo "$MODULE is not loaded!" 521 exit 1 522 fi 523 524 # set ip address for dpdk-enabled interfaces in the system 525 list=`basename -a /sys/class/net/dpdk*` 526 for if_name in ${list//\\n/ }; do 527 528 while [ 1 ]; do 529 echo 530 echo "[$if_name] enter IP address[/mask] (e.g., 10.0.0.1[/24])" 531 echo -n "> " 532 read line 533 ip_addr=`echo $line | awk -F '/' '{print $1}'` 534 mask=`echo $line | awk -F '/' '{print $2}'` 535 valid_ip_addr $ip_addr 536 if [ $? -eq 0 ]; then 537 break 538 fi 539 echo "invalid IP address!" # continue 540 done 541 542 if [ "$mask" == "" ];then 543 echo "sudo /sbin/ifconfig $if_name $ip_addr up" 544 sudo /sbin/ifconfig $if_name $ip_addr up 545 else 546 echo "sudo /sbin/ifconfig $if_name $ip_addr/$mask up" 547 sudo /sbin/ifconfig $if_name $ip_addr/$mask up 548 fi 549 done 550 551} 552############################################################################# 553 554############################### DPDK ######################################## 555step0_func_dpdk() 556{ 557 if [ -d "/sys/devices/system/node" ]; then 558 set_numa_pages_default 559 else 560 set_non_numa_pages_default 561 fi 562 563 step2_func_dpdk 564 step3_func_dpdk 565 step4_func_dpdk 566} 567step1_func_dpdk() 568{ 569 if [ -d "/sys/devices/system/node" ]; then 570 set_numa_pages 571 else 572 set_non_numa_pages 573 fi 574} 575step2_func_dpdk() 576{ 577 load_igb_uio_module 578 bind_nics_to_igb_uio 579} 580step3_func_dpdk() 581{ 582 setup_iface_dpdk $last_octet 583} 584step4_func_dpdk() 585{ 586 cd $CUR_DIR/samples 587 for d in * ; do 588 create_config $FL_DPDK "samples/$d/config" $d 589 done 590 echo 591 echo "------------------------------------------------" 592 echo "Done with configuration file setup." 593 echo "Use the arp command to add static ARP entries" 594 echo "------------------------------------------------" 595} 596step5_func_dpdk() 597{ 598 unbind_nics 599} 600step6_func_dpdk() 601{ 602 echo 603 exit 1 604} 605############################################################################# 606 607############################### PCAP ######################################## 608step0_func_pcap() 609{ 610 cd $CUR_DIR/samples 611 for d in * ; do 612 if [ -d $CUR_DIR/samples/$d/config ]; then 613 create_config $FL_PCAP "samples/$d/config" $d 614 fi 615 done 616 echo 617 echo "------------------------------------------------" 618 echo "Done with configuration file setup." 619 echo "Use the arp command to add static ARP entries" 620 echo "------------------------------------------------" 621 exit 1 622} 623############################################################################# 624 625############################## NETMAP ####################################### 626step0_func_netmap() 627{ 628 cd $CUR_DIR/samples 629 for d in * ; do 630 if [ -d $CUR_DIR/samples/$d/config ]; then 631 create_config $FL_NETMAP "samples/$d/config" $d 632 fi 633 done 634 echo 635 echo "------------------------------------------------" 636 echo "Done with configuration file setup." 637 echo "Use the arp command to add static ARP entries" 638 echo "------------------------------------------------" 639 exit 1 640} 641############################################################################# 642 643############################# Main Script ################################### 644# Get to script directory 645cd $(dirname ${BASH_SOURCE[0]})/ 646export CUR_DIR=$PWD 647kerver=$(uname -r) 648 649if [ "$1" == "--compile-dpdk" ]; then 650 # check if RTE_SDK and RTE_TARGET env variables exist 651 if [[ -z "${RTE_SDK}" ]]; then 652 printf "${RED}Please define RTE_SDK env variable first\n $NC" 653 exit 1 654 fi 655 if [[ -z "${RTE_TARGET}" ]]; then 656 printf "${RED}Please define RTE_TARGET env variable first\n $NC" 657 exit 1 658 fi 659 660 # First download dpdk 661 if [ -z "$(ls -A $PWD/drivers/dpdk)" ]; then 662 cd drivers 663 printf "${GREEN}Cloning dpdk...\n $NC" 664 git submodule init 665 git submodule update 666 cd .. 667 fi 668 669 vercomp $kerver "2.6.33" 670 # if kernel version < 2.6.33 671 if [ "$?" == "2" ]; then 672 echo "[note] current kerner version ("$kerver") does not support DPDK" 673 exit 1 674 fi 675 676 if grep "ldflags.txt" $RTE_SDK/mk/rte.app.mk > /dev/null 677 then 678 : 679 else 680 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 681 fi 682 683 # Build and install DPDK library 684 export DESTDIR="." 685 echo 686 echo "Selected DPDK library to be used for MOS" 687 echo "----------------------------------------------------------" 688 echo " RTE_SDK exported as $RTE_SDK" 689 echo " RTE_TARGET exported as $RTE_TARGET" 690 echo "----------------------------------------------------------" 691 echo 692 echo -n "Press enter to continue ..."; read 693 cd $RTE_SDK 694 make install T=$RTE_TARGET 695 echo 696 echo -n "Done with DPDK setup. Press enter to start MOS setup ..."; read 697 # Build and compile MOS library 698 setup_mos_library $FL_DPDK 699 700elif [ "$1" == "--compile-pcap" ]; then 701 setup_mos_library $FL_PCAP 702 703elif [ "$1" == "--compile-netmap" ]; then 704 setup_mos_library $FL_NETMAP 705 706elif [ "$1" == "--run-dpdk" ]; then 707 # check if RTE_SDK and RTE_TARGET env variables exist 708 if [[ -z "${RTE_SDK}" ]]; then 709 printf "${RED}Please define RTE_SDK env variable first\n $NC" 710 exit 1 711 fi 712 if [[ -z "${RTE_TARGET}" ]]; then 713 printf "${RED}Please define RTE_TARGET env variable first\n $NC" 714 exit 1 715 fi 716 717 while [ 1 ]; do 718 clear 719 echo 720 echo "----------------------------------------------------------" 721 echo " Full setup (from start)" 722 echo "----------------------------------------------------------" 723 echo "[0] Full setup for running mOS with DPDK" 724 echo 725 echo "----------------------------------------------------------" 726 echo " Step-by-step setup for running mOS with DPDK" 727 echo "----------------------------------------------------------" 728 echo "[1] Setup hugepage mappings" 729 echo "[2] Load and bind Ethernet devices to IGB_UIO module" 730 echo "[3] Bring the interfaces up (DPDK devices)" 731 echo "[4] Create new MOS configuration files for sample apps" 732 echo "[5] Unbind dpdk-registered NICs" 733 echo 734 echo "[6] Exit script" 735 echo 736 echo -n "Option: " 737 read entry 738 if [ "$entry" ]; then 739 step"$entry"_func_dpdk 740 echo 741 echo -n "Press enter to continue ..."; read 742 fi 743 done 744 745elif [ "$1" == "--run-pcap" ]; then 746 while [ 1 ]; do 747 clear 748 echo 749 echo "----------------------------------------------------------" 750 echo " Full setup (from start)" 751 echo "----------------------------------------------------------" 752 step0_func_pcap 753 echo 754 echo -n "Press enter to continue ..."; read 755 done 756 757elif [ "$1" == "--run-netmap" ]; then 758 while [ 1 ]; do 759 clear 760 echo 761 echo "----------------------------------------------------------" 762 echo " Full setup (from start)" 763 echo "----------------------------------------------------------" 764 step0_func_netmap 765 echo 766 echo -n "Press enter to continue ..."; read 767 done 768 769elif [ "$1" == "--cleanup" ]; then 770 find | grep mos.conf | xargs rm -f 771 find | grep log__* | xargs rm -f 772 find | grep mos-master.conf | xargs rm -f 773 find | grep mos-slave.conf | xargs rm -f 774 775 for d in $CUR_DIR/samples/* ; do 776 cd $d 777 make clean > /dev/null 2> /dev/null 778 cd .. 779 done 780 cd .. 781 cd core/src 782 make clean > /dev/null 2> /dev/null 783 cd bpf 784 rm -rf *.o 785 cd .. 786 rm -rf .*.d 787 rm -f Makefile 788 cd ../.. 789 find ./samples/ -name 'Makefile' | xargs rm -f 790 rm -f scripts/config.log scripts/config.status 791 cd dpdk-iface-kmod/ 792 make clean 793 cd .. 794else 795 echo "[error] please specify one of the following options" 796 echo "--compile-dpdk : compile and build mOS library with dpdk" 797 echo "--compile-pcap : compile and build mOS library with pcap" 798 echo "--compile-netmap : compile and build mOS library with netmap" 799 echo "--run-dpdk : setup environments and configurations for running applications with dpdk" 800 echo "--run-pcap : setup environments and configurations for running applications with pcap" 801 echo "--run-netmap : setup environments and configurations for running applications with netmap" 802 echo "--cleanup : delete all binaries, config and Makefiles" 803fi 804