1//go:build freebsd 2// +build freebsd 3 4package udp 5 6import ( 7 "bytes" 8 "encoding/gob" 9 "io" 10 11 "github.com/xtls/xray-core/common/net" 12 "github.com/xtls/xray-core/transport/internet" 13) 14 15// RetrieveOriginalDest from stored laddr, caddr 16func RetrieveOriginalDest(oob []byte) net.Destination { 17 dec := gob.NewDecoder(bytes.NewBuffer(oob)) 18 var la, ra net.UDPAddr 19 dec.Decode(&la) 20 dec.Decode(&ra) 21 ip, port, err := internet.OriginalDst(&la, &ra) 22 if err != nil { 23 return net.Destination{} 24 } 25 return net.UDPDestination(net.IPAddress(ip), net.Port(port)) 26} 27 28// ReadUDPMsg stores laddr, caddr for later use 29func ReadUDPMsg(conn *net.UDPConn, payload []byte, oob []byte) (int, int, int, *net.UDPAddr, error) { 30 nBytes, addr, err := conn.ReadFromUDP(payload) 31 var buf bytes.Buffer 32 enc := gob.NewEncoder(&buf) 33 enc.Encode(conn.LocalAddr().(*net.UDPAddr)) 34 enc.Encode(addr) 35 var reader io.Reader = &buf 36 noob, _ := reader.Read(oob) 37 return nBytes, noob, 0, addr, err 38} 39