grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 2/4] Send a user class identifier in bootp requests and tag i


From: Michael Marineau
Subject: Re: [PATCH 2/4] Send a user class identifier in bootp requests and tag it as DHCP discover
Date: Mon, 23 Jan 2017 22:09:58 -0800

On Mon, Jan 23, 2017 at 4:35 PM, Matthew Garrett <address@hidden> wrote:
> It's helpful to determine that a request was sent by grub in order to permit
> the server to provide different information at different stages of the boot
> process. Send GRUB2 as a type 77 DHCP option when sending bootp packets in
> order to make this possible and tag the request as a DHCP discover to
> convince servers to pay attention to it. Add the client architecture for
> good measure.
> ---
>  grub-core/net/bootp.c | 42 +++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 41 insertions(+), 1 deletion(-)
>
> diff --git a/grub-core/net/bootp.c b/grub-core/net/bootp.c
> index 9e2fdb7..0da8e24 100644
> --- a/grub-core/net/bootp.c
> +++ b/grub-core/net/bootp.c
> @@ -25,6 +25,24 @@
>  #include <grub/net/udp.h>
>  #include <grub/datetime.h>
>
> +#if !defined(GRUB_MACHINE_EFI) && (defined(__i386__) || defined(__x86_64__))
> +#define GRUB_NET_BOOTP_ARCH 0x0000
> +#elif defined(GRUB_MACHINE_EFI) && defined(__x86_64__)
> +#define GRUB_NET_BOOTP_ARCH 0x0007
> +#elif defined(GRUB_MACHINE_EFI) && defined(__aarch64__)
> +#define GRUB_NET_BOOTP_ARCH 0x000B
> +#else
> +#error "unknown bootp architecture"
> +#endif

This list is woefully incomplete and there aren't even allocated
values for every platform that grub supports so adding the
architecture option will need to be optional.

> +
> +static grub_uint8_t dhcp_option_header[] = {GRUB_NET_BOOTP_RFC1048_MAGIC_0,
> +                                           GRUB_NET_BOOTP_RFC1048_MAGIC_1,
> +                                           GRUB_NET_BOOTP_RFC1048_MAGIC_2,
> +                                           GRUB_NET_BOOTP_RFC1048_MAGIC_3};
> +static grub_uint8_t grub_userclass[] = {0x4D, 0x06, 0x05, 'G', 'R', 'U', 
> 'B', '2'};
> +static grub_uint8_t grub_dhcpdiscover[] = {0x35, 0x01, 0x01};
> +static grub_uint8_t grub_dhcptime[] = {0x33, 0x04, 0x00, 0x00, 0x0e, 0x10};
> +
>  static void
>  parse_dhcp_vendor (const char *name, const void *vend, int limit, int *mask)
>  {
> @@ -499,10 +517,14 @@ grub_cmd_bootp (struct grub_command *cmd __attribute__ 
> ((unused)),
>           struct udphdr *udph;
>           grub_net_network_level_address_t target;
>           grub_net_link_level_address_t ll_target;
> +         grub_uint8_t *offset;
>
>           if (!ifaces[j].prev)
>             continue;
> -         nb = grub_netbuff_alloc (sizeof (*pack) + 64 + 128);
> +         nb = grub_netbuff_alloc (sizeof (*pack) + sizeof(dhcp_option_header)
> +                                  + sizeof(grub_userclass)
> +                                  + sizeof(grub_dhcpdiscover)
> +                                  + sizeof(grub_dhcptime) + 64 + 128);

Increasing the allocation without also updating grub_netbuff_reserve
and grub_netbuff_push calls doesn't actually influence the amount of
space in the packet. grub_netbuff_alloc and grub_netbuff_reserve
should be given the total size of the packet: ethernet+ip+udp+bootp
while grub_netbuff_push is called for each of those layers. As-is this
happens to work because the existing code included 64 bytes of zeros
at the end of the bootp packet. The new options use 26 of those bytes.
The extra 128 bytes of the reservation is for the lower protocol
headers (ethernet+ip+udp).

I don't now why the original code included 64 bytes of trailing zeros
or allocates 128 for the lower protocols when only 42 will ever be
used I don't know, that seems to be the state of the code on initial
check-in to git.

>           if (!nb)
>             {
>               grub_netbuff_free (nb);
> @@ -536,6 +558,24 @@ grub_cmd_bootp (struct grub_command *cmd __attribute__ 
> ((unused)),
>           pack->seconds = grub_cpu_to_be16 (t);
>
>           grub_memcpy (&pack->mac_addr, &ifaces[j].hwaddress.mac, 6);
> +         offset = (grub_uint8_t *)&pack->vendor;
> +         grub_memcpy (offset, dhcp_option_header, 
> sizeof(dhcp_option_header));
> +         offset += sizeof(dhcp_option_header);
> +         grub_memcpy (offset, grub_dhcpdiscover, sizeof(grub_dhcpdiscover));
> +         offset += sizeof(grub_dhcpdiscover);
> +         grub_memcpy (offset, grub_userclass, sizeof(grub_userclass));
> +         offset += sizeof(grub_userclass);
> +         grub_memcpy (offset, grub_dhcptime, sizeof(grub_dhcptime));
> +
> +         /* insert Client System Architecture (option 93) */
> +         offset += sizeof(grub_dhcptime);
> +         offset[0] = 93;
> +         offset[1] = 2;
> +         offset[2] = (GRUB_NET_BOOTP_ARCH >> 8);
> +         offset[3] = (GRUB_NET_BOOTP_ARCH & 0xFF);
> +
> +         /* option terminator */
> +         offset[4] = 255;
>
>           grub_netbuff_push (nb, sizeof (*udph));
>
> --
> 2.9.3
>
>
> _______________________________________________
> Grub-devel mailing list
> address@hidden
> https://lists.gnu.org/mailman/listinfo/grub-devel



reply via email to

[Prev in Thread] Current Thread [Next in Thread]