atom-device/iface_windows.go

71 lines
1.4 KiB
Go

//go:build windows
package Atom_Device
import (
"fmt"
"golang.org/x/sys/windows"
"golang.zx2c4.com/wireguard/tun"
"golang.zx2c4.com/wireguard/windows/elevate"
"golang.zx2c4.com/wireguard/windows/tunnel/winipcfg"
"net"
"net/netip"
)
func init() {
var err error
tun.WintunTunnelType = "Atom"
if err != nil {
panic(err)
}
guid, err := windows.GUIDFromString("{E15D88C1-A15E-4CA1-9577-97FCF2CB995E}")
if err != nil {
panic(err)
}
tun.WintunStaticRequestedGUID = &guid
}
func NewTun(ifName string, mtu int, localIP net.IP, ipMask net.IPMask) (tun.Device, error) {
var tunDevice tun.Device
err := elevate.DoAsSystem(func() error {
var err error
tunDevice, err = tun.CreateTUN(ifName, mtu)
if err != nil {
return fmt.Errorf("create tun: %v", err)
}
return nil
})
if err != nil {
return nil, fmt.Errorf("do as system: %v", err)
}
nativeTun := tunDevice.(*tun.NativeTun)
luid := winipcfg.LUID(nativeTun.LUID())
ones, _ := ipMask.Size()
netAddr := netip.MustParseAddr(localIP.String())
prefix := netip.PrefixFrom(netAddr, ones)
err = luid.SetIPAddresses([]netip.Prefix{prefix})
if err != nil {
return nil, fmt.Errorf("unable to setup interface IP: %v", err)
}
return tunDevice, nil
}
func (d *Device) InterfaceName() (string, error) {
nativeTun := d.tun.(*tun.NativeTun)
luid := winipcfg.LUID(nativeTun.LUID())
guid, err := luid.GUID()
if err != nil {
return "", err
}
return guid.String(), nil
}