user.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. }, nil
  24. }
  25. type UserDevice struct {
  26. vpnNetworks []netip.Prefix
  27. outboundReader *io.PipeReader
  28. outboundWriter *io.PipeWriter
  29. inboundReader *io.PipeReader
  30. inboundWriter *io.PipeWriter
  31. }
  32. func (d *UserDevice) Activate() error {
  33. return nil
  34. }
  35. func (d *UserDevice) Networks() []netip.Prefix { return d.vpnNetworks }
  36. func (d *UserDevice) Name() string { return "faketun0" }
  37. func (d *UserDevice) RoutesFor(ip netip.Addr) routing.Gateways {
  38. return routing.Gateways{routing.NewGateway(ip, 1)}
  39. }
  40. func (d *UserDevice) Queues(n int) ([]tio.Queue, error) {
  41. out := make([]tio.Queue, n)
  42. for i := range out {
  43. // All queues share the underlying pipes (the io.Pipe serializes
  44. // concurrent callers) but each owns a private scratch buffer so
  45. // concurrent Reads across queues never alias. NoClose: the pipes are
  46. // owned by the UserDevice and torn down once by UserDevice.Close.
  47. out[i] = tio.NewSingleQueueNoClose(d, defaultBatchBufSize)
  48. }
  49. return out, nil
  50. }
  51. func (d *UserDevice) Pipe() (*io.PipeReader, *io.PipeWriter) {
  52. return d.inboundReader, d.outboundWriter
  53. }
  54. func (d *UserDevice) Read(p []byte) (n int, err error) {
  55. return d.outboundReader.Read(p)
  56. }
  57. func (d *UserDevice) Write(p []byte) (n int, err error) {
  58. return d.inboundWriter.Write(p)
  59. }
  60. func (d *UserDevice) Close() error {
  61. d.inboundWriter.Close()
  62. d.outboundWriter.Close()
  63. return nil
  64. }