net/dhcp: Set net_<interface>_client{id, uuid} variables from DHCP options
This patch sets a net_<interface>_clientid and net_<interface>_clientuuid GRUB environment variables, using the DHCP client ID and UUID options if these are found. In the same way than net_<interface>_<option> variables are set for other options such domain name, boot file, next server, etc. Signed-off-by: Paulo Flabiano Smorigo <pfsmorigo@br.ibm.com> Signed-off-by: Javier Martinez Canillas <javierm@redhat.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
parent
e921119857
commit
febc761e67
2 changed files with 46 additions and 8 deletions
|
@ -95,6 +95,14 @@ enum
|
|||
/* Max timeout when waiting for BOOTP/DHCP reply */
|
||||
#define GRUB_DHCP_MAX_PACKET_TIMEOUT 32
|
||||
|
||||
static char
|
||||
hexdigit (grub_uint8_t val)
|
||||
{
|
||||
if (val < 10)
|
||||
return val + '0';
|
||||
return val + 'a' - 10;
|
||||
}
|
||||
|
||||
static const void *
|
||||
find_dhcp_option (const struct grub_net_bootp_packet *bp, grub_size_t size,
|
||||
grub_uint8_t opt_code, grub_uint8_t *opt_len)
|
||||
|
@ -152,6 +160,9 @@ again:
|
|||
if (i + taglength >= size)
|
||||
return NULL;
|
||||
|
||||
grub_dprintf("net", "DHCP option %u (0x%02x) found with length %u.\n",
|
||||
tagtype, tagtype, taglength);
|
||||
|
||||
/* FIXME RFC 3396 options concatentation */
|
||||
if (tagtype == opt_code)
|
||||
{
|
||||
|
@ -406,6 +417,39 @@ grub_net_configure_by_dhcp_ack (const char *name,
|
|||
if (opt && opt_len)
|
||||
grub_env_set_net_property (name, "extensionspath", (const char *) opt, opt_len);
|
||||
|
||||
opt = find_dhcp_option (bp, size, GRUB_NET_BOOTP_CLIENT_ID, &opt_len);
|
||||
if (opt && opt_len)
|
||||
grub_env_set_net_property (name, "clientid", (const char *) opt, opt_len);
|
||||
|
||||
opt = find_dhcp_option (bp, size, GRUB_NET_BOOTP_CLIENT_UUID, &opt_len);
|
||||
if (opt && opt_len == 17)
|
||||
{
|
||||
/* The format is 9cfe245e-d0c8-bd45-a79f-54ea5fbd3d97 */
|
||||
char *val;
|
||||
int i, j = 0;
|
||||
|
||||
opt += 1;
|
||||
opt_len -= 1;
|
||||
|
||||
val = grub_malloc (2 * opt_len + 4 + 1);
|
||||
if (!val)
|
||||
return inter;
|
||||
|
||||
for (i = 0; i < opt_len; i++)
|
||||
{
|
||||
val[2 * i + j] = hexdigit (opt[i] >> 4);
|
||||
val[2 * i + 1 + j] = hexdigit (opt[i] & 0xf);
|
||||
|
||||
if ((i == 3) || (i == 5) || (i == 7) || (i == 9))
|
||||
{
|
||||
j++;
|
||||
val[2 * i + 1+ j] = '-';
|
||||
}
|
||||
}
|
||||
grub_env_set_net_property (name, "clientuuid", (char *) val, 2 * opt_len + 4);
|
||||
grub_free (val);
|
||||
}
|
||||
|
||||
inter->dhcp_ack = grub_malloc (size);
|
||||
if (inter->dhcp_ack)
|
||||
{
|
||||
|
@ -631,14 +675,6 @@ grub_net_process_dhcp (struct grub_net_buff *nb,
|
|||
}
|
||||
}
|
||||
|
||||
static char
|
||||
hexdigit (grub_uint8_t val)
|
||||
{
|
||||
if (val < 10)
|
||||
return val + '0';
|
||||
return val + 'a' - 10;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_dhcpopt (struct grub_command *cmd __attribute__ ((unused)),
|
||||
int argc, char **args)
|
||||
|
|
|
@ -467,8 +467,10 @@ enum
|
|||
GRUB_NET_DHCP_MESSAGE_TYPE = 53,
|
||||
GRUB_NET_DHCP_SERVER_IDENTIFIER = 54,
|
||||
GRUB_NET_DHCP_PARAMETER_REQUEST_LIST = 55,
|
||||
GRUB_NET_BOOTP_CLIENT_ID = 61,
|
||||
GRUB_NET_DHCP_TFTP_SERVER_NAME = 66,
|
||||
GRUB_NET_DHCP_BOOTFILE_NAME = 67,
|
||||
GRUB_NET_BOOTP_CLIENT_UUID = 97,
|
||||
GRUB_NET_BOOTP_END = 255
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue