197fb5e8dSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2*b6e5d27eSSharath Chandra Vurukala /* Copyright (c) 2013-2014, 2016-2018, 2021 The Linux Foundation.
3*b6e5d27eSSharath Chandra Vurukala  * All rights reserved.
4ceed73a2SSubash Abhinov Kasiviswanathan  *
5ceed73a2SSubash Abhinov Kasiviswanathan  * RMNET Data configuration engine
6ceed73a2SSubash Abhinov Kasiviswanathan  */
7ceed73a2SSubash Abhinov Kasiviswanathan 
8ceed73a2SSubash Abhinov Kasiviswanathan #include <linux/skbuff.h>
9ca32fb03SSubash Abhinov Kasiviswanathan #include <net/gro_cells.h>
10ceed73a2SSubash Abhinov Kasiviswanathan 
11ceed73a2SSubash Abhinov Kasiviswanathan #ifndef _RMNET_CONFIG_H_
12ceed73a2SSubash Abhinov Kasiviswanathan #define _RMNET_CONFIG_H_
13ceed73a2SSubash Abhinov Kasiviswanathan 
14ceed73a2SSubash Abhinov Kasiviswanathan #define RMNET_MAX_LOGICAL_EP 255
15ceed73a2SSubash Abhinov Kasiviswanathan 
16ceed73a2SSubash Abhinov Kasiviswanathan struct rmnet_endpoint {
17ceed73a2SSubash Abhinov Kasiviswanathan 	u8 mux_id;
18ceed73a2SSubash Abhinov Kasiviswanathan 	struct net_device *egress_dev;
193352e6c4SSubash Abhinov Kasiviswanathan 	struct hlist_node hlnode;
20ceed73a2SSubash Abhinov Kasiviswanathan };
21ceed73a2SSubash Abhinov Kasiviswanathan 
22ceed73a2SSubash Abhinov Kasiviswanathan /* One instance of this structure is instantiated for each real_dev associated
23ceed73a2SSubash Abhinov Kasiviswanathan  * with rmnet.
24ceed73a2SSubash Abhinov Kasiviswanathan  */
25b665f4f8SSubash Abhinov Kasiviswanathan struct rmnet_port {
26ceed73a2SSubash Abhinov Kasiviswanathan 	struct net_device *dev;
27b23e722eSSubash Abhinov Kasiviswanathan 	u32 data_format;
28ceed73a2SSubash Abhinov Kasiviswanathan 	u8 nr_rmnet_devs;
2991489632SSubash Abhinov Kasiviswanathan 	u8 rmnet_mode;
303352e6c4SSubash Abhinov Kasiviswanathan 	struct hlist_head muxed_ep[RMNET_MAX_LOGICAL_EP];
3160d58f97SSubash Abhinov Kasiviswanathan 	struct net_device *bridge_ep;
32d939b6d3STaehee Yoo 	struct net_device *rmnet_dev;
33ceed73a2SSubash Abhinov Kasiviswanathan };
34ceed73a2SSubash Abhinov Kasiviswanathan 
35ceed73a2SSubash Abhinov Kasiviswanathan extern struct rtnl_link_ops rmnet_link_ops;
36ceed73a2SSubash Abhinov Kasiviswanathan 
37192c4b5dSSubash Abhinov Kasiviswanathan struct rmnet_vnd_stats {
38192c4b5dSSubash Abhinov Kasiviswanathan 	u64 rx_pkts;
39192c4b5dSSubash Abhinov Kasiviswanathan 	u64 rx_bytes;
40192c4b5dSSubash Abhinov Kasiviswanathan 	u64 tx_pkts;
41192c4b5dSSubash Abhinov Kasiviswanathan 	u64 tx_bytes;
42192c4b5dSSubash Abhinov Kasiviswanathan 	u32 tx_drops;
43192c4b5dSSubash Abhinov Kasiviswanathan };
44192c4b5dSSubash Abhinov Kasiviswanathan 
45192c4b5dSSubash Abhinov Kasiviswanathan struct rmnet_pcpu_stats {
46192c4b5dSSubash Abhinov Kasiviswanathan 	struct rmnet_vnd_stats stats;
47192c4b5dSSubash Abhinov Kasiviswanathan 	struct u64_stats_sync syncp;
48192c4b5dSSubash Abhinov Kasiviswanathan };
49192c4b5dSSubash Abhinov Kasiviswanathan 
50bbde32d3SSubash Abhinov Kasiviswanathan struct rmnet_priv_stats {
51bbde32d3SSubash Abhinov Kasiviswanathan 	u64 csum_ok;
52bbde32d3SSubash Abhinov Kasiviswanathan 	u64 csum_valid_unset;
53bbde32d3SSubash Abhinov Kasiviswanathan 	u64 csum_validation_failed;
54bbde32d3SSubash Abhinov Kasiviswanathan 	u64 csum_err_bad_buffer;
55bbde32d3SSubash Abhinov Kasiviswanathan 	u64 csum_err_invalid_ip_version;
56bbde32d3SSubash Abhinov Kasiviswanathan 	u64 csum_err_invalid_transport;
57bbde32d3SSubash Abhinov Kasiviswanathan 	u64 csum_fragmented_pkt;
58bbde32d3SSubash Abhinov Kasiviswanathan 	u64 csum_skipped;
59bbde32d3SSubash Abhinov Kasiviswanathan 	u64 csum_sw;
60*b6e5d27eSSharath Chandra Vurukala 	u64 csum_hw;
61bbde32d3SSubash Abhinov Kasiviswanathan };
62bbde32d3SSubash Abhinov Kasiviswanathan 
63ceed73a2SSubash Abhinov Kasiviswanathan struct rmnet_priv {
64ceed73a2SSubash Abhinov Kasiviswanathan 	u8 mux_id;
65b752eff5SSubash Abhinov Kasiviswanathan 	struct net_device *real_dev;
66192c4b5dSSubash Abhinov Kasiviswanathan 	struct rmnet_pcpu_stats __percpu *pcpu_stats;
67ca32fb03SSubash Abhinov Kasiviswanathan 	struct gro_cells gro_cells;
68bbde32d3SSubash Abhinov Kasiviswanathan 	struct rmnet_priv_stats stats;
69ceed73a2SSubash Abhinov Kasiviswanathan };
70ceed73a2SSubash Abhinov Kasiviswanathan 
71102210f7STaehee Yoo struct rmnet_port *rmnet_get_port_rcu(struct net_device *real_dev);
723352e6c4SSubash Abhinov Kasiviswanathan struct rmnet_endpoint *rmnet_get_endpoint(struct rmnet_port *port, u8 mux_id);
7360d58f97SSubash Abhinov Kasiviswanathan int rmnet_add_bridge(struct net_device *rmnet_dev,
7460d58f97SSubash Abhinov Kasiviswanathan 		     struct net_device *slave_dev,
7560d58f97SSubash Abhinov Kasiviswanathan 		     struct netlink_ext_ack *extack);
7660d58f97SSubash Abhinov Kasiviswanathan int rmnet_del_bridge(struct net_device *rmnet_dev,
7760d58f97SSubash Abhinov Kasiviswanathan 		     struct net_device *slave_dev);
78b7f5eb6bSSubash Abhinov Kasiviswanathan struct rmnet_port*
79b7f5eb6bSSubash Abhinov Kasiviswanathan rmnet_get_port_rtnl(const struct net_device *real_dev);
80ceed73a2SSubash Abhinov Kasiviswanathan #endif /* _RMNET_CONFIG_H_ */
81