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