router.go 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129
  1. package route
  2. import (
  3. "context"
  4. "errors"
  5. "net"
  6. "net/netip"
  7. "net/url"
  8. "os"
  9. "os/user"
  10. "strings"
  11. "time"
  12. "github.com/sagernet/sing-box/adapter"
  13. "github.com/sagernet/sing-box/common/conntrack"
  14. "github.com/sagernet/sing-box/common/dialer"
  15. "github.com/sagernet/sing-box/common/geoip"
  16. "github.com/sagernet/sing-box/common/geosite"
  17. "github.com/sagernet/sing-box/common/process"
  18. "github.com/sagernet/sing-box/common/sniff"
  19. C "github.com/sagernet/sing-box/constant"
  20. "github.com/sagernet/sing-box/experimental/libbox/platform"
  21. "github.com/sagernet/sing-box/log"
  22. "github.com/sagernet/sing-box/ntp"
  23. "github.com/sagernet/sing-box/option"
  24. "github.com/sagernet/sing-box/outbound"
  25. "github.com/sagernet/sing-box/transport/fakeip"
  26. "github.com/sagernet/sing-dns"
  27. mux "github.com/sagernet/sing-mux"
  28. "github.com/sagernet/sing-tun"
  29. "github.com/sagernet/sing-vmess"
  30. "github.com/sagernet/sing/common"
  31. "github.com/sagernet/sing/common/buf"
  32. "github.com/sagernet/sing/common/bufio"
  33. "github.com/sagernet/sing/common/bufio/deadline"
  34. "github.com/sagernet/sing/common/control"
  35. E "github.com/sagernet/sing/common/exceptions"
  36. F "github.com/sagernet/sing/common/format"
  37. M "github.com/sagernet/sing/common/metadata"
  38. N "github.com/sagernet/sing/common/network"
  39. serviceNTP "github.com/sagernet/sing/common/ntp"
  40. "github.com/sagernet/sing/common/task"
  41. "github.com/sagernet/sing/common/uot"
  42. "github.com/sagernet/sing/service"
  43. "github.com/sagernet/sing/service/pause"
  44. )
  45. var _ adapter.Router = (*Router)(nil)
  46. type Router struct {
  47. ctx context.Context
  48. logger log.ContextLogger
  49. dnsLogger log.ContextLogger
  50. inboundByTag map[string]adapter.Inbound
  51. outbounds []adapter.Outbound
  52. outboundByTag map[string]adapter.Outbound
  53. rules []adapter.Rule
  54. defaultDetour string
  55. defaultOutboundForConnection adapter.Outbound
  56. defaultOutboundForPacketConnection adapter.Outbound
  57. needGeoIPDatabase bool
  58. needGeositeDatabase bool
  59. geoIPOptions option.GeoIPOptions
  60. geositeOptions option.GeositeOptions
  61. geoIPReader *geoip.Reader
  62. geositeReader *geosite.Reader
  63. geositeCache map[string]adapter.Rule
  64. needFindProcess bool
  65. dnsClient *dns.Client
  66. defaultDomainStrategy dns.DomainStrategy
  67. dnsRules []adapter.DNSRule
  68. ruleSets []adapter.RuleSet
  69. ruleSetMap map[string]adapter.RuleSet
  70. defaultTransport dns.Transport
  71. transports []dns.Transport
  72. transportMap map[string]dns.Transport
  73. transportDomainStrategy map[dns.Transport]dns.DomainStrategy
  74. dnsReverseMapping *DNSReverseMapping
  75. fakeIPStore adapter.FakeIPStore
  76. interfaceFinder myInterfaceFinder
  77. autoDetectInterface bool
  78. defaultInterface string
  79. defaultMark int
  80. networkMonitor tun.NetworkUpdateMonitor
  81. interfaceMonitor tun.DefaultInterfaceMonitor
  82. packageManager tun.PackageManager
  83. processSearcher process.Searcher
  84. timeService *ntp.Service
  85. pauseManager pause.Manager
  86. clashServer adapter.ClashServer
  87. v2rayServer adapter.V2RayServer
  88. platformInterface platform.Interface
  89. needWIFIState bool
  90. wifiState adapter.WIFIState
  91. started bool
  92. }
  93. func NewRouter(
  94. ctx context.Context,
  95. logFactory log.Factory,
  96. options option.RouteOptions,
  97. dnsOptions option.DNSOptions,
  98. ntpOptions option.NTPOptions,
  99. inbounds []option.Inbound,
  100. platformInterface platform.Interface,
  101. ) (*Router, error) {
  102. router := &Router{
  103. ctx: ctx,
  104. logger: logFactory.NewLogger("router"),
  105. dnsLogger: logFactory.NewLogger("dns"),
  106. outboundByTag: make(map[string]adapter.Outbound),
  107. rules: make([]adapter.Rule, 0, len(options.Rules)),
  108. dnsRules: make([]adapter.DNSRule, 0, len(dnsOptions.Rules)),
  109. ruleSetMap: make(map[string]adapter.RuleSet),
  110. needGeoIPDatabase: hasRule(options.Rules, isGeoIPRule) || hasDNSRule(dnsOptions.Rules, isGeoIPDNSRule),
  111. needGeositeDatabase: hasRule(options.Rules, isGeositeRule) || hasDNSRule(dnsOptions.Rules, isGeositeDNSRule),
  112. geoIPOptions: common.PtrValueOrDefault(options.GeoIP),
  113. geositeOptions: common.PtrValueOrDefault(options.Geosite),
  114. geositeCache: make(map[string]adapter.Rule),
  115. needFindProcess: hasRule(options.Rules, isProcessRule) || hasDNSRule(dnsOptions.Rules, isProcessDNSRule) || options.FindProcess,
  116. defaultDetour: options.Final,
  117. defaultDomainStrategy: dns.DomainStrategy(dnsOptions.Strategy),
  118. autoDetectInterface: options.AutoDetectInterface,
  119. defaultInterface: options.DefaultInterface,
  120. defaultMark: options.DefaultMark,
  121. pauseManager: pause.ManagerFromContext(ctx),
  122. platformInterface: platformInterface,
  123. needWIFIState: hasRule(options.Rules, isWIFIRule) || hasDNSRule(dnsOptions.Rules, isWIFIDNSRule),
  124. }
  125. router.dnsClient = dns.NewClient(dns.ClientOptions{
  126. DisableCache: dnsOptions.DNSClientOptions.DisableCache,
  127. DisableExpire: dnsOptions.DNSClientOptions.DisableExpire,
  128. IndependentCache: dnsOptions.DNSClientOptions.IndependentCache,
  129. Logger: router.dnsLogger,
  130. })
  131. for i, ruleOptions := range options.Rules {
  132. routeRule, err := NewRule(router, router.logger, ruleOptions, true)
  133. if err != nil {
  134. return nil, E.Cause(err, "parse rule[", i, "]")
  135. }
  136. router.rules = append(router.rules, routeRule)
  137. }
  138. for i, dnsRuleOptions := range dnsOptions.Rules {
  139. dnsRule, err := NewDNSRule(router, router.logger, dnsRuleOptions, true)
  140. if err != nil {
  141. return nil, E.Cause(err, "parse dns rule[", i, "]")
  142. }
  143. router.dnsRules = append(router.dnsRules, dnsRule)
  144. }
  145. for i, ruleSetOptions := range options.RuleSet {
  146. if _, exists := router.ruleSetMap[ruleSetOptions.Tag]; exists {
  147. return nil, E.New("duplicate rule-set tag: ", ruleSetOptions.Tag)
  148. }
  149. ruleSet, err := NewRuleSet(ctx, router, router.logger, ruleSetOptions)
  150. if err != nil {
  151. return nil, E.Cause(err, "parse rule-set[", i, "]")
  152. }
  153. router.ruleSets = append(router.ruleSets, ruleSet)
  154. router.ruleSetMap[ruleSetOptions.Tag] = ruleSet
  155. }
  156. transports := make([]dns.Transport, len(dnsOptions.Servers))
  157. dummyTransportMap := make(map[string]dns.Transport)
  158. transportMap := make(map[string]dns.Transport)
  159. transportTags := make([]string, len(dnsOptions.Servers))
  160. transportTagMap := make(map[string]bool)
  161. transportDomainStrategy := make(map[dns.Transport]dns.DomainStrategy)
  162. for i, server := range dnsOptions.Servers {
  163. var tag string
  164. if server.Tag != "" {
  165. tag = server.Tag
  166. } else {
  167. tag = F.ToString(i)
  168. }
  169. if transportTagMap[tag] {
  170. return nil, E.New("duplicate dns server tag: ", tag)
  171. }
  172. transportTags[i] = tag
  173. transportTagMap[tag] = true
  174. }
  175. ctx = adapter.ContextWithRouter(ctx, router)
  176. for {
  177. lastLen := len(dummyTransportMap)
  178. for i, server := range dnsOptions.Servers {
  179. tag := transportTags[i]
  180. if _, exists := dummyTransportMap[tag]; exists {
  181. continue
  182. }
  183. var detour N.Dialer
  184. if server.Detour == "" {
  185. detour = dialer.NewRouter(router)
  186. } else {
  187. detour = dialer.NewDetour(router, server.Detour)
  188. }
  189. switch server.Address {
  190. case "local":
  191. default:
  192. serverURL, _ := url.Parse(server.Address)
  193. var serverAddress string
  194. if serverURL != nil {
  195. serverAddress = serverURL.Hostname()
  196. }
  197. if serverAddress == "" {
  198. serverAddress = server.Address
  199. }
  200. _, notIpAddress := netip.ParseAddr(serverAddress)
  201. if server.AddressResolver != "" {
  202. if !transportTagMap[server.AddressResolver] {
  203. return nil, E.New("parse dns server[", tag, "]: address resolver not found: ", server.AddressResolver)
  204. }
  205. if upstream, exists := dummyTransportMap[server.AddressResolver]; exists {
  206. detour = dns.NewDialerWrapper(detour, router.dnsClient, upstream, dns.DomainStrategy(server.AddressStrategy), time.Duration(server.AddressFallbackDelay))
  207. } else {
  208. continue
  209. }
  210. } else if notIpAddress != nil && strings.Contains(server.Address, ".") {
  211. return nil, E.New("parse dns server[", tag, "]: missing address_resolver")
  212. }
  213. }
  214. transport, err := dns.CreateTransport(tag, ctx, logFactory.NewLogger(F.ToString("dns/transport[", tag, "]")), detour, server.Address)
  215. if err != nil {
  216. return nil, E.Cause(err, "parse dns server[", tag, "]")
  217. }
  218. transports[i] = transport
  219. dummyTransportMap[tag] = transport
  220. if server.Tag != "" {
  221. transportMap[server.Tag] = transport
  222. }
  223. strategy := dns.DomainStrategy(server.Strategy)
  224. if strategy != dns.DomainStrategyAsIS {
  225. transportDomainStrategy[transport] = strategy
  226. }
  227. }
  228. if len(transports) == len(dummyTransportMap) {
  229. break
  230. }
  231. if lastLen != len(dummyTransportMap) {
  232. continue
  233. }
  234. unresolvedTags := common.MapIndexed(common.FilterIndexed(dnsOptions.Servers, func(index int, server option.DNSServerOptions) bool {
  235. _, exists := dummyTransportMap[transportTags[index]]
  236. return !exists
  237. }), func(index int, server option.DNSServerOptions) string {
  238. return transportTags[index]
  239. })
  240. if len(unresolvedTags) == 0 {
  241. panic(F.ToString("unexpected unresolved dns servers: ", len(transports), " ", len(dummyTransportMap), " ", len(transportMap)))
  242. }
  243. return nil, E.New("found circular reference in dns servers: ", strings.Join(unresolvedTags, " "))
  244. }
  245. var defaultTransport dns.Transport
  246. if dnsOptions.Final != "" {
  247. defaultTransport = dummyTransportMap[dnsOptions.Final]
  248. if defaultTransport == nil {
  249. return nil, E.New("default dns server not found: ", dnsOptions.Final)
  250. }
  251. }
  252. if defaultTransport == nil {
  253. if len(transports) == 0 {
  254. transports = append(transports, dns.NewLocalTransport("local", N.SystemDialer))
  255. }
  256. defaultTransport = transports[0]
  257. }
  258. if _, isFakeIP := defaultTransport.(adapter.FakeIPTransport); isFakeIP {
  259. return nil, E.New("default DNS server cannot be fakeip")
  260. }
  261. router.defaultTransport = defaultTransport
  262. router.transports = transports
  263. router.transportMap = transportMap
  264. router.transportDomainStrategy = transportDomainStrategy
  265. if dnsOptions.ReverseMapping {
  266. router.dnsReverseMapping = NewDNSReverseMapping()
  267. }
  268. if fakeIPOptions := dnsOptions.FakeIP; fakeIPOptions != nil && dnsOptions.FakeIP.Enabled {
  269. var inet4Range netip.Prefix
  270. var inet6Range netip.Prefix
  271. if fakeIPOptions.Inet4Range != nil {
  272. inet4Range = *fakeIPOptions.Inet4Range
  273. }
  274. if fakeIPOptions.Inet6Range != nil {
  275. inet6Range = *fakeIPOptions.Inet6Range
  276. }
  277. router.fakeIPStore = fakeip.NewStore(ctx, router.logger, inet4Range, inet6Range)
  278. }
  279. usePlatformDefaultInterfaceMonitor := platformInterface != nil && platformInterface.UsePlatformDefaultInterfaceMonitor()
  280. needInterfaceMonitor := options.AutoDetectInterface || common.Any(inbounds, func(inbound option.Inbound) bool {
  281. return inbound.HTTPOptions.SetSystemProxy || inbound.MixedOptions.SetSystemProxy || inbound.TunOptions.AutoRoute
  282. })
  283. if !usePlatformDefaultInterfaceMonitor {
  284. networkMonitor, err := tun.NewNetworkUpdateMonitor(router.logger)
  285. if !((err != nil && !needInterfaceMonitor) || errors.Is(err, os.ErrInvalid)) {
  286. if err != nil {
  287. return nil, err
  288. }
  289. router.networkMonitor = networkMonitor
  290. networkMonitor.RegisterCallback(func() {
  291. _ = router.interfaceFinder.update()
  292. })
  293. interfaceMonitor, err := tun.NewDefaultInterfaceMonitor(router.networkMonitor, router.logger, tun.DefaultInterfaceMonitorOptions{
  294. OverrideAndroidVPN: options.OverrideAndroidVPN,
  295. UnderNetworkExtension: platformInterface != nil && platformInterface.UnderNetworkExtension(),
  296. })
  297. if err != nil {
  298. return nil, E.New("auto_detect_interface unsupported on current platform")
  299. }
  300. interfaceMonitor.RegisterCallback(router.notifyNetworkUpdate)
  301. router.interfaceMonitor = interfaceMonitor
  302. }
  303. } else {
  304. interfaceMonitor := platformInterface.CreateDefaultInterfaceMonitor(router.logger)
  305. interfaceMonitor.RegisterCallback(router.notifyNetworkUpdate)
  306. router.interfaceMonitor = interfaceMonitor
  307. }
  308. if ntpOptions.Enabled {
  309. timeService, err := ntp.NewService(ctx, router, logFactory.NewLogger("ntp"), ntpOptions)
  310. if err != nil {
  311. return nil, err
  312. }
  313. service.ContextWith[serviceNTP.TimeService](ctx, timeService)
  314. router.timeService = timeService
  315. }
  316. return router, nil
  317. }
  318. func (r *Router) Initialize(inbounds []adapter.Inbound, outbounds []adapter.Outbound, defaultOutbound func() adapter.Outbound) error {
  319. inboundByTag := make(map[string]adapter.Inbound)
  320. for _, inbound := range inbounds {
  321. inboundByTag[inbound.Tag()] = inbound
  322. }
  323. outboundByTag := make(map[string]adapter.Outbound)
  324. for _, detour := range outbounds {
  325. outboundByTag[detour.Tag()] = detour
  326. }
  327. var defaultOutboundForConnection adapter.Outbound
  328. var defaultOutboundForPacketConnection adapter.Outbound
  329. if r.defaultDetour != "" {
  330. detour, loaded := outboundByTag[r.defaultDetour]
  331. if !loaded {
  332. return E.New("default detour not found: ", r.defaultDetour)
  333. }
  334. if common.Contains(detour.Network(), N.NetworkTCP) {
  335. defaultOutboundForConnection = detour
  336. }
  337. if common.Contains(detour.Network(), N.NetworkUDP) {
  338. defaultOutboundForPacketConnection = detour
  339. }
  340. }
  341. var index, packetIndex int
  342. if defaultOutboundForConnection == nil {
  343. for i, detour := range outbounds {
  344. if common.Contains(detour.Network(), N.NetworkTCP) {
  345. index = i
  346. defaultOutboundForConnection = detour
  347. break
  348. }
  349. }
  350. }
  351. if defaultOutboundForPacketConnection == nil {
  352. for i, detour := range outbounds {
  353. if common.Contains(detour.Network(), N.NetworkUDP) {
  354. packetIndex = i
  355. defaultOutboundForPacketConnection = detour
  356. break
  357. }
  358. }
  359. }
  360. if defaultOutboundForConnection == nil || defaultOutboundForPacketConnection == nil {
  361. detour := defaultOutbound()
  362. if defaultOutboundForConnection == nil {
  363. defaultOutboundForConnection = detour
  364. }
  365. if defaultOutboundForPacketConnection == nil {
  366. defaultOutboundForPacketConnection = detour
  367. }
  368. outbounds = append(outbounds, detour)
  369. outboundByTag[detour.Tag()] = detour
  370. }
  371. if defaultOutboundForConnection != defaultOutboundForPacketConnection {
  372. var description string
  373. if defaultOutboundForConnection.Tag() != "" {
  374. description = defaultOutboundForConnection.Tag()
  375. } else {
  376. description = F.ToString(index)
  377. }
  378. var packetDescription string
  379. if defaultOutboundForPacketConnection.Tag() != "" {
  380. packetDescription = defaultOutboundForPacketConnection.Tag()
  381. } else {
  382. packetDescription = F.ToString(packetIndex)
  383. }
  384. r.logger.Info("using ", defaultOutboundForConnection.Type(), "[", description, "] as default outbound for connection")
  385. r.logger.Info("using ", defaultOutboundForPacketConnection.Type(), "[", packetDescription, "] as default outbound for packet connection")
  386. }
  387. r.inboundByTag = inboundByTag
  388. r.outbounds = outbounds
  389. r.defaultOutboundForConnection = defaultOutboundForConnection
  390. r.defaultOutboundForPacketConnection = defaultOutboundForPacketConnection
  391. r.outboundByTag = outboundByTag
  392. for i, rule := range r.rules {
  393. if _, loaded := outboundByTag[rule.Outbound()]; !loaded {
  394. return E.New("outbound not found for rule[", i, "]: ", rule.Outbound())
  395. }
  396. }
  397. return nil
  398. }
  399. func (r *Router) Outbounds() []adapter.Outbound {
  400. return r.outbounds
  401. }
  402. func (r *Router) Start() error {
  403. if r.needGeoIPDatabase {
  404. err := r.prepareGeoIPDatabase()
  405. if err != nil {
  406. return err
  407. }
  408. }
  409. if r.needGeositeDatabase {
  410. err := r.prepareGeositeDatabase()
  411. if err != nil {
  412. return err
  413. }
  414. }
  415. if r.interfaceMonitor != nil {
  416. err := r.interfaceMonitor.Start()
  417. if err != nil {
  418. return err
  419. }
  420. }
  421. if r.networkMonitor != nil {
  422. err := r.networkMonitor.Start()
  423. if err != nil {
  424. return err
  425. }
  426. }
  427. if r.needGeositeDatabase {
  428. for _, rule := range r.rules {
  429. err := rule.UpdateGeosite()
  430. if err != nil {
  431. r.logger.Error("failed to initialize geosite: ", err)
  432. }
  433. }
  434. for _, rule := range r.dnsRules {
  435. err := rule.UpdateGeosite()
  436. if err != nil {
  437. r.logger.Error("failed to initialize geosite: ", err)
  438. }
  439. }
  440. err := common.Close(r.geositeReader)
  441. if err != nil {
  442. return err
  443. }
  444. r.geositeCache = nil
  445. r.geositeReader = nil
  446. }
  447. if r.fakeIPStore != nil {
  448. err := r.fakeIPStore.Start()
  449. if err != nil {
  450. return err
  451. }
  452. }
  453. if len(r.ruleSets) > 0 {
  454. ruleSetStartContext := NewRuleSetStartContext()
  455. var ruleSetStartGroup task.Group
  456. for i, ruleSet := range r.ruleSets {
  457. ruleSetInPlace := ruleSet
  458. ruleSetStartGroup.Append0(func(ctx context.Context) error {
  459. err := ruleSetInPlace.StartContext(ctx, ruleSetStartContext)
  460. if err != nil {
  461. return E.Cause(err, "initialize rule-set[", i, "]")
  462. }
  463. return nil
  464. })
  465. }
  466. ruleSetStartGroup.Concurrency(5)
  467. ruleSetStartGroup.FastFail()
  468. err := ruleSetStartGroup.Run(r.ctx)
  469. if err != nil {
  470. return err
  471. }
  472. ruleSetStartContext.Close()
  473. }
  474. var (
  475. needProcessFromRuleSet bool
  476. needWIFIStateFromRuleSet bool
  477. )
  478. for _, ruleSet := range r.ruleSets {
  479. metadata := ruleSet.Metadata()
  480. if metadata.ContainsProcessRule {
  481. needProcessFromRuleSet = true
  482. }
  483. if metadata.ContainsWIFIRule {
  484. needWIFIStateFromRuleSet = true
  485. }
  486. }
  487. if needProcessFromRuleSet || r.needFindProcess {
  488. needPackageManager := C.IsAndroid && r.platformInterface == nil
  489. if needPackageManager {
  490. packageManager, err := tun.NewPackageManager(r)
  491. if err != nil {
  492. return E.Cause(err, "create package manager")
  493. }
  494. if packageManager != nil {
  495. err = packageManager.Start()
  496. if err != nil {
  497. return err
  498. }
  499. }
  500. r.packageManager = packageManager
  501. }
  502. if r.platformInterface != nil {
  503. r.processSearcher = r.platformInterface
  504. } else {
  505. searcher, err := process.NewSearcher(process.Config{
  506. Logger: r.logger,
  507. PackageManager: r.packageManager,
  508. })
  509. if err != nil {
  510. if err != os.ErrInvalid {
  511. r.logger.Warn(E.Cause(err, "create process searcher"))
  512. }
  513. } else {
  514. r.processSearcher = searcher
  515. }
  516. }
  517. }
  518. if needWIFIStateFromRuleSet || r.needWIFIState {
  519. if r.platformInterface != nil && r.interfaceMonitor != nil {
  520. r.interfaceMonitor.RegisterCallback(func(_ int) {
  521. r.updateWIFIState()
  522. })
  523. }
  524. r.updateWIFIState()
  525. }
  526. for i, rule := range r.rules {
  527. err := rule.Start()
  528. if err != nil {
  529. return E.Cause(err, "initialize rule[", i, "]")
  530. }
  531. }
  532. for i, rule := range r.dnsRules {
  533. err := rule.Start()
  534. if err != nil {
  535. return E.Cause(err, "initialize DNS rule[", i, "]")
  536. }
  537. }
  538. for i, transport := range r.transports {
  539. err := transport.Start()
  540. if err != nil {
  541. return E.Cause(err, "initialize DNS server[", i, "]")
  542. }
  543. }
  544. if r.timeService != nil {
  545. err := r.timeService.Start()
  546. if err != nil {
  547. return E.Cause(err, "initialize time service")
  548. }
  549. }
  550. return nil
  551. }
  552. func (r *Router) Close() error {
  553. var err error
  554. for i, rule := range r.rules {
  555. r.logger.Trace("closing rule[", i, "]")
  556. err = E.Append(err, rule.Close(), func(err error) error {
  557. return E.Cause(err, "close rule[", i, "]")
  558. })
  559. }
  560. for i, rule := range r.dnsRules {
  561. r.logger.Trace("closing dns rule[", i, "]")
  562. err = E.Append(err, rule.Close(), func(err error) error {
  563. return E.Cause(err, "close dns rule[", i, "]")
  564. })
  565. }
  566. for i, transport := range r.transports {
  567. r.logger.Trace("closing transport[", i, "] ")
  568. err = E.Append(err, transport.Close(), func(err error) error {
  569. return E.Cause(err, "close dns transport[", i, "]")
  570. })
  571. }
  572. if r.geoIPReader != nil {
  573. r.logger.Trace("closing geoip reader")
  574. err = E.Append(err, r.geoIPReader.Close(), func(err error) error {
  575. return E.Cause(err, "close geoip reader")
  576. })
  577. }
  578. if r.interfaceMonitor != nil {
  579. r.logger.Trace("closing interface monitor")
  580. err = E.Append(err, r.interfaceMonitor.Close(), func(err error) error {
  581. return E.Cause(err, "close interface monitor")
  582. })
  583. }
  584. if r.networkMonitor != nil {
  585. r.logger.Trace("closing network monitor")
  586. err = E.Append(err, r.networkMonitor.Close(), func(err error) error {
  587. return E.Cause(err, "close network monitor")
  588. })
  589. }
  590. if r.packageManager != nil {
  591. r.logger.Trace("closing package manager")
  592. err = E.Append(err, r.packageManager.Close(), func(err error) error {
  593. return E.Cause(err, "close package manager")
  594. })
  595. }
  596. if r.timeService != nil {
  597. r.logger.Trace("closing time service")
  598. err = E.Append(err, r.timeService.Close(), func(err error) error {
  599. return E.Cause(err, "close time service")
  600. })
  601. }
  602. if r.fakeIPStore != nil {
  603. r.logger.Trace("closing fakeip store")
  604. err = E.Append(err, r.fakeIPStore.Close(), func(err error) error {
  605. return E.Cause(err, "close fakeip store")
  606. })
  607. }
  608. return err
  609. }
  610. func (r *Router) PostStart() error {
  611. if len(r.ruleSets) > 0 {
  612. for i, ruleSet := range r.ruleSets {
  613. err := ruleSet.PostStart()
  614. if err != nil {
  615. return E.Cause(err, "post start rule-set[", i, "]")
  616. }
  617. }
  618. }
  619. r.started = true
  620. return nil
  621. }
  622. func (r *Router) Outbound(tag string) (adapter.Outbound, bool) {
  623. outbound, loaded := r.outboundByTag[tag]
  624. return outbound, loaded
  625. }
  626. func (r *Router) DefaultOutbound(network string) (adapter.Outbound, error) {
  627. if network == N.NetworkTCP {
  628. if r.defaultOutboundForConnection == nil {
  629. return nil, E.New("missing default outbound for TCP connections")
  630. }
  631. return r.defaultOutboundForConnection, nil
  632. } else {
  633. if r.defaultOutboundForPacketConnection == nil {
  634. return nil, E.New("missing default outbound for UDP connections")
  635. }
  636. return r.defaultOutboundForPacketConnection, nil
  637. }
  638. }
  639. func (r *Router) FakeIPStore() adapter.FakeIPStore {
  640. return r.fakeIPStore
  641. }
  642. func (r *Router) RuleSet(tag string) (adapter.RuleSet, bool) {
  643. ruleSet, loaded := r.ruleSetMap[tag]
  644. return ruleSet, loaded
  645. }
  646. func (r *Router) RouteConnection(ctx context.Context, conn net.Conn, metadata adapter.InboundContext) error {
  647. if metadata.InboundDetour != "" {
  648. if metadata.LastInbound == metadata.InboundDetour {
  649. return E.New("routing loop on detour: ", metadata.InboundDetour)
  650. }
  651. detour := r.inboundByTag[metadata.InboundDetour]
  652. if detour == nil {
  653. return E.New("inbound detour not found: ", metadata.InboundDetour)
  654. }
  655. injectable, isInjectable := detour.(adapter.InjectableInbound)
  656. if !isInjectable {
  657. return E.New("inbound detour is not injectable: ", metadata.InboundDetour)
  658. }
  659. if !common.Contains(injectable.Network(), N.NetworkTCP) {
  660. return E.New("inject: TCP unsupported")
  661. }
  662. metadata.LastInbound = metadata.Inbound
  663. metadata.Inbound = metadata.InboundDetour
  664. metadata.InboundDetour = ""
  665. err := injectable.NewConnection(ctx, conn, metadata)
  666. if err != nil {
  667. return E.Cause(err, "inject ", detour.Tag())
  668. }
  669. return nil
  670. }
  671. conntrack.KillerCheck()
  672. metadata.Network = N.NetworkTCP
  673. switch metadata.Destination.Fqdn {
  674. case mux.Destination.Fqdn:
  675. return E.New("global multiplex is deprecated since sing-box v1.7.0, enable multiplex in inbound options instead.")
  676. case vmess.MuxDestination.Fqdn:
  677. return E.New("global multiplex (v2ray legacy) not supported since sing-box v1.7.0.")
  678. case uot.MagicAddress:
  679. return E.New("global UoT not supported since sing-box v1.7.0.")
  680. case uot.LegacyMagicAddress:
  681. return E.New("global UoT (legacy) not supported since sing-box v1.7.0.")
  682. }
  683. if r.fakeIPStore != nil && r.fakeIPStore.Contains(metadata.Destination.Addr) {
  684. domain, loaded := r.fakeIPStore.Lookup(metadata.Destination.Addr)
  685. if !loaded {
  686. return E.New("missing fakeip context")
  687. }
  688. metadata.OriginDestination = metadata.Destination
  689. metadata.Destination = M.Socksaddr{
  690. Fqdn: domain,
  691. Port: metadata.Destination.Port,
  692. }
  693. metadata.FakeIP = true
  694. r.logger.DebugContext(ctx, "found fakeip domain: ", domain)
  695. }
  696. if deadline.NeedAdditionalReadDeadline(conn) {
  697. conn = deadline.NewConn(conn)
  698. }
  699. if metadata.InboundOptions.SniffEnabled {
  700. buffer := buf.NewPacket()
  701. sniffMetadata, err := sniff.PeekStream(ctx, conn, buffer, time.Duration(metadata.InboundOptions.SniffTimeout), sniff.StreamDomainNameQuery, sniff.TLSClientHello, sniff.HTTPHost)
  702. if sniffMetadata != nil {
  703. metadata.Protocol = sniffMetadata.Protocol
  704. metadata.Domain = sniffMetadata.Domain
  705. if metadata.InboundOptions.SniffOverrideDestination && M.IsDomainName(metadata.Domain) {
  706. metadata.Destination = M.Socksaddr{
  707. Fqdn: metadata.Domain,
  708. Port: metadata.Destination.Port,
  709. }
  710. }
  711. if metadata.Domain != "" {
  712. r.logger.DebugContext(ctx, "sniffed protocol: ", metadata.Protocol, ", domain: ", metadata.Domain)
  713. } else {
  714. r.logger.DebugContext(ctx, "sniffed protocol: ", metadata.Protocol)
  715. }
  716. } else if err != nil {
  717. r.logger.TraceContext(ctx, "sniffed no protocol: ", err)
  718. }
  719. if !buffer.IsEmpty() {
  720. conn = bufio.NewCachedConn(conn, buffer)
  721. } else {
  722. buffer.Release()
  723. }
  724. }
  725. if r.dnsReverseMapping != nil && metadata.Domain == "" {
  726. domain, loaded := r.dnsReverseMapping.Query(metadata.Destination.Addr)
  727. if loaded {
  728. metadata.Domain = domain
  729. r.logger.DebugContext(ctx, "found reserve mapped domain: ", metadata.Domain)
  730. }
  731. }
  732. if metadata.Destination.IsFqdn() && dns.DomainStrategy(metadata.InboundOptions.DomainStrategy) != dns.DomainStrategyAsIS {
  733. addresses, err := r.Lookup(adapter.WithContext(ctx, &metadata), metadata.Destination.Fqdn, dns.DomainStrategy(metadata.InboundOptions.DomainStrategy))
  734. if err != nil {
  735. return err
  736. }
  737. metadata.DestinationAddresses = addresses
  738. r.dnsLogger.DebugContext(ctx, "resolved [", strings.Join(F.MapToString(metadata.DestinationAddresses), " "), "]")
  739. }
  740. if metadata.Destination.IsIPv4() {
  741. metadata.IPVersion = 4
  742. } else if metadata.Destination.IsIPv6() {
  743. metadata.IPVersion = 6
  744. }
  745. ctx, matchedRule, detour, err := r.match(ctx, &metadata, r.defaultOutboundForConnection)
  746. if err != nil {
  747. return err
  748. }
  749. if !common.Contains(detour.Network(), N.NetworkTCP) {
  750. return E.New("missing supported outbound, closing connection")
  751. }
  752. if r.clashServer != nil {
  753. trackerConn, tracker := r.clashServer.RoutedConnection(ctx, conn, metadata, matchedRule)
  754. defer tracker.Leave()
  755. conn = trackerConn
  756. }
  757. if r.v2rayServer != nil {
  758. if statsService := r.v2rayServer.StatsService(); statsService != nil {
  759. conn = statsService.RoutedConnection(metadata.Inbound, detour.Tag(), metadata.User, conn)
  760. }
  761. }
  762. return detour.NewConnection(ctx, conn, metadata)
  763. }
  764. func (r *Router) RoutePacketConnection(ctx context.Context, conn N.PacketConn, metadata adapter.InboundContext) error {
  765. if metadata.InboundDetour != "" {
  766. if metadata.LastInbound == metadata.InboundDetour {
  767. return E.New("routing loop on detour: ", metadata.InboundDetour)
  768. }
  769. detour := r.inboundByTag[metadata.InboundDetour]
  770. if detour == nil {
  771. return E.New("inbound detour not found: ", metadata.InboundDetour)
  772. }
  773. injectable, isInjectable := detour.(adapter.InjectableInbound)
  774. if !isInjectable {
  775. return E.New("inbound detour is not injectable: ", metadata.InboundDetour)
  776. }
  777. if !common.Contains(injectable.Network(), N.NetworkUDP) {
  778. return E.New("inject: UDP unsupported")
  779. }
  780. metadata.LastInbound = metadata.Inbound
  781. metadata.Inbound = metadata.InboundDetour
  782. metadata.InboundDetour = ""
  783. err := injectable.NewPacketConnection(ctx, conn, metadata)
  784. if err != nil {
  785. return E.Cause(err, "inject ", detour.Tag())
  786. }
  787. return nil
  788. }
  789. conntrack.KillerCheck()
  790. metadata.Network = N.NetworkUDP
  791. if r.fakeIPStore != nil && r.fakeIPStore.Contains(metadata.Destination.Addr) {
  792. domain, loaded := r.fakeIPStore.Lookup(metadata.Destination.Addr)
  793. if !loaded {
  794. return E.New("missing fakeip context")
  795. }
  796. metadata.OriginDestination = metadata.Destination
  797. metadata.Destination = M.Socksaddr{
  798. Fqdn: domain,
  799. Port: metadata.Destination.Port,
  800. }
  801. metadata.FakeIP = true
  802. r.logger.DebugContext(ctx, "found fakeip domain: ", domain)
  803. }
  804. // Currently we don't have deadline usages for UDP connections
  805. /*if deadline.NeedAdditionalReadDeadline(conn) {
  806. conn = deadline.NewPacketConn(bufio.NewNetPacketConn(conn))
  807. }*/
  808. if metadata.InboundOptions.SniffEnabled || metadata.Destination.Addr.IsUnspecified() {
  809. buffer := buf.NewPacket()
  810. destination, err := conn.ReadPacket(buffer)
  811. if err != nil {
  812. buffer.Release()
  813. return err
  814. }
  815. if metadata.Destination.Addr.IsUnspecified() {
  816. metadata.Destination = destination
  817. }
  818. if metadata.InboundOptions.SniffEnabled {
  819. sniffMetadata, _ := sniff.PeekPacket(ctx, buffer.Bytes(), sniff.DomainNameQuery, sniff.QUICClientHello, sniff.STUNMessage)
  820. if sniffMetadata != nil {
  821. metadata.Protocol = sniffMetadata.Protocol
  822. metadata.Domain = sniffMetadata.Domain
  823. if metadata.InboundOptions.SniffOverrideDestination && M.IsDomainName(metadata.Domain) {
  824. metadata.Destination = M.Socksaddr{
  825. Fqdn: metadata.Domain,
  826. Port: metadata.Destination.Port,
  827. }
  828. }
  829. if metadata.Domain != "" {
  830. r.logger.DebugContext(ctx, "sniffed packet protocol: ", metadata.Protocol, ", domain: ", metadata.Domain)
  831. } else {
  832. r.logger.DebugContext(ctx, "sniffed packet protocol: ", metadata.Protocol)
  833. }
  834. }
  835. }
  836. conn = bufio.NewCachedPacketConn(conn, buffer, destination)
  837. }
  838. if r.dnsReverseMapping != nil && metadata.Domain == "" {
  839. domain, loaded := r.dnsReverseMapping.Query(metadata.Destination.Addr)
  840. if loaded {
  841. metadata.Domain = domain
  842. r.logger.DebugContext(ctx, "found reserve mapped domain: ", metadata.Domain)
  843. }
  844. }
  845. if metadata.Destination.IsFqdn() && dns.DomainStrategy(metadata.InboundOptions.DomainStrategy) != dns.DomainStrategyAsIS {
  846. addresses, err := r.Lookup(adapter.WithContext(ctx, &metadata), metadata.Destination.Fqdn, dns.DomainStrategy(metadata.InboundOptions.DomainStrategy))
  847. if err != nil {
  848. return err
  849. }
  850. metadata.DestinationAddresses = addresses
  851. r.dnsLogger.DebugContext(ctx, "resolved [", strings.Join(F.MapToString(metadata.DestinationAddresses), " "), "]")
  852. }
  853. if metadata.Destination.IsIPv4() {
  854. metadata.IPVersion = 4
  855. } else if metadata.Destination.IsIPv6() {
  856. metadata.IPVersion = 6
  857. }
  858. ctx, matchedRule, detour, err := r.match(ctx, &metadata, r.defaultOutboundForPacketConnection)
  859. if err != nil {
  860. return err
  861. }
  862. if !common.Contains(detour.Network(), N.NetworkUDP) {
  863. return E.New("missing supported outbound, closing packet connection")
  864. }
  865. if r.clashServer != nil {
  866. trackerConn, tracker := r.clashServer.RoutedPacketConnection(ctx, conn, metadata, matchedRule)
  867. defer tracker.Leave()
  868. conn = trackerConn
  869. }
  870. if r.v2rayServer != nil {
  871. if statsService := r.v2rayServer.StatsService(); statsService != nil {
  872. conn = statsService.RoutedPacketConnection(metadata.Inbound, detour.Tag(), metadata.User, conn)
  873. }
  874. }
  875. if metadata.FakeIP {
  876. conn = bufio.NewNATPacketConn(bufio.NewNetPacketConn(conn), metadata.OriginDestination, metadata.Destination)
  877. }
  878. return detour.NewPacketConnection(ctx, conn, metadata)
  879. }
  880. func (r *Router) match(ctx context.Context, metadata *adapter.InboundContext, defaultOutbound adapter.Outbound) (context.Context, adapter.Rule, adapter.Outbound, error) {
  881. matchRule, matchOutbound := r.match0(ctx, metadata, defaultOutbound)
  882. if contextOutbound, loaded := outbound.TagFromContext(ctx); loaded {
  883. if contextOutbound == matchOutbound.Tag() {
  884. return nil, nil, nil, E.New("connection loopback in outbound/", matchOutbound.Type(), "[", matchOutbound.Tag(), "]")
  885. }
  886. }
  887. ctx = outbound.ContextWithTag(ctx, matchOutbound.Tag())
  888. return ctx, matchRule, matchOutbound, nil
  889. }
  890. func (r *Router) match0(ctx context.Context, metadata *adapter.InboundContext, defaultOutbound adapter.Outbound) (adapter.Rule, adapter.Outbound) {
  891. if r.processSearcher != nil {
  892. var originDestination netip.AddrPort
  893. if metadata.OriginDestination.IsValid() {
  894. originDestination = metadata.OriginDestination.AddrPort()
  895. } else if metadata.Destination.IsIP() {
  896. originDestination = metadata.Destination.AddrPort()
  897. }
  898. processInfo, err := process.FindProcessInfo(r.processSearcher, ctx, metadata.Network, metadata.Source.AddrPort(), originDestination)
  899. if err != nil {
  900. r.logger.InfoContext(ctx, "failed to search process: ", err)
  901. } else {
  902. if processInfo.ProcessPath != "" {
  903. r.logger.InfoContext(ctx, "found process path: ", processInfo.ProcessPath)
  904. } else if processInfo.PackageName != "" {
  905. r.logger.InfoContext(ctx, "found package name: ", processInfo.PackageName)
  906. } else if processInfo.UserId != -1 {
  907. if /*needUserName &&*/ true {
  908. osUser, _ := user.LookupId(F.ToString(processInfo.UserId))
  909. if osUser != nil {
  910. processInfo.User = osUser.Username
  911. }
  912. }
  913. if processInfo.User != "" {
  914. r.logger.InfoContext(ctx, "found user: ", processInfo.User)
  915. } else {
  916. r.logger.InfoContext(ctx, "found user id: ", processInfo.UserId)
  917. }
  918. }
  919. metadata.ProcessInfo = processInfo
  920. }
  921. }
  922. for i, rule := range r.rules {
  923. metadata.ResetRuleCache()
  924. if rule.Match(metadata) {
  925. detour := rule.Outbound()
  926. r.logger.DebugContext(ctx, "match[", i, "] ", rule.String(), " => ", detour)
  927. if outbound, loaded := r.Outbound(detour); loaded {
  928. return rule, outbound
  929. }
  930. r.logger.ErrorContext(ctx, "outbound not found: ", detour)
  931. }
  932. }
  933. return nil, defaultOutbound
  934. }
  935. func (r *Router) InterfaceFinder() control.InterfaceFinder {
  936. return &r.interfaceFinder
  937. }
  938. func (r *Router) UpdateInterfaces() error {
  939. if r.platformInterface == nil || !r.platformInterface.UsePlatformInterfaceGetter() {
  940. return r.interfaceFinder.update()
  941. } else {
  942. interfaces, err := r.platformInterface.Interfaces()
  943. if err != nil {
  944. return err
  945. }
  946. r.interfaceFinder.updateInterfaces(common.Map(interfaces, func(it platform.NetworkInterface) net.Interface {
  947. return net.Interface{
  948. Name: it.Name,
  949. Index: it.Index,
  950. MTU: it.MTU,
  951. }
  952. }))
  953. return nil
  954. }
  955. }
  956. func (r *Router) AutoDetectInterface() bool {
  957. return r.autoDetectInterface
  958. }
  959. func (r *Router) AutoDetectInterfaceFunc() control.Func {
  960. if r.platformInterface != nil && r.platformInterface.UsePlatformAutoDetectInterfaceControl() {
  961. return r.platformInterface.AutoDetectInterfaceControl()
  962. } else {
  963. return control.BindToInterfaceFunc(r.InterfaceFinder(), func(network string, address string) (interfaceName string, interfaceIndex int, err error) {
  964. remoteAddr := M.ParseSocksaddr(address).Addr
  965. if C.IsLinux {
  966. interfaceName, interfaceIndex = r.InterfaceMonitor().DefaultInterface(remoteAddr)
  967. if interfaceIndex == -1 {
  968. err = tun.ErrNoRoute
  969. }
  970. } else {
  971. interfaceIndex = r.InterfaceMonitor().DefaultInterfaceIndex(remoteAddr)
  972. if interfaceIndex == -1 {
  973. err = tun.ErrNoRoute
  974. }
  975. }
  976. return
  977. })
  978. }
  979. }
  980. func (r *Router) DefaultInterface() string {
  981. return r.defaultInterface
  982. }
  983. func (r *Router) DefaultMark() int {
  984. return r.defaultMark
  985. }
  986. func (r *Router) Rules() []adapter.Rule {
  987. return r.rules
  988. }
  989. func (r *Router) WIFIState() adapter.WIFIState {
  990. return r.wifiState
  991. }
  992. func (r *Router) NetworkMonitor() tun.NetworkUpdateMonitor {
  993. return r.networkMonitor
  994. }
  995. func (r *Router) InterfaceMonitor() tun.DefaultInterfaceMonitor {
  996. return r.interfaceMonitor
  997. }
  998. func (r *Router) PackageManager() tun.PackageManager {
  999. return r.packageManager
  1000. }
  1001. func (r *Router) ClashServer() adapter.ClashServer {
  1002. return r.clashServer
  1003. }
  1004. func (r *Router) SetClashServer(server adapter.ClashServer) {
  1005. r.clashServer = server
  1006. }
  1007. func (r *Router) V2RayServer() adapter.V2RayServer {
  1008. return r.v2rayServer
  1009. }
  1010. func (r *Router) SetV2RayServer(server adapter.V2RayServer) {
  1011. r.v2rayServer = server
  1012. }
  1013. func (r *Router) OnPackagesUpdated(packages int, sharedUsers int) {
  1014. r.logger.Info("updated packages list: ", packages, " packages, ", sharedUsers, " shared users")
  1015. }
  1016. func (r *Router) NewError(ctx context.Context, err error) {
  1017. common.Close(err)
  1018. if E.IsClosedOrCanceled(err) {
  1019. r.logger.DebugContext(ctx, "connection closed: ", err)
  1020. return
  1021. }
  1022. r.logger.ErrorContext(ctx, err)
  1023. }
  1024. func (r *Router) notifyNetworkUpdate(event int) {
  1025. if event == tun.EventNoRoute {
  1026. r.pauseManager.NetworkPause()
  1027. r.logger.Error("missing default interface")
  1028. } else {
  1029. r.pauseManager.NetworkWake()
  1030. if C.IsAndroid && r.platformInterface == nil {
  1031. var vpnStatus string
  1032. if r.interfaceMonitor.AndroidVPNEnabled() {
  1033. vpnStatus = "enabled"
  1034. } else {
  1035. vpnStatus = "disabled"
  1036. }
  1037. r.logger.Info("updated default interface ", r.interfaceMonitor.DefaultInterfaceName(netip.IPv4Unspecified()), ", index ", r.interfaceMonitor.DefaultInterfaceIndex(netip.IPv4Unspecified()), ", vpn ", vpnStatus)
  1038. } else {
  1039. r.logger.Info("updated default interface ", r.interfaceMonitor.DefaultInterfaceName(netip.IPv4Unspecified()), ", index ", r.interfaceMonitor.DefaultInterfaceIndex(netip.IPv4Unspecified()))
  1040. }
  1041. }
  1042. if !r.started {
  1043. return
  1044. }
  1045. _ = r.ResetNetwork()
  1046. }
  1047. func (r *Router) ResetNetwork() error {
  1048. conntrack.Close()
  1049. for _, outbound := range r.outbounds {
  1050. listener, isListener := outbound.(adapter.InterfaceUpdateListener)
  1051. if isListener {
  1052. listener.InterfaceUpdated()
  1053. }
  1054. }
  1055. for _, transport := range r.transports {
  1056. transport.Reset()
  1057. }
  1058. return nil
  1059. }
  1060. func (r *Router) updateWIFIState() {
  1061. if r.platformInterface == nil {
  1062. return
  1063. }
  1064. state := r.platformInterface.ReadWIFIState()
  1065. if state != r.wifiState {
  1066. r.wifiState = state
  1067. r.logger.Info("updated WIFI state: SSID=", state.SSID, ", BSSID=", state.BSSID)
  1068. }
  1069. }