010-Fix-build-in-legacy-golang-version.patch 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  1. From f1d753f0693b3845ace8962bd9a34343f472631d Mon Sep 17 00:00:00 2001
  2. From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= <[email protected]>
  3. Date: Tue, 31 May 2022 15:55:38 +0800
  4. Subject: [PATCH] Fix build in legacy golang version
  5. ---
  6. infra/conf/shadowsocks.go | 2 +
  7. infra/conf/shadowsocks_legacy.go | 152 +++++++++++++++
  8. proxy/shadowsocks_2022/inbound.go | 2 +
  9. proxy/shadowsocks_2022/inbound_multi.go | 2 +
  10. proxy/shadowsocks_2022/outbound.go | 2 +
  11. proxy/shadowsocks_2022/shadowsocks_2022.go | 2 +
  12. testing/scenarios/shadowsocks_2022_test.go | 209 +++++++++++++++++++++
  13. testing/scenarios/shadowsocks_test.go | 190 -------------------
  14. 8 files changed, 371 insertions(+), 190 deletions(-)
  15. create mode 100644 infra/conf/shadowsocks_legacy.go
  16. create mode 100644 testing/scenarios/shadowsocks_2022_test.go
  17. --- a/infra/conf/shadowsocks.go
  18. +++ b/infra/conf/shadowsocks.go
  19. @@ -1,3 +1,5 @@
  20. +//go:build go1.18
  21. +
  22. package conf
  23. import (
  24. --- /dev/null
  25. +++ b/infra/conf/shadowsocks_legacy.go
  26. @@ -0,0 +1,152 @@
  27. +//go:build !go1.18
  28. +package conf
  29. +
  30. +import (
  31. + "strings"
  32. +
  33. + "github.com/golang/protobuf/proto"
  34. + "github.com/xtls/xray-core/common/protocol"
  35. + "github.com/xtls/xray-core/common/serial"
  36. + "github.com/xtls/xray-core/proxy/shadowsocks"
  37. +)
  38. +
  39. +func cipherFromString(c string) shadowsocks.CipherType {
  40. + switch strings.ToLower(c) {
  41. + case "aes-128-gcm", "aead_aes_128_gcm":
  42. + return shadowsocks.CipherType_AES_128_GCM
  43. + case "aes-256-gcm", "aead_aes_256_gcm":
  44. + return shadowsocks.CipherType_AES_256_GCM
  45. + case "chacha20-poly1305", "aead_chacha20_poly1305", "chacha20-ietf-poly1305":
  46. + return shadowsocks.CipherType_CHACHA20_POLY1305
  47. + case "xchacha20-poly1305", "aead_xchacha20_poly1305", "xchacha20-ietf-poly1305":
  48. + return shadowsocks.CipherType_XCHACHA20_POLY1305
  49. + case "none", "plain":
  50. + return shadowsocks.CipherType_NONE
  51. + default:
  52. + return shadowsocks.CipherType_UNKNOWN
  53. + }
  54. +}
  55. +
  56. +type ShadowsocksUserConfig struct {
  57. + Cipher string `json:"method"`
  58. + Password string `json:"password"`
  59. + Level byte `json:"level"`
  60. + Email string `json:"email"`
  61. +}
  62. +
  63. +type ShadowsocksServerConfig struct {
  64. + Cipher string `json:"method"`
  65. + Password string `json:"password"`
  66. + Level byte `json:"level"`
  67. + Email string `json:"email"`
  68. + Users []*ShadowsocksUserConfig `json:"clients"`
  69. + NetworkList *NetworkList `json:"network"`
  70. + IVCheck bool `json:"ivCheck"`
  71. +}
  72. +
  73. +func (v *ShadowsocksServerConfig) Build() (proto.Message, error) {
  74. + config := new(shadowsocks.ServerConfig)
  75. + config.Network = v.NetworkList.Build()
  76. +
  77. + if v.Users != nil {
  78. + for _, user := range v.Users {
  79. + account := &shadowsocks.Account{
  80. + Password: user.Password,
  81. + CipherType: cipherFromString(user.Cipher),
  82. + IvCheck: v.IVCheck,
  83. + }
  84. + if account.Password == "" {
  85. + return nil, newError("Shadowsocks password is not specified.")
  86. + }
  87. + if account.CipherType < shadowsocks.CipherType_AES_128_GCM ||
  88. + account.CipherType > shadowsocks.CipherType_XCHACHA20_POLY1305 {
  89. + return nil, newError("unsupported cipher method: ", user.Cipher)
  90. + }
  91. + config.Users = append(config.Users, &protocol.User{
  92. + Email: user.Email,
  93. + Level: uint32(user.Level),
  94. + Account: serial.ToTypedMessage(account),
  95. + })
  96. + }
  97. + } else {
  98. + account := &shadowsocks.Account{
  99. + Password: v.Password,
  100. + CipherType: cipherFromString(v.Cipher),
  101. + IvCheck: v.IVCheck,
  102. + }
  103. + if account.Password == "" {
  104. + return nil, newError("Shadowsocks password is not specified.")
  105. + }
  106. + if account.CipherType == shadowsocks.CipherType_UNKNOWN {
  107. + return nil, newError("unknown cipher method: ", v.Cipher)
  108. + }
  109. + config.Users = append(config.Users, &protocol.User{
  110. + Email: v.Email,
  111. + Level: uint32(v.Level),
  112. + Account: serial.ToTypedMessage(account),
  113. + })
  114. + }
  115. +
  116. + return config, nil
  117. +}
  118. +
  119. +type ShadowsocksServerTarget struct {
  120. + Address *Address `json:"address"`
  121. + Port uint16 `json:"port"`
  122. + Cipher string `json:"method"`
  123. + Password string `json:"password"`
  124. + Email string `json:"email"`
  125. + Level byte `json:"level"`
  126. + IVCheck bool `json:"ivCheck"`
  127. +}
  128. +
  129. +type ShadowsocksClientConfig struct {
  130. + Servers []*ShadowsocksServerTarget `json:"servers"`
  131. +}
  132. +
  133. +func (v *ShadowsocksClientConfig) Build() (proto.Message, error) {
  134. + if len(v.Servers) == 0 {
  135. + return nil, newError("0 Shadowsocks server configured.")
  136. + }
  137. +
  138. + config := new(shadowsocks.ClientConfig)
  139. + serverSpecs := make([]*protocol.ServerEndpoint, len(v.Servers))
  140. + for idx, server := range v.Servers {
  141. + if server.Address == nil {
  142. + return nil, newError("Shadowsocks server address is not set.")
  143. + }
  144. + if server.Port == 0 {
  145. + return nil, newError("Invalid Shadowsocks port.")
  146. + }
  147. + if server.Password == "" {
  148. + return nil, newError("Shadowsocks password is not specified.")
  149. + }
  150. + account := &shadowsocks.Account{
  151. + Password: server.Password,
  152. + }
  153. + account.CipherType = cipherFromString(server.Cipher)
  154. + if account.CipherType == shadowsocks.CipherType_UNKNOWN {
  155. + return nil, newError("unknown cipher method: ", server.Cipher)
  156. + }
  157. +
  158. + account.IvCheck = server.IVCheck
  159. +
  160. + ss := &protocol.ServerEndpoint{
  161. + Address: server.Address.Build(),
  162. + Port: uint32(server.Port),
  163. + User: []*protocol.User{
  164. + {
  165. + Level: uint32(server.Level),
  166. + Email: server.Email,
  167. + Account: serial.ToTypedMessage(account),
  168. + },
  169. + },
  170. + }
  171. +
  172. + serverSpecs[idx] = ss
  173. + }
  174. +
  175. + config.Server = serverSpecs
  176. +
  177. + return config, nil
  178. +}
  179. --- a/proxy/shadowsocks_2022/inbound.go
  180. +++ b/proxy/shadowsocks_2022/inbound.go
  181. @@ -1,3 +1,5 @@
  182. +//go:build go1.18
  183. +
  184. package shadowsocks_2022
  185. import (
  186. --- a/proxy/shadowsocks_2022/inbound_multi.go
  187. +++ b/proxy/shadowsocks_2022/inbound_multi.go
  188. @@ -1,3 +1,5 @@
  189. +//go:build go1.18
  190. +
  191. package shadowsocks_2022
  192. import (
  193. --- a/proxy/shadowsocks_2022/outbound.go
  194. +++ b/proxy/shadowsocks_2022/outbound.go
  195. @@ -1,3 +1,5 @@
  196. +//go:build go1.18
  197. +
  198. package shadowsocks_2022
  199. import (
  200. --- a/proxy/shadowsocks_2022/shadowsocks_2022.go
  201. +++ b/proxy/shadowsocks_2022/shadowsocks_2022.go
  202. @@ -1,3 +1,5 @@
  203. +//go:build go1.18
  204. +
  205. package shadowsocks_2022
  206. import (
  207. --- /dev/null
  208. +++ b/testing/scenarios/shadowsocks_2022_test.go
  209. @@ -0,0 +1,209 @@
  210. +package scenarios
  211. +
  212. +import (
  213. + "crypto/rand"
  214. + "encoding/base64"
  215. + "github.com/sagernet/sing-shadowsocks/shadowaead_2022"
  216. + "github.com/xtls/xray-core/proxy/shadowsocks_2022"
  217. + "testing"
  218. + "time"
  219. +
  220. + "github.com/xtls/xray-core/app/log"
  221. + "github.com/xtls/xray-core/app/proxyman"
  222. + "github.com/xtls/xray-core/common"
  223. + clog "github.com/xtls/xray-core/common/log"
  224. + "github.com/xtls/xray-core/common/net"
  225. + "github.com/xtls/xray-core/common/serial"
  226. + "github.com/xtls/xray-core/core"
  227. + "github.com/xtls/xray-core/proxy/dokodemo"
  228. + "github.com/xtls/xray-core/proxy/freedom"
  229. + "github.com/xtls/xray-core/testing/servers/tcp"
  230. + "github.com/xtls/xray-core/testing/servers/udp"
  231. + "golang.org/x/sync/errgroup"
  232. +)
  233. +
  234. +func TestShadowsocks2022Tcp(t *testing.T) {
  235. + for _, method := range shadowaead_2022.List {
  236. + password := make([]byte, 32)
  237. + rand.Read(password)
  238. + t.Run(method, func(t *testing.T) {
  239. + testShadowsocks2022Tcp(t, method, base64.StdEncoding.EncodeToString(password))
  240. + })
  241. + }
  242. +}
  243. +
  244. +func TestShadowsocks2022Udp(t *testing.T) {
  245. + for _, method := range shadowaead_2022.List {
  246. + password := make([]byte, 32)
  247. + rand.Read(password)
  248. + t.Run(method, func(t *testing.T) {
  249. + testShadowsocks2022Udp(t, method, base64.StdEncoding.EncodeToString(password))
  250. + })
  251. + }
  252. +}
  253. +
  254. +func testShadowsocks2022Tcp(t *testing.T, method string, password string) {
  255. + tcpServer := tcp.Server{
  256. + MsgProcessor: xor,
  257. + }
  258. + dest, err := tcpServer.Start()
  259. + common.Must(err)
  260. + defer tcpServer.Close()
  261. +
  262. + serverPort := tcp.PickPort()
  263. + serverConfig := &core.Config{
  264. + App: []*serial.TypedMessage{
  265. + serial.ToTypedMessage(&log.Config{
  266. + ErrorLogLevel: clog.Severity_Debug,
  267. + ErrorLogType: log.LogType_Console,
  268. + }),
  269. + },
  270. + Inbound: []*core.InboundHandlerConfig{
  271. + {
  272. + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  273. + PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  274. + Listen: net.NewIPOrDomain(net.LocalHostIP),
  275. + }),
  276. + ProxySettings: serial.ToTypedMessage(&shadowsocks_2022.ServerConfig{
  277. + Method: method,
  278. + Key: password,
  279. + Network: []net.Network{net.Network_TCP},
  280. + }),
  281. + },
  282. + },
  283. + Outbound: []*core.OutboundHandlerConfig{
  284. + {
  285. + ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  286. + },
  287. + },
  288. + }
  289. +
  290. + clientPort := tcp.PickPort()
  291. + clientConfig := &core.Config{
  292. + App: []*serial.TypedMessage{
  293. + serial.ToTypedMessage(&log.Config{
  294. + ErrorLogLevel: clog.Severity_Debug,
  295. + ErrorLogType: log.LogType_Console,
  296. + }),
  297. + },
  298. + Inbound: []*core.InboundHandlerConfig{
  299. + {
  300. + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  301. + PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  302. + Listen: net.NewIPOrDomain(net.LocalHostIP),
  303. + }),
  304. + ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  305. + Address: net.NewIPOrDomain(dest.Address),
  306. + Port: uint32(dest.Port),
  307. + Networks: []net.Network{net.Network_TCP},
  308. + }),
  309. + },
  310. + },
  311. + Outbound: []*core.OutboundHandlerConfig{
  312. + {
  313. + ProxySettings: serial.ToTypedMessage(&shadowsocks_2022.ClientConfig{
  314. + Address: net.NewIPOrDomain(net.LocalHostIP),
  315. + Port: uint32(serverPort),
  316. + Method: method,
  317. + Key: password,
  318. + }),
  319. + },
  320. + },
  321. + }
  322. +
  323. + servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  324. + common.Must(err)
  325. + defer CloseAllServers(servers)
  326. +
  327. + var errGroup errgroup.Group
  328. + for i := 0; i < 10; i++ {
  329. + errGroup.Go(testTCPConn(clientPort, 10240*1024, time.Second*20))
  330. + }
  331. +
  332. + if err := errGroup.Wait(); err != nil {
  333. + t.Error(err)
  334. + }
  335. +}
  336. +
  337. +func testShadowsocks2022Udp(t *testing.T, method string, password string) {
  338. + udpServer := udp.Server{
  339. + MsgProcessor: xor,
  340. + }
  341. + udpDest, err := udpServer.Start()
  342. + common.Must(err)
  343. + defer udpServer.Close()
  344. +
  345. + serverPort := udp.PickPort()
  346. + serverConfig := &core.Config{
  347. + App: []*serial.TypedMessage{
  348. + serial.ToTypedMessage(&log.Config{
  349. + ErrorLogLevel: clog.Severity_Debug,
  350. + ErrorLogType: log.LogType_Console,
  351. + }),
  352. + },
  353. + Inbound: []*core.InboundHandlerConfig{
  354. + {
  355. + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  356. + PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  357. + Listen: net.NewIPOrDomain(net.LocalHostIP),
  358. + }),
  359. + ProxySettings: serial.ToTypedMessage(&shadowsocks_2022.ServerConfig{
  360. + Method: method,
  361. + Key: password,
  362. + Network: []net.Network{net.Network_UDP},
  363. + }),
  364. + },
  365. + },
  366. + Outbound: []*core.OutboundHandlerConfig{
  367. + {
  368. + ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  369. + },
  370. + },
  371. + }
  372. +
  373. + udpClientPort := udp.PickPort()
  374. + clientConfig := &core.Config{
  375. + App: []*serial.TypedMessage{
  376. + serial.ToTypedMessage(&log.Config{
  377. + ErrorLogLevel: clog.Severity_Debug,
  378. + ErrorLogType: log.LogType_Console,
  379. + }),
  380. + },
  381. + Inbound: []*core.InboundHandlerConfig{
  382. + {
  383. + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  384. + PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(udpClientPort)}},
  385. + Listen: net.NewIPOrDomain(net.LocalHostIP),
  386. + }),
  387. + ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  388. + Address: net.NewIPOrDomain(udpDest.Address),
  389. + Port: uint32(udpDest.Port),
  390. + Networks: []net.Network{net.Network_UDP},
  391. + }),
  392. + },
  393. + },
  394. + Outbound: []*core.OutboundHandlerConfig{
  395. + {
  396. + ProxySettings: serial.ToTypedMessage(&shadowsocks_2022.ClientConfig{
  397. + Address: net.NewIPOrDomain(net.LocalHostIP),
  398. + Port: uint32(serverPort),
  399. + Method: method,
  400. + Key: password,
  401. + }),
  402. + },
  403. + },
  404. + }
  405. +
  406. + servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  407. + common.Must(err)
  408. + defer CloseAllServers(servers)
  409. +
  410. + var errGroup errgroup.Group
  411. + for i := 0; i < 10; i++ {
  412. + errGroup.Go(testUDPConn(udpClientPort, 1024, time.Second*5))
  413. + }
  414. +
  415. + if err := errGroup.Wait(); err != nil {
  416. + t.Error(err)
  417. + }
  418. +}
  419. --- a/testing/scenarios/shadowsocks_test.go
  420. +++ b/testing/scenarios/shadowsocks_test.go
  421. @@ -1,10 +1,6 @@
  422. package scenarios
  423. import (
  424. - "crypto/rand"
  425. - "encoding/base64"
  426. - "github.com/sagernet/sing-shadowsocks/shadowaead_2022"
  427. - "github.com/xtls/xray-core/proxy/shadowsocks_2022"
  428. "testing"
  429. "time"
  430. @@ -489,189 +485,3 @@ func TestShadowsocksNone(t *testing.T) {
  431. t.Fatal(err)
  432. }
  433. }
  434. -
  435. -func TestShadowsocks2022Tcp(t *testing.T) {
  436. - for _, method := range shadowaead_2022.List {
  437. - password := make([]byte, 32)
  438. - rand.Read(password)
  439. - t.Run(method, func(t *testing.T) {
  440. - testShadowsocks2022Tcp(t, method, base64.StdEncoding.EncodeToString(password))
  441. - })
  442. - }
  443. -}
  444. -
  445. -func TestShadowsocks2022Udp(t *testing.T) {
  446. - for _, method := range shadowaead_2022.List {
  447. - password := make([]byte, 32)
  448. - rand.Read(password)
  449. - t.Run(method, func(t *testing.T) {
  450. - testShadowsocks2022Udp(t, method, base64.StdEncoding.EncodeToString(password))
  451. - })
  452. - }
  453. -}
  454. -
  455. -func testShadowsocks2022Tcp(t *testing.T, method string, password string) {
  456. - tcpServer := tcp.Server{
  457. - MsgProcessor: xor,
  458. - }
  459. - dest, err := tcpServer.Start()
  460. - common.Must(err)
  461. - defer tcpServer.Close()
  462. -
  463. - serverPort := tcp.PickPort()
  464. - serverConfig := &core.Config{
  465. - App: []*serial.TypedMessage{
  466. - serial.ToTypedMessage(&log.Config{
  467. - ErrorLogLevel: clog.Severity_Debug,
  468. - ErrorLogType: log.LogType_Console,
  469. - }),
  470. - },
  471. - Inbound: []*core.InboundHandlerConfig{
  472. - {
  473. - ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  474. - PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  475. - Listen: net.NewIPOrDomain(net.LocalHostIP),
  476. - }),
  477. - ProxySettings: serial.ToTypedMessage(&shadowsocks_2022.ServerConfig{
  478. - Method: method,
  479. - Key: password,
  480. - Network: []net.Network{net.Network_TCP},
  481. - }),
  482. - },
  483. - },
  484. - Outbound: []*core.OutboundHandlerConfig{
  485. - {
  486. - ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  487. - },
  488. - },
  489. - }
  490. -
  491. - clientPort := tcp.PickPort()
  492. - clientConfig := &core.Config{
  493. - App: []*serial.TypedMessage{
  494. - serial.ToTypedMessage(&log.Config{
  495. - ErrorLogLevel: clog.Severity_Debug,
  496. - ErrorLogType: log.LogType_Console,
  497. - }),
  498. - },
  499. - Inbound: []*core.InboundHandlerConfig{
  500. - {
  501. - ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  502. - PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  503. - Listen: net.NewIPOrDomain(net.LocalHostIP),
  504. - }),
  505. - ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  506. - Address: net.NewIPOrDomain(dest.Address),
  507. - Port: uint32(dest.Port),
  508. - Networks: []net.Network{net.Network_TCP},
  509. - }),
  510. - },
  511. - },
  512. - Outbound: []*core.OutboundHandlerConfig{
  513. - {
  514. - ProxySettings: serial.ToTypedMessage(&shadowsocks_2022.ClientConfig{
  515. - Address: net.NewIPOrDomain(net.LocalHostIP),
  516. - Port: uint32(serverPort),
  517. - Method: method,
  518. - Key: password,
  519. - }),
  520. - },
  521. - },
  522. - }
  523. -
  524. - servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  525. - common.Must(err)
  526. - defer CloseAllServers(servers)
  527. -
  528. - var errGroup errgroup.Group
  529. - for i := 0; i < 10; i++ {
  530. - errGroup.Go(testTCPConn(clientPort, 10240*1024, time.Second*20))
  531. - }
  532. -
  533. - if err := errGroup.Wait(); err != nil {
  534. - t.Error(err)
  535. - }
  536. -}
  537. -
  538. -func testShadowsocks2022Udp(t *testing.T, method string, password string) {
  539. - udpServer := udp.Server{
  540. - MsgProcessor: xor,
  541. - }
  542. - udpDest, err := udpServer.Start()
  543. - common.Must(err)
  544. - defer udpServer.Close()
  545. -
  546. - serverPort := udp.PickPort()
  547. - serverConfig := &core.Config{
  548. - App: []*serial.TypedMessage{
  549. - serial.ToTypedMessage(&log.Config{
  550. - ErrorLogLevel: clog.Severity_Debug,
  551. - ErrorLogType: log.LogType_Console,
  552. - }),
  553. - },
  554. - Inbound: []*core.InboundHandlerConfig{
  555. - {
  556. - ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  557. - PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  558. - Listen: net.NewIPOrDomain(net.LocalHostIP),
  559. - }),
  560. - ProxySettings: serial.ToTypedMessage(&shadowsocks_2022.ServerConfig{
  561. - Method: method,
  562. - Key: password,
  563. - Network: []net.Network{net.Network_UDP},
  564. - }),
  565. - },
  566. - },
  567. - Outbound: []*core.OutboundHandlerConfig{
  568. - {
  569. - ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  570. - },
  571. - },
  572. - }
  573. -
  574. - udpClientPort := udp.PickPort()
  575. - clientConfig := &core.Config{
  576. - App: []*serial.TypedMessage{
  577. - serial.ToTypedMessage(&log.Config{
  578. - ErrorLogLevel: clog.Severity_Debug,
  579. - ErrorLogType: log.LogType_Console,
  580. - }),
  581. - },
  582. - Inbound: []*core.InboundHandlerConfig{
  583. - {
  584. - ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  585. - PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(udpClientPort)}},
  586. - Listen: net.NewIPOrDomain(net.LocalHostIP),
  587. - }),
  588. - ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  589. - Address: net.NewIPOrDomain(udpDest.Address),
  590. - Port: uint32(udpDest.Port),
  591. - Networks: []net.Network{net.Network_UDP},
  592. - }),
  593. - },
  594. - },
  595. - Outbound: []*core.OutboundHandlerConfig{
  596. - {
  597. - ProxySettings: serial.ToTypedMessage(&shadowsocks_2022.ClientConfig{
  598. - Address: net.NewIPOrDomain(net.LocalHostIP),
  599. - Port: uint32(serverPort),
  600. - Method: method,
  601. - Key: password,
  602. - }),
  603. - },
  604. - },
  605. - }
  606. -
  607. - servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  608. - common.Must(err)
  609. - defer CloseAllServers(servers)
  610. -
  611. - var errGroup errgroup.Group
  612. - for i := 0; i < 10; i++ {
  613. - errGroup.Go(testUDPConn(udpClientPort, 1024, time.Second*5))
  614. - }
  615. -
  616. - if err := errGroup.Wait(); err != nil {
  617. - t.Error(err)
  618. - }
  619. -}