diff options
author | Ghanan Gowripalan <ghanan@google.com> | 2021-01-22 16:03:27 -0800 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2021-01-22 16:06:05 -0800 |
commit | 76da673a0ddaf33e410d48501a9b089979411d4d (patch) | |
tree | f21c355eaefefce0e7092f13b5a47cbec2ca8650 /pkg/tcpip/network | |
parent | f190e13a74c261176d8619a2fa03fd80a5c74f6d (diff) |
Do not modify IGMP packets when verifying checksum
PiperOrigin-RevId: 353336894
Diffstat (limited to 'pkg/tcpip/network')
-rw-r--r-- | pkg/tcpip/network/ipv4/igmp.go | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/pkg/tcpip/network/ipv4/igmp.go b/pkg/tcpip/network/ipv4/igmp.go index 9515fde45..4550aacd6 100644 --- a/pkg/tcpip/network/ipv4/igmp.go +++ b/pkg/tcpip/network/ipv4/igmp.go @@ -157,14 +157,13 @@ func (igmp *igmpState) handleIGMP(pkt *stack.PacketBuffer) { } h := header.IGMP(headerView) - // Temporarily reset the checksum field to 0 in order to calculate the proper - // checksum. - wantChecksum := h.Checksum() - h.SetChecksum(0) - gotChecksum := ^header.ChecksumVV(pkt.Data, 0 /* initial */) - h.SetChecksum(wantChecksum) - - if gotChecksum != wantChecksum { + // As per RFC 1071 section 1.3, + // + // To check a checksum, the 1's complement sum is computed over the + // same set of octets, including the checksum field. If the result + // is all 1 bits (-0 in 1's complement arithmetic), the check + // succeeds. + if header.ChecksumVV(pkt.Data, 0 /* initial */) != 0xFFFF { received.checksumErrors.Increment() return } |