Documentation
¶
Index ¶
- Constants
- Variables
- func HeaderSize(data []byte) int
- func PacketSizer(data []byte) int
- type EncapsulationPacket
- func Decode(data []byte) (*EncapsulationPacket, error)
- func NewIPEPacket(data []byte, options ...PacketOption) (*EncapsulationPacket, error)
- func NewIdleFillPacket(totalLength int, fill byte) (*EncapsulationPacket, error)
- func NewIdlePacket() (*EncapsulationPacket, error)
- func NewLTPPacket(data []byte, options ...PacketOption) (*EncapsulationPacket, error)
- func NewMissionPacket(data []byte, options ...PacketOption) (*EncapsulationPacket, error)
- func NewPacket(protocolID uint8, data []byte, options ...PacketOption) (*EncapsulationPacket, error)
- type Header
- type PacketOption
- type Service
- type ServiceConfig
Constants ¶
const ( ProtocolIDIdle uint8 = 0 // '000' Encapsulation Idle Packet (fill data) ProtocolIDLTP uint8 = 1 // '001' Licklider Transmission Protocol (CCSDS 734.1) ProtocolIDIPE uint8 = 2 // '010' Internet Protocol Extension ProtocolIDCFDP uint8 = 3 // '011' CCSDS File Delivery Protocol (CCSDS 727.0) ProtocolIDBP uint8 = 4 // '100' Bundle Protocol (CCSDS 734.2) ProtocolIDExtended uint8 = 6 // '110' protocol identified by the Protocol ID Extension field ProtocolIDMission uint8 = 7 // '111' mission-specific, privately defined data )
Encapsulation Protocol ID values per CCSDS 133.1-B-3 Section 4.1.2.3 and the SANA Encapsulation Protocol ID registry.
const ( LoLNone uint8 = 0 // '00' (no Packet Length field; 1-octet header (idle only) LoL1Octet uint8 = 1 // '01') 1-octet Packet Length; 2-octet header LoL2Octet uint8 = 2 // '10' (2-octet Packet Length; 4-octet header LoL4Octet uint8 = 3 // '11') 4-octet Packet Length; 8-octet header )
Length of Length values per CCSDS 133.1-B-3 table 4-1. The value selects both the size of the Packet Length field and the total header size.
const ( HeaderSize1 = 1 // LoL '00' HeaderSize2 = 2 // LoL '01' HeaderSize4 = 4 // LoL '10' HeaderSize8 = 8 // LoL '11' )
Header sizes in octets, a pure function of the Length of Length field.
const ( MaxPacketLength2 = 255 // 1-octet Packet Length field (2-octet header) MaxPacketLength4 = 65535 // 2-octet Packet Length field (4-octet header) MaxPacketLength8 = 4294967295 // 4-octet Packet Length field (8-octet header) )
Maximum total packet lengths (header included) per header size.
const PVN = 7
PVN is the Packet Version Number for Encapsulation Packets ('111') per CCSDS 133.1-B-3 Section 4.1.2.2.
Variables ¶
var ( // ErrInvalidPVN indicates the Packet Version Number is not 7 ('111'). ErrInvalidPVN = errors.New("invalid PVN: must be 7 ('111') for encapsulation packets") // ErrInvalidProtocolID indicates the Protocol ID is out of range. ErrInvalidProtocolID = errors.New("invalid protocol ID: must be in the range 0-7") // ErrInvalidLengthOfLength indicates the Length of Length field is not 0-3. ErrInvalidLengthOfLength = errors.New("invalid length of length: must be in the range 0-3") // ErrInvalidUserDefined indicates the User Defined Field does not fit in 4 bits. ErrInvalidUserDefined = errors.New("invalid user defined field: must be in the range 0-15") // ErrInvalidExtendedProtocolID indicates the Protocol ID Extension does not fit in 4 bits. ErrInvalidExtendedProtocolID = errors.New("invalid protocol ID extension: must be in the range 0-15") // ErrNonIdleOneOctetHeader indicates a 1-octet header (LoL '00') with a // non-idle Protocol ID, which CCSDS 133.1-B-3 4.1.2.4.4 forbids. ErrNonIdleOneOctetHeader = errors.New("length of length '00' requires protocol ID '000' (idle)") // ErrExtendedNeedsLongHeader indicates Protocol ID '110' with a header too // short to carry the Protocol ID Extension field. ErrExtendedNeedsLongHeader = errors.New("protocol ID '110' requires a 4- or 8-octet header") // ErrExtensionMustBeZero indicates a non-zero Protocol ID Extension while // the Protocol ID is not '110' (CCSDS 133.1-B-3 4.1.2.6.3). ErrExtensionMustBeZero = errors.New("protocol ID extension must be zero unless protocol ID is '110'") // ErrFieldNeedsLongerHeader indicates a header field is set that does not // exist in the selected header size (e.g. a CCSDS Defined value with a // 4-octet header). ErrFieldNeedsLongerHeader = errors.New("header field not present in the selected header size") // ErrIdleWithData indicates a 1-octet idle packet was given a data zone. ErrIdleWithData = errors.New("1-octet idle packet has no data zone") // ErrEmptyData indicates a non-idle packet has no data // (CCSDS 133.1-B-3 4.1.3.1.5). ErrEmptyData = errors.New("non-idle packet must contain data") // ErrDataTooShort indicates the provided data is too short for decoding. ErrDataTooShort = errors.New("provided data is too short to decode the packet") // ErrPacketLengthMismatch indicates the declared packet length does not match the actual size. ErrPacketLengthMismatch = errors.New("packet length field does not match actual packet size") // ErrPacketTooLarge indicates the packet exceeds the maximum size for its header format. ErrPacketTooLarge = errors.New("packet size exceeds the maximum for the selected header format") // ErrInvalidIdleLength indicates an idle fill packet was requested with an // unrepresentable total length. ErrInvalidIdleLength = errors.New("idle packet total length must be at least 1 octet") // ErrNilPacket indicates a nil packet was provided. ErrNilPacket = errors.New("packet must not be nil") )
Functions ¶
func HeaderSize ¶
HeaderSize returns the header size in bytes by inspecting the first byte of an encoded packet. Returns -1 if the data is too short or the first byte does not carry the encapsulation PVN ('111').
func PacketSizer ¶
PacketSizer returns the total length in bytes of the Encapsulation Packet starting at data[0], or -1 if the data is too short to determine length. This implements the sdl.PacketSizer signature for use with data link services.
Types ¶
type EncapsulationPacket ¶
type EncapsulationPacket struct {
Header Header // Variable-length packet header
Data []byte // Encapsulated Data Field
}
EncapsulationPacket represents a complete Encapsulation Packet per CCSDS 133.1-B-3.
func Decode ¶
func Decode(data []byte) (*EncapsulationPacket, error)
Decode parses a byte slice into an EncapsulationPacket. Trailing bytes beyond the declared packet length are ignored. The returned packet's Data field is a sub-slice of the input and shares the same backing array. Callers that reuse the input buffer should copy the Data field before modifying the buffer.
func NewIPEPacket ¶
func NewIPEPacket(data []byte, options ...PacketOption) (*EncapsulationPacket, error)
NewIPEPacket creates an Internet Protocol Extension Encapsulation Packet.
func NewIdleFillPacket ¶
func NewIdleFillPacket(totalLength int, fill byte) (*EncapsulationPacket, error)
NewIdleFillPacket creates an idle Encapsulation Packet of exactly totalLength octets, filling the data zone with the given fill byte. Use it to fill a fixed-length transfer frame data field. A totalLength of 1 yields the 1-octet idle packet.
func NewIdlePacket ¶
func NewIdlePacket() (*EncapsulationPacket, error)
NewIdlePacket creates the 1-octet idle Encapsulation Packet (0xE0).
func NewLTPPacket ¶
func NewLTPPacket(data []byte, options ...PacketOption) (*EncapsulationPacket, error)
NewLTPPacket creates an LTP Encapsulation Packet.
func NewMissionPacket ¶
func NewMissionPacket(data []byte, options ...PacketOption) (*EncapsulationPacket, error)
NewMissionPacket creates a mission-specific ('111') Encapsulation Packet carrying privately defined data.
func NewPacket ¶
func NewPacket(protocolID uint8, data []byte, options ...PacketOption) (*EncapsulationPacket, error)
NewPacket creates a new EncapsulationPacket with the given Protocol ID and data. The smallest header that fits the data is selected, unless an option forces a larger one. Protocol ID 0 with no data yields the 1-octet idle packet; Protocol ID 0 with data yields a multi-octet idle fill packet.
func (*EncapsulationPacket) Encode ¶
func (ep *EncapsulationPacket) Encode() ([]byte, error)
Encode converts the EncapsulationPacket into a byte slice for transmission.
func (*EncapsulationPacket) Humanize ¶
func (ep *EncapsulationPacket) Humanize() string
Humanize generates a human-readable representation of the EncapsulationPacket.
func (*EncapsulationPacket) IsIdle ¶
func (ep *EncapsulationPacket) IsIdle() bool
IsIdle reports whether the packet is an idle packet (Protocol ID = 0).
func (*EncapsulationPacket) Validate ¶
func (ep *EncapsulationPacket) Validate() error
Validate checks the integrity and correctness of the EncapsulationPacket.
type Header ¶
type Header struct {
PVN uint8 // Packet Version Number (3 bits, must be 7)
ProtocolID uint8 // Encapsulation Protocol ID (3 bits, 0-7)
LengthOfLength uint8 // Length of Length (2 bits, 0-3)
UserDefined uint8 // User Defined Field (4 bits, 4- and 8-octet headers)
ExtendedProtocolID uint8 // Protocol ID Extension (4 bits, 4- and 8-octet headers)
CCSDSDefined uint16 // CCSDS Defined Field (16 bits, 8-octet header only)
PacketLength uint32 // Total packet length in octets, header included
}
Header represents the variable-length header of an Encapsulation Packet.
func (*Header) Decode ¶
Decode deserializes bytes into a Header. At least 1 byte must be provided; additional bytes are read as needed based on the Length of Length field.
type PacketOption ¶
type PacketOption func(*EncapsulationPacket) error
PacketOption defines a function type for configuring EncapsulationPacket options.
func WithCCSDSDefined ¶
func WithCCSDSDefined(value uint16) PacketOption
WithCCSDSDefined sets the 2-octet CCSDS Defined Field, present only in the 8-octet header. This forces the 8-octet header. The field is reserved by CCSDS and is by convention 'all zeros' (4.1.2.7.2).
func WithExtendedProtocolID ¶
func WithExtendedProtocolID(extPID uint8) PacketOption
WithExtendedProtocolID sets the 4-bit Protocol ID Extension field and the Protocol ID to '110' (ProtocolIDExtended). This raises the header size to at least 4 octets, since only 4- and 8-octet headers carry the field.
func WithLongLength ¶
func WithLongLength() PacketOption
WithLongLength forces at least a 4-octet header (2-octet Packet Length field). NewPacket otherwise picks the smallest header that fits the data.
func WithUserDefined ¶
func WithUserDefined(value uint8) PacketOption
WithUserDefined sets the 4-bit User Defined Field, present in 4- and 8-octet headers. This raises the header size to at least 4 octets.
type Service ¶
type Service struct {
// contains filtered or unexported fields
}
Service provides packet send/receive operations over a shared transport for Encapsulation Packets per CCSDS 133.1-B-3.
func NewService ¶
func NewService(rw io.ReadWriter, cfg ServiceConfig) *Service
NewService creates a new EPP service over the given transport.
func (*Service) ReceiveBytes ¶
ReceiveBytes reads an encapsulation packet from the transport and returns the Protocol ID and data zone, stripping away the packet structure.
func (*Service) ReceivePacket ¶
func (s *Service) ReceivePacket() (*EncapsulationPacket, error)
ReceivePacket reads and decodes a complete encapsulation packet from the transport.
func (*Service) SendBytes ¶
func (s *Service) SendBytes(protocolID uint8, data []byte, opts ...PacketOption) error
SendBytes wraps the given data in an encapsulation packet and writes it to the transport. The caller provides raw bytes and protocol ID; EPP handles packet construction.
func (*Service) SendPacket ¶
func (s *Service) SendPacket(packet *EncapsulationPacket) error
SendPacket writes a pre-built encapsulation packet to the transport.
type ServiceConfig ¶
type ServiceConfig struct {
// MaxPacketLength is the maximum total packet size in octets.
// It defaults to MaxPacketLength8 (4,294,967,295), the largest packet
// the protocol can represent, so that spec-valid packets are never
// rejected unless the mission configures a lower limit.
MaxPacketLength int
}
ServiceConfig holds configuration for a Service.