mirror of
https://github.com/SagerNet/sing-tun.git
synced 2025-04-02 19:37:40 +03:00
Add tun.UpdateRouteOptions
This commit is contained in:
parent
d0887eabba
commit
f457988090
4 changed files with 67 additions and 7 deletions
1
tun.go
1
tun.go
|
@ -28,6 +28,7 @@ type Tun interface {
|
||||||
Name() (string, error)
|
Name() (string, error)
|
||||||
Start() error
|
Start() error
|
||||||
Close() error
|
Close() error
|
||||||
|
UpdateRouteOptions(tunOptions Options) error
|
||||||
}
|
}
|
||||||
|
|
||||||
type WinTun interface {
|
type WinTun interface {
|
||||||
|
|
|
@ -29,7 +29,7 @@ type NativeTun struct {
|
||||||
options Options
|
options Options
|
||||||
inet4Address [4]byte
|
inet4Address [4]byte
|
||||||
inet6Address [16]byte
|
inet6Address [16]byte
|
||||||
routerSet bool
|
routeSet bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *NativeTun) Name() (string, error) {
|
func (t *NativeTun) Name() (string, error) {
|
||||||
|
@ -258,9 +258,17 @@ func configure(tunFd int, ifIndex int, name string, options Options) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *NativeTun) UpdateRouteOptions(tunOptions Options) error {
|
||||||
|
err := t.unsetRoutes()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
t.options = tunOptions
|
||||||
|
return t.setRoutes()
|
||||||
|
}
|
||||||
|
|
||||||
func (t *NativeTun) setRoutes() error {
|
func (t *NativeTun) setRoutes() error {
|
||||||
if t.options.AutoRoute && t.options.FileDescriptor == 0 {
|
if t.options.AutoRoute && t.options.FileDescriptor == 0 {
|
||||||
|
|
||||||
routeRanges, err := t.options.BuildAutoRouteRanges(false)
|
routeRanges, err := t.options.BuildAutoRouteRanges(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -298,13 +306,13 @@ func (t *NativeTun) setRoutes() error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
flushDNSCache()
|
flushDNSCache()
|
||||||
t.routerSet = true
|
t.routeSet = true
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *NativeTun) unsetRoutes() error {
|
func (t *NativeTun) unsetRoutes() error {
|
||||||
if !t.routerSet {
|
if !t.routeSet {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
routeRanges, err := t.options.BuildAutoRouteRanges(false)
|
routeRanges, err := t.options.BuildAutoRouteRanges(false)
|
||||||
|
|
19
tun_linux.go
19
tun_linux.go
|
@ -495,6 +495,25 @@ func prefixToIPNet(prefix netip.Prefix) *net.IPNet {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *NativeTun) UpdateRouteOptions(tunOptions Options) error {
|
||||||
|
if t.options.FileDescriptor > 0 {
|
||||||
|
return nil
|
||||||
|
} else if !t.options.AutoRoute {
|
||||||
|
t.options = tunOptions
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
tunLink, err := netlink.LinkByName(t.options.Name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = t.unsetRoute0(tunLink)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
t.options = tunOptions
|
||||||
|
return t.setRoute(tunLink)
|
||||||
|
}
|
||||||
|
|
||||||
func (t *NativeTun) routes(tunLink netlink.Link) ([]netlink.Route, error) {
|
func (t *NativeTun) routes(tunLink netlink.Link) ([]netlink.Route, error) {
|
||||||
routeRanges, err := t.options.BuildAutoRouteRanges(false)
|
routeRanges, err := t.options.BuildAutoRouteRanges(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -178,9 +178,9 @@ func (t *NativeTun) Start() error {
|
||||||
} else {
|
} else {
|
||||||
err = luid.AddRoute(routeRange, gateway6, 0)
|
err = luid.AddRoute(routeRange, gateway6, 0)
|
||||||
}
|
}
|
||||||
}
|
if err != nil {
|
||||||
if err != nil {
|
return err
|
||||||
return err
|
}
|
||||||
}
|
}
|
||||||
err = windnsapi.FlushResolverCache()
|
err = windnsapi.FlushResolverCache()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -545,6 +545,38 @@ func (t *NativeTun) Close() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *NativeTun) UpdateRouteOptions(tunOptions Options) error {
|
||||||
|
t.options = tunOptions
|
||||||
|
if !t.options.AutoRoute {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
gateway4, gateway6 := t.options.Inet4GatewayAddr(), t.options.Inet6GatewayAddr()
|
||||||
|
routeRanges, err := t.options.BuildAutoRouteRanges(false)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
luid := winipcfg.LUID(t.adapter.LUID())
|
||||||
|
err = luid.FlushRoutes(windows.AF_UNSPEC)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, routeRange := range routeRanges {
|
||||||
|
if routeRange.Addr().Is4() {
|
||||||
|
err = luid.AddRoute(routeRange, gateway4, 0)
|
||||||
|
} else {
|
||||||
|
err = luid.AddRoute(routeRange, gateway6, 0)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err = windnsapi.FlushResolverCache()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func generateGUIDByDeviceName(name string) *windows.GUID {
|
func generateGUIDByDeviceName(name string) *windows.GUID {
|
||||||
hash := md5.New()
|
hash := md5.New()
|
||||||
hash.Write([]byte("wintun"))
|
hash.Write([]byte("wintun"))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue