From f3548296e1b6433312c8c0cbda6c0b5c6614ff41 Mon Sep 17 00:00:00 2001 From: soypat Date: Wed, 29 Nov 2023 11:49:00 -0800 Subject: [PATCH] refurbish internal netdever interface to use netip types instead of net.IP --- netdev.go | 11 ++++++----- tcpsock.go | 17 +++++++++++------ tlssock.go | 5 +++-- udpsock.go | 8 +++++--- 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/netdev.go b/netdev.go index c503e98..c0c7833 100644 --- a/netdev.go +++ b/netdev.go @@ -3,6 +3,7 @@ package net import ( + "net/netip" "time" ) @@ -48,18 +49,18 @@ type netdever interface { // GetHostByName returns the IP address of either a hostname or IPv4 // address in standard dot notation - GetHostByName(name string) (IP, error) + GetHostByName(name string) (netip.Addr, error) // GetIPAddr returns IP address assigned to the interface, either by // DHCP or statically - GetIPAddr() (IP, error) + Addr() (netip.Addr, error) // Berkely Sockets-like interface, Go-ified. See man page for socket(2), etc. Socket(domain int, stype int, protocol int) (int, error) - Bind(sockfd int, ip IP, port int) error - Connect(sockfd int, host string, ip IP, port int) error + Bind(sockfd int, ip netip.AddrPort) error + Connect(sockfd int, host string, ip netip.AddrPort) error Listen(sockfd int, backlog int) error - Accept(sockfd int, ip IP, port int) (int, error) + Accept(sockfd int, ip netip.AddrPort) (int, error) Send(sockfd int, buf []byte, flags int, deadline time.Time) (int, error) Recv(sockfd int, buf []byte, flags int, deadline time.Time) (int, error) Close(sockfd int) error diff --git a/tcpsock.go b/tcpsock.go index 4a01133..c88c268 100644 --- a/tcpsock.go +++ b/tcpsock.go @@ -7,6 +7,7 @@ package net import ( + "errors" "fmt" "internal/itoa" "io" @@ -114,7 +115,7 @@ func ResolveTCPAddr(network, address string) (*TCPAddr, error) { return nil, fmt.Errorf("Lookup of host name '%s' failed: %s", host, err) } - return &TCPAddr{IP: ip, Port: port}, nil + return &TCPAddr{IP: ip.AsSlice(), Port: port}, nil } // TCPConn is an implementation of the Conn interface for TCP network @@ -140,7 +141,7 @@ func DialTCP(network string, laddr, raddr *TCPAddr) (*TCPConn, error) { switch network { case "tcp", "tcp4": default: - return nil, fmt.Errorf("Network '%s' not supported", network) + return nil, errors.New("Network not supported: '" + network + "'") } // TINYGO: Use netdev to create TCP socket and connect @@ -150,7 +151,9 @@ func DialTCP(network string, laddr, raddr *TCPAddr) (*TCPConn, error) { } if raddr.IP.IsUnspecified() { - return nil, fmt.Errorf("Sorry, localhost isn't available on Tinygo") + return nil, errors.New("Sorry, localhost isn't available on Tinygo") + } else if len(raddr.IP) != 4 { + return nil, errors.New("only ipv4 supported") } fd, err := netdev.Socket(_AF_INET, _SOCK_STREAM, _IPPROTO_TCP) @@ -158,7 +161,8 @@ func DialTCP(network string, laddr, raddr *TCPAddr) (*TCPConn, error) { return nil, err } - if err = netdev.Connect(fd, "", raddr.IP, raddr.Port); err != nil { + raddrport := netip.AddrPortFrom(netip.AddrFrom4([4]byte(raddr.IP)), uint16(raddr.Port)) + if err = netdev.Connect(fd, "", raddrport); err != nil { netdev.Close(fd) return nil, err } @@ -244,7 +248,7 @@ type listener struct { } func (l *listener) Accept() (Conn, error) { - fd, err := netdev.Accept(l.fd, IP{}, 0) + fd, err := netdev.Accept(l.fd, netip.AddrPort{}) if err != nil { return nil, err } @@ -270,7 +274,8 @@ func listenTCP(laddr *TCPAddr) (Listener, error) { return nil, err } - err = netdev.Bind(fd, laddr.IP, laddr.Port) + laddrport := netip.AddrPortFrom(netip.AddrFrom4([4]byte(laddr.IP)), uint16(laddr.Port)) + err = netdev.Bind(fd, laddrport) if err != nil { return nil, err } diff --git a/tlssock.go b/tlssock.go index 2dae8f0..c476f0d 100644 --- a/tlssock.go +++ b/tlssock.go @@ -11,6 +11,7 @@ package net import ( "internal/itoa" "io" + "net/netip" "strconv" "time" ) @@ -61,8 +62,8 @@ func DialTLS(addr string) (*TLSConn, error) { if err != nil { return nil, err } - - if err = netdev.Connect(fd, host, IP{}, port); err != nil { + addrport := netip.AddrPortFrom(netip.Addr{}, uint16(port)) + if err = netdev.Connect(fd, host, addrport); err != nil { netdev.Close(fd) return nil, err } diff --git a/udpsock.go b/udpsock.go index 1bcda1b..a4e72ef 100644 --- a/udpsock.go +++ b/udpsock.go @@ -109,7 +109,7 @@ func ResolveUDPAddr(network, address string) (*UDPAddr, error) { return nil, fmt.Errorf("Lookup of host name '%s' failed: %s", host, err) } - return &UDPAddr{IP: ip, Port: port}, nil + return &UDPAddr{IP: ip.AsSlice(), Port: port}, nil } // UDPConn is the implementation of the Conn and PacketConn interfaces @@ -172,16 +172,18 @@ func DialUDP(network string, laddr, raddr *UDPAddr) (*UDPConn, error) { if err != nil { return nil, err } + laddrport := netip.AddrPortFrom(netip.AddrFrom4([4]byte(laddr.IP)), uint16(laddr.Port)) // Local bind - err = netdev.Bind(fd, laddr.IP, laddr.Port) + err = netdev.Bind(fd, laddrport) if err != nil { netdev.Close(fd) return nil, err } + raddrport := netip.AddrPortFrom(netip.AddrFrom4([4]byte(raddr.IP)), uint16(raddr.Port)) // Remote connect - if err = netdev.Connect(fd, "", raddr.IP, raddr.Port); err != nil { + if err = netdev.Connect(fd, "", raddrport); err != nil { netdev.Close(fd) return nil, err }