Define and use two macros for loopback checksum offload:
LO_CSUM_FEATURES - a bitmask of supported transmit offload features, which will be stored in if_hwassist if IFCAP_TXCSUM is enabled, and be cleared from mbuf packet header csum flags on transmit. (1) LO_CSUM_SET - a bitmask of supported receive offload features, which will be set on the mbuf packet header csum flags on transmit if IFCAP_RXCSUM is enabled. While here, fix SCTP offload for loopback: offer generation on the transmit side, don't just skip validation on the receive side. Obtained from: DragonflyBSD (1) MFC after: 1 week
This commit is contained in:
parent
6465d2d9d2
commit
5bb89930e4
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=189873
@ -94,6 +94,11 @@
|
||||
#define LOMTU 16384
|
||||
#endif
|
||||
|
||||
#define LO_CSUM_FEATURES (CSUM_IP | CSUM_TCP | CSUM_UDP | CSUM_SCTP)
|
||||
#define LO_CSUM_SET (CSUM_DATA_VALID | CSUM_PSEUDO_HDR | \
|
||||
CSUM_IP_CHECKED | CSUM_IP_VALID | \
|
||||
CSUM_SCTP_VALID)
|
||||
|
||||
int loioctl(struct ifnet *, u_long, caddr_t);
|
||||
static void lortrequest(int, struct rtentry *, struct rt_addrinfo *);
|
||||
int looutput(struct ifnet *ifp, struct mbuf *m,
|
||||
@ -139,7 +144,7 @@ lo_clone_create(struct if_clone *ifc, int unit, caddr_t params)
|
||||
ifp->if_output = looutput;
|
||||
ifp->if_snd.ifq_maxlen = ifqmaxlen;
|
||||
ifp->if_capabilities = ifp->if_capenable = IFCAP_HWCSUM;
|
||||
ifp->if_hwassist = CSUM_IP | CSUM_TCP | CSUM_UDP;
|
||||
ifp->if_hwassist = LO_CSUM_FEATURES;
|
||||
if_attach(ifp);
|
||||
bpfattach(ifp, DLT_NULL, sizeof(u_int32_t));
|
||||
if (V_loif == NULL)
|
||||
@ -216,11 +221,9 @@ looutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
|
||||
case AF_INET:
|
||||
if (ifp->if_capenable & IFCAP_RXCSUM) {
|
||||
m->m_pkthdr.csum_data = 0xffff;
|
||||
m->m_pkthdr.csum_flags = CSUM_DATA_VALID |
|
||||
CSUM_PSEUDO_HDR | CSUM_IP_CHECKED |
|
||||
CSUM_IP_VALID | CSUM_SCTP_VALID;
|
||||
m->m_pkthdr.csum_flags = LO_CSUM_SET;
|
||||
}
|
||||
m->m_pkthdr.csum_flags &= ~(CSUM_IP | CSUM_TCP | CSUM_UDP);
|
||||
m->m_pkthdr.csum_flags &= ~LO_CSUM_FEATURES;
|
||||
case AF_INET6:
|
||||
case AF_IPX:
|
||||
case AF_APPLETALK:
|
||||
@ -407,7 +410,7 @@ loioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
|
||||
if ((mask & IFCAP_TXCSUM) != 0)
|
||||
ifp->if_capenable ^= IFCAP_TXCSUM;
|
||||
if (ifp->if_capenable & IFCAP_TXCSUM)
|
||||
ifp->if_hwassist = CSUM_IP | CSUM_TCP | CSUM_UDP;
|
||||
ifp->if_hwassist = LO_CSUM_FEATURES;
|
||||
else
|
||||
ifp->if_hwassist = 0;
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user