summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/hci/commands/autoboot_cmd.c68
-rw-r--r--src/usr/autoboot.c37
2 files changed, 23 insertions, 82 deletions
diff --git a/src/hci/commands/autoboot_cmd.c b/src/hci/commands/autoboot_cmd.c
index 33788682..6fd34b3a 100644
--- a/src/hci/commands/autoboot_cmd.c
+++ b/src/hci/commands/autoboot_cmd.c
@@ -21,6 +21,7 @@
#include <ipxe/command.h>
#include <ipxe/parseopt.h>
#include <ipxe/netdevice.h>
+#include <hci/ifmgmt_cmd.h>
#include <usr/autoboot.h>
FILE_LICENCE ( GPL2_OR_LATER );
@@ -31,17 +32,10 @@ FILE_LICENCE ( GPL2_OR_LATER );
*
*/
-/** "autoboot" options */
-struct autoboot_options {};
-
-/** "autoboot" option list */
-static struct option_descriptor autoboot_opts[] = {};
-
/** "autoboot" command descriptor */
static struct command_descriptor autoboot_cmd =
- COMMAND_DESC ( struct autoboot_options, autoboot_opts, 0, 0,
- "",
- "Attempt to boot the system" );
+ COMMAND_DESC ( struct ifcommon_options, ifcommon_opts, 0, MAX_ARGUMENTS,
+ "[<interface>...]", "Attempt to boot the system" );
/**
* "autoboot" command
@@ -51,57 +45,7 @@ static struct command_descriptor autoboot_cmd =
* @ret rc Return status code
*/
static int autoboot_exec ( int argc, char **argv ) {
- struct autoboot_options opts;
- int rc;
-
- /* Parse options */
- if ( ( rc = parse_options ( argc, argv, &autoboot_cmd, &opts ) ) != 0 )
- return rc;
-
- /* Try to boot */
- if ( ( rc = autoboot() ) != 0 )
- return rc;
-
- return 0;
-}
-
-/** "netboot" options */
-struct netboot_options {};
-
-/** "netboot" option list */
-static struct option_descriptor netboot_opts[] = {};
-
-/** "netboot" command descriptor */
-static struct command_descriptor netboot_cmd =
- COMMAND_DESC ( struct netboot_options, netboot_opts, 1, 1,
- "<interface>",
- "Attempt to boot the system from <interface>" );
-
-/**
- * "netboot" command
- *
- * @v argc Argument count
- * @v argv Argument list
- * @ret rc Return status code
- */
-static int netboot_exec ( int argc, char **argv ) {
- struct netboot_options opts;
- struct net_device *netdev;
- int rc;
-
- /* Parse options */
- if ( ( rc = parse_options ( argc, argv, &netboot_cmd, &opts ) ) != 0 )
- return rc;
-
- /* Parse interface */
- if ( ( rc = parse_netdev ( argv[optind], &netdev ) ) != 0 )
- return rc;
-
- /* Try to boot */
- if ( ( rc = netboot ( netdev ) ) != 0 )
- return rc;
-
- return 0;
+ return ifcommon_exec ( argc, argv, &autoboot_cmd, netboot, 0 );
}
/** Booting commands */
@@ -110,8 +54,4 @@ struct command autoboot_commands[] __command = {
.name = "autoboot",
.exec = autoboot_exec,
},
- {
- .name = "netboot",
- .exec = netboot_exec,
- },
};
diff --git a/src/usr/autoboot.c b/src/usr/autoboot.c
index c7492ea7..738c3cea 100644
--- a/src/usr/autoboot.c
+++ b/src/usr/autoboot.c
@@ -215,6 +215,22 @@ int boot_root_path ( const char *root_path ) {
}
/**
+ * Close all open net devices
+ *
+ * Called before a fresh boot attempt in order to free up memory. We
+ * don't just close the device immediately after the boot fails,
+ * because there may still be TCP connections in the process of
+ * closing.
+ */
+static void close_all_netdevs ( void ) {
+ struct net_device *netdev;
+
+ for_each_netdev ( netdev ) {
+ ifclose ( netdev );
+ }
+}
+
+/**
* Boot from a network device
*
* @v netdev Network device
@@ -232,6 +248,9 @@ int netboot ( struct net_device *netdev ) {
unsigned int pxe_discovery_control;
int rc;
+ /* Close all other network devices */
+ close_all_netdevs();
+
/* Open device and display device status */
if ( ( rc = ifopen ( netdev ) ) != 0 )
return rc;
@@ -275,22 +294,6 @@ int netboot ( struct net_device *netdev ) {
}
/**
- * Close all open net devices
- *
- * Called before a fresh boot attempt in order to free up memory. We
- * don't just close the device immediately after the boot fails,
- * because there may still be TCP connections in the process of
- * closing.
- */
-static void close_all_netdevs ( void ) {
- struct net_device *netdev;
-
- for_each_netdev ( netdev ) {
- ifclose ( netdev );
- }
-}
-
-/**
* Boot the system
*/
int autoboot ( void ) {
@@ -299,7 +302,6 @@ int autoboot ( void ) {
int rc = -ENODEV;
/* If we have an identifable boot device, try that first */
- close_all_netdevs();
if ( ( boot_netdev = find_boot_netdev() ) )
rc = netboot ( boot_netdev );
@@ -307,7 +309,6 @@ int autoboot ( void ) {
for_each_netdev ( netdev ) {
if ( netdev == boot_netdev )
continue;
- close_all_netdevs();
rc = netboot ( netdev );
}