linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] iw: add set sar_specs command
@ 2021-10-07  8:56 Ping-Ke Shih
  0 siblings, 0 replies; only message in thread
From: Ping-Ke Shih @ 2021-10-07  8:56 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, cjhuang, kevin_yang

From: Zong-Zhe Yang <kevin_yang@realtek.com>

Add set sar_specs command

usage: iw <phy> set sar_specs <sar type> <range index:sar power>*
e.g.
iw phy0 set sar_specs 0 0:100 1:90 2:80...
where sar type should correspond to wiphy's sar_capa,
and range index should be valid in wiphy's sar_capa.

For now, kernel sar type supports only 0 (NL80211_SAR_TYPE_POWER)
which means that the sar power limitation is specified in 0.25dBm unit.

Cc: Carl Huang <cjhuang@codeaurora.org>
Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 sar.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 71 insertions(+)
 create mode 100644 sar.c

diff --git a/sar.c b/sar.c
new file mode 100644
index 0000000..5ab54ec
--- /dev/null
+++ b/sar.c
@@ -0,0 +1,71 @@
+#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_sar_specs(struct nl80211_state *state,
+			 struct nl_msg *msg,
+			 int argc, char **argv,
+			 enum id_input id)
+{
+	struct nlattr *nl_sar, *nl_specs, *nl_sub;
+	enum nl80211_sar_type type;
+	__u32 idx;
+	__s32 pwr;
+	char *tmp;
+	int count, i;
+
+	if (argc <= 1)
+		return -EINVAL;
+
+	type = atoi(argv[0]);
+
+	nl_sar = nla_nest_start(msg, NL80211_ATTR_SAR_SPEC);
+	if (!nl_sar)
+		goto nla_put_failure;
+
+	NLA_PUT_U32(msg, NL80211_SAR_ATTR_TYPE, type);
+
+	nl_specs = nla_nest_start(msg, NL80211_SAR_ATTR_SPECS);
+	if (!nl_specs)
+		goto nla_put_failure;
+
+	for (i = 1; i < argc; i++) {
+		tmp = strchr(argv[i], ':');
+		if (!tmp)
+			return -EINVAL;
+
+		if (tmp != strrchr(argv[i], ':'))
+			return -EINVAL;
+
+		count = sscanf(argv[i], "%u:%d", &idx, &pwr);
+		if (count != 2)
+			return -EINVAL;
+
+		nl_sub = nla_nest_start(msg, i - 1);
+		if (!nl_sub)
+			goto nla_put_failure;
+
+		NLA_PUT_U32(msg, NL80211_SAR_ATTR_SPECS_RANGE_INDEX, idx);
+		NLA_PUT_S32(msg, NL80211_SAR_ATTR_SPECS_POWER, pwr);
+
+		nla_nest_end(msg, nl_sub);
+	}
+
+	nla_nest_end(msg, nl_specs);
+	nla_nest_end(msg, nl_sar);
+
+	return 0;
+
+ nla_put_failure:
+	return -ENOBUFS;
+}
+
+COMMAND(set, sar_specs, "<sar type> <range index:sar power>*",
+	NL80211_CMD_SET_SAR_SPECS, 0, CIB_PHY, set_sar_specs,
+	"Set SAR specs corresponding to SAR capa of wiphy.");
-- 
2.25.1


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2021-10-07  8:56 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-07  8:56 [PATCH] iw: add set sar_specs command Ping-Ke Shih

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).