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

Commit a4abd7a8 authored by Bjørn Mork's avatar Bjørn Mork Committed by David S. Miller
Browse files

usbnet: fix alignment for frames with no ethernet header



The qmi_wwan minidriver support a 'raw-ip' mode where frames are
received without any ethernet header. This causes alignment issues
because the skbs allocated by usbnet are "IP aligned".

Fix by allowing minidrivers to disable the additional alignment
offset. This is implemented using a per-device flag, since the same
minidriver also supports 'ethernet' mode.

Fixes: 32f7adf6 ("net: qmi_wwan: support "raw IP" mode")
Reported-and-tested-by: default avatarJay Foster <jay@systech.com>
Signed-off-by: default avatarBjørn Mork <bjorn@mork.no>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 86323850
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -261,9 +261,11 @@ static void qmi_wwan_netdev_setup(struct net_device *net)
		net->hard_header_len = 0;
		net->addr_len        = 0;
		net->flags           = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
		set_bit(EVENT_NO_IP_ALIGN, &dev->flags);
		netdev_dbg(net, "mode: raw IP\n");
	} else if (!net->header_ops) { /* don't bother if already set */
		ether_setup(net);
		clear_bit(EVENT_NO_IP_ALIGN, &dev->flags);
		netdev_dbg(net, "mode: Ethernet\n");
	}

+4 −1
Original line number Diff line number Diff line
@@ -484,6 +484,9 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags)
		return -ENOLINK;
	}

	if (test_bit(EVENT_NO_IP_ALIGN, &dev->flags))
		skb = __netdev_alloc_skb(dev->net, size, flags);
	else
		skb = __netdev_alloc_skb_ip_align(dev->net, size, flags);
	if (!skb) {
		netif_dbg(dev, rx_err, dev->net, "no rx skb\n");
+1 −0
Original line number Diff line number Diff line
@@ -82,6 +82,7 @@ struct usbnet {
#		define EVENT_RX_KILL	10
#		define EVENT_LINK_CHANGE	11
#		define EVENT_SET_RX_MODE	12
#		define EVENT_NO_IP_ALIGN	13
};

static inline struct usb_driver *driver_of(struct usb_interface *intf)