2014-10-25 04:13:28 -07:00
|
|
|
package dht_pb
|
2014-08-01 13:21:51 -07:00
|
|
|
|
2014-08-09 22:28:46 -07:00
|
|
|
import (
|
2016-05-10 16:06:28 -07:00
|
|
|
ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr"
|
2014-11-21 03:45:03 -08:00
|
|
|
|
2015-06-01 16:10:08 -07:00
|
|
|
key "github.com/ipfs/go-ipfs/blocks/key"
|
2016-06-24 18:38:07 +02:00
|
|
|
logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log"
|
|
|
|
pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore"
|
|
|
|
peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer"
|
|
|
|
inet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net"
|
2014-08-09 22:28:46 -07:00
|
|
|
)
|
|
|
|
|
2015-09-14 17:33:03 -07:00
|
|
|
var log = logging.Logger("dht.pb")
|
2014-12-19 12:19:56 -08:00
|
|
|
|
2015-01-27 22:57:39 -08:00
|
|
|
type PeerRoutingInfo struct {
|
2016-06-01 15:51:39 -07:00
|
|
|
pstore.PeerInfo
|
2015-01-27 22:57:39 -08:00
|
|
|
inet.Connectedness
|
|
|
|
}
|
|
|
|
|
2014-11-21 03:45:03 -08:00
|
|
|
// NewMessage constructs a new dht message with given type, key, and level
|
2014-10-25 04:13:28 -07:00
|
|
|
func NewMessage(typ Message_MessageType, key string, level int) *Message {
|
2014-09-16 07:17:55 -07:00
|
|
|
m := &Message{
|
|
|
|
Type: &typ,
|
|
|
|
Key: &key,
|
|
|
|
}
|
|
|
|
m.SetClusterLevel(level)
|
|
|
|
return m
|
|
|
|
}
|
|
|
|
|
2015-01-27 22:57:39 -08:00
|
|
|
func peerRoutingInfoToPBPeer(p PeerRoutingInfo) *Message_Peer {
|
|
|
|
pbp := new(Message_Peer)
|
|
|
|
|
|
|
|
pbp.Addrs = make([][]byte, len(p.Addrs))
|
|
|
|
for i, maddr := range p.Addrs {
|
|
|
|
pbp.Addrs[i] = maddr.Bytes() // Bytes, not String. Compressed.
|
|
|
|
}
|
|
|
|
s := string(p.ID)
|
|
|
|
pbp.Id = &s
|
|
|
|
c := ConnectionType(p.Connectedness)
|
|
|
|
pbp.Connection = &c
|
|
|
|
return pbp
|
|
|
|
}
|
|
|
|
|
2016-06-01 15:51:39 -07:00
|
|
|
func peerInfoToPBPeer(p pstore.PeerInfo) *Message_Peer {
|
2014-09-16 00:52:57 -07:00
|
|
|
pbp := new(Message_Peer)
|
2014-11-20 10:46:56 -08:00
|
|
|
|
2014-12-19 12:19:56 -08:00
|
|
|
pbp.Addrs = make([][]byte, len(p.Addrs))
|
|
|
|
for i, maddr := range p.Addrs {
|
|
|
|
pbp.Addrs[i] = maddr.Bytes() // Bytes, not String. Compressed.
|
2014-08-09 22:28:46 -07:00
|
|
|
}
|
2014-12-19 12:19:56 -08:00
|
|
|
s := string(p.ID)
|
|
|
|
pbp.Id = &s
|
2014-08-09 22:28:46 -07:00
|
|
|
return pbp
|
2014-08-01 13:21:51 -07:00
|
|
|
}
|
|
|
|
|
2016-06-01 15:51:39 -07:00
|
|
|
// PBPeerToPeer turns a *Message_Peer into its pstore.PeerInfo counterpart
|
|
|
|
func PBPeerToPeerInfo(pbp *Message_Peer) pstore.PeerInfo {
|
|
|
|
return pstore.PeerInfo{
|
2014-12-19 12:19:56 -08:00
|
|
|
ID: peer.ID(pbp.GetId()),
|
|
|
|
Addrs: pbp.Addresses(),
|
2014-11-21 08:03:11 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-12-19 12:19:56 -08:00
|
|
|
// RawPeerInfosToPBPeers converts a slice of Peers into a slice of *Message_Peers,
|
2014-11-20 10:46:19 -08:00
|
|
|
// ready to go out on the wire.
|
2016-06-01 15:51:39 -07:00
|
|
|
func RawPeerInfosToPBPeers(peers []pstore.PeerInfo) []*Message_Peer {
|
2014-09-16 07:17:55 -07:00
|
|
|
pbpeers := make([]*Message_Peer, len(peers))
|
2014-09-16 01:09:34 -07:00
|
|
|
for i, p := range peers {
|
2014-12-19 12:19:56 -08:00
|
|
|
pbpeers[i] = peerInfoToPBPeer(p)
|
2014-09-16 01:09:34 -07:00
|
|
|
}
|
|
|
|
return pbpeers
|
|
|
|
}
|
|
|
|
|
2014-11-21 03:45:03 -08:00
|
|
|
// PeersToPBPeers converts given []peer.Peer into a set of []*Message_Peer,
|
|
|
|
// which can be written to a message and sent out. the key thing this function
|
|
|
|
// does (in addition to PeersToPBPeers) is set the ConnectionType with
|
2014-12-19 12:19:56 -08:00
|
|
|
// information from the given inet.Network.
|
2016-06-01 15:51:39 -07:00
|
|
|
func PeerInfosToPBPeers(n inet.Network, peers []pstore.PeerInfo) []*Message_Peer {
|
2014-12-19 12:19:56 -08:00
|
|
|
pbps := RawPeerInfosToPBPeers(peers)
|
2014-11-21 03:45:03 -08:00
|
|
|
for i, pbp := range pbps {
|
2014-12-19 12:19:56 -08:00
|
|
|
c := ConnectionType(n.Connectedness(peers[i].ID))
|
2014-11-21 03:45:03 -08:00
|
|
|
pbp.Connection = &c
|
|
|
|
}
|
|
|
|
return pbps
|
|
|
|
}
|
|
|
|
|
2015-01-27 22:57:39 -08:00
|
|
|
func PeerRoutingInfosToPBPeers(peers []PeerRoutingInfo) []*Message_Peer {
|
|
|
|
pbpeers := make([]*Message_Peer, len(peers))
|
|
|
|
for i, p := range peers {
|
|
|
|
pbpeers[i] = peerRoutingInfoToPBPeer(p)
|
|
|
|
}
|
|
|
|
return pbpeers
|
|
|
|
}
|
|
|
|
|
2016-06-01 15:51:39 -07:00
|
|
|
// PBPeersToPeerInfos converts given []*Message_Peer into []pstore.PeerInfo
|
2014-12-19 12:19:56 -08:00
|
|
|
// Invalid addresses will be silently omitted.
|
2016-06-01 15:51:39 -07:00
|
|
|
func PBPeersToPeerInfos(pbps []*Message_Peer) []pstore.PeerInfo {
|
|
|
|
peers := make([]pstore.PeerInfo, 0, len(pbps))
|
2014-12-19 12:19:56 -08:00
|
|
|
for _, pbp := range pbps {
|
|
|
|
peers = append(peers, PBPeerToPeerInfo(pbp))
|
2014-11-21 08:03:11 -08:00
|
|
|
}
|
2014-12-19 12:19:56 -08:00
|
|
|
return peers
|
2014-11-21 08:03:11 -08:00
|
|
|
}
|
|
|
|
|
2014-11-20 10:46:56 -08:00
|
|
|
// Addresses returns a multiaddr associated with the Message_Peer entry
|
2014-12-19 12:19:56 -08:00
|
|
|
func (m *Message_Peer) Addresses() []ma.Multiaddr {
|
2014-10-11 06:33:57 -07:00
|
|
|
if m == nil {
|
2014-12-19 12:19:56 -08:00
|
|
|
return nil
|
2014-10-11 06:33:57 -07:00
|
|
|
}
|
2014-11-20 10:46:56 -08:00
|
|
|
|
2016-05-16 17:09:54 -07:00
|
|
|
maddrs := make([]ma.Multiaddr, 0, len(m.Addrs))
|
|
|
|
for _, addr := range m.Addrs {
|
|
|
|
maddr, err := ma.NewMultiaddrBytes(addr)
|
2014-11-20 10:46:56 -08:00
|
|
|
if err != nil {
|
2016-05-16 17:09:54 -07:00
|
|
|
log.Warningf("error decoding Multiaddr for peer: %s", m.GetId())
|
2014-12-19 12:19:56 -08:00
|
|
|
continue
|
2014-11-20 10:46:56 -08:00
|
|
|
}
|
2016-05-16 17:09:54 -07:00
|
|
|
|
|
|
|
maddrs = append(maddrs, maddr)
|
2014-11-20 10:46:56 -08:00
|
|
|
}
|
2014-12-19 12:19:56 -08:00
|
|
|
return maddrs
|
2014-10-11 06:33:57 -07:00
|
|
|
}
|
|
|
|
|
2014-09-16 00:52:57 -07:00
|
|
|
// GetClusterLevel gets and adjusts the cluster level on the message.
|
|
|
|
// a +/- 1 adjustment is needed to distinguish a valid first level (1) and
|
|
|
|
// default "no value" protobuf behavior (0)
|
2014-09-16 07:17:55 -07:00
|
|
|
func (m *Message) GetClusterLevel() int {
|
2014-09-16 01:09:34 -07:00
|
|
|
level := m.GetClusterLevelRaw() - 1
|
|
|
|
if level < 0 {
|
2014-10-25 04:13:28 -07:00
|
|
|
return 0
|
2014-09-16 01:09:34 -07:00
|
|
|
}
|
2014-09-16 07:17:55 -07:00
|
|
|
return int(level)
|
2014-09-16 00:52:57 -07:00
|
|
|
}
|
2014-08-01 13:21:51 -07:00
|
|
|
|
2014-09-16 00:52:57 -07:00
|
|
|
// SetClusterLevel adjusts and sets the cluster level on the message.
|
|
|
|
// a +/- 1 adjustment is needed to distinguish a valid first level (1) and
|
|
|
|
// default "no value" protobuf behavior (0)
|
2014-09-16 07:17:55 -07:00
|
|
|
func (m *Message) SetClusterLevel(level int) {
|
|
|
|
lvl := int32(level)
|
|
|
|
m.ClusterLevelRaw = &lvl
|
2014-08-01 13:21:51 -07:00
|
|
|
}
|
2014-11-15 18:31:06 -08:00
|
|
|
|
2014-11-21 03:45:03 -08:00
|
|
|
// Loggable turns a Message into machine-readable log output
|
2014-11-15 18:31:06 -08:00
|
|
|
func (m *Message) Loggable() map[string]interface{} {
|
|
|
|
return map[string]interface{}{
|
|
|
|
"message": map[string]string{
|
|
|
|
"type": m.Type.String(),
|
2016-03-20 17:07:25 +01:00
|
|
|
"key": key.Key(m.GetKey()).B58String(),
|
2014-11-15 18:31:06 -08:00
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
2014-11-21 03:45:03 -08:00
|
|
|
|
|
|
|
// ConnectionType returns a Message_ConnectionType associated with the
|
|
|
|
// inet.Connectedness.
|
|
|
|
func ConnectionType(c inet.Connectedness) Message_ConnectionType {
|
|
|
|
switch c {
|
|
|
|
default:
|
|
|
|
return Message_NOT_CONNECTED
|
|
|
|
case inet.NotConnected:
|
|
|
|
return Message_NOT_CONNECTED
|
|
|
|
case inet.Connected:
|
|
|
|
return Message_CONNECTED
|
|
|
|
case inet.CanConnect:
|
|
|
|
return Message_CAN_CONNECT
|
|
|
|
case inet.CannotConnect:
|
|
|
|
return Message_CANNOT_CONNECT
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Connectedness returns an inet.Connectedness associated with the
|
|
|
|
// Message_ConnectionType.
|
|
|
|
func Connectedness(c Message_ConnectionType) inet.Connectedness {
|
|
|
|
switch c {
|
|
|
|
default:
|
|
|
|
return inet.NotConnected
|
|
|
|
case Message_NOT_CONNECTED:
|
|
|
|
return inet.NotConnected
|
|
|
|
case Message_CONNECTED:
|
|
|
|
return inet.Connected
|
|
|
|
case Message_CAN_CONNECT:
|
|
|
|
return inet.CanConnect
|
|
|
|
case Message_CANNOT_CONNECT:
|
|
|
|
return inet.CannotConnect
|
|
|
|
}
|
|
|
|
}
|