77 "sync"
88 "time"
99
10+ "github.com/metacubex/sing-tun/control"
1011 "github.com/sagernet/sing/common/buf"
1112 E "github.com/sagernet/sing/common/exceptions"
1213 "github.com/sagernet/sing/common/logger"
@@ -107,11 +108,11 @@ func (m *networkUpdateMonitor) Close() error {
107108
108109func (m * defaultInterfaceMonitor ) checkUpdate () error {
109110 var (
110- defaultInterface * net .Interface
111+ defaultInterface * control .Interface
111112 err error
112113 )
113114 if m .underNetworkExtension {
114- defaultInterface , err = getDefaultInterfaceBySocket ()
115+ defaultInterface , err = m . getDefaultInterfaceBySocket ()
115116 if err != nil {
116117 return err
117118 }
@@ -144,7 +145,7 @@ func (m *defaultInterfaceMonitor) checkUpdate() error {
144145 if ones != 0 {
145146 continue
146147 }
147- routeInterface , err := net . InterfaceByIndex (routeMessage .Index )
148+ routeInterface , err := m . interfaceFinder . ByIndex (routeMessage .Index )
148149 if err != nil {
149150 return err
150151 }
@@ -167,18 +168,20 @@ func (m *defaultInterfaceMonitor) checkUpdate() error {
167168 if defaultInterface == nil {
168169 return ErrNoRoute
169170 }
170- oldInterface := m .defaultInterfaceName
171- oldIndex := m .defaultInterfaceIndex
172- m .defaultInterfaceIndex = defaultInterface .Index
173- m .defaultInterfaceName = defaultInterface .Name
174- if oldInterface == m .defaultInterfaceName && oldIndex == m .defaultInterfaceIndex {
171+ oldInterface := m .defaultInterface .Load ()
172+ newInterface , err := m .interfaceFinder .ByIndex (defaultInterface .Index )
173+ if err != nil {
174+ return E .Cause (err , "find updated interface: " , defaultInterface .Name )
175+ }
176+ m .defaultInterface .Store (newInterface )
177+ if oldInterface != nil && oldInterface .Equals (* newInterface ) {
175178 return nil
176179 }
177- m .emit (EventInterfaceUpdate )
180+ m .emit (newInterface , 0 )
178181 return nil
179182}
180183
181- func getDefaultInterfaceBySocket () (* net .Interface , error ) {
184+ func ( m * defaultInterfaceMonitor ) getDefaultInterfaceBySocket () (* control .Interface , error ) {
182185 socketFd , err := unix .Socket (unix .AF_INET , unix .SOCK_STREAM , 0 )
183186 if err != nil {
184187 return nil , E .Cause (err , "create file descriptor" )
@@ -221,24 +224,5 @@ func getDefaultInterfaceBySocket() (*net.Interface, error) {
221224 case <- time .After (time .Second ):
222225 return nil , nil
223226 }
224- interfaces , err := net .Interfaces ()
225- if err != nil {
226- return nil , E .Cause (err , "net.Interfaces" )
227- }
228- for _ , netInterface := range interfaces {
229- interfaceAddrs , err := netInterface .Addrs ()
230- if err != nil {
231- return nil , E .Cause (err , "net.Interfaces.Addrs" )
232- }
233- for _ , interfaceAddr := range interfaceAddrs {
234- ipNet , isIPNet := interfaceAddr .(* net.IPNet )
235- if ! isIPNet {
236- continue
237- }
238- if ipNet .Contains (selectedAddr .AsSlice ()) {
239- return & netInterface , nil
240- }
241- }
242- }
243- return nil , E .New ("no interface found for address " , selectedAddr )
227+ return m .interfaceFinder .ByAddr (selectedAddr )
244228}
0 commit comments