fix TCP checksum in internet.StackBasic; more logging

This commit is contained in:
soypat
2025-05-27 23:37:21 -03:00
parent a967f083cb
commit 20946c7e22
7 changed files with 133 additions and 35 deletions
+34 -6
View File
@@ -18,6 +18,7 @@ import (
"github.com/soypat/lneto/internal"
"github.com/soypat/lneto/internal/ltesto"
"github.com/soypat/lneto/internet"
"github.com/soypat/lneto/ipv4"
"github.com/soypat/lneto/tcp"
)
@@ -66,14 +67,14 @@ func main() {
slogger.error("tap-err", slog.String("err", err.Error()))
log.Fatal(err)
} else if nread > 0 {
debugEthPacket(nil, "IN ", buf[:nread])
err = lStack.RecvEth(buf[:nread])
if err != nil {
slogger.error("recv", slog.String("err", err.Error()), slog.Int("plen", nread))
} else {
slogger.info("recv", slog.Int("plen", nread))
}
}
nw, err := lStack.HandleEth(buf[:])
debugEthPacket(nil, "OUT", buf[:nw])
if err != nil {
slogger.error("handle", slog.String("err", err.Error()))
} else if nw > 0 {
@@ -211,10 +212,10 @@ func (ls *LinkStack) RecvEth(ethFrame []byte) (err error) {
}
etype := efrm.EtherTypeOrSize()
dstaddr := efrm.DestinationHardwareAddr()
if !efrm.IsBroadcast() && ls.mac != *dstaddr {
return fmt.Errorf("incoming %s mismatch hwaddr %s", etype.String(), net.HardwareAddr(dstaddr[:]).String())
}
var vld lneto.Validator
if !efrm.IsBroadcast() && ls.mac != *dstaddr {
goto DROP
}
efrm.ValidateSize(&vld)
if err := vld.Err(); err != nil {
return err
@@ -226,7 +227,8 @@ func (ls *LinkStack) RecvEth(ethFrame []byte) (err error) {
return h.recv(efrm.Payload(), 0)
}
}
DROP:
ls.info("LinkStack:drop-packet", slog.String("dsthw", net.HardwareAddr(dstaddr[:]).String()), slog.String("ethertype", efrm.EtherTypeOrSize().String()))
return nil
}
@@ -298,3 +300,29 @@ func (l logger) debug(msg string, attrs ...slog.Attr) {
func (l logger) trace(msg string, attrs ...slog.Attr) {
internal.LogAttrs(l.log, internal.LevelTrace, msg, attrs...)
}
func debugEthPacket(logger *slog.Logger, prefix string, b []byte) {
frm, err := ethernet.NewFrame(b)
if err != nil {
return
}
if frm.EtherTypeOrSize() != ethernet.TypeIPv4 {
return
}
ihdr, err := ipv4.NewFrame(frm.Payload())
if err != nil {
return
}
if ihdr.Protocol() != lneto.IPProtoTCP {
return
}
thdr, err := tcp.NewFrame(ihdr.Payload())
if err != nil {
return
}
fmt.Println(prefix, ihdr.String()+" TCP:"+thdr.String())
payload := thdr.Payload()
if len(payload) > 0 {
fmt.Println("PAYLOAD:", string(payload))
}
}
+9 -2
View File
@@ -39,7 +39,7 @@ func run() error {
defer sv.Close()
fmt.Println("listening on http://127.0.0.1:7070/recv and http://127.0.0.1:7070/send")
go http.ListenAndServe(":7070", sv)
misses := 0
for {
result, err := sv.HandleTap()
if err != nil {
@@ -48,7 +48,14 @@ func run() error {
if result.Failed {
return errors.New("tap failed, exit program")
} else if result.ReceivedSize == 0 && result.SentSize == 0 {
time.Sleep(200 * time.Millisecond) // No data exchanged, sleep a bit to not hog CPU.
misses++
if misses > 1000 {
time.Sleep(200 * time.Millisecond) // No data exchanged, sleep a bit to not hog CPU.
} else {
time.Sleep(50 * time.Millisecond) // No data exchanged, sleep a bit to not hog CPU.
}
} else {
misses = 0
}
}
}