summaryrefslogtreecommitdiffstats
path: root/discover/discover.go
diff options
context:
space:
mode:
Diffstat (limited to 'discover/discover.go')
-rw-r--r--discover/discover.go95
1 files changed, 16 insertions, 79 deletions
diff --git a/discover/discover.go b/discover/discover.go
index c17e02f0da..655c7c679f 100644
--- a/discover/discover.go
+++ b/discover/discover.go
@@ -9,9 +9,9 @@ import (
"strings"
"sync"
"time"
- "code.google.com/p/go.net/ipv6"
"github.com/calmh/syncthing/buffers"
+ "github.com/calmh/syncthing/mc"
)
const (
@@ -19,18 +19,14 @@ const (
)
type Discoverer struct {
- MyID string
- ListenAddresses []string
- BroadcastIntv time.Duration
- ExtBroadcastIntv time.Duration
-
- conn *ipv6.PacketConn
- intfs []*net.Interface
- registry map[string][]string
- registryLock sync.RWMutex
- extServer string
- group *net.UDPAddr
-
+ MyID string
+ ListenAddresses []string
+ BroadcastIntv time.Duration
+ ExtBroadcastIntv time.Duration
+ beacon *mc.Beacon
+ registry map[string][]string
+ registryLock sync.RWMutex
+ extServer string
localBroadcastTick <-chan time.Time
forcedBroadcastTick chan time.Time
}
@@ -50,43 +46,9 @@ func NewDiscoverer(id string, addresses []string, extServer string) (*Discoverer
ListenAddresses: addresses,
BroadcastIntv: 30 * time.Second,
ExtBroadcastIntv: 1800 * time.Second,
+ beacon: mc.NewBeacon("239.21.0.25", 21025),
registry: make(map[string][]string),
extServer: extServer,
- group: &net.UDPAddr{IP: net.ParseIP("ff02::2012:1025"), Port: AnnouncementPort},
- }
-
- // Listen on a multicast socket. This enables sharing the socket, i.e.
- // other instances of syncting on the same box can listen on the same
- // group/port.
-
- conn, err := net.ListenPacket("udp6", fmt.Sprintf("[ff02::]:%d", AnnouncementPort))
- if err != nil {
- return nil, err
- }
- disc.conn = ipv6.NewPacketConn(conn)
-
- // Join the multicast group on as many interfaces as possible. Remember
- // which those were.
-
- intfs, err := net.Interfaces()
- if err != nil {
- log.Printf("discover/interfaces: %v; no local announcements", err)
- conn.Close()
- return nil, err
- }
-
- for _, intf := range intfs {
- intf := intf
- addrs, err := intf.Addrs()
- if err == nil && len(addrs) > 0 && intf.Flags&net.FlagMulticast != 0 && intf.Flags&net.FlagUp != 0 {
- if err := disc.conn.JoinGroup(&intf, disc.group); err != nil {
- if debug {
- dlog.Printf("%v; not joining on %s", err, intf.Name)
- }
- } else {
- disc.intfs = append(disc.intfs, &intf)
- }
- }
}
// Receive announcements sent to the local multicast group.
@@ -140,21 +102,9 @@ func (d *Discoverer) announcementPkt() []byte {
func (d *Discoverer) sendLocalAnnouncements() {
var buf = d.announcementPkt()
- var errCounter = 0
- var err error
- wcm := ipv6.ControlMessage{HopLimit: 1}
- for errCounter < maxErrors {
- for _, intf := range d.intfs {
- wcm.IfIndex = intf.Index
- if _, err = d.conn.WriteTo(buf, &wcm, d.group); err != nil {
- log.Printf("discover/sendLocalAnnouncements: on %s: %v; no local announcement", intf.Name, err)
- errCounter++
- continue
- } else {
- errCounter = 0
- }
- }
+ for {
+ d.beacon.Send(buf)
select {
case <-d.localBroadcastTick:
@@ -196,26 +146,16 @@ func (d *Discoverer) sendExternalAnnouncements() {
}
func (d *Discoverer) recvAnnouncements() {
- var buf = make([]byte, 1024)
- var errCounter = 0
- var err error
- for errCounter < maxErrors {
- n, _, addr, err := d.conn.ReadFrom(buf)
- if err != nil {
- errCounter++
- time.Sleep(time.Second)
- continue
- }
+ for {
+ buf, addr := d.beacon.Recv()
if debug {
- dlog.Printf("read announcement:\n%s", hex.Dump(buf[:n]))
+ dlog.Printf("read announcement:\n%s", hex.Dump(buf))
}
var pkt AnnounceV2
- err = pkt.UnmarshalXDR(buf[:n])
+ err := pkt.UnmarshalXDR(buf)
if err != nil {
- errCounter++
- time.Sleep(time.Second)
continue
}
@@ -223,8 +163,6 @@ func (d *Discoverer) recvAnnouncements() {
dlog.Printf("parsed announcement: %#v", pkt)
}
- errCounter = 0
-
if pkt.NodeID != d.MyID {
var addrs []string
for _, a := range pkt.Addresses {
@@ -252,7 +190,6 @@ func (d *Discoverer) recvAnnouncements() {
d.registryLock.Unlock()
}
}
- log.Println("discover/read: stopping due to too many errors:", err)
}
func (d *Discoverer) externalLookup(node string) []string {