mirror of
https://codeberg.org/cunicu/cunicu.git
synced 2025-10-05 16:57:01 +08:00
daemon: use per-interface features
Signed-off-by: Steffen Vogel <post@steffenvogel.de>
This commit is contained in:
74
pkg/daemon/feature/rtsync/handlers.go
Normal file
74
pkg/daemon/feature/rtsync/handlers.go
Normal file
@@ -0,0 +1,74 @@
|
||||
package rtsync
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net"
|
||||
"net/netip"
|
||||
"syscall"
|
||||
|
||||
"github.com/stv0g/cunicu/pkg/core"
|
||||
"go.uber.org/zap"
|
||||
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
||||
)
|
||||
|
||||
func (rs *Interface) OnPeerAdded(p *core.Peer) {
|
||||
pk := p.PublicKey()
|
||||
gwV4, ok1 := netip.AddrFromSlice(pk.IPv4Address().IP)
|
||||
gwV6, ok2 := netip.AddrFromSlice(pk.IPv6Address().IP)
|
||||
if !ok1 || !ok2 {
|
||||
panic("failed to get address from slice")
|
||||
}
|
||||
|
||||
rs.gwMap[gwV4] = p
|
||||
rs.gwMap[gwV6] = p
|
||||
|
||||
rs.syncKernel() // Initial sync
|
||||
|
||||
p.OnModified(rs)
|
||||
}
|
||||
|
||||
func (rs *Interface) OnPeerRemoved(p *core.Peer) {
|
||||
pk := p.PublicKey()
|
||||
gwV4, ok1 := netip.AddrFromSlice(pk.IPv4Address().IP)
|
||||
gwV6, ok2 := netip.AddrFromSlice(pk.IPv6Address().IP)
|
||||
if !ok1 || !ok2 {
|
||||
panic("failed to get address from slice")
|
||||
}
|
||||
|
||||
delete(rs.gwMap, gwV4)
|
||||
delete(rs.gwMap, gwV6)
|
||||
|
||||
if err := rs.removeKernel(p); err != nil {
|
||||
rs.logger.Error("Failed to remove kernel routes for peer",
|
||||
zap.Error(err),
|
||||
zap.Any("intf", p.Interface),
|
||||
zap.Any("peer", p),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
func (rs *Interface) OnPeerModified(p *core.Peer, old *wgtypes.Peer, m core.PeerModifier, ipsAdded, ipsRemoved []net.IPNet) {
|
||||
for _, dst := range ipsAdded {
|
||||
if err := p.Interface.KernelDevice.AddRoute(dst, rs.Settings.RouteSync.Table); err != nil {
|
||||
rs.logger.Error("Failed to add route", zap.Error(err))
|
||||
continue
|
||||
}
|
||||
|
||||
rs.logger.Info("Added new AllowedIP to kernel routing table",
|
||||
zap.Any("dst", dst),
|
||||
zap.Any("intf", p.Interface),
|
||||
zap.Any("peer", p))
|
||||
}
|
||||
|
||||
for _, dst := range ipsRemoved {
|
||||
if err := p.Interface.KernelDevice.DeleteRoute(dst, rs.Settings.RouteSync.Table); err != nil && !errors.Is(err, syscall.ESRCH) {
|
||||
rs.logger.Error("Failed to delete route", zap.Error(err))
|
||||
continue
|
||||
}
|
||||
|
||||
rs.logger.Info("Remove vanished AllowedIP from kernel routing table",
|
||||
zap.Any("dst", dst),
|
||||
zap.Any("intf", p.Interface),
|
||||
zap.Any("peer", p))
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user