config.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /*
  2. Copyright © 2021-2022 Ettore Di Giacinto <[email protected]>
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package vpn
  14. import (
  15. "time"
  16. "github.com/ipfs/go-log"
  17. "github.com/mudler/water"
  18. )
  19. type Config struct {
  20. Interface *water.Interface
  21. InterfaceName string
  22. InterfaceAddress string
  23. RouterAddress string
  24. InterfaceMTU int
  25. MTU int
  26. DeviceType water.DeviceType
  27. LedgerAnnounceTime time.Duration
  28. Logger log.StandardLogger
  29. NetLinkBootstrap bool
  30. // Frame timeout
  31. Timeout time.Duration
  32. Concurrency int
  33. ChannelBufferSize int
  34. MaxStreams int
  35. lowProfile bool
  36. }
  37. type Option func(cfg *Config) error
  38. // Apply applies the given options to the config, returning the first error
  39. // encountered (if any).
  40. func (cfg *Config) Apply(opts ...Option) error {
  41. for _, opt := range opts {
  42. if opt == nil {
  43. continue
  44. }
  45. if err := opt(cfg); err != nil {
  46. return err
  47. }
  48. }
  49. return nil
  50. }
  51. func WithMaxStreams(i int) func(cfg *Config) error {
  52. return func(cfg *Config) error {
  53. cfg.MaxStreams = i
  54. return nil
  55. }
  56. }
  57. var LowProfile Option = func(cfg *Config) error {
  58. cfg.lowProfile = true
  59. return nil
  60. }
  61. func WithInterface(i *water.Interface) func(cfg *Config) error {
  62. return func(cfg *Config) error {
  63. cfg.Interface = i
  64. return nil
  65. }
  66. }
  67. func NetLinkBootstrap(b bool) func(cfg *Config) error {
  68. return func(cfg *Config) error {
  69. cfg.NetLinkBootstrap = b
  70. return nil
  71. }
  72. }
  73. func WithTimeout(s string) Option {
  74. return func(cfg *Config) error {
  75. d, err := time.ParseDuration(s)
  76. cfg.Timeout = d
  77. return err
  78. }
  79. }
  80. func Logger(l log.StandardLogger) func(cfg *Config) error {
  81. return func(cfg *Config) error {
  82. cfg.Logger = l
  83. return nil
  84. }
  85. }
  86. func WithRouterAddress(i string) func(cfg *Config) error {
  87. return func(cfg *Config) error {
  88. cfg.RouterAddress = i
  89. return nil
  90. }
  91. }
  92. func WithLedgerAnnounceTime(t time.Duration) func(cfg *Config) error {
  93. return func(cfg *Config) error {
  94. cfg.LedgerAnnounceTime = t
  95. return nil
  96. }
  97. }
  98. func WithConcurrency(i int) Option {
  99. return func(cfg *Config) error {
  100. cfg.Concurrency = i
  101. return nil
  102. }
  103. }
  104. func WithChannelBufferSize(i int) Option {
  105. return func(cfg *Config) error {
  106. cfg.ChannelBufferSize = i
  107. return nil
  108. }
  109. }
  110. func WithInterfaceMTU(i int) func(cfg *Config) error {
  111. return func(cfg *Config) error {
  112. cfg.InterfaceMTU = i
  113. return nil
  114. }
  115. }
  116. func WithPacketMTU(i int) func(cfg *Config) error {
  117. return func(cfg *Config) error {
  118. cfg.MTU = i
  119. return nil
  120. }
  121. }
  122. func WithInterfaceType(d water.DeviceType) func(cfg *Config) error {
  123. return func(cfg *Config) error {
  124. cfg.DeviceType = d
  125. return nil
  126. }
  127. }
  128. func WithInterfaceName(i string) func(cfg *Config) error {
  129. return func(cfg *Config) error {
  130. cfg.InterfaceName = i
  131. return nil
  132. }
  133. }
  134. func WithInterfaceAddress(i string) func(cfg *Config) error {
  135. return func(cfg *Config) error {
  136. cfg.InterfaceAddress = i
  137. return nil
  138. }
  139. }