mirror of https://github.com/XTLS/Xray-core
				
				
				
			WireGuard kernelTun: Fix multi-outbounds not work (#4015)
Fixes https://github.com/XTLS/Xray-core/issues/2817pull/4017/head
							parent
							
								
									83ae38497b
								
							
						
					
					
						commit
						17825b25f2
					
				| 
						 | 
				
			
			@ -4,16 +4,18 @@ package wireguard
 | 
			
		|||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"errors"
 | 
			
		||||
	goerrors "errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net"
 | 
			
		||||
	"net/netip"
 | 
			
		||||
	"os"
 | 
			
		||||
	"sync"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/sys/unix"
 | 
			
		||||
 | 
			
		||||
	"github.com/sagernet/sing/common/control"
 | 
			
		||||
	"github.com/vishvananda/netlink"
 | 
			
		||||
	"github.com/xtls/xray-core/common/errors"
 | 
			
		||||
	wgtun "golang.zx2c4.com/wireguard/tun"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -27,6 +29,23 @@ type deviceNet struct {
 | 
			
		|||
	rules     []*netlink.Rule
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	tableIndex int = 10230
 | 
			
		||||
	mu         sync.Mutex
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func allocateIPv6TableIndex() int {
 | 
			
		||||
	mu.Lock()
 | 
			
		||||
	defer mu.Unlock()
 | 
			
		||||
 | 
			
		||||
	if tableIndex > 10230 {
 | 
			
		||||
		errors.LogInfo(context.Background(), "allocate new ipv6 table index: ", tableIndex)
 | 
			
		||||
	}
 | 
			
		||||
	currentIndex := tableIndex
 | 
			
		||||
	tableIndex++
 | 
			
		||||
	return currentIndex
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newDeviceNet(interfaceName string) *deviceNet {
 | 
			
		||||
	var dialer net.Dialer
 | 
			
		||||
	bindControl := control.BindToInterface(control.NewDefaultInterfaceFinder(), interfaceName, -1)
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +87,7 @@ func (d *deviceNet) Close() (err error) {
 | 
			
		|||
	if len(errs) == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return errors.Join(errs...)
 | 
			
		||||
	return goerrors.Join(errs...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func createKernelTun(localAddresses []netip.Addr, mtu int, handler promiscuousModeHandler) (t Tunnel, err error) {
 | 
			
		||||
| 
						 | 
				
			
			@ -138,7 +157,7 @@ func createKernelTun(localAddresses []netip.Addr, mtu int, handler promiscuousMo
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ipv6TableIndex := 1023
 | 
			
		||||
	ipv6TableIndex := allocateIPv6TableIndex()
 | 
			
		||||
	if v6 != nil {
 | 
			
		||||
		r := &netlink.Route{Table: ipv6TableIndex}
 | 
			
		||||
		for {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue