diff options
-rw-r--r-- | bin/Makefile.am | 2 | ||||
-rw-r--r-- | bin/Makefile.in | 17 | ||||
-rw-r--r-- | bin/wimaxll-pl-state-get.c | 96 | ||||
-rw-r--r-- | include/wimaxll.h | 1 | ||||
-rw-r--r-- | lib/Makefile.am | 1 | ||||
-rw-r--r-- | lib/Makefile.in | 17 | ||||
-rw-r--r-- | lib/op-state-get.c | 112 |
7 files changed, 240 insertions, 6 deletions
diff --git a/bin/Makefile.am b/bin/Makefile.am index c8df30d..04fc860 100644 --- a/bin/Makefile.am +++ b/bin/Makefile.am @@ -38,6 +38,7 @@ plugindir = $(pkglibdir)/plugins plugin_LTLIBRARIES = \ wimaxll-pl-reset.la \ wimaxll-pl-rfkill.la \ + wimaxll-pl-state-get.la \ wimaxll-pl-wfsc.la plugin_LDFLAGS = -no-undefined -module -avoid-version \ @@ -45,4 +46,5 @@ plugin_LDFLAGS = -no-undefined -module -avoid-version \ wimaxll_pl_reset_la_LDFLAGS = $(plugin_LDFLAGS) wimaxll_pl_rfkill_la_LDFLAGS = $(plugin_LDFLAGS) +wimaxll_pl_state_get_la_LDFLAGS = $(plugin_LDFLAGS) wimaxll_pl_wfsc_la_LDFLAGS = $(plugin_LDFLAGS) diff --git a/bin/Makefile.in b/bin/Makefile.in index 655cc60..edbe3a7 100644 --- a/bin/Makefile.in +++ b/bin/Makefile.in @@ -67,6 +67,12 @@ wimaxll_pl_rfkill_la_OBJECTS = wimaxll-pl-rfkill.lo wimaxll_pl_rfkill_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(wimaxll_pl_rfkill_la_LDFLAGS) $(LDFLAGS) -o $@ +wimaxll_pl_state_get_la_LIBADD = +wimaxll_pl_state_get_la_SOURCES = wimaxll-pl-state-get.c +wimaxll_pl_state_get_la_OBJECTS = wimaxll-pl-state-get.lo +wimaxll_pl_state_get_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(wimaxll_pl_state_get_la_LDFLAGS) $(LDFLAGS) -o $@ wimaxll_pl_wfsc_la_LIBADD = wimaxll_pl_wfsc_la_SOURCES = wimaxll-pl-wfsc.c wimaxll_pl_wfsc_la_OBJECTS = wimaxll-pl-wfsc.lo @@ -96,10 +102,10 @@ CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ -SOURCES = wimaxll-pl-reset.c wimaxll-pl-rfkill.c wimaxll-pl-wfsc.c \ - wimaxll.c +SOURCES = wimaxll-pl-reset.c wimaxll-pl-rfkill.c \ + wimaxll-pl-state-get.c wimaxll-pl-wfsc.c wimaxll.c DIST_SOURCES = wimaxll-pl-reset.c wimaxll-pl-rfkill.c \ - wimaxll-pl-wfsc.c wimaxll.c + wimaxll-pl-state-get.c wimaxll-pl-wfsc.c wimaxll.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -244,6 +250,7 @@ plugindir = $(pkglibdir)/plugins plugin_LTLIBRARIES = \ wimaxll-pl-reset.la \ wimaxll-pl-rfkill.la \ + wimaxll-pl-state-get.la \ wimaxll-pl-wfsc.la plugin_LDFLAGS = -no-undefined -module -avoid-version \ @@ -251,6 +258,7 @@ plugin_LDFLAGS = -no-undefined -module -avoid-version \ wimaxll_pl_reset_la_LDFLAGS = $(plugin_LDFLAGS) wimaxll_pl_rfkill_la_LDFLAGS = $(plugin_LDFLAGS) +wimaxll_pl_state_get_la_LDFLAGS = $(plugin_LDFLAGS) wimaxll_pl_wfsc_la_LDFLAGS = $(plugin_LDFLAGS) all: all-am @@ -318,6 +326,8 @@ wimaxll-pl-reset.la: $(wimaxll_pl_reset_la_OBJECTS) $(wimaxll_pl_reset_la_DEPEND $(wimaxll_pl_reset_la_LINK) -rpath $(plugindir) $(wimaxll_pl_reset_la_OBJECTS) $(wimaxll_pl_reset_la_LIBADD) $(LIBS) wimaxll-pl-rfkill.la: $(wimaxll_pl_rfkill_la_OBJECTS) $(wimaxll_pl_rfkill_la_DEPENDENCIES) $(wimaxll_pl_rfkill_la_LINK) -rpath $(plugindir) $(wimaxll_pl_rfkill_la_OBJECTS) $(wimaxll_pl_rfkill_la_LIBADD) $(LIBS) +wimaxll-pl-state-get.la: $(wimaxll_pl_state_get_la_OBJECTS) $(wimaxll_pl_state_get_la_DEPENDENCIES) + $(wimaxll_pl_state_get_la_LINK) -rpath $(plugindir) $(wimaxll_pl_state_get_la_OBJECTS) $(wimaxll_pl_state_get_la_LIBADD) $(LIBS) wimaxll-pl-wfsc.la: $(wimaxll_pl_wfsc_la_OBJECTS) $(wimaxll_pl_wfsc_la_DEPENDENCIES) $(wimaxll_pl_wfsc_la_LINK) -rpath $(plugindir) $(wimaxll_pl_wfsc_la_OBJECTS) $(wimaxll_pl_wfsc_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @@ -379,6 +389,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wimaxll-pl-reset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wimaxll-pl-rfkill.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wimaxll-pl-state-get.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wimaxll-pl-wfsc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wimaxll.Po@am__quote@ diff --git a/bin/wimaxll-pl-state-get.c b/bin/wimaxll-pl-state-get.c new file mode 100644 index 0000000..c41d7e0 --- /dev/null +++ b/bin/wimaxll-pl-state-get.c @@ -0,0 +1,96 @@ +/* + * Linux WiMax + * Swiss-army WiMAX knife + * + * + * Copyright (C) 2007-2008 Intel Corporation. All rights reserved. + * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#define _GNU_SOURCE +#include <argp.h> +#include <error.h> +#include <wimaxll.h> +#include <wimaxll/version.h> +#include <wimaxll/cmd.h> + + +static +struct argp_option state_get_options[] = { + { 0 } +}; + +static +int state_get_parser(int key, char *arg, struct argp_state *state) +{ + return ARGP_ERR_UNKNOWN; +} + +static +int state_get_fn(struct cmd *cmd, struct wimaxll_handle *wmx, + int argc, char **argv) +{ + int result; + result = argp_parse(&cmd->argp, argc, argv, + ARGP_IN_ORDER | ARGP_PARSE_ARGV0, 0, NULL); + if (result < 0) + goto error_argp_parse; + w_cmd_need_if(wmx); + result = wimaxll_state_get(wmx); + if (result >= 0) + w_print("%s\n", wimaxll_state_to_name(result)); +error_argp_parse: + return result; +} + +static +struct cmd state_get_cmd = { + .name = "state-get", + .argp = { + .options = state_get_options, + .parser = state_get_parser, + .args_doc = "", + .doc = "Gets a WiMAX device's state\n", + }, + .fn = state_get_fn, +}; + +static +int state_get_init(void) +{ + return w_cmd_register(&state_get_cmd); +} + +static +void state_get_exit(void) +{ + w_cmd_unregister(&state_get_cmd); +} + + +PLUGIN("state_get", WIMAXLL_VERSION, state_get_init, state_get_exit); diff --git a/include/wimaxll.h b/include/wimaxll.h index ece869b..24e7250 100644 --- a/include/wimaxll.h +++ b/include/wimaxll.h @@ -336,6 +336,7 @@ void wimaxll_msg_free(void *); /* generic API */ int wimaxll_rfkill(struct wimaxll_handle *, enum wimax_rf_state); int wimaxll_reset(struct wimaxll_handle *); +int wimaxll_state_get(struct wimaxll_handle *); void wimaxll_get_cb_state_change( struct wimaxll_handle *, wimaxll_state_change_cb_f *, diff --git a/lib/Makefile.am b/lib/Makefile.am index c42b2c5..77e1cee 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -17,6 +17,7 @@ libwimaxll_sources = \ op-msg.c \ op-reset.c \ op-rfkill.c \ + op-state-get.c \ re-state-change.c \ wimax.c diff --git a/lib/Makefile.in b/lib/Makefile.in index cfec307..f197709 100644 --- a/lib/Makefile.in +++ b/lib/Makefile.in @@ -64,7 +64,8 @@ libwimaxll_a_AR = $(AR) $(ARFLAGS) libwimaxll_a_LIBADD = am__objects_2 = genl.$(OBJEXT) log.$(OBJEXT) misc.$(OBJEXT) \ op-open.$(OBJEXT) op-msg.$(OBJEXT) op-reset.$(OBJEXT) \ - op-rfkill.$(OBJEXT) re-state-change.$(OBJEXT) wimax.$(OBJEXT) + op-rfkill.$(OBJEXT) op-state-get.$(OBJEXT) \ + re-state-change.$(OBJEXT) wimax.$(OBJEXT) am_libwimaxll_a_OBJECTS = $(am__objects_2) libwimaxll_a_OBJECTS = $(am_libwimaxll_a_OBJECTS) libLTLIBRARIES_INSTALL = $(INSTALL) @@ -81,8 +82,8 @@ libwimaxll_la_LIBADD = am__objects_4 = libwimaxll_la-genl.lo libwimaxll_la-log.lo \ libwimaxll_la-misc.lo libwimaxll_la-op-open.lo \ libwimaxll_la-op-msg.lo libwimaxll_la-op-reset.lo \ - libwimaxll_la-op-rfkill.lo libwimaxll_la-re-state-change.lo \ - libwimaxll_la-wimax.lo + libwimaxll_la-op-rfkill.lo libwimaxll_la-op-state-get.lo \ + libwimaxll_la-re-state-change.lo libwimaxll_la-wimax.lo am_libwimaxll_la_OBJECTS = $(am__objects_4) libwimaxll_la_OBJECTS = $(am_libwimaxll_la_OBJECTS) libwimaxll_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ @@ -246,6 +247,7 @@ libwimaxll_sources = \ op-msg.c \ op-reset.c \ op-rfkill.c \ + op-state-get.c \ re-state-change.c \ wimax.c @@ -406,6 +408,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwimaxll_la-op-open.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwimaxll_la-op-reset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwimaxll_la-op-rfkill.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwimaxll_la-op-state-get.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwimaxll_la-re-state-change.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwimaxll_la-wimax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Po@am__quote@ @@ -414,6 +417,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/op-open.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/op-reset.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/op-rfkill.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/op-state-get.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/re-state-change.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wimax.Po@am__quote@ @@ -494,6 +498,13 @@ libwimaxll_la-op-rfkill.lo: op-rfkill.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libwimaxll_la_CFLAGS) $(CFLAGS) -c -o libwimaxll_la-op-rfkill.lo `test -f 'op-rfkill.c' || echo '$(srcdir)/'`op-rfkill.c +libwimaxll_la-op-state-get.lo: op-state-get.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libwimaxll_la_CFLAGS) $(CFLAGS) -MT libwimaxll_la-op-state-get.lo -MD -MP -MF $(DEPDIR)/libwimaxll_la-op-state-get.Tpo -c -o libwimaxll_la-op-state-get.lo `test -f 'op-state-get.c' || echo '$(srcdir)/'`op-state-get.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libwimaxll_la-op-state-get.Tpo $(DEPDIR)/libwimaxll_la-op-state-get.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='op-state-get.c' object='libwimaxll_la-op-state-get.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libwimaxll_la_CFLAGS) $(CFLAGS) -c -o libwimaxll_la-op-state-get.lo `test -f 'op-state-get.c' || echo '$(srcdir)/'`op-state-get.c + libwimaxll_la-re-state-change.lo: re-state-change.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libwimaxll_la_CFLAGS) $(CFLAGS) -MT libwimaxll_la-re-state-change.lo -MD -MP -MF $(DEPDIR)/libwimaxll_la-re-state-change.Tpo -c -o libwimaxll_la-re-state-change.lo `test -f 're-state-change.c' || echo '$(srcdir)/'`re-state-change.c @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libwimaxll_la-re-state-change.Tpo $(DEPDIR)/libwimaxll_la-re-state-change.Plo diff --git a/lib/op-state-get.c b/lib/op-state-get.c new file mode 100644 index 0000000..9822bf8 --- /dev/null +++ b/lib/op-state-get.c @@ -0,0 +1,112 @@ +/* + * Linux WiMax + * Export the kernel's WiMAX stack wimaxll_state_get() function + * + * + * Copyright (C) 2009 Darius Augulis <augulis.darius@gmail.com> + * + * Based on op-rfkill.c + * + * Copyright (C) 2007-2008 Intel Corporation. All rights reserved. + * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#define _GNU_SOURCE +#include <sys/types.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <stdarg.h> +#include <errno.h> +#include <assert.h> +#include <linux/types.h> +#include <netlink/msg.h> +#include <netlink/netlink.h> +#include <netlink/genl/genl.h> +#include <wimaxll.h> +#include "internal.h" +#define D_LOCAL 0 +#include "debug.h" + + +/** + * Get Wimax device status from kernel and return it to user space + * + * \param wmx WiMAX device handle + * + * \return Negative errno code on error. Otherwise, one from Wimax device + * status value, defined in enum wimax_st. + * + * Allows the caller to get the state of the Wimax device. + * + * \ingroup device_management + * \internal + * + */ +int wimaxll_state_get(struct wimaxll_handle *wmx) +{ + ssize_t result; + struct nl_msg *msg; + + result = -EBADF; + if (wmx->ifidx == 0) + goto error_not_any; + msg = nlmsg_new(); + if (msg == NULL) { + result = errno; + wimaxll_msg(wmx, "E: STATE_GET: cannot allocate generic" + "netlink message: %m\n"); + goto error_msg_alloc; + } + if (genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, + wimaxll_family_id(wmx), 0, 0, + WIMAX_GNL_OP_STATE_GET, WIMAX_GNL_VERSION) == NULL) { + result = -ENOMEM; + wimaxll_msg(wmx, "E: STATE_GET: error preparing message: " + "%d 0x%08x\n", result, result); + goto error_msg_prep; + } + nla_put_u32(msg, WIMAX_GNL_STGET_IFIDX, (__u32) wmx->ifidx); + result = nl_send_auto_complete(wmx->nlh_tx, msg); + if (result < 0) { + wimaxll_msg(wmx, "E: STATE_GET: error sending message: %zd\n", + result); + goto error_msg_send; + } + /* Read the message ACK from netlink */ + result = wimaxll_wait_for_ack(wmx); + if (result < 0 && result != -ENODEV) + wimaxll_msg(wmx, "E: STATE_GET: operation failed: %zd\n", result); +error_msg_prep: +error_msg_send: + nlmsg_free(msg); +error_msg_alloc: +error_not_any: + d_fnend(3, wmx, "(wmx %p) = %d\n", wmx, result); + return result; +} |