encoder.go 826 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package packet
  2. import (
  3. "github.com/google/gopacket"
  4. )
  5. var (
  6. serializeOpts = gopacket.SerializeOptions{
  7. FixLengths: true,
  8. ComputeChecksums: true,
  9. }
  10. )
  11. // RawPacket represents a raw packet or one encoded by Encoder
  12. type RawPacket struct {
  13. Data []byte
  14. }
  15. type Encoder struct {
  16. // buf is reusable because SerializeLayers calls the Clear method before each encoding
  17. buf gopacket.SerializeBuffer
  18. }
  19. func NewEncoder() *Encoder {
  20. return &Encoder{
  21. buf: gopacket.NewSerializeBuffer(),
  22. }
  23. }
  24. func (e *Encoder) Encode(packet Packet) (RawPacket, error) {
  25. encodedLayers, err := packet.EncodeLayers()
  26. if err != nil {
  27. return RawPacket{}, err
  28. }
  29. if err := gopacket.SerializeLayers(e.buf, serializeOpts, encodedLayers...); err != nil {
  30. return RawPacket{}, err
  31. }
  32. return RawPacket{
  33. Data: e.buf.Bytes(),
  34. }, nil
  35. }