Tcp buffer bug fix (#79)

* start working on tracking down tcp buffer bug

* mtu refactor

* modularize test

* more precise testing

* tests fail, but is it the failure we are looking for?

* fix typo in espradio link (#76)

* implement a new backoff abstraction (#75)

* rewrite backoff api

* rewrite tcp.Conn.Write

* keep fixing small things

* much better Conn.Read implementation

* fix critical overflow bug in internal.ConnRWBackoff

---------

Co-authored-by: Joel Wetzell <jwetzell@yahoo.com>
This commit is contained in:
Pat Whittingslow
2026-04-14 19:11:29 -03:00
committed by GitHub
parent 5bde7a9979
commit 75a812a8d7
22 changed files with 354 additions and 109 deletions
+2
View File
@@ -159,6 +159,8 @@ func (h *handlers) encapsulateNode(node *node, buf []byte, offsetIP, offsetThisF
err = nil // CLOSE error handled gracefully by deleting node.
node = nil // Node is destroyed in tryHandleError and invalidated.
}
// TODO(soypat): We have fuzz tests in place, maybe we can start returning the error up the chain to catch invalid settings at application level so that users don't have to have logs in place to understand invalid config/buffer size.
// Encapsulate should only fail with error on programmer errors.
if n > 0 {
return n, err
} else if err != nil {
+1 -1
View File
@@ -35,7 +35,7 @@ func makeHttpPayload(body string) ([]byte, error) {
}
func TestCap(t *testing.T) {
const mtu = 1500
const mtu = ethernet.MaxMTU
const httpBody = "{200,ok}"
var buf [mtu]byte
var gen ltesto.PacketGen
+1 -1
View File
@@ -79,7 +79,7 @@ func (ls *StackEthernet) Reset6(mac, gateway [6]byte, mtu, maxNodes int) error {
// It validates the configuration parameters and resets internal state.
// The connection ID is incremented on each call to invalidate existing connections.
func (ls *StackEthernet) Configure(cfg StackEthernetConfig) error {
if cfg.MTU > (math.MaxUint16-ethernet.MaxOverheadSize) || cfg.MTU < 256 {
if cfg.MTU > ethernet.MaxMTU || cfg.MTU < ethernet.MinimumMTU {
return lneto.ErrInvalidConfig
} else if cfg.MaxNodes <= 0 {
return lneto.ErrInvalidConfig
+1 -1
View File
@@ -149,7 +149,7 @@ func (sb *StackIP) Demux(carrierData []byte, offset int) error {
func (sb *StackIP) Encapsulate(carrierData []byte, offsetToIP, offsetToFrame int) (int, error) {
frame := carrierData[offsetToFrame:]
if len(frame) < 256 {
if len(frame) < ipv4.MinimumMTU {
return 0, io.ErrShortBuffer
}
ifrm, _ := ipv4.NewFrame(frame)