Blame SOURCES/0019-fcoe-add-FCoE-UEFI-boot-device-support.patch

a56a5e
From 1b827040f8b3e1e4fec19de76526fe0620654502 Mon Sep 17 00:00:00 2001
90b079
From: Harald Hoyer <harald@redhat.com>
90b079
Date: Mon, 7 Oct 2013 14:24:36 +0200
90b079
Subject: [PATCH] fcoe: add FCoE UEFI boot device support
90b079
90b079
---
90b079
 modules.d/95fcoe/module-setup.sh   |   1 +
90b079
 modules.d/95fcoe/parse-uefifcoe.sh |  35 +++++++++
90b079
 modules.d/99base/module-setup.sh   |   1 +
90b079
 modules.d/99base/uefi-lib.sh       | 155 +++++++++++++++++++++++++++++++++++++
90b079
 4 files changed, 192 insertions(+)
90b079
 create mode 100755 modules.d/95fcoe/parse-uefifcoe.sh
90b079
 create mode 100755 modules.d/99base/uefi-lib.sh
90b079
90b079
diff --git a/modules.d/95fcoe/module-setup.sh b/modules.d/95fcoe/module-setup.sh
90b079
index d3c58cc..08ba4ea 100755
90b079
--- a/modules.d/95fcoe/module-setup.sh
90b079
+++ b/modules.d/95fcoe/module-setup.sh
90b079
@@ -32,6 +32,7 @@ install() {
90b079
     inst "$moddir/fcoe-up.sh" "/sbin/fcoe-up"
90b079
     inst "$moddir/fcoe-edd.sh" "/sbin/fcoe-edd"
90b079
     inst "$moddir/fcoe-genrules.sh" "/sbin/fcoe-genrules.sh"
90b079
+    inst_hook cmdline 20 "$moddir/parse-uefifcoe.sh"
90b079
     inst_hook cmdline 99 "$moddir/parse-fcoe.sh"
90b079
     dracut_need_initqueue
90b079
 }
90b079
diff --git a/modules.d/95fcoe/parse-uefifcoe.sh b/modules.d/95fcoe/parse-uefifcoe.sh
90b079
new file mode 100755
90b079
index 0000000..e03bcb3
90b079
--- /dev/null
90b079
+++ b/modules.d/95fcoe/parse-uefifcoe.sh
90b079
@@ -0,0 +1,35 @@
90b079
+#!/bin/bash
90b079
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
90b079
+# ex: ts=8 sw=4 sts=4 et filetype=sh
90b079
+
90b079
+command -v getarg >/dev/null          || . /lib/dracut-lib.sh
90b079
+command -v get_fcoe_boot_mac >/dev/null || . /lib/uefi-lib.sh
90b079
+command -v set_ifname >/dev/null || . /lib/net-lib.sh
90b079
+
90b079
+print_fcoe_uefi_conf()
90b079
+{
90b079
+    local mac dev vlan
90b079
+    mac=$(get_fcoe_boot_mac)
90b079
+    [ -z "$mac" ] && continue
90b079
+    dev=$(set_ifname fcoe $mac)
90b079
+    vlan=$(get_fcoe_boot_vlan)
90b079
+    if [ "$vlan" -ne "0" ]; then
90b079
+        case "$vlan" in
90b079
+            [0-9]*)
90b079
+                printf "%s\n" "vlan=$dev.$vlan:$dev"
90b079
+                dev="$dev.$vlan"
90b079
+                ;;
90b079
+            *)
90b079
+                printf "%s\n" "vlan=$vlan:$dev"
90b079
+                dev="$vlan"
90b079
+                ;;
90b079
+        esac
90b079
+    fi
90b079
+    # fcoe=eth0:nodcb
90b079
+    printf "%s\n" "$dev:nodcb"
90b079
+}
90b079
+
90b079
+
90b079
+if [ -e /sys/firmware/efi/vars/FcoeBootDevice-a0ebca23-5f9c-447a-a268-22b6c158c2ac/data ]; then
90b079
+    print_fcoe_uefi_conf > /etc/cmdline.d/40-fcoe-uefi.conf
90b079
+fi
90b079
diff --git a/modules.d/99base/module-setup.sh b/modules.d/99base/module-setup.sh
90b079
index 52ce400..d33a0fb 100755
90b079
--- a/modules.d/99base/module-setup.sh
90b079
+++ b/modules.d/99base/module-setup.sh
90b079
@@ -42,6 +42,7 @@ install() {
90b079
     mkdir -p ${initdir}/tmp
90b079
 
90b079
     inst_simple "$moddir/dracut-lib.sh" "/lib/dracut-lib.sh"
90b079
+    inst_simple "$moddir/uefi-lib.sh" "/lib/uefi-lib.sh"
90b079
 
90b079
     if ! dracut_module_included "systemd"; then
90b079
         inst_multiple switch_root || dfatal "Failed to install switch_root"
90b079
diff --git a/modules.d/99base/uefi-lib.sh b/modules.d/99base/uefi-lib.sh
90b079
new file mode 100755
90b079
index 0000000..faedbac
90b079
--- /dev/null
90b079
+++ b/modules.d/99base/uefi-lib.sh
90b079
@@ -0,0 +1,155 @@
90b079
+#!/bin/bash
90b079
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
90b079
+# ex: ts=8 sw=4 sts=4 et filetype=sh
90b079
+#
90b079
+# Copyright 2013 Red Hat, Inc.  All rights reserved.
90b079
+# Copyright 2013 Harald Hoyer <harald@redhat.com>
90b079
+#
90b079
+# This program is free software; you can redistribute it and/or modify
90b079
+# it under the terms of the GNU General Public License as published by
90b079
+# the Free Software Foundation; either version 2 of the License, or
90b079
+# (at your option) any later version.
90b079
+#
90b079
+# This program is distributed in the hope that it will be useful,
90b079
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
90b079
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
90b079
+# GNU General Public License for more details.
90b079
+#
90b079
+# You should have received a copy of the GNU General Public License
90b079
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
90b079
+#
90b079
+
90b079
+getbyte () {
90b079
+    local IFS= LC_CTYPE=C res c
90b079
+    read -r -n 1 -d '' c
90b079
+    res=$?
90b079
+    # the single quote in the argument of the printf
90b079
+    # yields the numeric value of $c (ASCII since LC_CTYPE=C)
90b079
+    [[ -n $c ]] && c=$(printf '%u' "'$c") || c=0
90b079
+    printf "$c"
90b079
+    return $res
90b079
+}
90b079
+
90b079
+getword () {
90b079
+    local b1 b2 val
90b079
+    b1=$(getbyte) || return 1
90b079
+    b2=$(getbyte) || return 1
90b079
+    (( val = b2 * 256 + b1 ))
90b079
+    echo $val
90b079
+    return 0
90b079
+}
90b079
+
90b079
+# Acpi(PNP0A08,0x0)/Pci(0x3,0x0)/Pci(0x0,0x0)/MAC(90E2BA265ED4,0x0)/Vlan(172)/Fibre(0x4EA06104A0CC0050,0x0)
90b079
+uefi_device_path()
90b079
+{
90b079
+    local IFS= LC_CTYPE=C res tt len type hextype first
90b079
+    first=1
90b079
+
90b079
+    while :; do
90b079
+        type=$(getbyte) || return 1
90b079
+        subtype=$(getbyte) || return 1
90b079
+        len=$(getword) || return 1
90b079
+        hextype=$(printf "%02x%02x" "$type" "$subtype")
90b079
+        if [[ $first == 1 ]]; then
90b079
+            first=0
90b079
+        elif [[ $hextype != "7fff" ]]; then
90b079
+            printf "/"
90b079
+        fi
90b079
+        case $hextype in
90b079
+            0101)
90b079
+                # PCI
90b079
+                tt=$(getword)
90b079
+                printf "PCI(0x%x,0x%x)" $(($tt / 256)) $(($tt & 255))
90b079
+                ;;
90b079
+            0201)
90b079
+                # ACPI
90b079
+                printf "Acpi(0x%x,0x%x)" $(($(getword) + $(getword) * 65536)) $(($(getword) + $(getword) * 65536))
90b079
+                ;;
90b079
+            0303)
90b079
+                # FIBRE
90b079
+                getword &>/dev/null
90b079
+                getword &>/dev/null
90b079
+                printf "Fibre(0x%x%x%x%x%x%x%x%x,0x%x)" \
90b079
+                    $(getbyte) $(getbyte) $(getbyte) $(getbyte) \
90b079
+                    $(getbyte) $(getbyte) $(getbyte) $(getbyte) \
90b079
+                    $(( $(getword) + $(getword) * 65536 + 4294967296 * ( $(getword) + $(getword) * 65536 ) ))
90b079
+                ;;
90b079
+            030b)
90b079
+                # MAC
90b079
+                printf "MAC(%02x%02x%02x%02x%02x%02x," $(getbyte) $(getbyte) $(getbyte) $(getbyte) $(getbyte) $(getbyte)
90b079
+                read -r -N 26  tt || return 1
90b079
+                printf "0x%x)"  $(getbyte)
90b079
+                ;;
90b079
+            0314)
90b079
+                # VLAN
90b079
+                printf "VLAN(%d)" $(getword)
90b079
+                ;;
90b079
+            7fff)
90b079
+                # END
90b079
+                printf "\n"
90b079
+                return 0
90b079
+                ;;
90b079
+            *)
90b079
+                printf "Unknown(Type:%d SubType:%d len=%d)" "$type" "$subtype" "$len"
90b079
+                read -r -N $(($len-4))  tt || return 1
90b079
+                ;;
90b079
+        esac
90b079
+    done
90b079
+}
90b079
+
90b079
+get_fcoe_boot_mac()
90b079
+{
90b079
+    data=${1:-/sys/firmware/efi/vars/FcoeBootDevice-a0ebca23-5f9c-447a-a268-22b6c158c2ac/data}
90b079
+    [ -f $data ] || return 1
90b079
+    local IFS= LC_CTYPE=C tt len type hextype
90b079
+    first=1
90b079
+
90b079
+    while :; do
90b079
+        type=$(getbyte) || return 1
90b079
+        subtype=$(getbyte) || return 1
90b079
+        len=$(getword) || return 1
90b079
+        hextype=$(printf "%02x%02x" "$type" "$subtype")
90b079
+        case $hextype in
90b079
+            030b)
90b079
+                # MAC
90b079
+                printf "%02x:%02x:%02x:%02x:%02x:%02x" $(getbyte) $(getbyte) $(getbyte) $(getbyte) $(getbyte) $(getbyte)
90b079
+                read -r -N 27  tt || return 1
90b079
+                ;;
90b079
+            7fff)
90b079
+                # END
90b079
+                return 0
90b079
+                ;;
90b079
+            *)
90b079
+                read -r -N $(($len-4))  tt || return 1
90b079
+                ;;
90b079
+        esac
90b079
+    done < $data
90b079
+}
90b079
+
90b079
+get_fcoe_boot_vlan()
90b079
+{
90b079
+    data=${1:-/sys/firmware/efi/vars/FcoeBootDevice-a0ebca23-5f9c-447a-a268-22b6c158c2ac/data}
90b079
+    [ -f $data ] || return 1
90b079
+    local IFS= LC_CTYPE=C tt len type hextype
90b079
+    first=1
90b079
+
90b079
+    while :; do
90b079
+        type=$(getbyte) || return 1
90b079
+        subtype=$(getbyte) || return 1
90b079
+        len=$(getword) || return 1
90b079
+        hextype=$(printf "%02x%02x" "$type" "$subtype")
90b079
+        case $hextype in
90b079
+            0314)
90b079
+                # VLAN
90b079
+                printf "%d" $(getword)
90b079
+                ;;
90b079
+            7fff)
90b079
+                # END
90b079
+                return 0
90b079
+                ;;
90b079
+            *)
90b079
+                read -r -N $(($len-4))  tt || return 1
90b079
+                ;;
90b079
+        esac
90b079
+    done < $data
90b079
+}