user.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package overlay
  2. import (
  3. "io"
  4. "net/netip"
  5. "github.com/sirupsen/logrus"
  6. "github.com/slackhq/nebula/config"
  7. )
  8. func NewUserDeviceFromConfig(c *config.C, l *logrus.Logger, vpnNetworks []netip.Prefix, routines int) (Device, error) {
  9. return NewUserDevice(vpnNetworks)
  10. }
  11. func NewUserDevice(vpnNetworks []netip.Prefix) (Device, error) {
  12. // these pipes guarantee each write/read will match 1:1
  13. or, ow := io.Pipe()
  14. ir, iw := io.Pipe()
  15. return &UserDevice{
  16. vpnNetworks: vpnNetworks,
  17. outboundReader: or,
  18. outboundWriter: ow,
  19. inboundReader: ir,
  20. inboundWriter: iw,
  21. }, nil
  22. }
  23. type UserDevice struct {
  24. vpnNetworks []netip.Prefix
  25. outboundReader *io.PipeReader
  26. outboundWriter *io.PipeWriter
  27. inboundReader *io.PipeReader
  28. inboundWriter *io.PipeWriter
  29. }
  30. func (d *UserDevice) Activate() error {
  31. return nil
  32. }
  33. func (d *UserDevice) Networks() []netip.Prefix { return d.vpnNetworks }
  34. func (d *UserDevice) Name() string { return "faketun0" }
  35. func (d *UserDevice) RouteFor(ip netip.Addr) netip.Addr { return ip }
  36. func (d *UserDevice) NewMultiQueueReader() (io.ReadWriteCloser, error) {
  37. return d, nil
  38. }
  39. func (d *UserDevice) Pipe() (*io.PipeReader, *io.PipeWriter) {
  40. return d.inboundReader, d.outboundWriter
  41. }
  42. func (d *UserDevice) Read(p []byte) (n int, err error) {
  43. return d.outboundReader.Read(p)
  44. }
  45. func (d *UserDevice) Write(p []byte) (n int, err error) {
  46. return d.inboundWriter.Write(p)
  47. }
  48. func (d *UserDevice) Close() error {
  49. d.inboundWriter.Close()
  50. d.outboundWriter.Close()
  51. return nil
  52. }