hyperv/hn: Pass RX packet info to netvsc_recv.
This paves to nuke netvsc_packet, which does not serves much purpose now. MFC after: 1 week Sponsored by: Microsoft Differential Revision: https://reviews.freebsd.org/D7541
This commit is contained in:
parent
7c10cf8c28
commit
83ecbf4d6a
@ -275,7 +275,6 @@ typedef void (*pfn_on_send_rx_completion)(struct vmbus_channel *, void *);
|
||||
#endif
|
||||
|
||||
typedef struct netvsc_packet_ {
|
||||
uint16_t vlan_tci;
|
||||
uint32_t status;
|
||||
uint32_t tot_data_buf_len;
|
||||
void *data;
|
||||
|
@ -1278,9 +1278,7 @@ hn_lro_rx(struct lro_ctrl *lc, struct mbuf *m)
|
||||
*/
|
||||
int
|
||||
netvsc_recv(struct hn_rx_ring *rxr, netvsc_packet *packet,
|
||||
const rndis_tcp_ip_csum_info *csum_info,
|
||||
const struct rndis_hash_info *hash_info,
|
||||
const struct rndis_hash_value *hash_value)
|
||||
const struct hn_recvinfo *info)
|
||||
{
|
||||
struct ifnet *ifp = rxr->hn_ifp;
|
||||
struct mbuf *m_new;
|
||||
@ -1332,28 +1330,28 @@ netvsc_recv(struct hn_rx_ring *rxr, netvsc_packet *packet,
|
||||
do_csum = 0;
|
||||
|
||||
/* receive side checksum offload */
|
||||
if (csum_info != NULL) {
|
||||
if (info->csum_info != NULL) {
|
||||
/* IP csum offload */
|
||||
if (csum_info->receive.ip_csum_succeeded && do_csum) {
|
||||
if (info->csum_info->receive.ip_csum_succeeded && do_csum) {
|
||||
m_new->m_pkthdr.csum_flags |=
|
||||
(CSUM_IP_CHECKED | CSUM_IP_VALID);
|
||||
rxr->hn_csum_ip++;
|
||||
}
|
||||
|
||||
/* TCP/UDP csum offload */
|
||||
if ((csum_info->receive.tcp_csum_succeeded ||
|
||||
csum_info->receive.udp_csum_succeeded) && do_csum) {
|
||||
if ((info->csum_info->receive.tcp_csum_succeeded ||
|
||||
info->csum_info->receive.udp_csum_succeeded) && do_csum) {
|
||||
m_new->m_pkthdr.csum_flags |=
|
||||
(CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
|
||||
m_new->m_pkthdr.csum_data = 0xffff;
|
||||
if (csum_info->receive.tcp_csum_succeeded)
|
||||
if (info->csum_info->receive.tcp_csum_succeeded)
|
||||
rxr->hn_csum_tcp++;
|
||||
else
|
||||
rxr->hn_csum_udp++;
|
||||
}
|
||||
|
||||
if (csum_info->receive.ip_csum_succeeded &&
|
||||
csum_info->receive.tcp_csum_succeeded)
|
||||
if (info->csum_info->receive.ip_csum_succeeded &&
|
||||
info->csum_info->receive.tcp_csum_succeeded)
|
||||
do_lro = 1;
|
||||
} else {
|
||||
const struct ether_header *eh;
|
||||
@ -1409,19 +1407,18 @@ netvsc_recv(struct hn_rx_ring *rxr, netvsc_packet *packet,
|
||||
}
|
||||
}
|
||||
skip:
|
||||
if ((packet->vlan_tci != 0) &&
|
||||
(ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0) {
|
||||
m_new->m_pkthdr.ether_vtag = packet->vlan_tci;
|
||||
if (info->vlan_info != NULL) {
|
||||
m_new->m_pkthdr.ether_vtag = info->vlan_info->u1.s1.vlan_id;
|
||||
m_new->m_flags |= M_VLANTAG;
|
||||
}
|
||||
|
||||
if (hash_info != NULL && hash_value != NULL) {
|
||||
if (info->hash_info != NULL && info->hash_value != NULL) {
|
||||
rxr->hn_rss_pkts++;
|
||||
m_new->m_pkthdr.flowid = hash_value->hash_value;
|
||||
if ((hash_info->hash_info & NDIS_HASH_FUNCTION_MASK) ==
|
||||
m_new->m_pkthdr.flowid = info->hash_value->hash_value;
|
||||
if ((info->hash_info->hash_info & NDIS_HASH_FUNCTION_MASK) ==
|
||||
NDIS_HASH_FUNCTION_TOEPLITZ) {
|
||||
uint32_t type =
|
||||
(hash_info->hash_info & NDIS_HASH_TYPE_MASK);
|
||||
(info->hash_info->hash_info & NDIS_HASH_TYPE_MASK);
|
||||
|
||||
switch (type) {
|
||||
case NDIS_HASH_IPV4:
|
||||
@ -1450,8 +1447,8 @@ netvsc_recv(struct hn_rx_ring *rxr, netvsc_packet *packet,
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (hash_value != NULL) {
|
||||
m_new->m_pkthdr.flowid = hash_value->hash_value;
|
||||
if (info->hash_value != NULL) {
|
||||
m_new->m_pkthdr.flowid = info->hash_value->hash_value;
|
||||
} else {
|
||||
m_new->m_pkthdr.flowid = rxr->hn_rx_idx;
|
||||
hash_type = M_HASHTYPE_OPAQUE;
|
||||
|
@ -1088,11 +1088,10 @@ typedef struct rndismp_rx_bufs_info_ {
|
||||
*/
|
||||
struct hn_rx_ring;
|
||||
struct hn_tx_ring;
|
||||
struct hn_recvinfo;
|
||||
|
||||
int netvsc_recv(struct hn_rx_ring *rxr,
|
||||
netvsc_packet *packet, const rndis_tcp_ip_csum_info *csum_info,
|
||||
const struct rndis_hash_info *hash_info,
|
||||
const struct rndis_hash_value *hash_value);
|
||||
netvsc_packet *packet, const struct hn_recvinfo *info);
|
||||
void netvsc_channel_rollup(struct hn_rx_ring *rxr, struct hn_tx_ring *txr);
|
||||
|
||||
void* hv_set_rppi_data(rndis_msg *rndis_mesg,
|
||||
|
@ -52,13 +52,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include <dev/hyperv/netvsc/hv_rndis_filter.h>
|
||||
#include <dev/hyperv/netvsc/if_hnreg.h>
|
||||
|
||||
struct hv_rf_recvinfo {
|
||||
const ndis_8021q_info *vlan_info;
|
||||
const rndis_tcp_ip_csum_info *csum_info;
|
||||
const struct rndis_hash_info *hash_info;
|
||||
const struct rndis_hash_value *hash_value;
|
||||
};
|
||||
|
||||
#define HV_RF_RECVINFO_VLAN 0x1
|
||||
#define HV_RF_RECVINFO_CSUM 0x2
|
||||
#define HV_RF_RECVINFO_HASHINF 0x4
|
||||
@ -444,7 +437,7 @@ hv_rf_receive_indicate_status(rndis_device *device, rndis_msg *response)
|
||||
}
|
||||
|
||||
static int
|
||||
hv_rf_find_recvinfo(const rndis_packet *rpkt, struct hv_rf_recvinfo *info)
|
||||
hv_rf_find_recvinfo(const rndis_packet *rpkt, struct hn_recvinfo *info)
|
||||
{
|
||||
const rndis_per_packet_info *ppi;
|
||||
uint32_t mask, len;
|
||||
@ -530,7 +523,7 @@ hv_rf_receive_data(struct hn_rx_ring *rxr, rndis_msg *message,
|
||||
{
|
||||
rndis_packet *rndis_pkt;
|
||||
uint32_t data_offset;
|
||||
struct hv_rf_recvinfo info;
|
||||
struct hn_recvinfo info;
|
||||
|
||||
rndis_pkt = &message->msg.packet;
|
||||
|
||||
@ -559,13 +552,7 @@ hv_rf_receive_data(struct hn_rx_ring *rxr, rndis_msg *message,
|
||||
if_printf(rxr->hn_ifp, "recvinfo parsing failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (info.vlan_info != NULL)
|
||||
pkt->vlan_tci = info.vlan_info->u1.s1.vlan_id;
|
||||
else
|
||||
pkt->vlan_tci = 0;
|
||||
|
||||
netvsc_recv(rxr, pkt, info.csum_info, info.hash_info, info.hash_value);
|
||||
netvsc_recv(rxr, pkt, &info);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -35,7 +35,6 @@
|
||||
#include <dev/hyperv/netvsc/if_hnreg.h>
|
||||
|
||||
struct netvsc_dev_;
|
||||
struct nvsp_msg_;
|
||||
|
||||
struct vmbus_channel;
|
||||
struct hn_send_ctx;
|
||||
@ -51,6 +50,18 @@ struct hn_send_ctx {
|
||||
int hn_chim_sz;
|
||||
};
|
||||
|
||||
struct rndis_hash_info;
|
||||
struct rndix_hash_value;
|
||||
struct ndis_8021q_info_;
|
||||
struct rndis_tcp_ip_csum_info_;
|
||||
|
||||
struct hn_recvinfo {
|
||||
const struct ndis_8021q_info_ *vlan_info;
|
||||
const struct rndis_tcp_ip_csum_info_ *csum_info;
|
||||
const struct rndis_hash_info *hash_info;
|
||||
const struct rndis_hash_value *hash_value;
|
||||
};
|
||||
|
||||
#define HN_SEND_CTX_INITIALIZER(cb, cbarg) \
|
||||
{ \
|
||||
.hn_cb = cb, \
|
||||
|
Loading…
Reference in New Issue
Block a user