mirror of
https://github.com/netbirdio/netbird.git
synced 2024-12-12 18:00:49 +01:00
e6e9f0322f
Before this change, NetBird Agent wasn't handling peer interface configuration changes dynamically. Also, remote peer configuration changes have not been applied (e.g. AllowedIPs changed). Not a very common cause, but still it should be handled. Now, Agent reacts to PeerConfig changes sent from the management service and restarts remote connections if AllowedIps have been changed.
60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
package iface
|
|
|
|
import (
|
|
"fmt"
|
|
log "github.com/sirupsen/logrus"
|
|
"golang.org/x/sys/windows"
|
|
"golang.zx2c4.com/wireguard/windows/driver"
|
|
"golang.zx2c4.com/wireguard/windows/tunnel/winipcfg"
|
|
"net"
|
|
)
|
|
|
|
// Create Creates a new Wireguard interface, sets a given IP and brings it up.
|
|
func (w *WGIface) Create() error {
|
|
w.mu.Lock()
|
|
defer w.mu.Unlock()
|
|
|
|
WintunStaticRequestedGUID, _ := windows.GenerateGUID()
|
|
adapter, err := driver.CreateAdapter(w.Name, "WireGuard", &WintunStaticRequestedGUID)
|
|
if err != nil {
|
|
err = fmt.Errorf("error creating adapter: %w", err)
|
|
return err
|
|
}
|
|
w.Interface = adapter
|
|
luid := adapter.LUID()
|
|
err = adapter.SetAdapterState(driver.AdapterStateUp)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
state, _ := luid.GUID()
|
|
log.Debugln("device guid: ", state.String())
|
|
return w.assignAddr(luid)
|
|
}
|
|
|
|
// assignAddr Adds IP address to the tunnel interface and network route based on the range provided
|
|
func (w *WGIface) assignAddr(luid winipcfg.LUID) error {
|
|
|
|
log.Debugf("adding address %s to interface: %s", w.Address.IP, w.Name)
|
|
err := luid.SetIPAddresses([]net.IPNet{{w.Address.IP, w.Address.Network.Mask}})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// UpdateAddr updates address of the interface
|
|
func (w *WGIface) UpdateAddr(newAddr string) error {
|
|
w.mu.Lock()
|
|
defer w.mu.Unlock()
|
|
|
|
luid := w.Interface.(*driver.Adapter).LUID()
|
|
addr, err := parseAddress(newAddr)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
w.Address = addr
|
|
return w.assignAddr(luid)
|
|
}
|