Przeglądaj źródła

rmnet_core: add genl message for tether info

Add new generic netlink message for passing tether info.

CRs-Fixed: 2813607
Change-Id: Ic53de5d65efef78f3b2ed12cc51854635e439143
Acked-by: Ryan Chapman <[email protected]>
Signed-off-by: Subash Abhinov Kasiviswanathan <[email protected]>
Subash Abhinov Kasiviswanathan 4 lat temu
rodzic
commit
358bbdb779
2 zmienionych plików z 64 dodań i 1 usunięć
  1. 52 0
      core/rmnet_genl.c
  2. 12 1
      core/rmnet_genl.h

+ 52 - 0
core/rmnet_genl.c

@@ -18,6 +18,7 @@ static struct nla_policy rmnet_genl_attr_policy[RMNET_CORE_GENL_ATTR_MAX +
 	[RMNET_CORE_GENL_ATTR_INT]  = { .type = NLA_S32 },
 	[RMNET_CORE_GENL_ATTR_PID_BPS] = NLA_POLICY_EXACT_LEN(sizeof(struct rmnet_core_pid_bps_resp)),
 	[RMNET_CORE_GENL_ATTR_PID_BOOST] = NLA_POLICY_EXACT_LEN(sizeof(struct rmnet_core_pid_boost_req)),
+	[RMNET_CORE_GENL_ATTR_TETHER_INFO] = NLA_POLICY_EXACT_LEN(sizeof(struct rmnet_core_tether_info_req)),
 	[RMNET_CORE_GENL_ATTR_STR]  = { .type = NLA_NUL_STRING, .len =
 				RMNET_CORE_GENL_MAX_STR_LEN },
 };
@@ -35,6 +36,8 @@ static const struct genl_ops rmnet_core_genl_ops[] = {
 			   rmnet_core_genl_pid_bps_req_hdlr),
 	RMNET_CORE_GENL_OP(RMNET_CORE_GENL_CMD_PID_BOOST_REQ,
 			   rmnet_core_genl_pid_boost_req_hdlr),
+	RMNET_CORE_GENL_OP(RMNET_CORE_GENL_CMD_TETHER_INFO_REQ,
+			   rmnet_core_genl_tether_info_req_hdlr),
 };
 
 struct genl_family rmnet_core_genl_family = {
@@ -78,6 +81,10 @@ struct rmnet_pid_node_s {
 	pid_t pid;
 };
 
+typedef void (*rmnet_perf_tether_cmd_hook_t)(u8 message, u64 val);
+rmnet_perf_tether_cmd_hook_t rmnet_perf_tether_cmd_hook __rcu __read_mostly;
+EXPORT_SYMBOL(rmnet_perf_tether_cmd_hook);
+
 void rmnet_update_pid_and_check_boost(pid_t pid, unsigned int len,
 				      int *boost_enable, u64 *boost_period)
 {
@@ -380,6 +387,51 @@ int rmnet_core_genl_pid_boost_req_hdlr(struct sk_buff *skb_2,
 	return RMNET_GENL_SUCCESS;
 }
 
+int rmnet_core_genl_tether_info_req_hdlr(struct sk_buff *skb_2,
+				       struct genl_info *info)
+{
+	struct nlattr *na;
+	struct rmnet_core_tether_info_req tether_info_req;
+	int is_req_valid = 0;
+	rmnet_perf_tether_cmd_hook_t rmnet_perf_tether_cmd;
+
+	rm_err("CORE_GNL: %s", __func__);
+
+	if (!info) {
+		rm_err("%s", "CORE_GNL: error - info is null");
+		return RMNET_GENL_FAILURE;
+	}
+
+	na = info->attrs[RMNET_CORE_GENL_ATTR_TETHER_INFO];
+	if (na) {
+		if (nla_memcpy(&tether_info_req, na, sizeof(tether_info_req)) > 0) {
+			is_req_valid = 1;
+		} else {
+			rm_err("CORE_GNL: nla_memcpy failed %d\n",
+			       RMNET_CORE_GENL_ATTR_TETHER_INFO);
+			return RMNET_GENL_FAILURE;
+		}
+	} else {
+		rm_err("CORE_GNL: no info->attrs %d\n",
+		       RMNET_CORE_GENL_ATTR_TETHER_INFO);
+		return RMNET_GENL_FAILURE;
+	}
+
+	if (!tether_info_req.valid) {
+		rm_err("%s", "CORE_GNL: tether info req is invalid");
+		return RMNET_GENL_FAILURE;
+	}
+
+	rmnet_perf_tether_cmd = rcu_dereference(rmnet_perf_tether_cmd_hook);
+	if (rmnet_perf_tether_cmd)
+		rmnet_perf_tether_cmd(1, tether_info_req.tether_filters_en);
+
+	rm_err("CORE_GNL: tether filters %s",
+	       tether_info_req.tether_filters_en ? "enabled" : "disabled");
+
+	return RMNET_GENL_SUCCESS;
+}
+
 /* register new rmnet core driver generic netlink family */
 int rmnet_core_genl_init(void)
 {

+ 12 - 1
core/rmnet_genl.h

@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
-/* Copyright (c) 2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2019, 2021 The Linux Foundation. All rights reserved.
  *
  * RMNET Data Generic Netlink
  *
@@ -30,6 +30,7 @@ enum {
 	RMNET_CORE_GENL_CMD_UNSPEC,
 	RMNET_CORE_GENL_CMD_PID_BPS_REQ,
 	RMNET_CORE_GENL_CMD_PID_BOOST_REQ,
+	RMNET_CORE_GENL_CMD_TETHER_INFO_REQ,
 	__RMNET_CORE_GENL_CMD_MAX,
 };
 
@@ -39,6 +40,7 @@ enum {
 	RMNET_CORE_GENL_ATTR_INT,
 	RMNET_CORE_GENL_ATTR_PID_BPS,
 	RMNET_CORE_GENL_ATTR_PID_BOOST,
+	RMNET_CORE_GENL_ATTR_TETHER_INFO,
 	__RMNET_CORE_GENL_ATTR_MAX,
 };
 
@@ -78,6 +80,12 @@ struct rmnet_core_pid_boost_req {
 	u8 valid;
 };
 
+/* Tether Info Request Structure */
+struct rmnet_core_tether_info_req {
+	uint8_t tether_filters_en;
+	uint8_t valid;
+};
+
 /* Function Prototypes */
 int rmnet_core_genl_pid_bps_req_hdlr(struct sk_buff *skb_2,
 				     struct genl_info *info);
@@ -85,6 +93,9 @@ int rmnet_core_genl_pid_bps_req_hdlr(struct sk_buff *skb_2,
 int rmnet_core_genl_pid_boost_req_hdlr(struct sk_buff *skb_2,
 				       struct genl_info *info);
 
+int rmnet_core_genl_tether_info_req_hdlr(struct sk_buff *skb_2,
+					 struct genl_info *info);
+
 /* Called by vnd select queue */
 void rmnet_update_pid_and_check_boost(pid_t pid, unsigned int len,
 				      int *boost_enable, u64 *boost_period);