github.com/apernet/sing-tun@v0.2.6-0.20240323130332-b9f6511036ad/internal/clashtcpip/udp.go (about) 1 package clashtcpip 2 3 import ( 4 "encoding/binary" 5 ) 6 7 const UDPHeaderSize = 8 8 9 type UDPPacket []byte 10 11 func (p UDPPacket) Length() uint16 { 12 return binary.BigEndian.Uint16(p[4:]) 13 } 14 15 func (p UDPPacket) SetLength(length uint16) { 16 binary.BigEndian.PutUint16(p[4:], length) 17 } 18 19 func (p UDPPacket) SourcePort() uint16 { 20 return binary.BigEndian.Uint16(p) 21 } 22 23 func (p UDPPacket) SetSourcePort(port uint16) { 24 binary.BigEndian.PutUint16(p, port) 25 } 26 27 func (p UDPPacket) DestinationPort() uint16 { 28 return binary.BigEndian.Uint16(p[2:]) 29 } 30 31 func (p UDPPacket) SetDestinationPort(port uint16) { 32 binary.BigEndian.PutUint16(p[2:], port) 33 } 34 35 func (p UDPPacket) Payload() []byte { 36 return p[UDPHeaderSize:p.Length()] 37 } 38 39 func (p UDPPacket) Checksum() uint16 { 40 return binary.BigEndian.Uint16(p[6:]) 41 } 42 43 func (p UDPPacket) SetChecksum(sum [2]byte) { 44 p[6] = sum[0] 45 p[7] = sum[1] 46 } 47 48 func (p UDPPacket) OffloadChecksum() { 49 p.SetChecksum(zeroChecksum) 50 } 51 52 func (p UDPPacket) ResetChecksum(psum uint32) { 53 p.SetChecksum(zeroChecksum) 54 p.SetChecksum(Checksum(psum, p)) 55 } 56 57 func (p UDPPacket) Valid() bool { 58 return len(p) >= UDPHeaderSize && uint16(len(p)) >= p.Length() 59 }