summaryrefslogtreecommitdiff
path: root/addr.go
diff options
context:
space:
mode:
Diffstat (limited to 'addr.go')
-rw-r--r--addr.go56
1 files changed, 42 insertions, 14 deletions
diff --git a/addr.go b/addr.go
index 080f11b..dc8c237 100644
--- a/addr.go
+++ b/addr.go
@@ -2,28 +2,56 @@ package main
import (
"net"
- "github.com/miekg/dns"
+ "github.com/vishvananda/netlink"
+ "fmt"
+ "log"
)
-type Addr struct {
- IP net.IP
+type AddrSet struct {
+ addrs map[string]net.IP
}
-func (addr Addr) buildRR(name string, ttl int) dns.RR {
- if ip4 := addr.IP.To4(); ip4 != nil {
- return &dns.A{
- Hdr: dns.RR_Header{Name: name, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: uint32(ttl)},
- A: ip4,
- }
+func (as *AddrSet) ScanInterface(iface string, family Family) error {
+ link, err := netlink.LinkByName(iface)
+ if err != nil {
+ return fmt.Errorf("netlink.LinkByName %v: %v", iface, err)
}
- if ip6 := addr.IP.To16(); ip6 != nil {
- return &dns.AAAA{
- Hdr: dns.RR_Header{Name: name, Rrtype: dns.TypeAAAA, Class: dns.ClassINET, Ttl: uint32(ttl)},
- AAAA: ip6,
- }
+ addrList, err := netlink.AddrList(link, int(family))
+ if err != nil {
+ return fmt.Errorf("netlink.AddrList %v: %v", link, err)
+ }
+
+ // set
+ as.addrs = make(map[string]net.IP)
+
+ for _, addr := range addrList {
+ as.applyLinkAddr(link, addr)
}
return nil
}
+func (as *AddrSet) applyLinkAddr(link netlink.Link, addr netlink.Addr) {
+ linkUp := link.Attrs().Flags & net.FlagUp != 0
+
+ if addr.Scope >= int(netlink.SCOPE_LINK) {
+ return
+ }
+
+ as.applyAddr(addr.IP, linkUp)
+}
+
+// Update state for address
+func (as *AddrSet) applyAddr(ip net.IP, up bool) {
+ if up {
+ log.Printf("update: up %v", ip)
+
+ as.addrs[ip.String()] = ip
+
+ } else {
+ log.Printf("update: down %v", ip)
+
+ delete(as.addrs, ip.String())
+ }
+}