changes to TCP stack to enable xnet functionality

This commit is contained in:
soypat
2025-08-16 15:17:46 -03:00
parent c2995383da
commit 9cf4e35d2e
10 changed files with 124 additions and 19 deletions
+2 -2
View File
@@ -249,7 +249,7 @@ func (stack *Stack) OpenTCPListener(port uint16) (*internet.NodeTCPListener, err
func (stack *Stack) OpenPassiveTCP(port uint16, iss tcp.Value) (*tcp.Conn, error) {
mtu := stack.ethernet.MTU()
conn := new(tcp.Conn)
err := conn.Configure(&tcp.ConnConfig{
err := conn.Configure(tcp.ConnConfig{
RxBuf: make([]byte, mtu),
TxBuf: make([]byte, mtu),
TxPacketQueueSize: 3,
@@ -296,7 +296,7 @@ func (naiveTCPPool) GetTCP() (*tcp.Conn, tcp.Value) {
rand.Read(buf[:])
randVal := binary.LittleEndian.Uint32(buf[:])
var conn tcp.Conn
err := conn.Configure(&tcp.ConnConfig{
err := conn.Configure(tcp.ConnConfig{
RxBuf: make([]byte, 1024),
TxBuf: make([]byte, 1024),
TxPacketQueueSize: 3,
+1 -1
View File
@@ -182,7 +182,7 @@ func NewEthernetTCPStack(ourMAC, gwMAC [6]byte, ip netip.AddrPort, mtu uint16, s
lport: 0,
})
var conn tcp.Conn
err = conn.Configure(&tcp.ConnConfig{
err = conn.Configure(tcp.ConnConfig{
RxBuf: make([]byte, mtu),
TxBuf: make([]byte, mtu),
TxPacketQueueSize: 3,
+1
View File
@@ -32,6 +32,7 @@ func run() error {
flagInterface = "tap0"
)
flag.StringVar(&flagInterface, "i", flagInterface, "Interface to select. tap* creates a tap interface. Any other name will create a bridge to the name of the interface i.e: 'enp7s0', 'wlp8s0', 'lo'")
flag.Parse()
var (
flagNet = "192.168.10.1/24"
flagiface = "tap0"
+50 -1
View File
@@ -12,8 +12,10 @@ import (
"time"
"github.com/soypat/lneto/dns"
"github.com/soypat/lneto/http/httpraw"
"github.com/soypat/lneto/internal"
"github.com/soypat/lneto/internal/ltesto"
"github.com/soypat/lneto/internet/pcap"
"github.com/soypat/lneto/x/xnet"
)
@@ -35,9 +37,11 @@ func run() (err error) {
flagHostToResolve = ""
flagRequestedIP = ""
flagDoNTP = false
flagHTTPGet = false
)
flag.BoolVar(&flagHTTPGet, "httpget", flagHTTPGet, "Do an HTTP GET request ")
flag.StringVar(&flagInterface, "i", flagInterface, "Interface to use. Either tap* or the name of an existing interface to bridge to.")
flag.BoolVar(&flagUseHTTP, "http", flagUseHTTP, "Use HTTP tap interface.")
flag.BoolVar(&flagUseHTTP, "ihttp", flagUseHTTP, "Use HTTP tap interface.")
flag.StringVar(&flagHostToResolve, "host", flagHostToResolve, "Hostname to resolve via DNS.")
flag.StringVar(&flagRequestedIP, "addr", flagRequestedIP, "IP address to request via DHCP.")
flag.BoolVar(&flagDoNTP, "ntp", flagDoNTP, "Do NTP round and print result time")
@@ -89,6 +93,9 @@ func run() (err error) {
RandSeed: softRand,
HardwareAddress: brHW,
MTU: uint16(mtu),
MaxTCPConns: 1,
TCPBufferSizeTx: 2048,
TCPBufferSizeRx: 2048,
})
if err != nil {
return err
@@ -97,12 +104,17 @@ func run() (err error) {
go func() {
lastAction := time.Now()
buf := make([]byte, mtu)
var cap pcap.PacketBreakdown
for {
clear(buf)
nwrite, err := stack.Encapsulate(buf[:], 0)
if err != nil {
fmt.Println("ERR:ENCAPSULATE", err)
} else if nwrite > 0 {
frames, err := cap.CaptureEthernet(nil, buf[:nwrite], 0)
if len(frames) > 0 {
fmt.Println("OUT", frames)
}
n, err := iface.Write(buf[:nwrite])
if err != nil {
log.Fatal("groutine encapsulate:", err)
@@ -179,6 +191,43 @@ func run() (err error) {
return fmt.Errorf("DNS of host %q failed: %w", flagHostToResolve, err)
}
fmt.Printf("DNS resolution of %q complete and resolved to %v\n", flagHostToResolve, addrs)
if flagHTTPGet {
var hdr httpraw.Header
hdr.SetMethod("GET")
hdr.SetRequestURI("/")
hdr.SetProtocol("HTTP/1.1")
hdr.Set("Host", flagHostToResolve)
hdr.Set("User-Agent", "lneto")
hdr.Set("Accept-Language", "en-US,en;q=0.5")
req, err := hdr.AppendRequest(nil)
if err != nil {
return err
}
target := netip.AddrPortFrom(addrs[0], 80)
conn, err := rstack.DoDialTCP(uint16(softRand&0xefff)+1024, target, internetTimeout, internetRetries)
if err != nil {
return fmt.Errorf("TCP failed: %w", err)
}
conn.SetDeadline(time.Now().Add(internetTimeout))
_, err = conn.Write(req)
if err != nil {
return err
}
rxbuf := make([]byte, 2048)
var page []byte
for {
var n int
n, err = conn.Read(rxbuf)
page = append(page, rxbuf[:n]...)
if err != nil {
break
}
}
if len(page) == 0 {
return err
}
os.Stdout.Write(page)
}
return nil
}