summaryrefslogtreecommitdiff
path: root/drivers/rmnet/perf/rmnet_perf_core.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/rmnet/perf/rmnet_perf_core.h')
-rw-r--r--drivers/rmnet/perf/rmnet_perf_core.h70
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);