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