mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
if_tuntap: support receive checksum offloading for tap interfaces
When enabled, pretend that the IPv4 and transport layer checksum is correct for packets injected via the character device. This is a prerequisite for adding support for LRO, which will be added next. Then packetdrill can be used to test the LRO code in local mode. Reviewed by: rscheff, zlei Sponsored by: Netflix, Inc. Differential Revision: https://reviews.freebsd.org/D42477 (cherry picked from commit ff69d13a50d1d07601de0885fd94f6a09a7ba383)
This commit is contained in:
parent
e0f22f9e18
commit
002829ea61
1 changed files with 31 additions and 3 deletions
|
|
@ -977,6 +977,8 @@ tuncreate(struct cdev *dev)
|
|||
ifp->if_flags = iflags;
|
||||
IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);
|
||||
ifp->if_capabilities |= IFCAP_LINKSTATE;
|
||||
if ((tp->tun_flags & TUN_L2) != 0)
|
||||
ifp->if_capabilities |= IFCAP_RXCSUM | IFCAP_RXCSUM_IPV6;
|
||||
ifp->if_capenable |= IFCAP_LINKSTATE;
|
||||
|
||||
if ((tp->tun_flags & TUN_L2) != 0) {
|
||||
|
|
@ -1784,9 +1786,35 @@ tunwrite_l2(struct tuntap_softc *tp, struct mbuf *m,
|
|||
return (0);
|
||||
}
|
||||
|
||||
if (vhdr != NULL && virtio_net_rx_csum(m, &vhdr->hdr)) {
|
||||
m_freem(m);
|
||||
return (0);
|
||||
if (vhdr != NULL) {
|
||||
if (virtio_net_rx_csum(m, &vhdr->hdr)) {
|
||||
m_freem(m);
|
||||
return (0);
|
||||
}
|
||||
} else {
|
||||
switch (ntohs(eh->ether_type)) {
|
||||
#ifdef INET
|
||||
case ETHERTYPE_IP:
|
||||
if (ifp->if_capenable & IFCAP_RXCSUM) {
|
||||
m->m_pkthdr.csum_flags |=
|
||||
CSUM_IP_CHECKED | CSUM_IP_VALID |
|
||||
CSUM_DATA_VALID | CSUM_SCTP_VALID |
|
||||
CSUM_PSEUDO_HDR;
|
||||
m->m_pkthdr.csum_data = 0xffff;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
#ifdef INET6
|
||||
case ETHERTYPE_IPV6:
|
||||
if (ifp->if_capenable & IFCAP_RXCSUM_IPV6) {
|
||||
m->m_pkthdr.csum_flags |=
|
||||
CSUM_DATA_VALID_IPV6 | CSUM_SCTP_VALID |
|
||||
CSUM_PSEUDO_HDR;
|
||||
m->m_pkthdr.csum_data = 0xffff;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/* Pass packet up to parent. */
|
||||
|
|
|
|||
Loading…
Reference in a new issue