package netlink import ( "context" "log/slog" "slices" "github.com/vishvananda/netlink" ) // RouteSubscribe takes a chan down which notifications will be sent // when routes are added or deleted. Rules are not currently supported func RouteSubscribe(ctx context.Context, ch chan<- RouteUpdate) error { rawChan := make(chan netlink.RouteUpdate) err := netlink.RouteSubscribe(rawChan, ctx.Done()) if err != nil { return err } go func() { defer close(ch) for { select { case <-ctx.Done(): return case e := <-rawChan: if e.Dst == nil || e.Gw == nil { continue } ru := RouteUpdate{ Dst: e.Dst, Via: e.Gw, } if !slices.Contains([]uint16{24, 25}, e.Type) { slog.Debug("DropUnsupportRouteEvent") continue } if e.Type == 24 { ru.New = true } ch <- ru } } }() return nil }