Blob Blame History Raw
--- /dev/null	2016-06-11 21:31:27.877143799 -0400
+++ ibdev2netdev	2016-06-11 22:55:00.358718594 -0400
@@ -0,0 +1,198 @@
+#! /bin/bash
+
+usage()
+{
+        echo "$(basename $0) <options>"
+        echo "-h, --help                print help message"
+        echo "-v, --verbose             print more info"
+}
+
+case $1 in
+        "-h" | "--help")
+                usage
+                exit 0
+                ;;
+esac
+
+if (( $# > 1 )); then
+	usage
+	exit -1
+fi
+
+if (( $# == 1 )) && [ "$1" != "-v" ]; then
+	usage
+        exit -1
+fi
+
+ibdevs=$(ls /sys/class/infiniband/)
+
+devs=$(ls /sys/class/net/ | grep ^[ei])
+if [ "x$devs" == "x" ]; then
+	# no relevant devices - quit immediately
+	exit
+fi
+
+for d in $devs; do
+	if [ -f /sys/class/net/$d/dev_id ]; then
+		oldstyle=n
+		break
+	fi
+done
+
+if [ "x$oldstyle" == "xn" ]; then
+	for d in $ibdevs; do
+		ibrsc=$(cat /sys/class/infiniband/$d/device/resource)
+		eths=$(ls /sys/class/net/)
+		for eth in $eths; do
+			filepath_resource=/sys/class/net/$eth/device/resource
+
+			if [ -f $filepath_resource ]; then
+				ethrsc=$(cat $filepath_resource)
+				if [ "x$ethrsc" == "x$ibrsc" ]; then
+					filepath_devid=/sys/class/net/$eth/dev_id
+					filepath_devport=/sys/class/net/$eth/dev_port
+					if [ -f $filepath_devid ]; then
+						port1=0
+						if [ -f $filepath_devport ]; then
+							port1=$(cat $filepath_devport)
+							port1=$(printf "%d" $port1)
+						fi
+
+						port=$(cat $filepath_devid)
+						port=$(printf "%d" $port)
+						if [ $port1 -gt $port ]; then
+							port=$port1
+						fi
+
+						port=$(( port + 1 ))
+
+						filepath_carrier=/sys/class/net/$eth/carrier
+
+						if [ -f $filepath_carrier ]; then
+							link_state=$(cat $filepath_carrier 2> /dev/null)
+        	                                        if (( link_state == 1 )); then
+                	                                        link_state="Up"
+                        	                        else
+                                	                        link_state="Down"
+                                        	        fi
+						else
+							link_state="NA"
+						fi
+
+						if [ "$1" == "-v" ]; then
+							filepath_portstate=/sys/class/infiniband/$d/ports/$port/state
+							filepath_deviceid=/sys/class/infiniband/$d/device/device
+							filepath_fwver=/sys/class/infiniband/$d/fw_ver
+							filepath_vpd=/sys/class/infiniband/$d/device/vpd
+
+							# read port state
+							if [ -f $filepath_portstate ]; then
+								ibstate=$(printf "%-6s" $(cat $filepath_portstate | gawk '{print $2}'))
+							else
+								ibstate="na"
+							fi
+
+							# read device
+							if [ -f $filepath_deviceid ]; then
+								devid=$(printf "mt%d" $(cat $filepath_deviceid))
+							else
+								devid="na"
+							fi
+
+							# read fw version
+							if [ -f $filepath_fwver ]; then
+								fwver=$(cat $filepath_fwver)
+							else
+								fwver="na"
+							fi
+
+							# read device description and part id from the vpd
+							if [ -f $filepath_vpd ]; then
+								tmp=$ifs
+								ifs=":"
+								vpd_content=`cat $filepath_vpd`
+								devdesc=$(printf "%-15s" $(echo $vpd_content | strings | head -1))
+								partid=$(printf "%-11s" $(echo $vpd_content | strings | head -4 | tail -1 | gawk '{print $1}'))
+								ifs=$tmp
+							else
+								devdesc=""
+								partid="na"
+							fi
+
+							echo "$d ($devid - $partid) $devdesc fw $fwver port $port ($ibstate) ==> $eth ($link_state)"
+						else
+							echo "$d port $port ==> $eth ($link_state)"
+						fi
+					fi
+				fi
+			fi
+		done
+	done
+else
+##########################
+### old style
+##########################
+
+function print_line()
+{
+	echo "$1 port $2 <===> $3"
+}
+
+function find_guid()
+{
+	ibdevs=$(ls /sys/class/infiniband/)
+	for ibdev in $ibdevs; do
+		ports=$(ls /sys/class/infiniband/$ibdev/ports/)
+		for port in $ports; do
+			gids=$(ls /sys/class/infiniband/$ibdev/ports/$port/gids)
+			for gid in $gids; do
+				pguid=$(cat /sys/class/infiniband/$ibdev/ports/$port/gids/$gid | cut -b 21- | sed -e 's/://g')
+				if [ x$pguid == x$1 ]; then
+					print_line $ibdev $port $2
+				fi
+			done
+		done
+	done
+}
+
+function find_mac()
+{
+	ibdevs=$(ls /sys/class/infiniband/)
+	for ibdev in $ibdevs; do
+		type=$(cat /sys/class/infiniband/$ibdev/node_type|cut -d ' ' -f 2)
+		ports=$(ls /sys/class/infiniband/$ibdev/ports/)
+		for port in $ports; do
+			gids=$(ls /sys/class/infiniband/$ibdev/ports/$port/gids)
+			for gid in $gids; do
+				if [[ "$type" = "RNIC" ]]; then
+					pmac=$(cat /sys/class/infiniband/$ibdev/ports/$port/gids/$gid | cut -b 1-14|sed -e 's/://g')
+				else
+					first=$(cat /sys/class/infiniband/$ibdev/ports/$port/gids/$gid | cut -b 21-22)
+					first=$(( first ^ 2 ))
+					first=$(printf "%02x" $first)
+					second=$(cat /sys/class/infiniband/$ibdev/ports/$port/gids/$gid | cut -b 21- | sed -e 's/://g' | cut -b 3-6)
+					third=$(cat /sys/class/infiniband/$ibdev/ports/$port/gids/$gid | cut -b 21- | sed -e 's/://g' | cut -b 11-)
+					pmac=$first$second$third
+				fi
+				if [ x$pmac == x$1 ]; then
+					print_line $ibdev $port $2
+				fi
+			done
+		done
+	done
+}
+
+ifcs=$(ifconfig -a | egrep '^eth|^ib' | gawk '{print $1}')
+
+for ifc in $ifcs; do
+	len=$(cat /sys/class/net/$ifc/addr_len)
+	if (( len == 20 )); then
+		guid=$(cat /sys/class/net/$ifc/address | cut -b 37- | sed -e 's/://g')
+		find_guid $guid $ifc
+	elif (( len == 6)); then
+		mac=$(cat /sys/class/net/$ifc/address | sed -e 's/://g')	
+		find_mac $mac $ifc
+	fi
+done
+fi
+