//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{
//GetDeviceListWithService retune device list
func GetDeviceListWithService(target string) ([]string, error) {
+ gServer.IsInterfaceChange()
+
zeroconf.MapMTX.Lock()
defer zeroconf.MapMTX.Unlock()
time.Sleep(60 * 60000 * time.Millisecond)
} else {
discoveryPeriod *= 2
+ log.Println(logPrefix, "[discoveryBGR] will run after ", discoveryPeriod/1000, "sec")
}
}
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...)
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()) {
entry.Text = rr.Txt
entry.TTL = rr.Hdr.Ttl
default:
- log.Println("[registerAdvertisedEntity][case Not *dns.TXT:]")
continue
}
}
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()
deviceIP := from.String()
if strings.Contains(deviceIP, ".") {
deviceIPPort := strings.Split(deviceIP, ":")
- return registerAdvertisedEntity(query, deviceIPPort[0])
+ return advertiseHandler(query, deviceIPPort[0])
}
return nil
}
}
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
}
}
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(),
},
Txt: s.service.Text,
}
- q.Ns = []dns.RR{srv, txt}
+ q.Ns = []dns.RR{txt}
randomizer := rand.New(rand.NewSource(time.Now().UnixNano()))
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 {
v6 = append(v6, a6...)
}
}
+
if ttl > 0 {
// RFC6762 Section 10 says A/AAAA records SHOULD
// use TTL of 120s, to account for network interface