mirror of
https://github.com/soypat/lneto.git
synced 2026-08-21 15:09:05 +00:00
add dhcp failing test
This commit is contained in:
+43
-9
@@ -3,16 +3,19 @@ package main
|
||||
import (
|
||||
"crypto/rand"
|
||||
"encoding/binary"
|
||||
"flag"
|
||||
"fmt"
|
||||
"net"
|
||||
"net/netip"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/soypat/lneto"
|
||||
"github.com/soypat/lneto/arp"
|
||||
"github.com/soypat/lneto/dhcpv4"
|
||||
"github.com/soypat/lneto/ethernet"
|
||||
"github.com/soypat/lneto/internal"
|
||||
"github.com/soypat/lneto/internal/ltesto"
|
||||
"github.com/soypat/lneto/internet"
|
||||
"github.com/soypat/lneto/internet/pcap"
|
||||
@@ -28,16 +31,47 @@ func main() {
|
||||
}
|
||||
|
||||
func run() (err error) {
|
||||
br := ltesto.NewHTTPTapClient("http://127.0.0.1:7070")
|
||||
defer br.Close()
|
||||
|
||||
nicHW := br.HardwareAddr6()
|
||||
var (
|
||||
flagInterface = "tap0"
|
||||
flagUseHTTP = false
|
||||
)
|
||||
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.Parse()
|
||||
var iface ltesto.Interface
|
||||
if flagUseHTTP {
|
||||
iface = ltesto.NewHTTPTapClient("http://127.0.0.1:7070")
|
||||
} else {
|
||||
if strings.HasPrefix(flagInterface, "tap") {
|
||||
tap, err := internal.NewTap(flagInterface, netip.MustParsePrefix("192.168.1.1/24"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
iface = tap
|
||||
} else {
|
||||
bridge, err := internal.NewBridge(flagInterface)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
iface = bridge
|
||||
}
|
||||
}
|
||||
defer iface.Close()
|
||||
|
||||
nicHW, err := iface.HardwareAddress6()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
brHW := nicHW
|
||||
brHW[5]++ // We'll be using a similar HW address but with NIC specific identifier modified.
|
||||
mtu := br.MTU()
|
||||
nicAddr := br.IPPrefix()
|
||||
|
||||
mtu, err := iface.MTU()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
nicAddr, err := iface.IPMask()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Println("NIC hardware address:", net.HardwareAddr(nicHW[:]).String(), "bridgeHW:", net.HardwareAddr(brHW[:]).String(), "mtu:", mtu, "addr:", nicAddr.String())
|
||||
var stack Stack
|
||||
err = stack.Reset(brHW, nicAddr.Addr().Next(), uint16(mtu))
|
||||
@@ -64,7 +98,7 @@ func run() (err error) {
|
||||
} else {
|
||||
fmt.Println("OU", iframes)
|
||||
}
|
||||
n, err := br.Write(buf[:nwrite])
|
||||
n, err := iface.Write(buf[:nwrite])
|
||||
if err != nil {
|
||||
return err
|
||||
} else if n != nwrite {
|
||||
@@ -73,7 +107,7 @@ func run() (err error) {
|
||||
}
|
||||
|
||||
clear(buf)
|
||||
nread, err := br.Read(buf)
|
||||
nread, err := iface.Read(buf)
|
||||
if err != nil {
|
||||
return err
|
||||
} else if nread > 0 {
|
||||
|
||||
@@ -34,7 +34,7 @@ func main() {
|
||||
ip := netip.MustParseAddr(stackIP)
|
||||
tap := ltesto.NewHTTPTapClient("http://127.0.0.1:7070")
|
||||
|
||||
ippfx := tap.IPPrefix()
|
||||
ippfx, _ := tap.IPMask()
|
||||
if !ippfx.Contains(ip) {
|
||||
log.Fatal("interface does not contain stack address")
|
||||
}
|
||||
@@ -43,8 +43,8 @@ func main() {
|
||||
Level: slog.LevelDebug,
|
||||
}))
|
||||
|
||||
gatewayMAC := tap.HardwareAddr6()
|
||||
mtu := tap.MTU()
|
||||
gatewayMAC, _ := tap.HardwareAddress6()
|
||||
mtu, _ := tap.MTU()
|
||||
|
||||
var stack Stack
|
||||
err := stack.Reset(stackHWAddr, gatewayMAC, addrPort.Addr(), mtu)
|
||||
|
||||
@@ -36,7 +36,7 @@ func main() {
|
||||
ip := netip.MustParseAddr(stackIP)
|
||||
tap := ltesto.NewHTTPTapClient("http://127.0.0.1:7070")
|
||||
|
||||
ippfx := tap.IPPrefix()
|
||||
ippfx, _ := tap.IPMask()
|
||||
if !ippfx.Contains(ip) {
|
||||
log.Fatal("interface does not contain stack address")
|
||||
}
|
||||
@@ -46,8 +46,8 @@ func main() {
|
||||
}))
|
||||
|
||||
slogger := logger{lg}
|
||||
gatewayMAC := tap.HardwareAddr6()
|
||||
mtu := tap.MTU()
|
||||
gatewayMAC, _ := tap.HardwareAddress6()
|
||||
mtu, _ := tap.MTU()
|
||||
lStack, handler, err := NewEthernetTCPStack(stackHWAddr, gatewayMAC, addrPort, uint16(mtu), slogger)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
|
||||
+2
-22
@@ -5,11 +5,9 @@ import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"log"
|
||||
"log/slog"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/netip"
|
||||
"runtime"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -87,26 +85,8 @@ func run() error {
|
||||
return err
|
||||
}
|
||||
fmt.Println("listening on http://127.0.0.1:7070/recv and http://127.0.0.1:7070/send on hwaddr:", net.HardwareAddr(hwaddr[:]).String())
|
||||
go http.ListenAndServe(":7070", sv)
|
||||
const standbyDuration = 5 * time.Second
|
||||
lastHit := time.Now().Add(-standbyDuration)
|
||||
for {
|
||||
result, err := sv.HandleTap()
|
||||
if err != nil {
|
||||
slog.Error("handletap:error", slog.String("err", err.Error()), slog.Any("result", result))
|
||||
}
|
||||
if result.Failed {
|
||||
return errors.New("tap failed, exit program")
|
||||
} else if result.ReceivedSize == 0 && result.SentSize == 0 {
|
||||
if time.Since(lastHit) > standbyDuration {
|
||||
time.Sleep(5 * time.Millisecond) // Enter standby.
|
||||
} else {
|
||||
runtime.Gosched()
|
||||
}
|
||||
} else {
|
||||
lastHit = time.Now()
|
||||
}
|
||||
}
|
||||
http.ListenAndServe(":7070", sv)
|
||||
return errors.New("finished")
|
||||
}
|
||||
|
||||
func getTCPData(frames []pcap.Frame, pkt []byte) (flags tcp.Flags, src, dst uint16) {
|
||||
|
||||
Reference in New Issue
Block a user