diff options
author | Michael Brown | 2007-01-10 02:55:07 +0100 |
---|---|---|
committer | Michael Brown | 2007-01-10 02:55:07 +0100 |
commit | d24b80acf292266680d9b04836269734602ec054 (patch) | |
tree | 88d98a1ab29bd0dc0043e2f13ef1d17b74656084 /src/hci/commands | |
parent | Add "name" field to network device, to facilitate netdev commands. (diff) | |
download | ipxe-d24b80acf292266680d9b04836269734602ec054.tar.gz ipxe-d24b80acf292266680d9b04836269734602ec054.tar.xz ipxe-d24b80acf292266680d9b04836269734602ec054.zip |
Added network interface management commands
Diffstat (limited to 'src/hci/commands')
-rw-r--r-- | src/hci/commands/ifmgmt_cmd.c | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/src/hci/commands/ifmgmt_cmd.c b/src/hci/commands/ifmgmt_cmd.c new file mode 100644 index 00000000..fde5fbb1 --- /dev/null +++ b/src/hci/commands/ifmgmt_cmd.c @@ -0,0 +1,182 @@ +/* + * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>. + * + * This program 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 2 of the + * License, or any later version. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <getopt.h> +#include <vsprintf.h> +#include <gpxe/netdevice.h> +#include <gpxe/command.h> +#include <usr/ifmgmt.h> + +/** @file + * + * Network interface management commands + * + */ + +/** Options shared by all if<xxx> commands */ +static struct option ifcommon_longopts[] = { + { "help", 0, NULL, 'h' }, + { NULL, 0, NULL, 0 }, +}; + +/** + * Print syntax of if<xxx> command + * + * @v argv Command arguments + * @v verb Verb describing the action of the command + */ +static void ifcommon_syntax ( char **argv, const char *verb ) { + printf ( "Usage:\n" + " %s [<interface>] [<interface>...]\n" + "\n" + "%s the specified network interfaces\n", + argv[0], verb ); +} + +/** + * Execute if<xxx> command over all network devices + * + * @v payload Command to execute + * @ret rc Exit code + */ +static int ifcommon_do_all ( int ( * payload ) ( struct net_device * ) ) { + struct net_device *netdev; + int rc = 0; + + /* Print error if no network devices exist */ + if ( ! have_netdevs() ) { + printf ( "No network interfaces\n" ); + return 1; + } + + /* Execute payload for each network device */ + for_each_netdev ( netdev ) { + if ( payload ( netdev ) != 0 ) + rc = 1; + } + return rc; +} + +/** + * Execute if<xxx> command over list of network devices + * + * @v payload Command to execute + * @ret rc Exit code + */ +static int ifcommon_do_list ( int ( * payload ) ( struct net_device * ), + char **list, unsigned int count ) { + const char *netdev_name; + struct net_device *netdev; + int rc = 0; + + while ( count-- ) { + netdev_name = *(list++); + netdev = find_netdev ( netdev_name ); + if ( ! netdev ) { + printf ( "%s: no such interface\n", netdev_name ); + rc = 1; + continue; + } + if ( payload ( netdev ) != 0 ) + rc = 1; + } + return rc; +} + +/** + * Execute if<xxx> command + * + * @v payload Command to execute + * @v verb Verb describing the action of the command + * @v argc Argument count + * @v argv Argument list + * @ret rc Exit code + */ +static __attribute__ (( regparm ( 2 ) )) int +ifcommon_exec ( int ( * payload ) ( struct net_device * ), + const char *verb, int argc, char **argv ) { + int c; + + /* Parse options */ + while ( ( c = getopt_long ( argc, argv, "h", ifcommon_longopts, + NULL ) ) >= 0 ) { + switch ( c ) { + case 'h': + /* Display help text */ + default: + /* Unrecognised/invalid option */ + ifcommon_syntax ( argv, verb ); + return 1; + } + } + + if ( optind == argc ) { + return ifcommon_do_all ( payload ); + } else { + return ifcommon_do_list ( payload, &argv[optind], + ( argc - optind ) ); + } +} + +/* "ifopen" command */ + +static int ifopen_payload ( struct net_device *netdev ) { + return ifopen ( netdev ); +} + +static int ifopen_exec ( int argc, char **argv ) { + return ifcommon_exec ( ifopen_payload, "Open", argc, argv ); +} + +struct command ifopen_command __command = { + .name = "ifopen", + .exec = ifopen_exec, +}; + +/* "ifclose" command */ + +static int ifclose_payload ( struct net_device *netdev ) { + ifclose ( netdev ); + return 0; +} + +static int ifclose_exec ( int argc, char **argv ) { + return ifcommon_exec ( ifclose_payload, "Close", argc, argv ); +} + +struct command ifclose_command __command = { + .name = "ifclose", + .exec = ifclose_exec, +}; + +/* "ifstat" command */ + +static int ifstat_payload ( struct net_device *netdev ) { + ifstat ( netdev ); + return 0; +} + +static int ifstat_exec ( int argc, char **argv ) { + return ifcommon_exec ( ifstat_payload, "Display status of", + argc, argv ); +} + +struct command ifstat_command __command = { + .name = "ifstat", + .exec = ifstat_exec, +}; |