user.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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. }
  31. func (d *UserDevice) Activate() error {
  32. return nil
  33. }
  34. func (d *UserDevice) Networks() []netip.Prefix { return d.vpnNetworks }
  35. func (d *UserDevice) Name() string { return "faketun0" }
  36. func (d *UserDevice) RoutesFor(ip netip.Addr) routing.Gateways {
  37. return routing.Gateways{routing.NewGateway(ip, 1)}
  38. }
  39. func (d *UserDevice) NewMultiQueueReader() (BatchReadWriter, error) {
  40. return d, nil
  41. }
  42. // BatchRead reads a single packet (batch size 1 for UserDevice)
  43. func (d *UserDevice) BatchRead(bufs [][]byte, sizes []int) (int, error) {
  44. n, err := d.Read(bufs[0])
  45. if err != nil {
  46. return 0, err
  47. }
  48. sizes[0] = n
  49. return 1, nil
  50. }
  51. // WriteBatch writes packets individually (no batching for UserDevice)
  52. func (d *UserDevice) WriteBatch(bufs [][]byte, offset int) (int, error) {
  53. for i, buf := range bufs {
  54. _, err := d.Write(buf[offset:])
  55. if err != nil {
  56. return i, err
  57. }
  58. }
  59. return len(bufs), nil
  60. }
  61. // BatchSize returns 1 for UserDevice (no batching)
  62. func (d *UserDevice) BatchSize() int {
  63. return 1
  64. }
  65. func (d *UserDevice) Pipe() (*io.PipeReader, *io.PipeWriter) {
  66. return d.inboundReader, d.outboundWriter
  67. }
  68. func (d *UserDevice) Read(p []byte) (n int, err error) {
  69. return d.outboundReader.Read(p)
  70. }
  71. func (d *UserDevice) Write(p []byte) (n int, err error) {
  72. return d.inboundWriter.Write(p)
  73. }
  74. func (d *UserDevice) Close() error {
  75. d.inboundWriter.Close()
  76. d.outboundWriter.Close()
  77. return nil
  78. }