outpacket.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package packet
  2. import (
  3. "github.com/slackhq/nebula/util/virtio"
  4. "golang.org/x/sys/unix"
  5. )
  6. type OutPacket struct {
  7. Segments [][]byte
  8. SegmentPayloads [][]byte
  9. SegmentHeaders [][]byte
  10. SegmentIDs []uint16
  11. //todo virtio header?
  12. SegSize int
  13. SegCounter int
  14. Valid bool
  15. wasSegmented bool
  16. Scratch []byte
  17. }
  18. func NewOut() *OutPacket {
  19. out := new(OutPacket)
  20. out.Segments = make([][]byte, 0, 64)
  21. out.SegmentHeaders = make([][]byte, 0, 64)
  22. out.SegmentPayloads = make([][]byte, 0, 64)
  23. out.SegmentIDs = make([]uint16, 0, 64)
  24. out.Scratch = make([]byte, Size)
  25. return out
  26. }
  27. func (pkt *OutPacket) Reset() {
  28. pkt.Segments = pkt.Segments[:0]
  29. pkt.SegmentPayloads = pkt.SegmentPayloads[:0]
  30. pkt.SegmentHeaders = pkt.SegmentHeaders[:0]
  31. pkt.SegmentIDs = pkt.SegmentIDs[:0]
  32. pkt.SegSize = 0
  33. pkt.Valid = false
  34. pkt.wasSegmented = false
  35. }
  36. func (pkt *OutPacket) UseSegment(segID uint16, seg []byte, isV6 bool) int {
  37. pkt.Valid = true
  38. pkt.SegmentIDs = append(pkt.SegmentIDs, segID)
  39. pkt.Segments = append(pkt.Segments, seg) //todo do we need this?
  40. vhdr := virtio.NetHdr{ //todo
  41. Flags: unix.VIRTIO_NET_HDR_F_DATA_VALID,
  42. GSOType: unix.VIRTIO_NET_HDR_GSO_NONE,
  43. HdrLen: 0,
  44. GSOSize: 0,
  45. CsumStart: 0,
  46. CsumOffset: 0,
  47. NumBuffers: 0,
  48. }
  49. hdr := seg[0 : virtio.NetHdrSize+14]
  50. _ = vhdr.Encode(hdr)
  51. if isV6 {
  52. hdr[virtio.NetHdrSize+14-2] = 0x86
  53. hdr[virtio.NetHdrSize+14-1] = 0xdd
  54. } else {
  55. hdr[virtio.NetHdrSize+14-2] = 0x08
  56. hdr[virtio.NetHdrSize+14-1] = 0x00
  57. }
  58. pkt.SegmentHeaders = append(pkt.SegmentHeaders, hdr)
  59. pkt.SegmentPayloads = append(pkt.SegmentPayloads, seg[virtio.NetHdrSize+14:])
  60. return len(pkt.SegmentIDs) - 1
  61. }