Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
Show First 20 Lines • Show All 56 Lines • ▼ Show 20 Lines | |||||
#define HV_RF_RECVINFO_HASHINF 0x4 | #define HV_RF_RECVINFO_HASHINF 0x4 | ||||
#define HV_RF_RECVINFO_HASHVAL 0x8 | #define HV_RF_RECVINFO_HASHVAL 0x8 | ||||
#define HV_RF_RECVINFO_ALL \ | #define HV_RF_RECVINFO_ALL \ | ||||
(HV_RF_RECVINFO_VLAN | \ | (HV_RF_RECVINFO_VLAN | \ | ||||
HV_RF_RECVINFO_CSUM | \ | HV_RF_RECVINFO_CSUM | \ | ||||
HV_RF_RECVINFO_HASHINF | \ | HV_RF_RECVINFO_HASHINF | \ | ||||
HV_RF_RECVINFO_HASHVAL) | HV_RF_RECVINFO_HASHVAL) | ||||
#define HN_RNDIS_RID_COMPAT_MASK 0xffff | |||||
#define HN_RNDIS_RID_COMPAT_MAX HN_RNDIS_RID_COMPAT_MASK | |||||
/* | /* | ||||
* Forward declarations | * Forward declarations | ||||
*/ | */ | ||||
static int hv_rf_send_request(rndis_device *device, rndis_request *request, | static int hv_rf_send_request(rndis_device *device, rndis_request *request, | ||||
uint32_t message_type); | uint32_t message_type); | ||||
static void hv_rf_receive_response(rndis_device *device, | static void hv_rf_receive_response(rndis_device *device, | ||||
const rndis_msg *response); | const rndis_msg *response); | ||||
static void hv_rf_receive_indicate_status(rndis_device *device, | static void hv_rf_receive_indicate_status(rndis_device *device, | ||||
▲ Show 20 Lines • Show All 124 Lines • ▼ Show 20 Lines | hv_rndis_request(rndis_device *device, uint32_t message_type, | ||||
rndis_mesg->msg_len = message_length; | rndis_mesg->msg_len = message_length; | ||||
/* | /* | ||||
* Set the request id. This field is always after the rndis header | * Set the request id. This field is always after the rndis header | ||||
* for request/response packet types so we just use the set_request | * for request/response packet types so we just use the set_request | ||||
* as a template. | * as a template. | ||||
*/ | */ | ||||
set = &rndis_mesg->msg.set_request; | set = &rndis_mesg->msg.set_request; | ||||
set->request_id = atomic_fetchadd_int(&device->new_request_id, 1); | set->request_id = atomic_fetchadd_int(&device->new_request_id, 1) & | ||||
/* Increment to get the new value (call above returns old value) */ | HN_RNDIS_RID_COMPAT_MASK; | ||||
set->request_id += 1; | |||||
/* Add to the request list */ | /* Add to the request list */ | ||||
mtx_lock(&device->req_lock); | mtx_lock(&device->req_lock); | ||||
STAILQ_INSERT_TAIL(&device->myrequest_list, request, mylist_entry); | STAILQ_INSERT_TAIL(&device->myrequest_list, request, mylist_entry); | ||||
mtx_unlock(&device->req_lock); | mtx_unlock(&device->req_lock); | ||||
return (request); | return (request); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 331 Lines • ▼ Show 20 Lines | |||||
* RNDIS filter on receive | * RNDIS filter on receive | ||||
*/ | */ | ||||
int | int | ||||
hv_rf_on_receive(struct hn_softc *sc, struct hn_rx_ring *rxr, | hv_rf_on_receive(struct hn_softc *sc, struct hn_rx_ring *rxr, | ||||
const void *data, int dlen) | const void *data, int dlen) | ||||
{ | { | ||||
rndis_device *rndis_dev; | rndis_device *rndis_dev; | ||||
const rndis_msg *rndis_hdr; | const rndis_msg *rndis_hdr; | ||||
const struct rndis_comp_hdr *comp; | |||||
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_KEEPALIVE_CMPLT: | case REMOTE_NDIS_KEEPALIVE_CMPLT: | ||||
comp = data; | |||||
if (comp->rm_rid <= HN_RNDIS_RID_COMPAT_MAX) { | |||||
/* Transition time compat code */ | |||||
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: | case REMOTE_NDIS_RESET_CMPLT: | ||||
▲ Show 20 Lines • Show All 677 Lines • Show Last 20 Lines |