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_sar_specs(struct nl80211_state * state,struct nl_msg * msg,int argc,char ** argv,enum id_input id)11*92022041SSam Saccone static int set_sar_specs(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 struct nlattr *nl_sar, *nl_specs, *nl_sub;
17*92022041SSam Saccone enum nl80211_sar_type type;
18*92022041SSam Saccone __u32 idx;
19*92022041SSam Saccone __s32 pwr;
20*92022041SSam Saccone char *tmp;
21*92022041SSam Saccone int count, i;
22*92022041SSam Saccone
23*92022041SSam Saccone if (argc <= 1)
24*92022041SSam Saccone return -EINVAL;
25*92022041SSam Saccone
26*92022041SSam Saccone type = atoi(argv[0]);
27*92022041SSam Saccone
28*92022041SSam Saccone nl_sar = nla_nest_start(msg, NL80211_ATTR_SAR_SPEC);
29*92022041SSam Saccone if (!nl_sar)
30*92022041SSam Saccone goto nla_put_failure;
31*92022041SSam Saccone
32*92022041SSam Saccone NLA_PUT_U32(msg, NL80211_SAR_ATTR_TYPE, type);
33*92022041SSam Saccone
34*92022041SSam Saccone nl_specs = nla_nest_start(msg, NL80211_SAR_ATTR_SPECS);
35*92022041SSam Saccone if (!nl_specs)
36*92022041SSam Saccone goto nla_put_failure;
37*92022041SSam Saccone
38*92022041SSam Saccone for (i = 1; i < argc; i++) {
39*92022041SSam Saccone tmp = strchr(argv[i], ':');
40*92022041SSam Saccone if (!tmp)
41*92022041SSam Saccone return -EINVAL;
42*92022041SSam Saccone
43*92022041SSam Saccone if (tmp != strrchr(argv[i], ':'))
44*92022041SSam Saccone return -EINVAL;
45*92022041SSam Saccone
46*92022041SSam Saccone count = sscanf(argv[i], "%u:%d", &idx, &pwr);
47*92022041SSam Saccone if (count != 2)
48*92022041SSam Saccone return -EINVAL;
49*92022041SSam Saccone
50*92022041SSam Saccone nl_sub = nla_nest_start(msg, i - 1);
51*92022041SSam Saccone if (!nl_sub)
52*92022041SSam Saccone goto nla_put_failure;
53*92022041SSam Saccone
54*92022041SSam Saccone NLA_PUT_U32(msg, NL80211_SAR_ATTR_SPECS_RANGE_INDEX, idx);
55*92022041SSam Saccone NLA_PUT_S32(msg, NL80211_SAR_ATTR_SPECS_POWER, pwr);
56*92022041SSam Saccone
57*92022041SSam Saccone nla_nest_end(msg, nl_sub);
58*92022041SSam Saccone }
59*92022041SSam Saccone
60*92022041SSam Saccone nla_nest_end(msg, nl_specs);
61*92022041SSam Saccone nla_nest_end(msg, nl_sar);
62*92022041SSam Saccone
63*92022041SSam Saccone return 0;
64*92022041SSam Saccone
65*92022041SSam Saccone nla_put_failure:
66*92022041SSam Saccone return -ENOBUFS;
67*92022041SSam Saccone }
68*92022041SSam Saccone
69*92022041SSam Saccone COMMAND(set, sar_specs, "<sar type> <range index:sar power>*",
70*92022041SSam Saccone NL80211_CMD_SET_SAR_SPECS, 0, CIB_PHY, set_sar_specs,
71*92022041SSam Saccone "Set SAR specs corresponding to SAR capa of wiphy.");
72