]> git.proxmox.com Git - grub2.git/commitdiff
Merge mainline into net
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Wed, 22 Sep 2010 18:13:00 +0000 (20:13 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Wed, 22 Sep 2010 18:13:00 +0000 (20:13 +0200)
12 files changed:
1  2 
Makefile.util.def
grub-core/Makefile.am
grub-core/Makefile.core.def
grub-core/commands/ls.c
grub-core/commands/probe.c
grub-core/kern/device.c
grub-core/kern/ieee1275/openfw.c
grub-core/loader/i386/multiboot_mbi.c
grub-core/net/i386/pc/pxe.c
include/grub/disk.h
include/grub/err.h
include/grub/ieee1275/ieee1275.h

index 68c105a9b7db654a286096a4bb793424c9a4f35f,f4ae01bd369ebe6c7cce36f70d70a5d78019beec..1a5944da2b9551286827c4351d03bdde01ce303b
@@@ -30,9 -21,7 +21,8 @@@ library = 
    common = grub-core/commands/blocklist.c;
    common = grub-core/commands/extcmd.c;
    common = grub-core/commands/ls.c;
 +  common = grub-core/net/net.c;
    common = grub-core/disk/dmraid_nvidia.c;
-   common = grub-core/disk/host.c;
    common = grub-core/disk/loopback.c;
    common = grub-core/disk/lvm.c;
    common = grub-core/disk/mdraid_linux.c;
index 1fcc3d00d8e6afb0c5bc2f39da3e03556754f0b0,addc834175b54025996162ebee34fed742155c23..89cab1ee40e8987ec0b80714b7504601aa95bd81
@@@ -74,10 -74,10 +74,11 @@@ KERNEL_HEADER_FILES += $(top_srcdir)/in
  KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/time.h
  KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/mm_private.h
  KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/boot.h
 +KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/net.h
+ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/libgcc.h
+ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/memory.h
  
  if COND_i386_pc
- KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/memory.h
  KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/loader.h
  KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
  KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/pxe.h
index 2f55ba5ec513a379aa1d9db9891a3a3d40ba1b61,bf79a277a9f44521317fcc6cfda8087712e49d06..d48c5d5051e1a377c9284f63f05434488242c891
@@@ -1377,30 -1431,42 +1431,70 @@@ module = 
    common = hook/datehook.c;
  };
  
 +module = {
 +  name = net;
 +  common = net/net.c;
 +  common = net/ip.c;
 +  common = net/udp.c;
 +  common = net/ethernet.c;
 +  common = net/arp.c;
 +  common = net/interface.c;
 +  common = net/netbuff.c;
 +};
 +
 +module = {
 +  name = tftp;
 +  common = net/tftp.c;
 +};
 +
 +module = {
 +  name = ofnet;
 +  ieee1275 = net/drivers/ieee1275/ofnet.c;
 +  enable = ieee1275;
 +};
 +
 +module = {
 +  name = emunet;
 +  emu = net/drivers/emu/emunet.c;
 +  enable = ieee1275;
 +};
++
+ module = {
+   name = legacycfg;
+   common = commands/legacycfg.c;
+   common = lib/legacy_parse.c;
+   emu = lib/i386/pc/vesa_modes_table.c;
+   enable = i386_pc;
+   enable = emu;
+ };
+ module = {
+   name = test_blockarg;
+   common = tests/test_blockarg.c;
+ };
+ module = {
+   name = xzio;
+   common = io/xzio.c;
+   common = lib/xzembed/xz_dec_bcj.c;
+   common = lib/xzembed/xz_dec_lzma2.c;
+   common = lib/xzembed/xz_dec_stream.c;
+   cppflags = '-I$(srcdir)/lib/posix_wrap -I$(srcdir)/lib/xzembed';
+ };
+ module = {
+   name = testload;
+   common = commands/testload.c;
+ };
+ module = {
+   name = lsapm;
+   common = commands/i386/pc/lsapm.c;
+   enable = i386_pc;
+ };
+ module = {
+   name = keylayouts;
+   common = commands/keylayouts.c;
+   enable = videomodules;
+ };
Simple merge
Simple merge
Simple merge
index 6670804b7e1cf4062c8eea2f69cf1e545d88c5fc,f5dc8efb1bd6ad1194c2391e79be8b1ac581d93a..3c228f57482ef78455898d3bbb126a5e19024eed
@@@ -438,3 -424,46 +438,47 @@@ grub_reboot (void
  }
  #endif
  
+ /* Resolve aliases.  */
+ char *
+ grub_ieee1275_canonicalise_devname (const char *path)
+ {
+   struct canon_args
+   {
+     struct grub_ieee1275_common_hdr common;
+     grub_ieee1275_cell_t path;
+     grub_ieee1275_cell_t buf;
+     grub_ieee1275_cell_t inlen;
+     grub_ieee1275_cell_t outlen;
+   }
+   args;
+   char *buf = NULL;
+   grub_size_t bufsize = 64;
+   int i;
+   for (i = 0; i < 2; i++)
+     {
+       grub_free (buf);
+       buf = grub_malloc (bufsize);
+       if (!buf)
+       return NULL;
+       INIT_IEEE1275_COMMON (&args.common, "canon", 3, 1);
+       args.path = (grub_ieee1275_cell_t) path;
+       args.buf = (grub_ieee1275_cell_t) buf;
+       args.inlen = (grub_ieee1275_cell_t) (bufsize - 1);
+       if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
+       return 0;
+       if (args.outlen > bufsize - 1)
+       {
+         bufsize = args.outlen + 2;
+         continue;
+       }
+       return buf;
+     }
+   /* Shouldn't reach here.  */
+   grub_free (buf);
+   return NULL;
+ }
++
index 9d6497442ac2ee1f75e58464b6bc5db95dedb8b6,283b84c5a870aff58d2f1c353af65abd89880c8b..af09e9d738f5f84fa12e56e36d92c51ba6573b5d
@@@ -198,16 -195,12 +199,21 @@@ grub_multiboot_get_mbi_size (void
      + ALIGN_UP (sizeof(PACKAGE_STRING), 4) 
      + grub_get_multiboot_mmap_count () * sizeof (struct multiboot_mmap_entry)
      + elf_sec_entsize * elf_sec_num
-     + 256 * sizeof (struct multiboot_color);
+     + 256 * sizeof (struct multiboot_color)
+ #if GRUB_MACHINE_HAS_VBE
+     + sizeof (struct grub_vbe_info_block)
+     + sizeof (struct grub_vbe_mode_info_block)
+ #endif
+     + ALIGN_UP (sizeof (struct multiboot_apm_info), 4);
 +
 +  FOR_NET_NETWORK_LEVEL_INTERFACES(net)
 +    if (net->dhcp_ack)
 +      {
 +      ret += net->dhcp_acklen;
 +      break;
 +      }
 +
 +  return ret;
  }
  
  /* Fill previously allocated Multiboot mmap.  */
index 347d8562b035c3f4bea0ba1d19782ed246b0ff38,0000000000000000000000000000000000000000..fd1447b40888ad648d3069b567aaf777bad64adc
mode 100644,000000..100644
--- /dev/null
@@@ -1,472 -1,0 +1,473 @@@
-       o.packet_size = grub_pxe_blksize;
 +/* pxe.c - Driver to provide access to the pxe filesystem  */
 +/*
 + *  GRUB  --  GRand Unified Bootloader
 + *  Copyright (C) 2008,2009  Free Software Foundation, Inc.
 + *
 + *  GRUB is free software: you can redistribute it and/or modify
 + *  it under the terms of the GNU General Public License as published by
 + *  the Free Software Foundation, either version 3 of the License, or
 + *  (at your option) any later version.
 + *
 + *  GRUB is distributed in the hope that it will be useful,
 + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + *  GNU General Public License for more details.
 + *
 + *  You should have received a copy of the GNU General Public License
 + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
 + */
 +
 +#include <grub/dl.h>
 +#include <grub/net.h>
 +#include <grub/mm.h>
 +#include <grub/file.h>
 +#include <grub/misc.h>
 +#include <grub/bufio.h>
 +#include <grub/env.h>
 +
 +#include <grub/machine/pxe.h>
 +#include <grub/machine/int.h>
 +#include <grub/machine/memory.h>
 +
 +#define SEGMENT(x)    ((x) >> 4)
 +#define OFFSET(x)     ((x) & 0xF)
 +#define SEGOFS(x)     ((SEGMENT(x) << 16) + OFFSET(x))
 +#define LINEAR(x)     (void *) (((x >> 16) << 4) + (x & 0xFFFF))
 +
 +struct grub_pxe_bangpxe *grub_pxe_pxenv;
 +static grub_uint32_t grub_pxe_default_server_ip;
 +#if 0
 +static grub_uint32_t grub_pxe_default_gateway_ip;
 +#endif
 +static unsigned grub_pxe_blksize = GRUB_PXE_MIN_BLKSIZE;
 +static grub_uint32_t pxe_rm_entry = 0;
 +static grub_file_t curr_file = 0;
 +
 +struct grub_pxe_data
 +{
 +  grub_uint32_t packet_number;
 +  grub_uint32_t block_size;
 +  grub_uint32_t server_ip;
 +  grub_uint32_t gateway_ip;
 +  char filename[0];
 +};
 +
 +
 +static struct grub_pxe_bangpxe *
 +grub_pxe_scan (void)
 +{
 +  struct grub_bios_int_registers regs;
 +  struct grub_pxenv *pxenv;
 +  struct grub_pxe_bangpxe *bangpxe;
 +
 +  regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT;
 +
 +  regs.ebx = 0;
 +  regs.ecx = 0;
 +  regs.eax = 0x5650;
 +  regs.es = 0;
 +
 +  grub_bios_interrupt (0x1a, &regs);
 +
 +  if ((regs.eax & 0xffff) != 0x564e)
 +    return NULL;
 +
 +  pxenv = (struct grub_pxenv *) ((regs.es << 4) + (regs.ebx & 0xffff));
 +  if (grub_memcmp (pxenv->signature, GRUB_PXE_SIGNATURE,
 +                 sizeof (pxenv->signature))
 +      != 0)
 +    return NULL;
 +
 +  if (pxenv->version < 0x201)
 +    return NULL;
 +
 +  bangpxe = (void *) ((((pxenv->pxe_ptr & 0xffff0000) >> 16) << 4)
 +                    + (pxenv->pxe_ptr & 0xffff));
 +
 +  if (!bangpxe)
 +    return NULL;
 +
 +  if (grub_memcmp (bangpxe->signature, GRUB_PXE_BANGPXE_SIGNATURE,
 +                 sizeof (bangpxe->signature)) != 0)
 +    return NULL;
 +
 +  pxe_rm_entry = bangpxe->rm_entry;
 +
 +  return bangpxe;
 +}
 +
 +static grub_err_t
 +grub_pxefs_dir (grub_device_t device  __attribute__ ((unused)),
 +              const char *path  __attribute__ ((unused)),
 +              int (*hook) (const char *filename,
 +                           const struct grub_dirhook_info *info)
 +              __attribute__ ((unused)))
 +{
 +  return GRUB_ERR_NONE;
 +}
 +
 +static grub_err_t
 +grub_pxefs_open (struct grub_file *file, const char *name)
 +{
 +  union
 +    {
 +      struct grub_pxenv_tftp_get_fsize c1;
 +      struct grub_pxenv_tftp_open c2;
 +    } c;
 +  struct grub_pxe_data *data;
 +  grub_file_t file_int, bufio;
 +
 +  data = grub_malloc (sizeof (*data));
 +  if (!data)
 +    return grub_errno;
 +
 +  {
 +    grub_net_network_level_address_t addr;
 +    grub_net_network_level_address_t gateway;
 +    struct grub_net_network_level_interface *interf;
 +    grub_err_t err;
 +    
 +    if (grub_strncmp (file->device->net->name,
 +                    "pxe,", sizeof ("pxe,") - 1) == 0
 +      || grub_strncmp (file->device->net->name,
 +                       "pxe:", sizeof ("pxe:") - 1) == 0)
 +      {
 +      err = grub_net_resolve_address (file->device->net->name
 +                                      + sizeof ("pxe,") - 1, &addr);
 +      if (err)
 +        return err;
 +      }
 +    else
 +      {
 +      addr.ipv4 = grub_pxe_default_server_ip;
 +      addr.type = GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV4;
 +      }
 +    err = grub_net_route_address (addr, &gateway, &interf);
 +    if (err)
 +      return err;
 +    data->server_ip = addr.ipv4;
 +    data->gateway_ip = gateway.ipv4;
 +  }
 +
 +  if (curr_file != 0)
 +    {
 +      grub_pxe_call (GRUB_PXENV_TFTP_CLOSE, &c.c2, pxe_rm_entry);
 +      curr_file = 0;
 +    }
 +
 +  c.c1.server_ip = data->server_ip;
 +  c.c1.gateway_ip = data->gateway_ip;
 +  grub_strcpy ((char *)&c.c1.filename[0], name);
 +  grub_pxe_call (GRUB_PXENV_TFTP_GET_FSIZE, &c.c1, pxe_rm_entry);
 +  if (c.c1.status)
 +    return grub_error (GRUB_ERR_FILE_NOT_FOUND, "file not found");
 +
 +  file->size = c.c1.file_size;
 +
 +  c.c2.tftp_port = grub_cpu_to_be16 (GRUB_PXE_TFTP_PORT);
 +  c.c2.packet_size = grub_pxe_blksize;
 +  grub_pxe_call (GRUB_PXENV_TFTP_OPEN, &c.c2, pxe_rm_entry);
 +  if (c.c2.status)
 +    return grub_error (GRUB_ERR_BAD_FS, "open fails");
 +
 +  data = grub_zalloc (sizeof (struct grub_pxe_data) + grub_strlen (name) + 1);
 +  if (! data)
 +    return grub_errno;
 +
 +  data->block_size = c.c2.packet_size;
 +  grub_strcpy (data->filename, name);
 +
 +  file_int = grub_malloc (sizeof (*file_int));
 +  if (! file_int)
 +    {
 +      grub_free (data);
 +      return grub_errno;
 +    }
 +
 +  file->data = data;
++  file->not_easly_seekable = 1;
 +  grub_memcpy (file_int, file, sizeof (struct grub_file));
 +  curr_file = file_int;
 +
 +  bufio = grub_bufio_open (file_int, data->block_size);
 +  if (! bufio)
 +    {
 +      grub_free (file_int);
 +      grub_free (data);
 +      return grub_errno;
 +    }
 +
 +  grub_memcpy (file, bufio, sizeof (struct grub_file));
 +
 +  return GRUB_ERR_NONE;
 +}
 +
 +static grub_ssize_t
 +grub_pxefs_read (grub_file_t file, char *buf, grub_size_t len)
 +{
 +  struct grub_pxenv_tftp_read c;
 +  struct grub_pxe_data *data;
 +  grub_uint32_t pn, r;
 +
 +  data = file->data;
 +
 +  pn = grub_divmod64 (file->offset, data->block_size, &r);
 +  if (r)
 +    {
 +      grub_error (GRUB_ERR_BAD_FS,
 +                "read access must be aligned to packet size");
 +      return -1;
 +    }
 +
 +  if ((curr_file != file) || (data->packet_number > pn))
 +    {
 +      struct grub_pxenv_tftp_open o;
 +
 +      if (curr_file != 0)
 +        grub_pxe_call (GRUB_PXENV_TFTP_CLOSE, &o, pxe_rm_entry);
 +
 +      o.server_ip = data->server_ip;
 +      o.gateway_ip = data->gateway_ip;
 +      grub_strcpy ((char *)&o.filename[0], data->filename);
 +      o.tftp_port = grub_cpu_to_be16 (GRUB_PXE_TFTP_PORT);
++      o.packet_size = data->block_size;
 +      grub_pxe_call (GRUB_PXENV_TFTP_OPEN, &o, pxe_rm_entry);
 +      if (o.status)
 +      {
 +        grub_error (GRUB_ERR_BAD_FS, "open fails");
 +        return -1;
 +      }
 +      data->block_size = o.packet_size;
 +      data->packet_number = 0;
 +      curr_file = file;
 +    }
 +
 +  c.buffer = SEGOFS (GRUB_MEMORY_MACHINE_SCRATCH_ADDR);
 +  while (pn >= data->packet_number)
 +    {
 +      c.buffer_size = data->block_size;
 +      grub_pxe_call (GRUB_PXENV_TFTP_READ, &c, pxe_rm_entry);
 +      if (c.status)
 +        {
 +          grub_error (GRUB_ERR_BAD_FS, "read fails");
 +          return -1;
 +        }
 +      data->packet_number++;
 +    }
 +
 +  grub_memcpy (buf, (char *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR, len);
 +
 +  return len;
 +}
 +
 +static grub_err_t
 +grub_pxefs_close (grub_file_t file)
 +{
 +  struct grub_pxenv_tftp_close c;
 +
 +  if (curr_file == file)
 +    {
 +      grub_pxe_call (GRUB_PXENV_TFTP_CLOSE, &c, pxe_rm_entry);
 +      curr_file = 0;
 +    }
 +
 +  grub_free (file->data);
 +
 +  return GRUB_ERR_NONE;
 +}
 +
 +static grub_err_t
 +grub_pxefs_label (grub_device_t device __attribute ((unused)),
 +                 char **label __attribute ((unused)))
 +{
 +  *label = 0;
 +  return GRUB_ERR_NONE;
 +}
 +
 +static struct grub_fs grub_pxefs_fs =
 +  {
 +    .name = "pxe",
 +    .dir = grub_pxefs_dir,
 +    .open = grub_pxefs_open,
 +    .read = grub_pxefs_read,
 +    .close = grub_pxefs_close,
 +    .label = grub_pxefs_label,
 +    .next = 0
 +  };
 +
 +static grub_size_t 
 +grub_pxe_recv (struct grub_net_card *dev __attribute__ ((unused)),
 +             struct grub_net_buff *buf __attribute__ ((unused)))
 +{
 +  return 0;
 +}
 +
 +static grub_err_t 
 +grub_pxe_send (struct grub_net_card *dev __attribute__ ((unused)),
 +             struct grub_net_buff *buf __attribute__ ((unused)))
 +{
 +  return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, "not implemented");
 +}
 +
 +struct grub_net_card_driver grub_pxe_card_driver =
 +{
 +  .send = grub_pxe_send,
 +  .recv = grub_pxe_recv
 +};
 +
 +struct grub_net_card grub_pxe_card =
 +{
 +  .driver = &grub_pxe_card_driver,
 +  .name = "pxe"
 +};
 +
 +void
 +grub_pxe_unload (void)
 +{
 +  if (grub_pxe_pxenv)
 +    {
 +      grub_net_app_level_unregister (&grub_pxefs_fs);
 +      grub_net_card_unregister (&grub_pxe_card);
 +      grub_pxe_pxenv = 0;
 +    }
 +}
 +
 +static void
 +set_ip_env (char *varname, grub_uint32_t ip)
 +{
 +  char buf[GRUB_NET_MAX_STR_ADDR_LEN];
 +  grub_net_network_level_address_t addr;
 +  addr.type = GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV4;
 +  addr.ipv4 = ip;
 +
 +  grub_net_addr_to_str (&addr, buf);
 +  grub_env_set (varname, buf);
 +}
 +
 +static char *
 +write_ip_env (grub_uint32_t *ip, const char *val)
 +{
 +  char *buf;
 +  grub_err_t err;
 +  grub_net_network_level_address_t addr;
 +
 +  err = grub_net_resolve_address (val, &addr);
 +  if (err)
 +    return 0;
 +  if (addr.type != GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV4)
 +    return NULL;
 +
 +  /* Normalize the IP.  */
 +  buf = grub_malloc (GRUB_NET_MAX_STR_ADDR_LEN);
 +  if (!buf)
 +    return 0;
 +  grub_net_addr_to_str (&addr, buf);
 +
 +  *ip = addr.ipv4;
 +
 +  return buf; 
 +}
 +
 +static char *
 +grub_env_write_pxe_default_server (struct grub_env_var *var 
 +                                 __attribute__ ((unused)),
 +                                 const char *val)
 +{
 +  return write_ip_env (&grub_pxe_default_server_ip, val);
 +}
 +
 +#if 0
 +static char *
 +grub_env_write_pxe_default_gateway (struct grub_env_var *var
 +                                  __attribute__ ((unused)),
 +                                  const char *val)
 +{
 +  return write_ip_env (&grub_pxe_default_gateway_ip, val);
 +}
 +#endif
 +
 +static char *
 +grub_env_write_pxe_blocksize (struct grub_env_var *var __attribute__ ((unused)),
 +                            const char *val)
 +{
 +  unsigned size;
 +  char *buf;
 +
 +  size = grub_strtoul (val, 0, 0);
 +  if (grub_errno)
 +    return 0;
 +
 +  if (size < GRUB_PXE_MIN_BLKSIZE)
 +    size = GRUB_PXE_MIN_BLKSIZE;
 +  else if (size > GRUB_PXE_MAX_BLKSIZE)
 +    size = GRUB_PXE_MAX_BLKSIZE;
 +  
 +  buf = grub_xasprintf ("%d", size);
 +  if (!buf)
 +    return 0;
 +
 +  grub_pxe_blksize = size;
 +  
 +  return buf;
 +}
 +
 +GRUB_MOD_INIT(pxe)
 +{
 +  struct grub_pxe_bangpxe *pxenv;
 +  struct grub_pxenv_get_cached_info ci;
 +  struct grub_net_bootp_ack *bp;
 +  char *buf;
 +
 +  pxenv = grub_pxe_scan ();
 +  if (! pxenv)
 +    return;
 +
 +  ci.packet_type = GRUB_PXENV_PACKET_TYPE_DHCP_ACK;
 +  ci.buffer = 0;
 +  ci.buffer_size = 0;
 +  grub_pxe_call (GRUB_PXENV_GET_CACHED_INFO, &ci, pxe_rm_entry);
 +  if (ci.status)
 +    return;
 +
 +  bp = LINEAR (ci.buffer);
 +
 +  grub_pxe_default_server_ip = bp->server_ip;
 +  grub_pxe_pxenv = pxenv;
 +
 +  set_ip_env ("pxe_default_server", grub_pxe_default_server_ip);      
 +  grub_register_variable_hook ("pxe_default_server", 0,
 +                             grub_env_write_pxe_default_server);
 +
 +#if 0
 +  grub_pxe_default_gateway_ip = bp->gateway_ip;
 +
 +  grub_register_variable_hook ("pxe_default_gateway", 0,
 +                             grub_env_write_pxe_default_gateway);
 +#endif
 +
 +  buf = grub_xasprintf ("%d", grub_pxe_blksize);
 +  if (buf)
 +    grub_env_set ("pxe_blksize", buf);
 +  grub_free (buf);
 +
 +  grub_register_variable_hook ("pxe_blksize", 0,
 +                             grub_env_write_pxe_blocksize);
 +
 +  grub_memcpy (grub_pxe_card.default_address.mac, bp->mac_addr,
 +             bp->hw_len < sizeof (grub_pxe_card.default_address.mac)
 +             ? bp->hw_len : sizeof (grub_pxe_card.default_address.mac));
 +  grub_pxe_card.default_address.type = GRUB_NET_LINK_LEVEL_PROTOCOL_ETHERNET;
 +
 +  grub_net_app_level_register (&grub_pxefs_fs);
 +  grub_net_card_register (&grub_pxe_card);
 +  grub_net_configure_by_dhcp_ack ("pxe", &grub_pxe_card,
 +                                GRUB_NET_INTERFACE_PERMANENT
 +                                | GRUB_NET_INTERFACE_ADDRESS_IMMUTABLE
 +                                | GRUB_NET_INTERFACE_HWADDRESS_IMMUTABLE,
 +                                bp, GRUB_PXE_BOOTP_SIZE);
 +}
 +
 +GRUB_MOD_FINI(pxe)
 +{
 +  grub_pxe_unload ();
 +}
Simple merge
index 8b2ba4dde4158393e614b37d563fd51430c92865,22334038d13a0cb71eca1aa663e5b6ed4adb522a..211fafa706a9f96139190ca0904d27a65f9dace7
@@@ -55,10 -55,7 +55,11 @@@ typedef enu
      GRUB_ERR_TIMEOUT,
      GRUB_ERR_IO,
      GRUB_ERR_ACCESS_DENIED,
 -    GRUB_ERR_EXTRACTOR
++    GRUB_ERR_EXTRACTOR,
 +    GRUB_ERR_NET_BAD_ADDRESS,
 +    GRUB_ERR_NET_ROUTE_LOOP,
 +    GRUB_ERR_NET_NO_ROUTE,
 +    GRUB_ERR_WAIT
    }
  grub_err_t;
  
index 8fb558fa71c88b226158abe988a735dd85300443,2592dd348d15740dc52862111aad6de3c193e8b3..3edcfa8f6ff58e5c77d0ef81238741083bcf8e6a
@@@ -191,7 -188,8 +194,9 @@@ char *EXPORT_FUNC(grub_ieee1275_get_fil
  int EXPORT_FUNC(grub_ieee1275_devices_iterate) (int (*hook)
                                                (struct grub_ieee1275_devalias *
                                                 alias));
 -
 +char *EXPORT_FUNC(grub_ieee1275_get_aliasdevname) (const char *path);
 +void EXPORT_FUNC(grub_ofnet_findcards) (void);
 +void EXPORT_FUNC(grub_ofnet_probecards) (void);
+ char *EXPORT_FUNC(grub_ieee1275_canonicalise_devname) (const char *path);
  #endif /* ! GRUB_IEEE1275_HEADER */