]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
Begin generic Bind implementation
authorMathias Hall-Andersen <mathias@hall-andersen.dk>
Sat, 18 Nov 2017 23:21:58 +0000 (00:21 +0100)
committerMathias Hall-Andersen <mathias@hall-andersen.dk>
Sat, 18 Nov 2017 23:21:58 +0000 (00:21 +0100)
src/conn.go
src/conn_default.go
src/conn_linux.go
src/uapi.go

index 74bb075699cd71fa448f9bf6800db9d3edbc30be..5b40a238351e318ae51bdf0a89cbaf52ac893990 100644 (file)
@@ -24,11 +24,9 @@ type Bind interface {
  */
 type Endpoint interface {
        ClearSrc()           // clears the source address
-       ClearDst()           // clears the destination address
        SrcToString() string // returns the local source address (ip:port)
        DstToString() string // returns the destination address (ip:port)
        DstToBytes() []byte  // used for mac2 cookie calculations
-       SetDst(string) error // used for manually setting the endpoint (uapi)
        DstIP() net.IP
        SrcIP() net.IP
 }
@@ -92,7 +90,7 @@ func UpdateUDPListener(device *Device) error {
                // bind to new port
 
                var err error
-               netc.bind, netc.port, err = CreateUDPBind(netc.port)
+               netc.bind, netc.port, err = CreateBind(netc.port)
                if err != nil {
                        netc.bind = nil
                        return err
index 31cab5c07a075782f90f847a49fe02a3bfd11d58..34168c6accea756a78575232233082a2d8810525 100644 (file)
@@ -13,11 +13,68 @@ import (
  * See conn_linux.go for an implementation on the linux platform.
  */
 
-type Endpoint *net.UDPAddr
+type NativeBind struct {
+       ipv4 *net.UDPConn
+       ipv6 *net.UDPConn
+}
+
+type NativeEndpoint net.UDPAddr
+
+var _ Bind = (*NativeBind)(nil)
+var _ Endpoint = (*NativeEndpoint)(nil)
+
+func CreateEndpoint(s string) (Endpoint, error) {
+       addr, err := parseEndpoint(s)
+       return (addr).(*NativeEndpoint), err
+}
+
+func (_ *NativeEndpoint) ClearSrc() {}
+
+func (e *NativeEndpoint) DstIP() net.IP {
+       return (*net.UDPAddr)(e).IP
+}
+
+func (e *NativeEndpoint) SrcIP() net.IP {
+       return nil // not supported
+}
 
-type NativeBind *net.UDPConn
+func (e *NativeEndpoint) DstToBytes() []byte {
+       addr := (*net.UDPAddr)(e)
+       out := addr.IP.([]byte)
+       out = append(out, byte(addr.Port&0xff))
+       out = append(out, byte((addr.Port>>8)&0xff))
+       return out
+}
 
-func CreateUDPBind(port uint16) (UDPBind, uint16, error) {
+func (e *NativeEndpoint) DstToString() string {
+       return (*net.UDPAddr)(e).String()
+}
+
+func (e *NativeEndpoint) SrcToString() string {
+       return ""
+}
+
+func listenNet(net string, port int) (*net.UDPConn, int, error) {
+
+       // listen
+
+       conn, err := net.ListenUDP("udp", &UDPAddr{Port: port})
+       if err != nil {
+               return nil, 0, err
+       }
+
+       // retrieve port
+
+       laddr := conn.LocalAddr()
+       uaddr, _ = net.ResolveUDPAddr(
+               laddr.Network(),
+               laddr.String(),
+       )
+
+       return conn, uaddr.Port, nil
+}
+
+func CreateBind(port uint16) (Bind, uint16, error) {
 
        // listen
 
@@ -38,9 +95,3 @@ func CreateUDPBind(port uint16) (UDPBind, uint16, error) {
        )
        return uaddr.Port
 }
-
-func (_ Endpoint) ClearSrc() {}
-
-func SetMark(conn *net.UDPConn, value uint32) error {
-       return nil
-}
index 46f873fa5f86f7c1fe6fe53ae0ce55234a78026f..cdba74f9156e072cd0ee212afed50c0573dab578 100644 (file)
@@ -50,11 +50,44 @@ func ntohs(val uint16) uint16 {
        return binary.BigEndian.Uint16((*tmp)[:])
 }
 
-func NewEndpoint() Endpoint {
-       return &NativeEndpoint{}
+func CreateEndpoint(s string) (Endpoint, error) {
+       var end NativeEndpoint
+       addr, err := parseEndpoint(s)
+       if err != nil {
+               return nil, err
+       }
+
+       ipv4 := addr.IP.To4()
+       if ipv4 != nil {
+               dst := (*unix.RawSockaddrInet4)(unsafe.Pointer(&end.dst))
+               dst.Family = unix.AF_INET
+               dst.Port = htons(uint16(addr.Port))
+               dst.Zero = [8]byte{}
+               copy(dst.Addr[:], ipv4)
+               end.ClearSrc()
+               return &end, nil
+       }
+
+       ipv6 := addr.IP.To16()
+       if ipv6 != nil {
+               zone, err := zoneToUint32(addr.Zone)
+               if err != nil {
+                       return nil, err
+               }
+               dst := &end.dst
+               dst.Family = unix.AF_INET6
+               dst.Port = htons(uint16(addr.Port))
+               dst.Flowinfo = 0
+               dst.Scope_id = zone
+               copy(dst.Addr[:], ipv6[:])
+               end.ClearSrc()
+               return &end, nil
+       }
+
+       return nil, errors.New("Failed to recognize IP address format")
 }
 
-func CreateUDPBind(port uint16) (Bind, uint16, error) {
+func CreateBind(port uint16) (Bind, uint16, error) {
        var err error
        var bind NativeBind
 
@@ -325,42 +358,6 @@ func create6(port uint16) (int, uint16, error) {
        return fd, uint16(addr.Port), err
 }
 
-func (end *NativeEndpoint) SetDst(s string) error {
-       addr, err := parseEndpoint(s)
-       if err != nil {
-               return err
-       }
-
-       ipv4 := addr.IP.To4()
-       if ipv4 != nil {
-               dst := (*unix.RawSockaddrInet4)(unsafe.Pointer(&end.dst))
-               dst.Family = unix.AF_INET
-               dst.Port = htons(uint16(addr.Port))
-               dst.Zero = [8]byte{}
-               copy(dst.Addr[:], ipv4)
-               end.ClearSrc()
-               return nil
-       }
-
-       ipv6 := addr.IP.To16()
-       if ipv6 != nil {
-               zone, err := zoneToUint32(addr.Zone)
-               if err != nil {
-                       return err
-               }
-               dst := &end.dst
-               dst.Family = unix.AF_INET6
-               dst.Port = htons(uint16(addr.Port))
-               dst.Flowinfo = 0
-               dst.Scope_id = zone
-               copy(dst.Addr[:], ipv6[:])
-               end.ClearSrc()
-               return nil
-       }
-
-       return errors.New("Failed to recognize IP address format")
-}
-
 func send6(sock int, end *NativeEndpoint, buff []byte) error {
 
        // construct message header
index 670ecc4e8296aa71218436876a833361cb202279..dc8be6648b6c6acaa943cfa22de1c6bdbd19103b 100644 (file)
@@ -260,9 +260,8 @@ func ipcSetOperation(device *Device, socket *bufio.ReadWriter) *IPCError {
                                err := func() error {
                                        peer.mutex.Lock()
                                        defer peer.mutex.Unlock()
-
-                                       endpoint := NewEndpoint()
-                                       if err := endpoint.SetDst(value); err != nil {
+                                       endpoint, err := CreateEndpoint(value)
+                                       if err != nil {
                                                return err
                                        }
                                        peer.endpoint = endpoint