user.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package overlay
  2. import (
  3. "io"
  4. "log/slog"
  5. "net/netip"
  6. "github.com/slackhq/nebula/config"
  7. "github.com/slackhq/nebula/overlay/tio"
  8. "github.com/slackhq/nebula/routing"
  9. )
  10. func NewUserDeviceFromConfig(c *config.C, l *slog.Logger, vpnNetworks []netip.Prefix, routines int) (Device, error) {
  11. return NewUserDevice(vpnNetworks)
  12. }
  13. func NewUserDevice(vpnNetworks []netip.Prefix) (Device, error) {
  14. // these pipes guarantee each write/read will match 1:1
  15. or, ow := io.Pipe()
  16. ir, iw := io.Pipe()
  17. return &UserDevice{
  18. vpnNetworks: vpnNetworks,
  19. outboundReader: or,
  20. outboundWriter: ow,
  21. inboundReader: ir,
  22. inboundWriter: iw,
  23. numReaders: 1,
  24. }, nil
  25. }
  26. type UserDevice struct {
  27. vpnNetworks []netip.Prefix
  28. numReaders int
  29. outboundReader *io.PipeReader
  30. outboundWriter *io.PipeWriter
  31. inboundReader *io.PipeReader
  32. inboundWriter *io.PipeWriter
  33. readBuf []byte
  34. batchRet [1]tio.Packet
  35. }
  36. func (d *UserDevice) Read() ([]tio.Packet, error) {
  37. if d.readBuf == nil {
  38. d.readBuf = make([]byte, defaultBatchBufSize)
  39. }
  40. n, err := d.outboundReader.Read(d.readBuf)
  41. if err != nil {
  42. return nil, err
  43. }
  44. d.batchRet[0] = tio.Packet{Bytes: d.readBuf[:n]}
  45. return d.batchRet[:], nil
  46. }
  47. func (d *UserDevice) Activate() error {
  48. return nil
  49. }
  50. func (d *UserDevice) Networks() []netip.Prefix { return d.vpnNetworks }
  51. func (d *UserDevice) Name() string { return "faketun0" }
  52. func (d *UserDevice) RoutesFor(ip netip.Addr) routing.Gateways {
  53. return routing.Gateways{routing.NewGateway(ip, 1)}
  54. }
  55. func (d *UserDevice) SupportsMultiqueue() bool {
  56. return true
  57. }
  58. func (d *UserDevice) NewMultiQueueReader() error {
  59. d.numReaders++
  60. return nil
  61. }
  62. func (d *UserDevice) Readers() []tio.Queue {
  63. out := make([]tio.Queue, d.numReaders)
  64. for i := range d.numReaders {
  65. out[i] = d
  66. }
  67. return out
  68. }
  69. func (d *UserDevice) Pipe() (*io.PipeReader, *io.PipeWriter) {
  70. return d.inboundReader, d.outboundWriter
  71. }
  72. func (d *UserDevice) Write(p []byte) (n int, err error) {
  73. return d.inboundWriter.Write(p)
  74. }
  75. func (d *UserDevice) Close() error {
  76. d.inboundWriter.Close()
  77. d.outboundWriter.Close()
  78. return nil
  79. }