seqs
is what is commonly referred to as a userspace IP implementation. It handles:
- Ethernet protocol
- IP packet marshalling to sub-protocols:
- ARP requests and responses
- UDP packet handling
- DHCP client requests and DHCP server
- TCP connections over IP with support for multiple listeners on same port. These implement net.Conn and net.Listener interfaces. See
stacks/tcpconn.go
stack := stacks.NewPortStack(stacks.PortStackConfig{
MAC: MAC,
MaxOpenPortsTCP: 1,
MaxOpenPortsUDP: 1,
MTU: 2048,
})
// Static IP setting.
ip := netip.AddrFrom4([4]byte{192, 168, 1, 45})
stack.SetAddr(ip)
// Or can request an address via DHCP.
dhcpClient := stacks.NewDHCPClient(stack, dhcp.DefaultClientPort)
err = dhcpClient.BeginRequest(stacks.DHCPRequestConfig{
RequestedAddr: netip.AddrFrom4([4]byte{192, 168, 1, 69}),
Xid: 0x12345678,
Hostname: "tinygo-pico",
})
for !dhcpClient.Done() {
time.Sleep(time.Second / 2)
}
offeredIP := dhcpClient.Offer()
fmt.Println("got offer:", offeredIP)
stack.SetAddr(offeredIP)
How to use seqs
go mod download github.com/soypat/seqs@latest
Before seqs
there was:
ether-swtch
- First known instance of a (barely) working TCP/IP stack in Go working on embedded systems, circa June 2021. Could blink an Arduino UNO's LED via HTTP (!). Famously bad design, code, performance, readability.dgrams
- Library prepared for Pico W's wifi chip. Already shows similarities withseqs
. Circa May 2023.