discoverymgr : add netInterface change detector 84/203984/1
authordamon92 <damon92.lee@samsung.com>
Thu, 18 Apr 2019 09:04:07 +0000 (18:04 +0900)
committerdamon92 <damon92.lee@samsung.com>
Thu, 18 Apr 2019 09:04:07 +0000 (18:04 +0900)
Change-Id: I4da3c9a815bda46e9a27cf77bce70aea3bb43e5d

src/discoverymgr/discovery_execution.go
src/discoverymgr/vendor/grandcat/zeroconf/examples/register/server [deleted file]
src/discoverymgr/vendor/grandcat/zeroconf/examples/register/server.go
src/discoverymgr/vendor/grandcat/zeroconf/examples/resolv/client.go
src/discoverymgr/vendor/grandcat/zeroconf/server.go

index b1fcf52..7820be1 100755 (executable)
@@ -27,8 +27,11 @@ import (
 
 //GetDeviceList retune device list
 func GetDeviceList() ([]DeviceReturnInfo, error) {
+       gServer.IsInterfaceChange()
+
        zeroconf.MapMTX.Lock()
        defer zeroconf.MapMTX.Unlock()
+
        var ret []DeviceReturnInfo
        for key, value := range zeroconf.DeviceMap {
                ret = append(ret, DeviceReturnInfo{
@@ -41,6 +44,8 @@ func GetDeviceList() ([]DeviceReturnInfo, error) {
 
 //GetDeviceListWithService retune device list
 func GetDeviceListWithService(target string) ([]string, error) {
+       gServer.IsInterfaceChange()
+
        zeroconf.MapMTX.Lock()
        defer zeroconf.MapMTX.Unlock()
 
@@ -78,6 +83,7 @@ func discoveryBGR() {
                        time.Sleep(60 * 60000 * time.Millisecond)
                } else {
                        discoveryPeriod *= 2
+                       log.Println(logPrefix, "[discoveryBGR] will run after ", discoveryPeriod/1000, "sec")
                }
 
        }
diff --git a/src/discoverymgr/vendor/grandcat/zeroconf/examples/register/server b/src/discoverymgr/vendor/grandcat/zeroconf/examples/register/server
deleted file mode 100755 (executable)
index 4ab77da..0000000
Binary files a/src/discoverymgr/vendor/grandcat/zeroconf/examples/register/server and /dev/null differ
index 83186bc..1d1a5d6 100644 (file)
@@ -10,9 +10,9 @@ import (
 )
 
 var (
-       service  = flag.String("service", "_workstation._tcp", "Set the service category to look for devices.")
+       service  = flag.String("service", "_orchestration._tcp", "Set the service category to look for devices.")
        domain   = flag.String("domain", "local", "Set the search domain. For local networks, default is fine.")
-       waitTime = flag.Int("wait", 10, "Duration in [s] to run discovery.")
+       waitTime = flag.Int("wait", 3, "Duration in [s] to run discovery.")
 )
 
 func main() {
index d59c0c9..50d6bb1 100644 (file)
@@ -314,9 +314,9 @@ func (s *Server) parsePacket(packet []byte, ifIndex int, from net.Addr) error {
        return s.handleQuery(&msg, ifIndex, from)
 }
 
-func registerAdvertisedEntity(msg *dns.Msg, srcIP string) error {
-       log.Println("[registerAdvertisedEntity][IN] ", srcIP)
-       defer log.Println("[registerAdvertisedEntity][OUT]")
+func advertiseHandler(msg *dns.Msg, srcIP string) error {
+       log.Println("[advertiseHandler][IN] ", srcIP)
+       defer log.Println("[advertiseHandler][OUT]")
 
        var entry *ServiceEntry
        sections := append(msg.Answer, msg.Ns...)
@@ -328,7 +328,7 @@ func registerAdvertisedEntity(msg *dns.Msg, srcIP string) error {
        for _, answer := range sections {
                switch rr := answer.(type) {
                case *dns.TXT:
-                       log.Println("[registerAdvertisedEntity][case *dns.TXT:]", rr.Hdr.Name)
+                       log.Println("[advertiseHandler][case *dns.TXT:]", rr.Hdr.Name)
                        if params.ServiceInstanceName() != "" && params.ServiceInstanceName() != rr.Hdr.Name {
                                continue
                        } else if !strings.HasSuffix(rr.Hdr.Name, params.ServiceName()) {
@@ -341,7 +341,6 @@ func registerAdvertisedEntity(msg *dns.Msg, srcIP string) error {
                        entry.Text = rr.Txt
                        entry.TTL = rr.Hdr.Ttl
                default:
-                       log.Println("[registerAdvertisedEntity][case Not *dns.TXT:]")
                        continue
                }
        }
@@ -349,14 +348,14 @@ func registerAdvertisedEntity(msg *dns.Msg, srcIP string) error {
                return errors.New("NO dns.TXT")
        }
        if entry.TTL == 0 {
-               log.Println("[registerAdvertisedEntity]unregister Device: " + srcIP)
+               log.Println("[advertiseHandler]unregister " + srcIP)
                MapMTX.Lock()
                if _, ok := DeviceMap[srcIP]; ok {
                        delete(DeviceMap, srcIP)
                }
                MapMTX.Unlock()
        } else {
-               log.Println("[registerAdvertisedEntity]Discoverd Device: " + srcIP)
+               log.Println("[advertiseHandler]Discoverd " + srcIP)
                ServiceNames := make([]string, len(entry.Text))
                ServiceNames = entry.Text
                MapMTX.Lock()
@@ -373,7 +372,7 @@ func (s *Server) handleQuery(query *dns.Msg, ifIndex int, from net.Addr) error {
                deviceIP := from.String()
                if strings.Contains(deviceIP, ".") {
                        deviceIPPort := strings.Split(deviceIP, ":")
-                       return registerAdvertisedEntity(query, deviceIPPort[0])
+                       return advertiseHandler(query, deviceIPPort[0])
                }
                return nil
        }
@@ -431,7 +430,7 @@ func isKnownAnswer(resp *dns.Msg, query *dns.Msg) bool {
                }
                ptr := known.(*dns.PTR)
                if ptr.Ptr == answer.Ptr && hdr.Ttl >= answer.Hdr.Ttl/2 {
-                       // log.Printf("skipping known answer: %v", ptr)
+                       log.Printf("skipping known answer: %v", ptr)
                        return true
                }
        }
@@ -581,18 +580,6 @@ func (s *Server) probe() {
        q.SetQuestion(s.service.ServiceInstanceName(), dns.TypePTR)
        q.RecursionDesired = false
 
-       srv := &dns.SRV{
-               Hdr: dns.RR_Header{
-                       Name:   s.service.ServiceInstanceName(),
-                       Rrtype: dns.TypeSRV,
-                       Class:  dns.ClassINET,
-                       Ttl:    s.ttl,
-               },
-               Priority: 0,
-               Weight:   0,
-               Port:     uint16(s.service.Port),
-               Target:   s.service.HostName,
-       }
        txt := &dns.TXT{
                Hdr: dns.RR_Header{
                        Name:   s.service.ServiceInstanceName(),
@@ -602,7 +589,7 @@ func (s *Server) probe() {
                },
                Txt: s.service.Text,
        }
-       q.Ns = []dns.RR{srv, txt}
+       q.Ns = []dns.RR{txt}
 
        randomizer := rand.New(rand.NewSource(time.Now().UnixNano()))
 
@@ -678,7 +665,43 @@ func (s *Server) unregister() error {
        return s.multicastResponse(resp, 0)
 }
 
+//IsInterfaceChange checks if wifi interface is changed
+func (s *Server) IsInterfaceChange() {
+       v4 := s.service.AddrIPv4
+       var presentIPv4 []net.IP
+       ifaces, err := net.Interfaces()
+       if err != nil {
+               log.Println("[IsInterfaceChange]", err)
+               return
+       }
+       for _, iface := range ifaces {
+               if iface.Name[0:2] == "wl" {
+                       a4, _ := addrsForInterface(&iface)
+                       presentIPv4 = append(presentIPv4, a4...)
+                       for _, newip := range a4 {
+                               for _, oldip := range v4 {
+                                       if oldip.String() == newip.String() {
+                                               return
+                                       }
+                               }
+                       }
+               }
+       }
+       if presentIPv4 == nil {
+               log.Println("[IsInterfaceChange] NO WIFI Interface Found")
+               return
+       }
+       log.Println("[IsInterfaceChange]ip changed from ", s.service.AddrIPv4, " to ", presentIPv4)
+       s.service.AddrIPv4 = presentIPv4
+       MapMTX.Lock()
+       DeviceMap = make(map[string][]string)
+       MapMTX.Unlock()
+       s.probe()
+       return
+}
+
 func (s *Server) appendAddrs(list []dns.RR, ttl uint32, ifIndex int, flushCache bool) []dns.RR {
+       s.IsInterfaceChange()
        v4 := s.service.AddrIPv4
        v6 := s.service.AddrIPv6
        if len(v4) == 0 && len(v6) == 0 {
@@ -689,6 +712,7 @@ func (s *Server) appendAddrs(list []dns.RR, ttl uint32, ifIndex int, flushCache
                        v6 = append(v6, a6...)
                }
        }
+
        if ttl > 0 {
                // RFC6762 Section 10 says A/AAAA records SHOULD
                // use TTL of 120s, to account for network interface