use netaddr.IPPrefix as map key

This commit is contained in:
lemmi 2021-12-15 05:41:05 +01:00
parent 583f004994
commit 96dcf14d5d
1 changed files with 13 additions and 16 deletions

29
main.go
View File

@ -66,16 +66,16 @@ func (r route) String() string {
type routeStats struct {
sync.Mutex
stats map[string]*route
stats map[netaddr.IPPrefix]*route
}
func newRouteStats() *routeStats {
return &routeStats{
stats: make(map[string]*route),
stats: make(map[netaddr.IPPrefix]*route),
}
}
func dstIPNet(rm rtnetlink.RouteMessage) netaddr.IPPrefix {
func prefixFromRM(rm rtnetlink.RouteMessage) netaddr.IPPrefix {
switch rm.Family {
case unix.AF_INET, unix.AF_INET6:
default:
@ -85,15 +85,13 @@ func dstIPNet(rm rtnetlink.RouteMessage) netaddr.IPPrefix {
return netaddr.IPPrefixFrom(ip, rm.DstLength)
}
func (rs *routeStats) add(rm rtnetlink.RouteMessage) {
func (rs *routeStats) add(prefix netaddr.IPPrefix) {
rs.Lock()
defer rs.Unlock()
dst := dstIPNet(rm)
key := dst.String()
r := rs.stats[key]
r := rs.stats[prefix]
if r == nil {
r = &route{Dst: dst}
r = &route{Dst: prefix}
go func(r *route, rs *routeStats) {
names, err := net.LookupAddr(r.Dst.IP().String())
if err != nil || len(names) == 0 {
@ -111,16 +109,14 @@ func (rs *routeStats) add(rm rtnetlink.RouteMessage) {
r.ReachableSince = time.Time{}
}
rs.stats[key] = r
rs.stats[prefix] = r
}
func (rs *routeStats) del(rm rtnetlink.RouteMessage) {
func (rs *routeStats) del(prefix netaddr.IPPrefix) {
rs.Lock()
defer rs.Unlock()
dst := dstIPNet(rm)
key := dst.String()
r := rs.stats[key]
r := rs.stats[prefix]
if r == nil {
return
}
@ -129,7 +125,7 @@ func (rs *routeStats) del(rm rtnetlink.RouteMessage) {
r.UnreachableSince = time.Time{}
r.ReachableSince = time.Now()
rs.stats[key] = r
rs.stats[prefix] = r
}
func (rs *routeStats) getAll() []route {
@ -195,11 +191,12 @@ func monitor(done <-chan struct{}, rs *routeStats) {
rm.Protocol != 42 {
continue
}
prefix := prefixFromRM(rm)
switch m.Header.Type {
case unix.RTM_NEWROUTE:
rs.add(rm)
rs.add(prefix)
case unix.RTM_DELROUTE:
rs.del(rm)
rs.del(prefix)
}
}
}