xref: /mOS-networking-stack/setup.sh (revision d270d183)
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