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