When IPv6 fragments reassembly is complete, update mbuf's csum_data

and csum_flags using information from all fragments. This fixes
dropping of reassembled packets due to wrong checksum when the IPv6
checksum offloading is enabled on a network card.

Obtained from:	Yandex LLC
MFC after:	1 week
Sponsored by:	Yandex LLC
This commit is contained in:
Andrey V. Elsukov 2017-02-28 22:58:19 +00:00
parent 2e6e48fb59
commit 9907aba370
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=314430

View File

@ -528,6 +528,11 @@ frag6_input(struct mbuf **mp, int *offp, int proto)
af6 = ip6af->ip6af_down;
frag6_deq(ip6af);
while (af6 != (struct ip6asfrag *)q6) {
m->m_pkthdr.csum_flags &=
IP6_REASS_MBUF(af6)->m_pkthdr.csum_flags;
m->m_pkthdr.csum_data +=
IP6_REASS_MBUF(af6)->m_pkthdr.csum_data;
af6dwn = af6->ip6af_down;
frag6_deq(af6);
while (t->m_next)
@ -538,6 +543,10 @@ frag6_input(struct mbuf **mp, int *offp, int proto)
af6 = af6dwn;
}
while (m->m_pkthdr.csum_data & 0xffff0000)
m->m_pkthdr.csum_data = (m->m_pkthdr.csum_data & 0xffff) +
(m->m_pkthdr.csum_data >> 16);
/* adjust offset to point where the original next header starts */
offset = ip6af->ip6af_offset - sizeof(struct ip6_frag);
free(ip6af, M_FTABLE);