summaryrefslogtreecommitdiff
path: root/drivers/rmnet/perf/rmnet_perf_udp_opt.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/rmnet/perf/rmnet_perf_udp_opt.c')
-rw-r--r--drivers/rmnet/perf/rmnet_perf_udp_opt.c53
1 files changed, 27 insertions, 26 deletions
diff --git a/drivers/rmnet/perf/rmnet_perf_udp_opt.c b/drivers/rmnet/perf/rmnet_perf_udp_opt.c
index d730820..0f4399c 100644
--- a/drivers/rmnet/perf/rmnet_perf_udp_opt.c
+++ b/drivers/rmnet/perf/rmnet_perf_udp_opt.c
@@ -26,7 +26,7 @@
#include "rmnet_perf_config.h"
/* Max number of bytes we allow udp_opt to aggregate per flow */
-unsigned int rmnet_perf_udp_opt_flush_limit __read_mostly = 65536;
+unsigned int rmnet_perf_udp_opt_flush_limit __read_mostly = 65000;
module_param(rmnet_perf_udp_opt_flush_limit, uint, 0644);
MODULE_PARM_DESC(rmnet_perf_udp_opt_flush_limit,
"Max flush limiit for udp_opt");
@@ -52,7 +52,6 @@ update_udp_flush_stat(enum rmnet_perf_udp_opt_flush_reasons stat)
}
/* udp_pkt_can_be_merged() - Check if packet can be merged
- * @skb: Source socket buffer containing current MAP frames
* @flow_node: flow node meta data for checking condition
* @pkt_info: characteristics of the current packet
*
@@ -64,23 +63,29 @@ update_udp_flush_stat(enum rmnet_perf_udp_opt_flush_reasons stat)
* merge status
**/
static enum rmnet_perf_udp_opt_merge_check_rc
-udp_pkt_can_be_merged(struct sk_buff *skb,
- struct rmnet_perf_opt_flow_node *flow_node,
+udp_pkt_can_be_merged(struct rmnet_perf_opt_flow_node *flow_node,
struct rmnet_perf_pkt_info *pkt_info)
{
- u16 payload_len = pkt_info->payload_len;
+ u16 gso_len;
+
+ /* Use any previous GRO information, if present */
+ if (pkt_info->frag_desc && pkt_info->frag_desc->gso_size)
+ gso_len = pkt_info->frag_desc->gso_size;
+ else
+ gso_len = pkt_info->payload_len;
/* 1. validate length */
- if (flow_node->gso_len != payload_len) {
+ if (flow_node->gso_len != gso_len) {
update_udp_flush_stat(RMNET_PERF_UDP_OPT_LENGTH_MISMATCH);
return RMNET_PERF_UDP_OPT_FLUSH_SOME;
}
/* 2. check for size/count overflow */
- if ((payload_len + flow_node->len >= rmnet_perf_udp_opt_flush_limit)) {
+ if (pkt_info->payload_len + flow_node->len >=
+ rmnet_perf_udp_opt_flush_limit) {
update_udp_flush_stat(RMNET_PERF_UDP_OPT_64K_LIMIT);
return RMNET_PERF_UDP_OPT_FLUSH_SOME;
- } else if ((flow_node->num_pkts_held >= 50)) {
+ } else if (flow_node->num_pkts_held >= 50) {
update_udp_flush_stat(RMNET_PERF_UDP_OPT_NO_SPACE_IN_NODE);
return RMNET_PERF_UDP_OPT_FLUSH_SOME;
}
@@ -88,8 +93,6 @@ udp_pkt_can_be_merged(struct sk_buff *skb,
}
/* rmnet_perf_udp_opt_ingress() - Core business logic of udp_opt
- * @perf: allows access to our required global structures
- * @skb: the incoming ip packet
* @pkt_info: characteristics of the current packet
* @flush: IP flag mismatch detected
*
@@ -101,8 +104,7 @@ udp_pkt_can_be_merged(struct sk_buff *skb,
* Return:
* - void
**/
-void rmnet_perf_udp_opt_ingress(struct rmnet_perf *perf, struct sk_buff *skb,
- struct rmnet_perf_opt_flow_node *flow_node,
+void rmnet_perf_udp_opt_ingress(struct rmnet_perf_opt_flow_node *flow_node,
struct rmnet_perf_pkt_info *pkt_info,
bool flush)
{
@@ -110,9 +112,10 @@ void rmnet_perf_udp_opt_ingress(struct rmnet_perf *perf, struct sk_buff *skb,
if (flush) {
rmnet_perf_opt_update_flow(flow_node, pkt_info);
- rmnet_perf_opt_flush_single_flow_node(perf, flow_node);
- rmnet_perf_core_flush_curr_pkt(perf, skb, pkt_info,
- pkt_info->header_len +
+ rmnet_perf_opt_flush_single_flow_node(flow_node);
+ rmnet_perf_core_flush_curr_pkt(pkt_info,
+ pkt_info->ip_len +
+ pkt_info->trans_len +
pkt_info->payload_len, false,
false);
update_udp_flush_stat(RMNET_PERF_UDP_OPT_FLAG_MISMATCH);
@@ -122,17 +125,15 @@ void rmnet_perf_udp_opt_ingress(struct rmnet_perf *perf, struct sk_buff *skb,
/* Go ahead and insert the packet now if we're not holding anything.
* We know at this point that it's a normal packet in the flow
*/
- if (!flow_node->num_pkts_held) {
- rmnet_perf_opt_insert_pkt_in_flow(skb, flow_node, pkt_info);
- return;
- }
+ if (!flow_node->num_pkts_held)
+ goto insert;
- rc = udp_pkt_can_be_merged(skb, flow_node, pkt_info);
- if (rc == RMNET_PERF_UDP_OPT_FLUSH_SOME) {
- rmnet_perf_opt_flush_single_flow_node(perf, flow_node);
- rmnet_perf_opt_insert_pkt_in_flow(skb, flow_node, pkt_info);
- } else if (rc == RMNET_PERF_UDP_OPT_MERGE_SUCCESS) {
+ rc = udp_pkt_can_be_merged(flow_node, pkt_info);
+ if (rc == RMNET_PERF_UDP_OPT_FLUSH_SOME)
+ rmnet_perf_opt_flush_single_flow_node(flow_node);
+ else if (rc == RMNET_PERF_UDP_OPT_MERGE_SUCCESS)
pkt_info->first_packet = false;
- rmnet_perf_opt_insert_pkt_in_flow(skb, flow_node, pkt_info);
- }
+
+insert:
+ rmnet_perf_opt_insert_pkt_in_flow(flow_node, pkt_info);
}