mirror of
https://github.com/netbirdio/netbird.git
synced 2024-11-26 18:13:40 +01:00
94 lines
2.0 KiB
Go
94 lines
2.0 KiB
Go
|
package iface
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"net"
|
||
|
|
||
|
log "github.com/sirupsen/logrus"
|
||
|
"golang.org/x/sys/windows"
|
||
|
"golang.zx2c4.com/wireguard/windows/driver"
|
||
|
)
|
||
|
|
||
|
type tunDevice struct {
|
||
|
name string
|
||
|
address WGAddress
|
||
|
netInterface NetInterface
|
||
|
}
|
||
|
|
||
|
func newTunDevice(name string, address WGAddress, mtu int) *tunDevice {
|
||
|
return &tunDevice{name: name, address: address}
|
||
|
}
|
||
|
|
||
|
func (c *tunDevice) Create() error {
|
||
|
var err error
|
||
|
c.netInterface, err = c.createAdapter()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return c.assignAddr()
|
||
|
}
|
||
|
|
||
|
func (c *tunDevice) UpdateAddr(address WGAddress) error {
|
||
|
c.address = address
|
||
|
return c.assignAddr()
|
||
|
}
|
||
|
|
||
|
func (c *tunDevice) WgAddress() WGAddress {
|
||
|
return c.address
|
||
|
}
|
||
|
|
||
|
func (c *tunDevice) DeviceName() string {
|
||
|
return c.name
|
||
|
}
|
||
|
|
||
|
func (c *tunDevice) Close() error {
|
||
|
if c.netInterface == nil {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
return c.netInterface.Close()
|
||
|
}
|
||
|
|
||
|
func (c *tunDevice) getInterfaceGUIDString() (string, error) {
|
||
|
if c.netInterface == nil {
|
||
|
return "", fmt.Errorf("interface has not been initialized yet")
|
||
|
}
|
||
|
windowsDevice := c.netInterface.(*driver.Adapter)
|
||
|
luid := windowsDevice.LUID()
|
||
|
guid, err := luid.GUID()
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
return guid.String(), nil
|
||
|
}
|
||
|
|
||
|
func (c *tunDevice) createAdapter() (NetInterface, error) {
|
||
|
WintunStaticRequestedGUID, _ := windows.GenerateGUID()
|
||
|
adapter, err := driver.CreateAdapter(c.name, "WireGuard", &WintunStaticRequestedGUID)
|
||
|
if err != nil {
|
||
|
err = fmt.Errorf("error creating adapter: %w", err)
|
||
|
return nil, err
|
||
|
}
|
||
|
err = adapter.SetAdapterState(driver.AdapterStateUp)
|
||
|
if err != nil {
|
||
|
return adapter, err
|
||
|
}
|
||
|
state, _ := adapter.LUID().GUID()
|
||
|
log.Debugln("device guid: ", state.String())
|
||
|
return adapter, nil
|
||
|
}
|
||
|
|
||
|
// assignAddr Adds IP address to the tunnel interface and network route based on the range provided
|
||
|
func (c *tunDevice) assignAddr() error {
|
||
|
luid := c.netInterface.(*driver.Adapter).LUID()
|
||
|
|
||
|
log.Debugf("adding address %s to interface: %s", c.address.IP, c.name)
|
||
|
err := luid.SetIPAddresses([]net.IPNet{{c.address.IP, c.address.Network.Mask}})
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|