mirror of https://github.com/XTLS/Xray-core
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.2 KiB
46 lines
1.2 KiB
//go:build freebsd |
|
// +build freebsd |
|
|
|
package udp |
|
|
|
import ( |
|
"bytes" |
|
"encoding/gob" |
|
"io" |
|
|
|
"github.com/xtls/xray-core/common/errors" |
|
"github.com/xtls/xray-core/common/net" |
|
"github.com/xtls/xray-core/transport/internet" |
|
) |
|
|
|
// RetrieveOriginalDest from stored laddr, caddr |
|
func RetrieveOriginalDest(oob []byte) net.Destination { |
|
dec := gob.NewDecoder(bytes.NewBuffer(oob)) |
|
var la, ra net.UDPAddr |
|
dec.Decode(&la) |
|
dec.Decode(&ra) |
|
ip, port, err := internet.OriginalDst(&la, &ra) |
|
if err != nil { |
|
return net.Destination{} |
|
} |
|
return net.UDPDestination(net.IPAddress(ip), net.Port(port)) |
|
} |
|
|
|
// ReadUDPMsg stores laddr, caddr for later use |
|
func ReadUDPMsg(conn *net.UDPConn, payload []byte, oob []byte) (int, int, int, *net.UDPAddr, error) { |
|
nBytes, addr, err := conn.ReadFromUDP(payload) |
|
var buf bytes.Buffer |
|
enc := gob.NewEncoder(&buf) |
|
udpAddr, ok := conn.LocalAddr().(*net.UDPAddr) |
|
if !ok { |
|
return 0, 0, 0, nil, errors.New("invalid local address") |
|
} |
|
if addr == nil { |
|
return 0, 0, 0, nil, errors.New("invalid remote address") |
|
} |
|
enc.Encode(udpAddr) |
|
enc.Encode(addr) |
|
var reader io.Reader = &buf |
|
noob, _ := reader.Read(oob) |
|
return nBytes, noob, 0, addr, err |
|
}
|
|
|