#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 );
*
*/
-/** "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
* @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 */
.name = "autoboot",
.exec = autoboot_exec,
},
- {
- .name = "netboot",
- .exec = netboot_exec,
- },
};
return rc;
}
+/**
+ * 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
*
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;
return -ENOENT;
}
-/**
- * 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 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 );
for_each_netdev ( netdev ) {
if ( netdev == boot_netdev )
continue;
- close_all_netdevs();
rc = netboot ( netdev );
}