- Notifications
You must be signed in to change notification settings - Fork7
seqs: the hottest, most idiomatic userspace TCP/IP implementation on the internet. lwip in go basically
License
soypat/seqs
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
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 implementnet.Conn andnet.Listener interfaces. See
stacks/tcpconn.go
- HTTP: Algorithm to reuse heap memory between requests and avoid allocations. See
httpx
package - NTP client for resolving time offset to a NTP server
This package may be superceded byhttps://github.com/soypat/lneto.
Rest easy, the high-level API ofseqs
will be able to make use oflneto
, so this package will be supported in the future.
Low level bits ofseqs
may break or be completely removed such as anything insideeth
package.
Below is a list of future proof APIs in seqs (their internal functioning is subject to change):
stacks.TCPConn
stacks.TCPListener
stacks.DNSClient
stacks.DHCPClient
stacks.NTPClient
stacks.PortStack
- HandleEth, RecvEth methods will remain. Open* and Close* methods will remain. May require different initialization.
Use above APIs if you plan on using most up to date version ofseqs
in the future.
seqs has accumulated technical debt due to its design.lneto
is being designed with ease of testing as a priority.lneto
features:
- Zero copy package processing for performance gains
- Packet framing design
- Variable length headers included in frame type logic, no longer part of client/server implementation
- Huge reduction in stack memory usage. Much easier to avoid heap usage
- Early stack implementations are shown to be much simpler to write and read by humans
- Client and Server logic is moved closer to frame logic, better separation of responsibility
// stack works by having access to Ethernet packet sending// and processing. NIC is our physical link to the internet.varNICNetworkInterfaceCard=getNIC()stack:=stacks.NewPortStack(stacks.PortStackConfig{MAC:MAC,MaxOpenPortsTCP:1,MaxOpenPortsUDP:1,MTU:2048,})// stack.RecvEth should be called on receiving an ethernet packet. It should NOT block.NIC.SetRecvEthHandle(stack.RecvEth)// 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",})iferr!=nil {panic(err)}fmt.Println("Start DHCP...")for!dhcpClient.Done() {doNICPoll(NIC)time.Sleep(time.Second/10)}offeredIP:=dhcpClient.Offer()fmt.Println("got offer:",offeredIP)stack.SetAddr(offeredIP)
How to useseqs
go mod download github.com/soypat/seqs@latest
Beforeseqs
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.
About
seqs: the hottest, most idiomatic userspace TCP/IP implementation on the internet. lwip in go basically