diff options
author | tuexen <tuexen@FreeBSD.org> | 2015-11-26 09:25:20 +0000 |
---|---|---|
committer | tuexen <tuexen@FreeBSD.org> | 2015-11-26 09:25:20 +0000 |
commit | a693a7b8519301cc561b5230407b69f701817182 (patch) | |
tree | 9958d6213e0d58b82323710a476d5418be0c1008 /sys/netinet/sctputil.c | |
parent | fa8bce706bc20344d477ab6a33a3117124b5eabc (diff) | |
download | FreeBSD-src-a693a7b8519301cc561b5230407b69f701817182.zip FreeBSD-src-a693a7b8519301cc561b5230407b69f701817182.tar.gz |
When receiving an SCTP/UDP packet and the interface performed
the UDP checksum computation and signals that it was OK,
clear this bit when passing the packet to SCTP. Since the
bits indicating a valid UDP checksum and a valid SCTP
checksum are the same, the SCTP stack would assume
that also an SCTP checksum check has been performed.
MFC after: 1 week
Diffstat (limited to 'sys/netinet/sctputil.c')
-rw-r--r-- | sys/netinet/sctputil.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/sys/netinet/sctputil.c b/sys/netinet/sctputil.c index cae0e26..8d8f375 100644 --- a/sys/netinet/sctputil.c +++ b/sys/netinet/sctputil.c @@ -6957,6 +6957,18 @@ sctp_recv_udp_tunneled_packet(struct mbuf *m, int off, struct inpcb *inp, for (last = m; last->m_next; last = last->m_next); last->m_next = sp; m->m_pkthdr.len += sp->m_pkthdr.len; + /* + * The CSUM_DATA_VALID flags indicates that the HW checked the UDP + * checksum and it was valid. Since CSUM_DATA_VALID == + * CSUM_SCTP_VALID this would imply that the HW also verified the + * SCTP checksum. Therefore, clear the bit. + */ + SCTPDBG(SCTP_DEBUG_CRCOFFLOAD, + "sctp_recv_udp_tunneled_packet(): Packet of length %d received on %s with csum_flags 0x%b.\n", + m->m_pkthdr.len, + if_name(m->m_pkthdr.rcvif), + (int)m->m_pkthdr.csum_flags, CSUM_BITS); + m->m_pkthdr.csum_flags &= ~CSUM_DATA_VALID; iph = mtod(m, struct ip *); switch (iph->ip_v) { #ifdef INET |