diff --git a/Makefile b/Makefile index 1757de4a..0104e3ff 100644 --- a/Makefile +++ b/Makefile @@ -70,7 +70,7 @@ $(NETCHECK_EXE): common/*.go common/*/*.go net/*.go go build $(BUILD_FLAGS) -o $@ ./$(@D) $(NETGO_CHECK) -$(WEAVER_EXE): router/*.go ipam/*.go ipam/*/*.go nameserver/*.go prog/weaver/*.go +$(WEAVER_EXE): router/*.go mesh/*.go ipam/*.go ipam/*/*.go nameserver/*.go prog/weaver/*.go $(WEAVEPROXY_EXE): proxy/*.go prog/weaveproxy/main.go $(NETCHECK_EXE): prog/netcheck/netcheck.go diff --git a/ipam/allocator.go b/ipam/allocator.go index 4c32404e..888b9433 100644 --- a/ipam/allocator.go +++ b/ipam/allocator.go @@ -11,8 +11,8 @@ import ( "github.com/weaveworks/weave/ipam/paxos" "github.com/weaveworks/weave/ipam/ring" "github.com/weaveworks/weave/ipam/space" + "github.com/weaveworks/weave/mesh" "github.com/weaveworks/weave/net/address" - "github.com/weaveworks/weave/router" ) // Kinds of message we can unicast to other peers @@ -43,31 +43,31 @@ type operation interface { // are used around data structures. type Allocator struct { actionChan chan<- func() - ourName router.PeerName + ourName mesh.PeerName universe address.Range // superset of all ranges ring *ring.Ring // information on ranges owned by all peers space space.Space // more detail on ranges owned by us owned map[string][]address.Address // who owns what addresses, indexed by container-ID - nicknames map[router.PeerName]string // so we can map nicknames for rmpeer + nicknames map[mesh.PeerName]string // so we can map nicknames for rmpeer pendingAllocates []operation // held until we get some free space pendingClaims []operation // held until we know who owns the space - gossip router.Gossip // our link to the outside world for sending messages + gossip mesh.Gossip // our link to the outside world for sending messages paxos *paxos.Node paxosTicker *time.Ticker shuttingDown bool // to avoid doing any requests while trying to shut down - isKnownPeer func(router.PeerName) bool + isKnownPeer func(mesh.PeerName) bool now func() time.Time } // NewAllocator creates and initialises a new Allocator -func NewAllocator(ourName router.PeerName, ourUID router.PeerUID, ourNickname string, universe address.Range, quorum uint, isKnownPeer func(name router.PeerName) bool) *Allocator { +func NewAllocator(ourName mesh.PeerName, ourUID mesh.PeerUID, ourNickname string, universe address.Range, quorum uint, isKnownPeer func(name mesh.PeerName) bool) *Allocator { return &Allocator{ ourName: ourName, universe: universe, ring: ring.New(universe.Start, universe.End, ourName), owned: make(map[string][]address.Address), paxos: paxos.NewNode(ourName, ourUID, quorum), - nicknames: map[router.PeerName]string{ourName: ourNickname}, + nicknames: map[mesh.PeerName]string{ourName: ourNickname}, isKnownPeer: isKnownPeer, now: time.Now, } @@ -75,7 +75,7 @@ func NewAllocator(ourName router.PeerName, ourUID router.PeerUID, ourNickname st // Start runs the allocator goroutine func (alloc *Allocator) Start() { - actionChan := make(chan func(), router.ChannelSize) + actionChan := make(chan func(), mesh.ChannelSize) alloc.actionChan = actionChan go alloc.actorLoop(actionChan) } @@ -165,7 +165,7 @@ func (alloc *Allocator) tryPendingOps() { } } -func (alloc *Allocator) spaceRequestDenied(sender router.PeerName, r address.Range) { +func (alloc *Allocator) spaceRequestDenied(sender mesh.PeerName, r address.Range) { for i := 0; i < len(alloc.pendingClaims); { claim := alloc.pendingClaims[i].(*claim) if r.Contains(claim.addr) { @@ -276,27 +276,27 @@ func (alloc *Allocator) Free(ident string, addrToFree address.Address) error { return <-errChan } -func (alloc *Allocator) pickPeerFromNicknames(isValid func(router.PeerName) bool) router.PeerName { +func (alloc *Allocator) pickPeerFromNicknames(isValid func(mesh.PeerName) bool) mesh.PeerName { for name := range alloc.nicknames { if name != alloc.ourName && isValid(name) { return name } } - return router.UnknownPeerName + return mesh.UnknownPeerName } -func (alloc *Allocator) pickPeerForTransfer() router.PeerName { +func (alloc *Allocator) pickPeerForTransfer() mesh.PeerName { // first try alive peers that actively participate in IPAM (i.e. have entries) - if heir := alloc.ring.PickPeerForTransfer(alloc.isKnownPeer); heir != router.UnknownPeerName { + if heir := alloc.ring.PickPeerForTransfer(alloc.isKnownPeer); heir != mesh.UnknownPeerName { return heir } // next try alive peers that have IPAM enabled but have no entries - if heir := alloc.pickPeerFromNicknames(alloc.isKnownPeer); heir != router.UnknownPeerName { + if heir := alloc.pickPeerFromNicknames(alloc.isKnownPeer); heir != mesh.UnknownPeerName { return heir } // next try disappeared peers that still have entries - t := func(router.PeerName) bool { return true } - if heir := alloc.ring.PickPeerForTransfer(t); heir != router.UnknownPeerName { + t := func(mesh.PeerName) bool { return true } + if heir := alloc.ring.PickPeerForTransfer(t); heir != mesh.UnknownPeerName { return heir } // finally, disappeared peers that that passively participated in IPAM @@ -311,7 +311,7 @@ func (alloc *Allocator) Shutdown() { alloc.shuttingDown = true alloc.cancelOps(&alloc.pendingClaims) alloc.cancelOps(&alloc.pendingAllocates) - if heir := alloc.pickPeerForTransfer(); heir != router.UnknownPeerName { + if heir := alloc.pickPeerForTransfer(); heir != mesh.UnknownPeerName { alloc.ring.Transfer(alloc.ourName, heir) alloc.space.Clear() alloc.gossip.GossipBroadcast(alloc.Gossip()) @@ -350,14 +350,14 @@ func (alloc *Allocator) AdminTakeoverRanges(peerNameOrNickname string) error { // call into the router for this because we are interested in peers // that have gone away but are still in the ring, which is why we // maintain our own nicknames map. -func (alloc *Allocator) lookupPeername(name string) (router.PeerName, error) { +func (alloc *Allocator) lookupPeername(name string) (mesh.PeerName, error) { for peername, nickname := range alloc.nicknames { if nickname == name { return peername, nil } } - return router.PeerNameFromString(name) + return mesh.PeerNameFromString(name) } // Restrict the peers in "nicknames" to those in the ring plus peers known to the router @@ -370,7 +370,7 @@ func (alloc *Allocator) pruneNicknames() { } } -func (alloc *Allocator) annotatePeernames(names []router.PeerName) []string { +func (alloc *Allocator) annotatePeernames(names []mesh.PeerName) []string { var res []string for _, name := range names { if nickname, found := alloc.nicknames[name]; found { @@ -388,7 +388,7 @@ func decodeRange(msg []byte) (r address.Range, err error) { } // OnGossipUnicast (Sync) -func (alloc *Allocator) OnGossipUnicast(sender router.PeerName, msg []byte) error { +func (alloc *Allocator) OnGossipUnicast(sender mesh.PeerName, msg []byte) error { alloc.debugln("OnGossipUnicast from", sender, ": ", len(msg), "bytes") resultChan := make(chan error) alloc.actionChan <- func() { @@ -414,7 +414,7 @@ func (alloc *Allocator) OnGossipUnicast(sender router.PeerName, msg []byte) erro } // OnGossipBroadcast (Sync) -func (alloc *Allocator) OnGossipBroadcast(sender router.PeerName, msg []byte) (router.GossipData, error) { +func (alloc *Allocator) OnGossipBroadcast(sender mesh.PeerName, msg []byte) (mesh.GossipData, error) { alloc.debugln("OnGossipBroadcast from", sender, ":", len(msg), "bytes") resultChan := make(chan error) alloc.actionChan <- func() { @@ -427,7 +427,7 @@ type gossipState struct { // We send a timstamp along with the information to be // gossipped in order to detect skewed clocks Now int64 - Nicknames map[router.PeerName]string + Nicknames map[mesh.PeerName]string Paxos paxos.GossipState Ring *ring.Ring @@ -463,11 +463,11 @@ func (alloc *Allocator) Encode() []byte { } // OnGossip (Sync) -func (alloc *Allocator) OnGossip(msg []byte) (router.GossipData, error) { +func (alloc *Allocator) OnGossip(msg []byte) (mesh.GossipData, error) { alloc.debugln("Allocator.OnGossip:", len(msg), "bytes") resultChan := make(chan error) alloc.actionChan <- func() { - resultChan <- alloc.update(router.UnknownPeerName, msg) + resultChan <- alloc.update(mesh.UnknownPeerName, msg) } return nil, <-resultChan // for now, we never propagate updates. TBD } @@ -478,7 +478,7 @@ type ipamGossipData struct { alloc *Allocator } -func (d *ipamGossipData) Merge(other router.GossipData) { +func (d *ipamGossipData) Merge(other mesh.GossipData) { // no-op } @@ -488,12 +488,12 @@ func (d *ipamGossipData) Encode() [][]byte { // Gossip returns a GossipData implementation, which in this case always // returns the latest ring state (and does nothing on merge) -func (alloc *Allocator) Gossip() router.GossipData { +func (alloc *Allocator) Gossip() mesh.GossipData { return &ipamGossipData{alloc} } // SetInterfaces gives the allocator two interfaces for talking to the outside world -func (alloc *Allocator) SetInterfaces(gossip router.Gossip) { +func (alloc *Allocator) SetInterfaces(gossip mesh.Gossip) { alloc.gossip = gossip } @@ -540,7 +540,7 @@ func (alloc *Allocator) establishRing() { } } -func (alloc *Allocator) createRing(peers []router.PeerName) { +func (alloc *Allocator) createRing(peers []mesh.PeerName) { alloc.debugln("Paxos consensus:", peers) alloc.ring.ClaimForPeers(normalizeConsensus(peers)) alloc.gossip.GossipBroadcast(alloc.Gossip()) @@ -563,7 +563,7 @@ func (alloc *Allocator) ringUpdated() { } // For compatibility with sort.Interface -type peerNames []router.PeerName +type peerNames []mesh.PeerName func (a peerNames) Len() int { return len(a) } func (a peerNames) Less(i, j int) bool { return a[i] < a[j] } @@ -572,7 +572,7 @@ func (a peerNames) Swap(i, j int) { a[i], a[j] = a[j], a[i] } // When we get a consensus from Paxos, the peer names are not in a // defined order and may contain duplicates. This function sorts them // and de-dupes. -func normalizeConsensus(consensus []router.PeerName) []router.PeerName { +func normalizeConsensus(consensus []mesh.PeerName) []mesh.PeerName { if len(consensus) == 0 { return nil } @@ -607,22 +607,22 @@ func encodeRange(r address.Range) []byte { return buf.Bytes() } -func (alloc *Allocator) sendSpaceRequest(dest router.PeerName, r address.Range) error { +func (alloc *Allocator) sendSpaceRequest(dest mesh.PeerName, r address.Range) error { msg := append([]byte{msgSpaceRequest}, encodeRange(r)...) return alloc.gossip.GossipUnicast(dest, msg) } -func (alloc *Allocator) sendSpaceRequestDenied(dest router.PeerName, r address.Range) error { +func (alloc *Allocator) sendSpaceRequestDenied(dest mesh.PeerName, r address.Range) error { msg := append([]byte{msgSpaceRequestDenied}, encodeRange(r)...) return alloc.gossip.GossipUnicast(dest, msg) } -func (alloc *Allocator) sendRingUpdate(dest router.PeerName) { +func (alloc *Allocator) sendRingUpdate(dest mesh.PeerName) { msg := append([]byte{msgRingUpdate}, alloc.encode()...) alloc.gossip.GossipUnicast(dest, msg) } -func (alloc *Allocator) update(sender router.PeerName, msg []byte) error { +func (alloc *Allocator) update(sender mesh.PeerName, msg []byte) error { reader := bytes.NewReader(msg) decoder := gob.NewDecoder(reader) var data gossipState @@ -674,7 +674,7 @@ func (alloc *Allocator) update(sender router.PeerName, msg []byte) error { alloc.createRing(cons.Value) } } - } else if sender != router.UnknownPeerName { + } else if sender != mesh.UnknownPeerName { // Sender is trying to initialize a ring, but we have one // already - send it straight back alloc.sendRingUpdate(sender) @@ -684,7 +684,7 @@ func (alloc *Allocator) update(sender router.PeerName, msg []byte) error { return nil } -func (alloc *Allocator) donateSpace(r address.Range, to router.PeerName) { +func (alloc *Allocator) donateSpace(r address.Range, to mesh.PeerName) { // No matter what we do, we'll send a unicast gossip // of our ring back to tha chap who asked for space. // This serves to both tell him of any space we might diff --git a/ipam/claim.go b/ipam/claim.go index 2515afd2..20ec6519 100644 --- a/ipam/claim.go +++ b/ipam/claim.go @@ -4,8 +4,8 @@ import ( "fmt" "github.com/weaveworks/weave/common" + "github.com/weaveworks/weave/mesh" "github.com/weaveworks/weave/net/address" - "github.com/weaveworks/weave/router" ) type claim struct { @@ -43,7 +43,7 @@ func (c *claim) Try(alloc *Allocator) bool { switch owner := alloc.ring.Owner(c.addr); owner { case alloc.ourName: // success - case router.UnknownPeerName: + case mesh.UnknownPeerName: // If our ring doesn't know, it must be empty. if c.noErrorOnUnknown { alloc.infof("Claim %s for %s: address allocator still initializing; will try later.", c.addr, c.ident) @@ -86,7 +86,7 @@ func (c *claim) Try(alloc *Allocator) bool { return true } -func (c *claim) deniedBy(alloc *Allocator, owner router.PeerName) { +func (c *claim) deniedBy(alloc *Allocator, owner mesh.PeerName) { name, found := alloc.nicknames[owner] if found { name = " (" + name + ")" diff --git a/ipam/paxos/paxos.go b/ipam/paxos/paxos.go index 18d3aeea..3466bb8c 100644 --- a/ipam/paxos/paxos.go +++ b/ipam/paxos/paxos.go @@ -1,7 +1,7 @@ package paxos import ( - "github.com/weaveworks/weave/router" + "github.com/weaveworks/weave/mesh" ) // The node identifier. The use of the UID here is important: Paxos @@ -9,8 +9,8 @@ import ( // node does not restart and lose its Paxos state but claim to have // the same ID. type NodeID struct { - Name router.PeerName - UID router.PeerUID + Name mesh.PeerName + UID mesh.PeerUID } // note all fields exported in structs so we can Gob them @@ -39,7 +39,7 @@ func (a ProposalID) valid() bool { } // For seeding IPAM, the value we want consensus on is a set of peer names -type Value []router.PeerName +type Value []mesh.PeerName // An AcceptedValue is a Value plus the proposal which originated that // Value. The origin is not essential, but makes comparing @@ -72,7 +72,7 @@ type Node struct { knows GossipState } -func NewNode(name router.PeerName, uid router.PeerUID, quorum uint) *Node { +func NewNode(name mesh.PeerName, uid mesh.PeerUID, quorum uint) *Node { return &Node{ id: NodeID{name, uid}, quorum: quorum, @@ -223,7 +223,7 @@ func (node *Node) Think() bool { // about. This is not necessarily all peer names, but it is at least // a quorum, and so good enough for seeding the ring. func (node *Node) pickValue() Value { - val := make([]router.PeerName, len(node.knows)) + val := make([]mesh.PeerName, len(node.knows)) i := 0 for id := range node.knows { val[i] = id.Name diff --git a/ipam/paxos/paxos_test.go b/ipam/paxos/paxos_test.go index c1d5bfe0..c9dd1ff9 100644 --- a/ipam/paxos/paxos_test.go +++ b/ipam/paxos/paxos_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - "github.com/weaveworks/weave/router" + "github.com/weaveworks/weave/mesh" ) type TestNode struct { @@ -97,8 +97,8 @@ func makeRandomModel(params *TestParams, r *rand.Rand, t *testing.T) *Model { } for i := range m.nodes { - m.nodes[i].Node = NewNode(router.PeerName(i/2+1), - router.PeerUID(r.Int63()), m.quorum) + m.nodes[i].Node = NewNode(mesh.PeerName(i/2+1), + mesh.PeerUID(r.Int63()), m.quorum) m.nodes[i].Propose() } @@ -172,8 +172,8 @@ func (m *Model) isolateNode(node *TestNode) { // Restart a node func (m *Model) restart(node *TestNode) { - node.Node = NewNode(router.PeerName(m.nextID), - router.PeerUID(m.r.Int63()), m.quorum) + node.Node = NewNode(mesh.PeerName(m.nextID), + mesh.PeerUID(m.r.Int63()), m.quorum) m.nextID++ node.Propose() diff --git a/ipam/ring/entry.go b/ipam/ring/entry.go index d1d832ed..872a13ab 100644 --- a/ipam/ring/entry.go +++ b/ipam/ring/entry.go @@ -4,14 +4,14 @@ import ( "sort" "github.com/weaveworks/weave/common" + "github.com/weaveworks/weave/mesh" "github.com/weaveworks/weave/net/address" - "github.com/weaveworks/weave/router" ) // Entry represents entries around the ring type entry struct { Token address.Address // The start of this range - Peer router.PeerName // Who owns this range + Peer mesh.PeerName // Who owns this range Version uint32 // Version of this range Free address.Offset // Number of free IPs in this range } @@ -21,7 +21,7 @@ func (e *entry) Equal(e2 *entry) bool { e.Version == e2.Version } -func (e *entry) update(peername router.PeerName, free address.Offset) { +func (e *entry) update(peername mesh.PeerName, free address.Offset) { e.Peer = peername e.Version++ e.Free = free diff --git a/ipam/ring/ring.go b/ipam/ring/ring.go index fee7991e..30f32b8d 100644 --- a/ipam/ring/ring.go +++ b/ipam/ring/ring.go @@ -13,16 +13,16 @@ import ( "time" "github.com/weaveworks/weave/common" + "github.com/weaveworks/weave/mesh" "github.com/weaveworks/weave/net/address" - "github.com/weaveworks/weave/router" ) // Ring represents the ring itself type Ring struct { - Start, End address.Address // [min, max) tokens in this ring. Due to wrapping, min == max (effectively) - Peer router.PeerName // name of peer owning this ring instance - Entries entries // list of entries sorted by token - Seeds []router.PeerName // peers with which the ring was seeded + Start, End address.Address // [min, max) tokens in this ring. Due to wrapping, min == max (effectively) + Peer mesh.PeerName // name of peer owning this ring instance + Entries entries // list of entries sorted by token + Seeds []mesh.PeerName // peers with which the ring was seeded } func (r *Ring) assertInvariants() { @@ -84,7 +84,7 @@ func (r *Ring) checkInvariants() error { } // New creates an empty ring belonging to peer. -func New(start, end address.Address, peer router.PeerName) *Ring { +func New(start, end address.Address, peer mesh.PeerName) *Ring { common.Assert(start < end) ring := &Ring{Start: start, End: end, Peer: peer, Entries: make([]*entry, 0)} @@ -111,7 +111,7 @@ func (r *Ring) distance(start, end address.Address) address.Offset { // Preconditions: // - start < end // - [start, end) must be owned by the calling peer -func (r *Ring) GrantRangeToHost(start, end address.Address, peer router.PeerName) { +func (r *Ring) GrantRangeToHost(start, end address.Address, peer mesh.PeerName) { //fmt.Printf("%s GrantRangeToHost [%v,%v) -> %s\n", r.Peer, start, end, peer) r.assertInvariants() @@ -210,7 +210,7 @@ func (r *Ring) Merge(gossip Ring) error { addToResult := func(e entry) { result = append(result, &e) } var mine, theirs *entry - var previousOwner *router.PeerName + var previousOwner *mesh.PeerName // i is index into r.Entries; j is index into gossip.Entries var i, j int for i < len(r.Entries) && j < len(gossip.Entries) { @@ -318,7 +318,7 @@ func (r *Ring) OwnedRanges() (result []address.Range) { // ClaimForPeers claims the entire ring for the array of peers passed // in. Only works for empty rings. -func (r *Ring) ClaimForPeers(peers []router.PeerName) { +func (r *Ring) ClaimForPeers(peers []mesh.PeerName) { common.Assert(r.Empty()) defer r.assertInvariants() defer r.updateExportedVariables() @@ -350,7 +350,7 @@ func (r *Ring) ClaimForPeers(peers []router.PeerName) { r.Seeds = peers } -func (r *Ring) FprintWithNicknames(w io.Writer, m map[router.PeerName]string) { +func (r *Ring) FprintWithNicknames(w io.Writer, m map[mesh.PeerName]string) { for _, entry := range r.Entries { nickname, found := m[entry.Peer] if found { @@ -365,7 +365,7 @@ func (r *Ring) FprintWithNicknames(w io.Writer, m map[router.PeerName]string) { func (r *Ring) String() string { var buffer bytes.Buffer fmt.Fprintf(&buffer, "Ring [%s, %s)", r.Start, r.End) - r.FprintWithNicknames(&buffer, make(map[router.PeerName]string)) + r.FprintWithNicknames(&buffer, make(map[mesh.PeerName]string)) return buffer.String() } @@ -415,7 +415,7 @@ func (r *Ring) ReportFree(freespace map[address.Address]address.Offset) { type weightedPeer struct { weight float64 - peername router.PeerName + peername mesh.PeerName } type weightedPeers []weightedPeer @@ -426,10 +426,10 @@ func (ws weightedPeers) Swap(i, j int) { ws[i], ws[j] = ws[j], ws[i] } // ChoosePeersToAskForSpace returns all peers we can ask for space in // the range [start, end), in weighted-random order. Assumes start= 0 { peerIndex = rand.Intn(len(peers) - 1) @@ -729,7 +729,7 @@ func TestFuzzRingHard(t *testing.T) { } func (r *Ring) ClaimItAll() { - r.ClaimForPeers([]router.PeerName{r.Peer}) + r.ClaimForPeers([]mesh.PeerName{r.Peer}) } func (es entries) String() string { diff --git a/ipam/testutils_test.go b/ipam/testutils_test.go index 144e313f..3aac1cce 100644 --- a/ipam/testutils_test.go +++ b/ipam/testutils_test.go @@ -8,13 +8,13 @@ import ( "time" "github.com/stretchr/testify/require" + "github.com/weaveworks/weave/mesh" "github.com/weaveworks/weave/net/address" - "github.com/weaveworks/weave/router" "github.com/weaveworks/weave/testing/gossip" ) type mockMessage struct { - dst router.PeerName + dst mesh.PeerName msgType byte buf []byte } @@ -48,13 +48,13 @@ func (m *mockGossipComms) String() string { // that the contents of messages are never re-ordered. Which, for instance, // requires they are not based off iterating through a map. -func (m *mockGossipComms) GossipBroadcast(update router.GossipData) error { +func (m *mockGossipComms) GossipBroadcast(update mesh.GossipData) error { m.Lock() defer m.Unlock() buf := []byte{} if len(m.messages) == 0 { require.FailNow(m, fmt.Sprintf("%s: Gossip broadcast message unexpected: \n%x", m.name, buf)) - } else if msg := m.messages[0]; msg.dst != router.UnknownPeerName { + } else if msg := m.messages[0]; msg.dst != mesh.UnknownPeerName { require.FailNow(m, fmt.Sprintf("%s: Expected Gossip message to %s but got broadcast", m.name, msg.dst)) } else if msg.buf != nil && !equalByteBuffer(msg.buf, buf) { require.FailNow(m, fmt.Sprintf("%s: Gossip message not sent as expected: \nwant: %x\ngot : %x", m.name, msg.buf, buf)) @@ -77,12 +77,12 @@ func equalByteBuffer(a, b []byte) bool { return true } -func (m *mockGossipComms) GossipUnicast(dstPeerName router.PeerName, buf []byte) error { +func (m *mockGossipComms) GossipUnicast(dstPeerName mesh.PeerName, buf []byte) error { m.Lock() defer m.Unlock() if len(m.messages) == 0 { require.FailNow(m, fmt.Sprintf("%s: Gossip message to %s unexpected: \n%s", m.name, dstPeerName, buf)) - } else if msg := m.messages[0]; msg.dst == router.UnknownPeerName { + } else if msg := m.messages[0]; msg.dst == mesh.UnknownPeerName { require.FailNow(m, fmt.Sprintf("%s: Expected Gossip broadcast message but got dest %s", m.name, dstPeerName)) } else if msg.dst != dstPeerName { require.FailNow(m, fmt.Sprintf("%s: Expected Gossip message to %s but got dest %s", m.name, msg.dst, dstPeerName)) @@ -99,7 +99,7 @@ func (m *mockGossipComms) GossipUnicast(dstPeerName router.PeerName, buf []byte) func ExpectMessage(alloc *Allocator, dst string, msgType byte, buf []byte) { m := alloc.gossip.(*mockGossipComms) - dstPeerName, _ := router.PeerNameFromString(dst) + dstPeerName, _ := mesh.PeerNameFromString(dst) m.Lock() m.messages = append(m.messages, mockMessage{dstPeerName, msgType, buf}) m.Unlock() @@ -108,7 +108,7 @@ func ExpectMessage(alloc *Allocator, dst string, msgType byte, buf []byte) { func ExpectBroadcastMessage(alloc *Allocator, buf []byte) { m := alloc.gossip.(*mockGossipComms) m.Lock() - m.messages = append(m.messages, mockMessage{router.UnknownPeerName, 0, buf}) + m.messages = append(m.messages, mockMessage{mesh.UnknownPeerName, 0, buf}) m.Unlock() } @@ -124,7 +124,7 @@ func CheckAllExpectedMessagesSent(allocs ...*Allocator) { } func makeAllocator(name string, cidrStr string, quorum uint) (*Allocator, address.Range) { - peername, err := router.PeerNameFromString(name) + peername, err := mesh.PeerNameFromString(name) if err != nil { panic(err) } @@ -134,8 +134,8 @@ func makeAllocator(name string, cidrStr string, quorum uint) (*Allocator, addres panic(err) } - alloc := NewAllocator(peername, router.PeerUID(rand.Int63()), - "nick-"+name, cidr.Range(), quorum, func(router.PeerName) bool { return true }) + alloc := NewAllocator(peername, mesh.PeerUID(rand.Int63()), + "nick-"+name, cidr.Range(), quorum, func(mesh.PeerName) bool { return true }) return alloc, cidr.HostRange() } @@ -149,7 +149,7 @@ func makeAllocatorWithMockGossip(t *testing.T, name string, universeCIDR string, } func (alloc *Allocator) claimRingForTesting(allocs ...*Allocator) { - peers := []router.PeerName{alloc.ourName} + peers := []mesh.PeerName{alloc.ourName} for _, alloc2 := range allocs { peers = append(peers, alloc2.ourName) } diff --git a/router/connection.go b/mesh/connection.go similarity index 99% rename from router/connection.go rename to mesh/connection.go index 1cef75b9..e97d52bd 100644 --- a/router/connection.go +++ b/mesh/connection.go @@ -1,4 +1,4 @@ -package router +package mesh import ( "fmt" diff --git a/router/connection_maker.go b/mesh/connection_maker.go similarity index 99% rename from router/connection_maker.go rename to mesh/connection_maker.go index 85775fd2..78edaf58 100644 --- a/router/connection_maker.go +++ b/mesh/connection_maker.go @@ -1,4 +1,4 @@ -package router +package mesh import ( "fmt" diff --git a/router/gossip.go b/mesh/gossip.go similarity index 99% rename from router/gossip.go rename to mesh/gossip.go index 45db0e83..abfab8fa 100644 --- a/router/gossip.go +++ b/mesh/gossip.go @@ -1,4 +1,4 @@ -package router +package mesh import ( "fmt" diff --git a/router/gossip_channel.go b/mesh/gossip_channel.go similarity index 99% rename from router/gossip_channel.go rename to mesh/gossip_channel.go index dd817712..098553e7 100644 --- a/router/gossip_channel.go +++ b/mesh/gossip_channel.go @@ -1,4 +1,4 @@ -package router +package mesh import ( "bytes" diff --git a/router/gossip_test.go b/mesh/gossip_test.go similarity index 99% rename from router/gossip_test.go rename to mesh/gossip_test.go index 3429ed50..5f622826 100644 --- a/router/gossip_test.go +++ b/mesh/gossip_test.go @@ -1,4 +1,4 @@ -package router +package mesh import ( "fmt" diff --git a/router/local_peer.go b/mesh/local_peer.go similarity index 99% rename from router/local_peer.go rename to mesh/local_peer.go index ab54745a..72262e59 100644 --- a/router/local_peer.go +++ b/mesh/local_peer.go @@ -1,4 +1,4 @@ -package router +package mesh import ( "fmt" diff --git a/router/mocks_test.go b/mesh/mocks_test.go similarity index 99% rename from router/mocks_test.go rename to mesh/mocks_test.go index 064850df..08ae90aa 100644 --- a/router/mocks_test.go +++ b/mesh/mocks_test.go @@ -3,7 +3,7 @@ // It supplies some mock implementations to other unit tests, and is // named "...test.go" so it is only compiled under `go test`. -package router +package mesh import ( "fmt" diff --git a/router/overlay.go b/mesh/overlay.go similarity index 99% rename from router/overlay.go rename to mesh/overlay.go index 13fd0428..2e794078 100644 --- a/router/overlay.go +++ b/mesh/overlay.go @@ -1,4 +1,4 @@ -package router +package mesh import ( "net" diff --git a/router/peer.go b/mesh/peer.go similarity index 99% rename from router/peer.go rename to mesh/peer.go index a1114e4f..1846f352 100644 --- a/router/peer.go +++ b/mesh/peer.go @@ -1,4 +1,4 @@ -package router +package mesh import ( "crypto/rand" diff --git a/router/peer_name_hash.go b/mesh/peer_name_hash.go similarity index 98% rename from router/peer_name_hash.go rename to mesh/peer_name_hash.go index 9bcd207e..ac76103e 100644 --- a/router/peer_name_hash.go +++ b/mesh/peer_name_hash.go @@ -3,7 +3,7 @@ // Let peer names be sha256 hashes...of anything (as long as it's // unique). -package router +package mesh import ( "crypto/sha256" diff --git a/router/peer_name_mac.go b/mesh/peer_name_mac.go similarity index 85% rename from router/peer_name_mac.go rename to mesh/peer_name_mac.go index 7bf868a0..c2b6cdbe 100644 --- a/router/peer_name_mac.go +++ b/mesh/peer_name_mac.go @@ -15,7 +15,7 @@ // name. In particular it doesn't actually have to be the MAC of, say, // the network interface the peer is sniffing on. -package router +package mesh import ( "net" @@ -56,3 +56,20 @@ func (name PeerName) Bin() []byte { func (name PeerName) String() string { return intmac(uint64(name)).String() } + +func macint(mac net.HardwareAddr) (r uint64) { + for _, b := range mac { + r <<= 8 + r |= uint64(b) + } + return +} + +func intmac(key uint64) (r net.HardwareAddr) { + r = make([]byte, 6) + for i := 5; i >= 0; i-- { + r[i] = byte(key) + key >>= 8 + } + return +} diff --git a/router/peers.go b/mesh/peers.go similarity index 99% rename from router/peers.go rename to mesh/peers.go index 9c30a4e2..70ec4c8d 100644 --- a/router/peers.go +++ b/mesh/peers.go @@ -1,4 +1,4 @@ -package router +package mesh import ( "bytes" diff --git a/router/peers_test.go b/mesh/peers_test.go similarity index 99% rename from router/peers_test.go rename to mesh/peers_test.go index e5f328f9..5c2b0094 100644 --- a/router/peers_test.go +++ b/mesh/peers_test.go @@ -1,4 +1,4 @@ -package router +package mesh import ( "fmt" diff --git a/router/protocol.go b/mesh/protocol.go similarity index 99% rename from router/protocol.go rename to mesh/protocol.go index add17a17..1863125a 100644 --- a/router/protocol.go +++ b/mesh/protocol.go @@ -1,4 +1,4 @@ -package router +package mesh import ( "bytes" diff --git a/router/protocol_crypto.go b/mesh/protocol_crypto.go similarity index 99% rename from router/protocol_crypto.go rename to mesh/protocol_crypto.go index f215a595..db0b5f68 100644 --- a/router/protocol_crypto.go +++ b/mesh/protocol_crypto.go @@ -1,4 +1,4 @@ -package router +package mesh import ( "crypto/rand" diff --git a/router/protocol_test.go b/mesh/protocol_test.go similarity index 99% rename from router/protocol_test.go rename to mesh/protocol_test.go index 1a56079a..1ea2ec41 100644 --- a/router/protocol_test.go +++ b/mesh/protocol_test.go @@ -1,4 +1,4 @@ -package router +package mesh import ( "io" diff --git a/router/router.go b/mesh/router.go similarity index 99% rename from router/router.go rename to mesh/router.go index d96b6fe2..55c34c7d 100644 --- a/router/router.go +++ b/mesh/router.go @@ -1,4 +1,4 @@ -package router +package mesh import ( "fmt" diff --git a/router/routes.go b/mesh/routes.go similarity index 99% rename from router/routes.go rename to mesh/routes.go index 8ea756ef..d7787af9 100644 --- a/router/routes.go +++ b/mesh/routes.go @@ -1,4 +1,4 @@ -package router +package mesh import ( "math" diff --git a/router/status.go b/mesh/status.go similarity index 99% rename from router/status.go rename to mesh/status.go index bb418d65..0dce08bb 100644 --- a/router/status.go +++ b/mesh/status.go @@ -1,4 +1,4 @@ -package router +package mesh import ( "fmt" diff --git a/router/surrogate_gossiper.go b/mesh/surrogate_gossiper.go similarity index 98% rename from router/surrogate_gossiper.go rename to mesh/surrogate_gossiper.go index 04059eb7..aef844a8 100644 --- a/router/surrogate_gossiper.go +++ b/mesh/surrogate_gossiper.go @@ -1,4 +1,4 @@ -package router +package mesh type SurrogateGossipData struct { messages [][]byte diff --git a/router/token_bucket.go b/mesh/token_bucket.go similarity index 98% rename from router/token_bucket.go rename to mesh/token_bucket.go index 254de6eb..e6daeb3b 100644 --- a/router/token_bucket.go +++ b/mesh/token_bucket.go @@ -1,4 +1,4 @@ -package router +package mesh import ( "time" diff --git a/nameserver/dns_test.go b/nameserver/dns_test.go index a1fad802..9712fe91 100644 --- a/nameserver/dns_test.go +++ b/nameserver/dns_test.go @@ -11,14 +11,14 @@ import ( "github.com/miekg/dns" "github.com/stretchr/testify/require" + "github.com/weaveworks/weave/mesh" "github.com/weaveworks/weave/net/address" - "github.com/weaveworks/weave/router" ) func startServer(t *testing.T, upstream *dns.ClientConfig) (*DNSServer, *Nameserver, int, int) { - peername, err := router.PeerNameFromString("00:00:00:02:00:00") + peername, err := mesh.PeerNameFromString("00:00:00:02:00:00") require.Nil(t, err) - nameserver := New(peername, "", func(router.PeerName) bool { return true }) + nameserver := New(peername, "", func(mesh.PeerName) bool { return true }) dnsserver, err := NewDNSServer(nameserver, "weave.local.", "0.0.0.0:0", "", 30, 5*time.Second) require.Nil(t, err) udpPort := dnsserver.servers[0].PacketConn.LocalAddr().(*net.UDPAddr).Port @@ -39,7 +39,7 @@ func TestTruncation(t *testing.T) { addrs := []address.Address{} for i := address.Address(0); i < 100; i++ { addrs = append(addrs, i) - nameserver.AddEntry("foo.weave.local.", "", router.UnknownPeerName, i) + nameserver.AddEntry("foo.weave.local.", "", mesh.UnknownPeerName, i) } doRequest := func(client *dns.Client, request *dns.Msg, port int, expectedErr error) *dns.Msg { diff --git a/nameserver/entry.go b/nameserver/entry.go index a3310423..524845a3 100644 --- a/nameserver/entry.go +++ b/nameserver/entry.go @@ -8,15 +8,15 @@ import ( "strings" "time" + "github.com/weaveworks/weave/mesh" "github.com/weaveworks/weave/net/address" - "github.com/weaveworks/weave/router" ) var now = func() int64 { return time.Now().Unix() } type Entry struct { ContainerID string - Origin router.PeerName + Origin mesh.PeerName Addr address.Address Hostname string // as supplied lHostname string // lowercased (not exported, so not encoded by gob) @@ -128,7 +128,7 @@ func (es *Entries) checkAndPanic() *Entries { return es } -func (es *Entries) add(hostname, containerid string, origin router.PeerName, addr address.Address) Entry { +func (es *Entries) add(hostname, containerid string, origin mesh.PeerName, addr address.Address) Entry { defer es.checkAndPanic().checkAndPanic() entry := Entry{Hostname: hostname, lHostname: strings.ToLower(hostname), @@ -176,7 +176,7 @@ func (es *Entries) merge(incoming Entries) Entries { } // f returning true means keep the entry. -func (es *Entries) tombstone(ourname router.PeerName, f func(*Entry) bool) Entries { +func (es *Entries) tombstone(ourname mesh.PeerName, f func(*Entry) bool) Entries { defer es.checkAndPanic().checkAndPanic() tombstoned := Entries{} @@ -245,7 +245,7 @@ type GossipData struct { Entries } -func (g *GossipData) Merge(o router.GossipData) { +func (g *GossipData) Merge(o mesh.GossipData) { other := o.(*GossipData) g.Entries.merge(other.Entries) if g.Timestamp < other.Timestamp { diff --git a/nameserver/entry_test.go b/nameserver/entry_test.go index 1e350e64..1e794660 100644 --- a/nameserver/entry_test.go +++ b/nameserver/entry_test.go @@ -5,8 +5,8 @@ import ( "github.com/stretchr/testify/require" + "github.com/weaveworks/weave/mesh" "github.com/weaveworks/weave/net/address" - "github.com/weaveworks/weave/router" ) func l(es Entries) Entries { @@ -28,21 +28,21 @@ func TestAdd(t *testing.T) { now = func() int64 { return 1234 } entries := Entries{} - entries.add("A", "", router.UnknownPeerName, address.Address(0)) + entries.add("A", "", mesh.UnknownPeerName, address.Address(0)) expected := l(Entries{ - Entry{Hostname: "A", Origin: router.UnknownPeerName, Addr: address.Address(0)}, + Entry{Hostname: "A", Origin: mesh.UnknownPeerName, Addr: address.Address(0)}, }) require.Equal(t, entries, expected) - entries.tombstone(router.UnknownPeerName, func(e *Entry) bool { return e.Hostname == "A" }) + entries.tombstone(mesh.UnknownPeerName, func(e *Entry) bool { return e.Hostname == "A" }) expected = l(Entries{ - Entry{Hostname: "A", Origin: router.UnknownPeerName, Addr: address.Address(0), Version: 1, Tombstone: 1234}, + Entry{Hostname: "A", Origin: mesh.UnknownPeerName, Addr: address.Address(0), Version: 1, Tombstone: 1234}, }) require.Equal(t, entries, expected) - entries.add("A", "", router.UnknownPeerName, address.Address(0)) + entries.add("A", "", mesh.UnknownPeerName, address.Address(0)) expected = l(Entries{ - Entry{Hostname: "A", Origin: router.UnknownPeerName, Addr: address.Address(0), Version: 2}, + Entry{Hostname: "A", Origin: mesh.UnknownPeerName, Addr: address.Address(0), Version: 2}, }) require.Equal(t, entries, expected) } @@ -78,7 +78,7 @@ func TestTombstone(t *testing.T) { es := makeEntries("AB") - es.tombstone(router.UnknownPeerName, func(e *Entry) bool { + es.tombstone(mesh.UnknownPeerName, func(e *Entry) bool { return e.Hostname == "B" }) expected := l(Entries{ diff --git a/nameserver/nameserver.go b/nameserver/nameserver.go index 5a87fb02..0d33d184 100644 --- a/nameserver/nameserver.go +++ b/nameserver/nameserver.go @@ -8,8 +8,8 @@ import ( "github.com/miekg/dns" . "github.com/weaveworks/weave/common" + "github.com/weaveworks/weave/mesh" "github.com/weaveworks/weave/net/address" - "github.com/weaveworks/weave/router" ) const ( @@ -34,15 +34,15 @@ const ( // - Update is O(n) for now type Nameserver struct { sync.RWMutex - ourName router.PeerName + ourName mesh.PeerName domain string - gossip router.Gossip + gossip mesh.Gossip entries Entries - isKnownPeer func(router.PeerName) bool + isKnownPeer func(mesh.PeerName) bool quit chan struct{} } -func New(ourName router.PeerName, domain string, isKnownPeer func(router.PeerName) bool) *Nameserver { +func New(ourName mesh.PeerName, domain string, isKnownPeer func(mesh.PeerName) bool) *Nameserver { return &Nameserver{ ourName: ourName, domain: dns.Fqdn(domain), @@ -51,7 +51,7 @@ func New(ourName router.PeerName, domain string, isKnownPeer func(router.PeerNam } } -func (n *Nameserver) SetGossip(gossip router.Gossip) { +func (n *Nameserver) SetGossip(gossip mesh.Gossip) { n.gossip = gossip } @@ -83,7 +83,7 @@ func (n *Nameserver) broadcastEntries(es ...Entry) error { return nil } -func (n *Nameserver) AddEntry(hostname, containerid string, origin router.PeerName, addr address.Address) error { +func (n *Nameserver) AddEntry(hostname, containerid string, origin mesh.PeerName, addr address.Address) error { n.infof("adding entry %s -> %s", hostname, addr.String()) n.Lock() entry := n.entries.add(hostname, containerid, origin, addr) @@ -140,7 +140,7 @@ func (n *Nameserver) ContainerDied(ident string) { } } -func (n *Nameserver) PeerGone(peer router.PeerName) { +func (n *Nameserver) PeerGone(peer mesh.PeerName) { n.infof("peer %s gone", peer.String()) n.Lock() defer n.Unlock() @@ -181,7 +181,7 @@ func (n *Nameserver) deleteTombstones() { }) } -func (n *Nameserver) Gossip() router.GossipData { +func (n *Nameserver) Gossip() mesh.GossipData { n.RLock() defer n.RUnlock() gossip := &GossipData{ @@ -192,11 +192,11 @@ func (n *Nameserver) Gossip() router.GossipData { return gossip } -func (n *Nameserver) OnGossipUnicast(sender router.PeerName, msg []byte) error { +func (n *Nameserver) OnGossipUnicast(sender mesh.PeerName, msg []byte) error { return nil } -func (n *Nameserver) receiveGossip(msg []byte) (router.GossipData, router.GossipData, error) { +func (n *Nameserver) receiveGossip(msg []byte) (mesh.GossipData, mesh.GossipData, error) { var gossip GossipData if err := gossip.Decode(msg); err != nil { return nil, nil, err @@ -221,14 +221,14 @@ func (n *Nameserver) receiveGossip(msg []byte) (router.GossipData, router.Gossip // merge received data into state and return "everything new I've // just learnt", or nil if nothing in the received data was new -func (n *Nameserver) OnGossip(msg []byte) (router.GossipData, error) { +func (n *Nameserver) OnGossip(msg []byte) (mesh.GossipData, error) { newEntries, _, err := n.receiveGossip(msg) return newEntries, err } // merge received data into state and return a representation of // the received data, for further propagation -func (n *Nameserver) OnGossipBroadcast(_ router.PeerName, msg []byte) (router.GossipData, error) { +func (n *Nameserver) OnGossipBroadcast(_ mesh.PeerName, msg []byte) (mesh.GossipData, error) { _, entries, err := n.receiveGossip(msg) return entries, err } diff --git a/nameserver/nameserver_test.go b/nameserver/nameserver_test.go index 5beaf87e..f7b603b5 100644 --- a/nameserver/nameserver_test.go +++ b/nameserver/nameserver_test.go @@ -11,14 +11,14 @@ import ( "github.com/stretchr/testify/require" + "github.com/weaveworks/weave/mesh" "github.com/weaveworks/weave/net/address" - "github.com/weaveworks/weave/router" wt "github.com/weaveworks/weave/testing" "github.com/weaveworks/weave/testing/gossip" ) -func makeNameserver(name router.PeerName) *Nameserver { - return New(name, "", func(router.PeerName) bool { return true }) +func makeNameserver(name mesh.PeerName) *Nameserver { + return New(name, "", func(mesh.PeerName) bool { return true }) } func makeNetwork(size int) ([]*Nameserver, *gossip.TestRouter) { @@ -26,7 +26,7 @@ func makeNetwork(size int) ([]*Nameserver, *gossip.TestRouter) { nameservers := make([]*Nameserver, size) for i := 0; i < size; i++ { - name, _ := router.PeerNameFromString(fmt.Sprintf("%02d:00:00:02:00:00", i)) + name, _ := mesh.PeerNameFromString(fmt.Sprintf("%02d:00:00:02:00:00", i)) nameserver := makeNameserver(name) nameserver.SetGossip(gossipRouter.Connect(nameserver.ourName, nameserver)) nameserver.Start() @@ -44,7 +44,7 @@ func stopNetwork(nameservers []*Nameserver, grouter *gossip.TestRouter) { } type pair struct { - origin router.PeerName + origin mesh.PeerName addr address.Address } @@ -91,7 +91,7 @@ func testNameservers(t *testing.T) { badNameservers := nameservers[25:] // This subset will remain well-connected, and we will deal mainly with them nameservers = nameservers[:25] - nameserversByName := map[router.PeerName]*Nameserver{} + nameserversByName := map[mesh.PeerName]*Nameserver{} for _, n := range nameservers { nameserversByName[n.ourName] = n } @@ -226,7 +226,7 @@ func testNameservers(t *testing.T) { } func TestContainerAndPeerDeath(t *testing.T) { - peername, err := router.PeerNameFromString("00:00:00:02:00:00") + peername, err := mesh.PeerNameFromString("00:00:00:02:00:00") require.Nil(t, err) nameserver := makeNameserver(peername) @@ -250,7 +250,7 @@ func TestTombstoneDeletion(t *testing.T) { defer func() { now = oldNow }() now = func() int64 { return 1234 } - peername, err := router.PeerNameFromString("00:00:00:02:00:00") + peername, err := mesh.PeerNameFromString("00:00:00:02:00:00") require.Nil(t, err) nameserver := makeNameserver(peername) diff --git a/prog/weaver/http.go b/prog/weaver/http.go index 8871468e..cb828f47 100644 --- a/prog/weaver/http.go +++ b/prog/weaver/http.go @@ -6,6 +6,7 @@ import ( "github.com/gorilla/mux" . "github.com/weaveworks/weave/common" "github.com/weaveworks/weave/ipam" + "github.com/weaveworks/weave/mesh" "github.com/weaveworks/weave/nameserver" "github.com/weaveworks/weave/net/address" weave "github.com/weaveworks/weave/router" @@ -24,14 +25,14 @@ var rootTemplate = template.New("root").Funcs(map[string]interface{}{ } return count }, - "printConnectionCounts": func(conns []weave.LocalConnectionStatus) string { + "printConnectionCounts": func(conns []mesh.LocalConnectionStatus) string { counts := make(map[string]int) for _, conn := range conns { counts[conn.State]++ } return printCounts(counts, []string{"established", "pending", "retrying", "failed", "connecting"}) }, - "printPeerConnectionCounts": func(peers []weave.PeerStatus) string { + "printPeerConnectionCounts": func(peers []mesh.PeerStatus) string { counts := make(map[string]int) for _, peer := range peers { for _, conn := range peer.Connections { diff --git a/prog/weaver/main.go b/prog/weaver/main.go index e925cb2e..cbd3a0b9 100644 --- a/prog/weaver/main.go +++ b/prog/weaver/main.go @@ -17,6 +17,7 @@ import ( . "github.com/weaveworks/weave/common" "github.com/weaveworks/weave/common/docker" "github.com/weaveworks/weave/ipam" + "github.com/weaveworks/weave/mesh" "github.com/weaveworks/weave/nameserver" weavenet "github.com/weaveworks/weave/net" "github.com/weaveworks/weave/net/address" @@ -41,7 +42,7 @@ func main() { deleteDatapath bool addDatapathInterface string - config weave.Config + config mesh.Config networkConfig weave.NetworkConfig protocolMinVersion int ifaceName string @@ -74,8 +75,8 @@ func main() { mflag.BoolVar(&deleteDatapath, []string{"-delete-datapath"}, false, "delete ODP datapath and exit") mflag.StringVar(&addDatapathInterface, []string{"-add-datapath-iface"}, "", "add a network interface to the ODP datapath and exit") - mflag.IntVar(&config.Port, []string{"#port", "-port"}, weave.Port, "router port") - mflag.IntVar(&protocolMinVersion, []string{"-min-protocol-version"}, weave.ProtocolMinVersion, "minimum weave protocol version") + mflag.IntVar(&config.Port, []string{"#port", "-port"}, mesh.Port, "router port") + mflag.IntVar(&protocolMinVersion, []string{"-min-protocol-version"}, mesh.ProtocolMinVersion, "minimum weave protocol version") mflag.StringVar(&ifaceName, []string{"#iface", "-iface"}, "", "name of interface to capture/inject from (disabled if blank)") mflag.StringVar(&routerName, []string{"#name", "-name"}, "", "name of router (defaults to MAC of interface)") mflag.StringVar(&nickName, []string{"#nickname", "-nickname"}, "", "nickname of peer (defaults to hostname)") @@ -146,8 +147,8 @@ func main() { Log.Println("Command line options:", options()) Log.Println("Command line peers:", peers) - if protocolMinVersion < weave.ProtocolMinVersion || protocolMinVersion > weave.ProtocolMaxVersion { - Log.Fatalf("--min-protocol-version must be in range [%d,%d]", weave.ProtocolMinVersion, weave.ProtocolMaxVersion) + if protocolMinVersion < mesh.ProtocolMinVersion || protocolMinVersion > mesh.ProtocolMaxVersion { + Log.Fatalf("--min-protocol-version must be in range [%d,%d]", mesh.ProtocolMinVersion, mesh.ProtocolMaxVersion) } config.ProtocolMinVersion = byte(protocolMinVersion) @@ -212,7 +213,7 @@ func main() { routerName = iface.HardwareAddr.String() } - name, err := weave.PeerNameFromUserInput(routerName) + name, err := mesh.PeerNameFromUserInput(routerName) checkFatal(err) if nickName == "" { @@ -253,7 +254,7 @@ func main() { } } } - isKnownPeer := func(name weave.PeerName) bool { + isKnownPeer := func(name mesh.PeerName) bool { return router.Peers.Fetch(name) != nil } var allocator *ipam.Allocator @@ -271,7 +272,7 @@ func main() { ) if !noDNS { ns = nameserver.New(router.Ourself.Peer.Name, dnsDomain, isKnownPeer) - router.Peers.OnGC(func(peer *weave.Peer) { ns.PeerGone(peer.Name) }) + router.Peers.OnGC(func(peer *mesh.Peer) { ns.PeerGone(peer.Name) }) ns.SetGossip(router.NewGossip("nameserver", ns)) observeContainers(ns) ns.Start() @@ -366,7 +367,7 @@ func parseAndCheckCIDR(cidrStr string) address.CIDR { return cidr } -func createAllocator(router *weave.Router, ipRangeStr string, defaultSubnetStr string, quorum uint, isKnownPeer func(weave.PeerName) bool) (*ipam.Allocator, address.CIDR) { +func createAllocator(router *mesh.Router, ipRangeStr string, defaultSubnetStr string, quorum uint, isKnownPeer func(mesh.PeerName) bool) (*ipam.Allocator, address.CIDR) { ipRange := parseAndCheckCIDR(ipRangeStr) defaultSubnet := ipRange if defaultSubnetStr != "" { diff --git a/router/fastdp.go b/router/fastdp.go index b1765a94..6bed5a09 100644 --- a/router/fastdp.go +++ b/router/fastdp.go @@ -9,6 +9,7 @@ import ( "time" "github.com/weaveworks/go-odp/odp" + "github.com/weaveworks/weave/mesh" ) // The virtual bridge accepts packets from ODP vports and the router @@ -40,8 +41,8 @@ type FastDatapath struct { dp odp.DatapathHandle deleteFlowsCount uint64 missHandlers map[odp.VportID]missHandler - localPeer *Peer - peers *Peers + localPeer *mesh.Peer + peers *mesh.Peers overlayConsumer OverlayConsumer // Bridge state: How to send to the given bridge port @@ -62,7 +63,7 @@ type FastDatapath struct { dec *EthernetDecoder // forwarders by remote peer - forwarders map[PeerName]*fastDatapathForwarder + forwarders map[mesh.PeerName]*fastDatapathForwarder } type FastDatapathConfig struct { @@ -105,7 +106,7 @@ func NewFastDatapath(config FastDatapathConfig) (*FastDatapath, error) { sendToMAC: make(map[MAC]bridgeSender), seenMACs: make(map[MAC]struct{}), vxlanVportIDs: make(map[int]odp.VportID), - forwarders: make(map[PeerName]*fastDatapathForwarder), + forwarders: make(map[mesh.PeerName]*fastDatapathForwarder), } if err := fastdp.deleteVxlanVports(); err != nil { @@ -385,7 +386,7 @@ func (fastdp fastDatapathOverlay) Diagnostics() interface{} { } } -func (fastdp fastDatapathOverlay) StartConsumingPackets(localPeer *Peer, peers *Peers, consumer OverlayConsumer) error { +func (fastdp fastDatapathOverlay) StartConsumingPackets(localPeer *mesh.Peer, peers *mesh.Peers, consumer OverlayConsumer) error { fastdp.lock.Lock() defer fastdp.lock.Unlock() @@ -460,17 +461,17 @@ func (fastdp *FastDatapath) getVxlanVportID(udpPort int) (odp.VportID, error) { return vxlanVportID, nil } -func (fastdp *FastDatapath) extractPeers(tunnelID [8]byte) (*Peer, *Peer) { +func (fastdp *FastDatapath) extractPeers(tunnelID [8]byte) (*mesh.Peer, *mesh.Peer) { vni := binary.BigEndian.Uint64(tunnelID[:]) - srcPeer := fastdp.peers.FetchByShortID(PeerShortID(vni & 0xfff)) - dstPeer := fastdp.peers.FetchByShortID(PeerShortID((vni >> 12) & 0xfff)) + srcPeer := fastdp.peers.FetchByShortID(mesh.PeerShortID(vni & 0xfff)) + dstPeer := fastdp.peers.FetchByShortID(mesh.PeerShortID((vni >> 12) & 0xfff)) return srcPeer, dstPeer } type vxlanSpecialPacketFlowOp struct { NonDiscardingFlowOp fastdp *FastDatapath - srcPeer *Peer + srcPeer *mesh.Peer sender *net.UDPAddr } @@ -486,7 +487,7 @@ func (op vxlanSpecialPacketFlowOp) Process(frame []byte, dec *EthernetDecoder, b type fastDatapathForwarder struct { fastdp *FastDatapath - remotePeer *Peer + remotePeer *mesh.Peer localIP [4]byte sendControlMsg func(byte, []byte) error connUID uint64 @@ -506,7 +507,7 @@ type fastDatapathForwarder struct { errorChan chan error } -func (fastdp fastDatapathOverlay) PrepareConnection(params OverlayConnectionParams) (OverlayConnection, error) { +func (fastdp fastDatapathOverlay) PrepareConnection(params mesh.OverlayConnectionParams) (mesh.OverlayConnection, error) { if params.SessionKey != nil { // No encryption suport in fastdp. The weaver main.go // is responsible for ensuring this doesn't happen. @@ -794,7 +795,7 @@ func (fwd *fastDatapathForwarder) Stop() { } } -func (fastdp *FastDatapath) addForwarder(peer PeerName, fwd *fastDatapathForwarder) { +func (fastdp *FastDatapath) addForwarder(peer mesh.PeerName, fwd *fastDatapathForwarder) { fastdp.lock.Lock() defer fastdp.lock.Unlock() @@ -803,7 +804,7 @@ func (fastdp *FastDatapath) addForwarder(peer PeerName, fwd *fastDatapathForward fastdp.forwarders[peer] = fwd } -func (fastdp *FastDatapath) removeForwarder(peer PeerName, fwd *fastDatapathForwarder) { +func (fastdp *FastDatapath) removeForwarder(peer mesh.PeerName, fwd *fastDatapathForwarder) { fastdp.lock.Lock() defer fastdp.lock.Unlock() if fastdp.forwarders[peer] == fwd { diff --git a/router/flow.go b/router/flow.go index 4992b044..e523a255 100644 --- a/router/flow.go +++ b/router/flow.go @@ -1,6 +1,10 @@ package router -import "net" +import ( + "net" + + "github.com/weaveworks/weave/mesh" +) // Just enough flow machinery for the weave router @@ -16,8 +20,8 @@ type PacketKey struct { } type ForwardPacketKey struct { - SrcPeer *Peer - DstPeer *Peer + SrcPeer *mesh.Peer + DstPeer *mesh.Peer PacketKey } diff --git a/router/http.go b/router/http.go index 7ad552b8..c4057e87 100644 --- a/router/http.go +++ b/router/http.go @@ -2,12 +2,13 @@ package router import ( "fmt" + "net/http" + "github.com/gorilla/mux" "github.com/weaveworks/weave/common" - "net/http" ) -func (router *Router) HandleHTTP(muxRouter *mux.Router) { +func (router *NetworkRouter) HandleHTTP(muxRouter *mux.Router) { muxRouter.Methods("POST").Path("/connect").HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if err := r.ParseForm(); err != nil { diff --git a/router/mac_cache.go b/router/mac_cache.go index 0d0e77c7..0d95d623 100644 --- a/router/mac_cache.go +++ b/router/mac_cache.go @@ -4,11 +4,13 @@ import ( "net" "sync" "time" + + "github.com/weaveworks/weave/mesh" ) type MacCacheEntry struct { lastSeen time.Time - peer *Peer + peer *mesh.Peer } type MacCache struct { @@ -16,10 +18,10 @@ type MacCache struct { table map[uint64]*MacCacheEntry maxAge time.Duration expiryTimer *time.Timer - onExpiry func(net.HardwareAddr, *Peer) + onExpiry func(net.HardwareAddr, *mesh.Peer) } -func NewMacCache(maxAge time.Duration, onExpiry func(net.HardwareAddr, *Peer)) *MacCache { +func NewMacCache(maxAge time.Duration, onExpiry func(net.HardwareAddr, *mesh.Peer)) *MacCache { cache := &MacCache{ table: make(map[uint64]*MacCacheEntry), maxAge: maxAge, @@ -28,7 +30,7 @@ func NewMacCache(maxAge time.Duration, onExpiry func(net.HardwareAddr, *Peer)) * return cache } -func (cache *MacCache) add(mac net.HardwareAddr, peer *Peer, force bool) (bool, *Peer) { +func (cache *MacCache) add(mac net.HardwareAddr, peer *mesh.Peer, force bool) (bool, *mesh.Peer) { key := macint(mac) now := time.Now() @@ -64,15 +66,15 @@ func (cache *MacCache) add(mac net.HardwareAddr, peer *Peer, force bool) (bool, return false, nil } -func (cache *MacCache) Add(mac net.HardwareAddr, peer *Peer) (bool, *Peer) { +func (cache *MacCache) Add(mac net.HardwareAddr, peer *mesh.Peer) (bool, *mesh.Peer) { return cache.add(mac, peer, false) } -func (cache *MacCache) AddForced(mac net.HardwareAddr, peer *Peer) (bool, *Peer) { +func (cache *MacCache) AddForced(mac net.HardwareAddr, peer *mesh.Peer) (bool, *mesh.Peer) { return cache.add(mac, peer, true) } -func (cache *MacCache) Lookup(mac net.HardwareAddr) *Peer { +func (cache *MacCache) Lookup(mac net.HardwareAddr) *mesh.Peer { key := macint(mac) cache.RLock() defer cache.RUnlock() @@ -83,7 +85,7 @@ func (cache *MacCache) Lookup(mac net.HardwareAddr) *Peer { return entry.peer } -func (cache *MacCache) Delete(peer *Peer) bool { +func (cache *MacCache) Delete(peer *mesh.Peer) bool { found := false cache.Lock() defer cache.Unlock() diff --git a/router/network_overlay.go b/router/network_overlay.go index 8d80594b..b09b720b 100644 --- a/router/network_overlay.go +++ b/router/network_overlay.go @@ -1,8 +1,12 @@ package router +import ( + "github.com/weaveworks/weave/mesh" +) + // Interface to overlay network packet handling type NetworkOverlay interface { - Overlay + mesh.Overlay // The routes have changed, so any cached information should // be discarded. @@ -12,7 +16,7 @@ type NetworkOverlay interface { InvalidateShortIDs() // Start consuming forwarded packets. - StartConsumingPackets(*Peer, *Peers, OverlayConsumer) error + StartConsumingPackets(*mesh.Peer, *mesh.Peers, OverlayConsumer) error } // When a consumer is called, the decoder will already have been used @@ -21,7 +25,7 @@ type OverlayConsumer func(ForwardPacketKey) FlowOp // All of the machinery to forward packets to a particular peer type OverlayForwarder interface { - OverlayConnection + mesh.OverlayConnection // Forward a packet across the connection. May be called as soon // as the overlay connection is created, in particular before // Confirm(). The return value nil means the key could not be @@ -29,7 +33,7 @@ type OverlayForwarder interface { Forward(ForwardPacketKey) FlowOp } -type NullNetworkOverlay struct{ NullOverlay } +type NullNetworkOverlay struct{ mesh.NullOverlay } func (NullNetworkOverlay) InvalidateRoutes() { } @@ -37,7 +41,7 @@ func (NullNetworkOverlay) InvalidateRoutes() { func (NullNetworkOverlay) InvalidateShortIDs() { } -func (NullNetworkOverlay) StartConsumingPackets(*Peer, *Peers, OverlayConsumer) error { +func (NullNetworkOverlay) StartConsumingPackets(*mesh.Peer, *mesh.Peers, OverlayConsumer) error { return nil } diff --git a/router/network_router.go b/router/network_router.go index 02bff759..20186de5 100644 --- a/router/network_router.go +++ b/router/network_router.go @@ -1,21 +1,34 @@ package router import ( + "math" "net" "time" + + "github.com/weaveworks/weave/common" + "github.com/weaveworks/weave/mesh" ) const ( + ChannelSize = 16 MaxUDPPacketSize = 65535 FastHeartbeat = 500 * time.Millisecond SlowHeartbeat = 10 * time.Second MaxMissedHeartbeats = 6 HeartbeatTimeout = MaxMissedHeartbeats * SlowHeartbeat + MaxDuration = time.Duration(math.MaxInt64) + NameSize = mesh.NameSize // should be greater than typical ARP cache expiries, i.e. > 3/2 * // /proc/sys/net/ipv4_neigh/*/base_reachable_time_ms on Linux macMaxAge = 10 * time.Minute ) +var ( + log = common.Log + checkFatal = common.CheckFatal + checkWarn = common.CheckWarn +) + type NetworkConfig struct { BufSz int PacketLogging PacketLogging @@ -28,12 +41,12 @@ type PacketLogging interface { } type NetworkRouter struct { - *Router + *mesh.Router NetworkConfig Macs *MacCache } -func NewNetworkRouter(config Config, networkConfig NetworkConfig, name PeerName, nickName string, overlay NetworkOverlay) *NetworkRouter { +func NewNetworkRouter(config mesh.Config, networkConfig NetworkConfig, name mesh.PeerName, nickName string, overlay NetworkOverlay) *NetworkRouter { if overlay == nil { overlay = NullNetworkOverlay{} } @@ -41,14 +54,14 @@ func NewNetworkRouter(config Config, networkConfig NetworkConfig, name PeerName, networkConfig.Bridge = NullBridge{} } - router := &NetworkRouter{Router: NewRouter(config, name, nickName, overlay), NetworkConfig: networkConfig} + router := &NetworkRouter{Router: mesh.NewRouter(config, name, nickName, overlay), NetworkConfig: networkConfig} router.Peers.OnInvalidateShortIDs(overlay.InvalidateShortIDs) router.Routes.OnChange(overlay.InvalidateRoutes) router.Macs = NewMacCache(macMaxAge, - func(mac net.HardwareAddr, peer *Peer) { + func(mac net.HardwareAddr, peer *mesh.Peer) { log.Println("Expired MAC", mac, "at", peer) }) - router.Peers.OnGC(func(peer *Peer) { router.Macs.Delete(peer) }) + router.Peers.OnGC(func(peer *mesh.Peer) { router.Macs.Delete(peer) }) return router } @@ -174,10 +187,10 @@ func (router *NetworkRouter) relay(key ForwardPacketKey) FlowOp { return DiscardingFlowOp{} } - return conn.(*LocalConnection).OverlayConn.(OverlayForwarder).Forward(key) + return conn.(*mesh.LocalConnection).OverlayConn.(OverlayForwarder).Forward(key) } -func (router *NetworkRouter) relayBroadcast(srcPeer *Peer, key PacketKey) FlowOp { +func (router *NetworkRouter) relayBroadcast(srcPeer *mesh.Peer, key PacketKey) FlowOp { nextHops := router.Routes.Broadcast(srcPeer.Name) if len(nextHops) == 0 { return DiscardingFlowOp{} @@ -186,7 +199,7 @@ func (router *NetworkRouter) relayBroadcast(srcPeer *Peer, key PacketKey) FlowOp op := NewMultiFlowOp(true) for _, conn := range router.Ourself.ConnectionsTo(nextHops) { - op.Add(conn.(*LocalConnection).OverlayConn.(OverlayForwarder).Forward(ForwardPacketKey{ + op.Add(conn.(*mesh.LocalConnection).OverlayConn.(OverlayForwarder).Forward(ForwardPacketKey{ PacketKey: key, SrcPeer: srcPeer, DstPeer: conn.Remote()})) diff --git a/router/network_router_status.go b/router/network_router_status.go index 1b56d3e6..e35267e9 100644 --- a/router/network_router_status.go +++ b/router/network_router_status.go @@ -2,10 +2,12 @@ package router import ( "time" + + "github.com/weaveworks/weave/mesh" ) type NetworkRouterStatus struct { - *Status + *mesh.Status Interface string CaptureStats map[string]int MACs []MACStatus @@ -20,7 +22,7 @@ type MACStatus struct { func NewNetworkRouterStatus(router *NetworkRouter) *NetworkRouterStatus { return &NetworkRouterStatus{ - NewStatus(router.Router), + mesh.NewStatus(router.Router), router.Bridge.String(), router.Bridge.Stats(), NewMACStatusSlice(router.Macs)} diff --git a/router/overlay_switch.go b/router/overlay_switch.go index 9ead7987..9e6efd00 100644 --- a/router/overlay_switch.go +++ b/router/overlay_switch.go @@ -4,6 +4,8 @@ import ( "fmt" "strings" "sync" + + "github.com/weaveworks/weave/mesh" ) // OverlaySwitch selects which overlay to use, from a set of @@ -60,7 +62,7 @@ func (osw *OverlaySwitch) InvalidateShortIDs() { } } -func (osw *OverlaySwitch) StartConsumingPackets(localPeer *Peer, peers *Peers, consumer OverlayConsumer) error { +func (osw *OverlaySwitch) StartConsumingPackets(localPeer *mesh.Peer, peers *mesh.Peers, consumer OverlayConsumer) error { for _, overlay := range osw.overlays { if err := overlay.StartConsumingPackets(localPeer, peers, consumer); err != nil { return err @@ -76,7 +78,7 @@ type namedOverlay struct { // Find the common set of overlays supported by both sides, with the // ordering being the same on both sides too. -func (osw *OverlaySwitch) commonOverlays(params OverlayConnectionParams) ([]namedOverlay, error) { +func (osw *OverlaySwitch) commonOverlays(params mesh.OverlayConnectionParams) ([]namedOverlay, error) { var peerOverlays []string if overlaysFeature, present := params.Features["Overlays"]; present { peerOverlays = strings.Split(overlaysFeature, " ") @@ -118,7 +120,7 @@ func (osw *OverlaySwitch) commonOverlays(params OverlayConnectionParams) ([]name } type overlaySwitchForwarder struct { - remotePeer *Peer + remotePeer *mesh.Peer lock sync.Mutex @@ -160,7 +162,7 @@ type subForwarderEvent struct { err error } -func (osw *OverlaySwitch) PrepareConnection(params OverlayConnectionParams) (OverlayConnection, error) { +func (osw *OverlaySwitch) PrepareConnection(params mesh.OverlayConnectionParams) (mesh.OverlayConnection, error) { if _, present := params.Features["Overlays"]; !present && osw.compatOverlay != nil { return osw.compatOverlay.PrepareConnection(params) } @@ -197,7 +199,7 @@ func (osw *OverlaySwitch) PrepareConnection(params OverlayConnectionParams) (Ove xmsg[0] = byte(index) xmsg[1] = tag copy(xmsg[2:], msg) - return origSendControlMessage(ProtocolOverlayControlMsg, xmsg) + return origSendControlMessage(mesh.ProtocolOverlayControlMsg, xmsg) } subConn, err := overlay.PrepareConnection(params) diff --git a/router/sleeve.go b/router/sleeve.go index 3b329a1a..66cbe7cd 100644 --- a/router/sleeve.go +++ b/router/sleeve.go @@ -18,6 +18,8 @@ import ( "github.com/google/gopacket" "github.com/google/gopacket/layers" + + "github.com/weaveworks/weave/mesh" ) // This diagram explains the various arithmetic and variables related @@ -61,21 +63,21 @@ type SleeveOverlay struct { // These fields are set in StartConsumingPackets, and not // subsequently modified - localPeer *Peer + localPeer *mesh.Peer localPeerBin []byte consumer OverlayConsumer - peers *Peers + peers *mesh.Peers conn *net.UDPConn lock sync.Mutex - forwarders map[PeerName]*sleeveForwarder + forwarders map[mesh.PeerName]*sleeveForwarder } func NewSleeveOverlay(localPort int) NetworkOverlay { return &SleeveOverlay{localPort: localPort} } -func (sleeve *SleeveOverlay) StartConsumingPackets(localPeer *Peer, peers *Peers, consumer OverlayConsumer) error { +func (sleeve *SleeveOverlay) StartConsumingPackets(localPeer *mesh.Peer, peers *mesh.Peers, consumer OverlayConsumer) error { localAddr, err := net.ResolveUDPAddr("udp4", fmt.Sprint(":", sleeve.localPort)) if err != nil { return err @@ -114,7 +116,7 @@ func (sleeve *SleeveOverlay) StartConsumingPackets(localPeer *Peer, peers *Peers sleeve.consumer = consumer sleeve.peers = peers sleeve.conn = conn - sleeve.forwarders = make(map[PeerName]*sleeveForwarder) + sleeve.forwarders = make(map[mesh.PeerName]*sleeveForwarder) go sleeve.readUDP() return nil } @@ -135,19 +137,19 @@ func (*SleeveOverlay) Diagnostics() interface{} { return nil } -func (sleeve *SleeveOverlay) lookupForwarder(peer PeerName) *sleeveForwarder { +func (sleeve *SleeveOverlay) lookupForwarder(peer mesh.PeerName) *sleeveForwarder { sleeve.lock.Lock() defer sleeve.lock.Unlock() return sleeve.forwarders[peer] } -func (sleeve *SleeveOverlay) addForwarder(peer PeerName, fwd *sleeveForwarder) { +func (sleeve *SleeveOverlay) addForwarder(peer mesh.PeerName, fwd *sleeveForwarder) { sleeve.lock.Lock() defer sleeve.lock.Unlock() sleeve.forwarders[peer] = fwd } -func (sleeve *SleeveOverlay) removeForwarder(peer PeerName, fwd *sleeveForwarder) { +func (sleeve *SleeveOverlay) removeForwarder(peer mesh.PeerName, fwd *sleeveForwarder) { sleeve.lock.Lock() defer sleeve.lock.Unlock() if sleeve.forwarders[peer] == fwd { @@ -172,7 +174,7 @@ func (sleeve *SleeveOverlay) readUDP() { continue } - fwdName := PeerNameFromBin(buf[:NameSize]) + fwdName := mesh.PeerNameFromBin(buf[:NameSize]) fwd := sleeve.lookupForwarder(fwdName) if fwd == nil { continue @@ -212,8 +214,8 @@ func (sleeve *SleeveOverlay) handleFrame(sender *net.UDPAddr, fwd *sleeveForward return } - srcPeer := sleeve.peers.Fetch(PeerNameFromBin(src)) - dstPeer := sleeve.peers.Fetch(PeerNameFromBin(dst)) + srcPeer := sleeve.peers.Fetch(mesh.PeerNameFromBin(src)) + dstPeer := sleeve.peers.Fetch(mesh.PeerNameFromBin(dst)) if srcPeer == nil || dstPeer == nil { return } @@ -240,7 +242,7 @@ func (sleeve *SleeveOverlay) handleFrame(sender *net.UDPAddr, fwd *sleeveForward sleeve.sendToConsumer(srcPeer, dstPeer, frame, dec) } -func (sleeve *SleeveOverlay) sendToConsumer(srcPeer, dstPeer *Peer, frame []byte, dec *EthernetDecoder) { +func (sleeve *SleeveOverlay) sendToConsumer(srcPeer, dstPeer *mesh.Peer, frame []byte, dec *EthernetDecoder) { if sleeve.consumer == nil { return } @@ -282,7 +284,7 @@ type sleeveCrypto struct { type sleeveForwarder struct { // Immutable sleeve *SleeveOverlay - remotePeer *Peer + remotePeer *mesh.Peer remotePeerBin []byte sendControlMsg func(byte, []byte) error connUID uint64 @@ -349,7 +351,7 @@ type controlMessage struct { msg []byte } -func (sleeve *SleeveOverlay) PrepareConnection(params OverlayConnectionParams) (OverlayConnection, error) { +func (sleeve *SleeveOverlay) PrepareConnection(params mesh.OverlayConnectionParams) (mesh.OverlayConnection, error) { name := sleeve.localPeer.NameByte var crypto sleeveCrypto if params.SessionKey != nil { @@ -759,13 +761,13 @@ func (fwd *sleeveForwarder) handleSpecialFrame(special specialFrame) error { func (fwd *sleeveForwarder) handleControlMessage(cm controlMessage) error { switch cm.tag { - case ProtocolConnectionEstablished: + case mesh.ProtocolConnectionEstablished: return fwd.handleHeartbeatAck() - case ProtocolFragmentationReceived: + case mesh.ProtocolFragmentationReceived: return fwd.handleFragTestAck() - case ProtocolPMTUVerified: + case mesh.ProtocolPMTUVerified: return fwd.handleMTUTestAck(cm.msg) default: @@ -834,7 +836,7 @@ func (fwd *sleeveForwarder) handleHeartbeat(special specialFrame) error { if !fwd.ackedHeartbeat { fwd.ackedHeartbeat = true - if err := fwd.sendControlMsg(ProtocolConnectionEstablished, nil); err != nil { + if err := fwd.sendControlMsg(mesh.ProtocolConnectionEstablished, nil); err != nil { return err } } @@ -895,7 +897,7 @@ func (fwd *sleeveForwarder) handleFragTest(frame []byte) error { return nil } - return fwd.sendControlMsg(ProtocolFragmentationReceived, nil) + return fwd.sendControlMsg(mesh.ProtocolFragmentationReceived, nil) } func (fwd *sleeveForwarder) handleFragTestAck() error { @@ -941,7 +943,7 @@ func (fwd *sleeveForwarder) sendMTUTest() error { func (fwd *sleeveForwarder) handleMTUTest(frame []byte) error { buf := make([]byte, 2) binary.BigEndian.PutUint16(buf, uint16(len(frame)-EthernetOverhead)) - return fwd.sendControlMsg(ProtocolPMTUVerified, buf) + return fwd.sendControlMsg(mesh.ProtocolPMTUVerified, buf) } func (fwd *sleeveForwarder) handleMTUTestAck(msg []byte) error { diff --git a/testing/gossip/mocks.go b/testing/gossip/mocks.go index ae5791f1..1a42b03d 100644 --- a/testing/gossip/mocks.go +++ b/testing/gossip/mocks.go @@ -7,21 +7,21 @@ import ( "time" "github.com/weaveworks/weave/common" - "github.com/weaveworks/weave/router" + "github.com/weaveworks/weave/mesh" ) // Router to convey gossip from one gossiper to another, for testing type unicastMessage struct { - sender router.PeerName + sender mesh.PeerName buf []byte } type broadcastMessage struct { - sender router.PeerName - data router.GossipData + sender mesh.PeerName + data mesh.GossipData } type gossipMessage struct { - sender router.PeerName - data router.GossipData + sender mesh.PeerName + data mesh.GossipData } type exitMessage struct { exitChan chan struct{} @@ -31,12 +31,12 @@ type flushMessage struct { } type TestRouter struct { - gossipChans map[router.PeerName]chan interface{} + gossipChans map[mesh.PeerName]chan interface{} loss float32 // 0.0 means no loss } func NewTestRouter(loss float32) *TestRouter { - return &TestRouter{make(map[router.PeerName]chan interface{}, 100), loss} + return &TestRouter{make(map[mesh.PeerName]chan interface{}, 100), loss} } func (grouter *TestRouter) Stop() { @@ -45,7 +45,7 @@ func (grouter *TestRouter) Stop() { } } -func (grouter *TestRouter) gossipBroadcast(sender router.PeerName, update router.GossipData) error { +func (grouter *TestRouter) gossipBroadcast(sender mesh.PeerName, update mesh.GossipData) error { for _, gossipChan := range grouter.gossipChans { select { case gossipChan <- broadcastMessage{sender: sender, data: update}: @@ -56,7 +56,7 @@ func (grouter *TestRouter) gossipBroadcast(sender router.PeerName, update router return nil } -func (grouter *TestRouter) gossip(sender router.PeerName, update router.GossipData) error { +func (grouter *TestRouter) gossip(sender mesh.PeerName, update mesh.GossipData) error { count := int(math.Log2(float64(len(grouter.gossipChans)))) for dest, gossipChan := range grouter.gossipChans { if dest == sender { @@ -83,7 +83,7 @@ func (grouter *TestRouter) Flush() { } } -func (grouter *TestRouter) RemovePeer(peer router.PeerName) { +func (grouter *TestRouter) RemovePeer(peer mesh.PeerName) { gossipChan := grouter.gossipChans[peer] resultChan := make(chan struct{}) gossipChan <- exitMessage{exitChan: resultChan} @@ -93,10 +93,10 @@ func (grouter *TestRouter) RemovePeer(peer router.PeerName) { type TestRouterClient struct { router *TestRouter - sender router.PeerName + sender mesh.PeerName } -func (grouter *TestRouter) run(sender router.PeerName, gossiper router.Gossiper, gossipChan chan interface{}) { +func (grouter *TestRouter) run(sender mesh.PeerName, gossiper mesh.Gossiper, gossipChan chan interface{}) { gossipTimer := time.Tick(2 * time.Second) for { select { @@ -155,7 +155,7 @@ func (grouter *TestRouter) run(sender router.PeerName, gossiper router.Gossiper, } } -func (grouter *TestRouter) Connect(sender router.PeerName, gossiper router.Gossiper) router.Gossip { +func (grouter *TestRouter) Connect(sender mesh.PeerName, gossiper mesh.Gossiper) mesh.Gossip { gossipChan := make(chan interface{}, 100) go grouter.run(sender, gossiper, gossipChan) @@ -164,7 +164,7 @@ func (grouter *TestRouter) Connect(sender router.PeerName, gossiper router.Gossi return TestRouterClient{grouter, sender} } -func (client TestRouterClient) GossipUnicast(dstPeerName router.PeerName, buf []byte) error { +func (client TestRouterClient) GossipUnicast(dstPeerName mesh.PeerName, buf []byte) error { select { case client.router.gossipChans[dstPeerName] <- unicastMessage{sender: client.sender, buf: buf}: default: // drop the message if we cannot send it @@ -173,6 +173,6 @@ func (client TestRouterClient) GossipUnicast(dstPeerName router.PeerName, buf [] return nil } -func (client TestRouterClient) GossipBroadcast(update router.GossipData) error { +func (client TestRouterClient) GossipBroadcast(update mesh.GossipData) error { return client.router.gossipBroadcast(client.sender, update) }