Support more devices in if_urndis

Georgios Toptsidis <[email protected]>
Newsgroups gmane.os.netbsd.devel.kernel
Message-ID <[email protected]>
Greetings.

I hope this is the correct mailing list.

I have a mobile phone that i use for internet using usb tethering.
When i connect it to NetBSD, ugen gets bind instead of urndis.

I read if_urndis.c and it has the following code

	if (id->bInterfaceClass == UICLASS_WIRELESS &&
	    id->bInterfaceSubClass == UISUBCLASS_RF &&
	    id->bInterfaceProtocol == UIPROTO_RNDIS)
		return UMATCH_IFACECLASS_IFACESUBCLASS_IFACEPROTO;
	
so it binds for wireless devices with rndis protocol and also has 
code for specific usb ids for devices that do not conform with this.

I ran lsusb on linux where my phone works and i get the following:

    Interface Association:
      bFunctionClass        239 Miscellaneous Device
      bFunctionSubClass       4 [unknown]
      bFunctionProtocol       1 
      iFunction               7 RNDIS
    Interface Descriptor:
      bInterfaceClass       239 Miscellaneous Device
      bInterfaceSubClass      4 [unknown]
      bInterfaceProtocol      1 
      iInterface              5 RNDIS Communications Control    

So lsusb does not know the specifics but i visited
https://www.usb.org/defined-class-codes and the class specifiers are
defined (I use usb tethering but i guess internally protocol 0x01
is defined ad RNDIS over Ethernet).

I modified the code as shown in the attached patch file to account
for this class and protocol. I do not have any other device to test
if my code messed up something but my phone now gets matched correctly
and works fine.

--- dmesg.before	2025-01-31 11:08:38.382020284 +0200
+++ dmesg.after	2025-01-31 11:08:37.074040964 +0200
@@ -168,8 +168,9 @@
 cd1 at atapibus1 drive 0: <QEMU DVD-ROM, QM00005, 2.5+> cdrom
removable
 cd1: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 5
(Ultra/100), NCQ (32 tags)
 cd1(ahcisata0:2:0): using PIO mode 4, DMA mode 2, Ultra-DMA mode 5
(Ultra/100) (using DMA), NCQ (31 tags)
-ugen0 at uhub3 port 2
-ugen0: motorola (0x22b8) moto g53 5G (0x2e24), rev 2.00/5.04, addr 3
+urndis0 at uhub3 port 2 configuration 1 interface 0
+urndis0: motorola (0x22b8) moto g53 5G (0x2e24), rev 2.00/5.04, addr 3
+urndis0: Ethernet address ea:1b:52:34:51:c3
 swwdog0: software watchdog initialized
 WARNING: 3 errors while detecting hardware; check system log.
 boot device: ld0

Thank you for your time.
urndis.diff (text/x-patch, 1.2 KB)
diff -ur /usr/src/sys/dev/usb.orig/if_urndis.c /usr/src/sys/dev/usb/if_urndis.c
--- /usr/src/sys/dev/usb.orig/if_urndis.c	2023-10-14 10:05:39.000000000 +0300
+++ /usr/src/sys/dev/usb/if_urndis.c	2025-01-31 11:03:33.631442159 +0200
@@ -884,6 +884,11 @@
 	    id->bInterfaceProtocol == UIPROTO_RNDIS)
 		return UMATCH_IFACECLASS_IFACESUBCLASS_IFACEPROTO;
 
+	if (id->bInterfaceClass == UICLASS_MISCDEV &&
+	    id->bInterfaceSubClass == UISUBCLASS_RNDIS &&
+	    id->bInterfaceProtocol == UIPROTO_RNDISOETH)
+		return UMATCH_IFACECLASS_IFACESUBCLASS_IFACEPROTO;
+
 	return usb_lookup(urndis_devs, uiaa->uiaa_vendor, uiaa->uiaa_product) != NULL ?
 	    UMATCH_VENDOR_PRODUCT : UMATCH_NONE;
 }
diff -ur /usr/src/sys/dev/usb.orig/usb.h /usr/src/sys/dev/usb/usb.h
--- /usr/src/sys/dev/usb.orig/usb.h	2024-02-03 13:47:07.000000000 +0200
+++ /usr/src/sys/dev/usb/usb.h	2025-01-31 10:35:38.490663556 +0200
@@ -746,6 +746,10 @@
 #define   UIPROTO_BLUETOOTH		0x01
 #define   UIPROTO_RNDIS			0x03
 
+#define UICLASS_MISCDEV		0xef
+#define  UISUBCLASS_RNDIS	0x04
+#define   UIPROTO_RNDISOETH	0x01
+
 #define UICLASS_APPL_SPEC	0xfe
 #define  UISUBCLASS_FIRMWARE_DOWNLOAD	1
 #define  UISUBCLASS_IRDA		2
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.