You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

162 lines
5.7 KiB

#!/bin/bash
#
# Copyright 2013 Red Hat, Inc. All rights reserved.
# Copyright 2013 Harald Hoyer <harald@redhat.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
getbyte() {
local IFS= LC_CTYPE=C res c=0
read -r -n 1 -d '' c
res=$?
# the single quote in the argument of the printf
# yields the numeric value of $c (ASCII since LC_CTYPE=C)
[[ -n $c ]] && c=$(printf '%u' "'$c") || c=0
printf "%s" "$c"
return $res
}
getword() {
local b1=0 b2=0 val=0
b1=$(getbyte)
b2=$(getbyte)
((val = b2 * 256 + b1))
echo "$val"
return 0
}
# E.g. Acpi(PNP0A08,0x0)/Pci(0x3,0x0)/Pci(0x0,0x0)/MAC(90E2BA265ED4,0x0)/Vlan(172)/Fibre(0x4EA06104A0CC0050,0x0)
uefi_device_path() {
data=${1:-/sys/firmware/efi/efivars/FcoeBootDevice-a0ebca23-5f9c-447a-a268-22b6c158c2ac}
[ -f "$data" ] || return 1
local IFS= LC_CTYPE=C res tt len type hextype first
first=1
{
getword > /dev/null
getword > /dev/null
while :; do
type=$(getbyte) || return 1
subtype=$(getbyte) || return 1
len=$(getword) || return 1
hextype=$(printf "%02x%02x" "$type" "$subtype")
if [[ $first == 1 ]]; then
first=0
elif [[ $hextype != "7fff" ]]; then
printf "/"
fi
case $hextype in
0101)
# PCI
tt=$(getword)
printf "PCI(0x%x,0x%x)" $((tt / 256)) $((tt & 255))
;;
0201)
# ACPI
printf "Acpi(0x%x,0x%x)" $(($(getword) + $(getword) * 65536)) $(($(getword) + $(getword) * 65536))
;;
0303)
# FIBRE
getword &> /dev/null
getword &> /dev/null
printf "Fibre(0x%x%x%x%x%x%x%x%x,0x%x)" \
"$(getbyte)" "$(getbyte)" "$(getbyte)" "$(getbyte)" \
"$(getbyte)" "$(getbyte)" "$(getbyte)" "$(getbyte)" \
"$(($(getword) + $(getword) * 65536 + 4294967296 * ($(getword) + $(getword) * 65536)))"
;;
030b)
# MAC
printf "MAC(%02x%02x%02x%02x%02x%02x," "$(getbyte)" "$(getbyte)" "$(getbyte)" "$(getbyte)" "$(getbyte)" "$(getbyte)"
for ((i = 0; i < 26; i++)); do tt=$(getbyte) || return 1; done
printf "0x%x)" "$(getbyte)"
;;
0314)
# VLAN
printf "VLAN(%d)" "$(getword)"
;;
7fff)
# END
printf "\n"
return 0
;;
*)
#printf "Unknown(Type:0x%02x SubType:0x%02x len=%d)\n" "$type" "$subtype" "$len" >&2
for ((i = 0; i < len - 4; i++)); do tt=$(getbyte); done
;;
esac
done
} < "$data"
}
get_fcoe_boot_mac() {
data=${1:-/sys/firmware/efi/efivars/FcoeBootDevice-a0ebca23-5f9c-447a-a268-22b6c158c2ac}
[ -f "$data" ] || return 1
local IFS= LC_CTYPE=C tt len type hextype
{
getword > /dev/null
getword > /dev/null
while :; do
type=$(getbyte) || return 1
subtype=$(getbyte) || return 1
len=$(getword) || return 1
hextype=$(printf "%02x%02x" "$type" "$subtype")
case $hextype in
030b)
# MAC
printf "%02x:%02x:%02x:%02x:%02x:%02x" "$(getbyte)" "$(getbyte)" "$(getbyte)" "$(getbyte)" "$(getbyte)" "$(getbyte)"
for ((i = 0; i < 27; i++)); do tt=$(getbyte) || return 1; done
;;
7fff)
# END
return 0
;;
*)
#printf "Unknown(Type:0x%02x SubType:0x%02x len=%d)\n" "$type" "$subtype" "$len" >&2
for ((i = 0; i < len - 4; i++)); do tt=$(getbyte); done
;;
esac
done
} < "$data"
}
get_fcoe_boot_vlan() {
data=${1:-/sys/firmware/efi/efivars/FcoeBootDevice-a0ebca23-5f9c-447a-a268-22b6c158c2ac}
[ -f "$data" ] || return 1
local IFS= LC_CTYPE=C tt len type hextype
{
getword > /dev/null
getword > /dev/null
while :; do
type=$(getbyte) || return 1
subtype=$(getbyte) || return 1
len=$(getword) || return 1
hextype=$(printf "%02x%02x" "$type" "$subtype")
case $hextype in
0314)
# VLAN
printf "%d" "$(getword)"
;;
7fff)
# END
return 0
;;
*)
#printf "Unknown(Type:0x%02x SubType:0x%02x len=%d)\n" "$type" "$subtype" "$len" >&2
for ((i = 0; i < len; i++)); do tt=$(getbyte); done
;;
esac
done
} < "$data"
}