user.go 2.1 KB

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