// receives and prints discovery announcements func recv(bc beacon.Interface) { seen := make(map[string]bool) for { data, src := bc.Recv() var ann discover.Announce ann.UnmarshalXDR(data) if bytes.Equal(ann.This.ID, myID) { // This is one of our own fake packets, don't print it. continue } // Print announcement details for the first packet from a given // device ID and source address, or if -all was given. key := string(ann.This.ID) + src.String() if all || !seen[key] { log.Printf("Announcement from %v\n", src) log.Printf(" %v at %s\n", protocol.DeviceIDFromBytes(ann.This.ID), strings.Join(addrStrs(ann.This), ", ")) for _, dev := range ann.Extra { log.Printf(" %v at %s\n", protocol.DeviceIDFromBytes(dev.ID), strings.Join(addrStrs(dev), ", ")) } seen[key] = true } } }
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 (s *querysrv) handleAnnounce(addr *net.UDPAddr, buf []byte) error { var pkt discover.Announce err := pkt.UnmarshalXDR(buf) if err != nil && err != io.EOF { return err } var id protocol.DeviceID copy(id[:], pkt.This.ID) if id == protocol.LocalDeviceID { return fmt.Errorf("Rejecting announce for local device ID from %v", addr) } tx, err := s.db.Begin() if err != nil { return err } for _, annAddr := range pkt.This.Addresses { uri, err := url.Parse(annAddr) if err != nil { continue } host, port, err := net.SplitHostPort(uri.Host) if err != nil { continue } if len(host) == 0 { uri.Host = net.JoinHostPort(addr.IP.String(), port) } if err := s.updateAddress(tx, id, uri.String()); err != nil { tx.Rollback() return err } } _, err = tx.Stmt(s.prep["deleteRelay"]).Exec(id.String()) if err != nil { tx.Rollback() return err } for _, relay := range pkt.This.Relays { uri, err := url.Parse(relay.Address) if err != nil { continue } _, err = tx.Stmt(s.prep["insertRelay"]).Exec(id.String(), uri, relay.Latency) if err != nil { tx.Rollback() return err } } if err := s.updateDevice(tx, id); err != nil { tx.Rollback() return err } return tx.Commit() }