123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- package gopacket
- import (
- "fmt"
- )
- type SerializableLayer interface {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- SerializeTo(b SerializeBuffer, opts SerializeOptions) error
-
- LayerType() LayerType
- }
- type SerializeOptions struct {
-
-
- FixLengths bool
-
-
- ComputeChecksums bool
- }
- type SerializeBuffer interface {
-
-
-
-
- Bytes() []byte
-
-
-
-
- PrependBytes(num int) ([]byte, error)
-
-
-
-
- AppendBytes(num int) ([]byte, error)
-
-
-
- Clear() error
-
-
- Layers() []LayerType
-
-
- PushLayer(LayerType)
- }
- type serializeBuffer struct {
- data []byte
- start int
- prepended, appended int
- layers []LayerType
- }
- func NewSerializeBuffer() SerializeBuffer {
- return &serializeBuffer{}
- }
- func NewSerializeBufferExpectedSize(expectedPrependLength, expectedAppendLength int) SerializeBuffer {
- return &serializeBuffer{
- data: make([]byte, expectedPrependLength, expectedPrependLength+expectedAppendLength),
- start: expectedPrependLength,
- prepended: expectedPrependLength,
- appended: expectedAppendLength,
- }
- }
- func (w *serializeBuffer) Bytes() []byte {
- return w.data[w.start:]
- }
- func (w *serializeBuffer) PrependBytes(num int) ([]byte, error) {
- if num < 0 {
- panic("num < 0")
- }
- if w.start < num {
- toPrepend := w.prepended
- if toPrepend < num {
- toPrepend = num
- }
- w.prepended += toPrepend
- length := cap(w.data) + toPrepend
- newData := make([]byte, length)
- newStart := w.start + toPrepend
- copy(newData[newStart:], w.data[w.start:])
- w.start = newStart
- w.data = newData[:toPrepend+len(w.data)]
- }
- w.start -= num
- return w.data[w.start : w.start+num], nil
- }
- func (w *serializeBuffer) AppendBytes(num int) ([]byte, error) {
- if num < 0 {
- panic("num < 0")
- }
- initialLength := len(w.data)
- if cap(w.data)-initialLength < num {
- toAppend := w.appended
- if toAppend < num {
- toAppend = num
- }
- w.appended += toAppend
- newData := make([]byte, cap(w.data)+toAppend)
- copy(newData[w.start:], w.data[w.start:])
- w.data = newData[:initialLength]
- }
-
- w.data = w.data[:initialLength+num]
- return w.data[initialLength:], nil
- }
- func (w *serializeBuffer) Clear() error {
- w.start = w.prepended
- w.data = w.data[:w.start]
- w.layers = w.layers[:0]
- return nil
- }
- func (w *serializeBuffer) Layers() []LayerType {
- return w.layers
- }
- func (w *serializeBuffer) PushLayer(l LayerType) {
- w.layers = append(w.layers, l)
- }
- func SerializeLayers(w SerializeBuffer, opts SerializeOptions, layers ...SerializableLayer) error {
- w.Clear()
- for i := len(layers) - 1; i >= 0; i-- {
- layer := layers[i]
- err := layer.SerializeTo(w, opts)
- if err != nil {
- return err
- }
- w.PushLayer(layer.LayerType())
- }
- return nil
- }
- func SerializePacket(buf SerializeBuffer, opts SerializeOptions, packet Packet) error {
- sls := []SerializableLayer{}
- for _, layer := range packet.Layers() {
- sl, ok := layer.(SerializableLayer)
- if !ok {
- return fmt.Errorf("layer %s is not serializable", layer.LayerType().String())
- }
- sls = append(sls, sl)
- }
- return SerializeLayers(buf, opts, sls...)
- }
|