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 {
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue