]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
fcoe: handle CNAs with DCB firmware support 287/head
authorXunlei Pang <xlpang@redhat.com>
Mon, 25 Sep 2017 03:18:06 +0000 (11:18 +0800)
committerXunlei Pang <xlpang@redhat.com>
Wed, 27 Sep 2017 02:36:44 +0000 (10:36 +0800)
Some Combined Network Adapters(CNAs) implement DCB protocol
in firmware, it is recommended that do not run software-based
DCB or LLDP on CNAs that implement DCB, but we have to start
the lldpad service anyway(there might be other software DCB).

If the network interface provides hardware DCB/DCBX capabilities,
the field DCB_REQUIRED in "/etc/fcoe/cfg-xxx" is expected to
be set to "no".

We met an issue on "QLogic BCM57810" with DCB firmware support,
and found dracut still generated "fcoe=<mac>:dcb" which caused
kdump boot failure when using that fcoe dump target.

This patch parses /etc/fcoe/cfg-xxx to detect DCB_REQUIRED="no",
and force "nodcb" if it is the case.

Also improved some coding style in passing.

Signed-off-by: Xunlei Pang <xlpang@redhat.com>
modules.d/95fcoe/module-setup.sh

index e14a0ebb3bdcdf438cbbf204c76201e3e91bde30..eabb21c7e1c78d7247884f3bc144a75092571538 100755 (executable)
@@ -51,16 +51,30 @@ cmdline() {
         read mac < ${i}/address
         s=$(dcbtool gc ${i##*/} dcb | sed -n 's/^DCB State:\t*\(.*\)/\1/p')
         if [ -z "$s" ] ; then
-           p=$(get_vlan_parent ${i})
-           if [ "$p" ] ; then
-               s=$(dcbtool gc ${p} dcb | sed -n 's/^DCB State:\t*\(.*\)/\1/p')
-           fi
+            p=$(get_vlan_parent ${i})
+            if [ "$p" ] ; then
+                s=$(dcbtool gc ${p} dcb | sed -n 's/^DCB State:\t*\(.*\)/\1/p')
+            fi
         fi
         if [ "$s" = "on" ] ; then
-           dcb="dcb"
+            dcb="dcb"
         else
-           dcb="nodcb"
+            dcb="nodcb"
         fi
+
+        # Some Combined Network Adapters(CNAs) implement DCB in firmware.
+        # Do not run software-based DCB or LLDP on CNAs that implement DCB.
+        # If the network interface provides hardware DCB/DCBX capabilities,
+        # DCB_REQUIRED in "/etc/fcoe/cfg-xxx" is expected to set to "no".
+        #
+        # Force "nodcb" if there's any DCB_REQUIRED="no"(child or vlan parent).
+        grep -q "^[[:blank:]]*DCB_REQUIRED=\"no\"" /etc/fcoe/cfg-${i##*/} &>/dev/null
+        [ $? -eq 0 ] && dcb="nodcb"
+        if [ "$p" ] ; then
+            grep -q "^[[:blank:]]*DCB_REQUIRED=\"no\"" /etc/fcoe/cfg-${p} &>/dev/null
+            [ $? -eq 0 ] && dcb="nodcb"
+        fi
+
         echo "fcoe=${mac}:${dcb}"
     done
 }