rmnet_core: Add generic module framework

Adds a simple, tracepoint inspired hook definiton framework to centralize
all calls to rmnet support modules. Modules can set and unset these hooks
freely, and modules may call one another's hooks without being forced to
link against any module other than the core rmnet module.

Change-Id: I949f7a17c95003e0c79262c6611b0602c7189e0c
Signed-off-by: Sean Tranchetti <quic_stranche@quicinc.com>
This commit is contained in:
Sean Tranchetti
2022-05-02 14:33:25 -07:00
parent 8638373d04
commit cf5990b0df
5 changed files with 340 additions and 0 deletions

108
core/rmnet_hook.h Normal file
View File

@@ -0,0 +1,108 @@
/* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#if !defined(__RMNET_HOOKS__) || defined(__RMNET_HOOK_MULTIREAD__)
#define __RMNET_HOOKS__
#include <linux/skbuff.h>
#include <linux/tcp.h>
#include "rmnet_descriptor.h"
RMNET_MODULE_HOOK(offload_ingress,
RMNET_MODULE_HOOK_NUM(OFFLOAD_INGRESS),
RMNET_MODULE_HOOK_PROTOCOL(struct list_head *desc_list,
struct rmnet_port *port),
RMNET_MODULE_HOOK_ARGS(desc_list, port),
RMNET_MODULE_HOOK_RETURN_TYPE(void)
);
RMNET_MODULE_HOOK(offload_chain_end,
RMNET_MODULE_HOOK_NUM(OFFLOAD_CHAIN_END),
RMNET_MODULE_HOOK_PROTOCOL(void),
RMNET_MODULE_HOOK_ARGS(),
RMNET_MODULE_HOOK_RETURN_TYPE(void)
);
RMNET_MODULE_HOOK(shs_skb_entry,
RMNET_MODULE_HOOK_NUM(SHS_SKB_ENTRY),
RMNET_MODULE_HOOK_PROTOCOL(struct sk_buff *skb,
struct rmnet_shs_clnt_s *cfg),
RMNET_MODULE_HOOK_ARGS(skb, cfg),
RMNET_MODULE_HOOK_RETURN_TYPE(int)
);
RMNET_MODULE_HOOK(shs_switch,
RMNET_MODULE_HOOK_NUM(SHS_SWITCH),
RMNET_MODULE_HOOK_PROTOCOL(struct sk_buff *skb,
struct rmnet_shs_clnt_s *cfg),
RMNET_MODULE_HOOK_ARGS(skb, cfg),
RMNET_MODULE_HOOK_RETURN_TYPE(int)
);
RMNET_MODULE_HOOK(perf_tether_ingress,
RMNET_MODULE_HOOK_NUM(PERF_TETHER_INGRESS),
RMNET_MODULE_HOOK_PROTOCOL(struct tcphdr *tp,
struct sk_buff *skb),
RMNET_MODULE_HOOK_ARGS(tp, skb),
RMNET_MODULE_HOOK_RETURN_TYPE(void)
);
RMNET_MODULE_HOOK(perf_tether_egress,
RMNET_MODULE_HOOK_NUM(PERF_TETHER_EGRESS),
RMNET_MODULE_HOOK_PROTOCOL(struct sk_buff *skb),
RMNET_MODULE_HOOK_ARGS(skb),
RMNET_MODULE_HOOK_RETURN_TYPE(void)
);
RMNET_MODULE_HOOK(perf_tether_cmd,
RMNET_MODULE_HOOK_NUM(PERF_TETHER_CMD),
RMNET_MODULE_HOOK_PROTOCOL(u8 message, u64 val),
RMNET_MODULE_HOOK_ARGS(message, val),
RMNET_MODULE_HOOK_RETURN_TYPE(void)
);
RMNET_MODULE_HOOK(perf_ingress,
RMNET_MODULE_HOOK_NUM(PERF_INGRESS),
RMNET_MODULE_HOOK_PROTOCOL(struct sk_buff *skb),
RMNET_MODULE_HOOK_ARGS(skb),
RMNET_MODULE_HOOK_RETURN_TYPE(int)
);
RMNET_MODULE_HOOK(perf_egress,
RMNET_MODULE_HOOK_NUM(PERF_EGRESS),
RMNET_MODULE_HOOK_PROTOCOL(struct sk_buff *skb),
RMNET_MODULE_HOOK_ARGS(skb),
RMNET_MODULE_HOOK_RETURN_TYPE(void)
);
RMNET_MODULE_HOOK(aps_pre_queue,
RMNET_MODULE_HOOK_NUM(APS_PRE_QUEUE),
RMNET_MODULE_HOOK_PROTOCOL(struct net_device *dev, struct sk_buff *skb),
RMNET_MODULE_HOOK_ARGS(dev, skb),
RMNET_MODULE_HOOK_RETURN_TYPE(void)
);
RMNET_MODULE_HOOK(aps_post_queue,
RMNET_MODULE_HOOK_NUM(APS_POST_QUEUE),
RMNET_MODULE_HOOK_PROTOCOL(struct net_device *dev, struct sk_buff *skb),
RMNET_MODULE_HOOK_ARGS(dev, skb),
RMNET_MODULE_HOOK_RETURN_TYPE(int)
);
RMNET_MODULE_HOOK(wlan_flow_match,
RMNET_MODULE_HOOK_NUM(WLAN_FLOW_MATCH),
RMNET_MODULE_HOOK_PROTOCOL(struct sk_buff *skb),
RMNET_MODULE_HOOK_ARGS(skb),
RMNET_MODULE_HOOK_RETURN_TYPE(void)
);
#endif