Files
drivers/netdev/netdev.go
T
Scott Feldman 8238f96319 move netdev and netlink into their own packages and out of drivers
This moves the netdev/netlink namespace out of drivers and into their
own packages.  Also, defines netdev and netlink as L3/L4 and L2 OSI
layers, respectively.  Move some L3 functionality from netlink to
netdev (GetIPAddr).

For netlink, add ConnectParams for NetConnect to pass in L2 connection
parameters (ssid, pass, auth_type, etc).  Also adds connection mode
(STA, AP, etc).

For netlink, add SendEth and RecvEthFunc funcs to handle L2 send/recv of
Ethernet pkts.
2023-12-06 20:09:39 +01:00

90 lines
2.8 KiB
Go

// L3/L4 network/transport layer
package netdev
import (
"errors"
"net"
"time"
_ "unsafe" // to use go:linkname
)
const (
AF_INET = 0x2
SOCK_STREAM = 0x1
SOCK_DGRAM = 0x2
SOL_SOCKET = 0x1
SO_KEEPALIVE = 0x9
SOL_TCP = 0x6
TCP_KEEPINTVL = 0x5
IPPROTO_TCP = 0x6
IPPROTO_UDP = 0x11
// Made up, not a real IP protocol number. This is used to create a
// TLS socket on the device, assuming the device supports mbed TLS.
IPPROTO_TLS = 0xFE
F_SETFL = 0x4
)
// GethostByName() errors
var (
ErrHostUnknown = errors.New("Host unknown")
)
// Socket errors
var (
ErrFamilyNotSupported = errors.New("Address family not supported")
ErrProtocolNotSupported = errors.New("Socket protocol/type not supported")
ErrStartingDHCPClient = errors.New("Error starting DHPC client")
ErrNoMoreSockets = errors.New("No more sockets")
ErrClosingSocket = errors.New("Error closing socket")
ErrNotSupported = errors.New("Not supported")
)
// Duplicate of non-exported net.errTimeout
var ErrTimeout error = &timeoutError{}
type timeoutError struct{}
func (e *timeoutError) Error() string { return "i/o timeout" }
func (e *timeoutError) Timeout() bool { return true }
func (e *timeoutError) Temporary() bool { return true }
//go:linkname UseNetdev net.useNetdev
func UseNetdev(dev Netdever)
// Netdever is TinyGo's OSI L3/L4 network/transport layer interface. Network
// drivers implement the Netdever interface, providing a common network L3/L4
// interface to TinyGo's "net" package. net.Conn implementations (TCPConn,
// UDPConn, and TLSConn) use the Netdever interface for device I/O access.
//
// A Netdever is passed to the "net" package using UseNetdev().
//
// Just like a net.Conn, multiple goroutines may invoke methods on a Netdever
// simultaneously.
//
// NOTE: The Netdever interface is mirrored in tinygo/src/net/netdev.go.
// NOTE: If making changes to this interface, mirror the changes in
// NOTE: tinygo/src/net/netdev.go, and vice-versa.
type Netdever interface {
// GetHostByName returns the IP address of either a hostname or IPv4
// address in standard dot notation
GetHostByName(name string) (net.IP, error)
// GetIPAddr returns IP address assigned to the interface, either by
// DHCP or statically
GetIPAddr() (net.IP, 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 net.IP, port int) error
Connect(sockfd int, host string, ip net.IP, port int) error
Listen(sockfd int, backlog int) error
Accept(sockfd int, ip net.IP, port int) (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
SetSockOpt(sockfd int, level int, opt int, value interface{}) error
}