diff options
Diffstat (limited to 'examples/l4fwd/test/config.sh')
-rw-r--r-- | examples/l4fwd/test/config.sh | 342 |
1 files changed, 228 insertions, 114 deletions
diff --git a/examples/l4fwd/test/config.sh b/examples/l4fwd/test/config.sh index fef8fda..eeb9476 100644 --- a/examples/l4fwd/test/config.sh +++ b/examples/l4fwd/test/config.sh @@ -9,17 +9,28 @@ DPDK_PORT=0 TCP_PORT=6000 # local interface addresses to set -LOCAL_IPV4=192.168.1.60 -LOCAL_IPV6=fd12:3456:789a:0001:0000:0000:0000:0060 +L4FWD_IPV4=192.168.2.60 +L4FWD_IPV6=fd12:3456:789a:0002:0000:0000:0000:0060 # remote interface addresses to set -REMOTE_IPV4=192.168.1.64 -REMOTE_IPV6=fd12:3456:789a:0001:0000:0000:0000:0064 +LINUX_IPV4=192.168.2.64 +LINUX_IPV6=fd12:3456:789a:0002:0000:0000:0000:0064 # mask length for addresses of each IP version MASK_IPV4=24 MASK_IPV6=64 +# Interface tap/remote +IFACE="" + +# should tap mode be used (1 - use tap interface, 0 - use real NIC) +USE_TAP=0 + +# MAC address for tap interface - filled when tap is created +LINUX_MAC="00:64:74:61:70:30" +# fake MAC address to provide in neighbours +FAKE_MAC="00:64:74:61:70:33" + # name of the config files for backend and frontend of l4fwd app L4FWD_BE_CFG_FILE=$(mktemp) L4FWD_FE_CFG_FILE=$(mktemp) @@ -40,6 +51,15 @@ then exit 127 fi +# set interface based on mode used +if [[ "${ETH_DEV}" == "tap" ]] +then + IFACE=l4fwd_tap0 + USE_TAP=1 +else + IFACE=${REMOTE_IFACE} +fi + # check if L4FWD_PATH points to an executable if [[ ! -x ${L4FWD_PATH} ]] then @@ -47,23 +67,27 @@ then exit 127 fi -# check if REMOTE_HOST is reachable -ssh ${REMOTE_HOST} echo -st=$? -if [[ $st -ne 0 ]] +# neccesary check for real NIC mode +if [[ ${USE_TAP} -eq 0 ]] then - echo "host ${REMOTE_HOST} is not reachable" - exit $st -fi + # check if REMOTE_HOST is reachable + ssh ${REMOTE_HOST} echo + st=$? + if [[ $st -ne 0 ]] + then + echo "host ${REMOTE_HOST} is not reachable" + exit $st + fi -# get ethernet address of REMOTE_HOST -REMOTE_MAC=$(ssh ${REMOTE_HOST} ip addr show dev ${REMOTE_IFACE}) -st=$? -REMOTE_MAC=$(echo ${REMOTE_MAC} | sed -e 's/^.*ether //' -e 's/ brd.*$//') -if [[ $st -ne 0 || -z "${REMOTE_MAC}" ]] -then - echo "could not retrive ethernet address from ${REMOTE_IFACE}" - exit 127 + # get ethernet address of REMOTE_HOST + LINUX_MAC=$(ssh ${REMOTE_HOST} ip addr show dev ${IFACE}) + st=$? + LINUX_MAC=$(echo ${LINUX_MAC} | sed -e 's/^.*ether //' -e 's/ brd.*$//') + if [[ $st -ne 0 || -z "${LINUX_MAC}" ]] + then + echo "could not retrive ethernet address from ${IFACE}" + exit 127 + fi fi # check if FECORE is set - default 0 @@ -87,8 +111,22 @@ else L4FWD_LCORE="${L4FWD_FECORE}" fi +L4FWD_TAP="" + +# set eal parameters specific for mode used +if [[ ${USE_TAP} -eq 0 ]] +then + L4FWD_DEV="${ETH_DEV}" +else + L4FWD_DEV="--no-pci --vdev=\"net_tap0,iface=${IFACE},\ +mac=\"${LINUX_MAC}\"\"" +fi + # set EAL parameters -L4FWD_CMD_EAL_PRM="--lcores='${L4FWD_LCORE}' -n 4 ${ETH_DEV}" +L4FWD_CMD_EAL_PRM="--lcores='${L4FWD_LCORE}' -n 4 ${L4FWD_DEV}" + +# interface to wait for until it is set up properly +L4FWD_WAIT_VDEV="${IFACE}" # l4fwd parameters (listen, TCP only, enable arp, promiscuous) L4FWD_CMD_PRM="--listen --tcp --enable-arp --promisc ${L4FWD_STREAMS}" @@ -100,21 +138,31 @@ L4FWD_CONFIG="--fecfg ${L4FWD_FE_CFG_FILE} --becfg ${L4FWD_BE_CFG_FILE}" if [[ ${ipv4} -eq 1 ]] then L4FWD_PORT_PRM="port=${DPDK_PORT},lcore=${L4FWD_BECORE},rx_offload=0x0\ -,tx_offload=0x0,ipv4=${LOCAL_IPV4}" +,tx_offload=0x0,ipv4=${L4FWD_IPV4}" elif [[ ${ipv6} -eq 1 ]] then L4FWD_PORT_PRM="port=${DPDK_PORT},lcore=${L4FWD_BECORE},rx_offload=0x0\ -,tx_offload=0x0,ipv6=${LOCAL_IPV6}" +,tx_offload=0x0,ipv6=${L4FWD_IPV6}" fi # other variables-------------------------------------------------------------- +# function to run command with ssh <remote> if needed +use_ssh() +{ + if [[ ${USE_TAP} -eq 1 ]] + then + "$@" + else + ssh ${REMOTE_HOST} "$*" + fi +} + # check if directories on remote are set, if not make one -ssh ${REMOTE_HOST} mkdir -p {${REMOTE_OUTDIR},${REMOTE_RESDIR}} +use_ssh mkdir -p {${REMOTE_OUTDIR},${REMOTE_RESDIR}} # <tc qdisc ... netem ...> instruction to set -netem="ssh ${REMOTE_HOST} tc qdisc add dev ${REMOTE_IFACE} \ -root netem limit 100000" +netem="tc qdisc add dev ${IFACE} root netem limit 100000" # setting for scp which suppresses output of scp when not in verbose mode if [[ ${verbose} -eq 1 ]] @@ -135,12 +183,13 @@ fi # set address to use by netcat if [[ ${ipv4} -eq 1 ]] then - nc_addr=${LOCAL_IPV4} + nc_addr=${L4FWD_IPV4} elif [[ ${ipv6} -eq 1 ]] then - nc_addr=${LOCAL_IPV6} + nc_addr=${L4FWD_IPV6} fi +# calculate network address let "ipv4_elem=(${MASK_IPV4}/8)" let "ipv6_elem=(${MASK_IPV6}/16)" let "ipv4_elem_rev=4-${ipv4_elem}" @@ -151,9 +200,18 @@ while [[ ${ipv4_elem_rev} -ne 0 ]]; do let "ipv4_elem_rev=${ipv4_elem_rev}-1" done -ipv4_network=$(echo ${REMOTE_IPV4} | cut -d. -f-${ipv4_elem} | \ +ipv4_network=$(echo ${LINUX_IPV4} | cut -d. -f-${ipv4_elem} | \ sed 's#.*#&'"${ipv4_append}"'#') -ipv6_network=$(echo ${REMOTE_IPV6} | cut -d: -f-${ipv6_elem} | sed 's#.*#&::#') +ipv6_network=$(echo ${LINUX_IPV6} | cut -d: -f-${ipv6_elem} | sed 's#.*#&::#') + +# create temporary result file for tap mode, and/or set common file name +if [[ ${USE_TAP} -eq 0 ]] +then + common_result_file="${REMOTE_RESDIR}/results.out" +else + > ${local_result_file} + common_result_file=${local_result_file} +fi # helper functions------------------------------------------------------------- @@ -174,18 +232,33 @@ update_results() it=$3 # get only 'real' time in results file - $(ssh ${REMOTE_HOST} "awk '/real/{print \$2}' \ - ${REMOTE_RESDIR}/${file}.result.${it} \ - >> ${REMOTE_RESDIR}/results.out") + if [[ ${USE_TAP} -eq 0 ]] + then + $(ssh ${REMOTE_HOST} "awk '/real/{print \$2}' \ +${REMOTE_RESDIR}/${file}.result.${it} >> ${common_result_file}") + else + awk '/real/{print $2}' ${REMOTE_RESDIR}/${file}.result.${it} \ + >> ${common_result_file} + fi # add file and status of test to results if [[ ${status} -ne 0 ]] then - $(ssh ${REMOTE_HOST} "sed -i '$ s_.*_[FAIL]\t&_' \ - ${REMOTE_RESDIR}/results.out") + if [[ ${USE_TAP} -eq 0 ]] + then + $(ssh ${REMOTE_HOST} "sed -i '$ s_.*_[FAIL]\t&_' \ +${common_result_file}") + else + sed -i '$ s_.*_[FAIL]\t&_' ${common_result_file} + fi else - $(ssh ${REMOTE_HOST} "sed -i '$ s_.*_[OK]\t&_' \ - ${REMOTE_RESDIR}/results.out") + if [[ ${USE_TAP} -eq 0 ]] + then + $(ssh ${REMOTE_HOST} "sed -i '$ s_.*_[OK]\t&_' \ +${common_result_file}") + else + sed -i '$ s_.*_[OK]\t&_' ${common_result_file} + fi fi length=$(expr length "${file}") @@ -196,13 +269,21 @@ update_results() tab="\t" fi - $(ssh ${REMOTE_HOST} "sed -i '$ s_.*_${file}${tab}&_' \ - ${REMOTE_RESDIR}/results.out") + if [[ ${USE_TAP} -eq 0 ]] + then + $(ssh ${REMOTE_HOST} "sed -i '$ s_.*_${file}${tab}&_' \ +${common_result_file}") + else + sed -i "$ s_.*_${file}${tab}&_" ${common_result_file} + fi } # start l4fwd app l4fwd_start() { + # make configuration files for be/fe + configure_be_fe + # create temporary file for command running l4fwd L4FWD_EXEC_FILE=$(mktemp) @@ -229,6 +310,20 @@ EOF rm -f ${L4FWD_EXEC_FILE} exit 127 fi + + if [[ ${USE_TAP} -eq 1 ]] + then + # check if tap interface is up + i=0 + st=1 + while [[ ${i} -ne 5 && ${st} -ne 0 ]] + do + sleep 1 + ip link show dev ${L4FWD_WAIT_VDEV} > /dev/null 2>&1 + st=$? + let i++ + done + fi } # stop l4fwd app @@ -236,7 +331,7 @@ l4fwd_stop() { # kill runnning l4fwd app kill -s SIGINT ${L4FWD_PID} - + sleep 1 # remove temporary files rm -f ${L4FWD_EXEC_FILE} rm -f ${L4FWD_FE_CFG_FILE} @@ -246,13 +341,8 @@ l4fwd_stop() # helper function to set netem on remote setup_netem() { - # remove netem settings from remote interface if any - check_netem=$(ssh ${REMOTE_HOST} "tc qdisc show dev \ - ${REMOTE_IFACE} | grep netem") - if [[ -n ${check_netem} ]] - then - ssh ${REMOTE_HOST} tc qdisc del dev ${REMOTE_IFACE} root - fi + # remove netem settings from interface + use_ssh tc qdisc del dev ${IFACE} root # set default delay for reorder if [[ ${reorder} -ne 0 && ${delay} -eq 0 ]] @@ -284,35 +374,42 @@ setup_netem() netem="${netem} reorder 100% gap ${reorder}" fi - # set netem on remote - ${netem} + # set netem + use_ssh ${netem} # visual break of the output if_verbose echo -e "\nNetwork rules on remote set to:" # print current netem settings - if_verbose ssh ${REMOTE_HOST} tc qdisc show dev ${REMOTE_IFACE} + if_verbose use_ssh tc qdisc show dev ${IFACE} } -# configure IPv4 remote machine -configure_ip4_remote() +# configure IPv4 interface +configure_l4fwd_ip4() { # visual break of the output - if_verbose echo "Setting interface on remote" + if_verbose echo "Setting IPv4 interface" # set remote interface with correct IP address - ssh ${REMOTE_HOST} ip link set ${REMOTE_IFACE} down - ssh ${REMOTE_HOST} ip addr flush dev ${REMOTE_IFACE} - ssh ${REMOTE_HOST} ip addr add ${REMOTE_IPV4}/${MASK_IPV4} \ - dev ${REMOTE_IFACE} - ssh ${REMOTE_HOST} ip link set ${REMOTE_IFACE} up - if_verbose ssh ${REMOTE_HOST} ip addr show dev ${REMOTE_IFACE} - - ssh ${REMOTE_HOST} ip neigh flush dev ${REMOTE_IFACE} - ssh ${REMOTE_HOST} iptables --flush + if [[ ${USE_TAP} -eq 0 ]] + then + ssh ${REMOTE_HOST} ip link set ${IFACE} down + ssh ${REMOTE_HOST} ip addr flush dev ${IFACE} + ssh ${REMOTE_HOST} ip addr add ${LINUX_IPV4}/${MASK_IPV4} \ +dev ${IFACE} + ssh ${REMOTE_HOST} ip link set ${IFACE} up + ssh ${REMOTE_HOST} ip neigh flush dev ${IFACE} + else + ip addr add ${LINUX_IPV4}/${MASK_IPV4} dev ${IFACE} + ip link set ${IFACE} up + ip neigh flush dev ${IFACE} + ip neigh add ${L4FWD_IPV4} dev ${IFACE} lladdr ${FAKE_MAC} + fi - ssh ${REMOTE_HOST} ip route change ${ipv4_network}/${MASK_IPV4} dev \ - ${REMOTE_IFACE} rto_min 30ms + use_ssh iptables --flush + use_ssh ip route change ${ipv4_network}/${MASK_IPV4} dev ${IFACE} \ +rto_min 30ms + if_verbose use_ssh ip addr show dev ${IFACE} # construct <tc qdisc ... nete ...> instruction if [[ set_netem -eq 1 ]] @@ -324,32 +421,40 @@ configure_ip4_remote() sleep 1 } -# configure IPv6 remote machine -configure_ip6_remote() +# configure IPv6 interface +configure_l4fwd_ip6() { # visual break of the output - if_verbose echo "Setting interface on remote" + if_verbose echo "Setting IPv6 interface" # set remote interface with correct IP address - ssh ${REMOTE_HOST} ip link set ${REMOTE_IFACE} down - ssh ${REMOTE_HOST} sysctl -q -w \ - net.ipv6.conf.${REMOTE_IFACE}.disable_ipv6=0 - ssh ${REMOTE_HOST} ip addr flush dev ${REMOTE_IFACE} - ssh ${REMOTE_HOST} ip -6 addr add ${REMOTE_IPV6}/${MASK_IPV6} \ - dev ${REMOTE_IFACE} - ssh ${REMOTE_HOST} ip -6 link set ${REMOTE_IFACE} up - if_verbose ssh ${REMOTE_HOST} ip addr show dev ${REMOTE_IFACE} - - ssh ${REMOTE_HOST} ip neigh flush dev ${REMOTE_IFACE} - ssh ${REMOTE_HOST} ip -6 neigh add ${LOCAL_IPV6} dev ${REMOTE_IFACE} \ - lladdr ${LOCAL_MAC} - ssh ${REMOTE_HOST} iptables --flush - ssh ${REMOTE_HOST} ip6tables --flush - - ssh ${REMOTE_HOST} ip route change ${ipv6_network}/${MASK_IPV6} dev \ - ${REMOTE_IFACE} proto kernel metric 256 rto_min 30ms - - ssh ${REMOTE_HOST} ip -6 route show + if [[ ${USE_TAP} -eq 0 ]] + then + ssh ${REMOTE_HOST} ip link set ${IFACE} down + ssh ${REMOTE_HOST} sysctl -q -w \ +net.ipv6.conf.${IFACE}.disable_ipv6=0 + ssh ${REMOTE_HOST} ip addr flush dev ${IFACE} + ssh ${REMOTE_HOST} ip -6 addr add ${LINUX_IPV6}/${MASK_IPV6} \ +dev ${IFACE} + ssh ${REMOTE_HOST} ip -6 link set ${IFACE} up + ssh ${REMOTE_HOST} ip neigh flush dev ${IFACE} + ssh ${REMOTE_HOST} ip -6 neigh add ${L4FWD_IPV6} dev ${IFACE} \ +lladdr ${LOCAL_MAC} + else + sysctl -q -w net.ipv6.conf.${IFACE}.disable_ipv6=0 + ip addr flush dev ${IFACE} + ip -6 addr add ${LINUX_IPV6}/${MASK_IPV6} dev ${IFACE} + ip -6 link set ${IFACE} up + ip neigh flush dev ${IFACE} + ip -6 neigh add ${L4FWD_IPV6} dev ${IFACE} lladdr ${FAKE_MAC} + fi + + use_ssh iptables --flush + use_ssh ip6tables --flush + + use_ssh ip route change ${ipv6_network}/${MASK_IPV6} dev \ +${IFACE} proto kernel metric 256 rto_min 30ms + if_verbose use_ssh ip addr show dev ${IFACE} # construct <tc qdisc ... nete ...> instruction if [[ set_netem -eq 1 ]] @@ -357,36 +462,25 @@ configure_ip6_remote() setup_netem fi - # give linux 1 sec to handle all network settings - sleep 1 + # give linux 3 sec to handle all network settings + sleep 3 } -# configure remote -configure_remote() + +# configure tap interfaces +configure_interfaces() { # call proper configuration if [[ ${ipv4} -eq 1 ]] then - configure_ip4_remote - - if_verbose echo -e "\nBE configuration:" - config4_be - - if_verbose echo -e "\nFE configuration:" - config4_fe + configure_l4fwd_ip4 elif [[ ${ipv6} -eq 1 ]] then - configure_ip6_remote - - if_verbose echo -e "\nBE configuration:" - config6_be - - if_verbose echo -e "\nFE configuration:" - config6_fe + configure_l4fwd_ip6 fi # create empty results file on remote - $(ssh ${REMOTE_HOST} "> ${REMOTE_RESDIR}/results.out") + $(ssh ${REMOTE_HOST} "> ${common_result_file}") } # restore netem settings to default @@ -394,21 +488,41 @@ restore_netem() { if [[ ${set_netem} -eq 1 ]] then - ssh ${REMOTE_HOST} tc qdisc del dev ${REMOTE_IFACE} root + use_ssh tc qdisc del dev ${IFACE} root fi } # remove created directories after test is done remove_directories() { - ssh ${REMOTE_HOST} rm -fr ${REMOTE_DIR} + use_ssh rm -fr ${REMOTE_DIR} } # configuration of be/fe config------------------------------------------------ +configure_be_fe() +{ + # call proper configuration + if [[ ${ipv4} -eq 1 ]] + then + if_verbose echo -e "\nBE configuration:" + config4_be + + if_verbose echo -e "\nFE configuration:" + config4_fe + elif [[ ${ipv6} -eq 1 ]] + then + if_verbose echo -e "\nBE configuration:" + config6_be + + if_verbose echo -e "\nFE configuration:" + config6_fe + fi +} + config4_be() { - cat <<EOF > ${L4FWD_BE_CFG_FILE} -port=${DPDK_PORT},masklen=${MASK_IPV4},addr=${REMOTE_IPV4},mac=${REMOTE_MAC} + cat <<EOF > ${L4FWD_BE_CFG_FILE} +port=${DPDK_PORT},masklen=${MASK_IPV4},addr=${LINUX_IPV4},mac=${LINUX_MAC} EOF if_verbose cat ${L4FWD_BE_CFG_FILE} @@ -416,8 +530,8 @@ EOF config6_be() { - cat <<EOF > ${L4FWD_BE_CFG_FILE} -port=${DPDK_PORT},masklen=${MASK_IPV6},addr=${REMOTE_IPV6},mac=${REMOTE_MAC} + cat <<EOF > ${L4FWD_BE_CFG_FILE} +port=${DPDK_PORT},masklen=${MASK_IPV6},addr=${LINUX_IPV6},mac=${LINUX_MAC} EOF if_verbose cat ${L4FWD_BE_CFG_FILE} @@ -426,8 +540,8 @@ EOF config4_fe() { cat <<EOF > ${L4FWD_FE_CFG_FILE} -lcore=${L4FWD_FECORE},belcore=${L4FWD_BECORE},op=echo,laddr=${LOCAL_IPV4}\ -,lport=${TCP_PORT},raddr=${REMOTE_IPV4},rport=0 +lcore=${L4FWD_FECORE},belcore=${L4FWD_BECORE},op=echo,laddr=${L4FWD_IPV4}\ +,lport=${TCP_PORT},raddr=${LINUX_IPV4},rport=0 EOF if_verbose cat ${L4FWD_FE_CFG_FILE} @@ -436,8 +550,8 @@ EOF config6_fe() { cat <<EOF > ${L4FWD_FE_CFG_FILE} -lcore=${L4FWD_FECORE},belcore=${L4FWD_BECORE},op=echo,laddr=${LOCAL_IPV6}\ -,lport=${TCP_PORT},raddr=${REMOTE_IPV6},rport=0 +lcore=${L4FWD_FECORE},belcore=${L4FWD_BECORE},op=echo,laddr=${L4FWD_IPV6}\ +,lport=${TCP_PORT},raddr=${LINUX_IPV6},rport=0 EOF if_verbose cat ${L4FWD_FE_CFG_FILE} |