[hci] Add command interface to user-level wireless tasks
authorJoshua Oreman <oremanj@xenon.get-linux.org>
Fri, 19 Jun 2009 09:30:31 +0000 (02:30 -0700)
committerJoshua Oreman <oremanj@xenon.get-linux.org>
Fri, 19 Jun 2009 09:30:31 +0000 (02:30 -0700)
The #ifdef'ed REQUIRE_OBJECT() for iwmgmt_cmd.o is placed in the 802.11
stack instead of config.o; while unconventional, this is the only way to
make sure the commands are available by default to builds including
wireless drivers while not including either them or the 802.11 stack
in builds without any wireless drivers.

src/config/general.h
src/core/config.c
src/hci/commands/iwmgmt_cmd.c [new file with mode: 0644]
src/net/net80211.c

index dfc8700..6f55d27 100644 (file)
@@ -98,6 +98,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
 #define        NVO_CMD                 /* Non-volatile option storage commands */
 #define        CONFIG_CMD              /* Option configuration console */
 #define        IFMGMT_CMD              /* Interface management commands */
+#define        IWMGMT_CMD              /* Wireless interface management commands */
 #define        ROUTE_CMD               /* Routing table management commands */
 #define IMAGE_CMD              /* Image management commands */
 #define DHCP_CMD               /* DHCP management commands */
index ecaf781..be48f3a 100644 (file)
@@ -183,6 +183,7 @@ REQUIRE_OBJECT ( config_cmd );
 #ifdef IFMGMT_CMD
 REQUIRE_OBJECT ( ifmgmt_cmd );
 #endif
+/* IWMGMT_CMD is brought in by net80211.c if requested */
 #ifdef ROUTE_CMD
 REQUIRE_OBJECT ( route_cmd );
 #endif
diff --git a/src/hci/commands/iwmgmt_cmd.c b/src/hci/commands/iwmgmt_cmd.c
new file mode 100644 (file)
index 0000000..0b8004e
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2009 Joshua Oreman <oremanj@rwcr.net>.
+ *
+ * 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.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+#include <gpxe/netdevice.h>
+#include <gpxe/net80211.h>
+#include <gpxe/command.h>
+#include <usr/iwmgmt.h>
+#include "ifmgmt_cmd.h"
+
+static int iwstat_payload ( struct net_device *netdev ) {
+       struct net80211_device *dev = net80211_get ( netdev );
+
+       if ( dev )
+               iwstat ( dev );
+
+       return 0;
+}
+
+static int iwstat_exec ( int argc, char **argv ) {
+       return ifcommon_exec ( iwstat_payload, "Display wireless status of",
+                              argc, argv );
+}
+
+static int iwlist_payload ( struct net_device *netdev ) {
+       struct net80211_device *dev = net80211_get ( netdev );
+
+       if ( dev )
+               return iwlist ( dev, 0 );
+
+       return 0;
+}
+
+static int iwlist_exec ( int argc, char **argv ) {
+       return ifcommon_exec ( iwlist_payload,
+                              "List wireless networks available via",
+                              argc, argv );
+}
+
+static int iwassoc_payload ( struct net_device *netdev ) {
+       struct net80211_device *dev = net80211_get ( netdev );
+
+       if ( dev )
+               iwassoc ( dev );
+
+       return 0;
+}
+
+static int iwassoc_exec ( int argc, char **argv ) {
+       return ifcommon_exec ( iwassoc_payload,
+                              "Retry 802.11 association for",
+                              argc, argv );
+}
+
+struct command iwmgmt_commands[] __command = {
+       {
+               .name = "iwstat",
+               .exec = iwstat_exec,
+       },
+       {
+               .name = "iwlist",
+               .exec = iwlist_exec,
+       },
+       {
+               .name = "iwassoc",
+               .exec = iwassoc_exec,
+       },
+};
index b3a5bc8..4e97688 100644 (file)
@@ -35,6 +35,13 @@ FILE_LICENCE ( GPL2_OR_LATER );
 #include <unistd.h>
 #include <errno.h>
 
+/* Bring in IWMGMT_CMD here if enabled; the commands are useless if
+   nothing else requires wireless. */
+#include <config/general.h>
+#ifdef IWMGMT_CMD
+REQUIRE_OBJECT ( iwmgmt_cmd );
+#endif
+
 /* Disambiguate the EINVAL's a bit */
 #define EINVAL_PKT_TOO_SHORT   ( EINVAL | EUNIQ_01 )
 #define EINVAL_PKT_VERSION     ( EINVAL | EUNIQ_02 )