Fix checksum changes
This commit is contained in:
parent
adc106bcf6
commit
ff49ece55d
4 changed files with 11 additions and 4 deletions
|
|
@ -479,6 +479,7 @@ func (b IPv4) SetDestinationAddress(addr tcpip.Address) {
|
||||||
|
|
||||||
// CalculateChecksum calculates the checksum of the IPv4 header.
|
// CalculateChecksum calculates the checksum of the IPv4 header.
|
||||||
func (b IPv4) CalculateChecksum() uint16 {
|
func (b IPv4) CalculateChecksum() uint16 {
|
||||||
|
// return checksum.Checksum(b[:b.HeaderLength()], 0)
|
||||||
xsum0 := checksum.Checksum(b[:xsum], 0)
|
xsum0 := checksum.Checksum(b[:xsum], 0)
|
||||||
xsum0 = checksum.Checksum(b[xsum+2:b.HeaderLength()], xsum0)
|
xsum0 = checksum.Checksum(b[xsum+2:b.HeaderLength()], xsum0)
|
||||||
return xsum0
|
return xsum0
|
||||||
|
|
@ -573,7 +574,8 @@ func (b IPv4) IsChecksumValid() bool {
|
||||||
// same set of octets, including the checksum field. If the result
|
// same set of octets, including the checksum field. If the result
|
||||||
// is all 1 bits (-0 in 1's complement arithmetic), the check
|
// is all 1 bits (-0 in 1's complement arithmetic), the check
|
||||||
// succeeds.
|
// succeeds.
|
||||||
return b.CalculateChecksum() == 0xffff
|
//return b.CalculateChecksum() == 0xffff
|
||||||
|
return checksum.Checksum(b[:b.HeaderLength()], 0) == 0xffff
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsV4MulticastAddress determines if the provided address is an IPv4 multicast
|
// IsV4MulticastAddress determines if the provided address is an IPv4 multicast
|
||||||
|
|
|
||||||
|
|
@ -351,6 +351,7 @@ func (b TCP) SetUrgentPointer(urgentPointer uint16) {
|
||||||
// and the checksum of the segment data.
|
// and the checksum of the segment data.
|
||||||
func (b TCP) CalculateChecksum(partialChecksum uint16) uint16 {
|
func (b TCP) CalculateChecksum(partialChecksum uint16) uint16 {
|
||||||
// Calculate the rest of the checksum.
|
// Calculate the rest of the checksum.
|
||||||
|
// return checksum.Checksum(b[:b.DataOffset()], partialChecksum)
|
||||||
xsum := checksum.Checksum(b[:TCPChecksumOffset], partialChecksum)
|
xsum := checksum.Checksum(b[:TCPChecksumOffset], partialChecksum)
|
||||||
xsum = checksum.Checksum(b[TCPChecksumOffset+2:b.DataOffset()], xsum)
|
xsum = checksum.Checksum(b[TCPChecksumOffset+2:b.DataOffset()], xsum)
|
||||||
return xsum
|
return xsum
|
||||||
|
|
@ -360,7 +361,8 @@ func (b TCP) CalculateChecksum(partialChecksum uint16) uint16 {
|
||||||
func (b TCP) IsChecksumValid(src, dst tcpip.Address, payloadChecksum, payloadLength uint16) bool {
|
func (b TCP) IsChecksumValid(src, dst tcpip.Address, payloadChecksum, payloadLength uint16) bool {
|
||||||
xsum := PseudoHeaderChecksum(TCPProtocolNumber, src.AsSlice(), dst.AsSlice(), uint16(b.DataOffset())+payloadLength)
|
xsum := PseudoHeaderChecksum(TCPProtocolNumber, src.AsSlice(), dst.AsSlice(), uint16(b.DataOffset())+payloadLength)
|
||||||
xsum = checksum.Combine(xsum, payloadChecksum)
|
xsum = checksum.Combine(xsum, payloadChecksum)
|
||||||
return b.CalculateChecksum(xsum) == 0xffff
|
// return b.CalculateChecksum(xsum) == 0xffff
|
||||||
|
return checksum.Checksum(b[:b.DataOffset()], xsum) == 0xffff
|
||||||
}
|
}
|
||||||
|
|
||||||
// Options returns a slice that holds the unparsed TCP options in the segment.
|
// Options returns a slice that holds the unparsed TCP options in the segment.
|
||||||
|
|
|
||||||
|
|
@ -114,8 +114,9 @@ func (b UDP) SetLength(length uint16) {
|
||||||
// checksum of the network-layer pseudo-header and the checksum of the payload.
|
// checksum of the network-layer pseudo-header and the checksum of the payload.
|
||||||
func (b UDP) CalculateChecksum(partialChecksum uint16) uint16 {
|
func (b UDP) CalculateChecksum(partialChecksum uint16) uint16 {
|
||||||
// Calculate the rest of the checksum.\
|
// Calculate the rest of the checksum.\
|
||||||
|
// return checksum.Checksum(b[:UDPMinimumSize], partialChecksum)
|
||||||
xsum := checksum.Checksum(b[:udpChecksum], partialChecksum)
|
xsum := checksum.Checksum(b[:udpChecksum], partialChecksum)
|
||||||
xsum = checksum.Checksum(b[udpChecksum+2:], xsum)
|
xsum = checksum.Checksum(b[udpChecksum+2:UDPMinimumSize], xsum)
|
||||||
return xsum
|
return xsum
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -123,7 +124,7 @@ func (b UDP) CalculateChecksum(partialChecksum uint16) uint16 {
|
||||||
func (b UDP) IsChecksumValid(src, dst tcpip.Address, payloadChecksum uint16) bool {
|
func (b UDP) IsChecksumValid(src, dst tcpip.Address, payloadChecksum uint16) bool {
|
||||||
xsum := PseudoHeaderChecksum(UDPProtocolNumber, dst.AsSlice(), src.AsSlice(), b.Length())
|
xsum := PseudoHeaderChecksum(UDPProtocolNumber, dst.AsSlice(), src.AsSlice(), b.Length())
|
||||||
xsum = checksum.Combine(xsum, payloadChecksum)
|
xsum = checksum.Combine(xsum, payloadChecksum)
|
||||||
return b.CalculateChecksum(xsum) == 0xffff
|
return checksum.Checksum(b[:UDPMinimumSize], xsum) == 0xffff
|
||||||
}
|
}
|
||||||
|
|
||||||
// Encode encodes all the fields of the UDP header.
|
// Encode encodes all the fields of the UDP header.
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,7 @@ func (f *TCPForwarder) HandlePacket(id stack.TransportEndpointID, pkt *stack.Pac
|
||||||
ipHdr.SetDestinationAddressWithChecksumUpdate(ipHdr.SourceAddress())
|
ipHdr.SetDestinationAddressWithChecksumUpdate(ipHdr.SourceAddress())
|
||||||
ipHdr.SetSourceAddressWithChecksumUpdate(inet4LoopbackAddress)
|
ipHdr.SetSourceAddressWithChecksumUpdate(inet4LoopbackAddress)
|
||||||
tcpHdr := header.TCP(pkt.TransportHeader().Slice())
|
tcpHdr := header.TCP(pkt.TransportHeader().Slice())
|
||||||
|
tcpHdr.SetChecksum(0)
|
||||||
tcpHdr.SetChecksum(^checksum.Checksum(tcpHdr.Payload(), tcpHdr.CalculateChecksum(
|
tcpHdr.SetChecksum(^checksum.Checksum(tcpHdr.Payload(), tcpHdr.CalculateChecksum(
|
||||||
header.PseudoHeaderChecksum(header.TCPProtocolNumber, ipHdr.SourceAddress(), ipHdr.DestinationAddress(), ipHdr.PayloadLength()),
|
header.PseudoHeaderChecksum(header.TCPProtocolNumber, ipHdr.SourceAddress(), ipHdr.DestinationAddress(), ipHdr.PayloadLength()),
|
||||||
)))
|
)))
|
||||||
|
|
@ -64,6 +65,7 @@ func (f *TCPForwarder) HandlePacket(id stack.TransportEndpointID, pkt *stack.Pac
|
||||||
ipHdr.SetDestinationAddress(ipHdr.SourceAddress())
|
ipHdr.SetDestinationAddress(ipHdr.SourceAddress())
|
||||||
ipHdr.SetSourceAddress(inet6LoopbackAddress)
|
ipHdr.SetSourceAddress(inet6LoopbackAddress)
|
||||||
tcpHdr := header.TCP(pkt.TransportHeader().Slice())
|
tcpHdr := header.TCP(pkt.TransportHeader().Slice())
|
||||||
|
tcpHdr.SetChecksum(0)
|
||||||
tcpHdr.SetChecksum(^checksum.Checksum(tcpHdr.Payload(), tcpHdr.CalculateChecksum(
|
tcpHdr.SetChecksum(^checksum.Checksum(tcpHdr.Payload(), tcpHdr.CalculateChecksum(
|
||||||
header.PseudoHeaderChecksum(header.TCPProtocolNumber, ipHdr.SourceAddress(), ipHdr.DestinationAddress(), ipHdr.PayloadLength()),
|
header.PseudoHeaderChecksum(header.TCPProtocolNumber, ipHdr.SourceAddress(), ipHdr.DestinationAddress(), ipHdr.PayloadLength()),
|
||||||
)))
|
)))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue