From patchwork Fri Dec 21 12:07:23 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Daniele Palmas X-Patchwork-Id: 1017487 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="VKszHJhH"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43LnSS08sJz9sCQ for ; Fri, 21 Dec 2018 23:07:35 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387623AbeLUMHd (ORCPT ); Fri, 21 Dec 2018 07:07:33 -0500 Received: from mail-wm1-f67.google.com ([209.85.128.67]:40281 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729043AbeLUMHd (ORCPT ); Fri, 21 Dec 2018 07:07:33 -0500 Received: by mail-wm1-f67.google.com with SMTP id f188so5463619wmf.5 for ; Fri, 21 Dec 2018 04:07:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=UTNwKwQpaR9g2eCIf8aMmuIKw5GkzfLiMtrejPunRvY=; b=VKszHJhHzC7uuJPJVuPy8cfD3JgYMYi6KKzqJgU7e0ALp4SIw70AY3eK0NSKpJvfVY TTHmHKmCXlBBpmFjpoxJemXc9q3jK8mlFc7s0jLUUcQK4g8ySp/SPSyfeWZqrQX66zsn dX5HqzeixQGlHDfZI6SMUuPD5ekTXbnrbW3U8mTxW18iRPV5XOMuLTf/mimIEsADJoN2 cFJqq9+yreTKGnKPlVEW2aCif89Tfj0T82ts+z5JclZCxBM1FhwV/o+Y/g1TLTUV7ky0 bWYPPqxFhz6hGrg8EdVGZZ59D4Tzlfr8hlVGpM/6ZJCBe3FZXMYAzvyGOe05UU1Y5E7q xD1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=UTNwKwQpaR9g2eCIf8aMmuIKw5GkzfLiMtrejPunRvY=; b=s68aFraEnG+zyoXz7jGVD7pAB6MdX+KTh5hdCjcgVeHZ69dXR4UxLqijd41trjuh/q yUuVWT0us4gRTB14i9OyLi2c0G9BsYmdlDk7kerVow43WzH6yaYGcLZeEN8ZgB+VcVXG D4L8Dh12wktBubiyWSf2ISw3MAUQ4e+EIexra/hyfk03OrbLQhenPfhg/zMCJc57cIfg Y4haCsB0T1rTrB6vs5B/g8YoG9UXrdrnHDAJT4uW4AtIzbhEg+AvTQ8usE5X67pl8M9U utmaLPeV/AyF5Ta7vdCcOZZokIrhRe94TKAIZa7AG9uz4motZMaKeKLI8t7PpWpOc5TS YtQg== X-Gm-Message-State: AA+aEWZK04D0sO+2vn9ugDALYzspTmJCnT9GDBMUjreimbtU1dF0umwZ rXFQNp0oQs3dfxYOIGda4pk= X-Google-Smtp-Source: AFSGD/URMKipg7oj7CHY2ILLfHyw4f1d56EMM05J/c+XNrqaIKHW796k7qbUt1hVxL82xHRTFXmdDA== X-Received: by 2002:a1c:1801:: with SMTP id 1mr2774536wmy.153.1545394051302; Fri, 21 Dec 2018 04:07:31 -0800 (PST) Received: from L2122.tmt.telital.com (static-82-85-31-68.clienti.tiscali.it. [82.85.31.68]) by smtp.gmail.com with ESMTPSA id 14sm17913196wmv.36.2018.12.21.04.07.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 21 Dec 2018 04:07:30 -0800 (PST) From: Daniele Palmas To: =?utf-8?q?Bj=C3=B8rn_Mork?= Cc: netdev@vger.kernel.org, Daniele Palmas Subject: [PATCH 1/1] Fix qmap header retrieval in qmimux_rx_fixup Date: Fri, 21 Dec 2018 13:07:23 +0100 Message-Id: <1545394043-22756-1-git-send-email-dnlplm@gmail.com> X-Mailer: git-send-email 2.7.4 MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch fixes qmap header retrieval when modem is configured for dl data aggregation. Signed-off-by: Daniele Palmas --- Hi Bjørn and all, I'm facing an issue when using qmi_wwan with modem configured with dl data aggregation and qmap multiplexing, e.g. something like root@L2122:~# qmicli -d /dev/cdc-wdm0 --wda-set-data-format=link-layer-protocol=raw-ip,ul-protocol=qmap,dl-protocol=qmap,dl-max-datagrams=20 [/dev/cdc-wdm0] Successfully set data format QoS flow header: no Link layer protocol: 'raw-ip' Uplink data aggregation protocol: 'qmap' Downlink data aggregation protocol: 'qmap' NDP signature: '0' Downlink data aggregation max datagrams: '20' Downlink data aggregation max size: '16384' The issue is related to qmap header retrieval in qmimux_rx_fixup: basically it seems to me that it is always taken the first qmap header. Maybe the patch below should fix this issue. Note also that, by default, this won't be enough, since also rx_urb_size should be changed to the downlink data aggregation max size value: currently I'm just modifying the network interface MTU that changes also the rx_urb_size. Not sure if this makes sense, so I thought to share anyway this with you for confirmation. Thanks, Daniele --- drivers/net/usb/qmi_wwan.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index c8872dd..85cb4df 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c @@ -151,17 +151,18 @@ static bool qmimux_has_slaves(struct usbnet *dev) static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb) { - unsigned int len, offset = sizeof(struct qmimux_hdr); + unsigned int len, offset = 0; struct qmimux_hdr *hdr; struct net_device *net; struct sk_buff *skbn; + u8 qmimux_hdr_sz = sizeof(*hdr); - while (offset < skb->len) { - hdr = (struct qmimux_hdr *)skb->data; + while (offset + qmimux_hdr_sz < skb->len) { + hdr = (struct qmimux_hdr *)(skb->data + offset); len = be16_to_cpu(hdr->pkt_len); /* drop the packet, bogus length */ - if (offset + len > skb->len) + if (offset + len + qmimux_hdr_sz > skb->len) return 0; /* control packet, we do not know what to do */ @@ -176,7 +177,7 @@ static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb) return 0; skbn->dev = net; - switch (skb->data[offset] & 0xf0) { + switch (skb->data[offset + qmimux_hdr_sz] & 0xf0) { case 0x40: skbn->protocol = htons(ETH_P_IP); break; @@ -188,12 +189,12 @@ static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb) goto skip; } - skb_put_data(skbn, skb->data + offset, len); + skb_put_data(skbn, skb->data + offset + qmimux_hdr_sz, len); if (netif_rx(skbn) != NET_RX_SUCCESS) return 0; skip: - offset += len + sizeof(struct qmimux_hdr); + offset += len + qmimux_hdr_sz; } return 1; }