Index: if_urndis.c =================================================================== RCS file: /cvsroot/src/sys/dev/usb/if_urndis.c,v retrieving revision 1.21.4.1 diff -p -u -r1.21.4.1 if_urndis.c --- if_urndis.c 1 Sep 2019 13:00:36 -0000 1.21.4.1 +++ if_urndis.c 10 Sep 2019 00:52:33 -0000 @@ -79,6 +79,8 @@ static uint32_t urndis_ctrl_handle_query const struct rndis_comp_hdr *, void **, size_t *); static uint32_t urndis_ctrl_handle_reset(struct usbnet *, const struct rndis_comp_hdr *); +static uint32_t urndis_ctrl_handle_status(struct usbnet *, + const struct rndis_comp_hdr *); static uint32_t urndis_ctrl_set(struct usbnet *, uint32_t, void *, size_t); @@ -207,6 +209,10 @@ urndis_ctrl_handle(struct usbnet *un, st rval = le32toh(hdr->rm_status); break; + case REMOTE_NDIS_INDICATE_STATUS_MSG: + rval = urndis_ctrl_handle_status(un, hdr); + break; + default: printf("%s: ctrl message error: unknown event 0x%x\n", DEVNAME(un), le32toh(hdr->rm_type)); @@ -380,6 +386,38 @@ urndis_ctrl_handle_reset(struct usbnet * } static uint32_t +urndis_ctrl_handle_status(struct usbnet *un, + const struct rndis_comp_hdr *hdr) +{ + const struct rndis_status_msg *msg; + uint32_t rval; + + msg = (const struct rndis_status_msg *)hdr; + + rval = le32toh(msg->rm_status); + + DPRINTF(("%s: urndis_ctrl_handle_status: len %u status 0x%x " + "stbuflen %u\n", + DEVNAME(un), + le32toh(msg->rm_len), + rval, + le32toh(msg->rm_stbuflen))); + + switch (rval) { + case RNDIS_STATUS_MEDIA_CONNECT: + case RNDIS_STATUS_MEDIA_DISCONNECT: + case RNDIS_STATUS_OFFLOAD_CURRENT_CONFIG: + rval = RNDIS_STATUS_SUCCESS; + break; + + default: + printf("%s: status 0x%x\n", DEVNAME(un), rval); + } + + return rval; +} + +static uint32_t urndis_ctrl_init(struct usbnet *un) { struct rndis_init_req *msg;