]> git.ipfire.org Git - thirdparty/iw.git/commitdiff
iw: add set/get power_save commands
authorKalle Valo <kalle.valo@nokia.com>
Wed, 17 Feb 2010 16:05:54 +0000 (18:05 +0200)
committerJohannes Berg <johannes@sipsolutions.net>
Wed, 17 Mar 2010 05:23:31 +0000 (22:23 -0700)
Makefile
ps.c [new file with mode: 0644]

index bae1bfbac88963b6bd4da4c615b4cdd749a89ae1..b0a4278ed9e4cc791abbcd1c1f6c42e204ce93d7 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -17,7 +17,7 @@ CFLAGS += -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing
 OBJS = iw.o genl.o event.o info.o phy.o \
        interface.o ibss.o station.o survey.o util.o \
        mesh.o mpath.o scan.o reg.o version.o \
-       reason.o status.o connect.o link.o offch.o
+       reason.o status.o connect.o link.o offch.o ps.o
 OBJS += sections.o
 ALL = iw
 
diff --git a/ps.c b/ps.c
new file mode 100644 (file)
index 0000000..6feeeb9
--- /dev/null
+++ b/ps.c
@@ -0,0 +1,83 @@
+#include <errno.h>
+#include <string.h>
+
+#include <netlink/genl/genl.h>
+#include <netlink/msg.h>
+#include <netlink/attr.h>
+
+#include "nl80211.h"
+#include "iw.h"
+
+static int set_power_save(struct nl80211_state *state,
+                         struct nl_cb *cb,
+                         struct nl_msg *msg,
+                         int argc, char **argv)
+{
+       enum nl80211_ps_state ps_state;
+
+       if (argc != 1) {
+               printf("Invalid parameters!\n");
+               return 2;
+       }
+
+       if (strcmp(argv[0], "on") == 0)
+               ps_state = NL80211_PS_ENABLED;
+       else if (strcmp(argv[0], "off") == 0)
+               ps_state = NL80211_PS_DISABLED;
+       else {
+               printf("Invalid parameter: %s\n", argv[0]);
+               return 2;
+       }
+
+       NLA_PUT_U32(msg, NL80211_ATTR_PS_STATE, ps_state);
+
+       return 0;
+
+ nla_put_failure:
+       return -ENOBUFS;
+}
+
+COMMAND(set, power_save, "<on|off>",
+       NL80211_CMD_SET_POWER_SAVE, 0, CIB_NETDEV, set_power_save,
+       "Set power save state to on or off.");
+
+static int print_power_save_handler(struct nl_msg *msg, void *arg)
+{
+       struct nlattr *attrs[NL80211_ATTR_MAX + 1];
+       struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
+       const char *s;
+
+       nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
+                 genlmsg_attrlen(gnlh, 0), NULL);
+
+       if (!attrs[NL80211_ATTR_PS_STATE])
+               return NL_SKIP;
+
+       switch (nla_get_u32(attrs[NL80211_ATTR_PS_STATE])) {
+       case NL80211_PS_ENABLED:
+               s = "on";
+               break;
+       case NL80211_PS_DISABLED:
+       default:
+               s = "off";
+               break;
+       }
+
+       printf("Power save: %s\n", s);
+
+       return NL_SKIP;
+}
+
+static int get_power_save(struct nl80211_state *state,
+                                  struct nl_cb *cb,
+                                  struct nl_msg *msg,
+                                  int argc, char **argv)
+{
+       nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM,
+                 print_power_save_handler, NULL);
+       return 0;
+}
+
+COMMAND(get, power_save, "<param>",
+       NL80211_CMD_GET_POWER_SAVE, 0, CIB_NETDEV, get_power_save,
+       "Retrieve power save state.");