From e187711c6545487d4cac3701f0f506bb536234e2 Mon Sep 17 00:00:00 2001
From: ethersphere <thesw@rm.eth>
Date: Wed, 20 Jun 2018 14:06:27 +0200
Subject: swarm: network rewrite merge

---
 swarm/pss/ping.go | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 96 insertions(+)
 create mode 100644 swarm/pss/ping.go

(limited to 'swarm/pss/ping.go')

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
+		},
+	}
+}
-- 
cgit v1.2.3