xref: /qemu/scripts/rdma-migration-helper.sh (revision e4fb0be1d1d6b67df7709d84d16133b64f455ce8)
1#!/bin/bash
2
3# Copied from blktests
4get_ipv4_addr()
5{
6    ip -4 -o addr show dev "$1" |
7        sed -n 's/.*[[:blank:]]inet[[:blank:]]*\([^[:blank:]/]*\).*/\1/p' |
8        head -1 | tr -d '\n'
9}
10
11# existing rdma interfaces
12rdma_interfaces()
13{
14    rdma link show | sed -nE 's/^link .* netdev ([^ ]+).*$/\1 /p'
15}
16
17# existing valid ipv4 interfaces
18ipv4_interfaces()
19{
20    ip -o addr show | awk '/inet / {print $2}' | grep -v -w lo
21}
22
23rdma_rxe_detect()
24{
25    for r in $(rdma_interfaces)
26    do
27        ipv4_interfaces | grep -qw $r && get_ipv4_addr $r && return
28    done
29
30    return 1
31}
32
33rdma_rxe_setup()
34{
35    for i in $(ipv4_interfaces)
36    do
37        rdma_interfaces | grep -qw $i && continue
38        rdma link add "${i}_rxe" type rxe netdev "$i" && {
39            echo "Setup new rdma/rxe ${i}_rxe for $i with $(get_ipv4_addr $i)"
40            return
41        }
42    done
43
44    echo "Failed to setup any new rdma/rxe link" >&2
45    return 1
46}
47
48rdma_rxe_clean()
49{
50    modprobe -r rdma_rxe
51}
52
53operation=${1:-detect}
54
55command -v rdma >/dev/null || {
56    echo "Command 'rdma' is not available, please install it first." >&2
57    exit 1
58}
59
60if [ "$operation" == "setup" ] || [ "$operation" == "clean" ]; then
61    [ "$UID" == 0 ] || {
62        echo "Root privilege is required to setup/clean a rdma/rxe link" >&2
63        exit 1
64    }
65    rdma_rxe_"$operation"
66elif [ "$operation" == "detect" ]; then
67    rdma_rxe_detect
68else
69    echo "Usage: $0 [setup | detect | clean]"
70fi
71