1*92022041SSam Saccone #include <errno.h>
2*92022041SSam Saccone #include <string.h>
3*92022041SSam Saccone
4*92022041SSam Saccone #include <netlink/genl/genl.h>
5*92022041SSam Saccone #include <netlink/msg.h>
6*92022041SSam Saccone #include <netlink/attr.h>
7*92022041SSam Saccone
8*92022041SSam Saccone #include "nl80211.h"
9*92022041SSam Saccone #include "iw.h"
10*92022041SSam Saccone
set_power_save(struct nl80211_state * state,struct nl_msg * msg,int argc,char ** argv,enum id_input id)11*92022041SSam Saccone static int set_power_save(struct nl80211_state *state,
12*92022041SSam Saccone struct nl_msg *msg,
13*92022041SSam Saccone int argc, char **argv,
14*92022041SSam Saccone enum id_input id)
15*92022041SSam Saccone {
16*92022041SSam Saccone enum nl80211_ps_state ps_state;
17*92022041SSam Saccone
18*92022041SSam Saccone if (argc != 1)
19*92022041SSam Saccone return 1;
20*92022041SSam Saccone
21*92022041SSam Saccone if (strcmp(argv[0], "on") == 0)
22*92022041SSam Saccone ps_state = NL80211_PS_ENABLED;
23*92022041SSam Saccone else if (strcmp(argv[0], "off") == 0)
24*92022041SSam Saccone ps_state = NL80211_PS_DISABLED;
25*92022041SSam Saccone else {
26*92022041SSam Saccone printf("Invalid parameter: %s\n", argv[0]);
27*92022041SSam Saccone return 2;
28*92022041SSam Saccone }
29*92022041SSam Saccone
30*92022041SSam Saccone NLA_PUT_U32(msg, NL80211_ATTR_PS_STATE, ps_state);
31*92022041SSam Saccone
32*92022041SSam Saccone return 0;
33*92022041SSam Saccone
34*92022041SSam Saccone nla_put_failure:
35*92022041SSam Saccone return -ENOBUFS;
36*92022041SSam Saccone }
37*92022041SSam Saccone
38*92022041SSam Saccone COMMAND(set, power_save, "<on|off>",
39*92022041SSam Saccone NL80211_CMD_SET_POWER_SAVE, 0, CIB_NETDEV, set_power_save,
40*92022041SSam Saccone "Set power save state to on or off.");
41*92022041SSam Saccone
print_power_save_handler(struct nl_msg * msg,void * arg)42*92022041SSam Saccone static int print_power_save_handler(struct nl_msg *msg, void *arg)
43*92022041SSam Saccone {
44*92022041SSam Saccone struct nlattr *attrs[NL80211_ATTR_MAX + 1];
45*92022041SSam Saccone struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
46*92022041SSam Saccone const char *s;
47*92022041SSam Saccone
48*92022041SSam Saccone nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
49*92022041SSam Saccone genlmsg_attrlen(gnlh, 0), NULL);
50*92022041SSam Saccone
51*92022041SSam Saccone if (!attrs[NL80211_ATTR_PS_STATE])
52*92022041SSam Saccone return NL_SKIP;
53*92022041SSam Saccone
54*92022041SSam Saccone switch (nla_get_u32(attrs[NL80211_ATTR_PS_STATE])) {
55*92022041SSam Saccone case NL80211_PS_ENABLED:
56*92022041SSam Saccone s = "on";
57*92022041SSam Saccone break;
58*92022041SSam Saccone case NL80211_PS_DISABLED:
59*92022041SSam Saccone default:
60*92022041SSam Saccone s = "off";
61*92022041SSam Saccone break;
62*92022041SSam Saccone }
63*92022041SSam Saccone
64*92022041SSam Saccone printf("Power save: %s\n", s);
65*92022041SSam Saccone
66*92022041SSam Saccone return NL_SKIP;
67*92022041SSam Saccone }
68*92022041SSam Saccone
get_power_save(struct nl80211_state * state,struct nl_msg * msg,int argc,char ** argv,enum id_input id)69*92022041SSam Saccone static int get_power_save(struct nl80211_state *state,
70*92022041SSam Saccone struct nl_msg *msg,
71*92022041SSam Saccone int argc, char **argv,
72*92022041SSam Saccone enum id_input id)
73*92022041SSam Saccone {
74*92022041SSam Saccone register_handler(print_power_save_handler, NULL);
75*92022041SSam Saccone return 0;
76*92022041SSam Saccone }
77*92022041SSam Saccone
78*92022041SSam Saccone COMMAND(get, power_save, "",
79*92022041SSam Saccone NL80211_CMD_GET_POWER_SAVE, 0, CIB_NETDEV, get_power_save,
80*92022041SSam Saccone "Retrieve power save state.");
81