Procházet zdrojové kódy

try to fix windows?

Jay Wren před 1 rokem
rodič
revize
8d4dd26484
1 změnil soubory, kde provedl 25 přidání a 15 odebrání
  1. 25 15
      overlay/tun_windows.go

+ 25 - 15
overlay/tun_windows.go

@@ -21,7 +21,7 @@ import (
 const tunGUIDLabel = "Fixed Nebula Windows GUID v1"
 
 type tun struct {
-	luid windows.LUID
+	luid winipcfg.LUID
 }
 
 func newTunFromFd(_ *config.C, _ *logrus.Logger, _ int, _ []netip.Prefix) (*wgTun, error) {
@@ -56,13 +56,14 @@ func newTun(c *config.C, l *logrus.Logger, vpnNetworks []netip.Prefix, _ bool) (
 	// Create Windows-specific route manager
 	rm := &tun{}
 
-	// Get LUID from the device name
-	luid, err := winipcfg.LUIDFromAlias(actualName)
-	if err != nil {
+	// Get LUID from the TUN device
+	// The WireGuard TUN device on Windows should provide a LUID() method
+	if nativeTun, ok := tunDevice.(interface{ LUID() uint64 }); ok {
+		rm.luid = winipcfg.LUID(nativeTun.LUID())
+	} else {
 		tunDevice.Close()
-		return nil, fmt.Errorf("failed to get LUID: %w", err)
+		return nil, fmt.Errorf("failed to get LUID from TUN device")
 	}
-	rm.luid = luid
 	t.routeManager = rm
 
 	err = t.reload(c, true)
@@ -113,7 +114,9 @@ func (rm *tun) SetMTU(t *wgTun, mtu int) {
 
 func (rm *tun) setMTU(t *wgTun, mtu int) error {
 	// Set MTU using winipcfg
-	return rm.luid.SetIPInterfaceMTU(uint32(mtu))
+	// Note: MTU setting on Windows TUN devices may be handled by the driver
+	// For now, we'll skip explicit MTU setting as the WireGuard TUN handles it
+	return nil
 }
 
 func (rm *tun) SetDefaultRoute(t *wgTun, cidr netip.Prefix) error {
@@ -128,17 +131,19 @@ func (rm *tun) AddRoutes(t *wgTun, logErrors bool) error {
 			continue
 		}
 
-		route := winipcfg.RouteData{
-			Destination: r.Cidr,
-			Metric:      uint32(r.Metric),
-		}
-
 		if r.MTU > 0 {
 			// Windows route MTU is not directly supported
 			t.l.WithField("route", r).Debug("Route MTU is not supported on Windows")
 		}
 
-		err := rm.luid.AddRoute(route.Destination, route.Destination.Addr(), route.Metric)
+		// Use winipcfg to add the route
+		// The rm.luid should have the AddRoute method from winipcfg
+		if len(r.Via) == 0 {
+			t.l.WithField("route", r).Warn("Route has no via address, skipping")
+			continue
+		}
+
+		err := rm.luid.AddRoute(r.Cidr, r.Via[0].Addr(), uint32(r.Metric))
 		if err != nil {
 			retErr := util.NewContextualError("Failed to add route", map[string]any{"route": r}, err)
 			if logErrors {
@@ -160,7 +165,11 @@ func (rm *tun) RemoveRoutes(t *wgTun, routes []Route) {
 			continue
 		}
 
-		err := rm.luid.DeleteRoute(r.Cidr, r.Cidr.Addr())
+		if len(r.Via) == 0 {
+			continue
+		}
+
+		err := rm.luid.DeleteRoute(r.Cidr, r.Via[0].Addr())
 		if err != nil {
 			t.l.WithError(err).WithField("route", r).Error("Failed to remove route")
 		} else {
@@ -182,7 +191,8 @@ func (rm *tun) NewMultiQueueReader(t *wgTun) (io.ReadWriteCloser, error) {
 
 func (rm *tun) addIP(t *wgTun, network netip.Prefix) error {
 	// Add IP address using winipcfg
-	err := rm.luid.AddIPAddress(network)
+	// SetIPAddresses expects a slice of prefixes
+	err := rm.luid.SetIPAddresses([]netip.Prefix{network})
 	if err != nil {
 		return fmt.Errorf("failed to add IP address %s: %w", network, err)
 	}