@@ -2,6 +2,7 @@ package tun
22
33import (
44 "context"
5+ "syscall"
56
67 "github.com/xtls/xray-core/common"
78 "github.com/xtls/xray-core/common/buf"
@@ -15,6 +16,7 @@ import (
1516 "github.com/xtls/xray-core/features/policy"
1617 "github.com/xtls/xray-core/features/routing"
1718 "github.com/xtls/xray-core/transport"
19+ "github.com/xtls/xray-core/transport/internet"
1820 "github.com/xtls/xray-core/transport/internet/stat"
1921)
2022
@@ -38,11 +40,6 @@ type ConnectionHandler interface {
3840// Handler implements ConnectionHandler
3941var _ ConnectionHandler = (* Handler )(nil )
4042
41- func (t * Handler ) policy () policy.Session {
42- p := t .policyManager .ForLevel (t .config .UserLevel )
43- return p
44- }
45-
4643// Init the Handler instance with necessary parameters
4744func (t * Handler ) Init (ctx context.Context , pm policy.Manager , dispatcher routing.Dispatcher ) error {
4845 var err error
@@ -60,15 +57,37 @@ func (t *Handler) Init(ctx context.Context, pm policy.Manager, dispatcher routin
6057 t .dispatcher = dispatcher
6158
6259 tunName := t .config .Name
63- tunOptions := TunOptions {
64- Name : tunName ,
65- MTU : t .config .MTU ,
66- }
67- tunInterface , err := NewTun (tunOptions )
60+ tunInterface , err := NewTun (t .config )
6861 if err != nil {
6962 return err
7063 }
7164
65+ if t .config .AutoOutboundsInterface != "" {
66+ tunIndex , err := tunInterface .Index ()
67+ if err != nil {
68+ _ = tunInterface .Close ()
69+ return err
70+ }
71+ if t .config .AutoOutboundsInterface == "auto" {
72+ t .config .AutoOutboundsInterface = ""
73+ }
74+ updater = & InterfaceUpdater {tunIndex : tunIndex , fixedName : t .config .AutoOutboundsInterface }
75+ updater .Update ()
76+ internet .RegisterDialerController (func (network , address string , c syscall.RawConn ) error {
77+ iface := updater .Get ()
78+ if iface == nil {
79+ errors .LogInfo (context .Background (), "[tun] falied to set interface > iface == nil" )
80+ return nil
81+ }
82+ return c .Control (func (fd uintptr ) {
83+ err := setinterface (network , address , fd , iface )
84+ if err != nil {
85+ errors .LogInfoInner (context .Background (), err , "[tun] falied to set interface" )
86+ }
87+ })
88+ })
89+ }
90+
7291 errors .LogInfo (t .ctx , tunName , " created" )
7392
7493 tunStackOptions := StackOptions {
0 commit comments