History: usbd_cd_rndis

This page describes all changes made to the usbd_cd_rndis package, USB Device RNDIS Class Driver, since its release.


2.12 (2020-06-05, 10:14):

  • Eliminated compiler error that occurred when USBD_RNDIS_ACT_AS_NWDRIVER was set to 1.
  • The RNDIS core handles the USBD connection state change (suspended, configured, etc).

2.11 (2019-10-22, 08:09):

  • Interface could remain in "cable unplugged state" after disconnect/reconnect.

2.10 (2019-10-08, 09:45):

  • Network interface could not receive packets after running for >1 hour.

2.9 (2019-03-18, 08:40):

  • State change call-back function was called multiple times when the device was disconnected.

2.8 (2018-10-26, 13:48):

  • Function prototype mismatch fixed for usbd_rndis_init(). In the API header file the first parameter was called p_eth_drv_init, while in the implementation it was p_nwd_drv_init.
  • Typo in some function headers fixed (calss-->class).

2.7r2 (2018-08-29, 18:15):

  • Document HTML link added to the documentation folder.
  • History and document files renamed to the package name.

2.7 (2018-08-01, 12:14):

  • Class driver might stop and possibly reference NULL pointer after blocking the program execution for longer time (seconds; e.g. by stopping via debugger or a blocking high priority task) and then releasing it.

2.6r2 (2018-07-20, 13:29):

  • Info. file dependencies corrected: package nw_drv_eth_usb_device is required if RNDIS is to be used with any TCP/IP stack (previously restricted to HCC's TCP/IP stack).

2.6 (2018-06-18, 15:19):

  • NWDRIVER mode: completed transfer size reported via rndis_ethdrv_transfer_status() is the size of the Ethernet frame rather than the whole USB packet which also includes the RNDIS header.
  • Padding bytes of Tx USB messages filled with zero according to the RNDIS standard.

2.5 (2018-04-20, 07:03):

  • The driver could send invalid data to the host when USBD_RNDIS_ACT_AS_NWDRIVER was configured as 0. Windows 10 responded with fatal "blue screen".
  • The driver sent invalid data in RESPONSE_AVAILABLE notification.

2.4 (2018-03-13, 09:10):

  • Interface could stick in "cable unplugged state" after disconnect/reconnect.

2.3 (2017-08-15, 14:36):

  • Packet filtering used wrong MAC address and filtered all outgoing unicast frames when usbd_rndis_set_mac_addr() was called.


    Bugs fixed (if USBD_RNDIS_ACT_AS_NWDRIVER is 0):

  •     Implemented packet filter.
  •     Status of interface is reported to USB host when it changes.
  •     Packet loss could occur when no OS is used.

    Added Windows 7/8.x/10 driver (.inf file).


  • Class driver separated into two parts, depending on the new configuration option USBD_CDCECM_ACT_AS_NWDRIVER.
  • If USBD_CDCECM_ACT_AS_NWDRIVER != 0, then the class driver acts as a network driver: it can be interfaced to a network interface, typically required if the class driver is used with HCC's TCP/IP stack.
  • If USBD_CDCECM_ACT_AS_NWDRIVER == 0, then the class driver acts as a network interface: a network driver can be interfaced to it, typically required if the class driver needs to be used standalone or with a non HCC TCP/IP stack.


Added usbd_rndis_set_mac_addr() function.

  • Added default network address and link speed.
  • Reception could unexpectedly stop under some circumstances.
  • After connection RNDIS remained unoperational if the half of the RNDIS buffers in the network driver buffer area exceeded USBD_RNDIS_MAX_RX_USB_BUF_NUM or it was more than the no. of receive buffers allowed in the network driver (nwd_prop.nwp_rxbuf_count).


  • Reception could stop after disconnecting and reconnecting the device (buffers were exhausted if a receive couldn't start due to disconnected device).


  • Protection added against restarting USB Rx transfer while another one is in progress.
  • usbd_rndis_tx_task(): COM_REQ_EVENT_FLAG removed from waiting flags' bit field as it is unnecessary here.


  • Mutex creation moved from usbd_rndis_nwdstart() to usbd_rndis_init().
  • g_usbd_rndis_eth_started flag protected with mutex.
  • nwd_start() call issued after add_buf()s.


  • Compilation error (C++, --require_prototypes) removed.


  • Changed config(_template): MTU size is coming from ethdriver_rndis config.


  • Modifications needed because of NWDRIVER structure changes.


  • New NWDRIVER version instead of ETHDRV.


  • Added handling for missing mandatory OIDs.
  • Vendor ID, vendor description moved to config.


  • Compiler warnings removed.


  • Init: uninitialized mutex not used.


  • Incorrect MAC address report.


  • OID_GEN_RCV_NO_BUFFER support added in order to avoid incorrect disconnect state report under Win7.


  • CDC response available notification used instead of RNDIS notification to avoid network disconnected state report under Windows.
  • link speed divided by 100 as required in the specification.


  • Receive buffer was lost if ZLP was received.
  • ZLP sent in case of transmitted packets.


  • Cleanup (updated to latest requirements).


  • Initial release.