From 9ebab57c417d4fd19db6cf69f920a3adb1a1e092 Mon Sep 17 00:00:00 2001 From: Mathias Hall-Andersen Date: Sun, 19 Nov 2017 13:14:15 +0100 Subject: [PATCH] Implemented missing methods for Bind and Endpoint --- src/conn_default.go | 72 +++++++++++++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 19 deletions(-) diff --git a/src/conn_default.go b/src/conn_default.go index 34168c6..5b73c90 100644 --- a/src/conn_default.go +++ b/src/conn_default.go @@ -25,7 +25,7 @@ var _ Endpoint = (*NativeEndpoint)(nil) func CreateEndpoint(s string) (Endpoint, error) { addr, err := parseEndpoint(s) - return (addr).(*NativeEndpoint), err + return (*NativeEndpoint)(addr), err } func (_ *NativeEndpoint) ClearSrc() {} @@ -40,7 +40,7 @@ func (e *NativeEndpoint) SrcIP() net.IP { func (e *NativeEndpoint) DstToBytes() []byte { addr := (*net.UDPAddr)(e) - out := addr.IP.([]byte) + out := addr.IP out = append(out, byte(addr.Port&0xff)) out = append(out, byte((addr.Port>>8)&0xff)) return out @@ -54,11 +54,11 @@ func (e *NativeEndpoint) SrcToString() string { return "" } -func listenNet(net string, port int) (*net.UDPConn, int, error) { +func listenNet(network string, port int) (*net.UDPConn, int, error) { // listen - conn, err := net.ListenUDP("udp", &UDPAddr{Port: port}) + conn, err := net.ListenUDP(network, &net.UDPAddr{Port: port}) if err != nil { return nil, 0, err } @@ -66,32 +66,66 @@ func listenNet(net string, port int) (*net.UDPConn, int, error) { // retrieve port laddr := conn.LocalAddr() - uaddr, _ = net.ResolveUDPAddr( + uaddr, err := net.ResolveUDPAddr( laddr.Network(), laddr.String(), ) - + if err != nil { + return nil, 0, err + } return conn, uaddr.Port, nil } -func CreateBind(port uint16) (Bind, uint16, error) { +func CreateBind(uport uint16) (Bind, uint16, error) { + var err error + var bind NativeBind - // listen + port := int(uport) - addr := UDPAddr{ - Port: int(port), - } - conn, err := net.ListenUDP("udp", &addr) + bind.ipv4, port, err = listenNet("udp4", port) if err != nil { return nil, 0, err } - // retrieve port + bind.ipv6, port, err = listenNet("udp6", port) + if err != nil { + bind.ipv4.Close() + return nil, 0, err + } - laddr := conn.LocalAddr() - uaddr, _ = net.ResolveUDPAddr( - laddr.Network(), - laddr.String(), - ) - return uaddr.Port + return &bind, uint16(port), nil +} + +func (bind *NativeBind) Close() error { + err1 := bind.ipv4.Close() + err2 := bind.ipv6.Close() + if err1 != nil { + return err1 + } + return err2 +} + +func (bind *NativeBind) ReceiveIPv4(buff []byte) (int, Endpoint, error) { + n, endpoint, err := bind.ipv4.ReadFromUDP(buff) + return n, (*NativeEndpoint)(endpoint), err +} + +func (bind *NativeBind) ReceiveIPv6(buff []byte) (int, Endpoint, error) { + n, endpoint, err := bind.ipv6.ReadFromUDP(buff) + return n, (*NativeEndpoint)(endpoint), err +} + +func (bind *NativeBind) Send(buff []byte, endpoint Endpoint) error { + var err error + nend := endpoint.(*NativeEndpoint) + if nend.IP.To16() != nil { + _, err = bind.ipv6.WriteToUDP(buff, (*net.UDPAddr)(nend)) + } else { + _, err = bind.ipv4.WriteToUDP(buff, (*net.UDPAddr)(nend)) + } + return err +} + +func (bind *NativeBind) SetMark(_ uint32) error { + return nil }