diff options
author | ethersphere <thesw@rm.eth> | 2018-06-20 20:06:27 +0800 |
---|---|---|
committer | ethersphere <thesw@rm.eth> | 2018-06-22 03:10:31 +0800 |
commit | e187711c6545487d4cac3701f0f506bb536234e2 (patch) | |
tree | d2f6150f70b84b36e49a449082aeda267b4b9046 /swarm/pss/ping.go | |
parent | 574378edb50c907b532946a1d4654dbd6701b20a (diff) | |
download | go-tangerine-e187711c6545487d4cac3701f0f506bb536234e2.tar go-tangerine-e187711c6545487d4cac3701f0f506bb536234e2.tar.gz go-tangerine-e187711c6545487d4cac3701f0f506bb536234e2.tar.bz2 go-tangerine-e187711c6545487d4cac3701f0f506bb536234e2.tar.lz go-tangerine-e187711c6545487d4cac3701f0f506bb536234e2.tar.xz go-tangerine-e187711c6545487d4cac3701f0f506bb536234e2.tar.zst go-tangerine-e187711c6545487d4cac3701f0f506bb536234e2.zip |
swarm: network rewrite merge
Diffstat (limited to 'swarm/pss/ping.go')
-rw-r--r-- | swarm/pss/ping.go | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/swarm/pss/ping.go b/swarm/pss/ping.go new file mode 100644 index 000000000..2ef072918 --- /dev/null +++ b/swarm/pss/ping.go @@ -0,0 +1,96 @@ +// Copyright 2018 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. + +// +build !nopssprotocol,!nopssping + +package pss + +import ( + "errors" + "time" + + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/protocols" + "github.com/ethereum/go-ethereum/swarm/log" +) + +// Generic ping protocol implementation for +// pss devp2p protocol emulation +type PingMsg struct { + Created time.Time + Pong bool // set if message is pong reply +} + +type Ping struct { + Pong bool // toggle pong reply upon ping receive + OutC chan bool // trigger ping + InC chan bool // optional, report back to calling code +} + +func (p *Ping) pingHandler(msg interface{}) error { + var pingmsg *PingMsg + var ok bool + if pingmsg, ok = msg.(*PingMsg); !ok { + return errors.New("invalid msg") + } + log.Debug("ping handler", "msg", pingmsg, "outc", p.OutC) + if p.InC != nil { + p.InC <- pingmsg.Pong + } + if p.Pong && !pingmsg.Pong { + p.OutC <- true + } + return nil +} + +var PingProtocol = &protocols.Spec{ + Name: "psstest", + Version: 1, + MaxMsgSize: 1024, + Messages: []interface{}{ + PingMsg{}, + }, +} + +var PingTopic = ProtocolTopic(PingProtocol) + +func NewPingProtocol(ping *Ping) *p2p.Protocol { + return &p2p.Protocol{ + Name: PingProtocol.Name, + Version: PingProtocol.Version, + Length: uint64(PingProtocol.MaxMsgSize), + Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error { + quitC := make(chan struct{}) + pp := protocols.NewPeer(p, rw, PingProtocol) + log.Trace("running pss vprotocol", "peer", p, "outc", ping.OutC) + go func() { + for { + select { + case ispong := <-ping.OutC: + pp.Send(&PingMsg{ + Created: time.Now(), + Pong: ispong, + }) + case <-quitC: + } + } + }() + err := pp.Run(ping.pingHandler) + quitC <- struct{}{} + return err + }, + } +} |