Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
Show First 20 Lines • Show All 538 Lines • ▼ Show 20 Lines | hv_rf_receive_data(struct hn_rx_ring *rxr, rndis_msg *message, | ||||
* netvsc packet (ie tot_data_buf_len != message_length) | * netvsc packet (ie tot_data_buf_len != message_length) | ||||
*/ | */ | ||||
/* Remove rndis header, then pass data packet up the stack */ | /* Remove rndis header, then pass data packet up the stack */ | ||||
data_offset = RNDIS_HEADER_SIZE + rndis_pkt->data_offset; | data_offset = RNDIS_HEADER_SIZE + rndis_pkt->data_offset; | ||||
pkt->tot_data_buf_len -= data_offset; | pkt->tot_data_buf_len -= data_offset; | ||||
if (pkt->tot_data_buf_len < rndis_pkt->data_length) { | if (pkt->tot_data_buf_len < rndis_pkt->data_length) { | ||||
pkt->status = nvsp_status_failure; | pkt->status = HN_NVS_STATUS_FAILED; | ||||
if_printf(rxr->hn_ifp, | if_printf(rxr->hn_ifp, | ||||
"total length %u is less than data length %u\n", | "total length %u is less than data length %u\n", | ||||
pkt->tot_data_buf_len, rndis_pkt->data_length); | pkt->tot_data_buf_len, rndis_pkt->data_length); | ||||
return; | return; | ||||
} | } | ||||
pkt->tot_data_buf_len = rndis_pkt->data_length; | pkt->tot_data_buf_len = rndis_pkt->data_length; | ||||
pkt->data = (void *)((unsigned long)pkt->data + data_offset); | pkt->data = (void *)((unsigned long)pkt->data + data_offset); | ||||
if (hv_rf_find_recvinfo(rndis_pkt, &info)) { | if (hv_rf_find_recvinfo(rndis_pkt, &info)) { | ||||
pkt->status = nvsp_status_failure; | pkt->status = HN_NVS_STATUS_FAILED; | ||||
if_printf(rxr->hn_ifp, "recvinfo parsing failed\n"); | if_printf(rxr->hn_ifp, "recvinfo parsing failed\n"); | ||||
return; | return; | ||||
} | } | ||||
if (info.vlan_info != NULL) | if (info.vlan_info != NULL) | ||||
pkt->vlan_tci = info.vlan_info->u1.s1.vlan_id; | pkt->vlan_tci = info.vlan_info->u1.s1.vlan_id; | ||||
else | else | ||||
pkt->vlan_tci = 0; | pkt->vlan_tci = 0; | ||||
netvsc_recv(rxr, pkt, info.csum_info, info.hash_info, info.hash_value); | netvsc_recv(rxr, pkt, info.csum_info, info.hash_info, info.hash_value); | ||||
} | } | ||||
/* | /* | ||||
* RNDIS filter on receive | * RNDIS filter on receive | ||||
*/ | */ | ||||
int | int | ||||
hv_rf_on_receive(netvsc_dev *net_dev, | hv_rf_on_receive(netvsc_dev *net_dev, | ||||
struct hn_rx_ring *rxr, netvsc_packet *pkt) | struct hn_rx_ring *rxr, netvsc_packet *pkt) | ||||
{ | { | ||||
rndis_device *rndis_dev; | rndis_device *rndis_dev; | ||||
rndis_msg *rndis_hdr; | rndis_msg *rndis_hdr; | ||||
/* Make sure the rndis device state is initialized */ | /* Make sure the rndis device state is initialized */ | ||||
if (net_dev->extension == NULL) { | if (net_dev->extension == NULL) { | ||||
pkt->status = nvsp_status_failure; | pkt->status = HN_NVS_STATUS_FAILED; | ||||
return (ENODEV); | return (ENODEV); | ||||
} | } | ||||
rndis_dev = (rndis_device *)net_dev->extension; | rndis_dev = (rndis_device *)net_dev->extension; | ||||
if (rndis_dev->state == RNDIS_DEV_UNINITIALIZED) { | if (rndis_dev->state == RNDIS_DEV_UNINITIALIZED) { | ||||
pkt->status = nvsp_status_failure; | pkt->status = HN_NVS_STATUS_FAILED; | ||||
return (EINVAL); | return (EINVAL); | ||||
} | } | ||||
rndis_hdr = pkt->data; | rndis_hdr = pkt->data; | ||||
switch (rndis_hdr->ndis_msg_type) { | switch (rndis_hdr->ndis_msg_type) { | ||||
/* data message */ | /* data message */ | ||||
▲ Show 20 Lines • Show All 708 Lines • Show Last 20 Lines |