2d7ffa
From f055e5126f7d28553c3886a865e5f13fdc4c18d2 Mon Sep 17 00:00:00 2001
2d7ffa
From: Xunlei Pang <xlpang@redhat.com>
2d7ffa
Date: Mon, 25 Sep 2017 11:18:06 +0800
2d7ffa
Subject: [PATCH] fcoe: handle CNAs with DCB firmware support
2d7ffa
2d7ffa
Some Combined Network Adapters(CNAs) implement DCB protocol
2d7ffa
in firmware, it is recommended that do not run software-based
2d7ffa
DCB or LLDP on CNAs that implement DCB, but we have to start
2d7ffa
the lldpad service anyway(there might be other software DCB).
2d7ffa
2d7ffa
If the network interface provides hardware DCB/DCBX capabilities,
2d7ffa
the field DCB_REQUIRED in "/etc/fcoe/cfg-xxx" is expected to
2d7ffa
be set to "no".
2d7ffa
2d7ffa
We met an issue on "QLogic BCM57810" with DCB firmware support,
2d7ffa
and found dracut still generated "fcoe=<mac>:dcb" which caused
2d7ffa
kdump boot failure when using that fcoe dump target.
2d7ffa
2d7ffa
This patch parses /etc/fcoe/cfg-xxx to detect DCB_REQUIRED="no",
2d7ffa
and force "nodcb" if it is the case.
2d7ffa
2d7ffa
Also improved some coding style in passing.
2d7ffa
2d7ffa
Signed-off-by: Xunlei Pang <xlpang@redhat.com>
2d7ffa
2d7ffa
Cherry-picked from: 795256bbb
2d7ffa
Resolves: #1442663
2d7ffa
---
2d7ffa
 modules.d/95fcoe/module-setup.sh | 26 ++++++++++++++++++++------
2d7ffa
 1 file changed, 20 insertions(+), 6 deletions(-)
2d7ffa
2d7ffa
diff --git a/modules.d/95fcoe/module-setup.sh b/modules.d/95fcoe/module-setup.sh
2d7ffa
index 4bab0c7d..ac27c76a 100755
2d7ffa
--- a/modules.d/95fcoe/module-setup.sh
2d7ffa
+++ b/modules.d/95fcoe/module-setup.sh
2d7ffa
@@ -51,16 +51,30 @@ cmdline() {
2d7ffa
         read mac < ${i}/address
2d7ffa
         s=$(dcbtool gc ${i##*/} dcb | sed -n 's/^DCB State:\t*\(.*\)/\1/p')
2d7ffa
         if [ -z "$s" ] ; then
2d7ffa
-	    p=$(get_vlan_parent ${i})
2d7ffa
-	    if [ "$p" ] ; then
2d7ffa
-	        s=$(dcbtool gc ${p} dcb | sed -n 's/^DCB State:\t*\(.*\)/\1/p')
2d7ffa
-	    fi
2d7ffa
+            p=$(get_vlan_parent ${i})
2d7ffa
+            if [ "$p" ] ; then
2d7ffa
+                s=$(dcbtool gc ${p} dcb | sed -n 's/^DCB State:\t*\(.*\)/\1/p')
2d7ffa
+            fi
2d7ffa
         fi
2d7ffa
         if [ "$s" = "on" ] ; then
2d7ffa
-	    dcb="dcb"
2d7ffa
+            dcb="dcb"
2d7ffa
         else
2d7ffa
-	    dcb="nodcb"
2d7ffa
+            dcb="nodcb"
2d7ffa
         fi
2d7ffa
+
2d7ffa
+        # Some Combined Network Adapters(CNAs) implement DCB in firmware.
2d7ffa
+        # Do not run software-based DCB or LLDP on CNAs that implement DCB.
2d7ffa
+        # If the network interface provides hardware DCB/DCBX capabilities,
2d7ffa
+        # DCB_REQUIRED in "/etc/fcoe/cfg-xxx" is expected to set to "no".
2d7ffa
+        #
2d7ffa
+        # Force "nodcb" if there's any DCB_REQUIRED="no"(child or vlan parent).
2d7ffa
+        grep -q "^[[:blank:]]*DCB_REQUIRED=\"no\"" /etc/fcoe/cfg-${i##*/} &>/dev/null
2d7ffa
+        [ $? -eq 0 ] && dcb="nodcb"
2d7ffa
+        if [ "$p" ] ; then
2d7ffa
+            grep -q "^[[:blank:]]*DCB_REQUIRED=\"no\"" /etc/fcoe/cfg-${p} &>/dev/null
2d7ffa
+            [ $? -eq 0 ] && dcb="nodcb"
2d7ffa
+        fi
2d7ffa
+
2d7ffa
         echo "fcoe=${mac}:${dcb}"
2d7ffa
     done
2d7ffa
 }