Index: sys/net/if_disc.c =================================================================== --- sys/net/if_disc.c (wersja 203490) +++ sys/net/if_disc.c (kopia robocza) @@ -61,6 +61,8 @@ #define DISCNAME "disc" +#define DISC_CSUM_FEATURES (CSUM_IP | CSUM_TCP | CSUM_UDP | CSUM_SCTP) + struct disc_softc { struct ifnet *sc_ifp; }; @@ -109,6 +111,8 @@ ifp->if_hdrlen = 0; ifp->if_addrlen = 0; ifp->if_snd.ifq_maxlen = 20; + ifp->if_capabilities = ifp->if_capenable = IFCAP_HWCSUM; + ifp->if_hwassist = DISC_CSUM_FEATURES; if_attach(ifp); bpfattach(ifp, DLT_NULL, sizeof(u_int32_t)); @@ -197,7 +201,7 @@ { struct ifaddr *ifa; struct ifreq *ifr = (struct ifreq *)data; - int error = 0; + int error = 0, mask; switch (cmd) { @@ -238,6 +242,18 @@ ifp->if_mtu = ifr->ifr_mtu; break; + case SIOCSIFCAP: + mask = ifp->if_capenable ^ ifr->ifr_reqcap; + if ((mask & IFCAP_RXCSUM) != 0) + ifp->if_capenable ^= IFCAP_RXCSUM; + if ((mask & IFCAP_TXCSUM) != 0) + ifp->if_capenable ^= IFCAP_TXCSUM; + if (ifp->if_capenable & IFCAP_TXCSUM) + ifp->if_hwassist = DISC_CSUM_FEATURES; + else + ifp->if_hwassist = 0; + break; + default: error = EINVAL; }