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