@@ -6,12 +6,17 @@ import (
66 "os"
77 "os/exec"
88 "runtime"
9+ "time"
910
1011 "github.com/sagernet/nftables"
1112 "github.com/sagernet/sing/common"
13+ "github.com/sagernet/sing/common/control"
1214 E "github.com/sagernet/sing/common/exceptions"
1315 "github.com/sagernet/sing/common/logger"
1416 M "github.com/sagernet/sing/common/metadata"
17+ "github.com/sagernet/sing/common/x/list"
18+
19+ "go4.org/netipx"
1520)
1621
1722type autoRedirect struct {
@@ -20,6 +25,10 @@ type autoRedirect struct {
2025 handler Handler
2126 logger logger.Logger
2227 tableName string
28+ networkMonitor NetworkUpdateMonitor
29+ networkListener * list.Element [NetworkUpdateCallback ]
30+ interfaceFinder control.InterfaceFinder
31+ localAddresses []netip.Prefix
2332 customRedirectPortFunc func () int
2433 customRedirectPort int
2534 redirectServer * redirectServer
@@ -30,6 +39,8 @@ type autoRedirect struct {
3039 useNFTables bool
3140 androidSu bool
3241 suPath string
42+ routeAddressSet * []* netipx.IPSet
43+ routeExcludeAddressSet * []* netipx.IPSet
3344}
3445
3546func NewAutoRedirect (options AutoRedirectOptions ) (AutoRedirect , error ) {
@@ -38,9 +49,13 @@ func NewAutoRedirect(options AutoRedirectOptions) (AutoRedirect, error) {
3849 ctx : options .Context ,
3950 handler : options .Handler ,
4051 logger : options .Logger ,
52+ networkMonitor : options .NetworkMonitor ,
53+ interfaceFinder : options .InterfaceFinder ,
4154 tableName : options .TableName ,
4255 useNFTables : runtime .GOOS != "android" && ! options .DisableNFTables ,
4356 customRedirectPortFunc : options .CustomRedirectPort ,
57+ routeAddressSet : options .RouteAddressSet ,
58+ routeExcludeAddressSet : options .RouteExcludeAddressSet ,
4459 }
4560 var err error
4661 if runtime .GOOS == "android" {
@@ -116,11 +131,18 @@ func (r *autoRedirect) Start() error {
116131 }
117132 r .redirectServer = server
118133 }
134+ startAt := time .Now ()
135+ var err error
119136 if r .useNFTables {
120- return r .setupNFTables ()
137+ err = r .setupNFTables ()
121138 } else {
122- return r .setupIPTables ()
139+ err = r .setupIPTables ()
140+ }
141+ if err != nil {
142+ return err
123143 }
144+ r .logger .Debug ("auto-redirect configured in " , time .Since (startAt ))
145+ return nil
124146}
125147
126148func (r * autoRedirect ) Close () error {
@@ -134,6 +156,15 @@ func (r *autoRedirect) Close() error {
134156 )
135157}
136158
159+ func (r * autoRedirect ) UpdateRouteAddressSet () {
160+ if r .useNFTables {
161+ err := r .nftablesUpdateRouteAddressSet ()
162+ if err != nil {
163+ r .logger .Error ("update route address set: " , err )
164+ }
165+ }
166+ }
167+
137168func (r * autoRedirect ) initializeNFTables () error {
138169 nft , err := nftables .New ()
139170 if err != nil {
0 commit comments