user.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package overlay
  2. import (
  3. "fmt"
  4. "io"
  5. "net/netip"
  6. "github.com/sirupsen/logrus"
  7. "github.com/slackhq/nebula/config"
  8. "github.com/slackhq/nebula/packet"
  9. "github.com/slackhq/nebula/routing"
  10. )
  11. func NewUserDeviceFromConfig(c *config.C, l *logrus.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. }, nil
  25. }
  26. type UserDevice struct {
  27. vpnNetworks []netip.Prefix
  28. outboundReader *io.PipeReader
  29. outboundWriter *io.PipeWriter
  30. inboundReader *io.PipeReader
  31. inboundWriter *io.PipeWriter
  32. }
  33. func (d *UserDevice) NewPacketArrays(batchSize int) []TunPacket {
  34. //inPackets := make([]TunPacket, batchSize)
  35. //outPackets := make([]OutPacket, batchSize)
  36. panic("not implemented") //todo!
  37. //for i := 0; i < batchSize; i++ {
  38. // inPackets[i] = vhostnet.NewVIO()
  39. // outPackets[i] = packet.New(false)
  40. //}
  41. //return inPackets, outPackets
  42. }
  43. func (d *UserDevice) RecycleRxSeg(pkt TunPacket, kick bool, q int) error {
  44. return nil
  45. }
  46. func (d *UserDevice) Activate() error {
  47. return nil
  48. }
  49. func (d *UserDevice) Networks() []netip.Prefix { return d.vpnNetworks }
  50. func (d *UserDevice) Name() string { return "faketun0" }
  51. func (d *UserDevice) RoutesFor(ip netip.Addr) routing.Gateways {
  52. return routing.Gateways{routing.NewGateway(ip, 1)}
  53. }
  54. func (d *UserDevice) SupportsMultiqueue() bool {
  55. return true
  56. }
  57. func (d *UserDevice) NewMultiQueueReader() (TunDev, error) {
  58. return d, nil
  59. }
  60. func (d *UserDevice) Pipe() (*io.PipeReader, *io.PipeWriter) {
  61. return d.inboundReader, d.outboundWriter
  62. }
  63. func (d *UserDevice) Read(p []byte) (n int, err error) {
  64. return d.outboundReader.Read(p)
  65. }
  66. func (d *UserDevice) Write(p []byte) (n int, err error) {
  67. return d.inboundWriter.Write(p)
  68. }
  69. func (d *UserDevice) Close() error {
  70. d.inboundWriter.Close()
  71. d.outboundWriter.Close()
  72. return nil
  73. }
  74. func (d *UserDevice) ReadMany(b []TunPacket, _ int) (int, error) {
  75. _, err := d.Read(b[0].GetPayload())
  76. if err != nil {
  77. return 0, err
  78. }
  79. return 1, nil
  80. }
  81. func (d *UserDevice) AllocSeg(pkt *packet.OutPacket, q int) (int, error) {
  82. return 0, fmt.Errorf("user: AllocSeg not implemented")
  83. }
  84. func (d *UserDevice) WriteOne(x *packet.OutPacket, kick bool, q int) (int, error) {
  85. return 0, fmt.Errorf("user: WriteOne not implemented")
  86. }
  87. func (d *UserDevice) WriteMany(x []*packet.OutPacket, q int) (int, error) {
  88. return 0, fmt.Errorf("user: WriteMany not implemented")
  89. }