Documentation ¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
var ErrDataLost = errors.New("lost data")
ErrDataLost is returned by the TCPReaderStream's Read function when it encounters a Reassembly with Skip != 0.
Functions ¶
This section is empty.
Types ¶
type ReaderStreamOptions ¶
type ReaderStreamOptions struct { // LossErrors determines whether this stream will return // ReaderStreamDataLoss errors from its Read function whenever it // determines data has been lost. LossErrors bool }
ReaderStreamOptions provides user-resettable options for a TCPReaderStream.
type TCPReaderStream ¶
type TCPReaderStream struct { ReaderStreamOptions // contains filtered or unexported fields }
TCPReaderStream implements both tcpassembly.Stream and io.Reader. You can use it as a building block to make simple, easy stream handlers.
IMPORTANT: If you use a TCPReaderStream, you MUST read ALL BYTES from it, quickly. Not reading available bytes will block TCP stream reassembly. It's a common pattern to do this by starting a goroutine in the factory's New method:
type myStreamHandler struct { r TCPReaderStream } func (m *myStreamHandler) run() { // Do something here that reads all of the TCPReaderStream, or your assembly // will block. fmt.Println(tcpreader.DiscardBytesToEOF(&m.r)) } func (f *myStreamFactory) New(a, b gopacket.Flow) tcpassembly.Stream { s := &myStreamHandler{} go s.run() // Return the TCPReaderStream as the stream that assembly should populate. return &s.r }
func NewReaderStream ¶
func NewReaderStream() TCPReaderStream
NewReaderStream returns a new TCPReaderStream object.
func (*TCPReaderStream) Close ¶
func (r *TCPReaderStream) Close() error
Close implements io.Closer's Close function, making TCPReaderStream a io.ReadCloser. It discards all remaining bytes in the reassembly in a manner that's safe for the assembler (IE: it doesn't block).
func (*TCPReaderStream) Read ¶
func (r *TCPReaderStream) Read(p []byte) (int, error)
Read implements io.Reader's Read function. Given a byte slice, it will either copy a non-zero number of bytes into that slice and return the number of bytes and a nil error, or it will leave slice p as is and return 0, io.EOF.
func (*TCPReaderStream) Reassembled ¶
func (r *TCPReaderStream) Reassembled(reassembly []tcpassembly.Reassembly)
Reassembled implements tcpassembly.Stream's Reassembled function.
func (*TCPReaderStream) ReassemblyComplete ¶
func (r *TCPReaderStream) ReassemblyComplete()
ReassemblyComplete implements tcpassembly.Stream's ReassemblyComplete function.
func (*TCPReaderStream) Seen ¶
func (r *TCPReaderStream) Seen() (time.Time, error)
Seen returns the time the data returned by Read was seen on the wire. Returns io.EOF if no data was returned.
Note: this is likely to be time for the data seen. This is likely to not include time for initial connection. If you use something like a buffered reader, you are quite likely to see various data points dropped. Perhaps wrap it up in something to capture those times first.