2
0

user.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package overlay
  2. import (
  3. "io"
  4. "net"
  5. "github.com/sirupsen/logrus"
  6. "github.com/slackhq/nebula/config"
  7. "github.com/slackhq/nebula/iputil"
  8. )
  9. func NewUserDeviceFromConfig(c *config.C, l *logrus.Logger, tunCidr *net.IPNet, routines int) (Device, error) {
  10. return NewUserDevice(tunCidr)
  11. }
  12. func NewUserDevice(tunCidr *net.IPNet) (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. tunCidr: tunCidr,
  18. outboundReader: or,
  19. outboundWriter: ow,
  20. inboundReader: ir,
  21. inboundWriter: iw,
  22. }, nil
  23. }
  24. type UserDevice struct {
  25. tunCidr *net.IPNet
  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) Cidr() *net.IPNet { return d.tunCidr }
  35. func (d *UserDevice) Name() string { return "faketun0" }
  36. func (d *UserDevice) RouteFor(ip iputil.VpnIp) iputil.VpnIp { return ip }
  37. func (d *UserDevice) NewMultiQueueReader() (io.ReadWriteCloser, error) {
  38. return d, nil
  39. }
  40. func (d *UserDevice) Pipe() (*io.PipeReader, *io.PipeWriter) {
  41. return d.inboundReader, d.outboundWriter
  42. }
  43. func (d *UserDevice) Read(p []byte) (n int, err error) {
  44. return d.outboundReader.Read(p)
  45. }
  46. func (d *UserDevice) Write(p []byte) (n int, err error) {
  47. return d.inboundWriter.Write(p)
  48. }
  49. func (d *UserDevice) Close() error {
  50. d.inboundWriter.Close()
  51. d.outboundWriter.Close()
  52. return nil
  53. }