From fdea7d93f989f21d068f51261ec28b3cf5e2206e Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Fri, 3 Apr 2015 19:38:01 +0100 Subject: [PATCH] refactor: improve abstraction in connection gossip handling - turn previously free-floating functions into methods on GossipChannel - move gossip message type dispatch from connection into router --- router/connection.go | 8 ++------ router/gossip.go | 31 ++++++++++++++++++------------- router/gossip_test.go | 2 +- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/router/connection.go b/router/connection.go index f7589db4..9c478342 100644 --- a/router/connection.go +++ b/router/connection.go @@ -450,12 +450,8 @@ func (conn *LocalConnection) handleProtocolMsg(tag ProtocolTag, payload []byte) conn.Decryptor.ReceiveNonce(payload) case ProtocolPMTUVerified: conn.pmtuVerified(int(binary.BigEndian.Uint16(payload))) - case ProtocolGossipUnicast: - return conn.Router.handleGossip(payload, deliverGossipUnicast) - case ProtocolGossipBroadcast: - return conn.Router.handleGossip(payload, deliverGossipBroadcast) - case ProtocolGossip: - return conn.Router.handleGossip(payload, deliverGossip) + case ProtocolGossipUnicast, ProtocolGossipBroadcast, ProtocolGossip: + return conn.Router.handleGossip(tag, payload) default: conn.Log("ignoring unknown protocol tag:", tag) } diff --git a/router/gossip.go b/router/gossip.go index 120dd83c..ada37663 100644 --- a/router/gossip.go +++ b/router/gossip.go @@ -110,7 +110,7 @@ func (router *Router) SendAllGossipDown(conn Connection) { } } -func (router *Router) handleGossip(payload []byte, onok func(*GossipChannel, PeerName, []byte, *gob.Decoder) error) error { +func (router *Router) handleGossip(tag ProtocolTag, payload []byte) error { decoder := gob.NewDecoder(bytes.NewReader(payload)) var channelHash uint32 if err := decoder.Decode(&channelHash); err != nil { @@ -124,47 +124,52 @@ func (router *Router) handleGossip(payload []byte, onok func(*GossipChannel, Pee if err := decoder.Decode(&srcName); err != nil { return err } - if err := onok(channel, srcName, payload, decoder); err != nil { - return err + switch tag { + case ProtocolGossipUnicast: + return channel.deliverGossipUnicast(srcName, payload, decoder) + case ProtocolGossipBroadcast: + return channel.deliverGossipBroadcast(srcName, payload, decoder) + case ProtocolGossip: + return channel.deliverGossip(srcName, payload, decoder) } return nil } -func deliverGossipUnicast(channel *GossipChannel, srcName PeerName, origPayload []byte, dec *gob.Decoder) error { +func (c *GossipChannel) deliverGossipUnicast(srcName PeerName, origPayload []byte, dec *gob.Decoder) error { var destName PeerName if err := dec.Decode(&destName); err != nil { return err } - if channel.ourself.Name != destName { - return channel.relayGossipUnicast(destName, origPayload) + if c.ourself.Name != destName { + return c.relayGossipUnicast(destName, origPayload) } var payload []byte if err := dec.Decode(&payload); err != nil { return err } - return channel.gossiper.OnGossipUnicast(srcName, payload) + return c.gossiper.OnGossipUnicast(srcName, payload) } -func deliverGossipBroadcast(channel *GossipChannel, srcName PeerName, origPayload []byte, dec *gob.Decoder) error { +func (c *GossipChannel) deliverGossipBroadcast(srcName PeerName, origPayload []byte, dec *gob.Decoder) error { var payload []byte if err := dec.Decode(&payload); err != nil { return err } - if err := channel.gossiper.OnGossipBroadcast(payload); err != nil { + if err := c.gossiper.OnGossipBroadcast(payload); err != nil { return err } - return channel.relayGossipBroadcast(srcName, origPayload) + return c.relayGossipBroadcast(srcName, origPayload) } -func deliverGossip(channel *GossipChannel, srcName PeerName, _ []byte, dec *gob.Decoder) error { +func (c *GossipChannel) deliverGossip(srcName PeerName, _ []byte, dec *gob.Decoder) error { var payload []byte if err := dec.Decode(&payload); err != nil { return err } - if data, err := channel.gossiper.OnGossip(payload); err != nil { + if data, err := c.gossiper.OnGossip(payload); err != nil { return err } else if data != nil { - channel.SendGossip(data) + c.SendGossip(data) } return nil } diff --git a/router/gossip_test.go b/router/gossip_test.go index f8b3084c..907b2e4e 100644 --- a/router/gossip_test.go +++ b/router/gossip_test.go @@ -26,7 +26,7 @@ func NewTestRouter(name PeerName) *Router { } func (conn *mockChannelConnection) SendProtocolMsg(protocolMsg ProtocolMsg) { - if err := conn.dest.handleGossip(protocolMsg.msg, deliverGossip); err != nil { + if err := conn.dest.handleGossip(protocolMsg.tag, protocolMsg.msg); err != nil { panic(err) } conn.dest.sendPendingGossip()