common = commands/probe.c;
};
-module = {
- name = pxecmd;
- i386_pc = commands/i386/pc/pxecmd.c;
- enable = i386_pc;
-};
-
module = {
name = read;
common = commands/read.c;
+++ /dev/null
-/* pxe.c - command to control the pxe driver */
-/*
- * 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/err.h>
-#include <grub/misc.h>
-#include <grub/machine/pxe.h>
-#include <grub/command.h>
-#include <grub/i18n.h>
-
-GRUB_MOD_LICENSE ("GPLv3+");
-
-static grub_err_t
-grub_cmd_pxe_unload (grub_command_t cmd __attribute__ ((unused)),
- int argc __attribute__ ((unused)),
- char **args __attribute__ ((unused)))
-{
- if (! grub_pxe_pxenv)
- return grub_error (GRUB_ERR_FILE_NOT_FOUND, "no pxe environment");
-
- grub_pxe_unload ();
-
- return 0;
-}
-
-static grub_command_t cmd;
-
-GRUB_MOD_INIT(pxecmd)
-{
- cmd = grub_register_command ("pxe_unload", grub_cmd_pxe_unload,
- 0,
- N_("Unload PXE environment."));
-}
-
-GRUB_MOD_FINI(pxecmd)
-{
- grub_unregister_command (cmd);
-}
}
}
-
GRUB_MOD_INIT(efinet)
{
grub_efinet_findcards ();
grub_efi_net_config = grub_efi_net_config_real;
}
-GRUB_MOD_FINI(ofnet)
+GRUB_MOD_FINI(efinet)
{
- struct grub_net_card *card;
- grub_efi_net_config = 0;
- FOR_NET_CARDS (card)
- if (card->driver && !grub_strcmp (card->driver->name, "efinet"))
- {
- card->driver->fini (card);
- card->driver = NULL;
- }
- grub_net_card_driver_unregister (&efidriver);
+ struct grub_net_card *card, *next;
+
+ FOR_NET_CARDS_SAFE (card, next)
+ if (card->driver && grub_strcmp (card->driver->name, "efinet") == 0)
+ grub_net_card_unregister (card);
}
#include <grub/mm.h>
#include <grub/file.h>
#include <grub/misc.h>
-#include <grub/bufio.h>
#include <grub/env.h>
+#include <grub/loader.h>
#include <grub/machine/pxe.h>
#include <grub/machine/int.h>
.name = "pxe"
};
-void
-grub_pxe_unload (void)
+static grub_err_t
+grub_pxe_fini_hw (int noreturn __attribute__ ((unused)))
{
if (pxe_rm_entry)
+ grub_pxe_call (GRUB_PXENV_UNDI_CLOSE,
+ (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR,
+ pxe_rm_entry);
+
+ return GRUB_ERR_NONE;
+}
+
+static grub_err_t
+grub_pxe_restore_hw (void)
+{
+ struct grub_pxe_undi_open *ou;
+ ou = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
+ grub_memset (ou, 0, sizeof (*ou));
+ ou->pkt_filter = 4;
+ grub_pxe_call (GRUB_PXENV_UNDI_OPEN, ou, pxe_rm_entry);
+
+ if (ou->status)
{
- grub_pxe_call (GRUB_PXENV_UNDI_CLOSE,
- (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR,
- pxe_rm_entry);
grub_net_card_unregister (&grub_pxe_card);
- grub_pxe_pxenv = 0;
+ return grub_error (GRUB_ERR_IO, "can't open UNDI");
}
-}
+ return GRUB_ERR_NONE;
+}
+
+static void *fini_hnd;
static void
grub_pc_net_config_real (char **device, char **path)
grub_net_configure_by_dhcp_ack ("pxe", &grub_pxe_card, 0,
bp, GRUB_PXE_BOOTP_SIZE,
1, device, path);
+
}
GRUB_MOD_INIT(pxe)
grub_net_card_register (&grub_pxe_card);
grub_pc_net_config = grub_pc_net_config_real;
+ fini_hnd = grub_loader_register_preboot_hook (grub_pxe_fini_hw,
+ grub_pxe_restore_hw,
+ GRUB_LOADER_PREBOOT_HOOK_PRIO_DISK);
}
GRUB_MOD_FINI(pxe)
{
+ struct grub_net_card *card, *next;
+
grub_pc_net_config = 0;
- grub_pxe_unload ();
+ grub_pxe_fini_hw (0);
+ grub_net_card_unregister (&grub_pxe_card);
+ FOR_NET_CARDS_SAFE (card, next)
+ if (card->driver && grub_strcmp (card->driver->name, "pxe") == 0)
+ grub_net_card_unregister (card);
+ grub_loader_unregister_preboot_hook (fini_hnd);
}
struct grub_net_route *grub_net_routes = NULL;
struct grub_net_network_level_interface *grub_net_network_level_interfaces = NULL;
struct grub_net_card *grub_net_cards = NULL;
-struct grub_net_card_driver *grub_net_card_drivers = NULL;
struct grub_net_network_level_protocol *grub_net_network_level_protocols = NULL;
static struct grub_fs grub_net_fs;
return err;
}
-static void
-grub_grubnet_fini_real (void)
-{
- struct grub_net_card *card;
-
- FOR_NET_CARDS (card)
- if (card->driver)
- card->driver->fini (card);
-}
-
static struct grub_fs grub_net_fs =
{
.name = "netfs",
grub_fs_register (&grub_net_fs);
grub_net_open = grub_net_open_real;
- grub_grubnet_fini = grub_grubnet_fini_real;
}
GRUB_MOD_FINI(net)
grub_unregister_command (cmd_getdhcp);
grub_fs_unregister (&grub_net_fs);
grub_net_open = NULL;
- grub_grubnet_fini = NULL;
}
{
struct grub_net_card_driver *next;
char *name;
- grub_err_t (*init) (struct grub_net_card *dev);
- grub_err_t (*fini) (struct grub_net_card *dev);
grub_err_t (*send) (const struct grub_net_card *dev,
struct grub_net_buff *buf);
grub_ssize_t (*recv) (const struct grub_net_card *dev,
struct grub_net_buff *buf);
};
-extern struct grub_net_card_driver *grub_net_card_drivers;
-
-static inline void
-grub_net_card_driver_register (struct grub_net_card_driver *driver)
-{
- grub_list_push (GRUB_AS_LIST_P (&grub_net_card_drivers),
- GRUB_AS_LIST (driver));
-}
-
-static inline void
-grub_net_card_driver_unregister (struct grub_net_card_driver *driver)
-{
- grub_list_remove (GRUB_AS_LIST_P (&grub_net_card_drivers),
- GRUB_AS_LIST (driver));
-}
-
-#define FOR_NET_CARD_DRIVERS(var) for (var = grub_net_card_drivers; var; var = var->next)
-
typedef struct grub_net_packet
{
struct grub_net_packet *next;
} *grub_net_t;
extern grub_net_t (*EXPORT_VAR (grub_net_open)) (const char *name);
-extern void (*EXPORT_VAR (grub_grubnet_fini)) (void);
struct grub_net_network_level_interface
{
}
#define FOR_NET_CARDS(var) for (var = grub_net_cards; var; var = var->next)
+#define FOR_NET_CARDS_SAFE(var, next) for (var = grub_net_cards, next = var->next; var; var = next, next = var->next)
+
struct grub_net_session *
grub_net_open_tcp (char *address, grub_uint16_t port);