diff options
author | Reinhard Speyerer <rspmn@arcor.de> | 2019-06-12 13:02:13 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-06-14 22:05:58 -0400 |
commit | 61356088ace1866a847a727d4d40da7bf00b67fc (patch) | |
tree | 3b16f1216729a5504256a546b521948c82c33d52 /drivers/net/usb | |
parent | 2a2af5e6e6f55e8ec381f710b8765ffe2838e313 (diff) |
qmi_wwan: add support for QMAP padding in the RX path
The QMAP code in the qmi_wwan driver is based on the CodeAurora GobiNet
driver which does not process QMAP padding in the RX path correctly.
Add support for QMAP padding to qmimux_rx_fixup() according to the
description of the rmnet driver.
Fixes: c6adf77953bc ("net: usb: qmi_wwan: add qmap mux protocol support")
Cc: Daniele Palmas <dnlplm@gmail.com>
Signed-off-by: Reinhard Speyerer <rspmn@arcor.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/usb')
-rw-r--r-- | drivers/net/usb/qmi_wwan.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index d9a6699abe59..fd3d078a1923 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c | |||
@@ -153,7 +153,7 @@ static bool qmimux_has_slaves(struct usbnet *dev) | |||
153 | 153 | ||
154 | static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | 154 | static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb) |
155 | { | 155 | { |
156 | unsigned int len, offset = 0; | 156 | unsigned int len, offset = 0, pad_len, pkt_len; |
157 | struct qmimux_hdr *hdr; | 157 | struct qmimux_hdr *hdr; |
158 | struct net_device *net; | 158 | struct net_device *net; |
159 | struct sk_buff *skbn; | 159 | struct sk_buff *skbn; |
@@ -171,10 +171,16 @@ static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | |||
171 | if (hdr->pad & 0x80) | 171 | if (hdr->pad & 0x80) |
172 | goto skip; | 172 | goto skip; |
173 | 173 | ||
174 | /* extract padding length and check for valid length info */ | ||
175 | pad_len = hdr->pad & 0x3f; | ||
176 | if (len == 0 || pad_len >= len) | ||
177 | goto skip; | ||
178 | pkt_len = len - pad_len; | ||
179 | |||
174 | net = qmimux_find_dev(dev, hdr->mux_id); | 180 | net = qmimux_find_dev(dev, hdr->mux_id); |
175 | if (!net) | 181 | if (!net) |
176 | goto skip; | 182 | goto skip; |
177 | skbn = netdev_alloc_skb(net, len); | 183 | skbn = netdev_alloc_skb(net, pkt_len); |
178 | if (!skbn) | 184 | if (!skbn) |
179 | return 0; | 185 | return 0; |
180 | skbn->dev = net; | 186 | skbn->dev = net; |
@@ -191,7 +197,7 @@ static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | |||
191 | goto skip; | 197 | goto skip; |
192 | } | 198 | } |
193 | 199 | ||
194 | skb_put_data(skbn, skb->data + offset + qmimux_hdr_sz, len); | 200 | skb_put_data(skbn, skb->data + offset + qmimux_hdr_sz, pkt_len); |
195 | if (netif_rx(skbn) != NET_RX_SUCCESS) | 201 | if (netif_rx(skbn) != NET_RX_SUCCESS) |
196 | return 0; | 202 | return 0; |
197 | 203 | ||