mirror of
https://git.FreeBSD.org/src.git
synced 2024-11-30 08:19:09 +00:00
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:
parent
2e6e48fb59
commit
9907aba370
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=314430
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user