Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/hyperv/netvsc/hn_rndis.c
Show First 20 Lines • Show All 717 Lines • ▼ Show 20 Lines | hn_rndis_conf_offload(struct hn_softc *sc, int mtu) | ||||
} | } | ||||
if (hwcaps.ndis_csum.ndis_ip6_rxcsum & NDIS_RXCSUM_CAP_UDP6) { | if (hwcaps.ndis_csum.ndis_ip6_rxcsum & NDIS_RXCSUM_CAP_UDP6) { | ||||
if (params.ndis_udp6csum == NDIS_OFFLOAD_PARAM_TX) | if (params.ndis_udp6csum == NDIS_OFFLOAD_PARAM_TX) | ||||
params.ndis_udp6csum = NDIS_OFFLOAD_PARAM_TXRX; | params.ndis_udp6csum = NDIS_OFFLOAD_PARAM_TXRX; | ||||
else | else | ||||
params.ndis_udp6csum = NDIS_OFFLOAD_PARAM_RX; | params.ndis_udp6csum = NDIS_OFFLOAD_PARAM_RX; | ||||
} | } | ||||
/* RSC offload */ | |||||
if (hwcaps.ndis_hdr.ndis_rev >= NDIS_OFFLOAD_PARAMS_REV_3) { | |||||
if (hwcaps.ndis_rsc.ndis_ip4 && hwcaps.ndis_rsc.ndis_ip6) { | |||||
params.ndis_rsc_ip4 = NDIS_OFFLOAD_RSC_ON; | |||||
params.ndis_rsc_ip6 = NDIS_OFFLOAD_RSC_ON; | |||||
} else { | |||||
params.ndis_rsc_ip4 = NDIS_OFFLOAD_RSC_OFF; | |||||
params.ndis_rsc_ip6 = NDIS_OFFLOAD_RSC_OFF; | |||||
} | |||||
} | |||||
if (bootverbose) { | if (bootverbose) { | ||||
if_printf(sc->hn_ifp, "offload csum: " | if_printf(sc->hn_ifp, "offload csum: " | ||||
"ip4 %u, tcp4 %u, udp4 %u, tcp6 %u, udp6 %u\n", | "ip4 %u, tcp4 %u, udp4 %u, tcp6 %u, udp6 %u\n", | ||||
params.ndis_ip4csum, | params.ndis_ip4csum, | ||||
params.ndis_tcp4csum, | params.ndis_tcp4csum, | ||||
params.ndis_udp4csum, | params.ndis_udp4csum, | ||||
params.ndis_tcp6csum, | params.ndis_tcp6csum, | ||||
params.ndis_udp6csum); | params.ndis_udp6csum); | ||||
if_printf(sc->hn_ifp, "offload lsov2: ip4 %u, ip6 %u\n", | if_printf(sc->hn_ifp, "offload lsov2: ip4 %u, ip6 %u\n", | ||||
params.ndis_lsov2_ip4, | params.ndis_lsov2_ip4, | ||||
params.ndis_lsov2_ip6); | params.ndis_lsov2_ip6); | ||||
if (hwcaps.ndis_hdr.ndis_rev >= NDIS_OFFLOAD_PARAMS_REV_3) | |||||
if_printf(sc->hn_ifp, "offload rsc: ip4 %u, ip6 %u\n", | |||||
params.ndis_rsc_ip4, | |||||
params.ndis_rsc_ip6); | |||||
} | } | ||||
error = hn_rndis_set(sc, OID_TCP_OFFLOAD_PARAMETERS, ¶ms, paramsz); | error = hn_rndis_set(sc, OID_TCP_OFFLOAD_PARAMETERS, ¶ms, paramsz); | ||||
if (error) { | if (error) { | ||||
if_printf(sc->hn_ifp, "offload config failed: %d\n", error); | if_printf(sc->hn_ifp, "offload config failed: %d\n", error); | ||||
return (error); | return (error); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 219 Lines • ▼ Show 20 Lines | hn_rndis_query_hwcaps(struct hn_softc *sc, struct ndis_offload *caps) | ||||
if (caps->ndis_hdr.ndis_size > caps_len) { | if (caps->ndis_hdr.ndis_size > caps_len) { | ||||
if_printf(sc->hn_ifp, "invalid NDIS objsize %u, " | if_printf(sc->hn_ifp, "invalid NDIS objsize %u, " | ||||
"data size %zu\n", caps->ndis_hdr.ndis_size, caps_len); | "data size %zu\n", caps->ndis_hdr.ndis_size, caps_len); | ||||
return (EINVAL); | return (EINVAL); | ||||
} else if (caps->ndis_hdr.ndis_size < NDIS_OFFLOAD_SIZE_6_0) { | } else if (caps->ndis_hdr.ndis_size < NDIS_OFFLOAD_SIZE_6_0) { | ||||
if_printf(sc->hn_ifp, "invalid NDIS objsize %u\n", | if_printf(sc->hn_ifp, "invalid NDIS objsize %u\n", | ||||
caps->ndis_hdr.ndis_size); | caps->ndis_hdr.ndis_size); | ||||
return (EINVAL); | return (EINVAL); | ||||
} else if (caps->ndis_hdr.ndis_rev >= NDIS_OFFLOAD_REV_3 && | |||||
caps->ndis_hdr.ndis_size < NDIS_OFFLOAD_SIZE) { | |||||
if_printf(sc->hn_ifp, "invalid NDIS rev3 objsize %u\n", | |||||
caps->ndis_hdr.ndis_size); | |||||
return (EINVAL); | |||||
} | } | ||||
if (bootverbose) { | if (bootverbose) { | ||||
/* | /* | ||||
* NOTE: | * NOTE: | ||||
* caps->ndis_hdr.ndis_size MUST be checked before accessing | * caps->ndis_hdr.ndis_size MUST be checked before accessing | ||||
* NDIS 6.1+ specific fields. | * NDIS 6.1+ specific fields. | ||||
*/ | */ | ||||
Show All 16 Lines | if_printf(sc->hn_ifp, "hwcaps lsov2: " | ||||
"ip6 maxsz %u minsg %u encap 0x%x opts 0x%x\n", | "ip6 maxsz %u minsg %u encap 0x%x opts 0x%x\n", | ||||
caps->ndis_lsov2.ndis_ip4_maxsz, | caps->ndis_lsov2.ndis_ip4_maxsz, | ||||
caps->ndis_lsov2.ndis_ip4_minsg, | caps->ndis_lsov2.ndis_ip4_minsg, | ||||
caps->ndis_lsov2.ndis_ip4_encap, | caps->ndis_lsov2.ndis_ip4_encap, | ||||
caps->ndis_lsov2.ndis_ip6_maxsz, | caps->ndis_lsov2.ndis_ip6_maxsz, | ||||
caps->ndis_lsov2.ndis_ip6_minsg, | caps->ndis_lsov2.ndis_ip6_minsg, | ||||
caps->ndis_lsov2.ndis_ip6_encap, | caps->ndis_lsov2.ndis_ip6_encap, | ||||
caps->ndis_lsov2.ndis_ip6_opts); | caps->ndis_lsov2.ndis_ip6_opts); | ||||
if (caps->ndis_hdr.ndis_rev >= NDIS_OFFLOAD_REV_3) | |||||
if_printf(sc->hn_ifp, "hwcaps rsc: " | |||||
"ip4 %u ip6 %u\n", | |||||
caps->ndis_rsc.ndis_ip4, | |||||
caps->ndis_rsc.ndis_ip6); | |||||
} | } | ||||
return (0); | return (0); | ||||
} | } | ||||
int | int | ||||
hn_rndis_attach(struct hn_softc *sc, int mtu, int *init_done) | hn_rndis_attach(struct hn_softc *sc, int mtu, int *init_done) | ||||
{ | { | ||||
int error; | int error; | ||||
Show All 25 Lines |