From 31bf9bae378fe6fc37e03f00805eea9300376006 Mon Sep 17 00:00:00 2001 From: Divya Sharma Date: Tue, 6 Oct 2020 08:15:33 -0700 Subject: [PATCH] Revert "rmnet_core: Check for contiguous QMAP headers during deaggregation" This reverts commit df2d62bed079908c127051de3385f3560c5f8c90. Change-Id: Icc987d5f1ba74199f420e2ee65902d8e60e4fda9 --- core/rmnet_descriptor.c | 40 +++++++--------------------------------- 1 file changed, 7 insertions(+), 33 deletions(-) diff --git a/core/rmnet_descriptor.c b/core/rmnet_descriptor.c index 79612ec49cd3..c0b95f330c4c 100644 --- a/core/rmnet_descriptor.c +++ b/core/rmnet_descriptor.c @@ -558,36 +558,20 @@ int rmnet_frag_flow_command(struct rmnet_frag_descriptor *frag_desc, } EXPORT_SYMBOL(rmnet_frag_flow_command); -static int rmnet_frag_deaggregate_one(struct sk_buff *skb, +static int rmnet_frag_deaggregate_one(struct skb_shared_info *shinfo, struct rmnet_port *port, struct list_head *list, u32 start_frag) { - struct skb_shared_info *shinfo = skb_shinfo(skb); struct rmnet_frag_descriptor *frag_desc; - struct rmnet_map_header *maph, __maph; + struct rmnet_map_header *maph; skb_frag_t *frag; u32 i; u32 pkt_len; int rc; frag = &shinfo->frags[start_frag]; - /* Grab the QMAP header. Careful, as there's no guarantee that it's - * continugous! - */ - if (likely(skb_frag_size(frag) >= sizeof(*maph))) { - maph = skb_frag_address(frag); - } else { - /* The header's split across pages. We can rebuild it. - * Probably not faster or stronger than before. But certainly - * more linear. - */ - if (skb_copy_bits(skb, 0, &__maph, sizeof(&__maph)) < 0) - return -1; - - maph = &__maph; - } - + maph = skb_frag_address(frag); pkt_len = ntohs(maph->pkt_len); /* Catch empty frames */ if (!pkt_len) @@ -606,19 +590,9 @@ static int rmnet_frag_deaggregate_one(struct sk_buff *skb, u32 hsize = 0; u8 type; - /* Check the type. This seems like should be overkill for less - * than a single byte, doesn't it? - */ - if (likely(skb_frag_size(frag) >= sizeof(*maph) + 1)) { - type = *((u8 *)maph + sizeof(*maph)); - } else { - if (skb_copy_bits(skb, sizeof(*maph), &type, - sizeof(type)) < 0) - return -1; - } - - /* Type only uses the first 7 bits */ - switch ((type & 0xFE) >> 1) { + type = ((struct rmnet_map_v5_coal_header *) + (maph + 1))->header_type; + switch (type) { case RMNET_MAP_HEADER_TYPE_COALESCING: hsize = sizeof(struct rmnet_map_v5_coal_header); break; @@ -673,7 +647,7 @@ void rmnet_frag_deaggregate(struct sk_buff *skb, struct rmnet_port *port, int rc; while (i < shinfo->nr_frags) { - rc = rmnet_frag_deaggregate_one(skb, port, list, i); + rc = rmnet_frag_deaggregate_one(shinfo, port, list, i); if (rc < 0) return;