func (d *Discoverer) recvAnnouncements(b beacon.Interface) { for { buf, addr := b.Recv() var pkt Announce err := pkt.UnmarshalXDR(buf) if err != nil && err != io.EOF { if debug { l.Debugf("discover: Failed to unmarshal local announcement from %s:\n%s", addr, hex.Dump(buf)) } continue } if debug { l.Debugf("discover: Received local announcement from %s for %s", addr, protocol.DeviceIDFromBytes(pkt.This.ID)) } var newDevice bool if bytes.Compare(pkt.This.ID, d.myID[:]) != 0 { newDevice = d.registerDevice(addr, pkt.This) } if newDevice { select { case d.forcedBcastTick <- time.Now(): } } } }
func (c *localClient) recvAnnouncements(b beacon.Interface) { for { buf, addr := b.Recv() var pkt Announce err := pkt.UnmarshalXDR(buf) if err != nil && err != io.EOF { l.Debugf("discover: Failed to unmarshal local announcement from %s:\n%s", addr, hex.Dump(buf)) continue } if pkt.Magic != AnnouncementMagic { l.Debugf("discover: Incorrect magic from %s: %s != %s", addr, pkt.Magic, AnnouncementMagic) continue } l.Debugf("discover: Received local announcement from %s for %s", addr, protocol.DeviceIDFromBytes(pkt.This.ID)) var newDevice bool if !bytes.Equal(pkt.This.ID, c.myID[:]) { newDevice = c.registerDevice(addr, pkt.This) } if newDevice { // Force a transmit to announce ourselves, if we are ready to do // so right away. select { case c.forcedBcastTick <- time.Now(): default: } } } }
// 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 runbeacon(bc beacon.Interface, fake bool) { go bc.Serve() go recv(bc) if fake { go send(bc) } }
// receives and prints discovery announcements func recv(bc beacon.Interface) { seen := make(map[string]bool) for { data, src := bc.Recv() if m := binary.BigEndian.Uint32(data); m != discover.Magic { log.Printf("Incorrect magic %x in announcement from %v", m, src) continue } var ann discover.Announce ann.Unmarshal(data[4:]) if ann.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 := ann.ID.String() + src.String() if all || !seen[key] { log.Printf("Announcement from %v\n", src) log.Printf(" %v at %s\n", ann.ID, strings.Join(ann.Addresses, ", ")) seen[key] = true } } }
// sends fake discovery announcements once every second func send(bc beacon.Interface) { ann := discover.Announce{ ID: myID, Addresses: []string{"tcp://fake.example.com:12345"}, } bs, _ := ann.Marshal() for { bc.Send(bs) time.Sleep(time.Second) } }
func (c *localClient) recvAnnouncements(b beacon.Interface) { warnedAbout := make(map[string]bool) for { buf, addr := b.Recv() if len(buf) < 4 { l.Debugf("discover: short packet from %s") continue } magic := binary.BigEndian.Uint32(buf) switch magic { case Magic: // All good case v13Magic: // Old version if !warnedAbout[addr.String()] { l.Warnf("Incompatible (v0.13) local discovery packet from %v - upgrade that device to connect", addr) warnedAbout[addr.String()] = true } continue default: l.Debugf("discover: Incorrect magic %x from %s", magic, addr) continue } var pkt Announce err := pkt.Unmarshal(buf[4:]) if err != nil && err != io.EOF { l.Debugf("discover: Failed to unmarshal local announcement from %s:\n%s", addr, hex.Dump(buf)) continue } l.Debugf("discover: Received local announcement from %s for %s", addr, pkt.ID) var newDevice bool if pkt.ID != c.myID { newDevice = c.registerDevice(addr, pkt) } if newDevice { // Force a transmit to announce ourselves, if we are ready to do // so right away. select { case c.forcedBcastTick <- time.Now(): default: } } } }
// sends fake discovery announcements once every second func send(bc beacon.Interface) { ann := discover.Announce{ Magic: discover.AnnouncementMagic, This: discover.Device{ ID: myID, Addresses: []discover.Address{ {URL: "tcp://fake.example.com:12345"}, }, }, } bs, _ := ann.MarshalXDR() for { bc.Send(bs) time.Sleep(time.Second) } }