Skip to content

Commit

Permalink
refurbish internal netdever interface to use netip types instead of n…
Browse files Browse the repository at this point in the history
…et.IP
  • Loading branch information
soypat authored and deadprogram committed Dec 4, 2023
1 parent 7c11b88 commit f354829
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 16 deletions.
11 changes: 6 additions & 5 deletions netdev.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
package net

import (
"net/netip"
"time"
)

Expand Down Expand Up @@ -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
Expand Down
17 changes: 11 additions & 6 deletions tcpsock.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
package net

import (
"errors"
"fmt"
"internal/itoa"
"io"
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -150,15 +151,18 @@ 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)
if err != nil {
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
}
Expand Down Expand Up @@ -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
}
Expand All @@ -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
}
Expand Down
5 changes: 3 additions & 2 deletions tlssock.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ package net
import (
"internal/itoa"
"io"
"net/netip"
"strconv"
"time"
)
Expand Down Expand Up @@ -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
}
Expand Down
8 changes: 5 additions & 3 deletions udpsock.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
}
Expand Down

0 comments on commit f354829

Please sign in to comment.