Files
lneto/definitions.go
Pat Whittingslow 75a812a8d7 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>
2026-04-14 19:11:29 -03:00

189 lines
12 KiB
Go

package lneto
// StackNode is an abstraction of a packet exchanging protocol controller. This is the building block for all protocols,
// from Ethernet to IP to TCP, practically any protocol can be expressed as a StackNode and function completely.
// Today protocols represented by StackNode also include NTP, DNS, DHCP, ARP, ICMP, UDP, mDNS.
// Do note stream based protocols like HTTP are NOT well represented with a StackNode.
type StackNode interface {
// Encapsulate writes the stack node's frame into carrierData[offsetToFrame:]
// along with any other frame or payload the stack node encapsulates.
// The returned integer is amount of bytes written such that carrierData[offsetToFrame:offsetToFrame+n]
// contains written data. Data inside carrierData[:offsetToFrame] usually contains data necessary for
// a StackNode to correctly emit valid frame data: such is the case for TCP packets which require IP
// frame data for checksum calculation. Thus StackNodes must provide fields in their own frame
// required by sub-stacknodes for correct encapsulation; in the case of IPv4/6 this means including fields
// used in pseudo-header checksum like local IP (see [ipv4.CRCWriteUDPPseudo]).
//
// offsetToIP is the offset to the IP frame, if present, else its value should be -1.
// The relation offsetToIP<=offsetToFrame MUST hold.
//
// When [net.ErrClosed] is returned the StackNode should be discarded and any written data passed up normally.
// Errors returned by Encapsulate are "extraordinary" and should not be returned unless the StackNode is receiving invalid carrierData/frameOffset.
Encapsulate(carrierData []byte, offsetToIP, offsetToFrame int) (int, error)
// Demux reads from the argument buffer where frameOffset is the offset of this StackNode's frame first byte.
// The stack node then dispatches(demuxes) the encapsulated frames to its corresponding substack or subnode.
Demux(carrierData []byte, frameOffset int) error
// LocalPort returns the local port of this StackNode or zero if not set/relevant.
LocalPort() uint16
// Protocol returns a number identifying the protocol used by this [StackNode].
// Can be an [IPProto] among other types of protocols, i.e: ethernet.Protocol for a link layer [StackNode].
Protocol() uint64
// ConnectionID returns the pointer to the connection context number or ConnectionID.
// Stacks should store the original value of ConnectionID (dereference the pointer) on
// registering a [StackNode]. When the value changes this means the registered [StackNode]
// should be discarded since its lifetime has terminated.
ConnectionID() *uint64
// TODO(pato,ddirect): Do we eventually want to trigger writes to buffers asynchronously?
// SetFlagPending(flagPending func(numPendingEncapsulations int))
}
// IPProto represents the IP protocol number.
type IPProto uint8
// IP protocol numbers.
//
//go:generate stringer -type=IPProto,errGeneric -linecomment -output stringers.go .
const (
IPProtoHopByHop IPProto = 0 // IPv6 Hop-by-Hop Option [RFC8200]
IPProtoICMP IPProto = 1 // ICMP [RFC792]
IPProtoIGMP IPProto = 2 // IGMP [RFC1112]
IPProtoGGP IPProto = 3 // Gateway-to-Gateway [RFC823]
IPProtoIPv4 IPProto = 4 // IPv4 encapsulation [RFC2003]
IPProtoST IPProto = 5 // Stream [RFC1190, RFC1819]
IPProtoTCP IPProto = 6 // TCP [RFC9293]
IPProtoCBT IPProto = 7 // CBT [Ballardie]
IPProtoEGP IPProto = 8 // Exterior Gateway Protocol [RFC888]
IPProtoIGP IPProto = 9 // any private interior gateway (used by Cisco for their IGRP)
IPProtoBBNRCCMON IPProto = 10 // BBN RCC Monitoring
IPProtoNVP IPProto = 11 // Network Voice Protocol [RFC741]
IPProtoPUP IPProto = 12 // PUP
IPProtoARGUS IPProto = 13 // ARGUS
IPProtoEMCON IPProto = 14 // EMCON
IPProtoXNET IPProto = 15 // Cross Net Debugger
IPProtoCHAOS IPProto = 16 // Chaos
IPProtoUDP IPProto = 17 // UDP [RFC768]
IPProtoMUX IPProto = 18 // Multiplexing
IPProtoDCNMEAS IPProto = 19 // DCN Measurement Subsystems
IPProtoHMP IPProto = 20 // Host Monitoring [RFC869]
IPProtoPRM IPProto = 21 // Packet Radio Measurement
IPProtoXNSIDP IPProto = 22 // XEROX NS IDP
IPProtoTRUNK1 IPProto = 23 // Trunk-1
IPProtoTRUNK2 IPProto = 24 // Trunk-2
IPProtoLEAF1 IPProto = 25 // Leaf-1
IPProtoLEAF2 IPProto = 26 // Leaf-2
IPProtoRDP IPProto = 27 // Reliable Data Protocol [RFC908]
IPProtoIRTP IPProto = 28 // Internet Reliable Transaction [RFC938]
IPProtoISO_TP4 IPProto = 29 // ISO Transport Protocol Class 4 [RFC905]
IPProtoNETBLT IPProto = 30 // Bulk Data Transfer Protocol [RFC998]
IPProtoMFE_NSP IPProto = 31 // MFE Network Services Protocol
IPProtoMERIT_INP IPProto = 32 // MERIT Internodal Protocol
IPProtoDCCP IPProto = 33 // Datagram Congestion Control Protocol [RFC4340]
IPProto3PC IPProto = 34 // Third Party Connect Protocol
IPProtoIDPR IPProto = 35 // Inter-Domain Policy Routing Protocol
IPProtoXTP IPProto = 36 // XTP
IPProtoDDP IPProto = 37 // Datagram Delivery Protocol
IPProtoIDPRCMTP IPProto = 38 // IDPR Control Message Transport Proto
IPProtoTPPLUSPLUS IPProto = 39 // TP++ Transport Protocol
IPProtoIL IPProto = 40 // IL Transport Protocol
IPProtoIPv6 IPProto = 41 // IPv6 encapsulation [RFC2473]
IPProtoSDRP IPProto = 42 // Source Demand Routing Protocol
IPProtoIPv6Route IPProto = 43 // Routing Header for IPv6 [RFC8200]
IPProtoIPv6Frag IPProto = 44 // Fragment Header for IPv6 [RFC8200]
IPProtoIDRP IPProto = 45 // Inter-Domain Routing Protocol
IPProtoRSVP IPProto = 46 // Reservation Protocol [RFC2205]
IPProtoGRE IPProto = 47 // Generic Routing Encapsulation [RFC2784]
IPProtoDSR IPProto = 48 // Dynamic Source Routing Protocol
IPProtoBNA IPProto = 49 // BNA
IPProtoESP IPProto = 50 // Encap Security Payload [RFC4303]
IPProtoAH IPProto = 51 // Authentication Header [RFC4302]
IPProtoINLSP IPProto = 52 // Integrated Net Layer Security TUBA
IPProtoSWIPE IPProto = 53 // IP with Encryption
IPProtoNARP IPProto = 54 // NBMA Address Resolution Protocol
IPProtoMOBILE IPProto = 55 // IP Mobility
IPProtoTLSP IPProto = 56 // Transport Layer Security Protocol using Kryptonet key management
IPProtoSKIP IPProto = 57 // SKIP
IPProtoIPv6ICMP IPProto = 58 // ICMP for IPv6 [RFC8200]
IPProtoIPv6NoNxt IPProto = 59 // No Next Header for IPv6 [RFC8200]
IPProtoIPv6Opts IPProto = 60 // Destination Options for IPv6 [RFC8200]
IPProtoCFTP IPProto = 62 // CFTP
IPProtoSATEXPAK IPProto = 64 // SATNET and Backroom EXPAK
IPProtoKRYPTOLAN IPProto = 65 // Kryptolan
IPProtoRVD IPProto = 66 // MIT Remote Virtual Disk Protocol
IPProtoIPPC IPProto = 67 // Internet Pluribus Packet Core
IPProtoSATMON IPProto = 69 // SATNET Monitoring
IPProtoVISA IPProto = 70 // VISA Protocol
IPProtoIPCV IPProto = 71 // Internet Packet Core Utility
IPProtoCPNX IPProto = 72 // Computer Protocol Network Executive
IPProtoCPHB IPProto = 73 // Computer Protocol Heart Beat
IPProtoWSN IPProto = 74 // Wang Span Network
IPProtoPVP IPProto = 75 // Packet Video Protocol
IPProtoBRSATMON IPProto = 76 // Backroom SATNET Monitoring
IPProtoSUNND IPProto = 77 // SUN ND PROTOCOL-Temporary
IPProtoWBMON IPProto = 78 // WIDEBAND Monitoring
IPProtoWBEXPAK IPProto = 79 // WIDEBAND EXPAK
IPProtoISOIP IPProto = 80 // ISO Internet Protocol
IPProtoVMTP IPProto = 81 // VMTP
IPProtoSECUREVMTP IPProto = 82 // SECURE-VMTP
IPProtoVINES IPProto = 83 // VINES
IPProtoTTP IPProto = 84 // TTP
IPProtoNSFNETIGP IPProto = 85 // NSFNET-IGP
IPProtoDGP IPProto = 86 // Dissimilar Gateway Protocol
IPProtoTCF IPProto = 87 // TCF
IPProtoEIGRP IPProto = 88 // EIGRP
IPProtoOSPFIGP IPProto = 89 // OSPFIGP
IPProtoSpriteRPC IPProto = 90 // Sprite RPC Protocol
IPProtoLARP IPProto = 91 // Locus Address Resolution Protocol
IPProtoMTP IPProto = 92 // Multicast Transport Protocol
IPProtoAX25 IPProto = 93 // AX.25 Frames
IPProtoIPIP IPProto = 94 // IP-within-IP Encapsulation Protocol
IPProtoMICP IPProto = 95 // Mobile Internetworking Control Pro.
IPProtoSCCSP IPProto = 96 // Semaphore Communications Sec. Pro.
IPProtoETHERIP IPProto = 97 // Ethernet-within-IP Encapsulation
IPProtoENCAP IPProto = 98 // Encapsulation Header
IPProtoGMTP IPProto = 100 // GMTP
IPProtoIFMP IPProto = 101 // Ipsilon Flow Management Protocol
IPProtoPNNI IPProto = 102 // PNNI over IP
IPProtoPIM IPProto = 103 // Protocol Independent Multicast
IPProtoARIS IPProto = 104 // ARIS
IPProtoSCPS IPProto = 105 // SCPS
IPProtoQNX IPProto = 106 // QNX
IPProtoAN IPProto = 107 // Active Networks
IPProtoIPComp IPProto = 108 // IP Payload Compression Protocol
IPProtoSNP IPProto = 109 // Sitara Networks Protocol
IPProtoCompaqPeer IPProto = 110 // Compaq Peer Protocol
IPProtoIPXInIP IPProto = 111 // IPX in IP
IPProtoVRRP IPProto = 112 // Virtual Router Redundancy Protocol
IPProtoPGM IPProto = 113 // PGM Reliable Transport Protocol
IPProtoL2TP IPProto = 115 // Layer Two Tunneling Protocol v3
IPProtoDDX IPProto = 116 // D-II Data Exchange (DDX)
IPProtoIATP IPProto = 117 // Interactive Agent Transfer Protocol
IPProtoSTP IPProto = 118 // Schedule Transfer Protocol
IPProtoSRP IPProto = 119 // SpectraLink Radio Protocol
IPProtoUTI IPProto = 120 // UTI
IPProtoSMP IPProto = 121 // Simple Message Protocol
IPProtoSM IPProto = 122 // SM
IPProtoPTP IPProto = 123 // Performance Transparency Protocol
IPProtoISIS IPProto = 124 // ISIS over IPv4
IPProtoFIRE IPProto = 125 // FIRE
IPProtoCRTP IPProto = 126 // Combat Radio Transport Protocol
IPProtoCRUDP IPProto = 127 // Combat Radio User Datagram
IPProtoSSCOPMCE IPProto = 128 // SSCOPMCE
IPProtoIPLT IPProto = 129 // IPLT
IPProtoSPS IPProto = 130 // Secure Packet Shield
IPProtoPIPE IPProto = 131 // Private IP Encapsulation within IP
IPProtoSCTP IPProto = 132 // Stream Control Transmission Protocol
IPProtoFC IPProto = 133 // Fibre Channel
IPProtoRSVP_E2E_IGNORE IPProto = 134 // RSVP-E2E-IGNORE
IPProtoMobilityHeader IPProto = 135 // Mobility Header
IPProtoUDPLite IPProto = 136 // UDP-Lite [RFC3828]
IPProtoMPLSInIP IPProto = 137 // MPLS-in-IP
IPProtoMANET IPProto = 138 // MANET Protocols
IPProtoHIP IPProto = 139 // Host Identity Protocol
IPProtoShim6 IPProto = 140 // Shim6 Protocol
IPProtoWESP IPProto = 141 // Wrapped Encapsulating Security Payload
IPProtoROHC IPProto = 142 // Robust Header Compression
IPProtoEthernet IPProto = 143 // Ethernet
IPProtoAGGFRAG IPProto = 144 // AGGFRAG Encapsulation payload for ESP
IPProtoNSH IPProto = 145 // Network Service Header
)