17d9849c3SLi Zhijian#!/bin/bash 27d9849c3SLi Zhijian 37d9849c3SLi Zhijian# Copied from blktests 47d9849c3SLi Zhijianget_ipv4_addr() 57d9849c3SLi Zhijian{ 67d9849c3SLi Zhijian ip -4 -o addr show dev "$1" | 77d9849c3SLi Zhijian sed -n 's/.*[[:blank:]]inet[[:blank:]]*\([^[:blank:]/]*\).*/\1/p' | 87d9849c3SLi Zhijian head -1 | tr -d '\n' 97d9849c3SLi Zhijian} 107d9849c3SLi Zhijian 11*6b84c46eSLi Zhijianget_ipv6_addr() { 12*6b84c46eSLi Zhijian ipv6=$(ip -6 -o addr show dev "$1" | 13*6b84c46eSLi Zhijian sed -n 's/.*[[:blank:]]inet6[[:blank:]]*\([^[:blank:]/]*\).*/\1/p' | 14*6b84c46eSLi Zhijian head -1 | tr -d '\n') 15*6b84c46eSLi Zhijian 16*6b84c46eSLi Zhijian [ $? -eq 0 ] || return 17*6b84c46eSLi Zhijian 18*6b84c46eSLi Zhijian if [[ "$ipv6" =~ ^fe80: ]]; then 19*6b84c46eSLi Zhijian echo -n "[$ipv6%$1]" 20*6b84c46eSLi Zhijian else 21*6b84c46eSLi Zhijian echo -n "[$ipv6]" 22*6b84c46eSLi Zhijian fi 23*6b84c46eSLi Zhijian} 24*6b84c46eSLi Zhijian 257d9849c3SLi Zhijian# existing rdma interfaces 267d9849c3SLi Zhijianrdma_interfaces() 277d9849c3SLi Zhijian{ 28*6b84c46eSLi Zhijian rdma link show | sed -nE 's/^link .* netdev ([^ ]+).*$/\1 /p' | 29*6b84c46eSLi Zhijian grep -Ev '^(lo|tun|tap)' 307d9849c3SLi Zhijian} 317d9849c3SLi Zhijian 327d9849c3SLi Zhijian# existing valid ipv4 interfaces 337d9849c3SLi Zhijianipv4_interfaces() 347d9849c3SLi Zhijian{ 35*6b84c46eSLi Zhijian ip -o addr show | awk '/inet / {print $2}' | grep -Ev '^(lo|tun|tap)' 36*6b84c46eSLi Zhijian} 37*6b84c46eSLi Zhijian 38*6b84c46eSLi Zhijianipv6_interfaces() 39*6b84c46eSLi Zhijian{ 40*6b84c46eSLi Zhijian ip -o addr show | awk '/inet6 / {print $2}' | grep -Ev '^(lo|tun|tap)' 417d9849c3SLi Zhijian} 427d9849c3SLi Zhijian 437d9849c3SLi Zhijianrdma_rxe_detect() 447d9849c3SLi Zhijian{ 45*6b84c46eSLi Zhijian family=$1 467d9849c3SLi Zhijian for r in $(rdma_interfaces) 477d9849c3SLi Zhijian do 48*6b84c46eSLi Zhijian "$family"_interfaces | grep -qw $r && get_"$family"_addr $r && return 497d9849c3SLi Zhijian done 507d9849c3SLi Zhijian 517d9849c3SLi Zhijian return 1 527d9849c3SLi Zhijian} 537d9849c3SLi Zhijian 547d9849c3SLi Zhijianrdma_rxe_setup() 557d9849c3SLi Zhijian{ 56*6b84c46eSLi Zhijian family=$1 57*6b84c46eSLi Zhijian for i in $("$family"_interfaces) 587d9849c3SLi Zhijian do 59*6b84c46eSLi Zhijian if rdma_interfaces | grep -qw $i; then 60*6b84c46eSLi Zhijian echo "$family: Reuse the existing rdma/rxe ${i}_rxe" \ 61*6b84c46eSLi Zhijian "for $i with $(get_"$family"_addr $i)" 62*6b84c46eSLi Zhijian return 63*6b84c46eSLi Zhijian fi 64*6b84c46eSLi Zhijian 657d9849c3SLi Zhijian rdma link add "${i}_rxe" type rxe netdev "$i" && { 66*6b84c46eSLi Zhijian echo "$family: Setup new rdma/rxe ${i}_rxe" \ 67*6b84c46eSLi Zhijian "for $i with $(get_"$family"_addr $i)" 687d9849c3SLi Zhijian return 697d9849c3SLi Zhijian } 707d9849c3SLi Zhijian done 717d9849c3SLi Zhijian 72*6b84c46eSLi Zhijian echo "$family: Failed to setup any new rdma/rxe link" >&2 737d9849c3SLi Zhijian return 1 747d9849c3SLi Zhijian} 757d9849c3SLi Zhijian 767d9849c3SLi Zhijianrdma_rxe_clean() 777d9849c3SLi Zhijian{ 787d9849c3SLi Zhijian modprobe -r rdma_rxe 797d9849c3SLi Zhijian} 807d9849c3SLi Zhijian 81*6b84c46eSLi ZhijianIP_FAMILY=${IP_FAMILY:-ipv4} 82*6b84c46eSLi Zhijianif [ "$IP_FAMILY" != "ipv6" ] && [ "$IP_FAMILY" != "ipv4" ]; then 83*6b84c46eSLi Zhijian echo "Unknown ip family '$IP_FAMILY', only ipv4 or ipv6 is supported." >&2 84*6b84c46eSLi Zhijian exit 1 85*6b84c46eSLi Zhijianfi 86*6b84c46eSLi Zhijian 877d9849c3SLi Zhijianoperation=${1:-detect} 887d9849c3SLi Zhijian 897d9849c3SLi Zhijiancommand -v rdma >/dev/null || { 907d9849c3SLi Zhijian echo "Command 'rdma' is not available, please install it first." >&2 917d9849c3SLi Zhijian exit 1 927d9849c3SLi Zhijian} 937d9849c3SLi Zhijian 947d9849c3SLi Zhijianif [ "$operation" == "setup" ] || [ "$operation" == "clean" ]; then 957d9849c3SLi Zhijian [ "$UID" == 0 ] || { 967d9849c3SLi Zhijian echo "Root privilege is required to setup/clean a rdma/rxe link" >&2 977d9849c3SLi Zhijian exit 1 987d9849c3SLi Zhijian } 99*6b84c46eSLi Zhijian if [ "$operation" == "setup" ]; then 100*6b84c46eSLi Zhijian rdma_rxe_setup ipv4 101*6b84c46eSLi Zhijian rdma_rxe_setup ipv6 102*6b84c46eSLi Zhijian else 103*6b84c46eSLi Zhijian rdma_rxe_clean 104*6b84c46eSLi Zhijian fi 1057d9849c3SLi Zhijianelif [ "$operation" == "detect" ]; then 106*6b84c46eSLi Zhijian rdma_rxe_detect "$IP_FAMILY" 1077d9849c3SLi Zhijianelse 1087d9849c3SLi Zhijian echo "Usage: $0 [setup | detect | clean]" 1097d9849c3SLi Zhijianfi 110