#!/bin/bash # Copied from blktests get_ipv4_addr() { ip -4 -o addr show dev "$1" | sed -n 's/.*[[:blank:]]inet[[:blank:]]*\([^[:blank:]/]*\).*/\1/p' | head -1 | tr -d '\n' } get_ipv6_addr() { ipv6=$(ip -6 -o addr show dev "$1" | sed -n 's/.*[[:blank:]]inet6[[:blank:]]*\([^[:blank:]/]*\).*/\1/p' | head -1 | tr -d '\n') [ $? -eq 0 ] || return if [[ "$ipv6" =~ ^fe80: ]]; then echo -n "[$ipv6%$1]" else echo -n "[$ipv6]" fi } # existing rdma interfaces rdma_interfaces() { rdma link show | sed -nE 's/^link .* netdev ([^ ]+).*$/\1 /p' | grep -Ev '^(lo|tun|tap)' } # existing valid ipv4 interfaces ipv4_interfaces() { ip -o addr show | awk '/inet / {print $2}' | grep -Ev '^(lo|tun|tap)' } ipv6_interfaces() { ip -o addr show | awk '/inet6 / {print $2}' | grep -Ev '^(lo|tun|tap)' } rdma_rxe_detect() { family=$1 for r in $(rdma_interfaces) do "$family"_interfaces | grep -qw $r && get_"$family"_addr $r && return done return 1 } rdma_rxe_setup() { family=$1 for i in $("$family"_interfaces) do if rdma_interfaces | grep -qw $i; then echo "$family: Reuse the existing rdma/rxe ${i}_rxe" \ "for $i with $(get_"$family"_addr $i)" return fi rdma link add "${i}_rxe" type rxe netdev "$i" && { echo "$family: Setup new rdma/rxe ${i}_rxe" \ "for $i with $(get_"$family"_addr $i)" return } done echo "$family: Failed to setup any new rdma/rxe link" >&2 return 1 } rdma_rxe_clean() { modprobe -r rdma_rxe } IP_FAMILY=${IP_FAMILY:-ipv4} if [ "$IP_FAMILY" != "ipv6" ] && [ "$IP_FAMILY" != "ipv4" ]; then echo "Unknown ip family '$IP_FAMILY', only ipv4 or ipv6 is supported." >&2 exit 1 fi operation=${1:-detect} command -v rdma >/dev/null || { echo "Command 'rdma' is not available, please install it first." >&2 exit 1 } if [ "$operation" == "setup" ] || [ "$operation" == "clean" ]; then [ "$UID" == 0 ] || { echo "Root privilege is required to setup/clean a rdma/rxe link" >&2 exit 1 } if [ "$operation" == "setup" ]; then rdma_rxe_setup ipv4 rdma_rxe_setup ipv6 else rdma_rxe_clean fi elif [ "$operation" == "detect" ]; then rdma_rxe_detect "$IP_FAMILY" else echo "Usage: $0 [setup | detect | clean]" fi