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

Commit 85c8a9d0 authored by Pavankumar Kondeti's avatar Pavankumar Kondeti
Browse files

net: rmnet_usb: Duplicate skb when there is no tailroom



If the skb to be transmitted has no trailroom for mux padding,
then copy the skb into a new expanded skb with tailroom.

CRs-Fixed: 545483
Change-Id: I6d41c7b80246aac928e8466091cc3e925ecf550c
Signed-off-by: default avatarPavankumar Kondeti <pkondeti@codeaurora.org>
parent e6edf782
Loading
Loading
Loading
Loading
+20 −4
Original line number Diff line number Diff line
@@ -324,10 +324,22 @@ static int rmnet_usb_data_dmux(struct sk_buff *skb, struct urb *rx_urb)
	return mux_id - 1;
}

static void rmnet_usb_data_mux(struct sk_buff *skb, unsigned int id)
static struct sk_buff *rmnet_usb_data_mux(struct sk_buff *skb, unsigned int id)
{
	struct	mux_hdr *hdr;
	size_t	len;
	struct sk_buff *new_skb;

	if ((skb->len & 0x3) && (skb_tailroom(skb) < (4 - (skb->len & 0x3)))) {
		new_skb = skb_copy_expand(skb, skb_headroom(skb),
					  4 - (skb->len & 0x3), GFP_ATOMIC);
		dev_kfree_skb_any(skb);
		if (new_skb == NULL) {
			pr_err("%s: cannot allocate skb\n", __func__);
			return NULL;
		}
		skb = new_skb;
	}

	hdr = (struct mux_hdr *)skb_push(skb, sizeof(struct mux_hdr));
	hdr->mux_id = id + 1;
@@ -338,6 +350,8 @@ static void rmnet_usb_data_mux(struct sk_buff *skb, unsigned int id)

	hdr->pkt_len_w_padding = cpu_to_le16(skb->len - sizeof(struct mux_hdr));
	hdr->padding_info = (ALIGN(len, 4) - len) << MUX_PAD_SHIFT;

	return skb;
}

static struct sk_buff *rmnet_usb_tx_fixup(struct usbnet *dev,
@@ -354,10 +368,12 @@ static struct sk_buff *rmnet_usb_tx_fixup(struct usbnet *dev,
	 }

	if (dev->data[4])
		rmnet_usb_data_mux(skb, dev->data[3]);
		skb = rmnet_usb_data_mux(skb, dev->data[3]);

	if (skb)
		DBG1("[%s] Tx packet #%lu len=%d mark=0x%x\n",
	    dev->net->name, dev->net->stats.tx_packets, skb->len, skb->mark);
			dev->net->name, dev->net->stats.tx_packets,
			skb->len, skb->mark);

	return skb;
}