Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e709851a authored by Subash Abhinov Kasiviswanathan's avatar Subash Abhinov Kasiviswanathan Committed by Gerrit - the friendly Code Review server
Browse files

net: qualcomm: rmnet: Change the de-aggregation logic for coalescing



Rmnet can directly pass on the skb from the physical driver in case a
coalescing frame is received in MAPv5 format.

CRs-Fixed: 2347014
Change-Id: Ia500443e1b483d76d55c7e6ed0f9965d04e2be72
Signed-off-by: default avatarSubash Abhinov Kasiviswanathan <subashab@codeaurora.org>
parent 020c3455
Loading
Loading
Loading
Loading
+6 −1
Original line number Original line Diff line number Diff line
@@ -316,10 +316,15 @@ rmnet_map_ingress_handler(struct sk_buff *skb,
		struct sk_buff *skb_frag = skb_shinfo(skb)->frag_list;
		struct sk_buff *skb_frag = skb_shinfo(skb)->frag_list;


		skb_shinfo(skb)->frag_list = NULL;
		skb_shinfo(skb)->frag_list = NULL;
		while ((skbn = rmnet_map_deaggregate(skb, port)) != NULL)
		while ((skbn = rmnet_map_deaggregate(skb, port)) != NULL) {
			__rmnet_map_ingress_handler(skbn, port);
			__rmnet_map_ingress_handler(skbn, port);


			if (skbn == skb)
				goto next_skb;
		}

		consume_skb(skb);
		consume_skb(skb);
next_skb:
		skb = skb_frag;
		skb = skb_frag;
	}
	}
}
}
+11 −2
Original line number Original line Diff line number Diff line
@@ -324,7 +324,7 @@ struct sk_buff *rmnet_map_deaggregate(struct sk_buff *skb,
{
{
	struct rmnet_map_header *maph;
	struct rmnet_map_header *maph;
	struct sk_buff *skbn;
	struct sk_buff *skbn;
	unsigned char *data = rmnet_map_data_ptr(skb);
	unsigned char *data = rmnet_map_data_ptr(skb), *next_hdr = NULL;
	u32 packet_len;
	u32 packet_len;


	if (skb->len == 0)
	if (skb->len == 0)
@@ -336,8 +336,12 @@ struct sk_buff *rmnet_map_deaggregate(struct sk_buff *skb,
	if (port->data_format & RMNET_FLAGS_INGRESS_MAP_CKSUMV4)
	if (port->data_format & RMNET_FLAGS_INGRESS_MAP_CKSUMV4)
		packet_len += sizeof(struct rmnet_map_dl_csum_trailer);
		packet_len += sizeof(struct rmnet_map_dl_csum_trailer);
	else if (port->data_format & RMNET_FLAGS_INGRESS_MAP_CKSUMV5) {
	else if (port->data_format & RMNET_FLAGS_INGRESS_MAP_CKSUMV5) {
		if (!maph->cd_bit)
		if (!maph->cd_bit) {
			packet_len += sizeof(struct rmnet_map_v5_csum_header);
			packet_len += sizeof(struct rmnet_map_v5_csum_header);

			/* Coalescing headers require MAPv5 */
			next_hdr = data + sizeof(*maph);
		}
	}
	}


	if (((int)skb->len - (int)packet_len) < 0)
	if (((int)skb->len - (int)packet_len) < 0)
@@ -347,6 +351,11 @@ struct sk_buff *rmnet_map_deaggregate(struct sk_buff *skb,
	if (ntohs(maph->pkt_len) == 0)
	if (ntohs(maph->pkt_len) == 0)
		return NULL;
		return NULL;


	if (next_hdr &&
	    ((struct rmnet_map_v5_coal_header *)next_hdr)->header_type ==
	     RMNET_MAP_HEADER_TYPE_COALESCING)
		return skb;

	if (skb_is_nonlinear(skb)) {
	if (skb_is_nonlinear(skb)) {
		skb_frag_t *frag0 = skb_shinfo(skb)->frags;
		skb_frag_t *frag0 = skb_shinfo(skb)->frags;
		struct page *page = skb_frag_page(frag0);
		struct page *page = skb_frag_page(frag0);