diff options
| author | Michael Brown | 2014-06-12 17:05:48 +0200 |
|---|---|---|
| committer | Michael Brown | 2014-06-12 18:09:16 +0200 |
| commit | d5cf0589940c1cfd5907a2fd8183064ec2244617 (patch) | |
| tree | 036fcca516b8cc6968b519a19446bcad4f67748d /src | |
| parent | [iscsi] Read IPv4 settings only from the relevant network device (diff) | |
| download | ipxe-d5cf0589940c1cfd5907a2fd8183064ec2244617.tar.gz ipxe-d5cf0589940c1cfd5907a2fd8183064ec2244617.tar.xz ipxe-d5cf0589940c1cfd5907a2fd8183064ec2244617.zip | |
[iscsi] Include IP address origin in iBFT
The iBFT includes an "origin" field to indicate the source of the IP
address. We use the heuristic of assuming that the source should be
"manual" if the IP address originates directly from the network device
settings block, and "DHCP" otherwise. This is an imperfect guess, but
is likely to be correct in most common situations.
Originally-implemented-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src')
| -rw-r--r-- | src/drivers/block/ibft.c | 7 | ||||
| -rw-r--r-- | src/include/ipxe/ibft.h | 8 |
2 files changed, 15 insertions, 0 deletions
diff --git a/src/drivers/block/ibft.c b/src/drivers/block/ibft.c index f61add321..6aabd766a 100644 --- a/src/drivers/block/ibft.c +++ b/src/drivers/block/ibft.c @@ -236,6 +236,7 @@ static int ibft_fill_nic ( struct ibft_nic *nic, struct in_addr netmask_addr = { 0 }; unsigned int netmask_count = 0; struct settings *parent = netdev_settings ( netdev ); + struct settings *origin; int rc; /* Fill in common header */ @@ -245,6 +246,12 @@ static int ibft_fill_nic ( struct ibft_nic *nic, nic->header.flags = ( IBFT_FL_NIC_BLOCK_VALID | IBFT_FL_NIC_FIRMWARE_BOOT_SELECTED ); + /* Determine origin of IP address */ + fetch_setting ( parent, &ip_setting, &origin, NULL, NULL, 0 ); + nic->origin = ( ( origin == parent ) ? + IBFT_NIC_ORIGIN_MANUAL : IBFT_NIC_ORIGIN_DHCP ); + DBG ( "iBFT NIC origin = %d\n", nic->origin ); + /* Extract values from configuration settings */ ibft_set_ipaddr_setting ( parent, &nic->ip_address, &ip_setting, 1 ); DBG ( "iBFT NIC IP = %s\n", ibft_ipaddr ( &nic->ip_address ) ); diff --git a/src/include/ipxe/ibft.h b/src/include/ipxe/ibft.h index 73372122d..35f15105c 100644 --- a/src/include/ipxe/ibft.h +++ b/src/include/ipxe/ibft.h @@ -197,6 +197,14 @@ struct ibft_nic { /** NIC global / link local */ #define IBFT_FL_NIC_GLOBAL 0x04 +/** NIC IP address origin */ +#define IBFT_NIC_ORIGIN_OTHER 0x00 +#define IBFT_NIC_ORIGIN_MANUAL 0x01 +#define IBFT_NIC_ORIGIN_WELLKNOWN 0x02 +#define IBFT_NIC_ORIGIN_DHCP 0x03 +#define IBFT_NIC_ORIGIN_RA 0x04 +#define IBFT_NIC_ORIGIN_UNCHANGED 0x0f + /** * iBFT Target structure * |
