Post

Replies

Boosts

Views

Activity

DriverKit VLAN offload: IOUserNetworkPacket::getVlanTag() always returns false, kFeatureHardwareVlan undocumented
I've built an open-source DriverKit + NetworkingDriverKit (IOUserNetworkEthernet/Skywalk) driver for a USB 5GbE adapter (AQTION AQC111U chipset). As far as I can tell this is the first public one for real third-party hardware: github.com/jquirke/AQC111Driver It's a fully functional driver at this point: RX/TX hardware checksum offload, jumbo frame/MTU control up to 16KB, runtime-controllable diagnostics via a custom IOUserClient, and most recently working 802.1Q VLAN support via macOS's vlan(4) software path. While attempting to implement hardware offload VLAN support, I ran into what looks like a gap between documentation and the public SDK, and I'd appreciate expert opinion either way before filing Feedback. The issue: IOUserNetworkPacket::getVlanTag()/setVlanTag() (DriverKit 24.0+) have a doc comment stating: "Get the Vlan Tag from the packet, where the driver has enabled the kFeatureHardwareVlan capability; for the case that feature is not enabled, this method will return false." kFeatureHardwareVlan does not appear anywhere in the public NetworkingDriverKit.framework/Headers/ tree confirmed via exhaustive grep, including the full hwAssist/feature-flag enum in IOUserNetworkTypes.h. I tested every plausible related mechanism exhaustively, with a real device reattach for each combination, to rule out attach-time-only behaviour: +------------------------+--------------------------+--------------+-----------+ | HWAssist bit declared? | SetSoftwareVlanSupport()| getVlanTag() | vlan0 MTU | +------------------------+--------------------------+--------------+-----------+ | Yes | true | always false | 1500 | | Yes | false | always false | 1500 | | No | not called | always false | 1496 | | No | false | always false | 1496 | +------------------------+--------------------------+--------------+-----------+ none of these combinations gates real 802.1q tag-delivery/demux behavior at all; it seems Vlan support is completely implemented in software on the MacOS side and I have to explicitly program my hardware registers to disable VLAN tagging. Question: is hardware VLAN tag insert/strip (via getVlanTag()/setVlanTag()) currently reachable from a third-party DriverKit USB Ethernet driver at all? If kFeatureHardwareVlan is real but intentionally withheld from public headers, is there a documented path (entitlement, different NDK version, etc.) to enable it or is this confirmed unreachable without Apple's direct involvement (Feedback/DTS)? Can share full test logs/methodology if useful.
2
2
758
4w
DriverKit entitlement policy clarification for development purposes
I am seeking clarification on whether the various driverkit entitlement families (com.apple.developer.driverkit.family.*) are available for development on my local Mac without requesting entitlements from Apple. My experience is inconsistent with public statements made by Apple, and I am wondering if there have been changes to development entitlements as of 2026. I am hoping there is something obvious that I have missed. At WWDC2022 Apple stated that "In MacOS... In fact, all DriverKit family entitlements are now available to use for development." On these very forums, Eskimo himself also suggested this was the case in 2024. However, my own experience has been that in my provisioning profile on my paid developer account, I am not able to obtain com.apple.developer.driverkit.family.networking for the purpose of developing a driver for unsupported hardware. As you can see, I do not have the networking entitlement: { .. "Entitlements" => { ... "com.apple.developer.driverkit" => true "com.apple.developer.driverkit.transport.usb" => [ 0 => { "idVendor" => "*" } ] And there appears to be no mechanism to add these entitlement:
2
0
738
Mar ’26
12.x: USB matching a device with 2 configurations, one matched by built-in dext
I am writing a DEXT to support a USB to 5Gigabit Ethernet adapter. Interestingly, this adapter is "supported" because it presents 2 configurations: (1) the "native" fast vendor interface (2) a slower ECM profile that is matched by AppleUserECM.dext Unfortunately the vendor's high performance driver was written as an IOKit kext for x86 pre Big Sur, which is of no use at all for an M1. However, its performance on x86 MAC is vastly superior to the generic Apple ECM DEXT However, no matter how I configure my DEXT which matches bConfiguration=1, the Apple DEXT which matches bConfiguration=2 always takes precedence. Configuration Descriptors of actual hardware >>> dev = usb.core.find() >>> print(dev) DEVICE ID 20f4:e05a on Bus 001 Address 001 =================  bLength        : 0x12 (18 bytes)  bDescriptorType    :  0x1 Device  bcdUSB        : 0x320 USB 3.2  bDeviceClass     :  0x0 Specified at interface  bDeviceSubClass    :  0x0  bDeviceProtocol    :  0x0  bMaxPacketSize0    :  0x9 (9 bytes)  idVendor       : 0x20f4  idProduct       : 0xe05a  bcdDevice       : 0x101 Device 1.01  iManufacturer     :  0x1 TRENDnet  iProduct       :  0x2 TRENDnet USB 5G Adapter  iSerialNumber     :  0x3 000000DB  bNumConfigurations  :  0x2  CONFIGURATION 1: 224 mA ==================================   bLength       :  0x9 (9 bytes)   bDescriptorType   :  0x2 Configuration   wTotalLength    : 0x39 (57 bytes)   bNumInterfaces   :  0x1   bConfigurationValue :  0x1   iConfiguration   :  0x4 LAN   bmAttributes    : 0xa0 Bus Powered, Remote Wakeup   bMaxPower      : 0x70 (224 mA) ....  CONFIGURATION 2: 224 mA ==================================   bLength       :  0x9 (9 bytes)   bDescriptorType   :  0x2 Configuration   wTotalLength    : 0x62 (98 bytes)   bNumInterfaces   :  0x2   bConfigurationValue :  0x2   iConfiguration   :  0x8 CDC LAN   bmAttributes    : 0x80 Bus Powered   bMaxPower      : 0x70 (224 mA) Kernel logs with real hardware plugged in and my DEXT installed still matching Apple DEXT 2022-11-11 18:51:39.854308-0800 0x3aa6  Default  0x0         0   0  kernel: (IOUSBHostFamily) 000980.145603 usb-drd1-port-ss@01200000: AppleUSBHostPort::enumerateDeviceComplete_block_invoke: enumerated 0x20f4/e05a/0101 (TRENDnet USB 5G Adapter) at 5 Gbps ..... 2022-11-11 18:51:39.898925-0800 0x47bd  Default  0x0         0   0  kernel: Found class: IOUSBHostInterface 2022-11-11 18:51:39.899998-0800 0x47bd  Default  0x0         0   0  kernel: (com.apple.DriverKit.AppleUserECM.dext) OnQueue SDK version 0x150600 2022-11-11 18:51:39.902587-0800 0x47c0  Default  0x0         0   0  kernel: (com.apple.DriverKit.AppleUserECM.dext) AppleUserECMData interface 1 belongs to ECM, matched with UNF (0) 2022-11-11 18:51:39.902612-0800 0x47b3  Default  0x0         0   0  kernel: DK: AppleUserECMData-0x1000010bf::start(CDC Data 0-0x1000010bc) ok 2022-11-11 18:51:39.926256-0800 0x47b2  Default  0x0         0   0  kernel: DK: AppleUserECM-0x1000010bd::start(CDC Ctrl-0x1000010bb) ok Configuration Descriptors of spoofed hardware with 2nd config descriptor removed >>> dev = usb.core.find() >>> print(dev) DEVICE ID 20f4:e05a on Bus 001 Address 001 =================  bLength        : 0x12 (18 bytes)  bDescriptorType    :  0x1 Device  bcdUSB        : 0x200 USB 2.0  bDeviceClass     :  0x0 Specified at interface  bDeviceSubClass    :  0x0  bDeviceProtocol    :  0x0  bMaxPacketSize0    :  0x9 (9 bytes)  idVendor       : 0x20f4  idProduct       : 0xe05a  bcdDevice       : 0x101 Device 1.01  iManufacturer     :  0x1 TrendWhatever  iProduct       :  0x2 AQC!111  iSerialNumber     :  0x3 123456789012  bNumConfigurations  :  0x1  CONFIGURATION 1: 224 mA ==================================   bLength       :  0x9 (9 bytes)   bDescriptorType   :  0x2 Configuration   wTotalLength    : 0x39 (57 bytes)   bNumInterfaces   :  0x1   bConfigurationValue :  0x1   iConfiguration   :  0x4 LAN   bmAttributes    : 0xa0 Bus Powered, Remote Wakeup   bMaxPower      : 0x70 (224 mA) and proof, it matches with my driver (but obviously fails to work, since the driver isn't finished and the hardware is a mock) 2022-11-11 19:11:47.693212-0800 0x9a91  Default  0x0         0   0  kernel: DK: AQC111DrvExt-0x1000012b7 waiting for server au.com.jquirke.AQC111DrvExt-1000012b7 .... (Sandbox) /Library/SystemExtensions/BD547468-F734-47F9-80B7-D2FBC5A2297C/au.com.jquirke.AQC111DrvExt.dext/au.com.jquirke.AQC111DrvExt[2904] ==> com.apple.dext ... 2022-11-11 19:11:47.723612-0800 0x9a98  Default  0x0         0   0  kernel: Found class: IOUserNetworkRxCompletionQueue 2022-11-11 19:11:47.724041-0800 0x9a98  Default  0x0         0   0  kernel: (au.com.jquirke.AQC111DrvExt.dext) OnQueue SDK version 0x150400 2022-11-11 19:11:47.725374-0800 0x9a9b  Default  0x0         0   0  kernel: (au.com.jquirke.AQC111DrvExt.dext) foobaz init 2022-11-11 19:11:47.725472-0800 0x9a9b  Default  0x0         0   0  kernel: (au.com.jquirke.AQC111DrvExt.dext) foobaz Start_Impl 2022-11-11 19:11:47.725485-0800 0x9a9b  Default  0x0         0   0  kernel: (au.com.jquirke.AQC111DrvExt.dext) foobaz super::start 0 2022-11-11 19:11:47.725488-0800 0x9a9b  Default  0x0         0   0  kernel: (au.com.jquirke.AQC111DrvExt.dext) foobaz odynamiccast 0 2022-11-11 19:11:47.725555-0800 0x9a9b  Default  0x0         0   0  kernel: (au.com.jquirke.AQC111DrvExt.dext) foobaz interfaceopen 0 2022-11-11 19:11:47.725563-0800 0x9a9b  Default  0x0         0   0  kernel: (au.com.jquirke.AQC111DrvExt.dext) foobaz selectalternate e00002f0 2022-11-11 19:11:47.725595-0800 0x9a91  Default  0x0         0   0  kernel: DK: AQC111DrvExt-0x1000012b7::start(IOUSBHostInterface-0x1000012b5) fail
2
1
1.5k
Nov ’22
DriverKit VLAN offload: IOUserNetworkPacket::getVlanTag() always returns false, kFeatureHardwareVlan undocumented
I've built an open-source DriverKit + NetworkingDriverKit (IOUserNetworkEthernet/Skywalk) driver for a USB 5GbE adapter (AQTION AQC111U chipset). As far as I can tell this is the first public one for real third-party hardware: github.com/jquirke/AQC111Driver It's a fully functional driver at this point: RX/TX hardware checksum offload, jumbo frame/MTU control up to 16KB, runtime-controllable diagnostics via a custom IOUserClient, and most recently working 802.1Q VLAN support via macOS's vlan(4) software path. While attempting to implement hardware offload VLAN support, I ran into what looks like a gap between documentation and the public SDK, and I'd appreciate expert opinion either way before filing Feedback. The issue: IOUserNetworkPacket::getVlanTag()/setVlanTag() (DriverKit 24.0+) have a doc comment stating: "Get the Vlan Tag from the packet, where the driver has enabled the kFeatureHardwareVlan capability; for the case that feature is not enabled, this method will return false." kFeatureHardwareVlan does not appear anywhere in the public NetworkingDriverKit.framework/Headers/ tree confirmed via exhaustive grep, including the full hwAssist/feature-flag enum in IOUserNetworkTypes.h. I tested every plausible related mechanism exhaustively, with a real device reattach for each combination, to rule out attach-time-only behaviour: +------------------------+--------------------------+--------------+-----------+ | HWAssist bit declared? | SetSoftwareVlanSupport()| getVlanTag() | vlan0 MTU | +------------------------+--------------------------+--------------+-----------+ | Yes | true | always false | 1500 | | Yes | false | always false | 1500 | | No | not called | always false | 1496 | | No | false | always false | 1496 | +------------------------+--------------------------+--------------+-----------+ none of these combinations gates real 802.1q tag-delivery/demux behavior at all; it seems Vlan support is completely implemented in software on the MacOS side and I have to explicitly program my hardware registers to disable VLAN tagging. Question: is hardware VLAN tag insert/strip (via getVlanTag()/setVlanTag()) currently reachable from a third-party DriverKit USB Ethernet driver at all? If kFeatureHardwareVlan is real but intentionally withheld from public headers, is there a documented path (entitlement, different NDK version, etc.) to enable it or is this confirmed unreachable without Apple's direct involvement (Feedback/DTS)? Can share full test logs/methodology if useful.
Replies
2
Boosts
2
Views
758
Activity
4w
DriverKit entitlement policy clarification for development purposes
I am seeking clarification on whether the various driverkit entitlement families (com.apple.developer.driverkit.family.*) are available for development on my local Mac without requesting entitlements from Apple. My experience is inconsistent with public statements made by Apple, and I am wondering if there have been changes to development entitlements as of 2026. I am hoping there is something obvious that I have missed. At WWDC2022 Apple stated that "In MacOS... In fact, all DriverKit family entitlements are now available to use for development." On these very forums, Eskimo himself also suggested this was the case in 2024. However, my own experience has been that in my provisioning profile on my paid developer account, I am not able to obtain com.apple.developer.driverkit.family.networking for the purpose of developing a driver for unsupported hardware. As you can see, I do not have the networking entitlement: { .. "Entitlements" => { ... "com.apple.developer.driverkit" => true "com.apple.developer.driverkit.transport.usb" => [ 0 => { "idVendor" => "*" } ] And there appears to be no mechanism to add these entitlement:
Replies
2
Boosts
0
Views
738
Activity
Mar ’26
12.x: USB matching a device with 2 configurations, one matched by built-in dext
I am writing a DEXT to support a USB to 5Gigabit Ethernet adapter. Interestingly, this adapter is "supported" because it presents 2 configurations: (1) the "native" fast vendor interface (2) a slower ECM profile that is matched by AppleUserECM.dext Unfortunately the vendor's high performance driver was written as an IOKit kext for x86 pre Big Sur, which is of no use at all for an M1. However, its performance on x86 MAC is vastly superior to the generic Apple ECM DEXT However, no matter how I configure my DEXT which matches bConfiguration=1, the Apple DEXT which matches bConfiguration=2 always takes precedence. Configuration Descriptors of actual hardware >>> dev = usb.core.find() >>> print(dev) DEVICE ID 20f4:e05a on Bus 001 Address 001 =================  bLength        : 0x12 (18 bytes)  bDescriptorType    :  0x1 Device  bcdUSB        : 0x320 USB 3.2  bDeviceClass     :  0x0 Specified at interface  bDeviceSubClass    :  0x0  bDeviceProtocol    :  0x0  bMaxPacketSize0    :  0x9 (9 bytes)  idVendor       : 0x20f4  idProduct       : 0xe05a  bcdDevice       : 0x101 Device 1.01  iManufacturer     :  0x1 TRENDnet  iProduct       :  0x2 TRENDnet USB 5G Adapter  iSerialNumber     :  0x3 000000DB  bNumConfigurations  :  0x2  CONFIGURATION 1: 224 mA ==================================   bLength       :  0x9 (9 bytes)   bDescriptorType   :  0x2 Configuration   wTotalLength    : 0x39 (57 bytes)   bNumInterfaces   :  0x1   bConfigurationValue :  0x1   iConfiguration   :  0x4 LAN   bmAttributes    : 0xa0 Bus Powered, Remote Wakeup   bMaxPower      : 0x70 (224 mA) ....  CONFIGURATION 2: 224 mA ==================================   bLength       :  0x9 (9 bytes)   bDescriptorType   :  0x2 Configuration   wTotalLength    : 0x62 (98 bytes)   bNumInterfaces   :  0x2   bConfigurationValue :  0x2   iConfiguration   :  0x8 CDC LAN   bmAttributes    : 0x80 Bus Powered   bMaxPower      : 0x70 (224 mA) Kernel logs with real hardware plugged in and my DEXT installed still matching Apple DEXT 2022-11-11 18:51:39.854308-0800 0x3aa6  Default  0x0         0   0  kernel: (IOUSBHostFamily) 000980.145603 usb-drd1-port-ss@01200000: AppleUSBHostPort::enumerateDeviceComplete_block_invoke: enumerated 0x20f4/e05a/0101 (TRENDnet USB 5G Adapter) at 5 Gbps ..... 2022-11-11 18:51:39.898925-0800 0x47bd  Default  0x0         0   0  kernel: Found class: IOUSBHostInterface 2022-11-11 18:51:39.899998-0800 0x47bd  Default  0x0         0   0  kernel: (com.apple.DriverKit.AppleUserECM.dext) OnQueue SDK version 0x150600 2022-11-11 18:51:39.902587-0800 0x47c0  Default  0x0         0   0  kernel: (com.apple.DriverKit.AppleUserECM.dext) AppleUserECMData interface 1 belongs to ECM, matched with UNF (0) 2022-11-11 18:51:39.902612-0800 0x47b3  Default  0x0         0   0  kernel: DK: AppleUserECMData-0x1000010bf::start(CDC Data 0-0x1000010bc) ok 2022-11-11 18:51:39.926256-0800 0x47b2  Default  0x0         0   0  kernel: DK: AppleUserECM-0x1000010bd::start(CDC Ctrl-0x1000010bb) ok Configuration Descriptors of spoofed hardware with 2nd config descriptor removed >>> dev = usb.core.find() >>> print(dev) DEVICE ID 20f4:e05a on Bus 001 Address 001 =================  bLength        : 0x12 (18 bytes)  bDescriptorType    :  0x1 Device  bcdUSB        : 0x200 USB 2.0  bDeviceClass     :  0x0 Specified at interface  bDeviceSubClass    :  0x0  bDeviceProtocol    :  0x0  bMaxPacketSize0    :  0x9 (9 bytes)  idVendor       : 0x20f4  idProduct       : 0xe05a  bcdDevice       : 0x101 Device 1.01  iManufacturer     :  0x1 TrendWhatever  iProduct       :  0x2 AQC!111  iSerialNumber     :  0x3 123456789012  bNumConfigurations  :  0x1  CONFIGURATION 1: 224 mA ==================================   bLength       :  0x9 (9 bytes)   bDescriptorType   :  0x2 Configuration   wTotalLength    : 0x39 (57 bytes)   bNumInterfaces   :  0x1   bConfigurationValue :  0x1   iConfiguration   :  0x4 LAN   bmAttributes    : 0xa0 Bus Powered, Remote Wakeup   bMaxPower      : 0x70 (224 mA) and proof, it matches with my driver (but obviously fails to work, since the driver isn't finished and the hardware is a mock) 2022-11-11 19:11:47.693212-0800 0x9a91  Default  0x0         0   0  kernel: DK: AQC111DrvExt-0x1000012b7 waiting for server au.com.jquirke.AQC111DrvExt-1000012b7 .... (Sandbox) /Library/SystemExtensions/BD547468-F734-47F9-80B7-D2FBC5A2297C/au.com.jquirke.AQC111DrvExt.dext/au.com.jquirke.AQC111DrvExt[2904] ==> com.apple.dext ... 2022-11-11 19:11:47.723612-0800 0x9a98  Default  0x0         0   0  kernel: Found class: IOUserNetworkRxCompletionQueue 2022-11-11 19:11:47.724041-0800 0x9a98  Default  0x0         0   0  kernel: (au.com.jquirke.AQC111DrvExt.dext) OnQueue SDK version 0x150400 2022-11-11 19:11:47.725374-0800 0x9a9b  Default  0x0         0   0  kernel: (au.com.jquirke.AQC111DrvExt.dext) foobaz init 2022-11-11 19:11:47.725472-0800 0x9a9b  Default  0x0         0   0  kernel: (au.com.jquirke.AQC111DrvExt.dext) foobaz Start_Impl 2022-11-11 19:11:47.725485-0800 0x9a9b  Default  0x0         0   0  kernel: (au.com.jquirke.AQC111DrvExt.dext) foobaz super::start 0 2022-11-11 19:11:47.725488-0800 0x9a9b  Default  0x0         0   0  kernel: (au.com.jquirke.AQC111DrvExt.dext) foobaz odynamiccast 0 2022-11-11 19:11:47.725555-0800 0x9a9b  Default  0x0         0   0  kernel: (au.com.jquirke.AQC111DrvExt.dext) foobaz interfaceopen 0 2022-11-11 19:11:47.725563-0800 0x9a9b  Default  0x0         0   0  kernel: (au.com.jquirke.AQC111DrvExt.dext) foobaz selectalternate e00002f0 2022-11-11 19:11:47.725595-0800 0x9a91  Default  0x0         0   0  kernel: DK: AQC111DrvExt-0x1000012b7::start(IOUSBHostInterface-0x1000012b5) fail
Replies
2
Boosts
1
Views
1.5k
Activity
Nov ’22