5
0
mirror of https://github.com/cwinfo/yggdrasil-go.git synced 2024-12-24 12:45:40 +00:00
yggdrasil-go/src/tuntap/tun_windows.go

71 lines
1.9 KiB
Go
Raw Normal View History

package tuntap
2018-06-12 22:50:08 +00:00
import (
"errors"
2018-06-12 22:50:08 +00:00
"fmt"
"os/exec"
"strings"
"time"
2018-06-12 22:50:08 +00:00
wgtun "golang.zx2c4.com/wireguard/tun"
2018-06-12 22:50:08 +00:00
)
// This is to catch Windows platforms
// Configures the TUN adapter with the correct IPv6 address and MTU.
func (tun *TunAdapter) setup(ifname string, addr string, mtu int) error {
iface, err := wgtun.CreateTUN(ifname, mtu)
if err != nil {
panic(err)
}
tun.iface = iface
if mtu, err := iface.MTU(); err == nil {
tun.mtu = getSupportedMTU(mtu)
} else {
tun.mtu = 0
2018-01-25 17:44:56 +00:00
}
return tun.setupAddress(addr)
}
2018-06-12 21:45:53 +00:00
// Sets the MTU of the TAP adapter.
func (tun *TunAdapter) setupMTU(mtu int) error {
if tun.iface == nil || tun.iface.Name() == "" {
return errors.New("Can't configure MTU as TAP adapter is not present")
}
2018-01-25 17:44:56 +00:00
// Set MTU
cmd := exec.Command("netsh", "interface", "ipv6", "set", "subinterface",
fmt.Sprintf("interface=%s", tun.iface.Name()),
fmt.Sprintf("mtu=%d", mtu),
"store=active")
tun.log.Debugln("netsh command:", strings.Join(cmd.Args, " "))
2018-01-25 17:44:56 +00:00
output, err := cmd.CombinedOutput()
if err != nil {
tun.log.Errorln("Windows netsh failed:", err)
tun.log.Traceln(string(output))
2018-01-25 17:44:56 +00:00
return err
}
time.Sleep(time.Second) // FIXME artifical delay to give netsh time to take effect
2018-01-25 17:44:56 +00:00
return nil
}
2018-06-12 21:45:53 +00:00
// Sets the IPv6 address of the TAP adapter.
func (tun *TunAdapter) setupAddress(addr string) error {
if tun.iface == nil || tun.iface.Name() == "" {
return errors.New("Can't configure IPv6 address as TAP adapter is not present")
}
// Set address
cmd := exec.Command("netsh", "interface", "ipv6", "add", "address",
fmt.Sprintf("interface=%s", tun.iface.Name()),
fmt.Sprintf("addr=%s", addr),
"store=active")
tun.log.Debugln("netsh command:", strings.Join(cmd.Args, " "))
output, err := cmd.CombinedOutput()
if err != nil {
tun.log.Errorln("Windows netsh failed:", err)
tun.log.Traceln(string(output))
return err
}
time.Sleep(time.Second) // FIXME artifical delay to give netsh time to take effect
return nil
}