xref: /aosp_15_r20/external/iw/sar.c (revision 92022041c981f431db0b590d0c3272306d0ea2a2)
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