Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
Show First 20 Lines • Show All 318 Lines • ▼ Show 20 Lines | hv_rf_receive_response(rndis_device *device, const rndis_msg *response) | ||||
} | } | ||||
mtx_unlock(&device->req_lock); | mtx_unlock(&device->req_lock); | ||||
if (found) { | if (found) { | ||||
if (response->msg_len <= sizeof(rndis_msg)) { | if (response->msg_len <= sizeof(rndis_msg)) { | ||||
memcpy(&request->response_msg, response, | memcpy(&request->response_msg, response, | ||||
response->msg_len); | response->msg_len); | ||||
} else { | } else { | ||||
if (response->ndis_msg_type == REMOTE_NDIS_RESET_CMPLT) { | |||||
/* Does not have a request id field */ | |||||
request->response_msg.msg.reset_complete.status = | |||||
STATUS_BUFFER_OVERFLOW; | |||||
} else { | |||||
request->response_msg.msg.init_complete.status = | request->response_msg.msg.init_complete.status = | ||||
STATUS_BUFFER_OVERFLOW; | STATUS_BUFFER_OVERFLOW; | ||||
} | } | ||||
} | |||||
sema_post(&request->wait_sema); | sema_post(&request->wait_sema); | ||||
} | } | ||||
} | } | ||||
int | int | ||||
hv_rf_send_offload_request(struct hn_softc *sc, | hv_rf_send_offload_request(struct hn_softc *sc, | ||||
rndis_offload_params *offloads) | rndis_offload_params *offloads) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 216 Lines • ▼ Show 20 Lines | hv_rf_on_receive(struct hn_softc *sc, struct hn_rx_ring *rxr, | ||||
const rndis_msg *rndis_hdr; | const rndis_msg *rndis_hdr; | ||||
rndis_dev = sc->rndis_dev; | rndis_dev = sc->rndis_dev; | ||||
if (rndis_dev->state == RNDIS_DEV_UNINITIALIZED) | if (rndis_dev->state == RNDIS_DEV_UNINITIALIZED) | ||||
return (EINVAL); | return (EINVAL); | ||||
rndis_hdr = data; | rndis_hdr = data; | ||||
switch (rndis_hdr->ndis_msg_type) { | switch (rndis_hdr->ndis_msg_type) { | ||||
/* data message */ | /* data message */ | ||||
case REMOTE_NDIS_PACKET_MSG: | case REMOTE_NDIS_PACKET_MSG: | ||||
hv_rf_receive_data(rxr, data, dlen); | hv_rf_receive_data(rxr, data, dlen); | ||||
break; | break; | ||||
/* completion messages */ | /* completion messages */ | ||||
case REMOTE_NDIS_INITIALIZE_CMPLT: | case REMOTE_NDIS_INITIALIZE_CMPLT: | ||||
case REMOTE_NDIS_QUERY_CMPLT: | case REMOTE_NDIS_QUERY_CMPLT: | ||||
case REMOTE_NDIS_SET_CMPLT: | case REMOTE_NDIS_SET_CMPLT: | ||||
case REMOTE_NDIS_RESET_CMPLT: | |||||
case REMOTE_NDIS_KEEPALIVE_CMPLT: | case REMOTE_NDIS_KEEPALIVE_CMPLT: | ||||
hv_rf_receive_response(rndis_dev, rndis_hdr); | hv_rf_receive_response(rndis_dev, rndis_hdr); | ||||
break; | break; | ||||
/* notification message */ | /* notification message */ | ||||
case REMOTE_NDIS_INDICATE_STATUS_MSG: | case REMOTE_NDIS_INDICATE_STATUS_MSG: | ||||
hv_rf_receive_indicate_status(rndis_dev, rndis_hdr); | hv_rf_receive_indicate_status(rndis_dev, rndis_hdr); | ||||
break; | break; | ||||
case REMOTE_NDIS_RESET_CMPLT: | |||||
/* | |||||
* Reset completed, no rid. | |||||
* | |||||
* NOTE: | |||||
* RESET is not issued by hn(4), so this message should | |||||
* _not_ be observed. | |||||
*/ | |||||
if_printf(sc->hn_ifp, "RESET CMPLT received\n"); | |||||
break; | |||||
default: | default: | ||||
printf("hv_rf_on_receive(): Unknown msg_type 0x%x\n", | if_printf(sc->hn_ifp, "unknown RNDIS message 0x%x\n", | ||||
rndis_hdr->ndis_msg_type); | rndis_hdr->ndis_msg_type); | ||||
break; | break; | ||||
} | } | ||||
return (0); | return (0); | ||||
} | } | ||||
/* | /* | ||||
* RNDIS filter query device | * RNDIS filter query device | ||||
*/ | */ | ||||
static int | static int | ||||
hv_rf_query_device(rndis_device *device, uint32_t oid, void *result, | hv_rf_query_device(rndis_device *device, uint32_t oid, void *result, | ||||
▲ Show 20 Lines • Show All 654 Lines • Show Last 20 Lines |