Support Solaris DHCP ACK parsing
This commit is contained in:
parent
c042567715
commit
779e9dc480
3 changed files with 32 additions and 3 deletions
|
@ -32,6 +32,7 @@
|
||||||
#include <grub/relocator.h>
|
#include <grub/relocator.h>
|
||||||
#include <grub/video.h>
|
#include <grub/video.h>
|
||||||
#include <grub/file.h>
|
#include <grub/file.h>
|
||||||
|
#include <grub/net.h>
|
||||||
|
|
||||||
/* The bits in the required part of flags field we don't support. */
|
/* The bits in the required part of flags field we don't support. */
|
||||||
#define UNSUPPORTED_FLAGS 0x0000fff8
|
#define UNSUPPORTED_FLAGS 0x0000fff8
|
||||||
|
@ -189,12 +190,24 @@ grub_multiboot_load (grub_file_t file)
|
||||||
static grub_size_t
|
static grub_size_t
|
||||||
grub_multiboot_get_mbi_size (void)
|
grub_multiboot_get_mbi_size (void)
|
||||||
{
|
{
|
||||||
return sizeof (struct multiboot_info) + ALIGN_UP (cmdline_size, 4)
|
grub_size_t ret;
|
||||||
|
struct grub_net_network_level_interface *net;
|
||||||
|
|
||||||
|
ret = sizeof (struct multiboot_info) + ALIGN_UP (cmdline_size, 4)
|
||||||
+ modcnt * sizeof (struct multiboot_mod_list) + total_modcmd
|
+ modcnt * sizeof (struct multiboot_mod_list) + total_modcmd
|
||||||
+ ALIGN_UP (sizeof(PACKAGE_STRING), 4)
|
+ ALIGN_UP (sizeof(PACKAGE_STRING), 4)
|
||||||
+ grub_get_multiboot_mmap_count () * sizeof (struct multiboot_mmap_entry)
|
+ grub_get_multiboot_mmap_count () * sizeof (struct multiboot_mmap_entry)
|
||||||
+ elf_sec_entsize * elf_sec_num
|
+ elf_sec_entsize * elf_sec_num
|
||||||
+ 256 * sizeof (struct multiboot_color);
|
+ 256 * sizeof (struct multiboot_color);
|
||||||
|
|
||||||
|
FOR_NET_NETWORK_LEVEL_INTERFACES(net)
|
||||||
|
if (net->dhcp_ack)
|
||||||
|
{
|
||||||
|
ret += net->dhcp_acklen;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fill previously allocated Multiboot mmap. */
|
/* Fill previously allocated Multiboot mmap. */
|
||||||
|
@ -401,6 +414,20 @@ grub_multiboot_make_mbi (grub_uint32_t *target)
|
||||||
mbi->flags |= MULTIBOOT_INFO_BOOTDEV;
|
mbi->flags |= MULTIBOOT_INFO_BOOTDEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
struct grub_net_network_level_interface *net;
|
||||||
|
FOR_NET_NETWORK_LEVEL_INTERFACES(net)
|
||||||
|
if (net->dhcp_ack)
|
||||||
|
{
|
||||||
|
grub_memcpy (ptrorig, net->dhcp_ack, net->dhcp_acklen);
|
||||||
|
mbi->drives_addr = ptrdest;
|
||||||
|
mbi->drives_length = net->dhcp_acklen;
|
||||||
|
ptrorig += net->dhcp_acklen;
|
||||||
|
ptrdest += net->dhcp_acklen;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (elf_sec_num)
|
if (elf_sec_num)
|
||||||
{
|
{
|
||||||
mbi->u.elf_sec.addr = ptrdest;
|
mbi->u.elf_sec.addr = ptrdest;
|
||||||
|
|
|
@ -49,8 +49,6 @@ grub_net_network_level_interface_unregister (struct grub_net_network_level_inter
|
||||||
GRUB_AS_LIST (inter));
|
GRUB_AS_LIST (inter));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FOR_NET_NETWORK_LEVEL_INTERFACES(var) for (var = grub_net_network_level_interfaces; var; var = var->next)
|
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
grub_net_route_register (struct grub_net_route *route)
|
grub_net_route_register (struct grub_net_route *route)
|
||||||
{
|
{
|
||||||
|
|
|
@ -277,4 +277,8 @@ void
|
||||||
grub_net_addr_to_str (const grub_net_network_level_address_t *target,
|
grub_net_addr_to_str (const grub_net_network_level_address_t *target,
|
||||||
char *buf);
|
char *buf);
|
||||||
|
|
||||||
|
extern struct grub_net_network_level_interface *grub_net_network_level_interfaces;
|
||||||
|
#define FOR_NET_NETWORK_LEVEL_INTERFACES(var) for (var = grub_net_network_level_interfaces; var; var = var->next)
|
||||||
|
|
||||||
|
|
||||||
#endif /* ! GRUB_NET_HEADER */
|
#endif /* ! GRUB_NET_HEADER */
|
||||||
|
|
Loading…
Reference in a new issue