As the CDC-ECM specification states the host MAC address must be sent to the host as an uppercase hexadecimal string: The Unicode character is chosen from the set of values 30h through 39h and 41h through 46h (0-9 and A-F). However, snprintf(.., "%pm", ..) generates a lowercase MAC address string. While most host drivers are tolerant to this, UsbNcm.sys on Windows 10 is not. Instead it uses a different MAC address with all bytes set to zero including and after the first byte containing a lowercase letter. On Windows 11 Microsoft fixed it, but apparently they did not backport the fix. This change fixes the issue by upper-casing the MAC to comply with the specification. Signed-off-by: Konrad Gräfe <k.graefe@xxxxxxxxxxx> --- drivers/usb/gadget/function/u_ether.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
diff --git drivers/usb/gadget/function/u_ether.c drivers/usb/gadget/function/u_ether.c index 6956ad8ba8dd..49d29b04ef93 100644 --- drivers/usb/gadget/function/u_ether.c +++ drivers/usb/gadget/function/u_ether.c @@ -958,6 +958,7 @@ EXPORT_SYMBOL_GPL(gether_get_host_addr); int gether_get_host_addr_cdc(struct net_device *net, char *host_addr, int len) { struct eth_dev *dev; + int i, slen; if (len < 13) return -EINVAL; @@ -965,7 +966,14 @@ int gether_get_host_addr_cdc(struct net_device *net, char *host_addr, int len) dev = netdev_priv(net); snprintf(host_addr, len, "%pm", dev->host_mac); - return strlen(host_addr); + + slen = strlen(host_addr); + + for(i = 0; i < slen; i++) { + host_addr[i] = toupper(host_addr[i]); + } + + return slen; } EXPORT_SYMBOL_GPL(gether_get_host_addr_cdc);
Attachment:
OpenPGP_signature
Description: OpenPGP digital signature