Hi Doron, On 15:03 Mon 21 Sep , Doron Shoham wrote: > Add ibcheckroutes script.
Wouldn't it be better to implement this using C program with help of newly introduced libibnetdisc library? Saving all subsequent ibtracert calls should improve performance dramatically. Other comments are below. > ibcheckroutes validates route between all leaf switches, switches or > CAs in the fabric. > > Signed-off-by: Doron Shoham <[email protected]> > --- > infiniband-diags/Makefile.am | 4 +- > infiniband-diags/configure.in | 1 + > infiniband-diags/man/ibcheckroutes.8 | 46 ++++++++++ > infiniband-diags/scripts/ibcheckroutes.in | 138 > +++++++++++++++++++++++++++++ > 4 files changed, 187 insertions(+), 2 deletions(-) > create mode 100644 infiniband-diags/man/ibcheckroutes.8 > create mode 100644 infiniband-diags/scripts/ibcheckroutes.in > > diff --git a/infiniband-diags/Makefile.am b/infiniband-diags/Makefile.am > index 1cdb60e..57363c4 100644 > --- a/infiniband-diags/Makefile.am > +++ b/infiniband-diags/Makefile.am > @@ -33,7 +33,7 @@ sbin_SCRIPTS = scripts/ibcheckerrs scripts/ibchecknet > scripts/ibchecknode \ > scripts/iblinkinfo.pl scripts/ibprintswitch.pl \ > scripts/ibprintca.pl scripts/ibprintrt.pl \ > scripts/ibfindnodesusing.pl scripts/ibidsverify.pl \ > - scripts/check_lft_balance.pl > + scripts/check_lft_balance.pl scripts/ibcheckroutes > > noinst_LIBRARIES = libcommon.a > > @@ -76,7 +76,7 @@ man_MANS = man/ibaddr.8 man/ibcheckerrors.8 > man/ibcheckerrs.8 \ > man/ibprintswitch.8 man/ibprintca.8 man/ibfindnodesusing.8 \ > man/ibdatacounts.8 man/ibdatacounters.8 \ > man/ibrouters.8 man/ibprintrt.8 man/ibidsverify.8 \ > - man/check_lft_balance.8 > + man/check_lft_balance.8 man/ibcheckroutes.8 > > BUILT_SOURCES = ibdiag_version > ibdiag_version: > diff --git a/infiniband-diags/configure.in b/infiniband-diags/configure.in > index 3ef35cc..aa178c5 100644 > --- a/infiniband-diags/configure.in > +++ b/infiniband-diags/configure.in > @@ -158,6 +158,7 @@ AC_CONFIG_FILES([\ > scripts/ibcheckportwidth \ > scripts/ibcheckstate \ > scripts/ibcheckwidth \ > + scripts/ibcheckroutes \ > scripts/ibclearcounters \ > scripts/ibclearerrors \ > scripts/ibdatacounts \ > diff --git a/infiniband-diags/man/ibcheckroutes.8 > b/infiniband-diags/man/ibcheckroutes.8 > new file mode 100644 > index 0000000..fe6f0d6 > --- /dev/null > +++ b/infiniband-diags/man/ibcheckroutes.8 > @@ -0,0 +1,46 @@ > +.TH IBCHECKROUTES 8 "September 10, 2009" "OpenIB" "OpenIB Diagnostics" > + > +.SH NAME > +ibcheckroutes \- validate routes between all hosts in fabric > + > +.SH SYNOPSIS > +.B ibcheckroutes > +[\-l] [\-s] [\-c] [\-n topology-file ] [\-h] [\-N] [\-b] [\-e] [\-C ca_name] > [\-P ca_port] [\-t(imeout) timeout_ms] > + > +.SH DESCRIPTION > +.PP > +ibcheckroutes is a script which can use a full topology file that was > created by ibnetdiscover or > +scans the subnet. Then it validates routes between all leaf switches, > switches or CAs in the fabric. > + > +.SH OPTIONS > +.PP > +\-n Use topology-file. > +.PP > +\-l Check routes between all leaf switches. > +.PP > +\-s Check routes between all switches. > +.PP > +\-c Check routes between all CAs. > +.PP > +\-h Show help. > +.PP > +\-N Use mono rather than color mode. > +.PP > +\-b Suppress output. > +.PP > +\-e Show errors only. > +.PP > +\-C <ca_name> Use the specified ca_name. > +.PP > +\-P <ca_port> Use the specified ca_port. > +.PP > +\-t <timeout_ms> Override the default timeout for the solicited mads. > + > +.SH SEE ALSO > +.BR ibnetdiscover(8), > +.BR ibtracert(8) > + > +.SH AUTHOR > +.TP > +Doron Shoham > +.RI < [email protected] > > diff --git a/infiniband-diags/scripts/ibcheckroutes.in > b/infiniband-diags/scripts/ibcheckroutes.in > new file mode 100644 > index 0000000..c7dd191 > --- /dev/null > +++ b/infiniband-diags/scripts/ibcheckroutes.in > @@ -0,0 +1,138 @@ > +#!/bin/sh By using '/bin/sh' the script is declared as 'sh' compatible, but below we can find that 'bash' extensions are used intensively. > + > +IBPATH=${IBPATH:-...@ibscriptpath@} > + > +function usage() { > + echo -e Usage: `basename $0` "[-l] [-s] [-c] [-h] [-N] [-b] [-e] [-n > topology-file ] \ > +[-C ca_name] [-P ca_port] [-t(imeout) timeout_ms]" > + echo -e " Validate routes between all leaf switches, switches or CAs > in the fabric" > + echo -e " -n - Use topology-file" > + echo -e " -l - Check routes between all leaf switches" > + echo -e " -s - Check routes between all switches" > + echo -e " -c - Check routes between all CAs" > + echo -e " -h - Show help" > + echo -e " -N - Use mono rather than color mode" > + echo -e " -b - Suppress output" > + echo -e " -e - Show errors only" > + echo -e " -C - Use the specified ca_name" > + echo -e " -P - Use the specified ca_port" > + echo -e " -t - Override the default timeout for the solicited mads" > + exit -1 > +} > + > +function user_abort() { > + echo "Aborted" > + exit 1 > +} > + > +function green() { > + if [ "$bw" = "yes" ]; then > + printf "${res_col}[OK]\n" $1 > + return > + fi > + printf "\033[1;032m${res_col}[OK]\033[0;39m\n" $1 > +} > + > +function red() { > + if [ "$bw" = "yes" ]; then > + printf "${res_col}[FAILED]\n" "$1" > + return > + fi > + printf "\033[31m${res_col}[FAILED]\033[0m\n" "$1" > +} > + > +trap user_abort SIGINT SIGTERM > + > +bw="" > +brief=0 > +error=0 > +ca_info="" > +st=0 > +method="leaf" > +topofile=/tmp/net > +discover=1 > +res_col="%-20.20s" > + > +function get_opts() { > + while getopts P:C:t:n:beNhlsc o; do > + case "$o" in > + n) > + topofile="$OPTARG" > + discover=0 > + ;; > + l) > + method="leaf" > + ;; > + s) > + method="sw" > + ;; > + c) > + method="ca" > + ;; > + h) > + usage > + ;; > + N) > + bw="yes" > + ;; > + b) > + brief=1 > + ;; > + e) > + error=1 > + ;; > + P | C | t | timeout) > + ca_info="$ca_info -$o $OPTARG" > + ;; > + *) > + usage > + ;; > + esac > + done > +} > + > +get_opts $* > + > +if [ $discover -eq 1 ]; then > + $IBPATH/ibnetdiscover $ca_info > $topofile > +fi > + > +# find LIDs to check > +case $method in > +leaf) > + [ $brief -eq 0 ] && echo -e "Checking routes between all Leaf Switches" > + LIDS=($(awk '/# lid /{a[$(NF-1)]=$(NF-1)} END{for(v in a) if (v!=0) > print v}' $topofile)) This '/# lid /' match expression as well as using (NF - 1) makes your script *hardly* dependent from ibnetdiscover output format, for example if more information will be added in this comment line it will likely break your things. > + ;; > +sw) > + [ $brief -eq 0 ] && echo -e "Checking routes between all Switches" > + LIDS=($(awk '/^Switch/ {a[$(NF-2)]=$(NF-2)} END{for(v in a) if (v!=0) > print v}' $topofile)) > + ;; > +ca) > + [ $brief -eq 0 ] && echo -e "Checking routes between all CAs" > + LIDS=($(awk '/# lid /{lmc=$7; e=2^lmc+$5; for(i=$5; i<e; i++) {if > (i!=0) print i}}' $topofile)) > + ;; Ditto. Also could you format the code in more friendly/readable C-like form? Sasha > +esac > + > +# number of LIDs > +n=${#li...@]} > + > +if [ $N -lt 2 ]; then > + [ $brief -eq 0 ] && echo "Error: found single node" > + exit 0 > +fi > + > +# check routes > +[ $brief -eq 0 ] && echo -e "Checking route between:\nSource lid --> > Destination lid" > +for((s=0; s<N-1; s++)); do > + for ((d=s+1; d<N; d++)); do > + $IBPATH/ibtracert $ca_info ${LIDS[$s]} ${LIDS[$d]} > /dev/null > + if [ $? -eq 0 ]; then > + [ $brief -eq 0 ] && [ $error -eq 0 ] && green > "${LIDS[$s]}-->${LIDS[$d]}" > + else > + [ $brief -eq 0 ] && red "${LIDS[$s]}-->${LIDS[$d]}" > + st=1 > + fi > + done > +done > + > +exit $st > -- > 1.5.4 > _______________________________________________ general mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
