1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* Copyright (c) 2013-2014, 2016-2018 The Linux Foundation. All rights reserved. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * RMNET Data configuration engine 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #include <linux/skbuff.h> 8*4882a593Smuzhiyun #include <net/gro_cells.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef _RMNET_CONFIG_H_ 11*4882a593Smuzhiyun #define _RMNET_CONFIG_H_ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #define RMNET_MAX_LOGICAL_EP 255 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun struct rmnet_endpoint { 16*4882a593Smuzhiyun u8 mux_id; 17*4882a593Smuzhiyun struct net_device *egress_dev; 18*4882a593Smuzhiyun struct hlist_node hlnode; 19*4882a593Smuzhiyun }; 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun /* One instance of this structure is instantiated for each real_dev associated 22*4882a593Smuzhiyun * with rmnet. 23*4882a593Smuzhiyun */ 24*4882a593Smuzhiyun struct rmnet_port { 25*4882a593Smuzhiyun struct net_device *dev; 26*4882a593Smuzhiyun u32 data_format; 27*4882a593Smuzhiyun u8 nr_rmnet_devs; 28*4882a593Smuzhiyun u8 rmnet_mode; 29*4882a593Smuzhiyun struct hlist_head muxed_ep[RMNET_MAX_LOGICAL_EP]; 30*4882a593Smuzhiyun struct net_device *bridge_ep; 31*4882a593Smuzhiyun struct net_device *rmnet_dev; 32*4882a593Smuzhiyun }; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun extern struct rtnl_link_ops rmnet_link_ops; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun struct rmnet_vnd_stats { 37*4882a593Smuzhiyun u64 rx_pkts; 38*4882a593Smuzhiyun u64 rx_bytes; 39*4882a593Smuzhiyun u64 tx_pkts; 40*4882a593Smuzhiyun u64 tx_bytes; 41*4882a593Smuzhiyun u32 tx_drops; 42*4882a593Smuzhiyun }; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun struct rmnet_pcpu_stats { 45*4882a593Smuzhiyun struct rmnet_vnd_stats stats; 46*4882a593Smuzhiyun struct u64_stats_sync syncp; 47*4882a593Smuzhiyun }; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun struct rmnet_priv_stats { 50*4882a593Smuzhiyun u64 csum_ok; 51*4882a593Smuzhiyun u64 csum_valid_unset; 52*4882a593Smuzhiyun u64 csum_validation_failed; 53*4882a593Smuzhiyun u64 csum_err_bad_buffer; 54*4882a593Smuzhiyun u64 csum_err_invalid_ip_version; 55*4882a593Smuzhiyun u64 csum_err_invalid_transport; 56*4882a593Smuzhiyun u64 csum_fragmented_pkt; 57*4882a593Smuzhiyun u64 csum_skipped; 58*4882a593Smuzhiyun u64 csum_sw; 59*4882a593Smuzhiyun }; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun struct rmnet_priv { 62*4882a593Smuzhiyun u8 mux_id; 63*4882a593Smuzhiyun struct net_device *real_dev; 64*4882a593Smuzhiyun struct rmnet_pcpu_stats __percpu *pcpu_stats; 65*4882a593Smuzhiyun struct gro_cells gro_cells; 66*4882a593Smuzhiyun struct rmnet_priv_stats stats; 67*4882a593Smuzhiyun }; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun struct rmnet_port *rmnet_get_port_rcu(struct net_device *real_dev); 70*4882a593Smuzhiyun struct rmnet_endpoint *rmnet_get_endpoint(struct rmnet_port *port, u8 mux_id); 71*4882a593Smuzhiyun int rmnet_add_bridge(struct net_device *rmnet_dev, 72*4882a593Smuzhiyun struct net_device *slave_dev, 73*4882a593Smuzhiyun struct netlink_ext_ack *extack); 74*4882a593Smuzhiyun int rmnet_del_bridge(struct net_device *rmnet_dev, 75*4882a593Smuzhiyun struct net_device *slave_dev); 76*4882a593Smuzhiyun struct rmnet_port* 77*4882a593Smuzhiyun rmnet_get_port_rtnl(const struct net_device *real_dev); 78*4882a593Smuzhiyun #endif /* _RMNET_CONFIG_H_ */ 79