mirror of
https://github.com/fosrl/newt.git
synced 2026-02-08 05:56:40 +00:00
64 lines
1.8 KiB
Go
64 lines
1.8 KiB
Go
//go:build windows
|
|
|
|
package network
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"net/netip"
|
|
|
|
"github.com/fosrl/newt/logger"
|
|
"golang.zx2c4.com/wireguard/windows/tunnel/winipcfg"
|
|
)
|
|
|
|
func configureWindows(interfaceName string, ip net.IP, ipNet *net.IPNet) error {
|
|
logger.Info("Configuring Windows interface: %s", interfaceName)
|
|
|
|
// Get the LUID for the interface
|
|
iface, err := net.InterfaceByName(interfaceName)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to get interface %s: %v", interfaceName, err)
|
|
}
|
|
|
|
luid, err := winipcfg.LUIDFromIndex(uint32(iface.Index))
|
|
if err != nil {
|
|
return fmt.Errorf("failed to get LUID for interface %s: %v", interfaceName, err)
|
|
}
|
|
|
|
// Create the IP address prefix
|
|
maskBits, _ := ipNet.Mask.Size()
|
|
|
|
// Ensure we convert to the correct IP version (IPv4 vs IPv6)
|
|
var addr netip.Addr
|
|
if ip4 := ip.To4(); ip4 != nil {
|
|
// IPv4 address
|
|
addr, _ = netip.AddrFromSlice(ip4)
|
|
} else {
|
|
// IPv6 address
|
|
addr, _ = netip.AddrFromSlice(ip)
|
|
}
|
|
if !addr.IsValid() {
|
|
return fmt.Errorf("failed to convert IP address")
|
|
}
|
|
prefix := netip.PrefixFrom(addr, maskBits)
|
|
|
|
// Add the IP address to the interface
|
|
logger.Info("Adding IP address %s to interface %s", prefix.String(), interfaceName)
|
|
err = luid.AddIPAddress(prefix)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to add IP address: %v", err)
|
|
}
|
|
|
|
// This was required when we were using the subprocess "netsh" command to bring up the interface.
|
|
// With the winipcfg library, the interface should already be up after adding the IP so we dont
|
|
// need this step anymore as far as I can tell.
|
|
|
|
// // Wait for the interface to be up and have the correct IP
|
|
// err = waitForInterfaceUp(interfaceName, ip, 30*time.Second)
|
|
// if err != nil {
|
|
// return fmt.Errorf("interface did not come up within timeout: %v", err)
|
|
// }
|
|
|
|
return nil
|
|
}
|