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