]> git.ipfire.org Git - thirdparty/dracut.git/blob - modules.d/95nvmf/parse-nvmf-boot-connections.sh
6b26f7625e5cf387303e08474eb3fa8399b8984a
[thirdparty/dracut.git] / modules.d / 95nvmf / parse-nvmf-boot-connections.sh
1 #!/bin/sh
2 #
3 # Supported formats:
4 # rd.nvmf.hostnqn=<hostnqn>
5 # rd.nvmf.hostid=<hostid>
6 # rd.nvmf.discover=<transport>,<traddr>,<host-traddr>,<trsvcid>
7 #
8 # Examples:
9 # rd.nvmf.hostnqn=nqn.2014-08.org.nvmexpress:uuid:37303738-3034-584d-5137-333230423843
10 # rd.nvmf.discover=rdma,192.168.1.3,,4420
11 # rd.nvmf.discover=tcp,192.168.1.3,,4420
12 # rd.nvmf.discover=tcp,192.168.1.3
13 # rd.nvmf.discover=fc,nn-0x200400a098d85236:pn-0x201400a098d85236,nn-0x200000109b7db455:pn-0x100000109b7db455
14 # rd.nvmf.discover=fc,auto
15 #
16 # Note: FC does autodiscovery, so typically there is no need to
17 # specify any discover parameters for FC.
18 #
19
20 type is_ip > /dev/null 2>&1 || . /lib/net-lib.sh
21
22 if getargbool 0 rd.nonvmf; then
23 warn "rd.nonvmf=0: skipping nvmf"
24 return 0
25 fi
26
27 initqueue --onetime modprobe --all -b -q nvme_tcp nvme_core nvme_fabrics
28
29 parse_nvmf_discover() {
30 traddr="none"
31 trtype="none"
32 hosttraddr="none"
33 trsvcid=4420
34 OLDIFS="$IFS"
35 IFS=,
36 # shellcheck disable=SC2086
37 set -- $1
38 IFS="$OLDIFS"
39
40 case $# in
41 2)
42 [ -n "$1" ] && trtype=$1
43 [ -n "$2" ] && traddr=$2
44 ;;
45 3)
46 [ -n "$1" ] && trtype=$1
47 [ -n "$2" ] && traddr=$2
48 [ -n "$3" ] && hosttraddr=$3
49 ;;
50 4)
51 [ -n "$1" ] && trtype=$1
52 [ -n "$2" ] && traddr=$2
53 [ -n "$3" ] && hosttraddr=$3
54 [ -n "$4" ] && trsvcid=$4
55 ;;
56 *)
57 warn "Invalid arguments for rd.nvmf.discover=$1"
58 return 0
59 ;;
60 esac
61 if [ "$traddr" = "none" ]; then
62 warn "traddr is mandatory for $trtype"
63 return 0
64 fi
65 if [ "$trtype" = "tcp" ]; then
66 : > /tmp/nvmf_needs_network
67 elif [ "$trtype" = "fc" ]; then
68 if [ "$traddr" = "auto" ]; then
69 rm /etc/nvme/discovery.conf
70 return 1
71 fi
72 if [ "$hosttraddr" = "none" ]; then
73 warn "host traddr is mandatory for fc"
74 return 0
75 fi
76 elif [ "$trtype" != "rdma" ]; then
77 warn "unsupported transport $trtype"
78 return 0
79 fi
80 if [ "$trtype" = "fc" ]; then
81 echo "--transport=$trtype --traddr=$traddr --host-traddr=$hosttraddr" >> /etc/nvme/discovery.conf
82 else
83 echo "--transport=$trtype --traddr=$traddr --host-traddr=$hosttraddr --trsvcid=$trsvcid" >> /etc/nvme/discovery.conf
84 fi
85 return 0
86 }
87
88 nvmf_hostnqn=$(getarg rd.nvmf.hostnqn -d nvmf.hostnqn=)
89 if [ -n "$nvmf_hostnqn" ]; then
90 echo "$nvmf_hostnqn" > /etc/nvme/hostnqn
91 fi
92 nvmf_hostid=$(getarg rd.nvmf.hostid -d nvmf.hostid=)
93 if [ -n "$nvmf_hostid" ]; then
94 echo "$nvmf_hostid" > /etc/nvme/hostid
95 fi
96
97 NVMF_FC_AUTO=
98 for d in $(getargs rd.nvmf.discover -d nvmf.discover=); do
99 parse_nvmf_discover "$d" || {
100 NVMF_FC_AUTO=1
101 break
102 }
103 done
104
105 if [ -e /tmp/nvmf_needs_network ]; then
106 echo "rd.neednet=1" > /etc/cmdline.d/nvmf-neednet.conf
107 rm -f /tmp/nvmf_needs_network
108 fi
109
110 # Host NQN and host id are mandatory for NVMe-oF
111 if [ -f "/etc/nvme/hostnqn" ] && [ -f "/etc/nvme/hostid" ]; then
112
113 # If no nvme command line arguments present, try autodiscovery
114 if [ $NVMF_FC_AUTO ] || [ ! -f "/etc/nvme/discovery.conf" ]; then
115 /sbin/initqueue --settled --onetime --unique --name nvme-fc-autoconnect /sbin/nvmf-autoconnect.sh
116 else
117 /sbin/initqueue --settled --onetime --unique --name nvme-discover /usr/sbin/nvme connect-all
118 fi
119 fi