use netaddr.IPPrefix as map key
This commit is contained in:
parent
583f004994
commit
96dcf14d5d
29
main.go
29
main.go
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue