user.go 1.9 KB

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