func (d *Discoverer) Hint(device string, addrs []string) { resAddrs := resolveAddrs(addrs) var id protocol.DeviceID id.UnmarshalText([]byte(device)) d.registerDevice(nil, Device{ Addresses: resAddrs, ID: id[:], }) }
func handleAnnounceV2(db *leveldb.DB, addr *net.UDPAddr, buf []byte) error { var pkt discover.Announce err := pkt.UnmarshalXDR(buf) if err != nil && err != io.EOF { return err } if debug { log.Printf("<- %v %#v", addr, pkt) } lock.Lock() announces++ lock.Unlock() ip := addr.IP.To4() if ip == nil { ip = addr.IP.To16() } var addrs []address now := time.Now().Unix() for _, addr := range pkt.This.Addresses { tip := addr.IP if len(tip) == 0 { tip = ip } addrs = append(addrs, address{ ip: tip, port: addr.Port, seen: now, }) } var id protocol.DeviceID if len(pkt.This.ID) == 32 { // Raw node ID copy(id[:], pkt.This.ID) } else { err = id.UnmarshalText(pkt.This.ID) if err != nil { return err } } update(db, id, addrs) return nil }
func handleQueryV2(db *leveldb.DB, conn *net.UDPConn, addr *net.UDPAddr, buf []byte) error { var pkt discover.Query err := pkt.UnmarshalXDR(buf) if err != nil { return err } if debug { log.Printf("<- %v %#v", addr, pkt) } var id protocol.DeviceID if len(pkt.DeviceID) == 32 { // Raw node ID copy(id[:], pkt.DeviceID) } else { err = id.UnmarshalText(pkt.DeviceID) if err != nil { return err } } lock.Lock() queries++ lock.Unlock() addrs := get(db, id) now := time.Now().Unix() if len(addrs) > 0 { ann := discover.Announce{ Magic: discover.AnnouncementMagic, This: discover.Device{ ID: pkt.DeviceID, }, } for _, addr := range addrs { if now-addr.seen > cacheLimitSeconds { continue } ann.This.Addresses = append(ann.This.Addresses, discover.Address{IP: addr.ip, Port: addr.port}) } if debug { log.Printf("-> %v %#v", addr, pkt) } if len(ann.This.Addresses) == 0 { return nil } tb, err := ann.MarshalXDR() if err != nil { log.Println("QueryV2 response marshal:", err) return nil } _, err = conn.WriteToUDP(tb, addr) if err != nil { log.Println("QueryV2 response write:", err) return nil } lock.Lock() answered++ lock.Unlock() } return nil }