Received: by 2002:ab2:6309:0:b0:1fb:d597:ff75 with SMTP id s9csp963287lqt; Fri, 7 Jun 2024 04:18:13 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCVOp8y5K0S54VJzUrzGYQucGShNqak/lWjqts37c720JjeTU0zgdsxF7aue1CtHCYLZ4ojSxsvknYD87fQ0WXxp5S4WtuEy1ZLpVx32Zg== X-Google-Smtp-Source: AGHT+IHDU8ntirR+ywcIjxC4jcUxhhJS1ubguTw8C8mw3uOvBTrnNU4rUf9WUklzb/HR4SlAnmVJ X-Received: by 2002:a05:6808:f03:b0:3d2:ed:b76b with SMTP id 5614622812f47-3d210f1e06emr2472977b6e.42.1717759093327; Fri, 07 Jun 2024 04:18:13 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1717759093; cv=pass; d=google.com; s=arc-20160816; b=ncEPL6fNL1t5LqnSR0xnsZJj1H2k82wXoOlordsY232F4xCfktX6IgZn2s9gg7wUH2 jbSmbwGUuP/nJNg1WySSNTOELchboDabAq9nygTT3JoDsVawFyE5p0deHm+aY9kXRpB3 rkb1oYD44OoLAtZ7U/MGWx3FQQBUZiOv+H6szHDn4ztXX7XGFPSk8hOkSZ5mHTMySec9 5Ntv1zRy3WybBBcHa+X281xzW21fmDt4hx5hmCV+968+C+WLLm9vqvVzovEnZYS+J2sh JLhO6fQ47cAAnMh8rm+pcKvXzij5Z1PvpuaQREEVx+yryvYhW5vN4jMtv5V3U9mIS+6p jGZA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:message-id:date:subject:cc:to :from:dkim-signature; bh=RwY0JwFMiJzMlaWNetx19cuzpZpfePjhFAyTDmYWxao=; fh=nQ/KPsCqbNUdhJkl0x/KKtEEjqHb/7gzZa4K2cxnGzc=; b=ua7b442b4tBJbW0HcbZ9MD8m9ZlJmd5yTHj+52b0DVQDBHI/LuAm+apHreCw9mbN2q MFcHhGLIOESIcOZYc06b7E/NqwGpLntbCiPv6bYn1eKP2NfN/pIdKK0b8vl5WdoMvfvt fxeQ+EENRy6T6AGBMIgx+kcvrqgz/ZWjWrbMipM1ig8oPTqlWMt2YILusvM4DjuZldsB caxUSxXVJNMKcpmKjqcURM/aykUDwtL+EbQtw9sDhDlruKyLzFt9ZHkkoAb6+EMRug6n GMDgiS5Y+3K0VqZVkcc6w3sJBUxNaHH74Q6FutqbYmWoVdOZxwsN4aQTGkg++fPqJ2zB 36PQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@frida-re.20230601.gappssmtp.com header.s=20230601 header.b=tTcLtCpO; arc=pass (i=1 dkim=pass dkdomain=frida-re.20230601.gappssmtp.com); spf=pass (google.com: domain of linux-kernel+bounces-205549-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-205549-linux.lists.archive=gmail.com@vger.kernel.org" Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id 6a1803df08f44-6b0647c4a96si2681676d6.492.2024.06.07.04.18.13 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Jun 2024 04:18:13 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-205549-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@frida-re.20230601.gappssmtp.com header.s=20230601 header.b=tTcLtCpO; arc=pass (i=1 dkim=pass dkdomain=frida-re.20230601.gappssmtp.com); spf=pass (google.com: domain of linux-kernel+bounces-205549-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-205549-linux.lists.archive=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id EC7AE1C215C0 for ; Fri, 7 Jun 2024 07:42:06 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 3549F156C5E; Fri, 7 Jun 2024 07:41:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=frida-re.20230601.gappssmtp.com header.i=@frida-re.20230601.gappssmtp.com header.b="tTcLtCpO" Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A8868156978 for ; Fri, 7 Jun 2024 07:41:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.42 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717746116; cv=none; b=CTVaci7DDWvHGVA6ZkG6uZqaopWuSmzHWMfal8EMnr8uxCrOrE5s5/CsZDI7wsT3R3dueTitSK4+GGmPWm3ZDCcjy2cm4QyN4/3mPvwaFr/Eo3pYPvl4eBZtMh88Jd4BoWKTyRVpWaihIQS2/hItTGSGTUHQS3GcVYPSdd9A5Lk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717746116; c=relaxed/simple; bh=bxHk5juL2BwApQbEfrDkXVE6NAyGLzESh9yj98zWu7E=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version:Content-Type; b=sFpS4hiLg38ZCF4gVgnmBHP9/+so9aWA1D7n6hKT1UWRYX70M+p9ufWbCITgLmb2y7uI8E5aJzpTgYYhAKE4SbAv4i1LP2x1S+qoxplwIV6pKyTAGHEdI5yvcAfdFjL+5iPb/EikU6dHGHlnkBWNmMNJlOuavevbAI8HPEy/2UU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=frida.re; spf=none smtp.mailfrom=frida.re; dkim=pass (2048-bit key) header.d=frida-re.20230601.gappssmtp.com header.i=@frida-re.20230601.gappssmtp.com header.b=tTcLtCpO; arc=none smtp.client-ip=209.85.167.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=frida.re Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=frida.re Received: by mail-lf1-f42.google.com with SMTP id 2adb3069b0e04-52b9af7a01bso2328796e87.0 for ; Fri, 07 Jun 2024 00:41:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=frida-re.20230601.gappssmtp.com; s=20230601; t=1717746113; x=1718350913; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=RwY0JwFMiJzMlaWNetx19cuzpZpfePjhFAyTDmYWxao=; b=tTcLtCpOCN5aAvir0/Z9s6ZJ8XHhAN49QqJGJ/6NZKs3nQzuQYBw9zztWC/cmAY8sl g7x0sQr2kXS0mv0cLRbXrLT9Ibfh0SVTRhVsx4VT0IgFkB/D5BPD4C8/dIVQf6Onp7lh 2rNds3RQJqBbhW3x6Er8sMBzMzE+EayR36xEitYxasiTK6aYo2VdWvzwVd3QgYvCTN9n N4x96egRHe8Pg93rezLjhxZPVNJWnO77RXmAAxc+bH6rRnBQlgV7gKYlgNgAT8WgHIiN YV81fSjPuccSDWEfcZyB4ZoiN3RQ4ifS5pimmAupiZSzHv7CQqTvGzzfk+PhwykBp2VD bhSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717746113; x=1718350913; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=RwY0JwFMiJzMlaWNetx19cuzpZpfePjhFAyTDmYWxao=; b=WpA1UzpaTT5ZLSNLoYQa1VXC+Ta8bCXnBvHuvPiA+aVhWDRn3Iym2QFLGwRGw1N/Lt 6gAgsSOCou76vHSIgw7rdLGp22m+oj/go9iAeOwO4zy6NR1YgTHCi+mXDJzhsMUaFAJP vhUH4caz1x5wZd7N3LRD3U/ES2XYAJgD/JNCy9iarUsNNFdHl90ett16zZNKOhbcOjxb evsGiyHYRJI4QFRxegLpG7A56BLFMKGpoZ21BfU0nSDhJzmq81AobZ/RboUp8YZoEIbu tquTP3zZ4TXfMX+geJsCrxUmDym26tOiYQ1PKpmMhlD+9pJxG+9rE6vHpBe9JQ2qP1FN jpaw== X-Forwarded-Encrypted: i=1; AJvYcCWXfVDn8xw+9HNt/lzOejNmDr5W5Oqni7sqImzSX49iXzKpN7A4SQ0xWB5zrOukEPcT/o7POUVLZEpDlvA+cWCnWo7PIU7hnLfhaUn6 X-Gm-Message-State: AOJu0YyaxRNdNCWMxBeUDVrxZ8APBK962OUDr/fqoQklvug04IVKxr9p DCIzj9eFHHCD+zeTlQs4Jij8nxYcJkvRx6kN52Am0m3ojVu94nzy90OvMujKvGs= X-Received: by 2002:a05:6512:1cd:b0:52b:7c41:698 with SMTP id 2adb3069b0e04-52bb9f6ab36mr1174486e87.18.1717746112692; Fri, 07 Jun 2024 00:41:52 -0700 (PDT) Received: from localhost.localdomain ([109.247.171.206]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-52bb41e1d6esm438251e87.11.2024.06.07.00.41.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Jun 2024 00:41:52 -0700 (PDT) From: =?UTF-8?q?Ole=20Andr=C3=A9=20Vadla=20Ravn=C3=A5s?= To: linux-usb@vger.kernel.org Cc: oleavr@frida.re, =?UTF-8?q?Ha=CC=8Avard=20S=C3=B8rb=C3=B8?= , Oliver Neukum , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] CDC-NCM: add support for Apple's private interface Date: Fri, 7 Jun 2024 09:40:17 +0200 Message-ID: <20240607074117.31322-1-oleavr@frida.re> X-Mailer: git-send-email 2.45.2 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Available on iOS/iPadOS >= 17, where this new interface is used by developer tools using the new RemoteXPC protocol. This private interface lacks a status endpoint, presumably because there isn't a physical cable that can be unplugged, nor any speed changes to be notified about. Note that NCM interfaces are not exposed until a mode switch is requested, which macOS does automatically. The mode switch can be performed like this: uint8_t status; libusb_control_transfer(device_handle, LIBUSB_RECIPIENT_DEVICE | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN, 82, /* bRequest */ 0, /* wValue */ 3, /* wIndex */ &status, sizeof(status), 0); Newer versions of usbmuxd do this automatically. Co-developed-by: Håvard Sørbø Signed-off-by: Håvard Sørbø Signed-off-by: Ole André Vadla Ravnås --- drivers/net/usb/cdc_ncm.c | 47 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index bf76ecccc2e6..d5c47a2a62dc 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c @@ -933,7 +933,8 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_ cdc_ncm_find_endpoints(dev, ctx->data); cdc_ncm_find_endpoints(dev, ctx->control); - if (!dev->in || !dev->out || !dev->status) { + if (!dev->in || !dev->out || + (!dev->status && dev->driver_info->flags & FLAG_LINK_INTR)) { dev_dbg(&intf->dev, "failed to collect endpoints\n"); goto error2; } @@ -1925,6 +1926,34 @@ static const struct driver_info cdc_ncm_zlp_info = { .set_rx_mode = usbnet_cdc_update_filter, }; +/* Same as cdc_ncm_info, but with FLAG_SEND_ZLP */ +static const struct driver_info apple_tethering_interface_info = { + .description = "CDC NCM (Apple Tethering)", + .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET + | FLAG_LINK_INTR | FLAG_ETHER | FLAG_SEND_ZLP, + .bind = cdc_ncm_bind, + .unbind = cdc_ncm_unbind, + .manage_power = usbnet_manage_power, + .status = cdc_ncm_status, + .rx_fixup = cdc_ncm_rx_fixup, + .tx_fixup = cdc_ncm_tx_fixup, + .set_rx_mode = usbnet_cdc_update_filter, +}; + +/* Same as apple_tethering_interface_info, but without FLAG_LINK_INTR */ +static const struct driver_info apple_private_interface_info = { + .description = "CDC NCM (Apple Private)", + .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET + | FLAG_ETHER | FLAG_SEND_ZLP, + .bind = cdc_ncm_bind, + .unbind = cdc_ncm_unbind, + .manage_power = usbnet_manage_power, + .status = cdc_ncm_status, + .rx_fixup = cdc_ncm_rx_fixup, + .tx_fixup = cdc_ncm_tx_fixup, + .set_rx_mode = usbnet_cdc_update_filter, +}; + /* Same as cdc_ncm_info, but with FLAG_WWAN */ static const struct driver_info wwan_info = { .description = "Mobile Broadband Network Device", @@ -1954,6 +1983,22 @@ static const struct driver_info wwan_noarp_info = { }; static const struct usb_device_id cdc_devs[] = { + /* iPhone */ + { USB_DEVICE_INTERFACE_NUMBER(0x05ac, 0x12a8, 2), + .driver_info = (unsigned long)&apple_tethering_interface_info, + }, + { USB_DEVICE_INTERFACE_NUMBER(0x05ac, 0x12a8, 4), + .driver_info = (unsigned long)&apple_private_interface_info, + }, + + /* iPad */ + { USB_DEVICE_INTERFACE_NUMBER(0x05ac, 0x12ab, 2), + .driver_info = (unsigned long)&apple_tethering_interface_info, + }, + { USB_DEVICE_INTERFACE_NUMBER(0x05ac, 0x12ab, 4), + .driver_info = (unsigned long)&apple_private_interface_info, + }, + /* Ericsson MBM devices like F5521gw */ { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | USB_DEVICE_ID_MATCH_VENDOR, -- 2.45.2