ping: Add comments
This commit is contained in:
parent
c089ffbd6c
commit
06ddb3e0a7
3 changed files with 11 additions and 7 deletions
|
|
@ -335,7 +335,7 @@ func (b IPv4) FragmentOffset() uint16 {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b IPv4) FragmentOffsetDarwinRaw() uint16 {
|
func (b IPv4) FragmentOffsetDarwinRaw() uint16 {
|
||||||
return binary.NativeEndian.Uint16(b[flagsFO:]) << 3
|
return common.NativeEndian.Uint16(b[flagsFO:]) << 3
|
||||||
}
|
}
|
||||||
|
|
||||||
// TotalLength returns the "total length" field of the IPv4 header.
|
// TotalLength returns the "total length" field of the IPv4 header.
|
||||||
|
|
@ -344,7 +344,7 @@ func (b IPv4) TotalLength() uint16 {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b IPv4) TotalLengthDarwinRaw() uint16 {
|
func (b IPv4) TotalLengthDarwinRaw() uint16 {
|
||||||
return binary.NativeEndian.Uint16(b[IPv4TotalLenOffset:]) + uint16(b.HeaderLength())
|
return common.NativeEndian.Uint16(b[IPv4TotalLenOffset:]) + uint16(b.HeaderLength())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checksum returns the checksum field of the IPv4 header.
|
// Checksum returns the checksum field of the IPv4 header.
|
||||||
|
|
@ -441,7 +441,7 @@ func (b IPv4) SetTotalLength(totalLength uint16) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b IPv4) SetTotalLengthDarwinRaw(totalLength uint16) {
|
func (b IPv4) SetTotalLengthDarwinRaw(totalLength uint16) {
|
||||||
binary.NativeEndian.PutUint16(b[IPv4TotalLenOffset:], totalLength)
|
common.NativeEndian.PutUint16(b[IPv4TotalLenOffset:], totalLength)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetChecksum sets the checksum field of the IPv4 header.
|
// SetChecksum sets the checksum field of the IPv4 header.
|
||||||
|
|
@ -458,7 +458,7 @@ func (b IPv4) SetFlagsFragmentOffset(flags uint8, offset uint16) {
|
||||||
|
|
||||||
func (b IPv4) SetFlagsFragmentOffsetDarwinRaw(flags uint8, offset uint16) {
|
func (b IPv4) SetFlagsFragmentOffsetDarwinRaw(flags uint8, offset uint16) {
|
||||||
v := (uint16(flags) << 13) | (offset >> 3)
|
v := (uint16(flags) << 13) | (offset >> 3)
|
||||||
binary.NativeEndian.PutUint16(b[flagsFO:], v)
|
common.NativeEndian.PutUint16(b[flagsFO:], v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetID sets the identification field.
|
// SetID sets the identification field.
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
package ping
|
package ping
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/sagernet/sing/common"
|
||||||
|
|
||||||
"golang.org/x/net/ipv6"
|
"golang.org/x/net/ipv6"
|
||||||
"golang.org/x/sys/windows"
|
"golang.org/x/sys/windows"
|
||||||
)
|
)
|
||||||
|
|
@ -36,9 +37,9 @@ func parseIPv6ControlMessage(cmsg []byte) (*ipv6.ControlMessage, error) {
|
||||||
}
|
}
|
||||||
switch cmsghdr.Type {
|
switch cmsghdr.Type {
|
||||||
case IPV6_TCLASS:
|
case IPV6_TCLASS:
|
||||||
controlMessage.TrafficClass = int(binary.NativeEndian.Uint32(cmsg[alignedSizeofCmsghdr : alignedSizeofCmsghdr+4]))
|
controlMessage.TrafficClass = int(common.NativeEndian.Uint32(cmsg[alignedSizeofCmsghdr : alignedSizeofCmsghdr+4]))
|
||||||
case IPV6_HOPLIMIT:
|
case IPV6_HOPLIMIT:
|
||||||
controlMessage.HopLimit = int(binary.NativeEndian.Uint32(cmsg[alignedSizeofCmsghdr : alignedSizeofCmsghdr+4]))
|
controlMessage.HopLimit = int(common.NativeEndian.Uint32(cmsg[alignedSizeofCmsghdr : alignedSizeofCmsghdr+4]))
|
||||||
}
|
}
|
||||||
cmsg = cmsg[msgSize:]
|
cmsg = cmsg[msgSize:]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -160,6 +160,9 @@ func (c *Conn) ReadIP(buffer *buf.Buffer) error {
|
||||||
if !c.destination.Is6() {
|
if !c.destination.Is6() {
|
||||||
ipHdr := header.IPv4(buffer.Bytes())
|
ipHdr := header.IPv4(buffer.Bytes())
|
||||||
if runtime.GOOS == "darwin" || runtime.GOOS == "ios" {
|
if runtime.GOOS == "darwin" || runtime.GOOS == "ios" {
|
||||||
|
// MacOS have different TotalLen and FragOff in ipv4 header from socket api:
|
||||||
|
// https://stackoverflow.com/questions/13829712/mac-changes-ip-total-length-field/15881825#15881825
|
||||||
|
// but in the tun api still same data format as other system
|
||||||
ipHdr.SetTotalLength(ipHdr.TotalLengthDarwinRaw())
|
ipHdr.SetTotalLength(ipHdr.TotalLengthDarwinRaw())
|
||||||
ipHdr.SetFlagsFragmentOffset(ipHdr.FlagsDarwinRaw(), ipHdr.FragmentOffsetDarwinRaw())
|
ipHdr.SetFlagsFragmentOffset(ipHdr.FlagsDarwinRaw(), ipHdr.FragmentOffsetDarwinRaw())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue