1ceed73a2SSubash Abhinov Kasiviswanathan /* Copyright (c) 2013-2014, 2016-2017 The Linux Foundation. All rights reserved.
2ceed73a2SSubash Abhinov Kasiviswanathan  *
3ceed73a2SSubash Abhinov Kasiviswanathan  * This program is free software; you can redistribute it and/or modify
4ceed73a2SSubash Abhinov Kasiviswanathan  * it under the terms of the GNU General Public License version 2 and
5ceed73a2SSubash Abhinov Kasiviswanathan  * only version 2 as published by the Free Software Foundation.
6ceed73a2SSubash Abhinov Kasiviswanathan  *
7ceed73a2SSubash Abhinov Kasiviswanathan  * This program is distributed in the hope that it will be useful,
8ceed73a2SSubash Abhinov Kasiviswanathan  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9ceed73a2SSubash Abhinov Kasiviswanathan  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10ceed73a2SSubash Abhinov Kasiviswanathan  * GNU General Public License for more details.
11ceed73a2SSubash Abhinov Kasiviswanathan  *
12ceed73a2SSubash Abhinov Kasiviswanathan  * RMNET Data configuration engine
13ceed73a2SSubash Abhinov Kasiviswanathan  *
14ceed73a2SSubash Abhinov Kasiviswanathan  */
15ceed73a2SSubash Abhinov Kasiviswanathan 
16ceed73a2SSubash Abhinov Kasiviswanathan #include <linux/skbuff.h>
17ceed73a2SSubash Abhinov Kasiviswanathan 
18ceed73a2SSubash Abhinov Kasiviswanathan #ifndef _RMNET_CONFIG_H_
19ceed73a2SSubash Abhinov Kasiviswanathan #define _RMNET_CONFIG_H_
20ceed73a2SSubash Abhinov Kasiviswanathan 
21ceed73a2SSubash Abhinov Kasiviswanathan #define RMNET_MAX_LOGICAL_EP 255
22ceed73a2SSubash Abhinov Kasiviswanathan 
23ceed73a2SSubash Abhinov Kasiviswanathan struct rmnet_endpoint {
24ceed73a2SSubash Abhinov Kasiviswanathan 	u8 mux_id;
25ceed73a2SSubash Abhinov Kasiviswanathan 	struct net_device *egress_dev;
263352e6c4SSubash Abhinov Kasiviswanathan 	struct hlist_node hlnode;
27ceed73a2SSubash Abhinov Kasiviswanathan };
28ceed73a2SSubash Abhinov Kasiviswanathan 
29ceed73a2SSubash Abhinov Kasiviswanathan /* One instance of this structure is instantiated for each real_dev associated
30ceed73a2SSubash Abhinov Kasiviswanathan  * with rmnet.
31ceed73a2SSubash Abhinov Kasiviswanathan  */
32b665f4f8SSubash Abhinov Kasiviswanathan struct rmnet_port {
33ceed73a2SSubash Abhinov Kasiviswanathan 	struct net_device *dev;
34ceed73a2SSubash Abhinov Kasiviswanathan 	u32 ingress_data_format;
35ceed73a2SSubash Abhinov Kasiviswanathan 	u32 egress_data_format;
36ceed73a2SSubash Abhinov Kasiviswanathan 	u8 nr_rmnet_devs;
3791489632SSubash Abhinov Kasiviswanathan 	u8 rmnet_mode;
383352e6c4SSubash Abhinov Kasiviswanathan 	struct hlist_head muxed_ep[RMNET_MAX_LOGICAL_EP];
3960d58f97SSubash Abhinov Kasiviswanathan 	struct net_device *bridge_ep;
40ceed73a2SSubash Abhinov Kasiviswanathan };
41ceed73a2SSubash Abhinov Kasiviswanathan 
42ceed73a2SSubash Abhinov Kasiviswanathan extern struct rtnl_link_ops rmnet_link_ops;
43ceed73a2SSubash Abhinov Kasiviswanathan 
44192c4b5dSSubash Abhinov Kasiviswanathan struct rmnet_vnd_stats {
45192c4b5dSSubash Abhinov Kasiviswanathan 	u64 rx_pkts;
46192c4b5dSSubash Abhinov Kasiviswanathan 	u64 rx_bytes;
47192c4b5dSSubash Abhinov Kasiviswanathan 	u64 tx_pkts;
48192c4b5dSSubash Abhinov Kasiviswanathan 	u64 tx_bytes;
49192c4b5dSSubash Abhinov Kasiviswanathan 	u32 tx_drops;
50192c4b5dSSubash Abhinov Kasiviswanathan };
51192c4b5dSSubash Abhinov Kasiviswanathan 
52192c4b5dSSubash Abhinov Kasiviswanathan struct rmnet_pcpu_stats {
53192c4b5dSSubash Abhinov Kasiviswanathan 	struct rmnet_vnd_stats stats;
54192c4b5dSSubash Abhinov Kasiviswanathan 	struct u64_stats_sync syncp;
55192c4b5dSSubash Abhinov Kasiviswanathan };
56192c4b5dSSubash Abhinov Kasiviswanathan 
57ceed73a2SSubash Abhinov Kasiviswanathan struct rmnet_priv {
58ceed73a2SSubash Abhinov Kasiviswanathan 	u8 mux_id;
59b752eff5SSubash Abhinov Kasiviswanathan 	struct net_device *real_dev;
60192c4b5dSSubash Abhinov Kasiviswanathan 	struct rmnet_pcpu_stats __percpu *pcpu_stats;
61ceed73a2SSubash Abhinov Kasiviswanathan };
62ceed73a2SSubash Abhinov Kasiviswanathan 
63b665f4f8SSubash Abhinov Kasiviswanathan struct rmnet_port *rmnet_get_port(struct net_device *real_dev);
643352e6c4SSubash Abhinov Kasiviswanathan struct rmnet_endpoint *rmnet_get_endpoint(struct rmnet_port *port, u8 mux_id);
6560d58f97SSubash Abhinov Kasiviswanathan int rmnet_add_bridge(struct net_device *rmnet_dev,
6660d58f97SSubash Abhinov Kasiviswanathan 		     struct net_device *slave_dev,
6760d58f97SSubash Abhinov Kasiviswanathan 		     struct netlink_ext_ack *extack);
6860d58f97SSubash Abhinov Kasiviswanathan int rmnet_del_bridge(struct net_device *rmnet_dev,
6960d58f97SSubash Abhinov Kasiviswanathan 		     struct net_device *slave_dev);
70ceed73a2SSubash Abhinov Kasiviswanathan #endif /* _RMNET_CONFIG_H_ */
71