xref: /openbmc/qemu/scripts/rdma-migration-helper.sh (revision c6e1f60cc73c787317316bb2956f9a95a5daee15)
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