diff options
author | Hannes Reinecke <hare@suse.de> | 2014-10-30 18:00:30 -0700 |
---|---|---|
committer | Mike Christie <michaelc@cs.wisc.edu> | 2014-11-14 14:12:08 -0600 |
commit | defd640862dd65a4dfc89288e43e7ccbdf002733 (patch) | |
tree | 7f135af303e8bae724ba6c996b9c691bc6ffb7a3 | |
parent | 4959a89f421fdebc521f48003a79c2161e59d192 (diff) | |
download | open-iscsi-defd640862dd65a4dfc89288e43e7ccbdf002733.tar.gz |
fwparam_ibft: Check iBFT target and NIC flags
Check the iBFT NIC and Target flags for valid boot.
Since some adapters correctly set Bit 0 and others
set Bit 1 for NICs, allow either value there.
Signed-off-by: Lee Duncan <lduncan@suse.com>
-rw-r--r-- | include/fw_context.h | 2 | ||||
-rw-r--r-- | utils/fwparam_ibft/fwparam_sysfs.c | 24 |
2 files changed, 26 insertions, 0 deletions
diff --git a/include/fw_context.h b/include/fw_context.h index 6a7ec1a..44053d8 100644 --- a/include/fw_context.h +++ b/include/fw_context.h @@ -44,6 +44,7 @@ struct boot_context { char boot_target[BOOT_NAME_MAXLEN]; /* target settings */ + int target_flags; int target_port; char targetname[TARGET_NAME_MAXLEN + 1]; char target_ipaddr[NI_MAXHOST]; @@ -57,6 +58,7 @@ struct boot_context { char initiatorname[TARGET_NAME_MAXLEN + 1]; /* network settings */ + int nic_flags; enum ibft_ip_prefix_origin origin; char dhcp[NI_MAXHOST]; char iface[IF_NAMESIZE]; diff --git a/utils/fwparam_ibft/fwparam_sysfs.c b/utils/fwparam_ibft/fwparam_sysfs.c index cd87b68..c5b0b00 100644 --- a/utils/fwparam_ibft/fwparam_sysfs.c +++ b/utils/fwparam_ibft/fwparam_sysfs.c @@ -170,6 +170,18 @@ static int fill_nic_context(char *subsys, char *id, { int rc; + rc = sysfs_get_int(id, subsys, "flags", &context->nic_flags); + /* + * Per spec we would need to check against Bit 0 + * (Block Valid Flag), but some firmware only + * sets Bit 1 (Firmware Booting Selected). + * So any setting is deemed okay. + */ + if (!rc && (context->nic_flags == 0)) + rc = ENODEV; + if (rc) + return rc; + rc = sysfs_get_str(id, subsys, "mac", context->mac, sizeof(context->mac)); if (rc) @@ -236,6 +248,18 @@ static int fill_tgt_context(char *subsys, char *id, { int rc; + rc = sysfs_get_int(id, subsys, "flags", &context->target_flags); + /* + * Per spec we would need to check against Bit 0 + * (Block Valid Flag), but some firmware only + * sets Bit 1 (Firmware Booting Selected). + * So any setting is deemed okay. + */ + if (!rc && (context->nic_flags == 0)) + rc = ENODEV; + if (rc) + return rc; + rc = sysfs_get_str(id, subsys, "target-name", context->targetname, sizeof(context->targetname)); if (rc) |