diff options
Diffstat (limited to 'drivers/rmnet/perf/rmnet_perf_core.h')
-rw-r--r-- | drivers/rmnet/perf/rmnet_perf_core.h | 70 |
1 files changed, 52 insertions, 18 deletions
diff --git a/drivers/rmnet/perf/rmnet_perf_core.h b/drivers/rmnet/perf/rmnet_perf_core.h index 91557fc..735cb3b 100644 --- a/drivers/rmnet/perf/rmnet_perf_core.h +++ b/drivers/rmnet/perf/rmnet_perf_core.h @@ -12,6 +12,7 @@ #include <linux/skbuff.h> #include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h> #include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h> +#include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_descriptor.h> #ifndef _RMNET_PERF_CORE_H_ #define _RMNET_PERF_CORE_H_ @@ -25,28 +26,49 @@ struct rmnet_perf { struct rmnet_port *rmnet_port; }; -/*Identifying info for the current packet being deaggregated +/* Identifying info for the current packet being deaggregated * this is so we don't have to redundantly check things in the * header of the packet. Also prevents excessive parameters */ struct rmnet_perf_pkt_info { + /* True if this is the first packet being put into a flow node. */ bool first_packet; bool csum_valid; - unsigned char ip_proto; - unsigned char trans_proto; - u16 header_len; + + /* Header protocols */ + u8 ip_proto; + u8 trans_proto; + + /* Header lengths */ + u16 ip_len; + u16 trans_len; + + /* Data length */ u16 payload_len; + + /* Hash over standard 5 tuple */ u32 hash_key; + + /* TCP timestamp */ u32 curr_timestamp; + + /* Headers */ union { struct iphdr *v4hdr; struct ipv6hdr *v6hdr; - } iphdr; + } ip_hdr; union { struct tcphdr *tp; struct udphdr *up; - } trns_hdr; + } trans_hdr; + struct rmnet_endpoint *ep; + + /* The base packet itself */ + union { + struct sk_buff *skb; + struct rmnet_frag_descriptor *frag_desc; + }; }; struct rmnet_perf_core_64k_buff_pool { @@ -56,6 +78,10 @@ struct rmnet_perf_core_64k_buff_pool { struct rmnet_perf_core_burst_marker_state { bool wait_for_start; + /* If the callbacks fail to register, then we want to flush at the + * end of every chain + */ + bool callbacks_valid; u32 curr_seq; u32 expect_packets; }; @@ -75,8 +101,6 @@ struct rmnet_perf_core_meta { /* recycled buffer pool */ struct rmnet_perf_core_64k_buff_pool *buff_pool; struct net_device *dev; - //struct hrtimer hrtimer; - //spinlock_t timer_lock; struct rmnet_perf_core_burst_marker_state *bm_state; struct rmnet_map_dl_ind *dl_ind; struct qmi_rmnet_ps_ind *ps_ind; @@ -111,25 +135,35 @@ enum rmnet_perf_trace_evt { RMNET_PERF_DEAG_PKT, }; + +void rmnet_perf_core_grab_lock(void); +void rmnet_perf_core_release_lock(void); void rmnet_perf_core_ps_on(void *port); void rmnet_perf_core_ps_off(void *port); +bool rmnet_perf_core_is_deag_mode(void); +void rmnet_perf_core_set_ingress_hook(void); void rmnet_perf_core_reset_recycled_skb(struct sk_buff *skb); -struct sk_buff *rmnet_perf_core_elligible_for_cache_skb(struct rmnet_perf *perf, - u32 len); -void rmnet_perf_core_free_held_skbs(struct rmnet_perf *perf); -void rmnet_perf_core_send_skb(struct sk_buff *skb, struct rmnet_endpoint *ep, - struct rmnet_perf *perf, - struct rmnet_perf_pkt_info *pkt_info); -void rmnet_perf_core_flush_curr_pkt(struct rmnet_perf *perf, - struct sk_buff *skb, - struct rmnet_perf_pkt_info *pkt_info, +struct sk_buff *rmnet_perf_core_elligible_for_cache_skb(u32 len); +void rmnet_perf_core_free_held_skbs(void); +void rmnet_perf_core_send_skb(struct sk_buff *skb, struct rmnet_endpoint *ep); +void rmnet_perf_core_send_desc(struct rmnet_frag_descriptor *frag_desc); +void rmnet_perf_core_flush_curr_pkt(struct rmnet_perf_pkt_info *pkt_info, u16 packet_len, bool flush_shs, bool skip_hash); void rmnet_perf_core_deaggregate(struct sk_buff *skb, + struct rmnet_port *port); +void rmnet_perf_core_desc_entry(struct rmnet_frag_descriptor *frag_desc, struct rmnet_port *port); u32 rmnet_perf_core_compute_flow_hash(struct rmnet_perf_pkt_info *pkt_info); void rmnet_perf_core_flush_single_gro_flow(u32 hash_key); -void rmnet_perf_core_handle_map_control_end(struct rmnet_map_dl_ind_trl *dltrl); +void +rmnet_perf_core_handle_map_control_end_v2(struct rmnet_map_dl_ind_trl *dltrl, + struct rmnet_map_control_command_header *qcmd); +void +rmnet_perf_core_handle_map_control_start_v2(struct rmnet_map_dl_ind_hdr *dlhdr, + struct rmnet_map_control_command_header *qcmd); +void +rmnet_perf_core_handle_map_control_end(struct rmnet_map_dl_ind_trl *dltrl); void rmnet_perf_core_handle_map_control_start(struct rmnet_map_dl_ind_hdr *dlhdr); |