summary refs log tree commit diff stats
path: root/scripts/rdma-migration-helper.sh
blob: a39f2fb0e580941ad352ef38d01c80e6b895767f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/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'
}

# existing rdma interfaces
rdma_interfaces()
{
    rdma link show | sed -nE 's/^link .* netdev ([^ ]+).*$/\1 /p'
}

# existing valid ipv4 interfaces
ipv4_interfaces()
{
    ip -o addr show | awk '/inet / {print $2}' | grep -v -w lo
}

rdma_rxe_detect()
{
    for r in $(rdma_interfaces)
    do
        ipv4_interfaces | grep -qw $r && get_ipv4_addr $r && return
    done

    return 1
}

rdma_rxe_setup()
{
    for i in $(ipv4_interfaces)
    do
        rdma_interfaces | grep -qw $i && continue
        rdma link add "${i}_rxe" type rxe netdev "$i" && {
            echo "Setup new rdma/rxe ${i}_rxe for $i with $(get_ipv4_addr $i)"
            return
        }
    done

    echo "Failed to setup any new rdma/rxe link" >&2
    return 1
}

rdma_rxe_clean()
{
    modprobe -r rdma_rxe
}

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
    }
    rdma_rxe_"$operation"
elif [ "$operation" == "detect" ]; then
    rdma_rxe_detect
else
    echo "Usage: $0 [setup | detect | clean]"
fi