Compare commits
4 Commits
bf787efb49
...
03debcc17f
Author | SHA1 | Date |
---|---|---|
lemmi | 03debcc17f | |
lemmi | 9f38df5fa0 | |
lemmi | 96dcf14d5d | |
lemmi | 583f004994 |
6
go.mod
6
go.mod
|
@ -3,9 +3,7 @@ module git.freifunk-franken.de/jkimmel/rmon
|
|||
go 1.15
|
||||
|
||||
require (
|
||||
github.com/jsimonetti/rtnetlink v0.0.0-20210119154133-c676dcb4768c
|
||||
git.freifunk-franken.de/jkimmel/abbel v0.1.0
|
||||
github.com/lemmi/closer v0.0.1
|
||||
github.com/mdlayher/netlink v1.2.1
|
||||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect
|
||||
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4
|
||||
inet.af/netaddr v0.0.0-20211027220019-c74959edd3b6
|
||||
)
|
||||
|
|
74
go.sum
74
go.sum
|
@ -1,63 +1,45 @@
|
|||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M=
|
||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/josharian/native v0.0.0-20200817173448-b6b71def0850 h1:uhL5Gw7BINiiPAo24A2sxkcDI0Jt/sqp1v5xQCniEFA=
|
||||
github.com/josharian/native v0.0.0-20200817173448-b6b71def0850/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
|
||||
github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw=
|
||||
github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4/go.mod h1:WGuG/smIU4J/54PblvSbh+xvCZmpJnFgr3ds6Z55XMQ=
|
||||
github.com/jsimonetti/rtnetlink v0.0.0-20201009170750-9c6f07d100c1/go.mod h1:hqoO/u39cqLeBLebZ8fWdE96O7FxrAsRYhnVOdgHxok=
|
||||
github.com/jsimonetti/rtnetlink v0.0.0-20201216134343-bde56ed16391/go.mod h1:cR77jAZG3Y3bsb8hF6fHJbFoyFukLFOkQ98S0pQz3xw=
|
||||
github.com/jsimonetti/rtnetlink v0.0.0-20201220180245-69540ac93943/go.mod h1:z4c53zj6Eex712ROyh8WI0ihysb5j2ROyV42iNogmAs=
|
||||
github.com/jsimonetti/rtnetlink v0.0.0-20210119154133-c676dcb4768c h1:vfl4vq4LQzrOIN2nS8F1JWOnFo8qYCJEysHVBnXZM3c=
|
||||
github.com/jsimonetti/rtnetlink v0.0.0-20210119154133-c676dcb4768c/go.mod h1:ZXpIyOK59ZnN7J0BV99cZUPmsqDRZ3eq5X+st7u/oSA=
|
||||
git.freifunk-franken.de/jkimmel/abbel v0.1.0 h1:i+q3tXmcXGCooNWnRQ/9Lj08zCO5uBI714GYiTU2i4Y=
|
||||
git.freifunk-franken.de/jkimmel/abbel v0.1.0/go.mod h1:MIjum0vzuRmDeHdIk3im97VsIuaIvq5I1xnn7gfqoyw=
|
||||
github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw=
|
||||
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
|
||||
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
|
||||
github.com/lemmi/closer v0.0.1 h1:ZbrZeOvTnHXCj2lyW2eerLtLG7PWLN3ZDA5FaTEboG8=
|
||||
github.com/lemmi/closer v0.0.1/go.mod h1:EKvqW4FYfOqMeET6adNDHsdYN9QD9RgyNG38epAMVj4=
|
||||
github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA=
|
||||
github.com/mdlayher/netlink v1.0.0/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M=
|
||||
github.com/mdlayher/netlink v1.1.0/go.mod h1:H4WCitaheIsdF9yOYu8CFmCgQthAPIWZmcKp9uZHgmY=
|
||||
github.com/mdlayher/netlink v1.1.1/go.mod h1:WTYpFb/WTvlRJAyKhZL5/uy69TDDpHHu2VZmb2XgV7o=
|
||||
github.com/mdlayher/netlink v1.2.0/go.mod h1:kwVW1io0AZy9A1E2YYgaD4Cj+C+GPkU6klXCMzIJ9p8=
|
||||
github.com/mdlayher/netlink v1.2.1 h1:Q5xDCtos3xv72vqzjuAh5Ns/IUlFfoy+948yBNSktTc=
|
||||
github.com/mdlayher/netlink v1.2.1/go.mod h1:bacnNlfhqHqqLo4WsYeXSqfyXkInQ9JneWI68v1KwSU=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
go4.org/intern v0.0.0-20211027215823-ae77deb06f29 h1:UXLjNohABv4S58tHmeuIZDO6e3mHpW2Dx33gaNt03LE=
|
||||
go4.org/intern v0.0.0-20211027215823-ae77deb06f29/go.mod h1:cS2ma+47FKrLPdXFpr7CuxiTW3eyJbWew4qx0qtQWDA=
|
||||
go4.org/unsafe/assume-no-moving-gc v0.0.0-20211027215541-db492cf91b37 h1:Tx9kY6yUkLge/pFG7IEMwDZy6CS2ajFc9TvQdPCW0uA=
|
||||
go4.org/unsafe/assume-no-moving-gc v0.0.0-20211027215541-db492cf91b37/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY=
|
||||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20201216054612-986b41b23924/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20201224014010-6772e930b67b h1:iFwSg7t5GZmB/Q5TjiEAsdoLDrdJRC1RiF2WhuV29Qw=
|
||||
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201118182958-a01c418693c7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201218084310-7d0127a74742/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210110051926-789bb1bd4061/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4 h1:myAQVi0cGEoqQVR5POX+8RR2mrocKqNN1hmeMqhX27k=
|
||||
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
inet.af/netaddr v0.0.0-20211027220019-c74959edd3b6 h1:acCzuUSQ79tGsM/O50VRFySfMm19IoMKL+sZztZkCxw=
|
||||
inet.af/netaddr v0.0.0-20211027220019-c74959edd3b6/go.mod h1:y3MGhcFMlh0KZPMuXXow8mpjxxAk3yoDNsp4cQz54i8=
|
||||
|
|
108
main.go
108
main.go
|
@ -16,11 +16,12 @@ import (
|
|||
"sync"
|
||||
"time"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
"inet.af/netaddr"
|
||||
|
||||
"github.com/jsimonetti/rtnetlink"
|
||||
"github.com/lemmi/closer"
|
||||
"github.com/mdlayher/netlink"
|
||||
|
||||
"git.freifunk-franken.de/jkimmel/abbel/capture"
|
||||
"git.freifunk-franken.de/jkimmel/abbel/tlv"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -28,7 +29,7 @@ var (
|
|||
)
|
||||
|
||||
type route struct {
|
||||
Dst net.IPNet
|
||||
Dst netaddr.IPPrefix
|
||||
Counter uint
|
||||
UnreachableDuration time.Duration
|
||||
UnreachableSince time.Time
|
||||
|
@ -65,76 +66,61 @@ 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) net.IPNet {
|
||||
var zeros int
|
||||
switch rm.Family {
|
||||
case unix.AF_INET:
|
||||
zeros = 32
|
||||
case unix.AF_INET6:
|
||||
zeros = 128
|
||||
default:
|
||||
fmt.Fprintf(os.Stderr, "unexpected family %q", rm.Family)
|
||||
}
|
||||
return net.IPNet{
|
||||
IP: rm.Attributes.Dst,
|
||||
Mask: net.CIDRMask(int(rm.DstLength), zeros),
|
||||
}
|
||||
}
|
||||
|
||||
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())
|
||||
names, err := net.LookupAddr(r.Dst.IP().String())
|
||||
if err != nil || len(names) == 0 {
|
||||
return
|
||||
}
|
||||
if strings.HasSuffix(names[0], ".rdns.f3netze.de.") {
|
||||
return
|
||||
}
|
||||
rs.Lock()
|
||||
r.Hostname = strings.TrimRight(names[0], ".")
|
||||
rs.Unlock()
|
||||
}(r, rs)
|
||||
}
|
||||
|
||||
r.Counter++
|
||||
if r.UnreachableSince.IsZero() {
|
||||
r.UnreachableSince = time.Now()
|
||||
r.ReachableSince = time.Time{}
|
||||
r.Counter++
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
r.UnreachableDuration += time.Since(r.UnreachableSince)
|
||||
r.UnreachableSince = time.Time{}
|
||||
r.ReachableSince = time.Now()
|
||||
if !r.UnreachableSince.IsZero() {
|
||||
r.UnreachableDuration += time.Since(r.UnreachableSince)
|
||||
r.UnreachableSince = time.Time{}
|
||||
r.ReachableSince = time.Now()
|
||||
}
|
||||
|
||||
rs.stats[key] = r
|
||||
rs.stats[prefix] = r
|
||||
}
|
||||
|
||||
func (rs *routeStats) getAll() []route {
|
||||
|
@ -168,43 +154,35 @@ func (rs *routeStats) getLongest() []route {
|
|||
return ret
|
||||
}
|
||||
|
||||
func monitor(done <-chan struct{}, rs *routeStats) {
|
||||
c, err := netlink.Dial(unix.NETLINK_ROUTE, &netlink.Config{
|
||||
Groups: 1<<(unix.RTNLGRP_IPV4_ROUTE-1) | 1<<(unix.RTNLGRP_IPV6_ROUTE-1),
|
||||
})
|
||||
func monitor(done <-chan struct{}, rs *routeStats) error {
|
||||
conn, err := capture.FromInterface("any")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
return err
|
||||
}
|
||||
|
||||
go func() {
|
||||
<-done
|
||||
closer.Do(c)
|
||||
closer.Do(conn)
|
||||
}()
|
||||
|
||||
if err = c.SetReadBuffer(16 * 1048576); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
buf := [4096]byte{}
|
||||
var s tlv.PacketDecoder
|
||||
for {
|
||||
ms, err := c.Receive()
|
||||
b, src, ifindex, err := conn.ReadFrom(buf[:])
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
fmt.Println("Skipping packet:", err)
|
||||
continue
|
||||
}
|
||||
|
||||
for _, m := range ms {
|
||||
rm := rtnetlink.RouteMessage{}
|
||||
if err = rm.UnmarshalBinary(m.Data); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
if rm.Type != unix.RTN_UNREACHABLE ||
|
||||
rm.Protocol != 42 {
|
||||
continue
|
||||
}
|
||||
switch m.Header.Type {
|
||||
case unix.RTM_NEWROUTE:
|
||||
rs.add(rm)
|
||||
case unix.RTM_DELROUTE:
|
||||
rs.del(rm)
|
||||
s.Reset(b, src, ifindex)
|
||||
for s.Scan() {
|
||||
switch t := s.TLV().(type) {
|
||||
case tlv.Update:
|
||||
if t.Metric == 0xffff {
|
||||
rs.add(t.Prefix)
|
||||
} else {
|
||||
rs.del(t.Prefix)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue