mirror of
https://github.com/soypat/lneto.git
synced 2026-07-26 10:38:47 +00:00
75a812a8d7
* 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>
189 lines
12 KiB
Go
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
|
|
)
|