commit 5b03f7567ad8242cc87924c3920dfc04420365ef
parent b62071330cd7e0445e89660d07b7aed098f80285
Author: Bernd Fix <brf@hoi-polloi.org>
Date: Thu, 18 Aug 2022 14:58:34 +0200
Prepared for integration test.
Diffstat:
62 files changed, 3070 insertions(+), 1841 deletions(-)
diff --git a/README.md b/README.md
@@ -37,7 +37,7 @@ go test ./...
The binaries are stored in `${GOPATH}/bin`.
-## Source code
+# Source code
All source code is written for Go v1.18+.
@@ -45,7 +45,7 @@ All source code is written for Go v1.18+.
the source code, make sure you run `go mod tidy` in the `src/gnunet` folder
to install all dependencies.
-### `./src/gnunet`
+## `./src/gnunet`
The folder `src/gnunet` contains a Go implementation of GNUnet: It is WIP
and only provides a very limited coverage of GNUnet. The goal is to have
@@ -53,12 +53,12 @@ a complete, functionally equivalent implementation of the GNUnet protocol
in Go. Currently only some aspects of Transport, GNS, Revocation, Namecache
and DHT are implemented.
-Use `./build.sh` to build the executables (services and utilities, see
+Use `./build.sh withgen` to build the executables (services and utilities, see
below). The resulting programs are stored in `${GOPATH}/bin`.
To run the unit tests, use `./test.sh`.
-#### `./src/gnunet/enums`
+## `./src/gnunet/enums`
Changes in GANA definitions for block types, GNS record types and signature
purpose values can be imported by copying the recfiles (GNU recutils) from
@@ -71,21 +71,21 @@ GANA into this folder:
After updating the recfiles, you need to run `go generate ./...` to generate
the new source files.
-### `./src/gnunet/cmd`
+## `./src/gnunet/cmd`
-#### `gnunet-service-dht-test-go`: Implementation of the DHT core service (testbed).
+### `gnunet-service-dht-test-go`: Implementation of the DHT core service (testbed).
-#### `gnunet-service-gns-go`: Implementation of the GNS core service.
+### `gnunet-service-gns-go`: Implementation of the GNS core service.
Stand-alone GNS service that could be used with other GNUnet utilities and
services.
-#### `gnunet-service-revocation-go`: Implementation of the GNS revocation service.
+### `gnunet-service-revocation-go`: Implementation of the GNS revocation service.
Stand-alone Revocation service that could be used with other GNUnet utilities
and services.
-#### `revoke-zonekey`: Implementation of a stand-alone program to calculate revocations.
+### `revoke-zonekey`: Implementation of a stand-alone program to calculate revocations.
This program creates a zone key revocation block. Depending on the parameters
the calculation can take days or even weeks. The program can be interrupted
@@ -109,9 +109,9 @@ The default difficulty will create a revocation valid for ~2 years.
* **`-v`**: verbose output
-#### `peer_mockup`: test message exchange on the lowest level (transport).
+### `peer_mockup`: test message exchange on the lowest level (transport).
-#### `vanityid`: Compute GNUnet vanity peer id for a given regexp pattern.
+### `vanityid`: Compute GNUnet vanity peer id for a given regexp pattern.
N.B.: Key generation is slow at the moment, so be patient! To generate a single
matching key some 1,000,000 keys need to be generated for a four letter prefix;
@@ -141,7 +141,203 @@ For `gnunet-go` configuration files you need to paste the result of
`echo "<hex.seed>" | xxd -r -p | base64` into the `PrivateSeed` field in the
`NodeConfig` section.
-## Using gnunet-go in your own projects
+# Testing `gnunet-go`
+
+To test the current `gnunet-go` implementation in a local GNUnet environment,
+you should follow the detailed instructions below.
+
+**N.B.**: Testing requires an up-to-date GNUnet build from source. You can
+either use your local machine (please follow the GNUnet documentation for
+setup) or you can simply use a Docker image like
+[gnunet-docker](https://github.com/bfix/gnunet-docker) for this.
+
+## Testing `R5N DHT`
+
+`gnunet-go` implements the DHT protocol specified in
+[lsd0004](https://lsd.gnunet.org/lsd0004/) and uses a custom (unencrypted)
+transport protocol not supported by the standard GNUnet. Luckily there is a
+testbed in GNUnet that allows to run the new protocol over UDP/IP.
+
+### Starting the DHTU testbed
+
+Make sure you stopped (or have not started) all GNUnet services; the testbed
+will take care of everything required.
+
+Change into `./src/dht` in the `gnunet`-Repository and start any number of
+DHTU nodes for testing:
+
+```bash
+./dhtu_testbed_deploy.sh 10
+```
+
+will start ten DHTU nodes. Nodes will listen to all available network
+addresses on port 10000+ (one node, one port).
+
+Log and configuration files can be found in `/tmp/deployment/`; they are
+named by index (starting at 0).
+
+### Running the `gnunet-go` node in the testbed
+
+#### Setting up the configuration file
+
+Copy the example `gnunet-config.json` to `dhtu-config.json` and modify the
+`network` and `local` sections to our local setup. In this example
+`172.17.0.5` is the network address for GNUnet DHTU nodes and `172.17.0.1`
+is the network address for `gnunet-go`:
+
+```json
+{
+ "network": {
+ "bootstrap": [
+ "ip+udp://127.17.0.5:10000"
+ ],
+ "numPeers": 10
+ },
+ "local": {
+ "privateSeed": "YGoe6XFH3XdvFRl+agx9gIzPTvxA229WFdkazEMdcOs=",
+ "endpoints": [
+ {
+ "id": "r5n",
+ "network": "ip+udp",
+ "address": "172.17.0.1",
+ "port": 2086,
+ "ttl": 86400
+ }
+ ]
+ }
+ :
+}
+```
+
+The above configuration will expect a network of 10 nodes and has a single
+bootstrap node (the first DHTU node in the testbed). `gnunet-go` will listen
+on port 2086.
+
+#### Running the `gnunet-go`node
+
+Run the following commands to start the `gnunet-go` node:
+
+```bash
+rm -rf /tmp/gnunet-system-runtime
+mkdir -p /tmp/gnunet-system-runtime
+${GOPATH}/bin/gnunet-service-dht-go -c dhtu-config.json 2>&1 | tee run.log
+```
+
+## Testing `GNS`
+
+You need to have (all) GNUnet services up and running.
+
+### Setting up the configuration file
+
+Copy the example `gnunet-config.json` to `gns-config.json` and modify the
+`network` and `local` sections:
+
+```json
+{
+ "network": {
+ "bootstrap": [],
+ "numPeers": 10
+ },
+ "local": {
+ "privateSeed": "YGoe6XFH3XdvFRl+agx9gIzPTvxA229WFdkazEMdcOs=",
+ "endpoints": []
+ },
+ :
+}
+```
+
+### Preparing and running the tests
+
+For test purposes you need to start the `gnunet-go` DNS service, generate
+zones and resource records for testing and run the actual test cases.
+You can use the follwing script to do it all in one go:
+
+```bash
+#!/bin/bash
+
+GNS_SOCK=/tmp/gnunet-system-runtime/gnunet-service-gns-go.sock
+[ -e ${GNS_SOCK} ] && sudo rm -f ${GNS_SOCK}
+sudo -u gnunet ../bin/gnunet-service-gns-go -L 5 &
+GOGNS=$!
+
+function get_pkey() {
+ gnunet-identity -d -e $1 | sed 's/.* - //'
+}
+
+CERT=$(openssl x509 -in <(openssl s_client -connect gnunet.org:443 </dev/null 2>/dev/null) -outform der \
+ | od -t x1 -A n \
+ | tr "\n" " " \
+ | sed "s/ //g")
+VPN="ZH7W4PR933913VA45AH45GH9QNQVP3TEM89J18549Q6RNDV75A4G secret"
+
+
+for x in zone9 private; do
+ gnunet-identity -D $x
+done
+
+ gnunet-identity -C zone9
+ gnunet-identity -C private
+
+ gnunet-namestore -a -z zone9 -n "@" -t NICK -V "zone9" -e never
+ gnunet-namestore -a -z zone9 -n web -t A -V 131.159.74.67 -e never
+ gnunet-namestore -a -z zone9 -n web -t BOX -V "6 443 52 3 0 0 ${CERT}" -e never
+ gnunet-namestore -a -z zone9 -n gn -t CNAME -V gnunet.org -e never
+ gnunet-namestore -a -z zone9 -n sec -t VPN -V "6 ${VPN}" -e never
+ gnunet-namestore -a -z zone9 -n prv -t PKEY -V "$(get_pkey private)" -e never
+# gnunet-namestore -a -z zone9 -n prv -t A -V "14.15.16.17" -e never
+ gnunet-namestore -a -z zone9 -n old -t LEHO -V "old.gnunet.org" -e never
+ gnunet-namestore -a -z zone9 -n old -t A -V 5.6.7.8 -e never
+# gnunet-namestore -a -z zone9 -n old -t A -V 10.11.12.13 -e never
+# gnunet-namestore -a -z zone9 -n old -t TXT -V "Old version" -e never
+
+ gnunet-namestore -a -z private -n "@" -t NICK -V "nexus9" -e never
+ gnunet-namestore -a -z private -n name -t TXT -V "GNUnet test" -e never
+ gnunet-namestore -d -z private -n host
+ gnunet-namestore -a -z private -n host -t GNS2DNS -V "gnunet.org@8.8.8.8" -e never
+# gnunet-namestore -a -z private -n host -t A -V 1.2.3.4 -e never
+
+function test_gns() {
+ echo "========================"
+ echo -n "Testing '$2' for type '$1': "
+ gnunet-gns -t $1 -u $2 > plain.out
+ gnunet-gns -c gns-go.conf -t $1 -u $2 > go.out
+ rc=$(diff plain.out go.out)
+ if [ -z "$rc" ]; then
+ echo "O.K."
+ else
+ echo "FAILED!"
+ echo "---------------- GNS-C"
+ cat plain.out
+ echo "---------------- GNS-Go"
+ cat go.out
+ fi
+}
+
+# (1)
+test_gns any web.zone9
+# (2)
+test_gns any _443._tcp.web.zone9
+# (3)
+test_gns nick zone9
+# (4)
+test_gns any gn.zone9
+# (5)
+test_gns any sec.zone9
+# (6)
+test_gns pkey prv.zone9
+# (7)
+test_gns nick prv.zone9
+# (8)
+test_gns any name.prv.zone9
+# (9)
+test_gns any host.prv.zone9
+# (10)
+test_gns a host.prv.zone9
+
+kill ${GOGNS}
+```
+
+# Using gnunet-go in your own projects
`gnunet-go` is not a standard Go module for direct use (via go.mod) in other
packages, but designed as a stand-alone application. The rationale behind was
diff --git a/src/gnunet/cmd/gnunet-service-dht-go/main.go b/src/gnunet/cmd/gnunet-service-dht-go/main.go
@@ -33,6 +33,7 @@ import (
"gnunet/service"
"gnunet/service/dht"
"gnunet/service/dht/blocks"
+ "gnunet/transport"
"gnunet/util"
"github.com/bfix/gospel/logger"
@@ -44,6 +45,8 @@ func main() {
// flush last messages
logger.Flush()
}()
+ // intro
+ logger.SetLogLevel(logger.DBG)
logger.Println(logger.INFO, "[dht] Starting service...")
var (
@@ -58,7 +61,7 @@ func main() {
flag.StringVar(&cfgFile, "c", "gnunet-config.json", "GNUnet configuration file")
flag.StringVar(&socket, "s", "", "GNS service socket")
flag.StringVar(¶m, "p", "", "socket parameters (<key>=<value>,...)")
- flag.IntVar(&logLevel, "L", logger.DBG, "DHT log level (default: DBG)")
+ flag.IntVar(&logLevel, "L", logger.INFO, "DHT log level (default: INFO)")
flag.StringVar(&rpcEndp, "R", "", "JSON-RPC endpoint (default: none)")
flag.Parse()
@@ -69,6 +72,9 @@ func main() {
}
// apply configuration
+ if config.Cfg.Logging.Level > 0 {
+ logLevel = config.Cfg.Logging.Level
+ }
logger.SetLogLevel(logLevel)
if len(socket) == 0 {
socket = config.Cfg.DHT.Service.Socket
@@ -155,11 +161,12 @@ func main() {
}
// send HELLO to all bootstrap addresses
for _, addr := range bsList {
- if err := dhtSrv.SendHello(ctx, addr); err != nil {
- logger.Printf(logger.ERROR, "[dht] send HELLO failed: %s", err.Error())
+ if err := dhtSrv.SendHello(ctx, addr, "bootstrap"); err != nil {
+ if err != transport.ErrEndpMaybeSent {
+ logger.Printf(logger.ERROR, "[bootstrap] send HELLO failed: %s", err.Error())
+ }
}
}
-
// handle OS signals
sigCh := make(chan os.Signal, 5)
signal.Notify(sigCh)
diff --git a/src/gnunet/config/config.go b/src/gnunet/config/config.go
@@ -134,6 +134,16 @@ type RevocationConfig struct {
}
//----------------------------------------------------------------------
+// Logging configuration
+//----------------------------------------------------------------------
+
+// LoggingConfig defines the loglevel and logfile location
+type LoggingConfig struct {
+ Level int `json:"level"`
+ File string `json:"file"`
+}
+
+//----------------------------------------------------------------------
// Combined configuration
//----------------------------------------------------------------------
@@ -150,6 +160,7 @@ type Config struct {
GNS *GNSConfig `json:"gns"`
Namecache *NamecacheConfig `json:"namecache"`
Revocation *RevocationConfig `json:"revocation"`
+ Logging *LoggingConfig `json:"logging"`
}
var (
diff --git a/src/gnunet/config/gnunet-config.json b/src/gnunet/config/gnunet-config.json
@@ -83,5 +83,9 @@
},
"rpc": {
"endpoint": "tcp:127.0.0.1:80"
+ },
+ "logging": {
+ "level": 4,
+ "file": "/tmp/gnunet-go/run.log"
}
}
\ No newline at end of file
diff --git a/src/gnunet/core/core.go b/src/gnunet/core/core.go
@@ -20,7 +20,6 @@ package core
import (
"context"
- "encoding/hex"
"errors"
"gnunet/config"
"gnunet/crypto"
@@ -42,6 +41,9 @@ var (
ErrCoreNotSent = errors.New("message not sent")
)
+// CtxKey is a value-context key
+type CtxKey string
+
//----------------------------------------------------------------------
// EndpointRef is a reference to an endpoint instance managed by core.
type EndpointRef struct {
@@ -85,7 +87,7 @@ func NewCore(ctx context.Context, node *config.NodeConfig) (c *Core, err error)
if peer, err = NewLocalPeer(node); err != nil {
return
}
- logger.Printf(logger.DBG, "[core] Local node is %s", peer.GetID().String())
+ logger.Printf(logger.INFO, "[core] Local node is %s", peer.GetID().Short())
// create new core instance
incoming := make(chan *transport.Message)
@@ -166,7 +168,7 @@ func (c *Core) pump(ctx context.Context) {
select {
// get (next) message from transport
case tm := <-c.incoming:
- logger.Printf(logger.DBG, "[core] Message received from %s: %s", tm.Peer, util.Dump(tm.Msg, "json"))
+ logger.Printf(logger.DBG, "[core] Message received from %s: %s", tm.Peer.Short(), tm.Msg)
// check if peer is already connected (has an entry in PeerAddrist)
_, connected := c.connected.Get(tm.Peer.String(), 0)
@@ -217,6 +219,14 @@ func (c *Core) Shutdown() {
// Send is a function that allows the local peer to send a protocol
// message to a remote peer.
func (c *Core) Send(ctx context.Context, peer *util.PeerID, msg message.Message) (err error) {
+ // assemble log label
+ label := "core"
+ if v := ctx.Value(CtxKey("label")); v != nil {
+ if s, ok := v.(string); ok && len(s) > 0 {
+ label = s
+ }
+ }
+
// TODO: select best endpoint protocol for transport; now fixed to IP+UDP
netw := "ip+udp"
@@ -224,12 +234,12 @@ func (c *Core) Send(ctx context.Context, peer *util.PeerID, msg message.Message)
aList := c.peers.Get(peer, netw)
maybe := false // message may be sent...
for _, addr := range aList {
- logger.Printf(logger.INFO, "[core] Trying to send to %s", addr.URI())
+ logger.Printf(logger.INFO, "[%s] Trying to send to %s", label, addr.URI())
// send message to address
if err = c.SendToAddr(ctx, addr, msg); err != nil {
// if it is possible that the message was not sent, try next address
if err != transport.ErrEndpMaybeSent {
- logger.Printf(logger.WARN, "[core] Failed to send to %s: %s", addr.URI(), err.Error())
+ logger.Printf(logger.WARN, "[%s] Failed to send to %s: %s", label, addr.URI(), err.Error())
} else {
maybe = true
}
@@ -239,7 +249,6 @@ func (c *Core) Send(ctx context.Context, peer *util.PeerID, msg message.Message)
return
}
if maybe {
- logger.Printf(logger.WARN, "[core] %s", transport.ErrEndpMaybeSent.Error())
err = nil
} else {
err = ErrCoreNotSent
@@ -256,7 +265,9 @@ func (c *Core) SendToAddr(ctx context.Context, addr *util.Address, msg message.M
}
// Learn (new) addresses for peer
-func (c *Core) Learn(ctx context.Context, peer *util.PeerID, addrs []*util.Address) (newPeer bool) {
+func (c *Core) Learn(ctx context.Context, peer *util.PeerID, addrs []*util.Address, label string) (newPeer bool) {
+ logger.Printf(logger.DBG, "[%s] Learning %v for %s", label, addrs, peer.Short())
+
// learn all addresses for peer
newPeer = false
for _, addr := range addrs {
@@ -265,7 +276,8 @@ func (c *Core) Learn(ctx context.Context, peer *util.PeerID, addrs []*util.Addre
continue
}
// learn address
- logger.Printf(logger.INFO, "[core] Learning %s for %s (expires %s)", addr.URI(), peer, addr.Expires)
+ logger.Printf(logger.INFO, "[%s] Learning %s for %s (expires %s)",
+ label, addr.URI(), peer.Short(), addr.Expire)
newPeer = (c.peers.Add(peer, addr) == 1) || newPeer
}
return
@@ -296,12 +308,10 @@ func (c *Core) PeerID() *util.PeerID {
// Sign a signable onject with private peer key
func (c *Core) Sign(obj crypto.Signable) error {
sd := obj.SignedData()
- logger.Printf(logger.DBG, "[core] Signing data '%s'", hex.EncodeToString(sd))
sig, err := c.local.prv.EdSign(sd)
if err != nil {
return err
}
- logger.Printf(logger.DBG, "[core] --> signature '%s'", hex.EncodeToString(sig.Bytes()))
return obj.SetSignature(util.NewPeerSignature(sig.Bytes()))
}
@@ -357,12 +367,11 @@ func (c *Core) Unregister(name string) *Listener {
// internal: dispatch event to listeners
func (c *Core) dispatch(ev *Event) {
- logger.Printf(logger.DBG, "[core] Dispatching %v...", ev)
// dispatch event to listeners
for _, l := range c.listeners {
if l.filter.CheckEvent(ev.ID) {
if ev.ID == EV_MESSAGE {
- mt := ev.Msg.Header().MsgType
+ mt := ev.Msg.Type()
if mt != 0 && !l.filter.CheckMsgType(mt) {
// skip event
return
diff --git a/src/gnunet/core/core_test.go b/src/gnunet/core/core_test.go
@@ -249,7 +249,7 @@ func (n *TestNode) Learn(ctx context.Context, peer *util.PeerID, addr *util.Addr
label = peer.String()
}
n.t.Logf("[%d] Learning %s for %s", n.id, addr.URI(), label)
- n.core.Learn(ctx, peer, []*util.Address{addr})
+ n.core.Learn(ctx, peer, []*util.Address{addr}, label)
}
func NewTestNode(ctx context.Context, t *testing.T, cfg *config.NodeConfig) (node *TestNode, err error) {
@@ -298,7 +298,7 @@ func NewTestNode(ctx context.Context, t *testing.T, cfg *config.NodeConfig) (nod
case EV_DISCONNECT:
t.Logf("[%d] <<< Peer %s diconnected", node.id, ev.Peer)
case EV_MESSAGE:
- t.Logf("[%d] <<< Msg from %s of type %d", node.id, ev.Peer, ev.Msg.Header().MsgType)
+ t.Logf("[%d] <<< Msg from %s of type %s", node.id, ev.Peer, ev.Msg.Type())
t.Logf("[%d] <<< --> %s", node.id, ev.Msg.String())
wrt := new(bytes.Buffer)
if err := transport.WriteMessageDirect(wrt, ev.Msg); err == nil {
diff --git a/src/gnunet/core/event.go b/src/gnunet/core/event.go
@@ -20,6 +20,7 @@ package core
import (
"fmt"
+ "gnunet/enums"
"gnunet/message"
"gnunet/transport"
"gnunet/util"
@@ -42,14 +43,14 @@ const (
// can be filtered by message type also.
type EventFilter struct {
evTypes map[int]bool
- msgTypes map[uint16]bool
+ msgTypes map[enums.MsgType]bool
}
// NewEventFilter creates a new empty filter instance.
func NewEventFilter() *EventFilter {
return &EventFilter{
evTypes: make(map[int]bool),
- msgTypes: make(map[uint16]bool),
+ msgTypes: make(map[enums.MsgType]bool),
}
}
@@ -59,7 +60,7 @@ func (f *EventFilter) AddEvent(ev int) {
}
// AddMsgType adds a message type to filter
-func (f *EventFilter) AddMsgType(mt uint16) {
+func (f *EventFilter) AddMsgType(mt enums.MsgType) {
f.evTypes[EV_MESSAGE] = true
f.msgTypes[mt] = true
}
@@ -76,7 +77,7 @@ func (f *EventFilter) CheckEvent(ev int) bool {
// CheckMsgType returns true if a message type is matched
// by the filter or the filter is empty.
-func (f *EventFilter) CheckMsgType(mt uint16) bool {
+func (f *EventFilter) CheckMsgType(mt enums.MsgType) bool {
if len(f.msgTypes) == 0 {
return true
}
@@ -103,7 +104,7 @@ func (e *Event) String() string {
}
s += fmt.Sprintf("id=%d,peer=%s", e.ID, e.Peer)
if e.Msg != nil {
- s += fmt.Sprintf(",msg=%d", e.Msg.Header().MsgType)
+ s += fmt.Sprintf(",msg=%s", e.Msg.Type())
}
return s + "}"
}
diff --git a/src/gnunet/core/peer.go b/src/gnunet/core/peer.go
@@ -103,7 +103,7 @@ func (p *Peer) HelloData(ttl time.Duration, a []*util.Address) (h *blocks.HelloB
// assemble HELLO data
h = new(blocks.HelloBlock)
h.PeerID = p.GetID()
- h.Expires = util.NewAbsoluteTime(time.Now().Add(ttl))
+ h.Expire_ = util.NewAbsoluteTime(time.Now().Add(ttl))
h.SetAddresses(a)
// sign data
diff --git a/src/gnunet/core/peer_test.go b/src/gnunet/core/peer_test.go
@@ -75,7 +75,7 @@ func TestPeerHello(t *testing.T) {
t.Log(u2)
// check if HELLO data is the same
- if !h.Equals(h2) {
+ if !h.Equal(h2) {
t.Fatal("HELLO data mismatch")
}
// verify signature
diff --git a/src/gnunet/crypto/gns_edkey.go b/src/gnunet/crypto/gns_edkey.go
@@ -132,7 +132,7 @@ func (pk *EDKEYPublicImpl) Verify(data []byte, zs *ZoneSignature) (ok bool, err
// BlockKey return the symmetric key (and initialization vector) based on
// label and expiration time.
-func (pk *EDKEYPublicImpl) BlockKey(label string, expires util.AbsoluteTime) (skey []byte) {
+func (pk *EDKEYPublicImpl) BlockKey(label string, expire util.AbsoluteTime) (skey []byte) {
// generate symmetric key
skey = make([]byte, 56)
kd := pk.Bytes()
@@ -143,11 +143,11 @@ func (pk *EDKEYPublicImpl) BlockKey(label string, expires util.AbsoluteTime) (sk
}
// assemble initialization vector
iv := &struct {
- Nonce []byte `size:"16"` // Nonce
- Expiration util.AbsoluteTime `` // Expiration time of block
+ Nonce []byte `size:"16"` // Nonce
+ Expire util.AbsoluteTime `` // Expiration time of block
}{
- Nonce: make([]byte, 16),
- Expiration: expires,
+ Nonce: make([]byte, 16),
+ Expire: expire,
}
prk = hkdf.Extract(sha512.New, kd, []byte("gns-xsalsa-ctx-iv"))
rdr = hkdf.Expand(sha256.New, prk, []byte(label))
diff --git a/src/gnunet/crypto/gns_pkey.go b/src/gnunet/crypto/gns_pkey.go
@@ -121,13 +121,13 @@ func (pk *PKEYPublicImpl) BlockKey(label string, expires util.AbsoluteTime) (ske
// assemble initialization vector
iv := &struct {
- Nonce []byte `size:"4"` // 32 bit Nonce
- Expiration util.AbsoluteTime `` // Expiration time of block
- Counter uint32 `order:"big"` // Block counter
+ Nonce []byte `size:"4"` // 32 bit Nonce
+ Expire util.AbsoluteTime `` // Expiration time of block
+ Counter uint32 `order:"big"` // Block counter
}{
- Nonce: make([]byte, 4),
- Expiration: expires,
- Counter: 1,
+ Nonce: make([]byte, 4),
+ Expire: expires,
+ Counter: 1,
}
prk = hkdf.Extract(sha512.New, kd, []byte("gns-aes-ctx-iv"))
rdr = hkdf.Expand(sha256.New, prk, []byte(label))
diff --git a/src/gnunet/crypto/hash.go b/src/gnunet/crypto/hash.go
@@ -28,12 +28,12 @@ import (
// HashCode is the result of a 512-bit hash function (SHA-512)
type HashCode struct {
- Bits []byte `size:"(Size))"`
+ Data []byte `size:"(Size)"`
}
-// Equals tests if two hash results are equal.
-func (hc *HashCode) Equals(n *HashCode) bool {
- return bytes.Equal(hc.Bits, n.Bits)
+// Equal tests if two hash results are equal.
+func (hc *HashCode) Equal(n *HashCode) bool {
+ return bytes.Equal(hc.Data, n.Data)
}
// Size of binary data
@@ -44,13 +44,18 @@ func (hc *HashCode) Size() uint {
// Clone the hash code
func (hc *HashCode) Clone() *HashCode {
return &HashCode{
- Bits: util.Clone(hc.Bits),
+ Data: util.Clone(hc.Data),
}
}
// String returns a hex-representation of the hash code
func (hc *HashCode) String() string {
- return hex.EncodeToString(hc.Bits)
+ return hex.EncodeToString(hc.Data)
+}
+
+// Short returns a short key representation
+func (hc *HashCode) Short() string {
+ return util.Shorten(hc.String(), 20)
}
// NewHashCode creates a new (initialized) hash value
@@ -65,7 +70,7 @@ func NewHashCode(data []byte) *HashCode {
copy(v, data[:size])
}
}
- hc.Bits = v
+ hc.Data = v
return hc
}
@@ -73,6 +78,6 @@ func NewHashCode(data []byte) *HashCode {
func Hash(data []byte) *HashCode {
val := sha512.Sum512(data)
return &HashCode{
- Bits: util.Clone(val[:]),
+ Data: util.Clone(val[:]),
}
}
diff --git a/src/gnunet/enums/dht.go b/src/gnunet/enums/dht.go
@@ -26,6 +26,8 @@ const (
DHT_RO_RECORD_ROUTE = 2 // keep track of the route that the message took in the P2P network.
DHT_RO_FIND_APPROXIMATE = 4 // Approximate results are fine.
DHT_RO_TRUNCATED = 8 // Flag if path is truncated
+
+ DHT_RO_DISCOVERY = 32768 // Peer discovery
)
//go:generate go run generate.go gnunet-dht.rec gnunet-dht.tpl dht_block_type.go
diff --git a/src/gnunet/enums/dht_block_type.go b/src/gnunet/enums/dht_block_type.go
@@ -3,7 +3,7 @@
//nolint:stylecheck // allow non-camel-case for constants
package enums
-type BlockType uint16
+type BlockType uint32
// DHT block types
const (
diff --git a/src/gnunet/enums/gnunet-dht.tpl b/src/gnunet/enums/gnunet-dht.tpl
@@ -3,7 +3,7 @@
//nolint:stylecheck // allow non-camel-case for constants
package enums
-type BlockType uint16
+type BlockType uint32
// DHT block types
const (
diff --git a/src/gnunet/enums/messages.go b/src/gnunet/enums/messages.go
@@ -0,0 +1,844 @@
+// This file is part of gnunet-go, a GNUnet-implementation in Golang.
+// Copyright (C) 2019-2022 Bernd Fix >Y<
+//
+// gnunet-go is free software: you can redistribute it and/or modify it
+// under the terms of the GNU Affero General Public License as published
+// by the Free Software Foundation, either version 3 of the License,
+// or (at your option) any later version.
+//
+// gnunet-go 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
+// Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+// SPDX-License-Identifier: AGPL3.0-or-later
+
+//nolint:stylecheck // allow non-camel-case in constants
+package enums
+
+// MsgType for GNUnet message type identifiers
+//go:generate stringer -type=MsgType
+type MsgType uint16
+
+// GNUnet message types
+const (
+ MSG_TEST MsgType = 1 // Test if service is online (deprecated)
+ MSG_DUMMY MsgType = 2 // Dummy messages for testing / benchmarking
+ MSG_DUMMY2 MsgType = 3 // Another dummy messages for testing / benchmarking
+
+ //------------------------------------------------------------------
+ // RESOLVER message types
+ //------------------------------------------------------------------
+
+ MSG_RESOLVER_REQUEST MsgType = 4 // Request DNS resolution
+ MSG_RESOLVER_RESPONSE MsgType = 5 // Response to a DNS resolution request
+
+ //------------------------------------------------------------------
+ // AGPL source code download
+ //------------------------------------------------------------------
+
+ MSG_REQUEST_AGPL MsgType = 6 // Message to request source code link
+ MSG_RESPONSE_AGPL MsgType = 7 // Source code link
+
+ //------------------------------------------------------------------
+ // ARM message types
+ //------------------------------------------------------------------
+
+ MSG_ARM_START MsgType = 8 // Request to ARM to start a service
+ MSG_ARM_STOP MsgType = 9 // Request to ARM to stop a service
+ MSG_ARM_RESULT MsgType = 10 // Response from ARM
+ MSG_ARM_STATUS MsgType = 11 // Status update from ARM
+ MSG_ARM_LIST MsgType = 12 // Request to ARM to list all currently running services
+ MSG_ARM_LIST_RESULT MsgType = 13 // Response from ARM for listing currently running services
+ MSG_ARM_MONITOR MsgType = 14 // Request to ARM to notify client of service status changes
+ MSG_ARM_TEST MsgType = 15 // Test if ARM service is online
+
+ //------------------------------------------------------------------
+ // HELLO message types
+ //------------------------------------------------------------------
+
+ MSG_HELLO_LEGACY MsgType = 16 // Deprecated HELLO message
+ MSG_HELLO MsgType = 17 // HELLO message with friend_only flag
+
+ //------------------------------------------------------------------
+ // FRAGMENTATION message types
+ //------------------------------------------------------------------
+
+ MSG_FRAGMENT MsgType = 18 // FRAGMENT of a larger message
+ MSG_FRAGMENT_ACK MsgType = 19 // Acknowledgement of a FRAGMENT of a larger message
+
+ //------------------------------------------------------------------
+ // Transport-WLAN message types
+ //------------------------------------------------------------------
+
+ MSG_WLAN_DATA_TO_HELPER MsgType = 39 // Type of data messages from the plugin to the gnunet-wlan-helper
+ MSG_WLAN_DATA_FROM_HELPER MsgType = 40 // Type of data messages from the gnunet-wlan-helper to the plugin
+ MSG_WLAN_HELPER_CONTROL MsgType = 41 // Control message between the gnunet-wlan-helper and the daemon (with the MAC)
+ MSG_WLAN_ADVERTISEMENT MsgType = 42 // Type of messages for advertisement over wlan
+ MSG_WLAN_DATA MsgType = 43 // Type of messages for data over the wlan
+
+ //------------------------------------------------------------------
+ // Transport-DV message types
+ //------------------------------------------------------------------
+
+ MSG_DV_RECV MsgType = 44 // DV service to DV Plugin message
+ MSG_DV_SEND MsgType = 45 // DV Plugin to DV service message
+ MSG_DV_SEND_ACK MsgType = 46 // Confirmation or failure of a DV_SEND message
+ MSG_DV_ROUTE MsgType = 47 // P2P DV message encapsulating some real message
+ MSG_DV_START MsgType = 48 // DV Plugin to DV service message, indicating startup.
+ MSG_DV_CONNECT MsgType = 49 // P2P DV message telling plugin that a peer connected
+ MSG_DV_DISCONNECT MsgType = 50 // P2P DV message telling plugin that a peer disconnected
+ MSG_DV_SEND_NACK MsgType = 51 // P2P DV message telling plugin that a message transmission failed (negative ACK)
+ MSG_DV_DISTANCE_CHANGED MsgType = 52 // P2P DV message telling plugin that our distance to a peer changed
+ MSG_DV_BOX MsgType = 53 // DV message box for boxing multiple messages.
+ MSG_TRANSPORT_XU_MESSAGE MsgType = 55 // Experimental message type.
+
+ //------------------------------------------------------------------
+ // Transport-UDP message types
+ //------------------------------------------------------------------
+
+ MSG_TRANSPORT_UDP_MESSAGE MsgType = 56 // Normal UDP message type.
+ MSG_TRANSPORT_UDP_ACK MsgType = 57 // UDP ACK.
+
+ //------------------------------------------------------------------
+ // Transport-TCP message types
+ //------------------------------------------------------------------
+
+ MSG_TRANSPORT_TCP_NAT_PROBE MsgType = 60 // TCP NAT probe message
+ MSG_TRANSPORT_TCP_WELCOME MsgType = 61 // Welcome message between TCP transports.
+ MSG_TRANSPORT_ATS MsgType = 62 // Message to force transport to update bandwidth assignment (LEGACY)
+
+ //------------------------------------------------------------------
+ // NAT message types
+ //------------------------------------------------------------------
+
+ MSG_NAT_TEST MsgType = 63 // Message to ask NAT server to perform traversal test
+
+ //------------------------------------------------------------------
+ // CORE message types
+ //------------------------------------------------------------------
+
+ MSG_CORE_INIT MsgType = 64 // Initial setup message from core client to core.
+ MSG_CORE_INIT_REPLY MsgType = 65 // Response from core to core client to INIT message.
+ MSG_CORE_NOTIFY_CONNECT MsgType = 67 // Notify clients about new peer-to-peer connections (triggered after key exchange).
+ MSG_CORE_NOTIFY_DISCONNECT MsgType = 68 // Notify clients about peer disconnecting.
+ MSG_CORE_NOTIFY_STATUS_CHANGE MsgType = 69 // Notify clients about peer status change.
+ MSG_CORE_NOTIFY_INBOUND MsgType = 70 // Notify clients about incoming P2P messages.
+ MSG_CORE_NOTIFY_OUTBOUND MsgType = 71 // Notify clients about outgoing P2P transmissions.
+ MSG_CORE_SEND_REQUEST MsgType = 74 // Request from client to transmit message.
+ MSG_CORE_SEND_READY MsgType = 75 // Confirmation from core that message can now be sent
+ MSG_CORE_SEND MsgType = 76 // Client with message to transmit (after SEND_READY confirmation was received).
+ MSG_CORE_MONITOR_PEERS MsgType = 78 // Request for connection monitoring from CORE service.
+ MSG_CORE_MONITOR_NOTIFY MsgType = 79 // Reply for monitor by CORE service.
+ MSG_CORE_ENCRYPTED_MESSAGE MsgType = 82 // Encapsulation for an encrypted message between peers.
+ MSG_CORE_PING MsgType = 83 // Check that other peer is alive (challenge).
+ MSG_CORE_PONG MsgType = 84 // Confirmation that other peer is alive.
+ MSG_CORE_HANGUP MsgType = 85 // Request by the other peer to terminate the connection.
+ MSG_CORE_COMPRESSED_TYPE_MAP MsgType = 86 // gzip-compressed type map of the sender
+ MSG_CORE_BINARY_TYPE_MAP MsgType = 87 // uncompressed type map of the sender
+ MSG_CORE_EPHEMERAL_KEY MsgType = 88 // Session key exchange between peers.
+ MSG_CORE_CONFIRM_TYPE_MAP MsgType = 89 // Other peer confirms having received the type map
+
+ //------------------------------------------------------------------
+ // DATASTORE message types
+ //------------------------------------------------------------------
+
+ MSG_DATASTORE_RESERVE MsgType = 92 // Message sent by datastore client on join.
+ MSG_DATASTORE_RELEASE_RESERVE MsgType = 93 // Message sent by datastore client on join.
+ MSG_DATASTORE_STATUS MsgType = 94 // Message sent by datastore to client informing about status processing a request (in response to RESERVE, RELEASE_RESERVE, PUT, UPDATE and REMOVE requests).
+ MSG_DATASTORE_PUT MsgType = 95 // Message sent by datastore client to store data.
+ MSG_DATASTORE_GET MsgType = 97 // Message sent by datastore client to get data.
+ MSG_DATASTORE_GET_REPLICATION MsgType = 98 // Message sent by datastore client to get random data.
+ MSG_DATASTORE_GET_ZERO_ANONYMITY MsgType = 99 // Message sent by datastore client to get random data.
+ MSG_DATASTORE_DATA MsgType = 100 // Message sent by datastore to client providing requested data (in response to GET or GET_RANDOM request).
+ MSG_DATASTORE_DATA_END MsgType = 101 // Message sent by datastore to client signaling end of matching data. This message will also be sent for "GET_RANDOM", even though "GET_RANDOM" returns at most one data item.
+ MSG_DATASTORE_REMOVE MsgType = 102 // Message sent by datastore client to remove data.
+ MSG_DATASTORE_DROP MsgType = 103 // Message sent by datastore client to drop the database.
+ MSG_DATASTORE_GET_KEY MsgType = 104 // Message sent by datastore client to get data by key.
+
+ //------------------------------------------------------------------
+ // FS message types
+ //------------------------------------------------------------------
+
+ MSG_FS_REQUEST_LOC_SIGN MsgType = 126 // Message sent by fs client to request LOC signature.
+ MSG_FS_REQUEST_LOC_SIGNATURE MsgType = 127 // Reply sent by fs service with LOC signature.
+ MSG_FS_INDEX_START MsgType = 128 // Message sent by fs client to start indexing.
+ MSG_FS_INDEX_START_OK MsgType = 129 // Affirmative response to a request for start indexing.
+ MSG_FS_INDEX_START_FAILED MsgType = 130 // Response to a request for start indexing that refuses.
+ MSG_FS_INDEX_LIST_GET MsgType = 131 // Request from client for list of indexed files.
+ MSG_FS_INDEX_LIST_ENTRY MsgType = 132 // Reply to client with an indexed file name.
+ MSG_FS_INDEX_LIST_END MsgType = 133 // Reply to client indicating end of list.
+ MSG_FS_UNINDEX MsgType = 134 // Request from client to unindex a file.
+ MSG_FS_UNINDEX_OK MsgType = 135 // Reply to client indicating unindex receipt.
+ MSG_FS_START_SEARCH MsgType = 136 // Client asks FS service to start a (keyword) search.
+ MSG_FS_GET MsgType = 137 // P2P request for content (one FS to another).
+ MSG_FS_PUT MsgType = 138 // P2P response with content or active migration of content. Also used between the service and clients (in response to #FS_START_SEARCH).
+ MSG_FS_MIGRATION_STOP MsgType = 139 // Peer asks us to stop migrating content towards it for a while.
+ MSG_FS_CADET_QUERY MsgType = 140 // P2P request for content (one FS to another via a cadet).
+ MSG_FS_CADET_REPLY MsgType = 141 // P2P answer for content (one FS to another via a cadet).
+
+ //------------------------------------------------------------------
+ // DHT message types
+ //------------------------------------------------------------------
+
+ MSG_DHT_CLIENT_PUT MsgType = 142 // Client wants to store item in DHT.
+ MSG_DHT_CLIENT_GET MsgType = 143 // Client wants to lookup item in DHT.
+ MSG_DHT_CLIENT_GET_STOP MsgType = 144 // Client wants to stop search in DHT.
+ MSG_DHT_CLIENT_RESULT MsgType = 145 // Service returns result to client.
+ MSG_DHT_P2P_PUT MsgType = 146 // Peer is storing data in DHT.
+ MSG_DHT_P2P_GET MsgType = 147 // Peer tries to find data in DHT.
+ MSG_DHT_P2P_RESULT MsgType = 148 // Data is returned to peer from DHT.
+ MSG_DHT_MONITOR_GET MsgType = 149 // Receive information about transiting GETs
+ MSG_DHT_MONITOR_GET_RESP MsgType = 150 // Receive information about transiting GET responses
+ MSG_DHT_MONITOR_PUT MsgType = 151 // Receive information about transiting PUTs
+ MSG_DHT_MONITOR_PUT_RESP MsgType = 152 // Receive information about transiting PUT responses (TODO)
+ MSG_DHT_MONITOR_START MsgType = 153 // Request information about transiting messages
+ MSG_DHT_MONITOR_STOP MsgType = 154 // Stop information about transiting messages
+ MSG_DHT_CLIENT_GET_RESULTS_KNOWN MsgType = 156 // Certain results are already known to the client, filter those.
+ MSG_DHT_P2P_HELLO MsgType = 157 // HELLO advertising a neighbours addresses.
+ MSG_DHT_CORE MsgType = 158 // Encapsulation of DHT messages in CORE service.
+ MSG_DHT_CLIENT_HELLO_URL MsgType = 159 // HELLO URL send between client and service (in either direction).
+ MSG_DHT_CLIENT_HELLO_GET MsgType = 161 // Client requests DHT service's HELLO URL.
+
+ //------------------------------------------------------------------
+ // HOSTLIST message types
+ //------------------------------------------------------------------
+
+ MSG_HOSTLIST_ADVERTISEMENT MsgType = 160 // Hostlist advertisement message
+
+ //------------------------------------------------------------------
+ // STATISTICS message types
+ //------------------------------------------------------------------
+
+ MSG_STATISTICS_SET MsgType = 168 // Set a statistical value.
+ MSG_STATISTICS_GET MsgType = 169 // Get a statistical value(s).
+ MSG_STATISTICS_VALUE MsgType = 170 // Response to a STATISTICS_GET message (with value).
+ MSG_STATISTICS_END MsgType = 171 // Response to a STATISTICS_GET message (end of value stream).
+ MSG_STATISTICS_WATCH MsgType = 172 // Watch changes to a statistical value. Message format is the same as for GET, except that the subsystem and entry name must be given.
+ MSG_STATISTICS_WATCH_VALUE MsgType = 173 // Changes to a watched value.
+ MSG_STATISTICS_DISCONNECT MsgType = 174 // Client is done sending service requests and will now disconnect.
+ MSG_STATISTICS_DISCONNECT_CONFIRM MsgType = 175 // Service confirms disconnect and that it is done processing all requests from the client.
+
+ //------------------------------------------------------------------
+ // VPN message types
+ //------------------------------------------------------------------
+
+ MSG_VPN_HELPER MsgType = 185 // Type of messages between the gnunet-vpn-helper and the daemon
+ MSG_VPN_ICMP_TO_SERVICE MsgType = 190 // ICMP packet for a service.
+ MSG_VPN_ICMP_TO_INTERNET MsgType = 191 // ICMP packet for the Internet.
+ MSG_VPN_ICMP_TO_VPN MsgType = 192 // ICMP packet for the VPN
+ MSG_VPN_DNS_TO_INTERNET MsgType = 193 // DNS request for a DNS exit service.
+ MSG_VPN_DNS_FROM_INTERNET MsgType = 194 // DNS reply from a DNS exit service.
+ MSG_VPN_TCP_TO_SERVICE_START MsgType = 195 // TCP packet for a service.
+ MSG_VPN_TCP_TO_INTERNET_START MsgType = 196 // TCP packet for the Internet.
+ MSG_VPN_TCP_DATA_TO_EXIT MsgType = 197 // TCP packet of an established connection.
+ MSG_VPN_TCP_DATA_TO_VPN MsgType = 198 // TCP packet of an established connection.
+ MSG_VPN_UDP_TO_SERVICE MsgType = 199 // UDP packet for a service.
+ MSG_VPN_UDP_TO_INTERNET MsgType = 200 // UDP packet for the Internet.
+ MSG_VPN_UDP_REPLY MsgType = 201 // UDP packet from a remote host
+ MSG_VPN_CLIENT_REDIRECT_TO_IP MsgType = 202 // Client asks VPN service to setup an IP to redirect traffic via an exit node to some global IP address.
+ MSG_VPN_CLIENT_REDIRECT_TO_SERVICE MsgType = 203 // Client asks VPN service to setup an IP to redirect traffic to some peer offering a service.
+ MSG_VPN_CLIENT_USE_IP MsgType = 204 // VPN service responds to client with an IP to use for the requested redirection.
+
+ //------------------------------------------------------------------
+ // VPN-DNS message types
+ //------------------------------------------------------------------
+
+ MSG_DNS_CLIENT_INIT MsgType = 211 // Initial message from client to DNS service for registration.
+ MSG_DNS_CLIENT_REQUEST MsgType = 212 // Type of messages between the gnunet-helper-dns and the service
+ MSG_DNS_CLIENT_RESPONSE MsgType = 213 // Type of messages between the gnunet-helper-dns and the service
+ MSG_DNS_HELPER MsgType = 214 // Type of messages between the gnunet-helper-dns and the service
+
+ //------------------------------------------------------------------
+ // CHAT message types START
+ //------------------------------------------------------------------
+
+ MSG_CHAT_JOIN_REQUEST MsgType = 300 // Message sent from client to join a chat room.
+ MSG_CHAT_JOIN_NOTIFICATION MsgType = 301 // Message sent to client to indicate joining of another room member.
+ MSG_CHAT_LEAVE_NOTIFICATION MsgType = 302 // Message sent to client to indicate leaving of another room member.
+ MSG_CHAT_MESSAGE_NOTIFICATION MsgType = 303 // Notification sent by service to client indicating that we've received a chat message.
+ MSG_CHAT_TRANSMIT_REQUEST MsgType = 304 // Request sent by client to transmit a chat message to another room members.
+ MSG_CHAT_CONFIRMATION_RECEIPT MsgType = 305 // Receipt sent from a message receiver to the service to confirm delivery of a chat message.
+ MSG_CHAT_CONFIRMATION_NOTIFICATION MsgType = 306 // Notification sent from the service to the original sender to acknowledge delivery of a chat message.
+ MSG_CHAT_P2P_JOIN_NOTIFICATION MsgType = 307 // P2P message sent to indicate joining of another room member.
+ MSG_CHAT_P2P_LEAVE_NOTIFICATION MsgType = 308 // P2P message sent to indicate leaving of another room member.
+ MSG_CHAT_P2P_SYNC_REQUEST MsgType = 309 // P2P message sent to a newly connected peer to request its known clients in order to synchronize room members.
+ MSG_CHAT_P2P_MESSAGE_NOTIFICATION MsgType = 310 // Notification sent from one peer to another to indicate that we have received a chat message.
+ MSG_CHAT_P2P_CONFIRMATION_RECEIPT MsgType = 311 // P2P receipt confirming delivery of a chat message.
+
+ //------------------------------------------------------------------
+ // NSE (network size estimation) message types
+ //------------------------------------------------------------------
+
+ MSG_NSE_START MsgType = 321 // client->service message indicating start
+ MSG_NSE_P2P_FLOOD MsgType = 322 // P2P message sent from nearest peer
+ MSG_NSE_ESTIMATE MsgType = 323 // service->client message indicating
+
+ //------------------------------------------------------------------
+ // PEERINFO message types
+ //------------------------------------------------------------------
+
+ MSG_PEERINFO_GET MsgType = 330 // Request update and listing of a peer
+ MSG_PEERINFO_GET_ALL MsgType = 331 // Request update and listing of all peers
+ MSG_PEERINFO_INFO MsgType = 332 // Information about one of the peers
+ MSG_PEERINFO_INFO_END MsgType = 333 // End of information about other peers
+ MSG_PEERINFO_NOTIFY MsgType = 334 // Start notifying this client about changes
+
+ //------------------------------------------------------------------
+ // ATS message types
+ //------------------------------------------------------------------
+
+ MSG_ATS_START MsgType = 340 // Type of the 'struct ClientStartMessage' sent by clients to ATS to identify the type of the client.
+ MSG_ATS_REQUEST_ADDRESS MsgType = 341 // Type of the 'struct RequestAddressMessage' sent by clients to request an address to help connect.
+ MSG_ATS_REQUEST_ADDRESS_CANCEL MsgType = 342 // Type of the 'struct RequestAddressMessage' sent by clients to request an address to help connect.
+ MSG_ATS_ADDRESS_UPDATE MsgType = 343 // Type of the 'struct AddressUpdateMessage' sent by clients to ATS to inform ATS about performance changes.
+ MSG_ATS_ADDRESS_DESTROYED MsgType = 344 // Type of the 'struct AddressDestroyedMessage' sent by clients to ATS to inform ATS about an address being unavailable.
+ MSG_ATS_ADDRESS_SUGGESTION MsgType = 345 // Type of the 'struct AddressSuggestionMessage' sent by ATS to clients to suggest switching to a different address.
+ MSG_ATS_PEER_INFORMATION MsgType = 346 // Type of the 'struct PeerInformationMessage' sent by ATS to clients to inform about QoS for a particular connection.
+ MSG_ATS_RESERVATION_REQUEST MsgType = 347 // Type of the 'struct ReservationRequestMessage' sent by clients to ATS to ask for inbound bandwidth reservations.
+ MSG_ATS_RESERVATION_RESULT MsgType = 348 // Type of the 'struct ReservationResultMessage' sent by ATS to clients in response to a reservation request.
+ MSG_ATS_PREFERENCE_CHANGE MsgType = 349 // Type of the 'struct ChangePreferenceMessage' sent by clients to ATS to ask for allocation preference changes.
+ MSG_ATS_SESSION_RELEASE MsgType = 350 // Type of the 'struct SessionReleaseMessage' sent by ATS to client to confirm that a session ID was destroyed.
+ MSG_ATS_ADDRESS_ADD MsgType = 353 // Type of the 'struct AddressUpdateMessage' sent by client to ATS to add a new address
+ MSG_ATS_ADDRESSLIST_REQUEST MsgType = 354 // Type of the 'struct AddressListRequestMessage' sent by client to ATS to request information about addresses
+ MSG_ATS_ADDRESSLIST_RESPONSE MsgType = 355 // Type of the 'struct AddressListResponseMessage' sent by ATS to client with information about addresses
+ MSG_ATS_PREFERENCE_FEEDBACK MsgType = 356 // Type of the 'struct ChangePreferenceMessage' sent by clients to ATS to ask for allocation preference changes.
+
+ //------------------------------------------------------------------
+ // TRANSPORT message types
+ //------------------------------------------------------------------
+
+ MSG_TRANSPORT_START MsgType = 360 // Message from the core saying that the transport server should start giving it messages. This should automatically trigger the transmission of a HELLO message.
+ MSG_TRANSPORT_CONNECT MsgType = 361 // Message from TRANSPORT notifying about a client that connected to us.
+ MSG_TRANSPORT_DISCONNECT MsgType = 362 // Message from TRANSPORT notifying about a client that disconnected from us.
+ MSG_TRANSPORT_SEND MsgType = 363 // Request to TRANSPORT to transmit a message.
+ MSG_TRANSPORT_SEND_OK MsgType = 364 // Confirmation from TRANSPORT that message for transmission has been queued (and that the next message to this peer can now be passed to the service). Note that this confirmation does NOT imply that the message was fully transmitted.
+ MSG_TRANSPORT_RECV MsgType = 365 // Message from TRANSPORT notifying about a message that was received.
+ MSG_TRANSPORT_SET_QUOTA MsgType = 366 // Message telling transport to limit its receive rate.
+ MSG_TRANSPORT_ADDRESS_TO_STRING MsgType = 367 // Request to look addresses of peers in server.
+ MSG_TRANSPORT_ADDRESS_TO_STRING_REPLY MsgType = 368 // Response to the address lookup request.
+ MSG_TRANSPORT_BLACKLIST_INIT MsgType = 369 // Register a client that wants to do blacklisting.
+ MSG_TRANSPORT_BLACKLIST_QUERY MsgType = 370 // Query to a blacklisting client (is this peer blacklisted)?
+ MSG_TRANSPORT_BLACKLIST_REPLY MsgType = 371 // Reply from blacklisting client (answer to blacklist query).
+ MSG_TRANSPORT_PING MsgType = 372 // Transport PING message
+ MSG_TRANSPORT_PONG MsgType = 373 // Transport PONG message
+ MSG_TRANSPORT_SESSION_SYN MsgType = 375 // Transport SYN message exchanged between transport services to indicate that a session should be marked as 'connected'.
+ MSG_TRANSPORT_SESSION_SYN_ACK MsgType = 376 // Transport SYN_ACK message exchanged between transport services to indicate that a SYN message was accepted
+ MSG_TRANSPORT_SESSION_ACK MsgType = 377 // Transport ACK message exchanged between transport services to indicate that a SYN_ACK message was accepted
+ MSG_TRANSPORT_SESSION_DISCONNECT MsgType = 378 // Transport DISCONNECT message exchanged between transport services to indicate that a connection should be dropped.
+ MSG_TRANSPORT_SESSION_QUOTA MsgType = 379 // Message exchanged between transport services to indicate that the sender should limit its transmission rate to the indicated quota.
+ MSG_TRANSPORT_MONITOR_PEER_REQUEST MsgType = 380 // Request to monitor addresses used by a peer or all peers.
+ MSG_TRANSPORT_SESSION_KEEPALIVE MsgType = 381 // Message send by a peer to notify the other to keep the session alive and measure latency in a regular interval
+ MSG_TRANSPORT_SESSION_KEEPALIVE_RESPONSE MsgType = 382 // Response to a #TRANSPORT_SESSION_KEEPALIVE message to measure latency in a regular interval
+ MSG_TRANSPORT_MONITOR_PEER_RESPONSE MsgType = 383 // Response to #TRANSPORT_MONITOR_PEER_REQUEST request to iterate over all known addresses.
+ MSG_TRANSPORT_BROADCAST_BEACON MsgType = 384 // Message send by a peer to notify the other to keep the session alive.
+ MSG_TRANSPORT_TRAFFIC_METRIC MsgType = 385 // Message containing traffic metrics for transport service
+ MSG_TRANSPORT_MONITOR_PLUGIN_START MsgType = 388 // Request to start monitoring the connection state of plugins.
+ MSG_TRANSPORT_MONITOR_PLUGIN_EVENT MsgType = 389 // Monitoring event about the connection state of plugins, generated in response to a subscription initiated via #TRANSPORT_MONITOR_PLUGIN_START
+ MSG_TRANSPORT_MONITOR_PLUGIN_SYNC MsgType = 390 // Monitoring event notifying client that the initial iteration is now completed and we are in sync with the state of the subsystem.
+ MSG_TRANSPORT_MONITOR_PEER_RESPONSE_END MsgType = 391 // terminating list of replies.
+
+ //------------------------------------------------------------------
+ // FS-PUBLISH-HELPER IPC Messages
+ //------------------------------------------------------------------
+
+ MSG_FS_PUBLISH_HELPER_PROGRESS_FILE MsgType = 420 // Progress information from the helper: found a file
+ MSG_FS_PUBLISH_HELPER_PROGRESS_DIRECTORY MsgType = 421 // Progress information from the helper: found a directory
+ MSG_FS_PUBLISH_HELPER_ERROR MsgType = 422 // Error signal from the helper.
+ MSG_FS_PUBLISH_HELPER_SKIP_FILE MsgType = 423 // Signal that helper skipped a file.
+ MSG_FS_PUBLISH_HELPER_COUNTING_DONE MsgType = 424 // Signal that helper is done scanning the directory tree.
+ MSG_FS_PUBLISH_HELPER_META_DATA MsgType = 425 // Extracted meta data from the helper.
+ MSG_FS_PUBLISH_HELPER_FINISHED MsgType = 426 // Signal that helper is done.
+
+ //------------------------------------------------------------------
+ // NAMECACHE message types
+ //------------------------------------------------------------------
+
+ MSG_NAMECACHE_LOOKUP_BLOCK MsgType = 431 // Client to service: lookup block
+ MSG_NAMECACHE_LOOKUP_BLOCK_RESPONSE MsgType = 432 // Service to client: result of block lookup
+ MSG_NAMECACHE_BLOCK_CACHE MsgType = 433 // Client to service: cache a block
+ MSG_NAMECACHE_BLOCK_CACHE_RESPONSE MsgType = 434 // Service to client: result of block cache request
+
+ //------------------------------------------------------------------
+ // NAMESTORE message types
+ //------------------------------------------------------------------
+
+ MSG_NAMESTORE_RECORD_STORE MsgType = 435 // Client to service: store records (as authority)
+ MSG_NAMESTORE_RECORD_STORE_RESPONSE MsgType = 436 // Service to client: result of store operation.
+ MSG_NAMESTORE_RECORD_LOOKUP MsgType = 437 // Client to service: lookup label
+ MSG_NAMESTORE_RECORD_LOOKUP_RESPONSE MsgType = 438 // Service to client: lookup label
+ MSG_NAMESTORE_ZONE_TO_NAME MsgType = 439 // Client to service: "reverse" lookup for zone name based on zone key
+ MSG_NAMESTORE_ZONE_TO_NAME_RESPONSE MsgType = 440 // Service to client: result of zone-to-name lookup.
+ MSG_NAMESTORE_MONITOR_START MsgType = 441 // Client to service: start monitoring (yields sequence of "ZONE_ITERATION_RESPONSES" --- forever).
+ MSG_NAMESTORE_MONITOR_SYNC MsgType = 442 // Service to client: you're now in sync.
+ MSG_NAMESTORE_RECORD_RESULT MsgType = 443 // Service to client: here is a (plaintext) record you requested.
+ MSG_NAMESTORE_MONITOR_NEXT MsgType = 444 // Client to service: I am now ready for the next (set of) monitor events. Monitoring equivalent of #NAMESTORE_ZONE_ITERATION_NEXT.
+ MSG_NAMESTORE_ZONE_ITERATION_START MsgType = 445 // Client to service: please start iteration; receives "NAMESTORE_LOOKUP_NAME_RESPONSE" messages in return.
+ MSG_NAMESTORE_ZONE_ITERATION_NEXT MsgType = 447 // Client to service: next record(s) in iteration please.
+ MSG_NAMESTORE_ZONE_ITERATION_STOP MsgType = 448 // Client to service: stop iterating.
+
+ //------------------------------------------------------------------
+ // LOCKMANAGER message types
+ //------------------------------------------------------------------
+
+ MSG_LOCKMANAGER_ACQUIREMsgType = 450 // Message to acquire Lock
+ MSG_LOCKMANAGER_RELEASEMsgType = 451 // Message to release lock
+ MSG_LOCKMANAGER_SUCCESSMsgType = 452 // SUCCESS reply from lockmanager
+
+ //------------------------------------------------------------------
+ // TESTBED message types
+ //------------------------------------------------------------------
+
+ MSG_TESTBED_INIT MsgType = 460 // Initial message from a client to a testing control service
+ MSG_TESTBED_ADD_HOST MsgType = 461 // Message to add host
+ MSG_TESTBED_ADD_HOST_SUCCESS MsgType = 462 // Message to signal that a add host succeeded
+ MSG_TESTBED_LINK_CONTROLLERS MsgType = 463 // Message to link delegated controller to slave controller
+ MSG_TESTBED_CREATE_PEER MsgType = 464 // Message to create a peer at a host
+ MSG_TESTBED_RECONFIGURE_PEER MsgType = 465 // Message to reconfigure a peer
+ MSG_TESTBED_START_PEER MsgType = 466 // Message to start a peer at a host
+ MSG_TESTBED_STOP_PEER MsgType = 467 // Message to stop a peer at a host
+ MSG_TESTBED_DESTROY_PEER MsgType = 468 // Message to destroy a peer
+ MSG_TESTBED_CONFIGURE_UNDERLAY_LINK MsgType = 469 // Configure underlay link message
+ MSG_TESTBED_OVERLAY_CONNECT MsgType = 470 // Message to connect peers in a overlay
+ MSG_TESTBED_PEER_EVENT MsgType = 471 // Message for peer events
+ MSG_TESTBED_PEER_CONNECT_EVENT MsgType = 472 // Message for peer connect events
+ MSG_TESTBED_OPERATION_FAIL_EVENT MsgType = 473 // Message for operation events
+ MSG_TESTBED_CREATE_PEER_SUCCESS MsgType = 474 // Message to signal successful peer creation
+ MSG_TESTBED_GENERIC_OPERATION_SUCCESS MsgType = 475 // Message to signal a generic operation has been successful
+ MSG_TESTBED_GET_PEER_INFORMATION MsgType = 476 // Message to get a peer's information
+ MSG_TESTBED_PEER_INFORMATION MsgType = 477 // Message containing the peer's information
+ MSG_TESTBED_REMOTE_OVERLAY_CONNECT MsgType = 478 // Message to request a controller to make one of its peer to connect to another peer using the contained HELLO
+ MSG_TESTBED_GET_SLAVE_CONFIGURATION MsgType = 479 // Message to request configuration of a slave controller
+ MSG_TESTBED_SLAVE_CONFIGURATION MsgType = 480 // Message which contains the configuration of slave controller
+ MSG_TESTBED_LINK_CONTROLLERS_RESULT MsgType = 481 // Message to signal the result of #TESTBED_LINK_CONTROLLERS request
+ MSG_TESTBED_SHUTDOWN_PEERS MsgType = 482 // A controller receiving this message floods it to its directly-connected sub-controllers and then stops and destroys all peers
+ MSG_TESTBED_MANAGE_PEER_SERVICE MsgType = 483 // Message to start/stop a service of a peer
+ MSG_TESTBED_BARRIER_INIT MsgType = 484 // Message to initialise a barrier. Messages of these type are flooded to all sub-controllers
+ MSG_TESTBED_BARRIER_CANCEL MsgType = 485 // Message to cancel a barrier. This message is flooded to all sub-controllers
+ MSG_TESTBED_BARRIER_STATUS MsgType = 486 // Message for signalling status of a barrier
+ MSG_TESTBED_BARRIER_WAIT MsgType = 487 // Message sent by a peer when it has reached a barrier and is waiting for it to be crossed
+ MSG_TESTBED_MAX MsgType = 488 // Not really a message, but for careful checks on the testbed messages; Should always be the maximum and never be used to send messages with this type
+ MSG_TESTBED_HELPER_INIT MsgType = 495 // The initialization message towards gnunet-testbed-helper
+ MSG_TESTBED_HELPER_REPLY MsgType = 496 // The reply message from gnunet-testbed-helper
+
+ //------------------------------------------------------------------
+ // GNS.
+ //------------------------------------------------------------------
+
+ MSG_GNS_LOOKUP MsgType = 500 // Client would like to resolve a name.
+ MSG_GNS_LOOKUP_RESULT MsgType = 501 // Service response to name resolution request from client.
+ MSG_GNS_REVERSE_LOOKUP MsgType = 502 // Reverse lookup
+ MSG_GNS_REVERSE_LOOKUP_RESULT MsgType = 503 // Response to reverse lookup
+
+ //------------------------------------------------------------------
+ // CONSENSUS message types
+ //------------------------------------------------------------------
+
+ MSG_CONSENSUS_CLIENT_JOIN MsgType = 520 // Join a consensus session. Sent by client to service as first message.
+ MSG_CONSENSUS_CLIENT_INSERT MsgType = 521 // Insert an element. Sent by client to service.
+ MSG_CONSENSUS_CLIENT_BEGIN MsgType = 522 // Begin accepting new elements from other participants. Sent by client to service.
+ MSG_CONSENSUS_CLIENT_RECEIVED_ELEMENT MsgType = 523 // Sent by service when a new element is added.
+ MSG_CONSENSUS_CLIENT_CONCLUDE MsgType = 524 // Sent by client to service in order to start the consensus conclusion.
+ MSG_CONSENSUS_CLIENT_CONCLUDE_DONE MsgType = 525 // Sent by service to client in order to signal a completed consensus conclusion. Last message sent in a consensus session.
+ MSG_CONSENSUS_CLIENT_ACK MsgType = 540 // Sent by client to service, telling whether a received element should be accepted and propagated further or not.
+ MSG_CONSENSUS_P2P_DELTA_ESTIMATE MsgType = 541 // Strata estimator.
+ MSG_CONSENSUS_P2P_DIFFERENCE_DIGEST MsgType = 542 // IBF containing all elements of a peer.
+ MSG_CONSENSUS_P2P_ELEMENTS MsgType = 543 // One or more elements that are sent from peer to peer.
+ MSG_CONSENSUS_P2P_ELEMENTS_REQUEST MsgType = 544 // Elements, and requests for further elements
+ MSG_CONSENSUS_P2P_ELEMENTS_REPORT MsgType = 545 // Elements that a peer reports to be missing at the remote peer.
+ MSG_CONSENSUS_P2P_HELLO MsgType = 546 // Initialization message for consensus p2p communication.
+ MSG_CONSENSUS_P2P_SYNCED MsgType = 547 // Report that the peer is synced with the partner after successfully decoding the invertible bloom filter.
+ MSG_CONSENSUS_P2P_FIN MsgType = 548 // Interaction os over, got synched and reported all elements
+ MSG_CONSENSUS_P2P_ABORT MsgType = 548 // Abort a round, don't send requested elements anymore
+ MSG_CONSENSUS_P2P_ROUND_CONTEXT MsgType = 547 // Abort a round, don't send requested elements anymore
+
+ //------------------------------------------------------------------
+ // SET message types
+ //------------------------------------------------------------------
+
+ MSG_SET_UNION_P2P_REQUEST_FULL MsgType = 565 // Demand the whole element from the other peer, given only the hash code.
+ MSG_SET_UNION_P2P_DEMAND MsgType = 566 // Demand the whole element from the other peer, given only the hash code.
+ MSG_SET_UNION_P2P_INQUIRY MsgType = 567 // Tell the other peer to send us a list of hashes that match an IBF key.
+ MSG_SET_UNION_P2P_OFFER MsgType = 568 // Tell the other peer which hashes match a given IBF key.
+ MSG_SET_REJECT MsgType = 569 // Reject a set request.
+ MSG_SET_CANCEL MsgType = 570 // Cancel a set operation
+ MSG_SET_ITER_ACK MsgType = 571 // Acknowledge result from iteration
+ MSG_SET_RESULT MsgType = 572 // Create an empty set
+ MSG_SET_ADD MsgType = 573 // Add element to set
+ MSG_SET_REMOVE MsgType = 574 // Remove element from set
+ MSG_SET_LISTEN MsgType = 575 // Listen for operation requests
+ MSG_SET_ACCEPT MsgType = 576 // Accept a set request
+ MSG_SET_EVALUATE MsgType = 577 // Evaluate a set operation
+ MSG_SET_CONCLUDE MsgType = 578 // Start a set operation with the given set
+ MSG_SET_REQUEST MsgType = 579 // Notify the client of a request from a remote peer
+ MSG_SET_CREATE MsgType = 580 // Create a new local set
+ MSG_SET_P2P_OPERATION_REQUEST MsgType = 581 // Request a set operation from a remote peer.
+ MSG_SET_UNION_P2P_SE MsgType = 582 // Strata estimator.
+ MSG_SET_UNION_P2P_IBF MsgType = 583 // Invertible bloom filter.
+ MSG_SET_P2P_ELEMENTS MsgType = 584 // Actual set elements.
+ MSG_SET_P2P_ELEMENT_REQUESTS MsgType = 585 // Requests for the elements with the given hashes.
+ MSG_SET_UNION_P2P_DONE MsgType = 586 // Set operation is done.
+ MSG_SET_ITER_REQUEST MsgType = 587 // Start iteration over set elements.
+ MSG_SET_ITER_ELEMENT MsgType = 588 // Element result for the iterating client.
+ MSG_SET_ITER_DONE MsgType = 589 // Iteration end marker for the client.
+ MSG_SET_UNION_P2P_SEC MsgType = 590 // Compressed strata estimator.
+ MSG_SET_INTERSECTION_P2P_ELEMENT_INFO MsgType = 591 // Information about the element count for intersection
+ MSG_SET_INTERSECTION_P2P_BF MsgType = 592 // Bloom filter message for intersection exchange started by Bob.
+ MSG_SET_INTERSECTION_P2P_DONE MsgType = 593 // Intersection operation is done.
+ MSG_SET_COPY_LAZY_PREPARE MsgType = 594 // Ask the set service to prepare a copy of a set.
+ MSG_SET_COPY_LAZY_RESPONSE MsgType = 595 // Give the client an ID for connecting to the set's copy.
+ MSG_SET_COPY_LAZY_CONNECT MsgType = 596 // Sent by the client to the server to connect to an existing, lazily copied set.
+ MSG_SET_UNION_P2P_FULL_DONE MsgType = 597 // Request all missing elements from the other peer, based on their sets and the elements we previously sent with #SET_P2P_ELEMENTS.
+ MSG_SET_UNION_P2P_FULL_ELEMENT MsgType = 598 // Send a set element, not as response to a demand but because we're sending the full set.
+ MSG_SET_UNION_P2P_OVER MsgType = 599 // Request all missing elements from the other peer, based on their sets and the elements we previously sent with #SET_P2P_ELEMENTS.
+
+ //------------------------------------------------------------------
+ // TESTBED LOGGER message types
+ //------------------------------------------------------------------
+
+ MSG_TESTBED_LOGGER_MSG MsgType = 600 // Message for TESTBED LOGGER
+ MSG_TESTBED_LOGGER_ACK MsgType = 601 // Message for TESTBED LOGGER acknowledgement
+
+ MSG_REGEX_ANNOUNCE MsgType = 620 // Advertise regex capability.
+ MSG_REGEX_SEARCH MsgType = 621 // Search for peer with matching capability.
+ MSG_REGEX_RESULT MsgType = 622 // Result in response to regex search.
+
+ //------------------------------------------------------------------
+ // IDENTITY message types
+ //------------------------------------------------------------------
+
+ MSG_IDENTITY_START MsgType = 624 // First message send from identity client to service (to subscribe to updates).
+ MSG_IDENTITY_RESULT_CODE MsgType = 625 // Generic response from identity service with success and/or error message.
+ MSG_IDENTITY_UPDATE MsgType = 626 // Update about identity status from service to clients.
+ MSG_IDENTITY_GET_DEFAULT MsgType = 627 // Client requests to know default identity for a subsystem.
+ MSG_IDENTITY_SET_DEFAULT MsgType = 628 // Client sets default identity; or service informs about default identity.
+ MSG_IDENTITY_CREATE MsgType = 629 // Create new identity (client->service).
+ MSG_IDENTITY_RENAME MsgType = 630 // Rename existing identity (client->service).
+ MSG_IDENTITY_DELETE MsgType = 631 // Delete identity (client->service).
+ MSG_IDENTITY_LOOKUP MsgType = 632
+ MSG_IDENTITY_LOOKUP_BY_NAME MsgType = 633
+
+ //------------------------------------------------------------------
+ // REVOCATION message types
+ //------------------------------------------------------------------
+
+ MSG_REVOCATION_QUERY MsgType = 636 // Client to service: was this key revoked?
+ MSG_REVOCATION_QUERY_RESPONSE MsgType = 637 // Service to client: answer if key was revoked!
+ MSG_REVOCATION_REVOKE MsgType = 638 // Client to service OR peer-to-peer: revoke this key!
+ MSG_REVOCATION_REVOKE_RESPONSE MsgType = 639 // Service to client: revocation confirmed
+
+ //------------------------------------------------------------------
+ // SCALARPRODUCT message types
+ //------------------------------------------------------------------
+
+ MSG_SCALARPRODUCT_CLIENT_TO_ALICE MsgType = 640 // Client -> Alice
+ MSG_SCALARPRODUCT_CLIENT_TO_BOB MsgType = 641 // Client -> Bob
+ MSG_SCALARPRODUCT_CLIENT_MULTIPART_ALICE MsgType = 642 // Client -> Alice multipart
+ MSG_SCALARPRODUCT_CLIENT_MULTIPART_BOB MsgType = 643 // Client -> Bob multipart
+ MSG_SCALARPRODUCT_SESSION_INITIALIZATION MsgType = 644 // Alice -> Bob session initialization
+ MSG_SCALARPRODUCT_ALICE_CRYPTODATA MsgType = 645 // Alice -> Bob SP crypto-data (after intersection)
+ MSG_SCALARPRODUCT_BOB_CRYPTODATA MsgType = 647 // Bob -> Alice SP crypto-data
+ MSG_SCALARPRODUCT_BOB_CRYPTODATA_MULTIPART MsgType = 648 // Bob -> Alice SP crypto-data multipart
+ MSG_SCALARPRODUCT_RESULT MsgType = 649 // Alice/Bob -> Client Result
+ MSG_SCALARPRODUCT_ECC_SESSION_INITIALIZATION MsgType = 650 // Alice -> Bob ECC session initialization
+ MSG_SCALARPRODUCT_ECC_ALICE_CRYPTODATA MsgType = 651 // Alice -> Bob ECC crypto data
+ MSG_SCALARPRODUCT_ECC_BOB_CRYPTODATA MsgType = 652 // Bob -> Alice ECC crypto data
+
+ //------------------------------------------------------------------
+ // PSYCSTORE message types
+ //------------------------------------------------------------------
+
+ MSG_PSYCSTORE_MEMBERSHIP_STORE MsgType = 660 // Store a membership event.
+ MSG_PSYCSTORE_MEMBERSHIP_TEST MsgType = 661 // Test for membership of a member at a particular point in time.
+ MSG_PSYCSTORE_FRAGMENT_STORE MsgType = 662 //
+ MSG_PSYCSTORE_FRAGMENT_GET MsgType = 663 //
+ MSG_PSYCSTORE_MESSAGE_GET MsgType = 664 //
+ MSG_PSYCSTORE_MESSAGE_GET_FRAGMENT MsgType = 665 //
+ MSG_PSYCSTORE_COUNTERS_GET MsgType = 666 //
+ MSG_PSYCSTORE_STATE_MODIFY MsgType = 668 //
+ MSG_PSYCSTORE_STATE_SYNC MsgType = 669 //
+ MSG_PSYCSTORE_STATE_RESET MsgType = 670 //
+ MSG_PSYCSTORE_STATE_HASH_UPDATE MsgType = 671 //
+ MSG_PSYCSTORE_STATE_GET MsgType = 672 //
+ MSG_PSYCSTORE_STATE_GET_PREFIX MsgType = 673 //
+ MSG_PSYCSTORE_RESULT_CODE MsgType = 674 // Generic response from PSYCstore service with success and/or error message.
+ MSG_PSYCSTORE_RESULT_FRAGMENT MsgType = 675 //
+ MSG_PSYCSTORE_RESULT_COUNTERS MsgType = 676 //
+ MSG_PSYCSTORE_RESULT_STATE MsgType = 677 //
+
+ //------------------------------------------------------------------
+ // PSYC message types
+ //------------------------------------------------------------------
+
+ MSG_PSYC_RESULT_CODE MsgType = 680 // S->C: result of an operation
+ MSG_PSYC_MASTER_START MsgType = 681 // C->S: request to start a channel as a master
+ MSG_PSYC_MASTER_START_ACK MsgType = 682 // S->C: master start acknowledgement
+ MSG_PSYC_SLAVE_JOIN MsgType = 683 // C->S: request to join a channel as a slave
+ MSG_PSYC_SLAVE_JOIN_ACK MsgType = 684 // S->C: slave join acknowledgement
+ MSG_PSYC_PART_REQUEST MsgType = 685 // C->S: request to part from a channel
+ MSG_PSYC_PART_ACK MsgType = 686 // S->C: acknowledgement that a slave of master parted from a channel
+ MSG_PSYC_JOIN_REQUEST MsgType = 687 // M->S->C: incoming join request from multicast
+ MSG_PSYC_JOIN_DECISION MsgType = 688 // C->S->M: decision about a join request
+ MSG_PSYC_CHANNEL_MEMBERSHIP_STORE MsgType = 689 // C->S: request to add/remove channel slave in the membership database.
+ MSG_PSYC_MESSAGE MsgType = 691 // S<--C: PSYC message which contains one or more message parts.
+ MSG_PSYC_MESSAGE_HEADER MsgType = 692 // M<->S<->C: PSYC message which contains a header and one or more message parts.
+ MSG_PSYC_MESSAGE_METHOD MsgType = 693 // Message part: method
+ MSG_PSYC_MESSAGE_MODIFIER MsgType = 694 // Message part: modifier
+ MSG_PSYC_MESSAGE_MOD_CONT MsgType = 695 // Message part: modifier continuation
+ MSG_PSYC_MESSAGE_DATA MsgType = 696 // Message part: data
+ MSG_PSYC_MESSAGE_END MsgType = 697 // Message part: end of message
+ MSG_PSYC_MESSAGE_CANCEL MsgType = 698 // Message part: message cancelled
+ MSG_PSYC_MESSAGE_ACK MsgType = 699 // S->C: message acknowledgement
+ MSG_PSYC_HISTORY_REPLAY MsgType = 701 // C->S: request channel history replay from PSYCstore.
+ MSG_PSYC_HISTORY_RESULT MsgType = 702 // S->C: result for a channel history request
+ MSG_PSYC_STATE_GET MsgType = 703 // C->S: request best matching state variable from PSYCstore.
+ MSG_PSYC_STATE_GET_PREFIX MsgType = 704 // C->S: request state variables with a given prefix from PSYCstore.
+ MSG_PSYC_STATE_RESULT MsgType = 705 // S->C: result for a state request.
+
+ //------------------------------------------------------------------
+ // CONVERSATION message types
+ //------------------------------------------------------------------
+
+ MSG_CONVERSATION_AUDIO MsgType = 730 // Message to transmit the audio between helper and speaker/microphone library.
+ MSG_CONVERSATION_CS_PHONE_REGISTER MsgType = 731 // Client -> Server message to register a phone.
+ MSG_CONVERSATION_CS_PHONE_PICK_UP MsgType = 732 // Client -> Server message to reject/hangup a call
+ MSG_CONVERSATION_CS_PHONE_HANG_UP MsgType = 733 // Client -> Server message to reject/hangup a call
+ MSG_CONVERSATION_CS_PHONE_CALL MsgType = 734 // Client <- Server message to indicate a ringing phone
+ MSG_CONVERSATION_CS_PHONE_RING MsgType = 735 // Client <- Server message to indicate a ringing phone
+ MSG_CONVERSATION_CS_PHONE_SUSPEND MsgType = 736 // Client <-> Server message to suspend connection.
+ MSG_CONVERSATION_CS_PHONE_RESUME MsgType = 737 // Client <-> Server message to resume connection.
+ MSG_CONVERSATION_CS_PHONE_PICKED_UP MsgType = 738 // Service -> Client message to notify that phone was picked up.
+ MSG_CONVERSATION_CS_AUDIO MsgType = 739 // Client <-> Server message to send audio data.
+ MSG_CONVERSATION_CADET_PHONE_RING MsgType = 740 // Cadet: call initiation
+ MSG_CONVERSATION_CADET_PHONE_HANG_UP MsgType = 741 // Cadet: hang up / refuse call
+ MSG_CONVERSATION_CADET_PHONE_PICK_UP MsgType = 742 // Cadet: pick up phone (establish audio channel)
+ MSG_CONVERSATION_CADET_PHONE_SUSPEND MsgType = 743 // Cadet: phone suspended.
+ MSG_CONVERSATION_CADET_PHONE_RESUME MsgType = 744 // Cadet: phone resumed.
+ MSG_CONVERSATION_CADET_AUDIO MsgType = 745 // Cadet: audio data
+
+ //------------------------------------------------------------------
+ // MULTICAST message types
+ //------------------------------------------------------------------
+
+ MSG_MULTICAST_ORIGIN_START MsgType = 750 // C->S: Start the origin.
+ MSG_MULTICAST_MEMBER_JOIN MsgType = 751 // C->S: Join group as a member.
+ MSG_MULTICAST_JOIN_REQUEST MsgType = 752 // C<--S<->T: A peer wants to join the group. Unicast message to the origin or another group member.
+ MSG_MULTICAST_JOIN_DECISION MsgType = 753 // C<->S<->T: Response to a join request. Unicast message from a group member to the peer wanting to join.
+ MSG_MULTICAST_PART_REQUEST MsgType = 754 // A peer wants to part the group.
+ MSG_MULTICAST_PART_ACK MsgType = 755 // Acknowledgement sent in response to a part request. Unicast message from a group member to the peer wanting to part.
+ MSG_MULTICAST_GROUP_END MsgType = 756 // Group terminated.
+ MSG_MULTICAST_MESSAGE MsgType = 757 // C<->S<->T: Multicast message from the origin to all members.
+ MSG_MULTICAST_REQUEST MsgType = 758 // C<->S<->T: Unicast request from a group member to the origin.
+ MSG_MULTICAST_FRAGMENT_ACK MsgType = 759 // C->S: Acknowledgement of a message or request fragment for the client.
+ MSG_MULTICAST_REPLAY_REQUEST MsgType = 760 // C<->S<->T: Replay request from a group member to another member.
+ MSG_MULTICAST_REPLAY_RESPONSE MsgType = 761 // C<->S<->T: Replay response from a group member to another member.
+ MSG_MULTICAST_REPLAY_RESPONSE_END MsgType = 762 // C<->S: End of replay response.
+
+ //------------------------------------------------------------------
+ // SECRETSHARING message types
+ //------------------------------------------------------------------
+
+ MSG_SECRETSHARING_CLIENT_GENERATE MsgType = 780 // Establish a new session.
+ MSG_SECRETSHARING_CLIENT_DECRYPT MsgType = 781 // Request the decryption of a ciphertext.
+ MSG_SECRETSHARING_CLIENT_DECRYPT_DONE MsgType = 782 // The service succeeded in decrypting a ciphertext.
+ MSG_SECRETSHARING_CLIENT_SECRET_READY MsgType = 783 // Contains the peer's share.
+
+ //------------------------------------------------------------------
+ // PEERSTORE message types
+ //------------------------------------------------------------------
+
+ MSG_PEERSTORE_STORE MsgType = 820 // Store request message
+ MSG_PEERSTORE_ITERATE MsgType = 821 // Iteration request
+ MSG_PEERSTORE_ITERATE_RECORD MsgType = 822 // Iteration record message
+ MSG_PEERSTORE_ITERATE_END MsgType = 823 // Iteration end message
+ MSG_PEERSTORE_WATCH MsgType = 824 // Watch request
+ MSG_PEERSTORE_WATCH_RECORD MsgType = 825 // Watch response
+ MSG_PEERSTORE_WATCH_CANCEL MsgType = 826 // Watch cancel request
+
+ //------------------------------------------------------------------
+ // SOCIAL message types
+ //------------------------------------------------------------------
+
+ MSG_SOCIAL_RESULT_CODE MsgType = 840 // S->C: result of an operation
+ MSG_SOCIAL_HOST_ENTER MsgType = 841 // C->S: request to enter a place as the host
+ MSG_SOCIAL_HOST_ENTER_ACK MsgType = 842 // S->C: host enter acknowledgement
+ MSG_SOCIAL_GUEST_ENTER MsgType = 843 // C->S: request to enter a place as a guest
+ MSG_SOCIAL_GUEST_ENTER_BY_NAME MsgType = 844 // C->S: request to enter a place as a guest, using a GNS address
+ MSG_SOCIAL_GUEST_ENTER_ACK MsgType = 845 // S->C: guest enter acknowledgement
+ MSG_SOCIAL_ENTRY_REQUEST MsgType = 846 // P->S->C: incoming entry request from PSYC
+ MSG_SOCIAL_ENTRY_DECISION MsgType = 847 // C->S->P: decision about an entry request
+ MSG_SOCIAL_PLACE_LEAVE MsgType = 848 // C->S: request to leave a place
+ MSG_SOCIAL_PLACE_LEAVE_ACK MsgType = 849 // S->C: place leave acknowledgement
+ MSG_SOCIAL_ZONE_ADD_PLACE MsgType = 850 // C->S: add place to GNS zone
+ MSG_SOCIAL_ZONE_ADD_NYM MsgType = 851 // C->S: add nym to GNS zone
+ MSG_SOCIAL_APP_CONNECT MsgType = 852 // C->S: connect application
+ MSG_SOCIAL_APP_DETACH MsgType = 853 // C->S: detach a place from application
+ MSG_SOCIAL_APP_EGO MsgType = 854 // S->C: notify about an existing ego
+ MSG_SOCIAL_APP_EGO_END MsgType = 855 // S->C: end of ego list
+ MSG_SOCIAL_APP_PLACE MsgType = 856 // S->C: notify about an existing place
+ MSG_SOCIAL_APP_PLACE_END MsgType = 857 // S->C: end of place list
+ MSG_SOCIAL_MSG_PROC_SET MsgType = 858 // C->S: set message processing flags
+ MSG_SOCIAL_MSG_PROC_CLEAR MsgType = 859 // C->S: clear message processing flags
+
+ //------------------------------------------------------------------
+ // X-VINE DHT messages
+ //------------------------------------------------------------------
+
+ MSG_XDHT_P2P_TRAIL_SETUP MsgType = 880 // Trail setup request is received by a peer.
+ MSG_XDHT_P2P_TRAIL_SETUP_RESULT MsgType = 881 // Trail to a particular peer is returned to this peer.
+ MSG_XDHT_P2P_VERIFY_SUCCESSOR MsgType = 882 // Verify if your immediate successor is still your immediate successor.
+ MSG_XDHT_P2P_NOTIFY_NEW_SUCCESSOR MsgType = 883 // Notify your new immediate successor that you are its new predecessor.
+ MSG_XDHT_P2P_VERIFY_SUCCESSOR_RESULT MsgType = 884 // Message which contains the immediate predecessor of requested successor
+ MSG_XDHT_P2P_GET_RESULT MsgType = 885 // Message which contains the get result.
+ MSG_XDHT_P2P_TRAIL_SETUP_REJECTION MsgType = 886 // Trail Rejection Message.
+ MSG_XDHT_P2P_TRAIL_TEARDOWN MsgType = 887 // Trail Tear down Message.
+ MSG_XDHT_P2P_ADD_TRAIL MsgType = 888 // Routing table add message.
+ MSG_XDHT_P2P_PUT MsgType = 890 // Peer is storing the data in DHT.
+ MSG_XDHT_P2P_GET MsgType = 891 // Peer tries to find data in DHT.
+ MSG_XDHT_P2P_NOTIFY_SUCCESSOR_CONFIRMATION MsgType = 892 // Send back peer that considers you are its successor.
+
+ MSG_DHT_ACT_MALICIOUS MsgType = 893 // Turn X-VINE DHT service malicious
+ MSG_DHT_CLIENT_ACT_MALICIOUS_OK MsgType = 894 // Acknowledge receiving ACT MALICIOUS request
+
+ //------------------------------------------------------------------
+ // Whanau DHT messages
+ //------------------------------------------------------------------
+
+ MSG_WDHT_RANDOM_WALK MsgType = 910 // This message contains the query for performing a random walk
+ MSG_WDHT_RANDOM_WALK_RESPONSE MsgType = 911 // This message contains the result of a random walk
+ MSG_WDHT_TRAIL_DESTROY MsgType = 912 // This message contains a notification for the death of a trail
+ MSG_WDHT_TRAIL_ROUTE MsgType = 913 // This message are used to route a query to a peer
+ MSG_WDHT_SUCCESSOR_FIND MsgType = 914 // This message contains the query to transfer successor values.
+ MSG_WDHT_GET MsgType = 915 // Message which contains the get query
+ MSG_WDHT_PUT MsgType = 916 // Message which contains the "put", a response to #WDHT_SUCCESSOR_FIND.
+ MSG_WDHT_GET_RESULT MsgType = 917 // Message which contains the get result, a response to #WDHT_GET.
+
+ //------------------------------------------------------------------
+ // RPS messages
+ //------------------------------------------------------------------
+
+ MSG_RPS_PP_CHECK_LIVE MsgType = 950 // RPS check liveliness message to check liveliness of other peer
+ MSG_RPS_PP_PUSH MsgType = 951 // RPS PUSH message to push own ID to another peer
+ MSG_RPS_PP_PULL_REQUEST MsgType = 952 // RPS PULL REQUEST message to request the local view of another peer
+ MSG_RPS_PP_PULL_REPLY MsgType = 953 // RPS PULL REPLY message which contains the view of the other peer
+ MSG_RPS_CS_SEED MsgType = 954 // RPS CS SEED Message for the Client to seed peers into rps
+ MSG_RPS_ACT_MALICIOUS MsgType = 955 // Turn RPS service malicious
+ MSG_RPS_CS_SUB_START MsgType = 956 // RPS client-service message to start a sub sampler
+ MSG_RPS_CS_SUB_STOP MsgType = 957 // RPS client-service message to stop a sub sampler
+
+ //------------------------------------------------------------------
+ // RECLAIM messages
+ //------------------------------------------------------------------
+
+ MSG_RECLAIM_ATTRIBUTE_STORE MsgType = 961
+ MSG_RECLAIM_SUCCESS_RESPONSE MsgType = 962
+ MSG_RECLAIM_ATTRIBUTE_ITERATION_START MsgType = 963
+ MSG_RECLAIM_ATTRIBUTE_ITERATION_STOP MsgType = 964
+ MSG_RECLAIM_ATTRIBUTE_ITERATION_NEXT MsgType = 965
+ MSG_RECLAIM_ATTRIBUTE_RESULT MsgType = 966
+ MSG_RECLAIM_ISSUE_TICKET MsgType = 967
+ MSG_RECLAIM_TICKET_RESULT MsgType = 968
+ MSG_RECLAIM_REVOKE_TICKET MsgType = 969
+ MSG_RECLAIM_REVOKE_TICKET_RESULT MsgType = 970
+ MSG_RECLAIM_CONSUME_TICKET MsgType = 971
+ MSG_RECLAIM_CONSUME_TICKET_RESULT MsgType = 972
+ MSG_RECLAIM_TICKET_ITERATION_START MsgType = 973
+ MSG_RECLAIM_TICKET_ITERATION_STOP MsgType = 974
+ MSG_RECLAIM_TICKET_ITERATION_NEXT MsgType = 975
+ MSG_RECLAIM_ATTRIBUTE_DELETE MsgType = 976
+
+ //------------------------------------------------------------------
+ // CREDENTIAL messages
+ //------------------------------------------------------------------
+
+ MSG_CREDENTIAL_VERIFY MsgType = 981 //
+ MSG_CREDENTIAL_VERIFY_RESULT MsgType = 982 //
+ MSG_CREDENTIAL_COLLECT MsgType = 983 //
+ MSG_CREDENTIAL_COLLECT_RESULT MsgType = 984 //
+
+ //------------------------------------------------------------------
+ // CADET messages
+ //------------------------------------------------------------------
+
+ MSG_CADET_CONNECTION_CREATE MsgType = 1000 // Request the creation of a connection
+ MSG_CADET_CONNECTION_CREATE_ACK MsgType = 1001 // Send origin an ACK that the connection is complete
+ MSG_CADET_CONNECTION_BROKEN MsgType = 1002 // Notify that a connection is no longer valid
+ MSG_CADET_CONNECTION_DESTROY MsgType = 1003 // Request the destuction of a connection
+ MSG_CADET_CONNECTION_PATH_CHANGED_UNIMPLEMENTED MsgType = 1004 // At some point, the route will spontaneously change TODO
+ MSG_CADET_CONNECTION_HOP_BY_HOP_ENCRYPTED_ACK MsgType = 1005 // Hop-by-hop, connection dependent ACK. deprecated
+
+ MSG_CADET_TUNNEL_ENCRYPTED_POLL MsgType = 1006 // We do not bother with ACKs for #CADET_TUNNEL_ENCRYPTED messages, but we instead poll for one if we got nothing for a while and start to be worried. deprecated
+ MSG_CADET_TUNNEL_KX MsgType = 1007 // Axolotl key exchange.
+ MSG_CADET_TUNNEL_ENCRYPTED MsgType = 1008 // Axolotl encrypted data.
+ MSG_CADET_TUNNEL_KX_AUTH MsgType = 1009 // Axolotl key exchange response with authentication.
+
+ MSG_CADET_CHANNEL_APP_DATA MsgType = 1010 // Payload data (inside an encrypted tunnel).
+ MSG_CADET_CHANNEL_APP_DATA_ACK MsgType = 1011 // Confirm payload data end-to-end.
+ MSG_CADET_CHANNEL_KEEPALIVE MsgType = 1012 // Announce connection is still alive (direction sensitive).
+ MSG_CADET_CHANNEL_OPEN MsgType = 1013 // Ask the cadet service to create a new channel.
+ MSG_CADET_CHANNEL_DESTROY MsgType = 1014 // Ask the cadet service to destroy a channel.
+ MSG_CADET_CHANNEL_OPEN_ACK MsgType = 1015 // Confirm the creation of a channel
+ MSG_CADET_CHANNEL_OPEN_NACK_DEPRECATED MsgType = 1016 // Reject the creation of a channel deprecated
+
+ MSG_CADET_LOCAL_DATA MsgType = 1020 // Payload client <-> service
+ MSG_CADET_LOCAL_ACK MsgType = 1021 // Local ACK for data.
+ MSG_CADET_LOCAL_PORT_OPEN MsgType = 1022 // Start listening on a port.
+ MSG_CADET_LOCAL_PORT_CLOSE MsgType = 1023 // Stop listening on a port.
+ MSG_CADET_LOCAL_CHANNEL_CREATE MsgType = 1024 // Ask the cadet service to create a new channel.
+ MSG_CADET_LOCAL_CHANNEL_DESTROY MsgType = 1025 // Tell client that a channel was destroyed.
+
+ MSG_CADET_LOCAL_REQUEST_INFO_CHANNEL MsgType = 1030 // Local information about all channels of service.
+ MSG_CADET_LOCAL_INFO_CHANNEL MsgType = 1031 // Local information of service about a specific channel.
+ MSG_CADET_LOCAL_INFO_CHANNEL_END MsgType = 1032 // End of local information of service about channels.
+ MSG_CADET_LOCAL_REQUEST_INFO_PEERS MsgType = 1033 // Request local information about all peers known to the service.
+ MSG_CADET_LOCAL_INFO_PEERS MsgType = 1034 // Local information about all peers known to the service.
+ MSG_CADET_LOCAL_INFO_PEERS_END MsgType = 1035 // End of local information about all peers known to the service.
+ MSG_CADET_LOCAL_REQUEST_INFO_PATH MsgType = 1036 // Request local information of service about paths to specific peer.
+ MSG_CADET_LOCAL_INFO_PATH MsgType = 1037 // Local information of service about a specific path.
+ MSG_CADET_LOCAL_INFO_PATH_END MsgType = 1038 // End of local information of service about a specific path.
+ MSG_CADET_LOCAL_REQUEST_INFO_TUNNELS MsgType = 1039 // Request local information about all tunnels of service.
+ MSG_CADET_LOCAL_INFO_TUNNELS MsgType = 1040 // Local information about all tunnels of service.
+ MSG_CADET_LOCAL_INFO_TUNNELS_END MsgType = 1041 // End of local information about all tunnels of service.
+
+ MSG_CADET_CLI MsgType = 1059 // Traffic (net-cat style) used by the Command Line Interface.
+
+ //------------------------------------------------------------------
+ // NAT messages
+ //------------------------------------------------------------------
+
+ MSG_NAT_REGISTER MsgType = 1060 // Message to ask NAT service to register a client.
+ MSG_NAT_HANDLE_STUN MsgType = 1061 // Message to ask NAT service to handle a STUN packet.
+ MSG_NAT_REQUEST_CONNECTION_REVERSAL MsgType = 1062 // Message to ask NAT service to request connection reversal.
+ MSG_NAT_CONNECTION_REVERSAL_REQUESTED MsgType = 1063 // Message to from NAT service notifying us that connection reversal was requested by another peer.
+ MSG_NAT_ADDRESS_CHANGE MsgType = 1064 // Message to from NAT service notifying us that one of our addresses changed.
+ MSG_NAT_AUTO_REQUEST_CFG MsgType = 1066 // Message to ask NAT service to request autoconfiguration.
+ MSG_NAT_AUTO_CFG_RESULT MsgType = 1065 // Message from NAT service with the autoconfiguration result.
+
+ //------------------------------------------------------------------
+ // AUCTION messages
+ //------------------------------------------------------------------
+
+ MSG_AUCTION_CLIENT_CREATE MsgType = 1110 // Client wants to create a new auction.
+ MSG_AUCTION_CLIENT_JOIN MsgType = 1111 // Client wants to join an existing auction.
+ MSG_AUCTION_CLIENT_OUTCOME MsgType = 1112 // Service reports the auction outcome to the client.
+
+ //------------------------------------------------------------------
+ // RPS_DEBUG messages
+ //------------------------------------------------------------------
+
+ MSG_RPS_CS_DEBUG_VIEW_REQUEST MsgType = 1130 // Request updates of the view
+ MSG_RPS_CS_DEBUG_VIEW_REPLY MsgType = 1131 // Send update of the view
+ MSG_RPS_CS_DEBUG_VIEW_CANCEL MsgType = 1132 // Cancel getting updates of the view
+ MSG_RPS_CS_DEBUG_STREAM_REQUEST MsgType = 1133 // Request biased input stream
+ MSG_RPS_CS_DEBUG_STREAM_REPLY MsgType = 1134 // Send peer of biased stream
+ MSG_RPS_CS_DEBUG_STREAM_CANCEL MsgType = 1135 // Cancel getting biased stream
+
+ //------------------------------------------------------------------
+ // CATCH-ALL_DEBUG message
+ //------------------------------------------------------------------
+
+ MSG_ALL MsgType = 65535 // Type used to match 'all' message types.
+)
diff --git a/src/gnunet/enums/msgtype_string.go b/src/gnunet/enums/msgtype_string.go
@@ -0,0 +1,1113 @@
+// Code generated by "stringer -type=MsgType"; DO NOT EDIT.
+
+package enums
+
+import "strconv"
+
+func _() {
+ // An "invalid array index" compiler error signifies that the constant values have changed.
+ // Re-run the stringer command to generate them again.
+ var x [1]struct{}
+ _ = x[MSG_TEST-1]
+ _ = x[MSG_DUMMY-2]
+ _ = x[MSG_DUMMY2-3]
+ _ = x[MSG_RESOLVER_REQUEST-4]
+ _ = x[MSG_RESOLVER_RESPONSE-5]
+ _ = x[MSG_REQUEST_AGPL-6]
+ _ = x[MSG_RESPONSE_AGPL-7]
+ _ = x[MSG_ARM_START-8]
+ _ = x[MSG_ARM_STOP-9]
+ _ = x[MSG_ARM_RESULT-10]
+ _ = x[MSG_ARM_STATUS-11]
+ _ = x[MSG_ARM_LIST-12]
+ _ = x[MSG_ARM_LIST_RESULT-13]
+ _ = x[MSG_ARM_MONITOR-14]
+ _ = x[MSG_ARM_TEST-15]
+ _ = x[MSG_HELLO_LEGACY-16]
+ _ = x[MSG_HELLO-17]
+ _ = x[MSG_FRAGMENT-18]
+ _ = x[MSG_FRAGMENT_ACK-19]
+ _ = x[MSG_WLAN_DATA_TO_HELPER-39]
+ _ = x[MSG_WLAN_DATA_FROM_HELPER-40]
+ _ = x[MSG_WLAN_HELPER_CONTROL-41]
+ _ = x[MSG_WLAN_ADVERTISEMENT-42]
+ _ = x[MSG_WLAN_DATA-43]
+ _ = x[MSG_DV_RECV-44]
+ _ = x[MSG_DV_SEND-45]
+ _ = x[MSG_DV_SEND_ACK-46]
+ _ = x[MSG_DV_ROUTE-47]
+ _ = x[MSG_DV_START-48]
+ _ = x[MSG_DV_CONNECT-49]
+ _ = x[MSG_DV_DISCONNECT-50]
+ _ = x[MSG_DV_SEND_NACK-51]
+ _ = x[MSG_DV_DISTANCE_CHANGED-52]
+ _ = x[MSG_DV_BOX-53]
+ _ = x[MSG_TRANSPORT_XU_MESSAGE-55]
+ _ = x[MSG_TRANSPORT_UDP_MESSAGE-56]
+ _ = x[MSG_TRANSPORT_UDP_ACK-57]
+ _ = x[MSG_TRANSPORT_TCP_NAT_PROBE-60]
+ _ = x[MSG_TRANSPORT_TCP_WELCOME-61]
+ _ = x[MSG_TRANSPORT_ATS-62]
+ _ = x[MSG_NAT_TEST-63]
+ _ = x[MSG_CORE_INIT-64]
+ _ = x[MSG_CORE_INIT_REPLY-65]
+ _ = x[MSG_CORE_NOTIFY_CONNECT-67]
+ _ = x[MSG_CORE_NOTIFY_DISCONNECT-68]
+ _ = x[MSG_CORE_NOTIFY_STATUS_CHANGE-69]
+ _ = x[MSG_CORE_NOTIFY_INBOUND-70]
+ _ = x[MSG_CORE_NOTIFY_OUTBOUND-71]
+ _ = x[MSG_CORE_SEND_REQUEST-74]
+ _ = x[MSG_CORE_SEND_READY-75]
+ _ = x[MSG_CORE_SEND-76]
+ _ = x[MSG_CORE_MONITOR_PEERS-78]
+ _ = x[MSG_CORE_MONITOR_NOTIFY-79]
+ _ = x[MSG_CORE_ENCRYPTED_MESSAGE-82]
+ _ = x[MSG_CORE_PING-83]
+ _ = x[MSG_CORE_PONG-84]
+ _ = x[MSG_CORE_HANGUP-85]
+ _ = x[MSG_CORE_COMPRESSED_TYPE_MAP-86]
+ _ = x[MSG_CORE_BINARY_TYPE_MAP-87]
+ _ = x[MSG_CORE_EPHEMERAL_KEY-88]
+ _ = x[MSG_CORE_CONFIRM_TYPE_MAP-89]
+ _ = x[MSG_DATASTORE_RESERVE-92]
+ _ = x[MSG_DATASTORE_RELEASE_RESERVE-93]
+ _ = x[MSG_DATASTORE_STATUS-94]
+ _ = x[MSG_DATASTORE_PUT-95]
+ _ = x[MSG_DATASTORE_GET-97]
+ _ = x[MSG_DATASTORE_GET_REPLICATION-98]
+ _ = x[MSG_DATASTORE_GET_ZERO_ANONYMITY-99]
+ _ = x[MSG_DATASTORE_DATA-100]
+ _ = x[MSG_DATASTORE_DATA_END-101]
+ _ = x[MSG_DATASTORE_REMOVE-102]
+ _ = x[MSG_DATASTORE_DROP-103]
+ _ = x[MSG_DATASTORE_GET_KEY-104]
+ _ = x[MSG_FS_REQUEST_LOC_SIGN-126]
+ _ = x[MSG_FS_REQUEST_LOC_SIGNATURE-127]
+ _ = x[MSG_FS_INDEX_START-128]
+ _ = x[MSG_FS_INDEX_START_OK-129]
+ _ = x[MSG_FS_INDEX_START_FAILED-130]
+ _ = x[MSG_FS_INDEX_LIST_GET-131]
+ _ = x[MSG_FS_INDEX_LIST_ENTRY-132]
+ _ = x[MSG_FS_INDEX_LIST_END-133]
+ _ = x[MSG_FS_UNINDEX-134]
+ _ = x[MSG_FS_UNINDEX_OK-135]
+ _ = x[MSG_FS_START_SEARCH-136]
+ _ = x[MSG_FS_GET-137]
+ _ = x[MSG_FS_PUT-138]
+ _ = x[MSG_FS_MIGRATION_STOP-139]
+ _ = x[MSG_FS_CADET_QUERY-140]
+ _ = x[MSG_FS_CADET_REPLY-141]
+ _ = x[MSG_DHT_CLIENT_PUT-142]
+ _ = x[MSG_DHT_CLIENT_GET-143]
+ _ = x[MSG_DHT_CLIENT_GET_STOP-144]
+ _ = x[MSG_DHT_CLIENT_RESULT-145]
+ _ = x[MSG_DHT_P2P_PUT-146]
+ _ = x[MSG_DHT_P2P_GET-147]
+ _ = x[MSG_DHT_P2P_RESULT-148]
+ _ = x[MSG_DHT_MONITOR_GET-149]
+ _ = x[MSG_DHT_MONITOR_GET_RESP-150]
+ _ = x[MSG_DHT_MONITOR_PUT-151]
+ _ = x[MSG_DHT_MONITOR_PUT_RESP-152]
+ _ = x[MSG_DHT_MONITOR_START-153]
+ _ = x[MSG_DHT_MONITOR_STOP-154]
+ _ = x[MSG_DHT_CLIENT_GET_RESULTS_KNOWN-156]
+ _ = x[MSG_DHT_P2P_HELLO-157]
+ _ = x[MSG_DHT_CORE-158]
+ _ = x[MSG_DHT_CLIENT_HELLO_URL-159]
+ _ = x[MSG_DHT_CLIENT_HELLO_GET-161]
+ _ = x[MSG_HOSTLIST_ADVERTISEMENT-160]
+ _ = x[MSG_STATISTICS_SET-168]
+ _ = x[MSG_STATISTICS_GET-169]
+ _ = x[MSG_STATISTICS_VALUE-170]
+ _ = x[MSG_STATISTICS_END-171]
+ _ = x[MSG_STATISTICS_WATCH-172]
+ _ = x[MSG_STATISTICS_WATCH_VALUE-173]
+ _ = x[MSG_STATISTICS_DISCONNECT-174]
+ _ = x[MSG_STATISTICS_DISCONNECT_CONFIRM-175]
+ _ = x[MSG_VPN_HELPER-185]
+ _ = x[MSG_VPN_ICMP_TO_SERVICE-190]
+ _ = x[MSG_VPN_ICMP_TO_INTERNET-191]
+ _ = x[MSG_VPN_ICMP_TO_VPN-192]
+ _ = x[MSG_VPN_DNS_TO_INTERNET-193]
+ _ = x[MSG_VPN_DNS_FROM_INTERNET-194]
+ _ = x[MSG_VPN_TCP_TO_SERVICE_START-195]
+ _ = x[MSG_VPN_TCP_TO_INTERNET_START-196]
+ _ = x[MSG_VPN_TCP_DATA_TO_EXIT-197]
+ _ = x[MSG_VPN_TCP_DATA_TO_VPN-198]
+ _ = x[MSG_VPN_UDP_TO_SERVICE-199]
+ _ = x[MSG_VPN_UDP_TO_INTERNET-200]
+ _ = x[MSG_VPN_UDP_REPLY-201]
+ _ = x[MSG_VPN_CLIENT_REDIRECT_TO_IP-202]
+ _ = x[MSG_VPN_CLIENT_REDIRECT_TO_SERVICE-203]
+ _ = x[MSG_VPN_CLIENT_USE_IP-204]
+ _ = x[MSG_DNS_CLIENT_INIT-211]
+ _ = x[MSG_DNS_CLIENT_REQUEST-212]
+ _ = x[MSG_DNS_CLIENT_RESPONSE-213]
+ _ = x[MSG_DNS_HELPER-214]
+ _ = x[MSG_CHAT_JOIN_REQUEST-300]
+ _ = x[MSG_CHAT_JOIN_NOTIFICATION-301]
+ _ = x[MSG_CHAT_LEAVE_NOTIFICATION-302]
+ _ = x[MSG_CHAT_MESSAGE_NOTIFICATION-303]
+ _ = x[MSG_CHAT_TRANSMIT_REQUEST-304]
+ _ = x[MSG_CHAT_CONFIRMATION_RECEIPT-305]
+ _ = x[MSG_CHAT_CONFIRMATION_NOTIFICATION-306]
+ _ = x[MSG_CHAT_P2P_JOIN_NOTIFICATION-307]
+ _ = x[MSG_CHAT_P2P_LEAVE_NOTIFICATION-308]
+ _ = x[MSG_CHAT_P2P_SYNC_REQUEST-309]
+ _ = x[MSG_CHAT_P2P_MESSAGE_NOTIFICATION-310]
+ _ = x[MSG_CHAT_P2P_CONFIRMATION_RECEIPT-311]
+ _ = x[MSG_NSE_START-321]
+ _ = x[MSG_NSE_P2P_FLOOD-322]
+ _ = x[MSG_NSE_ESTIMATE-323]
+ _ = x[MSG_PEERINFO_GET-330]
+ _ = x[MSG_PEERINFO_GET_ALL-331]
+ _ = x[MSG_PEERINFO_INFO-332]
+ _ = x[MSG_PEERINFO_INFO_END-333]
+ _ = x[MSG_PEERINFO_NOTIFY-334]
+ _ = x[MSG_ATS_START-340]
+ _ = x[MSG_ATS_REQUEST_ADDRESS-341]
+ _ = x[MSG_ATS_REQUEST_ADDRESS_CANCEL-342]
+ _ = x[MSG_ATS_ADDRESS_UPDATE-343]
+ _ = x[MSG_ATS_ADDRESS_DESTROYED-344]
+ _ = x[MSG_ATS_ADDRESS_SUGGESTION-345]
+ _ = x[MSG_ATS_PEER_INFORMATION-346]
+ _ = x[MSG_ATS_RESERVATION_REQUEST-347]
+ _ = x[MSG_ATS_RESERVATION_RESULT-348]
+ _ = x[MSG_ATS_PREFERENCE_CHANGE-349]
+ _ = x[MSG_ATS_SESSION_RELEASE-350]
+ _ = x[MSG_ATS_ADDRESS_ADD-353]
+ _ = x[MSG_ATS_ADDRESSLIST_REQUEST-354]
+ _ = x[MSG_ATS_ADDRESSLIST_RESPONSE-355]
+ _ = x[MSG_ATS_PREFERENCE_FEEDBACK-356]
+ _ = x[MSG_TRANSPORT_START-360]
+ _ = x[MSG_TRANSPORT_CONNECT-361]
+ _ = x[MSG_TRANSPORT_DISCONNECT-362]
+ _ = x[MSG_TRANSPORT_SEND-363]
+ _ = x[MSG_TRANSPORT_SEND_OK-364]
+ _ = x[MSG_TRANSPORT_RECV-365]
+ _ = x[MSG_TRANSPORT_SET_QUOTA-366]
+ _ = x[MSG_TRANSPORT_ADDRESS_TO_STRING-367]
+ _ = x[MSG_TRANSPORT_ADDRESS_TO_STRING_REPLY-368]
+ _ = x[MSG_TRANSPORT_BLACKLIST_INIT-369]
+ _ = x[MSG_TRANSPORT_BLACKLIST_QUERY-370]
+ _ = x[MSG_TRANSPORT_BLACKLIST_REPLY-371]
+ _ = x[MSG_TRANSPORT_PING-372]
+ _ = x[MSG_TRANSPORT_PONG-373]
+ _ = x[MSG_TRANSPORT_SESSION_SYN-375]
+ _ = x[MSG_TRANSPORT_SESSION_SYN_ACK-376]
+ _ = x[MSG_TRANSPORT_SESSION_ACK-377]
+ _ = x[MSG_TRANSPORT_SESSION_DISCONNECT-378]
+ _ = x[MSG_TRANSPORT_SESSION_QUOTA-379]
+ _ = x[MSG_TRANSPORT_MONITOR_PEER_REQUEST-380]
+ _ = x[MSG_TRANSPORT_SESSION_KEEPALIVE-381]
+ _ = x[MSG_TRANSPORT_SESSION_KEEPALIVE_RESPONSE-382]
+ _ = x[MSG_TRANSPORT_MONITOR_PEER_RESPONSE-383]
+ _ = x[MSG_TRANSPORT_BROADCAST_BEACON-384]
+ _ = x[MSG_TRANSPORT_TRAFFIC_METRIC-385]
+ _ = x[MSG_TRANSPORT_MONITOR_PLUGIN_START-388]
+ _ = x[MSG_TRANSPORT_MONITOR_PLUGIN_EVENT-389]
+ _ = x[MSG_TRANSPORT_MONITOR_PLUGIN_SYNC-390]
+ _ = x[MSG_TRANSPORT_MONITOR_PEER_RESPONSE_END-391]
+ _ = x[MSG_FS_PUBLISH_HELPER_PROGRESS_FILE-420]
+ _ = x[MSG_FS_PUBLISH_HELPER_PROGRESS_DIRECTORY-421]
+ _ = x[MSG_FS_PUBLISH_HELPER_ERROR-422]
+ _ = x[MSG_FS_PUBLISH_HELPER_SKIP_FILE-423]
+ _ = x[MSG_FS_PUBLISH_HELPER_COUNTING_DONE-424]
+ _ = x[MSG_FS_PUBLISH_HELPER_META_DATA-425]
+ _ = x[MSG_FS_PUBLISH_HELPER_FINISHED-426]
+ _ = x[MSG_NAMECACHE_LOOKUP_BLOCK-431]
+ _ = x[MSG_NAMECACHE_LOOKUP_BLOCK_RESPONSE-432]
+ _ = x[MSG_NAMECACHE_BLOCK_CACHE-433]
+ _ = x[MSG_NAMECACHE_BLOCK_CACHE_RESPONSE-434]
+ _ = x[MSG_NAMESTORE_RECORD_STORE-435]
+ _ = x[MSG_NAMESTORE_RECORD_STORE_RESPONSE-436]
+ _ = x[MSG_NAMESTORE_RECORD_LOOKUP-437]
+ _ = x[MSG_NAMESTORE_RECORD_LOOKUP_RESPONSE-438]
+ _ = x[MSG_NAMESTORE_ZONE_TO_NAME-439]
+ _ = x[MSG_NAMESTORE_ZONE_TO_NAME_RESPONSE-440]
+ _ = x[MSG_NAMESTORE_MONITOR_START-441]
+ _ = x[MSG_NAMESTORE_MONITOR_SYNC-442]
+ _ = x[MSG_NAMESTORE_RECORD_RESULT-443]
+ _ = x[MSG_NAMESTORE_MONITOR_NEXT-444]
+ _ = x[MSG_NAMESTORE_ZONE_ITERATION_START-445]
+ _ = x[MSG_NAMESTORE_ZONE_ITERATION_NEXT-447]
+ _ = x[MSG_NAMESTORE_ZONE_ITERATION_STOP-448]
+ _ = x[MSG_TESTBED_INIT-460]
+ _ = x[MSG_TESTBED_ADD_HOST-461]
+ _ = x[MSG_TESTBED_ADD_HOST_SUCCESS-462]
+ _ = x[MSG_TESTBED_LINK_CONTROLLERS-463]
+ _ = x[MSG_TESTBED_CREATE_PEER-464]
+ _ = x[MSG_TESTBED_RECONFIGURE_PEER-465]
+ _ = x[MSG_TESTBED_START_PEER-466]
+ _ = x[MSG_TESTBED_STOP_PEER-467]
+ _ = x[MSG_TESTBED_DESTROY_PEER-468]
+ _ = x[MSG_TESTBED_CONFIGURE_UNDERLAY_LINK-469]
+ _ = x[MSG_TESTBED_OVERLAY_CONNECT-470]
+ _ = x[MSG_TESTBED_PEER_EVENT-471]
+ _ = x[MSG_TESTBED_PEER_CONNECT_EVENT-472]
+ _ = x[MSG_TESTBED_OPERATION_FAIL_EVENT-473]
+ _ = x[MSG_TESTBED_CREATE_PEER_SUCCESS-474]
+ _ = x[MSG_TESTBED_GENERIC_OPERATION_SUCCESS-475]
+ _ = x[MSG_TESTBED_GET_PEER_INFORMATION-476]
+ _ = x[MSG_TESTBED_PEER_INFORMATION-477]
+ _ = x[MSG_TESTBED_REMOTE_OVERLAY_CONNECT-478]
+ _ = x[MSG_TESTBED_GET_SLAVE_CONFIGURATION-479]
+ _ = x[MSG_TESTBED_SLAVE_CONFIGURATION-480]
+ _ = x[MSG_TESTBED_LINK_CONTROLLERS_RESULT-481]
+ _ = x[MSG_TESTBED_SHUTDOWN_PEERS-482]
+ _ = x[MSG_TESTBED_MANAGE_PEER_SERVICE-483]
+ _ = x[MSG_TESTBED_BARRIER_INIT-484]
+ _ = x[MSG_TESTBED_BARRIER_CANCEL-485]
+ _ = x[MSG_TESTBED_BARRIER_STATUS-486]
+ _ = x[MSG_TESTBED_BARRIER_WAIT-487]
+ _ = x[MSG_TESTBED_MAX-488]
+ _ = x[MSG_TESTBED_HELPER_INIT-495]
+ _ = x[MSG_TESTBED_HELPER_REPLY-496]
+ _ = x[MSG_GNS_LOOKUP-500]
+ _ = x[MSG_GNS_LOOKUP_RESULT-501]
+ _ = x[MSG_GNS_REVERSE_LOOKUP-502]
+ _ = x[MSG_GNS_REVERSE_LOOKUP_RESULT-503]
+ _ = x[MSG_CONSENSUS_CLIENT_JOIN-520]
+ _ = x[MSG_CONSENSUS_CLIENT_INSERT-521]
+ _ = x[MSG_CONSENSUS_CLIENT_BEGIN-522]
+ _ = x[MSG_CONSENSUS_CLIENT_RECEIVED_ELEMENT-523]
+ _ = x[MSG_CONSENSUS_CLIENT_CONCLUDE-524]
+ _ = x[MSG_CONSENSUS_CLIENT_CONCLUDE_DONE-525]
+ _ = x[MSG_CONSENSUS_CLIENT_ACK-540]
+ _ = x[MSG_CONSENSUS_P2P_DELTA_ESTIMATE-541]
+ _ = x[MSG_CONSENSUS_P2P_DIFFERENCE_DIGEST-542]
+ _ = x[MSG_CONSENSUS_P2P_ELEMENTS-543]
+ _ = x[MSG_CONSENSUS_P2P_ELEMENTS_REQUEST-544]
+ _ = x[MSG_CONSENSUS_P2P_ELEMENTS_REPORT-545]
+ _ = x[MSG_CONSENSUS_P2P_HELLO-546]
+ _ = x[MSG_CONSENSUS_P2P_SYNCED-547]
+ _ = x[MSG_CONSENSUS_P2P_FIN-548]
+ _ = x[MSG_CONSENSUS_P2P_ABORT-548]
+ _ = x[MSG_CONSENSUS_P2P_ROUND_CONTEXT-547]
+ _ = x[MSG_SET_UNION_P2P_REQUEST_FULL-565]
+ _ = x[MSG_SET_UNION_P2P_DEMAND-566]
+ _ = x[MSG_SET_UNION_P2P_INQUIRY-567]
+ _ = x[MSG_SET_UNION_P2P_OFFER-568]
+ _ = x[MSG_SET_REJECT-569]
+ _ = x[MSG_SET_CANCEL-570]
+ _ = x[MSG_SET_ITER_ACK-571]
+ _ = x[MSG_SET_RESULT-572]
+ _ = x[MSG_SET_ADD-573]
+ _ = x[MSG_SET_REMOVE-574]
+ _ = x[MSG_SET_LISTEN-575]
+ _ = x[MSG_SET_ACCEPT-576]
+ _ = x[MSG_SET_EVALUATE-577]
+ _ = x[MSG_SET_CONCLUDE-578]
+ _ = x[MSG_SET_REQUEST-579]
+ _ = x[MSG_SET_CREATE-580]
+ _ = x[MSG_SET_P2P_OPERATION_REQUEST-581]
+ _ = x[MSG_SET_UNION_P2P_SE-582]
+ _ = x[MSG_SET_UNION_P2P_IBF-583]
+ _ = x[MSG_SET_P2P_ELEMENTS-584]
+ _ = x[MSG_SET_P2P_ELEMENT_REQUESTS-585]
+ _ = x[MSG_SET_UNION_P2P_DONE-586]
+ _ = x[MSG_SET_ITER_REQUEST-587]
+ _ = x[MSG_SET_ITER_ELEMENT-588]
+ _ = x[MSG_SET_ITER_DONE-589]
+ _ = x[MSG_SET_UNION_P2P_SEC-590]
+ _ = x[MSG_SET_INTERSECTION_P2P_ELEMENT_INFO-591]
+ _ = x[MSG_SET_INTERSECTION_P2P_BF-592]
+ _ = x[MSG_SET_INTERSECTION_P2P_DONE-593]
+ _ = x[MSG_SET_COPY_LAZY_PREPARE-594]
+ _ = x[MSG_SET_COPY_LAZY_RESPONSE-595]
+ _ = x[MSG_SET_COPY_LAZY_CONNECT-596]
+ _ = x[MSG_SET_UNION_P2P_FULL_DONE-597]
+ _ = x[MSG_SET_UNION_P2P_FULL_ELEMENT-598]
+ _ = x[MSG_SET_UNION_P2P_OVER-599]
+ _ = x[MSG_TESTBED_LOGGER_MSG-600]
+ _ = x[MSG_TESTBED_LOGGER_ACK-601]
+ _ = x[MSG_REGEX_ANNOUNCE-620]
+ _ = x[MSG_REGEX_SEARCH-621]
+ _ = x[MSG_REGEX_RESULT-622]
+ _ = x[MSG_IDENTITY_START-624]
+ _ = x[MSG_IDENTITY_RESULT_CODE-625]
+ _ = x[MSG_IDENTITY_UPDATE-626]
+ _ = x[MSG_IDENTITY_GET_DEFAULT-627]
+ _ = x[MSG_IDENTITY_SET_DEFAULT-628]
+ _ = x[MSG_IDENTITY_CREATE-629]
+ _ = x[MSG_IDENTITY_RENAME-630]
+ _ = x[MSG_IDENTITY_DELETE-631]
+ _ = x[MSG_IDENTITY_LOOKUP-632]
+ _ = x[MSG_IDENTITY_LOOKUP_BY_NAME-633]
+ _ = x[MSG_REVOCATION_QUERY-636]
+ _ = x[MSG_REVOCATION_QUERY_RESPONSE-637]
+ _ = x[MSG_REVOCATION_REVOKE-638]
+ _ = x[MSG_REVOCATION_REVOKE_RESPONSE-639]
+ _ = x[MSG_SCALARPRODUCT_CLIENT_TO_ALICE-640]
+ _ = x[MSG_SCALARPRODUCT_CLIENT_TO_BOB-641]
+ _ = x[MSG_SCALARPRODUCT_CLIENT_MULTIPART_ALICE-642]
+ _ = x[MSG_SCALARPRODUCT_CLIENT_MULTIPART_BOB-643]
+ _ = x[MSG_SCALARPRODUCT_SESSION_INITIALIZATION-644]
+ _ = x[MSG_SCALARPRODUCT_ALICE_CRYPTODATA-645]
+ _ = x[MSG_SCALARPRODUCT_BOB_CRYPTODATA-647]
+ _ = x[MSG_SCALARPRODUCT_BOB_CRYPTODATA_MULTIPART-648]
+ _ = x[MSG_SCALARPRODUCT_RESULT-649]
+ _ = x[MSG_SCALARPRODUCT_ECC_SESSION_INITIALIZATION-650]
+ _ = x[MSG_SCALARPRODUCT_ECC_ALICE_CRYPTODATA-651]
+ _ = x[MSG_SCALARPRODUCT_ECC_BOB_CRYPTODATA-652]
+ _ = x[MSG_PSYCSTORE_MEMBERSHIP_STORE-660]
+ _ = x[MSG_PSYCSTORE_MEMBERSHIP_TEST-661]
+ _ = x[MSG_PSYCSTORE_FRAGMENT_STORE-662]
+ _ = x[MSG_PSYCSTORE_FRAGMENT_GET-663]
+ _ = x[MSG_PSYCSTORE_MESSAGE_GET-664]
+ _ = x[MSG_PSYCSTORE_MESSAGE_GET_FRAGMENT-665]
+ _ = x[MSG_PSYCSTORE_COUNTERS_GET-666]
+ _ = x[MSG_PSYCSTORE_STATE_MODIFY-668]
+ _ = x[MSG_PSYCSTORE_STATE_SYNC-669]
+ _ = x[MSG_PSYCSTORE_STATE_RESET-670]
+ _ = x[MSG_PSYCSTORE_STATE_HASH_UPDATE-671]
+ _ = x[MSG_PSYCSTORE_STATE_GET-672]
+ _ = x[MSG_PSYCSTORE_STATE_GET_PREFIX-673]
+ _ = x[MSG_PSYCSTORE_RESULT_CODE-674]
+ _ = x[MSG_PSYCSTORE_RESULT_FRAGMENT-675]
+ _ = x[MSG_PSYCSTORE_RESULT_COUNTERS-676]
+ _ = x[MSG_PSYCSTORE_RESULT_STATE-677]
+ _ = x[MSG_PSYC_RESULT_CODE-680]
+ _ = x[MSG_PSYC_MASTER_START-681]
+ _ = x[MSG_PSYC_MASTER_START_ACK-682]
+ _ = x[MSG_PSYC_SLAVE_JOIN-683]
+ _ = x[MSG_PSYC_SLAVE_JOIN_ACK-684]
+ _ = x[MSG_PSYC_PART_REQUEST-685]
+ _ = x[MSG_PSYC_PART_ACK-686]
+ _ = x[MSG_PSYC_JOIN_REQUEST-687]
+ _ = x[MSG_PSYC_JOIN_DECISION-688]
+ _ = x[MSG_PSYC_CHANNEL_MEMBERSHIP_STORE-689]
+ _ = x[MSG_PSYC_MESSAGE-691]
+ _ = x[MSG_PSYC_MESSAGE_HEADER-692]
+ _ = x[MSG_PSYC_MESSAGE_METHOD-693]
+ _ = x[MSG_PSYC_MESSAGE_MODIFIER-694]
+ _ = x[MSG_PSYC_MESSAGE_MOD_CONT-695]
+ _ = x[MSG_PSYC_MESSAGE_DATA-696]
+ _ = x[MSG_PSYC_MESSAGE_END-697]
+ _ = x[MSG_PSYC_MESSAGE_CANCEL-698]
+ _ = x[MSG_PSYC_MESSAGE_ACK-699]
+ _ = x[MSG_PSYC_HISTORY_REPLAY-701]
+ _ = x[MSG_PSYC_HISTORY_RESULT-702]
+ _ = x[MSG_PSYC_STATE_GET-703]
+ _ = x[MSG_PSYC_STATE_GET_PREFIX-704]
+ _ = x[MSG_PSYC_STATE_RESULT-705]
+ _ = x[MSG_CONVERSATION_AUDIO-730]
+ _ = x[MSG_CONVERSATION_CS_PHONE_REGISTER-731]
+ _ = x[MSG_CONVERSATION_CS_PHONE_PICK_UP-732]
+ _ = x[MSG_CONVERSATION_CS_PHONE_HANG_UP-733]
+ _ = x[MSG_CONVERSATION_CS_PHONE_CALL-734]
+ _ = x[MSG_CONVERSATION_CS_PHONE_RING-735]
+ _ = x[MSG_CONVERSATION_CS_PHONE_SUSPEND-736]
+ _ = x[MSG_CONVERSATION_CS_PHONE_RESUME-737]
+ _ = x[MSG_CONVERSATION_CS_PHONE_PICKED_UP-738]
+ _ = x[MSG_CONVERSATION_CS_AUDIO-739]
+ _ = x[MSG_CONVERSATION_CADET_PHONE_RING-740]
+ _ = x[MSG_CONVERSATION_CADET_PHONE_HANG_UP-741]
+ _ = x[MSG_CONVERSATION_CADET_PHONE_PICK_UP-742]
+ _ = x[MSG_CONVERSATION_CADET_PHONE_SUSPEND-743]
+ _ = x[MSG_CONVERSATION_CADET_PHONE_RESUME-744]
+ _ = x[MSG_CONVERSATION_CADET_AUDIO-745]
+ _ = x[MSG_MULTICAST_ORIGIN_START-750]
+ _ = x[MSG_MULTICAST_MEMBER_JOIN-751]
+ _ = x[MSG_MULTICAST_JOIN_REQUEST-752]
+ _ = x[MSG_MULTICAST_JOIN_DECISION-753]
+ _ = x[MSG_MULTICAST_PART_REQUEST-754]
+ _ = x[MSG_MULTICAST_PART_ACK-755]
+ _ = x[MSG_MULTICAST_GROUP_END-756]
+ _ = x[MSG_MULTICAST_MESSAGE-757]
+ _ = x[MSG_MULTICAST_REQUEST-758]
+ _ = x[MSG_MULTICAST_FRAGMENT_ACK-759]
+ _ = x[MSG_MULTICAST_REPLAY_REQUEST-760]
+ _ = x[MSG_MULTICAST_REPLAY_RESPONSE-761]
+ _ = x[MSG_MULTICAST_REPLAY_RESPONSE_END-762]
+ _ = x[MSG_SECRETSHARING_CLIENT_GENERATE-780]
+ _ = x[MSG_SECRETSHARING_CLIENT_DECRYPT-781]
+ _ = x[MSG_SECRETSHARING_CLIENT_DECRYPT_DONE-782]
+ _ = x[MSG_SECRETSHARING_CLIENT_SECRET_READY-783]
+ _ = x[MSG_PEERSTORE_STORE-820]
+ _ = x[MSG_PEERSTORE_ITERATE-821]
+ _ = x[MSG_PEERSTORE_ITERATE_RECORD-822]
+ _ = x[MSG_PEERSTORE_ITERATE_END-823]
+ _ = x[MSG_PEERSTORE_WATCH-824]
+ _ = x[MSG_PEERSTORE_WATCH_RECORD-825]
+ _ = x[MSG_PEERSTORE_WATCH_CANCEL-826]
+ _ = x[MSG_SOCIAL_RESULT_CODE-840]
+ _ = x[MSG_SOCIAL_HOST_ENTER-841]
+ _ = x[MSG_SOCIAL_HOST_ENTER_ACK-842]
+ _ = x[MSG_SOCIAL_GUEST_ENTER-843]
+ _ = x[MSG_SOCIAL_GUEST_ENTER_BY_NAME-844]
+ _ = x[MSG_SOCIAL_GUEST_ENTER_ACK-845]
+ _ = x[MSG_SOCIAL_ENTRY_REQUEST-846]
+ _ = x[MSG_SOCIAL_ENTRY_DECISION-847]
+ _ = x[MSG_SOCIAL_PLACE_LEAVE-848]
+ _ = x[MSG_SOCIAL_PLACE_LEAVE_ACK-849]
+ _ = x[MSG_SOCIAL_ZONE_ADD_PLACE-850]
+ _ = x[MSG_SOCIAL_ZONE_ADD_NYM-851]
+ _ = x[MSG_SOCIAL_APP_CONNECT-852]
+ _ = x[MSG_SOCIAL_APP_DETACH-853]
+ _ = x[MSG_SOCIAL_APP_EGO-854]
+ _ = x[MSG_SOCIAL_APP_EGO_END-855]
+ _ = x[MSG_SOCIAL_APP_PLACE-856]
+ _ = x[MSG_SOCIAL_APP_PLACE_END-857]
+ _ = x[MSG_SOCIAL_MSG_PROC_SET-858]
+ _ = x[MSG_SOCIAL_MSG_PROC_CLEAR-859]
+ _ = x[MSG_XDHT_P2P_TRAIL_SETUP-880]
+ _ = x[MSG_XDHT_P2P_TRAIL_SETUP_RESULT-881]
+ _ = x[MSG_XDHT_P2P_VERIFY_SUCCESSOR-882]
+ _ = x[MSG_XDHT_P2P_NOTIFY_NEW_SUCCESSOR-883]
+ _ = x[MSG_XDHT_P2P_VERIFY_SUCCESSOR_RESULT-884]
+ _ = x[MSG_XDHT_P2P_GET_RESULT-885]
+ _ = x[MSG_XDHT_P2P_TRAIL_SETUP_REJECTION-886]
+ _ = x[MSG_XDHT_P2P_TRAIL_TEARDOWN-887]
+ _ = x[MSG_XDHT_P2P_ADD_TRAIL-888]
+ _ = x[MSG_XDHT_P2P_PUT-890]
+ _ = x[MSG_XDHT_P2P_GET-891]
+ _ = x[MSG_XDHT_P2P_NOTIFY_SUCCESSOR_CONFIRMATION-892]
+ _ = x[MSG_DHT_ACT_MALICIOUS-893]
+ _ = x[MSG_DHT_CLIENT_ACT_MALICIOUS_OK-894]
+ _ = x[MSG_WDHT_RANDOM_WALK-910]
+ _ = x[MSG_WDHT_RANDOM_WALK_RESPONSE-911]
+ _ = x[MSG_WDHT_TRAIL_DESTROY-912]
+ _ = x[MSG_WDHT_TRAIL_ROUTE-913]
+ _ = x[MSG_WDHT_SUCCESSOR_FIND-914]
+ _ = x[MSG_WDHT_GET-915]
+ _ = x[MSG_WDHT_PUT-916]
+ _ = x[MSG_WDHT_GET_RESULT-917]
+ _ = x[MSG_RPS_PP_CHECK_LIVE-950]
+ _ = x[MSG_RPS_PP_PUSH-951]
+ _ = x[MSG_RPS_PP_PULL_REQUEST-952]
+ _ = x[MSG_RPS_PP_PULL_REPLY-953]
+ _ = x[MSG_RPS_CS_SEED-954]
+ _ = x[MSG_RPS_ACT_MALICIOUS-955]
+ _ = x[MSG_RPS_CS_SUB_START-956]
+ _ = x[MSG_RPS_CS_SUB_STOP-957]
+ _ = x[MSG_RECLAIM_ATTRIBUTE_STORE-961]
+ _ = x[MSG_RECLAIM_SUCCESS_RESPONSE-962]
+ _ = x[MSG_RECLAIM_ATTRIBUTE_ITERATION_START-963]
+ _ = x[MSG_RECLAIM_ATTRIBUTE_ITERATION_STOP-964]
+ _ = x[MSG_RECLAIM_ATTRIBUTE_ITERATION_NEXT-965]
+ _ = x[MSG_RECLAIM_ATTRIBUTE_RESULT-966]
+ _ = x[MSG_RECLAIM_ISSUE_TICKET-967]
+ _ = x[MSG_RECLAIM_TICKET_RESULT-968]
+ _ = x[MSG_RECLAIM_REVOKE_TICKET-969]
+ _ = x[MSG_RECLAIM_REVOKE_TICKET_RESULT-970]
+ _ = x[MSG_RECLAIM_CONSUME_TICKET-971]
+ _ = x[MSG_RECLAIM_CONSUME_TICKET_RESULT-972]
+ _ = x[MSG_RECLAIM_TICKET_ITERATION_START-973]
+ _ = x[MSG_RECLAIM_TICKET_ITERATION_STOP-974]
+ _ = x[MSG_RECLAIM_TICKET_ITERATION_NEXT-975]
+ _ = x[MSG_RECLAIM_ATTRIBUTE_DELETE-976]
+ _ = x[MSG_CREDENTIAL_VERIFY-981]
+ _ = x[MSG_CREDENTIAL_VERIFY_RESULT-982]
+ _ = x[MSG_CREDENTIAL_COLLECT-983]
+ _ = x[MSG_CREDENTIAL_COLLECT_RESULT-984]
+ _ = x[MSG_CADET_CONNECTION_CREATE-1000]
+ _ = x[MSG_CADET_CONNECTION_CREATE_ACK-1001]
+ _ = x[MSG_CADET_CONNECTION_BROKEN-1002]
+ _ = x[MSG_CADET_CONNECTION_DESTROY-1003]
+ _ = x[MSG_CADET_CONNECTION_PATH_CHANGED_UNIMPLEMENTED-1004]
+ _ = x[MSG_CADET_CONNECTION_HOP_BY_HOP_ENCRYPTED_ACK-1005]
+ _ = x[MSG_CADET_TUNNEL_ENCRYPTED_POLL-1006]
+ _ = x[MSG_CADET_TUNNEL_KX-1007]
+ _ = x[MSG_CADET_TUNNEL_ENCRYPTED-1008]
+ _ = x[MSG_CADET_TUNNEL_KX_AUTH-1009]
+ _ = x[MSG_CADET_CHANNEL_APP_DATA-1010]
+ _ = x[MSG_CADET_CHANNEL_APP_DATA_ACK-1011]
+ _ = x[MSG_CADET_CHANNEL_KEEPALIVE-1012]
+ _ = x[MSG_CADET_CHANNEL_OPEN-1013]
+ _ = x[MSG_CADET_CHANNEL_DESTROY-1014]
+ _ = x[MSG_CADET_CHANNEL_OPEN_ACK-1015]
+ _ = x[MSG_CADET_CHANNEL_OPEN_NACK_DEPRECATED-1016]
+ _ = x[MSG_CADET_LOCAL_DATA-1020]
+ _ = x[MSG_CADET_LOCAL_ACK-1021]
+ _ = x[MSG_CADET_LOCAL_PORT_OPEN-1022]
+ _ = x[MSG_CADET_LOCAL_PORT_CLOSE-1023]
+ _ = x[MSG_CADET_LOCAL_CHANNEL_CREATE-1024]
+ _ = x[MSG_CADET_LOCAL_CHANNEL_DESTROY-1025]
+ _ = x[MSG_CADET_LOCAL_REQUEST_INFO_CHANNEL-1030]
+ _ = x[MSG_CADET_LOCAL_INFO_CHANNEL-1031]
+ _ = x[MSG_CADET_LOCAL_INFO_CHANNEL_END-1032]
+ _ = x[MSG_CADET_LOCAL_REQUEST_INFO_PEERS-1033]
+ _ = x[MSG_CADET_LOCAL_INFO_PEERS-1034]
+ _ = x[MSG_CADET_LOCAL_INFO_PEERS_END-1035]
+ _ = x[MSG_CADET_LOCAL_REQUEST_INFO_PATH-1036]
+ _ = x[MSG_CADET_LOCAL_INFO_PATH-1037]
+ _ = x[MSG_CADET_LOCAL_INFO_PATH_END-1038]
+ _ = x[MSG_CADET_LOCAL_REQUEST_INFO_TUNNELS-1039]
+ _ = x[MSG_CADET_LOCAL_INFO_TUNNELS-1040]
+ _ = x[MSG_CADET_LOCAL_INFO_TUNNELS_END-1041]
+ _ = x[MSG_CADET_CLI-1059]
+ _ = x[MSG_NAT_REGISTER-1060]
+ _ = x[MSG_NAT_HANDLE_STUN-1061]
+ _ = x[MSG_NAT_REQUEST_CONNECTION_REVERSAL-1062]
+ _ = x[MSG_NAT_CONNECTION_REVERSAL_REQUESTED-1063]
+ _ = x[MSG_NAT_ADDRESS_CHANGE-1064]
+ _ = x[MSG_NAT_AUTO_REQUEST_CFG-1066]
+ _ = x[MSG_NAT_AUTO_CFG_RESULT-1065]
+ _ = x[MSG_AUCTION_CLIENT_CREATE-1110]
+ _ = x[MSG_AUCTION_CLIENT_JOIN-1111]
+ _ = x[MSG_AUCTION_CLIENT_OUTCOME-1112]
+ _ = x[MSG_RPS_CS_DEBUG_VIEW_REQUEST-1130]
+ _ = x[MSG_RPS_CS_DEBUG_VIEW_REPLY-1131]
+ _ = x[MSG_RPS_CS_DEBUG_VIEW_CANCEL-1132]
+ _ = x[MSG_RPS_CS_DEBUG_STREAM_REQUEST-1133]
+ _ = x[MSG_RPS_CS_DEBUG_STREAM_REPLY-1134]
+ _ = x[MSG_RPS_CS_DEBUG_STREAM_CANCEL-1135]
+ _ = x[MSG_ALL-65535]
+}
+
+const _MsgType_name = "MSG_TESTMSG_DUMMYMSG_DUMMY2MSG_RESOLVER_REQUESTMSG_RESOLVER_RESPONSEMSG_REQUEST_AGPLMSG_RESPONSE_AGPLMSG_ARM_STARTMSG_ARM_STOPMSG_ARM_RESULTMSG_ARM_STATUSMSG_ARM_LISTMSG_ARM_LIST_RESULTMSG_ARM_MONITORMSG_ARM_TESTMSG_HELLO_LEGACYMSG_HELLOMSG_FRAGMENTMSG_FRAGMENT_ACKMSG_WLAN_DATA_TO_HELPERMSG_WLAN_DATA_FROM_HELPERMSG_WLAN_HELPER_CONTROLMSG_WLAN_ADVERTISEMENTMSG_WLAN_DATAMSG_DV_RECVMSG_DV_SENDMSG_DV_SEND_ACKMSG_DV_ROUTEMSG_DV_STARTMSG_DV_CONNECTMSG_DV_DISCONNECTMSG_DV_SEND_NACKMSG_DV_DISTANCE_CHANGEDMSG_DV_BOXMSG_TRANSPORT_XU_MESSAGEMSG_TRANSPORT_UDP_MESSAGEMSG_TRANSPORT_UDP_ACKMSG_TRANSPORT_TCP_NAT_PROBEMSG_TRANSPORT_TCP_WELCOMEMSG_TRANSPORT_ATSMSG_NAT_TESTMSG_CORE_INITMSG_CORE_INIT_REPLYMSG_CORE_NOTIFY_CONNECTMSG_CORE_NOTIFY_DISCONNECTMSG_CORE_NOTIFY_STATUS_CHANGEMSG_CORE_NOTIFY_INBOUNDMSG_CORE_NOTIFY_OUTBOUNDMSG_CORE_SEND_REQUESTMSG_CORE_SEND_READYMSG_CORE_SENDMSG_CORE_MONITOR_PEERSMSG_CORE_MONITOR_NOTIFYMSG_CORE_ENCRYPTED_MESSAGEMSG_CORE_PINGMSG_CORE_PONGMSG_CORE_HANGUPMSG_CORE_COMPRESSED_TYPE_MAPMSG_CORE_BINARY_TYPE_MAPMSG_CORE_EPHEMERAL_KEYMSG_CORE_CONFIRM_TYPE_MAPMSG_DATASTORE_RESERVEMSG_DATASTORE_RELEASE_RESERVEMSG_DATASTORE_STATUSMSG_DATASTORE_PUTMSG_DATASTORE_GETMSG_DATASTORE_GET_REPLICATIONMSG_DATASTORE_GET_ZERO_ANONYMITYMSG_DATASTORE_DATAMSG_DATASTORE_DATA_ENDMSG_DATASTORE_REMOVEMSG_DATASTORE_DROPMSG_DATASTORE_GET_KEYMSG_FS_REQUEST_LOC_SIGNMSG_FS_REQUEST_LOC_SIGNATUREMSG_FS_INDEX_STARTMSG_FS_INDEX_START_OKMSG_FS_INDEX_START_FAILEDMSG_FS_INDEX_LIST_GETMSG_FS_INDEX_LIST_ENTRYMSG_FS_INDEX_LIST_ENDMSG_FS_UNINDEXMSG_FS_UNINDEX_OKMSG_FS_START_SEARCHMSG_FS_GETMSG_FS_PUTMSG_FS_MIGRATION_STOPMSG_FS_CADET_QUERYMSG_FS_CADET_REPLYMSG_DHT_CLIENT_PUTMSG_DHT_CLIENT_GETMSG_DHT_CLIENT_GET_STOPMSG_DHT_CLIENT_RESULTMSG_DHT_P2P_PUTMSG_DHT_P2P_GETMSG_DHT_P2P_RESULTMSG_DHT_MONITOR_GETMSG_DHT_MONITOR_GET_RESPMSG_DHT_MONITOR_PUTMSG_DHT_MONITOR_PUT_RESPMSG_DHT_MONITOR_STARTMSG_DHT_MONITOR_STOPMSG_DHT_CLIENT_GET_RESULTS_KNOWNMSG_DHT_P2P_HELLOMSG_DHT_COREMSG_DHT_CLIENT_HELLO_URLMSG_HOSTLIST_ADVERTISEMENTMSG_DHT_CLIENT_HELLO_GETMSG_STATISTICS_SETMSG_STATISTICS_GETMSG_STATISTICS_VALUEMSG_STATISTICS_ENDMSG_STATISTICS_WATCHMSG_STATISTICS_WATCH_VALUEMSG_STATISTICS_DISCONNECTMSG_STATISTICS_DISCONNECT_CONFIRMMSG_VPN_HELPERMSG_VPN_ICMP_TO_SERVICEMSG_VPN_ICMP_TO_INTERNETMSG_VPN_ICMP_TO_VPNMSG_VPN_DNS_TO_INTERNETMSG_VPN_DNS_FROM_INTERNETMSG_VPN_TCP_TO_SERVICE_STARTMSG_VPN_TCP_TO_INTERNET_STARTMSG_VPN_TCP_DATA_TO_EXITMSG_VPN_TCP_DATA_TO_VPNMSG_VPN_UDP_TO_SERVICEMSG_VPN_UDP_TO_INTERNETMSG_VPN_UDP_REPLYMSG_VPN_CLIENT_REDIRECT_TO_IPMSG_VPN_CLIENT_REDIRECT_TO_SERVICEMSG_VPN_CLIENT_USE_IPMSG_DNS_CLIENT_INITMSG_DNS_CLIENT_REQUESTMSG_DNS_CLIENT_RESPONSEMSG_DNS_HELPERMSG_CHAT_JOIN_REQUESTMSG_CHAT_JOIN_NOTIFICATIONMSG_CHAT_LEAVE_NOTIFICATIONMSG_CHAT_MESSAGE_NOTIFICATIONMSG_CHAT_TRANSMIT_REQUESTMSG_CHAT_CONFIRMATION_RECEIPTMSG_CHAT_CONFIRMATION_NOTIFICATIONMSG_CHAT_P2P_JOIN_NOTIFICATIONMSG_CHAT_P2P_LEAVE_NOTIFICATIONMSG_CHAT_P2P_SYNC_REQUESTMSG_CHAT_P2P_MESSAGE_NOTIFICATIONMSG_CHAT_P2P_CONFIRMATION_RECEIPTMSG_NSE_STARTMSG_NSE_P2P_FLOODMSG_NSE_ESTIMATEMSG_PEERINFO_GETMSG_PEERINFO_GET_ALLMSG_PEERINFO_INFOMSG_PEERINFO_INFO_ENDMSG_PEERINFO_NOTIFYMSG_ATS_STARTMSG_ATS_REQUEST_ADDRESSMSG_ATS_REQUEST_ADDRESS_CANCELMSG_ATS_ADDRESS_UPDATEMSG_ATS_ADDRESS_DESTROYEDMSG_ATS_ADDRESS_SUGGESTIONMSG_ATS_PEER_INFORMATIONMSG_ATS_RESERVATION_REQUESTMSG_ATS_RESERVATION_RESULTMSG_ATS_PREFERENCE_CHANGEMSG_ATS_SESSION_RELEASEMSG_ATS_ADDRESS_ADDMSG_ATS_ADDRESSLIST_REQUESTMSG_ATS_ADDRESSLIST_RESPONSEMSG_ATS_PREFERENCE_FEEDBACKMSG_TRANSPORT_STARTMSG_TRANSPORT_CONNECTMSG_TRANSPORT_DISCONNECTMSG_TRANSPORT_SENDMSG_TRANSPORT_SEND_OKMSG_TRANSPORT_RECVMSG_TRANSPORT_SET_QUOTAMSG_TRANSPORT_ADDRESS_TO_STRINGMSG_TRANSPORT_ADDRESS_TO_STRING_REPLYMSG_TRANSPORT_BLACKLIST_INITMSG_TRANSPORT_BLACKLIST_QUERYMSG_TRANSPORT_BLACKLIST_REPLYMSG_TRANSPORT_PINGMSG_TRANSPORT_PONGMSG_TRANSPORT_SESSION_SYNMSG_TRANSPORT_SESSION_SYN_ACKMSG_TRANSPORT_SESSION_ACKMSG_TRANSPORT_SESSION_DISCONNECTMSG_TRANSPORT_SESSION_QUOTAMSG_TRANSPORT_MONITOR_PEER_REQUESTMSG_TRANSPORT_SESSION_KEEPALIVEMSG_TRANSPORT_SESSION_KEEPALIVE_RESPONSEMSG_TRANSPORT_MONITOR_PEER_RESPONSEMSG_TRANSPORT_BROADCAST_BEACONMSG_TRANSPORT_TRAFFIC_METRICMSG_TRANSPORT_MONITOR_PLUGIN_STARTMSG_TRANSPORT_MONITOR_PLUGIN_EVENTMSG_TRANSPORT_MONITOR_PLUGIN_SYNCMSG_TRANSPORT_MONITOR_PEER_RESPONSE_ENDMSG_FS_PUBLISH_HELPER_PROGRESS_FILEMSG_FS_PUBLISH_HELPER_PROGRESS_DIRECTORYMSG_FS_PUBLISH_HELPER_ERRORMSG_FS_PUBLISH_HELPER_SKIP_FILEMSG_FS_PUBLISH_HELPER_COUNTING_DONEMSG_FS_PUBLISH_HELPER_META_DATAMSG_FS_PUBLISH_HELPER_FINISHEDMSG_NAMECACHE_LOOKUP_BLOCKMSG_NAMECACHE_LOOKUP_BLOCK_RESPONSEMSG_NAMECACHE_BLOCK_CACHEMSG_NAMECACHE_BLOCK_CACHE_RESPONSEMSG_NAMESTORE_RECORD_STOREMSG_NAMESTORE_RECORD_STORE_RESPONSEMSG_NAMESTORE_RECORD_LOOKUPMSG_NAMESTORE_RECORD_LOOKUP_RESPONSEMSG_NAMESTORE_ZONE_TO_NAMEMSG_NAMESTORE_ZONE_TO_NAME_RESPONSEMSG_NAMESTORE_MONITOR_STARTMSG_NAMESTORE_MONITOR_SYNCMSG_NAMESTORE_RECORD_RESULTMSG_NAMESTORE_MONITOR_NEXTMSG_NAMESTORE_ZONE_ITERATION_STARTMSG_NAMESTORE_ZONE_ITERATION_NEXTMSG_NAMESTORE_ZONE_ITERATION_STOPMSG_TESTBED_INITMSG_TESTBED_ADD_HOSTMSG_TESTBED_ADD_HOST_SUCCESSMSG_TESTBED_LINK_CONTROLLERSMSG_TESTBED_CREATE_PEERMSG_TESTBED_RECONFIGURE_PEERMSG_TESTBED_START_PEERMSG_TESTBED_STOP_PEERMSG_TESTBED_DESTROY_PEERMSG_TESTBED_CONFIGURE_UNDERLAY_LINKMSG_TESTBED_OVERLAY_CONNECTMSG_TESTBED_PEER_EVENTMSG_TESTBED_PEER_CONNECT_EVENTMSG_TESTBED_OPERATION_FAIL_EVENTMSG_TESTBED_CREATE_PEER_SUCCESSMSG_TESTBED_GENERIC_OPERATION_SUCCESSMSG_TESTBED_GET_PEER_INFORMATIONMSG_TESTBED_PEER_INFORMATIONMSG_TESTBED_REMOTE_OVERLAY_CONNECTMSG_TESTBED_GET_SLAVE_CONFIGURATIONMSG_TESTBED_SLAVE_CONFIGURATIONMSG_TESTBED_LINK_CONTROLLERS_RESULTMSG_TESTBED_SHUTDOWN_PEERSMSG_TESTBED_MANAGE_PEER_SERVICEMSG_TESTBED_BARRIER_INITMSG_TESTBED_BARRIER_CANCELMSG_TESTBED_BARRIER_STATUSMSG_TESTBED_BARRIER_WAITMSG_TESTBED_MAXMSG_TESTBED_HELPER_INITMSG_TESTBED_HELPER_REPLYMSG_GNS_LOOKUPMSG_GNS_LOOKUP_RESULTMSG_GNS_REVERSE_LOOKUPMSG_GNS_REVERSE_LOOKUP_RESULTMSG_CONSENSUS_CLIENT_JOINMSG_CONSENSUS_CLIENT_INSERTMSG_CONSENSUS_CLIENT_BEGINMSG_CONSENSUS_CLIENT_RECEIVED_ELEMENTMSG_CONSENSUS_CLIENT_CONCLUDEMSG_CONSENSUS_CLIENT_CONCLUDE_DONEMSG_CONSENSUS_CLIENT_ACKMSG_CONSENSUS_P2P_DELTA_ESTIMATEMSG_CONSENSUS_P2P_DIFFERENCE_DIGESTMSG_CONSENSUS_P2P_ELEMENTSMSG_CONSENSUS_P2P_ELEMENTS_REQUESTMSG_CONSENSUS_P2P_ELEMENTS_REPORTMSG_CONSENSUS_P2P_HELLOMSG_CONSENSUS_P2P_SYNCEDMSG_CONSENSUS_P2P_FINMSG_SET_UNION_P2P_REQUEST_FULLMSG_SET_UNION_P2P_DEMANDMSG_SET_UNION_P2P_INQUIRYMSG_SET_UNION_P2P_OFFERMSG_SET_REJECTMSG_SET_CANCELMSG_SET_ITER_ACKMSG_SET_RESULTMSG_SET_ADDMSG_SET_REMOVEMSG_SET_LISTENMSG_SET_ACCEPTMSG_SET_EVALUATEMSG_SET_CONCLUDEMSG_SET_REQUESTMSG_SET_CREATEMSG_SET_P2P_OPERATION_REQUESTMSG_SET_UNION_P2P_SEMSG_SET_UNION_P2P_IBFMSG_SET_P2P_ELEMENTSMSG_SET_P2P_ELEMENT_REQUESTSMSG_SET_UNION_P2P_DONEMSG_SET_ITER_REQUESTMSG_SET_ITER_ELEMENTMSG_SET_ITER_DONEMSG_SET_UNION_P2P_SECMSG_SET_INTERSECTION_P2P_ELEMENT_INFOMSG_SET_INTERSECTION_P2P_BFMSG_SET_INTERSECTION_P2P_DONEMSG_SET_COPY_LAZY_PREPAREMSG_SET_COPY_LAZY_RESPONSEMSG_SET_COPY_LAZY_CONNECTMSG_SET_UNION_P2P_FULL_DONEMSG_SET_UNION_P2P_FULL_ELEMENTMSG_SET_UNION_P2P_OVERMSG_TESTBED_LOGGER_MSGMSG_TESTBED_LOGGER_ACKMSG_REGEX_ANNOUNCEMSG_REGEX_SEARCHMSG_REGEX_RESULTMSG_IDENTITY_STARTMSG_IDENTITY_RESULT_CODEMSG_IDENTITY_UPDATEMSG_IDENTITY_GET_DEFAULTMSG_IDENTITY_SET_DEFAULTMSG_IDENTITY_CREATEMSG_IDENTITY_RENAMEMSG_IDENTITY_DELETEMSG_IDENTITY_LOOKUPMSG_IDENTITY_LOOKUP_BY_NAMEMSG_REVOCATION_QUERYMSG_REVOCATION_QUERY_RESPONSEMSG_REVOCATION_REVOKEMSG_REVOCATION_REVOKE_RESPONSEMSG_SCALARPRODUCT_CLIENT_TO_ALICEMSG_SCALARPRODUCT_CLIENT_TO_BOBMSG_SCALARPRODUCT_CLIENT_MULTIPART_ALICEMSG_SCALARPRODUCT_CLIENT_MULTIPART_BOBMSG_SCALARPRODUCT_SESSION_INITIALIZATIONMSG_SCALARPRODUCT_ALICE_CRYPTODATAMSG_SCALARPRODUCT_BOB_CRYPTODATAMSG_SCALARPRODUCT_BOB_CRYPTODATA_MULTIPARTMSG_SCALARPRODUCT_RESULTMSG_SCALARPRODUCT_ECC_SESSION_INITIALIZATIONMSG_SCALARPRODUCT_ECC_ALICE_CRYPTODATAMSG_SCALARPRODUCT_ECC_BOB_CRYPTODATAMSG_PSYCSTORE_MEMBERSHIP_STOREMSG_PSYCSTORE_MEMBERSHIP_TESTMSG_PSYCSTORE_FRAGMENT_STOREMSG_PSYCSTORE_FRAGMENT_GETMSG_PSYCSTORE_MESSAGE_GETMSG_PSYCSTORE_MESSAGE_GET_FRAGMENTMSG_PSYCSTORE_COUNTERS_GETMSG_PSYCSTORE_STATE_MODIFYMSG_PSYCSTORE_STATE_SYNCMSG_PSYCSTORE_STATE_RESETMSG_PSYCSTORE_STATE_HASH_UPDATEMSG_PSYCSTORE_STATE_GETMSG_PSYCSTORE_STATE_GET_PREFIXMSG_PSYCSTORE_RESULT_CODEMSG_PSYCSTORE_RESULT_FRAGMENTMSG_PSYCSTORE_RESULT_COUNTERSMSG_PSYCSTORE_RESULT_STATEMSG_PSYC_RESULT_CODEMSG_PSYC_MASTER_STARTMSG_PSYC_MASTER_START_ACKMSG_PSYC_SLAVE_JOINMSG_PSYC_SLAVE_JOIN_ACKMSG_PSYC_PART_REQUESTMSG_PSYC_PART_ACKMSG_PSYC_JOIN_REQUESTMSG_PSYC_JOIN_DECISIONMSG_PSYC_CHANNEL_MEMBERSHIP_STOREMSG_PSYC_MESSAGEMSG_PSYC_MESSAGE_HEADERMSG_PSYC_MESSAGE_METHODMSG_PSYC_MESSAGE_MODIFIERMSG_PSYC_MESSAGE_MOD_CONTMSG_PSYC_MESSAGE_DATAMSG_PSYC_MESSAGE_ENDMSG_PSYC_MESSAGE_CANCELMSG_PSYC_MESSAGE_ACKMSG_PSYC_HISTORY_REPLAYMSG_PSYC_HISTORY_RESULTMSG_PSYC_STATE_GETMSG_PSYC_STATE_GET_PREFIXMSG_PSYC_STATE_RESULTMSG_CONVERSATION_AUDIOMSG_CONVERSATION_CS_PHONE_REGISTERMSG_CONVERSATION_CS_PHONE_PICK_UPMSG_CONVERSATION_CS_PHONE_HANG_UPMSG_CONVERSATION_CS_PHONE_CALLMSG_CONVERSATION_CS_PHONE_RINGMSG_CONVERSATION_CS_PHONE_SUSPENDMSG_CONVERSATION_CS_PHONE_RESUMEMSG_CONVERSATION_CS_PHONE_PICKED_UPMSG_CONVERSATION_CS_AUDIOMSG_CONVERSATION_CADET_PHONE_RINGMSG_CONVERSATION_CADET_PHONE_HANG_UPMSG_CONVERSATION_CADET_PHONE_PICK_UPMSG_CONVERSATION_CADET_PHONE_SUSPENDMSG_CONVERSATION_CADET_PHONE_RESUMEMSG_CONVERSATION_CADET_AUDIOMSG_MULTICAST_ORIGIN_STARTMSG_MULTICAST_MEMBER_JOINMSG_MULTICAST_JOIN_REQUESTMSG_MULTICAST_JOIN_DECISIONMSG_MULTICAST_PART_REQUESTMSG_MULTICAST_PART_ACKMSG_MULTICAST_GROUP_ENDMSG_MULTICAST_MESSAGEMSG_MULTICAST_REQUESTMSG_MULTICAST_FRAGMENT_ACKMSG_MULTICAST_REPLAY_REQUESTMSG_MULTICAST_REPLAY_RESPONSEMSG_MULTICAST_REPLAY_RESPONSE_ENDMSG_SECRETSHARING_CLIENT_GENERATEMSG_SECRETSHARING_CLIENT_DECRYPTMSG_SECRETSHARING_CLIENT_DECRYPT_DONEMSG_SECRETSHARING_CLIENT_SECRET_READYMSG_PEERSTORE_STOREMSG_PEERSTORE_ITERATEMSG_PEERSTORE_ITERATE_RECORDMSG_PEERSTORE_ITERATE_ENDMSG_PEERSTORE_WATCHMSG_PEERSTORE_WATCH_RECORDMSG_PEERSTORE_WATCH_CANCELMSG_SOCIAL_RESULT_CODEMSG_SOCIAL_HOST_ENTERMSG_SOCIAL_HOST_ENTER_ACKMSG_SOCIAL_GUEST_ENTERMSG_SOCIAL_GUEST_ENTER_BY_NAMEMSG_SOCIAL_GUEST_ENTER_ACKMSG_SOCIAL_ENTRY_REQUESTMSG_SOCIAL_ENTRY_DECISIONMSG_SOCIAL_PLACE_LEAVEMSG_SOCIAL_PLACE_LEAVE_ACKMSG_SOCIAL_ZONE_ADD_PLACEMSG_SOCIAL_ZONE_ADD_NYMMSG_SOCIAL_APP_CONNECTMSG_SOCIAL_APP_DETACHMSG_SOCIAL_APP_EGOMSG_SOCIAL_APP_EGO_ENDMSG_SOCIAL_APP_PLACEMSG_SOCIAL_APP_PLACE_ENDMSG_SOCIAL_MSG_PROC_SETMSG_SOCIAL_MSG_PROC_CLEARMSG_XDHT_P2P_TRAIL_SETUPMSG_XDHT_P2P_TRAIL_SETUP_RESULTMSG_XDHT_P2P_VERIFY_SUCCESSORMSG_XDHT_P2P_NOTIFY_NEW_SUCCESSORMSG_XDHT_P2P_VERIFY_SUCCESSOR_RESULTMSG_XDHT_P2P_GET_RESULTMSG_XDHT_P2P_TRAIL_SETUP_REJECTIONMSG_XDHT_P2P_TRAIL_TEARDOWNMSG_XDHT_P2P_ADD_TRAILMSG_XDHT_P2P_PUTMSG_XDHT_P2P_GETMSG_XDHT_P2P_NOTIFY_SUCCESSOR_CONFIRMATIONMSG_DHT_ACT_MALICIOUSMSG_DHT_CLIENT_ACT_MALICIOUS_OKMSG_WDHT_RANDOM_WALKMSG_WDHT_RANDOM_WALK_RESPONSEMSG_WDHT_TRAIL_DESTROYMSG_WDHT_TRAIL_ROUTEMSG_WDHT_SUCCESSOR_FINDMSG_WDHT_GETMSG_WDHT_PUTMSG_WDHT_GET_RESULTMSG_RPS_PP_CHECK_LIVEMSG_RPS_PP_PUSHMSG_RPS_PP_PULL_REQUESTMSG_RPS_PP_PULL_REPLYMSG_RPS_CS_SEEDMSG_RPS_ACT_MALICIOUSMSG_RPS_CS_SUB_STARTMSG_RPS_CS_SUB_STOPMSG_RECLAIM_ATTRIBUTE_STOREMSG_RECLAIM_SUCCESS_RESPONSEMSG_RECLAIM_ATTRIBUTE_ITERATION_STARTMSG_RECLAIM_ATTRIBUTE_ITERATION_STOPMSG_RECLAIM_ATTRIBUTE_ITERATION_NEXTMSG_RECLAIM_ATTRIBUTE_RESULTMSG_RECLAIM_ISSUE_TICKETMSG_RECLAIM_TICKET_RESULTMSG_RECLAIM_REVOKE_TICKETMSG_RECLAIM_REVOKE_TICKET_RESULTMSG_RECLAIM_CONSUME_TICKETMSG_RECLAIM_CONSUME_TICKET_RESULTMSG_RECLAIM_TICKET_ITERATION_STARTMSG_RECLAIM_TICKET_ITERATION_STOPMSG_RECLAIM_TICKET_ITERATION_NEXTMSG_RECLAIM_ATTRIBUTE_DELETEMSG_CREDENTIAL_VERIFYMSG_CREDENTIAL_VERIFY_RESULTMSG_CREDENTIAL_COLLECTMSG_CREDENTIAL_COLLECT_RESULTMSG_CADET_CONNECTION_CREATEMSG_CADET_CONNECTION_CREATE_ACKMSG_CADET_CONNECTION_BROKENMSG_CADET_CONNECTION_DESTROYMSG_CADET_CONNECTION_PATH_CHANGED_UNIMPLEMENTEDMSG_CADET_CONNECTION_HOP_BY_HOP_ENCRYPTED_ACKMSG_CADET_TUNNEL_ENCRYPTED_POLLMSG_CADET_TUNNEL_KXMSG_CADET_TUNNEL_ENCRYPTEDMSG_CADET_TUNNEL_KX_AUTHMSG_CADET_CHANNEL_APP_DATAMSG_CADET_CHANNEL_APP_DATA_ACKMSG_CADET_CHANNEL_KEEPALIVEMSG_CADET_CHANNEL_OPENMSG_CADET_CHANNEL_DESTROYMSG_CADET_CHANNEL_OPEN_ACKMSG_CADET_CHANNEL_OPEN_NACK_DEPRECATEDMSG_CADET_LOCAL_DATAMSG_CADET_LOCAL_ACKMSG_CADET_LOCAL_PORT_OPENMSG_CADET_LOCAL_PORT_CLOSEMSG_CADET_LOCAL_CHANNEL_CREATEMSG_CADET_LOCAL_CHANNEL_DESTROYMSG_CADET_LOCAL_REQUEST_INFO_CHANNELMSG_CADET_LOCAL_INFO_CHANNELMSG_CADET_LOCAL_INFO_CHANNEL_ENDMSG_CADET_LOCAL_REQUEST_INFO_PEERSMSG_CADET_LOCAL_INFO_PEERSMSG_CADET_LOCAL_INFO_PEERS_ENDMSG_CADET_LOCAL_REQUEST_INFO_PATHMSG_CADET_LOCAL_INFO_PATHMSG_CADET_LOCAL_INFO_PATH_ENDMSG_CADET_LOCAL_REQUEST_INFO_TUNNELSMSG_CADET_LOCAL_INFO_TUNNELSMSG_CADET_LOCAL_INFO_TUNNELS_ENDMSG_CADET_CLIMSG_NAT_REGISTERMSG_NAT_HANDLE_STUNMSG_NAT_REQUEST_CONNECTION_REVERSALMSG_NAT_CONNECTION_REVERSAL_REQUESTEDMSG_NAT_ADDRESS_CHANGEMSG_NAT_AUTO_CFG_RESULTMSG_NAT_AUTO_REQUEST_CFGMSG_AUCTION_CLIENT_CREATEMSG_AUCTION_CLIENT_JOINMSG_AUCTION_CLIENT_OUTCOMEMSG_RPS_CS_DEBUG_VIEW_REQUESTMSG_RPS_CS_DEBUG_VIEW_REPLYMSG_RPS_CS_DEBUG_VIEW_CANCELMSG_RPS_CS_DEBUG_STREAM_REQUESTMSG_RPS_CS_DEBUG_STREAM_REPLYMSG_RPS_CS_DEBUG_STREAM_CANCELMSG_ALL"
+
+var _MsgType_map = map[MsgType]string{
+ 1: _MsgType_name[0:8],
+ 2: _MsgType_name[8:17],
+ 3: _MsgType_name[17:27],
+ 4: _MsgType_name[27:47],
+ 5: _MsgType_name[47:68],
+ 6: _MsgType_name[68:84],
+ 7: _MsgType_name[84:101],
+ 8: _MsgType_name[101:114],
+ 9: _MsgType_name[114:126],
+ 10: _MsgType_name[126:140],
+ 11: _MsgType_name[140:154],
+ 12: _MsgType_name[154:166],
+ 13: _MsgType_name[166:185],
+ 14: _MsgType_name[185:200],
+ 15: _MsgType_name[200:212],
+ 16: _MsgType_name[212:228],
+ 17: _MsgType_name[228:237],
+ 18: _MsgType_name[237:249],
+ 19: _MsgType_name[249:265],
+ 39: _MsgType_name[265:288],
+ 40: _MsgType_name[288:313],
+ 41: _MsgType_name[313:336],
+ 42: _MsgType_name[336:358],
+ 43: _MsgType_name[358:371],
+ 44: _MsgType_name[371:382],
+ 45: _MsgType_name[382:393],
+ 46: _MsgType_name[393:408],
+ 47: _MsgType_name[408:420],
+ 48: _MsgType_name[420:432],
+ 49: _MsgType_name[432:446],
+ 50: _MsgType_name[446:463],
+ 51: _MsgType_name[463:479],
+ 52: _MsgType_name[479:502],
+ 53: _MsgType_name[502:512],
+ 55: _MsgType_name[512:536],
+ 56: _MsgType_name[536:561],
+ 57: _MsgType_name[561:582],
+ 60: _MsgType_name[582:609],
+ 61: _MsgType_name[609:634],
+ 62: _MsgType_name[634:651],
+ 63: _MsgType_name[651:663],
+ 64: _MsgType_name[663:676],
+ 65: _MsgType_name[676:695],
+ 67: _MsgType_name[695:718],
+ 68: _MsgType_name[718:744],
+ 69: _MsgType_name[744:773],
+ 70: _MsgType_name[773:796],
+ 71: _MsgType_name[796:820],
+ 74: _MsgType_name[820:841],
+ 75: _MsgType_name[841:860],
+ 76: _MsgType_name[860:873],
+ 78: _MsgType_name[873:895],
+ 79: _MsgType_name[895:918],
+ 82: _MsgType_name[918:944],
+ 83: _MsgType_name[944:957],
+ 84: _MsgType_name[957:970],
+ 85: _MsgType_name[970:985],
+ 86: _MsgType_name[985:1013],
+ 87: _MsgType_name[1013:1037],
+ 88: _MsgType_name[1037:1059],
+ 89: _MsgType_name[1059:1084],
+ 92: _MsgType_name[1084:1105],
+ 93: _MsgType_name[1105:1134],
+ 94: _MsgType_name[1134:1154],
+ 95: _MsgType_name[1154:1171],
+ 97: _MsgType_name[1171:1188],
+ 98: _MsgType_name[1188:1217],
+ 99: _MsgType_name[1217:1249],
+ 100: _MsgType_name[1249:1267],
+ 101: _MsgType_name[1267:1289],
+ 102: _MsgType_name[1289:1309],
+ 103: _MsgType_name[1309:1327],
+ 104: _MsgType_name[1327:1348],
+ 126: _MsgType_name[1348:1371],
+ 127: _MsgType_name[1371:1399],
+ 128: _MsgType_name[1399:1417],
+ 129: _MsgType_name[1417:1438],
+ 130: _MsgType_name[1438:1463],
+ 131: _MsgType_name[1463:1484],
+ 132: _MsgType_name[1484:1507],
+ 133: _MsgType_name[1507:1528],
+ 134: _MsgType_name[1528:1542],
+ 135: _MsgType_name[1542:1559],
+ 136: _MsgType_name[1559:1578],
+ 137: _MsgType_name[1578:1588],
+ 138: _MsgType_name[1588:1598],
+ 139: _MsgType_name[1598:1619],
+ 140: _MsgType_name[1619:1637],
+ 141: _MsgType_name[1637:1655],
+ 142: _MsgType_name[1655:1673],
+ 143: _MsgType_name[1673:1691],
+ 144: _MsgType_name[1691:1714],
+ 145: _MsgType_name[1714:1735],
+ 146: _MsgType_name[1735:1750],
+ 147: _MsgType_name[1750:1765],
+ 148: _MsgType_name[1765:1783],
+ 149: _MsgType_name[1783:1802],
+ 150: _MsgType_name[1802:1826],
+ 151: _MsgType_name[1826:1845],
+ 152: _MsgType_name[1845:1869],
+ 153: _MsgType_name[1869:1890],
+ 154: _MsgType_name[1890:1910],
+ 156: _MsgType_name[1910:1942],
+ 157: _MsgType_name[1942:1959],
+ 158: _MsgType_name[1959:1971],
+ 159: _MsgType_name[1971:1995],
+ 160: _MsgType_name[1995:2021],
+ 161: _MsgType_name[2021:2045],
+ 168: _MsgType_name[2045:2063],
+ 169: _MsgType_name[2063:2081],
+ 170: _MsgType_name[2081:2101],
+ 171: _MsgType_name[2101:2119],
+ 172: _MsgType_name[2119:2139],
+ 173: _MsgType_name[2139:2165],
+ 174: _MsgType_name[2165:2190],
+ 175: _MsgType_name[2190:2223],
+ 185: _MsgType_name[2223:2237],
+ 190: _MsgType_name[2237:2260],
+ 191: _MsgType_name[2260:2284],
+ 192: _MsgType_name[2284:2303],
+ 193: _MsgType_name[2303:2326],
+ 194: _MsgType_name[2326:2351],
+ 195: _MsgType_name[2351:2379],
+ 196: _MsgType_name[2379:2408],
+ 197: _MsgType_name[2408:2432],
+ 198: _MsgType_name[2432:2455],
+ 199: _MsgType_name[2455:2477],
+ 200: _MsgType_name[2477:2500],
+ 201: _MsgType_name[2500:2517],
+ 202: _MsgType_name[2517:2546],
+ 203: _MsgType_name[2546:2580],
+ 204: _MsgType_name[2580:2601],
+ 211: _MsgType_name[2601:2620],
+ 212: _MsgType_name[2620:2642],
+ 213: _MsgType_name[2642:2665],
+ 214: _MsgType_name[2665:2679],
+ 300: _MsgType_name[2679:2700],
+ 301: _MsgType_name[2700:2726],
+ 302: _MsgType_name[2726:2753],
+ 303: _MsgType_name[2753:2782],
+ 304: _MsgType_name[2782:2807],
+ 305: _MsgType_name[2807:2836],
+ 306: _MsgType_name[2836:2870],
+ 307: _MsgType_name[2870:2900],
+ 308: _MsgType_name[2900:2931],
+ 309: _MsgType_name[2931:2956],
+ 310: _MsgType_name[2956:2989],
+ 311: _MsgType_name[2989:3022],
+ 321: _MsgType_name[3022:3035],
+ 322: _MsgType_name[3035:3052],
+ 323: _MsgType_name[3052:3068],
+ 330: _MsgType_name[3068:3084],
+ 331: _MsgType_name[3084:3104],
+ 332: _MsgType_name[3104:3121],
+ 333: _MsgType_name[3121:3142],
+ 334: _MsgType_name[3142:3161],
+ 340: _MsgType_name[3161:3174],
+ 341: _MsgType_name[3174:3197],
+ 342: _MsgType_name[3197:3227],
+ 343: _MsgType_name[3227:3249],
+ 344: _MsgType_name[3249:3274],
+ 345: _MsgType_name[3274:3300],
+ 346: _MsgType_name[3300:3324],
+ 347: _MsgType_name[3324:3351],
+ 348: _MsgType_name[3351:3377],
+ 349: _MsgType_name[3377:3402],
+ 350: _MsgType_name[3402:3425],
+ 353: _MsgType_name[3425:3444],
+ 354: _MsgType_name[3444:3471],
+ 355: _MsgType_name[3471:3499],
+ 356: _MsgType_name[3499:3526],
+ 360: _MsgType_name[3526:3545],
+ 361: _MsgType_name[3545:3566],
+ 362: _MsgType_name[3566:3590],
+ 363: _MsgType_name[3590:3608],
+ 364: _MsgType_name[3608:3629],
+ 365: _MsgType_name[3629:3647],
+ 366: _MsgType_name[3647:3670],
+ 367: _MsgType_name[3670:3701],
+ 368: _MsgType_name[3701:3738],
+ 369: _MsgType_name[3738:3766],
+ 370: _MsgType_name[3766:3795],
+ 371: _MsgType_name[3795:3824],
+ 372: _MsgType_name[3824:3842],
+ 373: _MsgType_name[3842:3860],
+ 375: _MsgType_name[3860:3885],
+ 376: _MsgType_name[3885:3914],
+ 377: _MsgType_name[3914:3939],
+ 378: _MsgType_name[3939:3971],
+ 379: _MsgType_name[3971:3998],
+ 380: _MsgType_name[3998:4032],
+ 381: _MsgType_name[4032:4063],
+ 382: _MsgType_name[4063:4103],
+ 383: _MsgType_name[4103:4138],
+ 384: _MsgType_name[4138:4168],
+ 385: _MsgType_name[4168:4196],
+ 388: _MsgType_name[4196:4230],
+ 389: _MsgType_name[4230:4264],
+ 390: _MsgType_name[4264:4297],
+ 391: _MsgType_name[4297:4336],
+ 420: _MsgType_name[4336:4371],
+ 421: _MsgType_name[4371:4411],
+ 422: _MsgType_name[4411:4438],
+ 423: _MsgType_name[4438:4469],
+ 424: _MsgType_name[4469:4504],
+ 425: _MsgType_name[4504:4535],
+ 426: _MsgType_name[4535:4565],
+ 431: _MsgType_name[4565:4591],
+ 432: _MsgType_name[4591:4626],
+ 433: _MsgType_name[4626:4651],
+ 434: _MsgType_name[4651:4685],
+ 435: _MsgType_name[4685:4711],
+ 436: _MsgType_name[4711:4746],
+ 437: _MsgType_name[4746:4773],
+ 438: _MsgType_name[4773:4809],
+ 439: _MsgType_name[4809:4835],
+ 440: _MsgType_name[4835:4870],
+ 441: _MsgType_name[4870:4897],
+ 442: _MsgType_name[4897:4923],
+ 443: _MsgType_name[4923:4950],
+ 444: _MsgType_name[4950:4976],
+ 445: _MsgType_name[4976:5010],
+ 447: _MsgType_name[5010:5043],
+ 448: _MsgType_name[5043:5076],
+ 460: _MsgType_name[5076:5092],
+ 461: _MsgType_name[5092:5112],
+ 462: _MsgType_name[5112:5140],
+ 463: _MsgType_name[5140:5168],
+ 464: _MsgType_name[5168:5191],
+ 465: _MsgType_name[5191:5219],
+ 466: _MsgType_name[5219:5241],
+ 467: _MsgType_name[5241:5262],
+ 468: _MsgType_name[5262:5286],
+ 469: _MsgType_name[5286:5321],
+ 470: _MsgType_name[5321:5348],
+ 471: _MsgType_name[5348:5370],
+ 472: _MsgType_name[5370:5400],
+ 473: _MsgType_name[5400:5432],
+ 474: _MsgType_name[5432:5463],
+ 475: _MsgType_name[5463:5500],
+ 476: _MsgType_name[5500:5532],
+ 477: _MsgType_name[5532:5560],
+ 478: _MsgType_name[5560:5594],
+ 479: _MsgType_name[5594:5629],
+ 480: _MsgType_name[5629:5660],
+ 481: _MsgType_name[5660:5695],
+ 482: _MsgType_name[5695:5721],
+ 483: _MsgType_name[5721:5752],
+ 484: _MsgType_name[5752:5776],
+ 485: _MsgType_name[5776:5802],
+ 486: _MsgType_name[5802:5828],
+ 487: _MsgType_name[5828:5852],
+ 488: _MsgType_name[5852:5867],
+ 495: _MsgType_name[5867:5890],
+ 496: _MsgType_name[5890:5914],
+ 500: _MsgType_name[5914:5928],
+ 501: _MsgType_name[5928:5949],
+ 502: _MsgType_name[5949:5971],
+ 503: _MsgType_name[5971:6000],
+ 520: _MsgType_name[6000:6025],
+ 521: _MsgType_name[6025:6052],
+ 522: _MsgType_name[6052:6078],
+ 523: _MsgType_name[6078:6115],
+ 524: _MsgType_name[6115:6144],
+ 525: _MsgType_name[6144:6178],
+ 540: _MsgType_name[6178:6202],
+ 541: _MsgType_name[6202:6234],
+ 542: _MsgType_name[6234:6269],
+ 543: _MsgType_name[6269:6295],
+ 544: _MsgType_name[6295:6329],
+ 545: _MsgType_name[6329:6362],
+ 546: _MsgType_name[6362:6385],
+ 547: _MsgType_name[6385:6409],
+ 548: _MsgType_name[6409:6430],
+ 565: _MsgType_name[6430:6460],
+ 566: _MsgType_name[6460:6484],
+ 567: _MsgType_name[6484:6509],
+ 568: _MsgType_name[6509:6532],
+ 569: _MsgType_name[6532:6546],
+ 570: _MsgType_name[6546:6560],
+ 571: _MsgType_name[6560:6576],
+ 572: _MsgType_name[6576:6590],
+ 573: _MsgType_name[6590:6601],
+ 574: _MsgType_name[6601:6615],
+ 575: _MsgType_name[6615:6629],
+ 576: _MsgType_name[6629:6643],
+ 577: _MsgType_name[6643:6659],
+ 578: _MsgType_name[6659:6675],
+ 579: _MsgType_name[6675:6690],
+ 580: _MsgType_name[6690:6704],
+ 581: _MsgType_name[6704:6733],
+ 582: _MsgType_name[6733:6753],
+ 583: _MsgType_name[6753:6774],
+ 584: _MsgType_name[6774:6794],
+ 585: _MsgType_name[6794:6822],
+ 586: _MsgType_name[6822:6844],
+ 587: _MsgType_name[6844:6864],
+ 588: _MsgType_name[6864:6884],
+ 589: _MsgType_name[6884:6901],
+ 590: _MsgType_name[6901:6922],
+ 591: _MsgType_name[6922:6959],
+ 592: _MsgType_name[6959:6986],
+ 593: _MsgType_name[6986:7015],
+ 594: _MsgType_name[7015:7040],
+ 595: _MsgType_name[7040:7066],
+ 596: _MsgType_name[7066:7091],
+ 597: _MsgType_name[7091:7118],
+ 598: _MsgType_name[7118:7148],
+ 599: _MsgType_name[7148:7170],
+ 600: _MsgType_name[7170:7192],
+ 601: _MsgType_name[7192:7214],
+ 620: _MsgType_name[7214:7232],
+ 621: _MsgType_name[7232:7248],
+ 622: _MsgType_name[7248:7264],
+ 624: _MsgType_name[7264:7282],
+ 625: _MsgType_name[7282:7306],
+ 626: _MsgType_name[7306:7325],
+ 627: _MsgType_name[7325:7349],
+ 628: _MsgType_name[7349:7373],
+ 629: _MsgType_name[7373:7392],
+ 630: _MsgType_name[7392:7411],
+ 631: _MsgType_name[7411:7430],
+ 632: _MsgType_name[7430:7449],
+ 633: _MsgType_name[7449:7476],
+ 636: _MsgType_name[7476:7496],
+ 637: _MsgType_name[7496:7525],
+ 638: _MsgType_name[7525:7546],
+ 639: _MsgType_name[7546:7576],
+ 640: _MsgType_name[7576:7609],
+ 641: _MsgType_name[7609:7640],
+ 642: _MsgType_name[7640:7680],
+ 643: _MsgType_name[7680:7718],
+ 644: _MsgType_name[7718:7758],
+ 645: _MsgType_name[7758:7792],
+ 647: _MsgType_name[7792:7824],
+ 648: _MsgType_name[7824:7866],
+ 649: _MsgType_name[7866:7890],
+ 650: _MsgType_name[7890:7934],
+ 651: _MsgType_name[7934:7972],
+ 652: _MsgType_name[7972:8008],
+ 660: _MsgType_name[8008:8038],
+ 661: _MsgType_name[8038:8067],
+ 662: _MsgType_name[8067:8095],
+ 663: _MsgType_name[8095:8121],
+ 664: _MsgType_name[8121:8146],
+ 665: _MsgType_name[8146:8180],
+ 666: _MsgType_name[8180:8206],
+ 668: _MsgType_name[8206:8232],
+ 669: _MsgType_name[8232:8256],
+ 670: _MsgType_name[8256:8281],
+ 671: _MsgType_name[8281:8312],
+ 672: _MsgType_name[8312:8335],
+ 673: _MsgType_name[8335:8365],
+ 674: _MsgType_name[8365:8390],
+ 675: _MsgType_name[8390:8419],
+ 676: _MsgType_name[8419:8448],
+ 677: _MsgType_name[8448:8474],
+ 680: _MsgType_name[8474:8494],
+ 681: _MsgType_name[8494:8515],
+ 682: _MsgType_name[8515:8540],
+ 683: _MsgType_name[8540:8559],
+ 684: _MsgType_name[8559:8582],
+ 685: _MsgType_name[8582:8603],
+ 686: _MsgType_name[8603:8620],
+ 687: _MsgType_name[8620:8641],
+ 688: _MsgType_name[8641:8663],
+ 689: _MsgType_name[8663:8696],
+ 691: _MsgType_name[8696:8712],
+ 692: _MsgType_name[8712:8735],
+ 693: _MsgType_name[8735:8758],
+ 694: _MsgType_name[8758:8783],
+ 695: _MsgType_name[8783:8808],
+ 696: _MsgType_name[8808:8829],
+ 697: _MsgType_name[8829:8849],
+ 698: _MsgType_name[8849:8872],
+ 699: _MsgType_name[8872:8892],
+ 701: _MsgType_name[8892:8915],
+ 702: _MsgType_name[8915:8938],
+ 703: _MsgType_name[8938:8956],
+ 704: _MsgType_name[8956:8981],
+ 705: _MsgType_name[8981:9002],
+ 730: _MsgType_name[9002:9024],
+ 731: _MsgType_name[9024:9058],
+ 732: _MsgType_name[9058:9091],
+ 733: _MsgType_name[9091:9124],
+ 734: _MsgType_name[9124:9154],
+ 735: _MsgType_name[9154:9184],
+ 736: _MsgType_name[9184:9217],
+ 737: _MsgType_name[9217:9249],
+ 738: _MsgType_name[9249:9284],
+ 739: _MsgType_name[9284:9309],
+ 740: _MsgType_name[9309:9342],
+ 741: _MsgType_name[9342:9378],
+ 742: _MsgType_name[9378:9414],
+ 743: _MsgType_name[9414:9450],
+ 744: _MsgType_name[9450:9485],
+ 745: _MsgType_name[9485:9513],
+ 750: _MsgType_name[9513:9539],
+ 751: _MsgType_name[9539:9564],
+ 752: _MsgType_name[9564:9590],
+ 753: _MsgType_name[9590:9617],
+ 754: _MsgType_name[9617:9643],
+ 755: _MsgType_name[9643:9665],
+ 756: _MsgType_name[9665:9688],
+ 757: _MsgType_name[9688:9709],
+ 758: _MsgType_name[9709:9730],
+ 759: _MsgType_name[9730:9756],
+ 760: _MsgType_name[9756:9784],
+ 761: _MsgType_name[9784:9813],
+ 762: _MsgType_name[9813:9846],
+ 780: _MsgType_name[9846:9879],
+ 781: _MsgType_name[9879:9911],
+ 782: _MsgType_name[9911:9948],
+ 783: _MsgType_name[9948:9985],
+ 820: _MsgType_name[9985:10004],
+ 821: _MsgType_name[10004:10025],
+ 822: _MsgType_name[10025:10053],
+ 823: _MsgType_name[10053:10078],
+ 824: _MsgType_name[10078:10097],
+ 825: _MsgType_name[10097:10123],
+ 826: _MsgType_name[10123:10149],
+ 840: _MsgType_name[10149:10171],
+ 841: _MsgType_name[10171:10192],
+ 842: _MsgType_name[10192:10217],
+ 843: _MsgType_name[10217:10239],
+ 844: _MsgType_name[10239:10269],
+ 845: _MsgType_name[10269:10295],
+ 846: _MsgType_name[10295:10319],
+ 847: _MsgType_name[10319:10344],
+ 848: _MsgType_name[10344:10366],
+ 849: _MsgType_name[10366:10392],
+ 850: _MsgType_name[10392:10417],
+ 851: _MsgType_name[10417:10440],
+ 852: _MsgType_name[10440:10462],
+ 853: _MsgType_name[10462:10483],
+ 854: _MsgType_name[10483:10501],
+ 855: _MsgType_name[10501:10523],
+ 856: _MsgType_name[10523:10543],
+ 857: _MsgType_name[10543:10567],
+ 858: _MsgType_name[10567:10590],
+ 859: _MsgType_name[10590:10615],
+ 880: _MsgType_name[10615:10639],
+ 881: _MsgType_name[10639:10670],
+ 882: _MsgType_name[10670:10699],
+ 883: _MsgType_name[10699:10732],
+ 884: _MsgType_name[10732:10768],
+ 885: _MsgType_name[10768:10791],
+ 886: _MsgType_name[10791:10825],
+ 887: _MsgType_name[10825:10852],
+ 888: _MsgType_name[10852:10874],
+ 890: _MsgType_name[10874:10890],
+ 891: _MsgType_name[10890:10906],
+ 892: _MsgType_name[10906:10948],
+ 893: _MsgType_name[10948:10969],
+ 894: _MsgType_name[10969:11000],
+ 910: _MsgType_name[11000:11020],
+ 911: _MsgType_name[11020:11049],
+ 912: _MsgType_name[11049:11071],
+ 913: _MsgType_name[11071:11091],
+ 914: _MsgType_name[11091:11114],
+ 915: _MsgType_name[11114:11126],
+ 916: _MsgType_name[11126:11138],
+ 917: _MsgType_name[11138:11157],
+ 950: _MsgType_name[11157:11178],
+ 951: _MsgType_name[11178:11193],
+ 952: _MsgType_name[11193:11216],
+ 953: _MsgType_name[11216:11237],
+ 954: _MsgType_name[11237:11252],
+ 955: _MsgType_name[11252:11273],
+ 956: _MsgType_name[11273:11293],
+ 957: _MsgType_name[11293:11312],
+ 961: _MsgType_name[11312:11339],
+ 962: _MsgType_name[11339:11367],
+ 963: _MsgType_name[11367:11404],
+ 964: _MsgType_name[11404:11440],
+ 965: _MsgType_name[11440:11476],
+ 966: _MsgType_name[11476:11504],
+ 967: _MsgType_name[11504:11528],
+ 968: _MsgType_name[11528:11553],
+ 969: _MsgType_name[11553:11578],
+ 970: _MsgType_name[11578:11610],
+ 971: _MsgType_name[11610:11636],
+ 972: _MsgType_name[11636:11669],
+ 973: _MsgType_name[11669:11703],
+ 974: _MsgType_name[11703:11736],
+ 975: _MsgType_name[11736:11769],
+ 976: _MsgType_name[11769:11797],
+ 981: _MsgType_name[11797:11818],
+ 982: _MsgType_name[11818:11846],
+ 983: _MsgType_name[11846:11868],
+ 984: _MsgType_name[11868:11897],
+ 1000: _MsgType_name[11897:11924],
+ 1001: _MsgType_name[11924:11955],
+ 1002: _MsgType_name[11955:11982],
+ 1003: _MsgType_name[11982:12010],
+ 1004: _MsgType_name[12010:12057],
+ 1005: _MsgType_name[12057:12102],
+ 1006: _MsgType_name[12102:12133],
+ 1007: _MsgType_name[12133:12152],
+ 1008: _MsgType_name[12152:12178],
+ 1009: _MsgType_name[12178:12202],
+ 1010: _MsgType_name[12202:12228],
+ 1011: _MsgType_name[12228:12258],
+ 1012: _MsgType_name[12258:12285],
+ 1013: _MsgType_name[12285:12307],
+ 1014: _MsgType_name[12307:12332],
+ 1015: _MsgType_name[12332:12358],
+ 1016: _MsgType_name[12358:12396],
+ 1020: _MsgType_name[12396:12416],
+ 1021: _MsgType_name[12416:12435],
+ 1022: _MsgType_name[12435:12460],
+ 1023: _MsgType_name[12460:12486],
+ 1024: _MsgType_name[12486:12516],
+ 1025: _MsgType_name[12516:12547],
+ 1030: _MsgType_name[12547:12583],
+ 1031: _MsgType_name[12583:12611],
+ 1032: _MsgType_name[12611:12643],
+ 1033: _MsgType_name[12643:12677],
+ 1034: _MsgType_name[12677:12703],
+ 1035: _MsgType_name[12703:12733],
+ 1036: _MsgType_name[12733:12766],
+ 1037: _MsgType_name[12766:12791],
+ 1038: _MsgType_name[12791:12820],
+ 1039: _MsgType_name[12820:12856],
+ 1040: _MsgType_name[12856:12884],
+ 1041: _MsgType_name[12884:12916],
+ 1059: _MsgType_name[12916:12929],
+ 1060: _MsgType_name[12929:12945],
+ 1061: _MsgType_name[12945:12964],
+ 1062: _MsgType_name[12964:12999],
+ 1063: _MsgType_name[12999:13036],
+ 1064: _MsgType_name[13036:13058],
+ 1065: _MsgType_name[13058:13081],
+ 1066: _MsgType_name[13081:13105],
+ 1110: _MsgType_name[13105:13130],
+ 1111: _MsgType_name[13130:13153],
+ 1112: _MsgType_name[13153:13179],
+ 1130: _MsgType_name[13179:13208],
+ 1131: _MsgType_name[13208:13235],
+ 1132: _MsgType_name[13235:13263],
+ 1133: _MsgType_name[13263:13294],
+ 1134: _MsgType_name[13294:13323],
+ 1135: _MsgType_name[13323:13353],
+ 65535: _MsgType_name[13353:13360],
+}
+
+func (i MsgType) String() string {
+ if str, ok := _MsgType_map[i]; ok {
+ return str
+ }
+ return "MsgType(" + strconv.FormatInt(int64(i), 10) + ")"
+}
diff --git a/src/gnunet/go.mod b/src/gnunet/go.mod
@@ -3,7 +3,7 @@ module gnunet
go 1.18
require (
- github.com/bfix/gospel v1.2.18
+ github.com/bfix/gospel v1.2.19
github.com/go-redis/redis/v8 v8.11.5
github.com/go-sql-driver/mysql v1.6.0
github.com/gorilla/mux v1.8.0
@@ -24,4 +24,4 @@ require (
golang.org/x/tools v0.1.11 // indirect
)
-//replace github.com/bfix/gospel v1.2.18 => ../gospel
+// replace github.com/bfix/gospel v1.2.19 => ../gospel
diff --git a/src/gnunet/go.sum b/src/gnunet/go.sum
@@ -1,5 +1,5 @@
-github.com/bfix/gospel v1.2.18 h1:X9hYudt5dvjYTGGmKC4T7qcLdb7ORblVD4kAC/ZYXdU=
-github.com/bfix/gospel v1.2.18/go.mod h1:cdu63bA9ZdfeDoqZ+vnWOcbY9Puwdzmf5DMxMGMznRI=
+github.com/bfix/gospel v1.2.19 h1:B57L5CMjKPeRPtVxt1JcSx42AKwD+SpN32QaF0DxXFM=
+github.com/bfix/gospel v1.2.19/go.mod h1:cdu63bA9ZdfeDoqZ+vnWOcbY9Puwdzmf5DMxMGMznRI=
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
diff --git a/src/gnunet/message/factory.go b/src/gnunet/message/factory.go
@@ -20,95 +20,96 @@ package message
import (
"fmt"
+ "gnunet/enums"
)
// NewEmptyMessage creates a new empty message object for the given type.
-func NewEmptyMessage(msgType uint16) (Message, error) {
+func NewEmptyMessage(msgType enums.MsgType) (Message, error) {
switch msgType {
//------------------------------------------------------------------
// Transport
//------------------------------------------------------------------
- case TRANSPORT_TCP_WELCOME:
+ case enums.MSG_TRANSPORT_TCP_WELCOME:
return NewTransportTCPWelcomeMsg(nil), nil
- case HELLO:
+ case enums.MSG_HELLO:
return NewHelloMsg(nil), nil
- case TRANSPORT_SESSION_QUOTA:
+ case enums.MSG_TRANSPORT_SESSION_QUOTA:
return NewSessionQuotaMsg(0), nil
- case TRANSPORT_SESSION_SYN:
+ case enums.MSG_TRANSPORT_SESSION_SYN:
return NewSessionSynMsg(), nil
- case TRANSPORT_SESSION_SYN_ACK:
+ case enums.MSG_TRANSPORT_SESSION_SYN_ACK:
return NewSessionSynAckMsg(), nil
- case TRANSPORT_SESSION_ACK:
+ case enums.MSG_TRANSPORT_SESSION_ACK:
return new(SessionAckMsg), nil
- case TRANSPORT_PING:
+ case enums.MSG_TRANSPORT_PING:
return NewTransportPingMsg(nil, nil), nil
- case TRANSPORT_PONG:
+ case enums.MSG_TRANSPORT_PONG:
return NewTransportPongMsg(0, nil), nil
- case TRANSPORT_SESSION_KEEPALIVE:
+ case enums.MSG_TRANSPORT_SESSION_KEEPALIVE:
return NewSessionKeepAliveMsg(), nil
//------------------------------------------------------------------
// Core
//------------------------------------------------------------------
- case CORE_EPHEMERAL_KEY:
+ case enums.MSG_CORE_EPHEMERAL_KEY:
return NewEphemeralKeyMsg(), nil
//------------------------------------------------------------------
// DHT
//------------------------------------------------------------------
- case DHT_CLIENT_PUT:
+ case enums.MSG_DHT_CLIENT_PUT:
return NewDHTClientPutMsg(nil, 0, nil), nil
- case DHT_CLIENT_GET:
+ case enums.MSG_DHT_CLIENT_GET:
return NewDHTClientGetMsg(nil), nil
- case DHT_CLIENT_GET_STOP:
+ case enums.MSG_DHT_CLIENT_GET_STOP:
return NewDHTClientGetStopMsg(nil), nil
- case DHT_CLIENT_RESULT:
+ case enums.MSG_DHT_CLIENT_RESULT:
return NewDHTClientResultMsg(nil), nil
- case DHT_CLIENT_GET_RESULTS_KNOWN:
+ case enums.MSG_DHT_CLIENT_GET_RESULTS_KNOWN:
return NewDHTClientGetResultsKnownMsg(nil), nil
//------------------------------------------------------------------
// DHT-P2P
//------------------------------------------------------------------
- case DHT_P2P_HELLO:
+ case enums.MSG_DHT_P2P_HELLO:
return NewDHTP2PHelloMsg(), nil
- case DHT_P2P_GET:
+ case enums.MSG_DHT_P2P_GET:
return NewDHTP2PGetMsg(), nil
- case DHT_P2P_PUT:
+ case enums.MSG_DHT_P2P_PUT:
return NewDHTP2PPutMsg(), nil
- case DHT_P2P_RESULT:
+ case enums.MSG_DHT_P2P_RESULT:
return NewDHTP2PResultMsg(), nil
//------------------------------------------------------------------
// GNS
//------------------------------------------------------------------
- case GNS_LOOKUP:
+ case enums.MSG_GNS_LOOKUP:
return NewGNSLookupMsg(), nil
- case GNS_LOOKUP_RESULT:
+ case enums.MSG_GNS_LOOKUP_RESULT:
return NewGNSLookupResultMsg(0), nil
//------------------------------------------------------------------
// Namecache
//------------------------------------------------------------------
- case NAMECACHE_LOOKUP_BLOCK:
+ case enums.MSG_NAMECACHE_LOOKUP_BLOCK:
return NewNamecacheLookupMsg(nil), nil
- case NAMECACHE_LOOKUP_BLOCK_RESPONSE:
+ case enums.MSG_NAMECACHE_LOOKUP_BLOCK_RESPONSE:
return NewNamecacheLookupResultMsg(), nil
- case NAMECACHE_BLOCK_CACHE:
+ case enums.MSG_NAMECACHE_BLOCK_CACHE:
return NewNamecacheCacheMsg(nil), nil
- case NAMECACHE_BLOCK_CACHE_RESPONSE:
+ case enums.MSG_NAMECACHE_BLOCK_CACHE_RESPONSE:
return NewNamecacheCacheResponseMsg(), nil
//------------------------------------------------------------------
// Revocation
//------------------------------------------------------------------
- case REVOCATION_QUERY:
+ case enums.MSG_REVOCATION_QUERY:
return NewRevocationQueryMsg(nil), nil
- case REVOCATION_QUERY_RESPONSE:
+ case enums.MSG_REVOCATION_QUERY_RESPONSE:
return NewRevocationQueryResponseMsg(true), nil
- case REVOCATION_REVOKE:
+ case enums.MSG_REVOCATION_REVOKE:
return NewRevocationRevokeMsg(nil), nil
- case REVOCATION_REVOKE_RESPONSE:
+ case enums.MSG_REVOCATION_REVOKE_RESPONSE:
return NewRevocationRevokeResponseMsg(false), nil
}
return nil, fmt.Errorf("unknown message type %d", msgType)
diff --git a/src/gnunet/message/message.go b/src/gnunet/message/message.go
@@ -20,6 +20,7 @@ package message
import (
"errors"
+ "gnunet/enums"
"github.com/bfix/gospel/data"
)
@@ -33,8 +34,12 @@ var (
// Message is an interface for all GNUnet-specific messages.
type Message interface {
- // Header of message
- Header() *Header
+
+ // Size returns the size of the full message
+ Size() uint16
+
+ // Type returns the message type (defines the layout of the body data)
+ Type() enums.MsgType
// String returns a human-readable message
String() string
@@ -42,30 +47,30 @@ type Message interface {
//----------------------------------------------------------------------
-// Header encapsulates the common part of all GNUnet messages (at the
+// MsgHeader encapsulates the common part of all GNUnet messages (at the
// beginning of the data).
-type Header struct {
- MsgSize uint16 `order:"big"`
- MsgType uint16 `order:"big"`
+type MsgHeader struct {
+ MsgSize uint16 `order:"big"`
+ MsgType enums.MsgType `order:"big"`
}
// Size returns the total size of the message (header + body)
-func (mh *Header) Size() uint16 {
+func (mh *MsgHeader) Size() uint16 {
return mh.MsgSize
}
// Type returns the message type (defines the layout of the body data)
-func (mh *Header) Type() uint16 {
+func (mh *MsgHeader) Type() enums.MsgType {
return mh.MsgType
}
// GetMsgHeader returns the header of a message from a byte array (as the
// serialized form).
-func GetMsgHeader(b []byte) (mh *Header, err error) {
+func GetMsgHeader(b []byte) (mh *MsgHeader, err error) {
if b == nil || len(b) < 4 {
return nil, ErrMsgHeaderTooSmall
}
- mh = new(Header)
+ mh = new(MsgHeader)
err = data.Unmarshal(mh, b)
return
}
diff --git a/src/gnunet/message/msg_core.go b/src/gnunet/message/msg_core.go
@@ -43,8 +43,7 @@ type EphKeyBlock struct {
// EphemeralKeyMsg announces a new transient key for a peer. The key is signed
// by the issuing peer.
type EphemeralKeyMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // CORE_EPHEMERAL_KEY (88)
+ MsgHeader
SenderStatus uint32 `order:"big"` // enum PeerStateMachine
Signature *util.PeerSignature `` // EdDSA signature
SignedBlock *EphKeyBlock
@@ -53,8 +52,7 @@ type EphemeralKeyMsg struct {
// NewEphemeralKeyMsg creates an empty message for key announcement.
func NewEphemeralKeyMsg() *EphemeralKeyMsg {
return &EphemeralKeyMsg{
- MsgSize: 160,
- MsgType: CORE_EPHEMERAL_KEY,
+ MsgHeader: MsgHeader{160, enums.MSG_CORE_EPHEMERAL_KEY},
SenderStatus: 1,
Signature: util.NewPeerSignature(nil),
SignedBlock: &EphKeyBlock{
@@ -79,11 +77,6 @@ func (m *EphemeralKeyMsg) String() string {
m.SenderStatus)
}
-// Header returns the message header in a separate instance.
-func (m *EphemeralKeyMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
-}
-
// Public extracts the public key of an announcing peer.
func (m *EphemeralKeyMsg) Public() *util.PeerPublicKey {
return util.NewPeerPublicKey(m.SignedBlock.PeerID.Data)
diff --git a/src/gnunet/message/msg_dht.go b/src/gnunet/message/msg_dht.go
@@ -19,7 +19,6 @@
package message
import (
- "encoding/hex"
"fmt"
"gnunet/crypto"
@@ -33,9 +32,8 @@ import (
// DHTClientPutMsg is the message for putting values into the DHT
type DHTClientPutMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // DHT_CLIENT_PUT (142)
- Type uint32 `order:"big"` // The type of the data (BLOCK_TYPE_???)
+ MsgHeader
+ BType enums.BlockType `order:"big"` // The type of the data (BLOCK_TYPE_???)
Options uint32 `order:"big"` // Message options (DHT_RO_???)
ReplLevel uint32 `order:"big"` // Replication level for this message
Expire util.AbsoluteTime // Expiration time
@@ -44,7 +42,7 @@ type DHTClientPutMsg struct {
}
// NewDHTClientPutMsg creates a new default DHTClientPutMsg object.
-func NewDHTClientPutMsg(key *crypto.HashCode, btype int, data []byte) *DHTClientPutMsg {
+func NewDHTClientPutMsg(key *crypto.HashCode, btype enums.BlockType, data []byte) *DHTClientPutMsg {
if key == nil {
key = new(crypto.HashCode)
}
@@ -53,9 +51,8 @@ func NewDHTClientPutMsg(key *crypto.HashCode, btype int, data []byte) *DHTClient
size += uint16(len(data))
}
return &DHTClientPutMsg{
- MsgSize: size,
- MsgType: DHT_CLIENT_PUT,
- Type: uint32(btype),
+ MsgHeader: MsgHeader{size, enums.MSG_DHT_CLIENT_PUT},
+ BType: btype,
Options: uint32(enums.DHT_RO_NONE),
ReplLevel: 1,
Expire: util.AbsoluteTimeNever(),
@@ -66,13 +63,8 @@ func NewDHTClientPutMsg(key *crypto.HashCode, btype int, data []byte) *DHTClient
// String returns a human-readable representation of the message.
func (m *DHTClientPutMsg) String() string {
- return fmt.Sprintf("DHTClientPutMsg{Type=%d,Expire=%s,Options=%d,Repl=%d,Key=%s}",
- m.Type, m.Expire, m.Options, m.ReplLevel, hex.EncodeToString(m.Key.Bits))
-}
-
-// Header returns the message header in a separate instance.
-func (m *DHTClientPutMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
+ return fmt.Sprintf("DHTClientPutMsg{Type=%s,Expire=%s,Options=%d,Repl=%d,Key=%s}",
+ m.BType, m.Expire, m.Options, m.ReplLevel, m.Key)
}
//----------------------------------------------------------------------
@@ -81,11 +73,10 @@ func (m *DHTClientPutMsg) Header() *Header {
// DHTClientGetMsg is the message for getting values from the DHT
type DHTClientGetMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // DHT_CLIENT_GET (143)
+ MsgHeader
Options uint32 `order:"big"` // Message options (DHT_RO_???)
ReplLevel uint32 `order:"big"` // Replication level for this message
- Type uint32 `order:"big"` // The type for the data for the GET request (BLOCK_TYPE_???)
+ BType enums.BlockType `order:"big"` // The type for the data for the GET request (BLOCK_TYPE_???)
Key *crypto.HashCode // The key to search for
ID uint64 `order:"big"` // Unique ID identifying this request
XQuery []byte `size:"*"` // Optional xquery
@@ -97,11 +88,10 @@ func NewDHTClientGetMsg(key *crypto.HashCode) *DHTClientGetMsg {
key = new(crypto.HashCode)
}
return &DHTClientGetMsg{
- MsgSize: 88,
- MsgType: DHT_CLIENT_GET,
+ MsgHeader: MsgHeader{88, enums.MSG_DHT_CLIENT_GET},
Options: uint32(enums.DHT_RO_NONE),
ReplLevel: 1,
- Type: uint32(enums.BLOCK_TYPE_ANY),
+ BType: enums.BLOCK_TYPE_ANY,
Key: key,
ID: 0,
XQuery: nil,
@@ -119,13 +109,8 @@ func (m *DHTClientGetMsg) SetXQuery(xq []byte) []byte {
// String returns a human-readable representation of the message.
func (m *DHTClientGetMsg) String() string {
- return fmt.Sprintf("DHTClientGetMsg{Id:%d,Type=%d,Options=%d,Repl=%d,Key=%s}",
- m.ID, m.Type, m.Options, m.ReplLevel, hex.EncodeToString(m.Key.Bits))
-}
-
-// Header returns the message header in a separate instance.
-func (m *DHTClientGetMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
+ return fmt.Sprintf("DHTClientGetMsg{Id:%d,Type=%s,Options=%d,Repl=%d,Key=%s}",
+ m.ID, m.BType, m.Options, m.ReplLevel, m.Key)
}
//----------------------------------------------------------------------
@@ -134,9 +119,8 @@ func (m *DHTClientGetMsg) Header() *Header {
// DHTClientResultMsg is a message for DHT results
type DHTClientResultMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // DHT_CLIENT_RESULT (145)
- Type uint32 `order:"big"` // The type for the data
+ MsgHeader
+ BType enums.BlockType `order:"big"` // The type for the data
PutPathLen uint32 `order:"big"` // Number of peers recorded in outgoing path
GetPathLen uint32 `order:"big"` // Number of peers recorded from storage location
ID uint64 `order:"big"` // Unique ID of the matching GET request
@@ -153,9 +137,8 @@ func NewDHTClientResultMsg(key *crypto.HashCode) *DHTClientResultMsg {
key = crypto.NewHashCode(nil)
}
return &DHTClientResultMsg{
- MsgSize: 64, // empty message size (no data)
- MsgType: DHT_CLIENT_RESULT,
- Type: 0,
+ MsgHeader: MsgHeader{64, enums.MSG_DHT_CLIENT_RESULT},
+ BType: 0,
PutPathLen: 0,
GetPathLen: 0,
ID: 0,
@@ -167,12 +150,7 @@ func NewDHTClientResultMsg(key *crypto.HashCode) *DHTClientResultMsg {
// String returns a human-readable representation of the message.
func (m *DHTClientResultMsg) String() string {
- return fmt.Sprintf("DHTClientResultMsg{id:%d,expire=%s}", m.ID, m.Expire)
-}
-
-// Header returns the message header in a separate instance.
-func (m *DHTClientResultMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
+ return fmt.Sprintf("DHTClientResultMsg{id:%d,type=%s,expire=%s}", m.ID, m.BType, m.Expire)
}
//----------------------------------------------------------------------
@@ -181,8 +159,7 @@ func (m *DHTClientResultMsg) Header() *Header {
// DHTClientGetStopMsg stops a pending DHT operation
type DHTClientGetStopMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // DHT_CLIENT_GET_STOP (144)
+ MsgHeader
Reserved uint32 `order:"big"` // Reserved (0)
ID uint64 `order:"big"` // Unique ID identifying this request
Key *crypto.HashCode // The key to search for
@@ -194,22 +171,16 @@ func NewDHTClientGetStopMsg(key *crypto.HashCode) *DHTClientGetStopMsg {
key = new(crypto.HashCode)
}
return &DHTClientGetStopMsg{
- MsgSize: 80,
- MsgType: DHT_CLIENT_GET_STOP,
- Reserved: 0, // mandatory
- ID: 0,
- Key: key,
+ MsgHeader: MsgHeader{80, enums.MSG_DHT_CLIENT_GET_STOP},
+ Reserved: 0, // mandatory
+ ID: 0,
+ Key: key,
}
}
// String returns a human-readable representation of the message.
func (m *DHTClientGetStopMsg) String() string {
- return fmt.Sprintf("DHTClientGetStopMsg{Id:%d,Key=%s}", m.ID, hex.EncodeToString(m.Key.Bits))
-}
-
-// Header returns the message header in a separate instance.
-func (m *DHTClientGetStopMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
+ return fmt.Sprintf("DHTClientGetStopMsg{Id:%d,Key=%s}", m.ID, m.Key)
}
//----------------------------------------------------------------------
@@ -218,8 +189,7 @@ func (m *DHTClientGetStopMsg) Header() *Header {
// DHTClientGetResultsKnownMsg is the message for putting values into the DHT
type DHTClientGetResultsKnownMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // DHT_CLIENT_GET_RESULTS_KNOWN (156)
+ MsgHeader
Reserved uint32 `order:"big"` // Reserved for further use
Key *crypto.HashCode // The key to search for
ID uint64 `order:"big"` // Unique ID identifying this request
@@ -232,11 +202,10 @@ func NewDHTClientGetResultsKnownMsg(key *crypto.HashCode) *DHTClientGetResultsKn
key = new(crypto.HashCode)
}
return &DHTClientGetResultsKnownMsg{
- MsgSize: 80,
- MsgType: DHT_CLIENT_GET_RESULTS_KNOWN,
- Key: key,
- ID: 0,
- Known: make([]*crypto.HashCode, 0),
+ MsgHeader: MsgHeader{80, enums.MSG_DHT_CLIENT_GET_RESULTS_KNOWN},
+ Key: key,
+ ID: 0,
+ Known: make([]*crypto.HashCode, 0),
}
}
@@ -249,10 +218,5 @@ func (m *DHTClientGetResultsKnownMsg) AddKnown(hc *crypto.HashCode) {
// String returns a human-readable representation of the message.
func (m *DHTClientGetResultsKnownMsg) String() string {
return fmt.Sprintf("DHTClientGetResultsKnownMsg{Id:%d,Key=%s,Num=%d}",
- m.ID, hex.EncodeToString(m.Key.Bits), len(m.Known))
-}
-
-// Header returns the message header in a separate instance.
-func (m *DHTClientGetResultsKnownMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
+ m.ID, m.Key.Data, len(m.Known))
}
diff --git a/src/gnunet/message/msg_dht_p2p.go b/src/gnunet/message/msg_dht_p2p.go
@@ -29,6 +29,7 @@ import (
"gnunet/service/dht/blocks"
"gnunet/service/dht/path"
"gnunet/util"
+ "strings"
"time"
"github.com/bfix/gospel/crypto/ed25519"
@@ -46,9 +47,8 @@ import (
// DHTP2PGetMsg wire layout
type DHTP2PGetMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // DHT_P2P_GET (147)
- BType uint32 `order:"big"` // content type of the payload
+ MsgHeader
+ BType enums.BlockType `order:"big"` // content type of the payload
Flags uint16 `order:"big"` // processing flags
HopCount uint16 `order:"big"` // number of hops so far
ReplLevel uint16 `order:"big"` // Replication level
@@ -62,9 +62,8 @@ type DHTP2PGetMsg struct {
// NewDHTP2PGetMsg creates an empty DHT-P2P-Get message
func NewDHTP2PGetMsg() *DHTP2PGetMsg {
return &DHTP2PGetMsg{
- MsgSize: 208, // message size without ResFiter and XQuery
- MsgType: DHT_P2P_GET, // DHT_P2P_GET (147)
- BType: 0, // no block type defined
+ MsgHeader: MsgHeader{208, enums.MSG_DHT_P2P_GET},
+ BType: enums.BLOCK_TYPE_ANY, // no block type defined
Flags: 0, // no flags defined
HopCount: 0, // no hops
ReplLevel: 0, // no replication level defined
@@ -78,13 +77,8 @@ func NewDHTP2PGetMsg() *DHTP2PGetMsg {
// String returns a human-readable representation of the message.
func (m *DHTP2PGetMsg) String() string {
- return fmt.Sprintf("DHTP2PGetMsg{btype=%s,hops=%d,flags=%d}",
- enums.BlockType(m.BType).String(), m.HopCount, m.Flags)
-}
-
-// Header returns the message header in a separate instance.
-func (m *DHTP2PGetMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
+ return fmt.Sprintf("DHTP2PGetMsg{btype=%s,hops=%d,flags=%s}",
+ m.BType, m.HopCount, DHTFlags(m.Flags))
}
// Update message (forwarding)
@@ -92,8 +86,7 @@ func (m *DHTP2PGetMsg) Update(pf *blocks.PeerFilter, rf blocks.ResultFilter, hop
buf := rf.Bytes()
ns := uint16(len(buf))
return &DHTP2PGetMsg{
- MsgSize: m.MsgSize - m.RfSize + ns,
- MsgType: DHT_P2P_GET,
+ MsgHeader: MsgHeader{m.MsgSize - m.RfSize + ns, enums.MSG_DHT_P2P_GET},
BType: m.BType,
Flags: m.Flags,
HopCount: hop,
@@ -113,14 +106,13 @@ func (m *DHTP2PGetMsg) Update(pf *blocks.PeerFilter, rf blocks.ResultFilter, hop
// DHTP2PPutMsg wire layout
type DHTP2PPutMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // DHT_P2P_PUT (146)
- BType uint32 `order:"big"` // block type
+ MsgHeader
+ BType enums.BlockType `order:"big"` // block type
Flags uint16 `order:"big"` // processing flags
HopCount uint16 `order:"big"` // message hops
ReplLvl uint16 `order:"big"` // replication level
PathL uint16 `order:"big"` // path length
- Expiration util.AbsoluteTime `` // expiration date
+ Expire util.AbsoluteTime `` // expiration date
PeerFilter *blocks.PeerFilter `` // peer bloomfilter
Key *crypto.HashCode `` // query key to block
TruncOrigin *util.PeerID `opt:"(IsUsed)"` // truncated origin (if TRUNCATED flag set)
@@ -132,14 +124,13 @@ type DHTP2PPutMsg struct {
// NewDHTP2PPutMsg creates an empty new DHTP2PPutMsg
func NewDHTP2PPutMsg() *DHTP2PPutMsg {
return &DHTP2PPutMsg{
- MsgSize: 218, // total size without path and block data
- MsgType: DHT_P2P_PUT, // DHT_P2P_PUT (146)
- BType: 0, // block type
+ MsgHeader: MsgHeader{218, enums.MSG_DHT_P2P_PUT},
+ BType: enums.BLOCK_TYPE_ANY, // block type
Flags: 0, // processing flags
HopCount: 0, // message hops
ReplLvl: 0, // replication level
PathL: 0, // no PUT path
- Expiration: util.AbsoluteTimeNever(), // expiration date
+ Expire: util.AbsoluteTimeNever(), // expiration date
PeerFilter: blocks.NewPeerFilter(), // peer bloom filter
Key: crypto.NewHashCode(nil), // query key
TruncOrigin: nil, // no truncated path
@@ -168,7 +159,7 @@ func (m *DHTP2PPutMsg) Update(p *path.Path, pf *blocks.PeerFilter, hop uint16) *
msg.Flags = m.Flags
msg.HopCount = hop
msg.PathL = p.NumList
- msg.Expiration = m.Expiration
+ msg.Expire = m.Expire
msg.PeerFilter = pf
msg.Key = m.Key.Clone()
msg.TruncOrigin = p.TruncOrigin
@@ -186,7 +177,7 @@ func (m *DHTP2PPutMsg) Update(p *path.Path, pf *blocks.PeerFilter, hop uint16) *
// Path returns the current path from message
func (m *DHTP2PPutMsg) Path(sender *util.PeerID) *path.Path {
// create a "real" path list from message data
- pth := path.NewPath(crypto.Hash(m.Block), m.Expiration)
+ pth := path.NewPath(crypto.Hash(m.Block), m.Expire)
// return empty path if recording is switched off
if m.Flags&enums.DHT_RO_RECORD_ROUTE == 0 {
@@ -211,7 +202,7 @@ func (m *DHTP2PPutMsg) Path(sender *util.PeerID) *path.Path {
// handle last hop signature
if m.LastSig == nil {
logger.Printf(logger.WARN, "[path] - last hop signature missing - path reset")
- return path.NewPath(crypto.Hash(m.Block), m.Expiration)
+ return path.NewPath(crypto.Hash(m.Block), m.Expire)
}
pth.Flags |= path.PathLastHop
pth.LastSig = m.LastSig
@@ -269,13 +260,8 @@ func (m *DHTP2PPutMsg) SetPath(p *path.Path) {
// String returns a human-readable representation of the message.
func (m *DHTP2PPutMsg) String() string {
- return fmt.Sprintf("DHTP2PPutMsg{btype=%s,hops=%d,flags=%d}",
- enums.BlockType(m.BType).String(), m.HopCount, m.Flags)
-}
-
-// Header returns the message header in a separate instance.
-func (m *DHTP2PPutMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
+ return fmt.Sprintf("DHTP2PPutMsg{btype=%s,hops=%d,flags=%s}",
+ m.BType, m.HopCount, DHTFlags(m.Flags))
}
//----------------------------------------------------------------------
@@ -285,32 +271,31 @@ func (m *DHTP2PPutMsg) Header() *Header {
// DHTP2PResultMsg wire layout
type DHTP2PResultMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // DHT_P2P_RESULT (148)
- BType uint32 `order:"big"` // Block type of result
- Flags uint32 `order:"big"` // Message flags
+ MsgHeader
+ BType enums.BlockType `order:"big"` // Block type of result
+ Flags uint16 `order:"big"` // Message flags
+ Reserved uint16 `order:"big"` // Reserved
PutPathL uint16 `order:"big"` // size of PUTPATH field
GetPathL uint16 `order:"big"` // size of GETPATH field
- Expires util.AbsoluteTime `` // expiration date
+ Expire util.AbsoluteTime `` // expiration date
Query *crypto.HashCode `` // Query key for block
TruncOrigin *util.PeerID `opt:"(IsUsed)"` // truncated origin (if TRUNCATED flag set)
PathList []*path.Entry `size:"(NumPath)"` // PATH
- LastSig *util.PeerSignature `size:"(IsUsed)"` // signature of last hop (if RECORD_ROUTE flag is set)
+ LastSig *util.PeerSignature `opt:"(IsUsed)"` // signature of last hop (if RECORD_ROUTE flag is set)
Block []byte `size:"*"` // block data
}
// NewDHTP2PResultMsg creates a new empty DHTP2PResultMsg
func NewDHTP2PResultMsg() *DHTP2PResultMsg {
return &DHTP2PResultMsg{
- MsgSize: 88, // size of empty message
- MsgType: DHT_P2P_RESULT, // DHT_P2P_RESULT (148)
- BType: uint32(enums.BLOCK_TYPE_ANY), // type of returned block
- TruncOrigin: nil, // no truncated origin
- PutPathL: 0, // empty putpath
- GetPathL: 0, // empty getpath
- PathList: nil, // empty path list (put+get)
- LastSig: nil, // no recorded route
- Block: nil, // empty block
+ MsgHeader: MsgHeader{88, enums.MSG_DHT_P2P_RESULT},
+ BType: enums.BLOCK_TYPE_ANY, // type of returned block
+ TruncOrigin: nil, // no truncated origin
+ PutPathL: 0, // empty putpath
+ GetPathL: 0, // empty getpath
+ PathList: nil, // empty path list (put+get)
+ LastSig: nil, // no recorded route
+ Block: nil, // empty block
}
}
@@ -337,7 +322,7 @@ func (m *DHTP2PResultMsg) NumPath(field string) uint {
// Path returns the current path from message
func (m *DHTP2PResultMsg) Path(sender *util.PeerID) *path.Path {
// create a "real" path list from message data
- pth := path.NewPath(crypto.Hash(m.Block), m.Expires)
+ pth := path.NewPath(crypto.Hash(m.Block), m.Expire)
// return empty path if recording is switched off
if m.Flags&enums.DHT_RO_RECORD_ROUTE == 0 {
@@ -371,7 +356,7 @@ func (m *DHTP2PResultMsg) Path(sender *util.PeerID) *path.Path {
// handle last hop signature
if m.LastSig == nil {
logger.Printf(logger.WARN, "[path] - last hop signature missing - path reset")
- return path.NewPath(crypto.Hash(m.Block), m.Expires)
+ return path.NewPath(crypto.Hash(m.Block), m.Expire)
}
pth.Flags |= path.PathLastHop
pth.LastSig = m.LastSig
@@ -433,13 +418,12 @@ func (m *DHTP2PResultMsg) SetPath(p *path.Path) {
func (m *DHTP2PResultMsg) Update(pth *path.Path) *DHTP2PResultMsg {
// clone old message
msg := &DHTP2PResultMsg{
- MsgSize: m.MsgSize,
- MsgType: m.MsgType,
+ MsgHeader: MsgHeader{m.MsgSize, m.MsgType},
BType: m.BType,
Flags: m.Flags,
PutPathL: m.PutPathL,
GetPathL: m.GetPathL,
- Expires: m.Expires,
+ Expire: m.Expire,
Query: m.Query.Clone(),
TruncOrigin: m.TruncOrigin,
PathList: util.Clone(m.PathList),
@@ -455,13 +439,8 @@ func (m *DHTP2PResultMsg) Update(pth *path.Path) *DHTP2PResultMsg {
// String returns a human-readable representation of the message.
func (m *DHTP2PResultMsg) String() string {
- return fmt.Sprintf("DHTP2PResultMsg{btype=%s,putl=%d,getl=%d}",
- enums.BlockType(m.BType).String(), m.PutPathL, m.GetPathL)
-}
-
-// Header returns the message header in a separate instance.
-func (m *DHTP2PResultMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
+ return fmt.Sprintf("DHTP2PResultMsg{btype=%s,putl=%d,getl=%d,flags=%s}",
+ m.BType, m.PutPathL, m.GetPathL, DHTFlags(uint16(m.Flags)))
}
//----------------------------------------------------------------------
@@ -474,26 +453,26 @@ func (m *DHTP2PResultMsg) Header() *Header {
// DHTP2PHelloMsg is a message send by peers to announce their presence
type DHTP2PHelloMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // DHT_P2P_HELLO (157)
+ MsgHeader
Reserved uint16 `order:"big"` // Reserved for further use
NumAddr uint16 `order:"big"` // Number of addresses in list
Signature *util.PeerSignature `` // Signature
- Expires util.AbsoluteTime `` // expiration time
+ Expire util.AbsoluteTime `` // expiration time
AddrList []byte `size:"*"` // List of end-point addresses (HelloAddress)
}
// NewHelloMsgDHT creates an empty DHT_P2P_HELLO message.
func NewDHTP2PHelloMsg() *DHTP2PHelloMsg {
- // return empty HelloMessage
- exp := time.Now().Add(HelloAddressExpiration)
+ // return empty HelloMessage with set expire date
+ t := util.NewAbsoluteTime(time.Now().Add(HelloAddressExpiration))
+ exp := util.NewAbsoluteTimeEpoch(t.Epoch())
+
return &DHTP2PHelloMsg{
- MsgSize: 80, // size without 'AddrList'
- MsgType: DHT_P2P_HELLO, // DHT_P2P_HELLO (157)
+ MsgHeader: MsgHeader{80, enums.MSG_DHT_P2P_HELLO},
Reserved: 0, // not used here
NumAddr: 0, // start with empty address list
Signature: util.NewPeerSignature(nil), // signature
- Expires: util.NewAbsoluteTime(exp), // default expiration
+ Expire: exp, // default expiration
AddrList: make([]byte, 0), // list of addresses
}
}
@@ -511,7 +490,7 @@ func (m *DHTP2PHelloMsg) Addresses() (list []*util.Address, err error) {
if addr, err = util.ParseAddress(as); err != nil {
return
}
- addr.Expires = m.Expires
+ addr.Expire = m.Expire
list = append(list, addr)
num++
}
@@ -525,38 +504,26 @@ func (m *DHTP2PHelloMsg) Addresses() (list []*util.Address, err error) {
// SetAddresses adds addresses to the HELLO message.
func (m *DHTP2PHelloMsg) SetAddresses(list []*util.Address) {
// write addresses as blob and track earliest expiration
- exp := util.NewAbsoluteTime(time.Now().Add(HelloAddressExpiration))
+ t := util.NewAbsoluteTime(time.Now().Add(HelloAddressExpiration))
+ exp := util.NewAbsoluteTimeEpoch(t.Epoch())
wrt := new(bytes.Buffer)
for _, addr := range list {
// check if address expires before current expire
- if exp.Compare(addr.Expires) > 0 {
- exp = addr.Expires
+ if exp.Compare(addr.Expire) > 0 {
+ exp = addr.Expire
}
n, _ := wrt.Write([]byte(addr.URI()))
wrt.WriteByte(0)
m.MsgSize += uint16(n + 1)
}
m.AddrList = wrt.Bytes()
- m.Expires = exp
+ m.Expire = exp
m.NumAddr = uint16(len(list))
}
// String returns a human-readable representation of the message.
func (m *DHTP2PHelloMsg) String() string {
- addrs, _ := m.Addresses()
- aList := ""
- for i, a := range addrs {
- if i > 0 {
- aList += ","
- }
- aList += a.URI()
- }
- return fmt.Sprintf("DHTP2PHelloMsg{expire:%s,addrs=%d:[%s]}", m.Expires, m.NumAddr, aList)
-}
-
-// Header returns the message header in a separate instance.
-func (m *DHTP2PHelloMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
+ return fmt.Sprintf("DHTP2PHelloMsg{expire:%s,addrs=[%d]}", m.Expire, m.NumAddr)
}
// Verify the message signature
@@ -590,7 +557,7 @@ func (m *DHTP2PHelloMsg) SignedData() []byte {
err := binary.Write(buf, binary.BigEndian, size)
if err == nil {
if err = binary.Write(buf, binary.BigEndian, purpose); err == nil {
- if err = binary.Write(buf, binary.BigEndian, m.Expires.Epoch()*1000000); err == nil {
+ if err = binary.Write(buf, binary.BigEndian, m.Expire); err == nil {
if n, err = buf.Write(hAddr[:]); err == nil {
if n != len(hAddr[:]) {
err = errors.New("write failed")
@@ -604,3 +571,26 @@ func (m *DHTP2PHelloMsg) SignedData() []byte {
}
return buf.Bytes()
}
+
+//----------------------------------------------------------------------
+// Helper functions
+//----------------------------------------------------------------------
+
+// get human-readable flags
+func DHTFlags(flags uint16) string {
+ var list []string
+ if flags&enums.DHT_RO_DEMULTIPLEX_EVERYWHERE != 0 {
+ list = append(list, "DEMUX")
+ }
+ if flags&enums.DHT_RO_RECORD_ROUTE != 0 {
+ list = append(list, "ROUTE")
+ }
+ if flags&enums.DHT_RO_FIND_APPROXIMATE != 0 {
+ list = append(list, "APPROX")
+ }
+ if flags&enums.DHT_RO_TRUNCATED != 0 {
+ list = append(list, "TRUNC")
+ }
+ s := strings.Join(list, "|")
+ return "<" + s + ">"
+}
diff --git a/src/gnunet/message/msg_gns.go b/src/gnunet/message/msg_gns.go
@@ -34,27 +34,25 @@ import (
// LookupMsg is a request message for a GNS name lookup
type LookupMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // GNS_LOOKUP (500)
+ MsgHeader
ID uint32 `order:"big"` // Unique identifier for this request (for key collisions).
Zone *crypto.ZoneKey `` // Zone that is to be used for lookup
Options uint16 `order:"big"` // Local options for where to look for results
Reserved uint16 `order:"big"` // Always 0
- Type uint32 `order:"big"` // the type of record to look up
+ RType uint32 `order:"big"` // the type of record to look up
Name []byte `size:"*"` // zero-terminated name to look up
}
// NewGNSLookupMsg creates a new default message.
func NewGNSLookupMsg() *LookupMsg {
return &LookupMsg{
- MsgSize: 48, // record size with no name
- MsgType: GNS_LOOKUP,
- ID: 0,
- Zone: nil,
- Options: uint16(enums.GNS_LO_DEFAULT),
- Reserved: 0,
- Type: uint32(enums.GNS_TYPE_ANY),
- Name: nil,
+ MsgHeader: MsgHeader{48, enums.MSG_GNS_LOOKUP},
+ ID: 0,
+ Zone: nil,
+ Options: uint16(enums.GNS_LO_DEFAULT),
+ Reserved: 0,
+ RType: uint32(enums.GNS_TYPE_ANY),
+ Name: nil,
}
}
@@ -79,12 +77,7 @@ func (m *LookupMsg) GetName() string {
func (m *LookupMsg) String() string {
return fmt.Sprintf(
"GNSLookupMsg{Id=%d,Zone=%s,Options=%d,Type=%d,Name=%s}",
- m.ID, m.Zone.ID(), m.Options, m.Type, m.GetName())
-}
-
-// Header returns the message header in a separate instance.
-func (m *LookupMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
+ m.ID, m.Zone.ID(), m.Options, m.RType, m.GetName())
}
//----------------------------------------------------------------------
@@ -128,14 +121,14 @@ func (rs *RecordSet) SetPadding() {
rs.Padding = make([]byte, n-size)
}
-// Expires returns the earliest expiration timestamp for the records.
-func (rs *RecordSet) Expires() util.AbsoluteTime {
+// Expire returns the earliest expiration timestamp for the records.
+func (rs *RecordSet) Expire() util.AbsoluteTime {
var expires util.AbsoluteTime
for i, rr := range rs.Records {
if i == 0 {
- expires = rr.Expires
- } else if rr.Expires.Compare(expires) < 0 {
- expires = rr.Expires
+ expires = rr.Expire
+ } else if rr.Expire.Compare(expires) < 0 {
+ expires = rr.Expire
}
}
return expires
@@ -144,23 +137,22 @@ func (rs *RecordSet) Expires() util.AbsoluteTime {
// ResourceRecord is the GNUnet-specific representation of resource
// records (not to be confused with DNS resource records).
type ResourceRecord struct {
- Expires util.AbsoluteTime // Expiration time for the record
- Size uint32 `order:"big"` // Number of bytes in 'Data'
- Type uint32 `order:"big"` // Type of the GNS/DNS record
- Flags uint32 `order:"big"` // Flags for the record
- Data []byte `size:"Size"` // Record data
+ Expire util.AbsoluteTime // Expiration time for the record
+ Size uint32 `order:"big"` // Number of bytes in 'Data'
+ RType uint32 `order:"big"` // Type of the GNS/DNS record
+ Flags uint32 `order:"big"` // Flags for the record
+ Data []byte `size:"Size"` // Record data
}
// String returns a human-readable representation of the message.
func (r *ResourceRecord) String() string {
return fmt.Sprintf("GNSResourceRecord{type=%s,expire=%s,flags=%d,size=%d}",
- enums.GNSType(r.Type).String(), r.Expires, r.Flags, r.Size)
+ enums.GNSType(r.RType).String(), r.Expire, r.Flags, r.Size)
}
// LookupResultMsg is a response message for a GNS name lookup request
type LookupResultMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // GNS_LOOKUP_RESULT (501)
+ MsgHeader
ID uint32 `order:"big"` // Unique identifier for this request (for key collisions).
Count uint32 `order:"big"` // The number of records contained in response
Records []*ResourceRecord `size:"Count"` // GNS resource records
@@ -169,11 +161,10 @@ type LookupResultMsg struct {
// NewGNSLookupResultMsg returns a new lookup result message
func NewGNSLookupResultMsg(id uint32) *LookupResultMsg {
return &LookupResultMsg{
- MsgSize: 12, // Empty result (no records)
- MsgType: GNS_LOOKUP_RESULT,
- ID: id,
- Count: 0,
- Records: make([]*ResourceRecord, 0),
+ MsgHeader: MsgHeader{12, enums.MSG_GNS_LOOKUP_RESULT},
+ ID: id,
+ Count: 0,
+ Records: make([]*ResourceRecord, 0),
}
}
@@ -195,6 +186,6 @@ func (m *LookupResultMsg) String() string {
}
// Header returns the message header in a separate instance.
-func (m *LookupResultMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
+func (m *LookupResultMsg) Header() *MsgHeader {
+ return &MsgHeader{m.MsgSize, m.MsgType}
}
diff --git a/src/gnunet/message/msg_gns_test.go b/src/gnunet/message/msg_gns_test.go
@@ -54,22 +54,22 @@ func TestRecordsetPKEY(t *testing.T) {
Count: 2,
Records: []*ResourceRecord{
{
- Expires: util.AbsoluteTime{
+ Expire: util.AbsoluteTime{
Val: uint64(14888744139323793),
},
Size: 4,
- Type: 1,
+ RType: 1,
Flags: 0,
Data: []byte{
0x01, 0x02, 0x03, 0x04,
},
},
{
- Expires: util.AbsoluteTime{
+ Expire: util.AbsoluteTime{
Val: uint64(26147096139323793),
},
Size: 36,
- Type: crypto.ZONE_PKEY,
+ RType: crypto.ZONE_PKEY,
Flags: 2,
Data: []byte{
0x00, 0x01, 0x00, 0x00,
@@ -164,7 +164,7 @@ func TestRecordsetPKEY(t *testing.T) {
}
// check symmetric keys and nonce
- expires := RECSET.Expires()
+ expires := RECSET.Expire()
skey := zk.BlockKey(LABEL, expires)
if !bytes.Equal(skey[32:], NONCE) {
t.Logf("nonce = %s\n", hex.EncodeToString(skey[32:]))
@@ -214,22 +214,22 @@ func TestRecordsetEDKEY(t *testing.T) {
Count: 2,
Records: []*ResourceRecord{
{
- Expires: util.AbsoluteTime{
+ Expire: util.AbsoluteTime{
Val: uint64(2463385894000000),
},
Size: 4,
- Type: 1,
+ RType: 1,
Flags: 0,
Data: []byte{
0x01, 0x02, 0x03, 0x04,
},
},
{
- Expires: util.AbsoluteTime{
+ Expire: util.AbsoluteTime{
Val: uint64(49556645701000000),
},
Size: 36,
- Type: uint32(enums.GNS_TYPE_NICK),
+ RType: uint32(enums.GNS_TYPE_NICK),
Flags: 2,
Data: []byte{
0x4d, 0x79, 0x20, 0x4e, 0x69, 0x63, 0x6b, 0x00,
@@ -327,7 +327,7 @@ func TestRecordsetEDKEY(t *testing.T) {
}
// check symmetric keys and nonce
- expires := RECSET.Expires()
+ expires := RECSET.Expire()
skey := zk.BlockKey(LABEL, expires)
if !bytes.Equal(skey[32:], NONCE) {
t.Logf("nonce = %s\n", hex.EncodeToString(skey[32:]))
diff --git a/src/gnunet/message/msg_hello.go b/src/gnunet/message/msg_hello.go
@@ -22,6 +22,7 @@ import (
"bytes"
"encoding/binary"
"fmt"
+ "gnunet/enums"
"gnunet/util"
"io"
"time"
@@ -43,8 +44,8 @@ type HelloAddress struct {
func NewHelloAddress(a *util.Address) *HelloAddress {
// use default expiration time, but adjust it if address expires earlier
exp := util.NewAbsoluteTime(time.Now().Add(HelloAddressExpiration))
- if exp.Compare(a.Expires) > 0 {
- exp = a.Expires
+ if exp.Compare(a.Expire) > 0 {
+ exp = a.Expire
}
// convert address
addr := &HelloAddress{
@@ -101,7 +102,7 @@ func ParseHelloAddr(rdr io.Reader) (a *HelloAddress, err error) {
// Wrap a HelloAddress into a uitl.Address
func (a *HelloAddress) Wrap() (addr *util.Address) {
addr = util.NewAddress(a.transport, string(a.address))
- addr.Expires = a.expires
+ addr.Expire = a.expires
return
}
@@ -140,8 +141,7 @@ func (a *HelloAddress) Bytes() []byte {
// HelloMsg is a message send by peers to announce their presence
type HelloMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // HELLO (17)
+ MsgHeader
FriendsOnly uint32 `order:"big"` // Do not gossip this HELLO message
Peer *util.PeerID `` // peer identifier for addresses
AddrList []byte `size:"*"` // List of end-point addresses (HelloAddress)
@@ -155,8 +155,7 @@ func NewHelloMsg(peer *util.PeerID) *HelloMsg {
}
// return empty HelloMessage
return &HelloMsg{
- MsgSize: 40, // size without 'AddrList'
- MsgType: HELLO, // HELLO (17)
+ MsgHeader: MsgHeader{40, enums.MSG_HELLO},
FriendsOnly: 0, // not used here
Peer: peer, // associated peer
AddrList: make([]byte, 0), // list of addresses
@@ -194,8 +193,3 @@ func (m *HelloMsg) SetAddresses(list []*HelloAddress) {
}
m.AddrList = wrt.Bytes()
}
-
-// Header returns the message header in a separate instance.
-func (m *HelloMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
-}
diff --git a/src/gnunet/message/msg_namecache.go b/src/gnunet/message/msg_namecache.go
@@ -22,6 +22,7 @@ import (
"encoding/hex"
"fmt"
"gnunet/crypto"
+ "gnunet/enums"
"gnunet/service/dht/blocks"
"gnunet/util"
)
@@ -32,10 +33,9 @@ import (
// NamecacheLookupMsg is request message for lookups in local namecache
type NamecacheLookupMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // NAMECACHE_LOOKUP_BLOCK (431)
- ID uint32 `order:"big"` // Request Id
- Query *crypto.HashCode // Query data
+ MsgHeader
+ ID uint32 `order:"big"` // Request Id
+ Query *crypto.HashCode // Query data
}
// NewNamecacheLookupMsg creates a new default message.
@@ -44,22 +44,16 @@ func NewNamecacheLookupMsg(query *crypto.HashCode) *NamecacheLookupMsg {
query = crypto.NewHashCode(nil)
}
return &NamecacheLookupMsg{
- MsgSize: 72,
- MsgType: NAMECACHE_LOOKUP_BLOCK,
- ID: 0,
- Query: query,
+ MsgHeader: MsgHeader{72, enums.MSG_NAMECACHE_LOOKUP_BLOCK},
+ ID: 0,
+ Query: query,
}
}
// String returns a human-readable representation of the message.
func (m *NamecacheLookupMsg) String() string {
return fmt.Sprintf("NamecacheLookupMsg{Id=%d,Query=%s}",
- m.ID, hex.EncodeToString(m.Query.Bits))
-}
-
-// Header returns the message header in a separate instance.
-func (m *NamecacheLookupMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
+ m.ID, hex.EncodeToString(m.Query.Data))
}
//----------------------------------------------------------------------
@@ -68,8 +62,7 @@ func (m *NamecacheLookupMsg) Header() *Header {
// NamecacheLookupResultMsg is the response message for namecache lookups.
type NamecacheLookupResultMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // NAMECACHE_LOOKUP_BLOCK_RESPONSE (432)
+ MsgHeader
ID uint32 `order:"big"` // Request Id
Expire util.AbsoluteTime `` // Expiration time
DerivedKeySig *crypto.ZoneSignature `` // Derived public key
@@ -79,8 +72,7 @@ type NamecacheLookupResultMsg struct {
// NewNamecacheLookupResultMsg creates a new default message.
func NewNamecacheLookupResultMsg() *NamecacheLookupResultMsg {
return &NamecacheLookupResultMsg{
- MsgSize: 112,
- MsgType: NAMECACHE_LOOKUP_BLOCK_RESPONSE,
+ MsgHeader: MsgHeader{112, enums.MSG_NAMECACHE_LOOKUP_BLOCK_RESPONSE},
ID: 0,
Expire: *new(util.AbsoluteTime),
DerivedKeySig: nil,
@@ -94,19 +86,13 @@ func (m *NamecacheLookupResultMsg) String() string {
m.ID, m.Expire)
}
-// Header returns the message header in a separate instance.
-func (m *NamecacheLookupResultMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
-}
-
//----------------------------------------------------------------------
// NAMECACHE_CACHE_BLOCK
//----------------------------------------------------------------------
// NamecacheCacheMsg is the request message to put a name into the local cache.
type NamecacheCacheMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // NAMECACHE_CACHE_BLOCK (433)
+ MsgHeader
ID uint32 `order:"big"` // Request Id
Expire util.AbsoluteTime `` // Expiration time
DerivedKeySig *crypto.ZoneSignature `` // Derived public key and signature
@@ -116,8 +102,7 @@ type NamecacheCacheMsg struct {
// NewNamecacheCacheMsg creates a new default message.
func NewNamecacheCacheMsg(block *blocks.GNSBlock) *NamecacheCacheMsg {
msg := &NamecacheCacheMsg{
- MsgSize: 108,
- MsgType: NAMECACHE_BLOCK_CACHE,
+ MsgHeader: MsgHeader{108, enums.MSG_NAMECACHE_BLOCK_CACHE},
ID: 0,
Expire: *new(util.AbsoluteTime),
DerivedKeySig: nil,
@@ -140,30 +125,23 @@ func (m *NamecacheCacheMsg) String() string {
m.ID, m.Expire)
}
-// Header returns the message header in a separate instance.
-func (m *NamecacheCacheMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
-}
-
//----------------------------------------------------------------------
// NAMECACHE_BLOCK_CACHE_RESPONSE
//----------------------------------------------------------------------
// NamecacheCacheResponseMsg is the response message for a put request
type NamecacheCacheResponseMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // NAMECACHE_LOOKUP_BLOCK_RESPONSE (432)
- ID uint32 `order:"big"` // Request Id
- Result int32 `order:"big"` // Result code
+ MsgHeader
+ ID uint32 `order:"big"` // Request Id
+ Result int32 `order:"big"` // Result code
}
// NewNamecacheCacheResponseMsg creates a new default message.
func NewNamecacheCacheResponseMsg() *NamecacheCacheResponseMsg {
return &NamecacheCacheResponseMsg{
- MsgSize: 12,
- MsgType: NAMECACHE_BLOCK_CACHE_RESPONSE,
- ID: 0,
- Result: 0,
+ MsgHeader: MsgHeader{12, enums.MSG_NAMECACHE_BLOCK_CACHE_RESPONSE},
+ ID: 0,
+ Result: 0,
}
}
@@ -172,8 +150,3 @@ func (m *NamecacheCacheResponseMsg) String() string {
return fmt.Sprintf("NamecacheCacheResponseMsg{id=%d,result=%d}",
m.ID, m.Result)
}
-
-// Header returns the message header in a separate instance.
-func (m *NamecacheCacheResponseMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
-}
diff --git a/src/gnunet/message/msg_revocation.go b/src/gnunet/message/msg_revocation.go
@@ -22,6 +22,7 @@ import (
"fmt"
"gnunet/crypto"
+ "gnunet/enums"
"gnunet/util"
)
@@ -31,8 +32,7 @@ import (
// RevocationQueryMsg is a request message to check if a key is revoked
type RevocationQueryMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // REVOCATION_QUERY (636)
+ MsgHeader
Reserved uint32 `order:"big"` // Reserved for future use
Zone *crypto.ZoneKey // Zone that is to be checked for revocation
}
@@ -40,10 +40,9 @@ type RevocationQueryMsg struct {
// NewRevocationQueryMsg creates a new message for a given zone.
func NewRevocationQueryMsg(zkey *crypto.ZoneKey) *RevocationQueryMsg {
return &RevocationQueryMsg{
- MsgSize: 40,
- MsgType: REVOCATION_QUERY,
- Reserved: 0,
- Zone: zkey,
+ MsgHeader: MsgHeader{40, enums.MSG_REVOCATION_QUERY},
+ Reserved: 0,
+ Zone: zkey,
}
}
@@ -52,20 +51,14 @@ func (m *RevocationQueryMsg) String() string {
return fmt.Sprintf("RevocationQueryMsg{zone=%s}", m.Zone.ID())
}
-// Header returns the message header in a separate instance.
-func (m *RevocationQueryMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
-}
-
//----------------------------------------------------------------------
// REVOCATION_QUERY_RESPONSE
//----------------------------------------------------------------------
// RevocationQueryResponseMsg is a response message for revocation checks.
type RevocationQueryResponseMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // REVOCATION_QUERY_RESPONSE (637)
- Valid uint32 `order:"big"` // revoked(0), valid(1)
+ MsgHeader
+ Valid uint32 `order:"big"` // revoked(0), valid(1)
}
// NewRevocationQueryResponseMsg creates a new response for a query.
@@ -75,9 +68,8 @@ func NewRevocationQueryResponseMsg(revoked bool) *RevocationQueryResponseMsg {
valid = 0
}
return &RevocationQueryResponseMsg{
- MsgSize: 8,
- MsgType: REVOCATION_QUERY_RESPONSE,
- Valid: uint32(valid),
+ MsgHeader: MsgHeader{8, enums.MSG_REVOCATION_QUERY_RESPONSE},
+ Valid: uint32(valid),
}
}
@@ -86,19 +78,13 @@ func (m *RevocationQueryResponseMsg) String() string {
return fmt.Sprintf("RevocationQueryResponseMsg{valid=%d}", m.Valid)
}
-// Header returns the message header in a separate instance.
-func (m *RevocationQueryResponseMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
-}
-
//----------------------------------------------------------------------
// REVOCATION_REVOKE
//----------------------------------------------------------------------
// RevocationRevokeMsg is a request to revoke a given key with PoW data
type RevocationRevokeMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // REVOCATION_REVOKE (638)
+ MsgHeader
Timestamp util.AbsoluteTime `` // Timestamp of revocation creation
TTL util.RelativeTime `` // TTL of revocation
PoWs []uint64 `size:"32" order:"big"` // (Sorted) list of PoW values
@@ -108,8 +94,7 @@ type RevocationRevokeMsg struct {
// NewRevocationRevokeMsg creates a new message for a given zone.
func NewRevocationRevokeMsg(zsig *crypto.ZoneSignature) *RevocationRevokeMsg {
return &RevocationRevokeMsg{
- MsgSize: 364,
- MsgType: REVOCATION_REVOKE,
+ MsgHeader: MsgHeader{364, enums.MSG_REVOCATION_REVOKE},
Timestamp: util.AbsoluteTimeNow(),
TTL: util.RelativeTime{},
PoWs: make([]uint64, 32),
@@ -119,12 +104,8 @@ func NewRevocationRevokeMsg(zsig *crypto.ZoneSignature) *RevocationRevokeMsg {
// String returns a human-readable representation of the message.
func (m *RevocationRevokeMsg) String() string {
- return fmt.Sprintf("RevocationRevokeMsg{zone=%s}", m.ZoneKeySig.ID())
-}
-
-// Header returns the message header in a separate instance.
-func (m *RevocationRevokeMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
+ return fmt.Sprintf("RevocationRevokeMsg{zone=%s,expire=%s}",
+ m.ZoneKeySig.ID(), m.Timestamp.AddRelative(m.TTL))
}
//----------------------------------------------------------------------
@@ -133,8 +114,7 @@ func (m *RevocationRevokeMsg) Header() *Header {
// RevocationRevokeResponseMsg is a response message for a revocation request
type RevocationRevokeResponseMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // REVOCATION_REVOKE_RESPONSE (639)
+ MsgHeader
Success uint32 `order:"big"` // Revoke successful? (0=no, 1=yes)
}
@@ -145,9 +125,8 @@ func NewRevocationRevokeResponseMsg(success bool) *RevocationRevokeResponseMsg {
status = 1
}
return &RevocationRevokeResponseMsg{
- MsgSize: 8,
- MsgType: REVOCATION_QUERY_RESPONSE,
- Success: uint32(status),
+ MsgHeader: MsgHeader{8, enums.MSG_REVOCATION_QUERY_RESPONSE},
+ Success: uint32(status),
}
}
@@ -155,8 +134,3 @@ func NewRevocationRevokeResponseMsg(success bool) *RevocationRevokeResponseMsg {
func (m *RevocationRevokeResponseMsg) String() string {
return fmt.Sprintf("RevocationRevokeResponseMsg{success=%v}", m.Success == 1)
}
-
-// Header returns the message header in a separate instance.
-func (m *RevocationRevokeResponseMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
-}
diff --git a/src/gnunet/message/msg_transport.go b/src/gnunet/message/msg_transport.go
@@ -37,9 +37,8 @@ import (
// TransportTCPWelcomeMsg is a welcome message for new TCP connections.
type TransportTCPWelcomeMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // TRANSPORT_TCP_WELCOME (61)
- PeerID *util.PeerID // Peer identity (EdDSA public key)
+ MsgHeader
+ PeerID *util.PeerID // Peer identity (EdDSA public key)
}
// NewTransportTCPWelcomeMsg creates a new message for a given peer.
@@ -48,9 +47,8 @@ func NewTransportTCPWelcomeMsg(peerid *util.PeerID) *TransportTCPWelcomeMsg {
peerid = util.NewPeerID(nil)
}
return &TransportTCPWelcomeMsg{
- MsgSize: 36,
- MsgType: TRANSPORT_TCP_WELCOME,
- PeerID: peerid,
+ MsgHeader: MsgHeader{36, enums.MSG_TRANSPORT_TCP_WELCOME},
+ PeerID: peerid,
}
}
@@ -59,11 +57,6 @@ func (m *TransportTCPWelcomeMsg) String() string {
return fmt.Sprintf("TransportTcpWelcomeMsg{peer=%s}", m.PeerID)
}
-// Header returns the message header in a separate instance.
-func (m *TransportTCPWelcomeMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
-}
-
//----------------------------------------------------------------------
// TRANSPORT_PING
//
@@ -75,8 +68,7 @@ func (m *TransportTCPWelcomeMsg) Header() *Header {
// TransportPingMsg is a PING request message
type TransportPingMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // TRANSPORT_PING (372)
+ MsgHeader
Challenge uint32 // Challenge code (to ensure fresh reply)
Target *util.PeerID // EdDSA public key (long-term) of target peer
Address []byte `size:"*"` // encoded address
@@ -89,8 +81,7 @@ func NewTransportPingMsg(target *util.PeerID, a *util.Address) *TransportPingMsg
target = util.NewPeerID(nil)
}
m := &TransportPingMsg{
- MsgSize: uint16(40),
- MsgType: TRANSPORT_PING,
+ MsgHeader: MsgHeader{40, enums.MSG_TRANSPORT_PING},
Challenge: util.RndUInt32(),
Target: target,
Address: nil,
@@ -114,11 +105,6 @@ func (m *TransportPingMsg) String() string {
m.Target, a, m.Challenge)
}
-// Header returns the message header in a separate instance.
-func (m *TransportPingMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
-}
-
//----------------------------------------------------------------------
// TRANSPORT_PONG
//
@@ -160,8 +146,7 @@ func NewSignedAddress(a *util.Address) *SignedAddress {
// TransportPongMsg is a response message for a PING request
type TransportPongMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // TRANSPORT_PING (372)
+ MsgHeader
Challenge uint32 // Challenge code (to ensure fresh reply)
Signature []byte `size:"64"` // Signature of address
SignedBlock *SignedAddress // signed block of data
@@ -171,8 +156,7 @@ type TransportPongMsg struct {
// peer wants to be reached.
func NewTransportPongMsg(challenge uint32, a *util.Address) *TransportPongMsg {
m := &TransportPongMsg{
- MsgSize: 72,
- MsgType: TRANSPORT_PONG,
+ MsgHeader: MsgHeader{72, enums.MSG_TRANSPORT_PONG},
Challenge: challenge,
Signature: make([]byte, 64),
SignedBlock: new(SignedAddress),
@@ -195,11 +179,6 @@ func (m *TransportPongMsg) String() string {
return fmt.Sprintf("TransportPongMsg{addr=<unknown>,%d}", m.Challenge)
}
-// Header returns the message header in a separate instance.
-func (m *TransportPongMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
-}
-
// Sign the address block of a pong message.
func (m *TransportPongMsg) Sign(prv *ed25519.PrivateKey) error {
data, err := data.Marshal(m.SignedBlock)
@@ -233,15 +212,13 @@ func (m *TransportPongMsg) Verify(pub *ed25519.PublicKey) (bool, error) {
// SessionAckMsg is a message to acknowledge a session request
type SessionAckMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // TRANSPORT_SESSION_ACK (377)
+ MsgHeader
}
// NewSessionAckMsg creates an new message (no body required).
func NewSessionAckMsg() *SessionAckMsg {
return &SessionAckMsg{
- MsgSize: 16,
- MsgType: TRANSPORT_SESSION_ACK,
+ MsgHeader: MsgHeader{4, enums.MSG_TRANSPORT_SESSION_ACK},
}
}
@@ -250,19 +227,13 @@ func (m *SessionAckMsg) String() string {
return "SessionAck{}"
}
-// Header returns the message header in a separate instance.
-func (m *SessionAckMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
-}
-
//----------------------------------------------------------------------
// TRANSPORT_SESSION_SYN
//----------------------------------------------------------------------
// SessionSynMsg is a synchronization request message for sessions
type SessionSynMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // TRANSPORT_SESSION_SYN (375)
+ MsgHeader
Reserved uint32 `order:"big"` // reserved (=0)
Timestamp util.AbsoluteTime // usec epoch
}
@@ -270,8 +241,7 @@ type SessionSynMsg struct {
// NewSessionSynMsg creates a SYN request for the a session
func NewSessionSynMsg() *SessionSynMsg {
return &SessionSynMsg{
- MsgSize: 16,
- MsgType: TRANSPORT_SESSION_SYN,
+ MsgHeader: MsgHeader{16, enums.MSG_TRANSPORT_SESSION_SYN},
Reserved: 0,
Timestamp: util.AbsoluteTimeNow(),
}
@@ -282,19 +252,13 @@ func (m *SessionSynMsg) String() string {
return fmt.Sprintf("SessionSyn{timestamp=%s}", m.Timestamp)
}
-// Header returns the message header in a separate instance.
-func (m *SessionSynMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
-}
-
//----------------------------------------------------------------------
// TRANSPORT_SESSION_SYN_ACK
//----------------------------------------------------------------------
// SessionSynAckMsg responds to a SYN request message
type SessionSynAckMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // TRANSPORT_SESSION_SYN_ACK (376)
+ MsgHeader
Reserved uint32 `order:"big"` // reserved (=0)
Timestamp util.AbsoluteTime // usec epoch
}
@@ -302,8 +266,7 @@ type SessionSynAckMsg struct {
// NewSessionSynAckMsg is an ACK for a SYN request
func NewSessionSynAckMsg() *SessionSynAckMsg {
return &SessionSynAckMsg{
- MsgSize: 16,
- MsgType: TRANSPORT_SESSION_SYN_ACK,
+ MsgHeader: MsgHeader{16, enums.MSG_TRANSPORT_SESSION_SYN_ACK},
Reserved: 0,
Timestamp: util.AbsoluteTimeNow(),
}
@@ -314,28 +277,22 @@ func (m *SessionSynAckMsg) String() string {
return fmt.Sprintf("SessionSynAck{timestamp=%s}", m.Timestamp)
}
-// Header returns the message header in a separate instance.
-func (m *SessionSynAckMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
-}
-
//----------------------------------------------------------------------
// TRANSPORT_SESSION_QUOTA
//----------------------------------------------------------------------
// SessionQuotaMsg is a message to announce quotas for a session
type SessionQuotaMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // TRANSPORT_SESSION_QUOTA (379)
- Quota uint32 `order:"big"` // Quota in bytes per second
+ MsgHeader
+ Quota uint32 `order:"big"` // Quota in bytes per second
}
// NewSessionQuotaMsg announces a session quota to the other end of the session.
func NewSessionQuotaMsg(quota uint32) *SessionQuotaMsg {
m := new(SessionQuotaMsg)
+ m.MsgSize = 8
+ m.MsgType = enums.MSG_TRANSPORT_SESSION_QUOTA
if quota > 0 {
- m.MsgSize = 8
- m.MsgType = TRANSPORT_SESSION_QUOTA
m.Quota = quota
}
return m
@@ -346,28 +303,21 @@ func (m *SessionQuotaMsg) String() string {
return fmt.Sprintf("SessionQuotaMsg{%sB/s}", util.Scale1024(uint64(m.Quota)))
}
-// Header returns the message header in a separate instance.
-func (m *SessionQuotaMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
-}
-
//----------------------------------------------------------------------
// TRANSPORT_SESSION_KEEPALIVE
//----------------------------------------------------------------------
// SessionKeepAliveMsg is a message send by peers to keep a session alive.
type SessionKeepAliveMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // TRANSPORT_SESSION_KEEPALIVE (381)
- Nonce uint32
+ MsgHeader
+ Nonce uint32
}
// NewSessionKeepAliveMsg creates a new request to keep a session.
func NewSessionKeepAliveMsg() *SessionKeepAliveMsg {
m := &SessionKeepAliveMsg{
- MsgSize: 8,
- MsgType: TRANSPORT_SESSION_KEEPALIVE,
- Nonce: util.RndUInt32(),
+ MsgHeader: MsgHeader{8, enums.MSG_TRANSPORT_SESSION_KEEPALIVE},
+ Nonce: util.RndUInt32(),
}
return m
}
@@ -377,28 +327,21 @@ func (m *SessionKeepAliveMsg) String() string {
return fmt.Sprintf("SessionKeepAliveMsg{%d}", m.Nonce)
}
-// Header returns the message header in a separate instance.
-func (m *SessionKeepAliveMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
-}
-
//----------------------------------------------------------------------
// TRANSPORT_SESSION_KEEPALIVE_RESPONSE
//----------------------------------------------------------------------
// SessionKeepAliveRespMsg is a response for a peer to a "keep-alive" request.
type SessionKeepAliveRespMsg struct {
- MsgSize uint16 `order:"big"` // total size of message
- MsgType uint16 `order:"big"` // TRANSPORT_SESSION_KEEPALIVE_RESPONSE (382)
- Nonce uint32
+ MsgHeader
+ Nonce uint32
}
// NewSessionKeepAliveRespMsg is a response message for a "keep session" request.
func NewSessionKeepAliveRespMsg(nonce uint32) *SessionKeepAliveRespMsg {
m := &SessionKeepAliveRespMsg{
- MsgSize: 8,
- MsgType: TRANSPORT_SESSION_KEEPALIVE_RESPONSE,
- Nonce: nonce,
+ MsgHeader: MsgHeader{8, enums.MSG_TRANSPORT_SESSION_KEEPALIVE_RESPONSE},
+ Nonce: nonce,
}
return m
}
@@ -407,8 +350,3 @@ func NewSessionKeepAliveRespMsg(nonce uint32) *SessionKeepAliveRespMsg {
func (m *SessionKeepAliveRespMsg) String() string {
return fmt.Sprintf("SessionKeepAliveRespMsg{%d}", m.Nonce)
}
-
-// Header returns the message header in a separate instance.
-func (m *SessionKeepAliveRespMsg) Header() *Header {
- return &Header{m.MsgSize, m.MsgType}
-}
diff --git a/src/gnunet/message/types.go b/src/gnunet/message/types.go
@@ -1,840 +0,0 @@
-// This file is part of gnunet-go, a GNUnet-implementation in Golang.
-// Copyright (C) 2019-2022 Bernd Fix >Y<
-//
-// gnunet-go is free software: you can redistribute it and/or modify it
-// under the terms of the GNU Affero General Public License as published
-// by the Free Software Foundation, either version 3 of the License,
-// or (at your option) any later version.
-//
-// gnunet-go 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
-// Affero General Public License for more details.
-//
-// You should have received a copy of the GNU Affero General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-//
-// SPDX-License-Identifier: AGPL3.0-or-later
-
-//nolint:stylecheck // allow non-camel-case in constants
-package message
-
-// GNUnet message types
-const (
- TEST = 1 // Test if service is online (deprecated)
- DUMMY = 2 // Dummy messages for testing / benchmarking
- DUMMY2 = 3 // Another dummy messages for testing / benchmarking
-
- //------------------------------------------------------------------
- // RESOLVER message types
- //------------------------------------------------------------------
-
- RESOLVER_REQUEST = 4 // Request DNS resolution
- RESOLVER_RESPONSE = 5 // Response to a DNS resolution request
-
- //------------------------------------------------------------------
- // AGPL source code download
- //------------------------------------------------------------------
-
- REQUEST_AGPL = 6 // Message to request source code link
- RESPONSE_AGPL = 7 // Source code link
-
- //------------------------------------------------------------------
- // ARM message types
- //------------------------------------------------------------------
-
- ARM_START = 8 // Request to ARM to start a service
- ARM_STOP = 9 // Request to ARM to stop a service
- ARM_RESULT = 10 // Response from ARM
- ARM_STATUS = 11 // Status update from ARM
- ARM_LIST = 12 // Request to ARM to list all currently running services
- ARM_LIST_RESULT = 13 // Response from ARM for listing currently running services
- ARM_MONITOR = 14 // Request to ARM to notify client of service status changes
- ARM_TEST = 15 // Test if ARM service is online
-
- //------------------------------------------------------------------
- // HELLO message types
- //------------------------------------------------------------------
-
- HELLO_LEGACY = 16 // Deprecated HELLO message
- HELLO = 17 // HELLO message with friend_only flag
-
- //------------------------------------------------------------------
- // FRAGMENTATION message types
- //------------------------------------------------------------------
-
- FRAGMENT = 18 // FRAGMENT of a larger message
- FRAGMENT_ACK = 19 // Acknowledgement of a FRAGMENT of a larger message
-
- //------------------------------------------------------------------
- // Transport-WLAN message types
- //------------------------------------------------------------------
-
- WLAN_DATA_TO_HELPER = 39 // Type of data messages from the plugin to the gnunet-wlan-helper
- WLAN_DATA_FROM_HELPER = 40 // Type of data messages from the gnunet-wlan-helper to the plugin
- WLAN_HELPER_CONTROL = 41 // Control message between the gnunet-wlan-helper and the daemon (with the MAC)
- WLAN_ADVERTISEMENT = 42 // Type of messages for advertisement over wlan
- WLAN_DATA = 43 // Type of messages for data over the wlan
-
- //------------------------------------------------------------------
- // Transport-DV message types
- //------------------------------------------------------------------
-
- DV_RECV = 44 // DV service to DV Plugin message
- DV_SEND = 45 // DV Plugin to DV service message
- DV_SEND_ACK = 46 // Confirmation or failure of a DV_SEND message
- DV_ROUTE = 47 // P2P DV message encapsulating some real message
- DV_START = 48 // DV Plugin to DV service message, indicating startup.
- DV_CONNECT = 49 // P2P DV message telling plugin that a peer connected
- DV_DISCONNECT = 50 // P2P DV message telling plugin that a peer disconnected
- DV_SEND_NACK = 51 // P2P DV message telling plugin that a message transmission failed (negative ACK)
- DV_DISTANCE_CHANGED = 52 // P2P DV message telling plugin that our distance to a peer changed
- DV_BOX = 53 // DV message box for boxing multiple messages.
- TRANSPORT_XU_MESSAGE = 55 // Experimental message type.
-
- //------------------------------------------------------------------
- // Transport-UDP message types
- //------------------------------------------------------------------
-
- TRANSPORT_UDP_MESSAGE = 56 // Normal UDP message type.
- TRANSPORT_UDP_ACK = 57 // UDP ACK.
-
- //------------------------------------------------------------------
- // Transport-TCP message types
- //------------------------------------------------------------------
-
- TRANSPORT_TCP_NAT_PROBE = 60 // TCP NAT probe message
- TRANSPORT_TCP_WELCOME = 61 // Welcome message between TCP transports.
- TRANSPORT_ATS = 62 // Message to force transport to update bandwidth assignment (LEGACY)
-
- //------------------------------------------------------------------
- // NAT message types
- //------------------------------------------------------------------
-
- NAT_TEST = 63 // Message to ask NAT server to perform traversal test
-
- //------------------------------------------------------------------
- // CORE message types
- //------------------------------------------------------------------
-
- CORE_INIT = 64 // Initial setup message from core client to core.
- CORE_INIT_REPLY = 65 // Response from core to core client to INIT message.
- CORE_NOTIFY_CONNECT = 67 // Notify clients about new peer-to-peer connections (triggered after key exchange).
- CORE_NOTIFY_DISCONNECT = 68 // Notify clients about peer disconnecting.
- CORE_NOTIFY_STATUS_CHANGE = 69 // Notify clients about peer status change.
- CORE_NOTIFY_INBOUND = 70 // Notify clients about incoming P2P messages.
- CORE_NOTIFY_OUTBOUND = 71 // Notify clients about outgoing P2P transmissions.
- CORE_SEND_REQUEST = 74 // Request from client to transmit message.
- CORE_SEND_READY = 75 // Confirmation from core that message can now be sent
- CORE_SEND = 76 // Client with message to transmit (after SEND_READY confirmation was received).
- CORE_MONITOR_PEERS = 78 // Request for connection monitoring from CORE service.
- CORE_MONITOR_NOTIFY = 79 // Reply for monitor by CORE service.
- CORE_ENCRYPTED_MESSAGE = 82 // Encapsulation for an encrypted message between peers.
- CORE_PING = 83 // Check that other peer is alive (challenge).
- CORE_PONG = 84 // Confirmation that other peer is alive.
- CORE_HANGUP = 85 // Request by the other peer to terminate the connection.
- CORE_COMPRESSED_TYPE_MAP = 86 // gzip-compressed type map of the sender
- CORE_BINARY_TYPE_MAP = 87 // uncompressed type map of the sender
- CORE_EPHEMERAL_KEY = 88 // Session key exchange between peers.
- CORE_CONFIRM_TYPE_MAP = 89 // Other peer confirms having received the type map
-
- //------------------------------------------------------------------
- // DATASTORE message types
- //------------------------------------------------------------------
-
- DATASTORE_RESERVE = 92 // Message sent by datastore client on join.
- DATASTORE_RELEASE_RESERVE = 93 // Message sent by datastore client on join.
- DATASTORE_STATUS = 94 // Message sent by datastore to client informing about status processing a request (in response to RESERVE, RELEASE_RESERVE, PUT, UPDATE and REMOVE requests).
- DATASTORE_PUT = 95 // Message sent by datastore client to store data.
- DATASTORE_GET = 97 // Message sent by datastore client to get data.
- DATASTORE_GET_REPLICATION = 98 // Message sent by datastore client to get random data.
- DATASTORE_GET_ZERO_ANONYMITY = 99 // Message sent by datastore client to get random data.
- DATASTORE_DATA = 100 // Message sent by datastore to client providing requested data (in response to GET or GET_RANDOM request).
- DATASTORE_DATA_END = 101 // Message sent by datastore to client signaling end of matching data. This message will also be sent for "GET_RANDOM", even though "GET_RANDOM" returns at most one data item.
- DATASTORE_REMOVE = 102 // Message sent by datastore client to remove data.
- DATASTORE_DROP = 103 // Message sent by datastore client to drop the database.
- DATASTORE_GET_KEY = 104 // Message sent by datastore client to get data by key.
-
- //------------------------------------------------------------------
- // FS message types
- //------------------------------------------------------------------
-
- FS_REQUEST_LOC_SIGN = 126 // Message sent by fs client to request LOC signature.
- FS_REQUEST_LOC_SIGNATURE = 127 // Reply sent by fs service with LOC signature.
- FS_INDEX_START = 128 // Message sent by fs client to start indexing.
- FS_INDEX_START_OK = 129 // Affirmative response to a request for start indexing.
- FS_INDEX_START_FAILED = 130 // Response to a request for start indexing that refuses.
- FS_INDEX_LIST_GET = 131 // Request from client for list of indexed files.
- FS_INDEX_LIST_ENTRY = 132 // Reply to client with an indexed file name.
- FS_INDEX_LIST_END = 133 // Reply to client indicating end of list.
- FS_UNINDEX = 134 // Request from client to unindex a file.
- FS_UNINDEX_OK = 135 // Reply to client indicating unindex receipt.
- FS_START_SEARCH = 136 // Client asks FS service to start a (keyword) search.
- FS_GET = 137 // P2P request for content (one FS to another).
- FS_PUT = 138 // P2P response with content or active migration of content. Also used between the service and clients (in response to #FS_START_SEARCH).
- FS_MIGRATION_STOP = 139 // Peer asks us to stop migrating content towards it for a while.
- FS_CADET_QUERY = 140 // P2P request for content (one FS to another via a cadet).
- FS_CADET_REPLY = 141 // P2P answer for content (one FS to another via a cadet).
-
- //------------------------------------------------------------------
- // DHT message types
- //------------------------------------------------------------------
-
- DHT_CLIENT_PUT = 142 // Client wants to store item in DHT.
- DHT_CLIENT_GET = 143 // Client wants to lookup item in DHT.
- DHT_CLIENT_GET_STOP = 144 // Client wants to stop search in DHT.
- DHT_CLIENT_RESULT = 145 // Service returns result to client.
- DHT_P2P_PUT = 146 // Peer is storing data in DHT.
- DHT_P2P_GET = 147 // Peer tries to find data in DHT.
- DHT_P2P_RESULT = 148 // Data is returned to peer from DHT.
- DHT_MONITOR_GET = 149 // Receive information about transiting GETs
- DHT_MONITOR_GET_RESP = 150 // Receive information about transiting GET responses
- DHT_MONITOR_PUT = 151 // Receive information about transiting PUTs
- DHT_MONITOR_PUT_RESP = 152 // Receive information about transiting PUT responses (TODO)
- DHT_MONITOR_START = 153 // Request information about transiting messages
- DHT_MONITOR_STOP = 154 // Stop information about transiting messages
- DHT_CLIENT_GET_RESULTS_KNOWN = 156 // Certain results are already known to the client, filter those.
- DHT_P2P_HELLO = 157 // HELLO advertising a neighbours addresses.
- DHT_CORE = 158 // Encapsulation of DHT messages in CORE service.
- DHT_CLIENT_HELLO_URL = 159 // HELLO URL send between client and service (in either direction).
- DHT_CLIENT_HELLO_GET = 161 // Client requests DHT service's HELLO URL.
-
- //------------------------------------------------------------------
- // HOSTLIST message types
- //------------------------------------------------------------------
-
- HOSTLIST_ADVERTISEMENT = 160 // Hostlist advertisement message
-
- //------------------------------------------------------------------
- // STATISTICS message types
- //------------------------------------------------------------------
-
- STATISTICS_SET = 168 // Set a statistical value.
- STATISTICS_GET = 169 // Get a statistical value(s).
- STATISTICS_VALUE = 170 // Response to a STATISTICS_GET message (with value).
- STATISTICS_END = 171 // Response to a STATISTICS_GET message (end of value stream).
- STATISTICS_WATCH = 172 // Watch changes to a statistical value. Message format is the same as for GET, except that the subsystem and entry name must be given.
- STATISTICS_WATCH_VALUE = 173 // Changes to a watched value.
- STATISTICS_DISCONNECT = 174 // Client is done sending service requests and will now disconnect.
- STATISTICS_DISCONNECT_CONFIRM = 175 // Service confirms disconnect and that it is done processing all requests from the client.
-
- //------------------------------------------------------------------
- // VPN message types
- //------------------------------------------------------------------
-
- VPN_HELPER = 185 // Type of messages between the gnunet-vpn-helper and the daemon
- VPN_ICMP_TO_SERVICE = 190 // ICMP packet for a service.
- VPN_ICMP_TO_INTERNET = 191 // ICMP packet for the Internet.
- VPN_ICMP_TO_VPN = 192 // ICMP packet for the VPN
- VPN_DNS_TO_INTERNET = 193 // DNS request for a DNS exit service.
- VPN_DNS_FROM_INTERNET = 194 // DNS reply from a DNS exit service.
- VPN_TCP_TO_SERVICE_START = 195 // TCP packet for a service.
- VPN_TCP_TO_INTERNET_START = 196 // TCP packet for the Internet.
- VPN_TCP_DATA_TO_EXIT = 197 // TCP packet of an established connection.
- VPN_TCP_DATA_TO_VPN = 198 // TCP packet of an established connection.
- VPN_UDP_TO_SERVICE = 199 // UDP packet for a service.
- VPN_UDP_TO_INTERNET = 200 // UDP packet for the Internet.
- VPN_UDP_REPLY = 201 // UDP packet from a remote host
- VPN_CLIENT_REDIRECT_TO_IP = 202 // Client asks VPN service to setup an IP to redirect traffic via an exit node to some global IP address.
- VPN_CLIENT_REDIRECT_TO_SERVICE = 203 // Client asks VPN service to setup an IP to redirect traffic to some peer offering a service.
- VPN_CLIENT_USE_IP = 204 // VPN service responds to client with an IP to use for the requested redirection.
-
- //------------------------------------------------------------------
- // VPN-DNS message types
- //------------------------------------------------------------------
-
- DNS_CLIENT_INIT = 211 // Initial message from client to DNS service for registration.
- DNS_CLIENT_REQUEST = 212 // Type of messages between the gnunet-helper-dns and the service
- DNS_CLIENT_RESPONSE = 213 // Type of messages between the gnunet-helper-dns and the service
- DNS_HELPER = 214 // Type of messages between the gnunet-helper-dns and the service
-
- //------------------------------------------------------------------
- // CHAT message types START
- //------------------------------------------------------------------
-
- CHAT_JOIN_REQUEST = 300 // Message sent from client to join a chat room.
- CHAT_JOIN_NOTIFICATION = 301 // Message sent to client to indicate joining of another room member.
- CHAT_LEAVE_NOTIFICATION = 302 // Message sent to client to indicate leaving of another room member.
- CHAT_MESSAGE_NOTIFICATION = 303 // Notification sent by service to client indicating that we've received a chat message.
- CHAT_TRANSMIT_REQUEST = 304 // Request sent by client to transmit a chat message to another room members.
- CHAT_CONFIRMATION_RECEIPT = 305 // Receipt sent from a message receiver to the service to confirm delivery of a chat message.
- CHAT_CONFIRMATION_NOTIFICATION = 306 // Notification sent from the service to the original sender to acknowledge delivery of a chat message.
- CHAT_P2P_JOIN_NOTIFICATION = 307 // P2P message sent to indicate joining of another room member.
- CHAT_P2P_LEAVE_NOTIFICATION = 308 // P2P message sent to indicate leaving of another room member.
- CHAT_P2P_SYNC_REQUEST = 309 // P2P message sent to a newly connected peer to request its known clients in order to synchronize room members.
- CHAT_P2P_MESSAGE_NOTIFICATION = 310 // Notification sent from one peer to another to indicate that we have received a chat message.
- CHAT_P2P_CONFIRMATION_RECEIPT = 311 // P2P receipt confirming delivery of a chat message.
-
- //------------------------------------------------------------------
- // NSE (network size estimation) message types
- //------------------------------------------------------------------
-
- NSE_START = 321 // client->service message indicating start
- NSE_P2P_FLOOD = 322 // P2P message sent from nearest peer
- NSE_ESTIMATE = 323 // service->client message indicating
-
- //------------------------------------------------------------------
- // PEERINFO message types
- //------------------------------------------------------------------
-
- PEERINFO_GET = 330 // Request update and listing of a peer
- PEERINFO_GET_ALL = 331 // Request update and listing of all peers
- PEERINFO_INFO = 332 // Information about one of the peers
- PEERINFO_INFO_END = 333 // End of information about other peers
- PEERINFO_NOTIFY = 334 // Start notifying this client about changes
-
- //------------------------------------------------------------------
- // ATS message types
- //------------------------------------------------------------------
-
- ATS_START = 340 // Type of the 'struct ClientStartMessage' sent by clients to ATS to identify the type of the client.
- ATS_REQUEST_ADDRESS = 341 // Type of the 'struct RequestAddressMessage' sent by clients to request an address to help connect.
- ATS_REQUEST_ADDRESS_CANCEL = 342 // Type of the 'struct RequestAddressMessage' sent by clients to request an address to help connect.
- ATS_ADDRESS_UPDATE = 343 // Type of the 'struct AddressUpdateMessage' sent by clients to ATS to inform ATS about performance changes.
- ATS_ADDRESS_DESTROYED = 344 // Type of the 'struct AddressDestroyedMessage' sent by clients to ATS to inform ATS about an address being unavailable.
- ATS_ADDRESS_SUGGESTION = 345 // Type of the 'struct AddressSuggestionMessage' sent by ATS to clients to suggest switching to a different address.
- ATS_PEER_INFORMATION = 346 // Type of the 'struct PeerInformationMessage' sent by ATS to clients to inform about QoS for a particular connection.
- ATS_RESERVATION_REQUEST = 347 // Type of the 'struct ReservationRequestMessage' sent by clients to ATS to ask for inbound bandwidth reservations.
- ATS_RESERVATION_RESULT = 348 // Type of the 'struct ReservationResultMessage' sent by ATS to clients in response to a reservation request.
- ATS_PREFERENCE_CHANGE = 349 // Type of the 'struct ChangePreferenceMessage' sent by clients to ATS to ask for allocation preference changes.
- ATS_SESSION_RELEASE = 350 // Type of the 'struct SessionReleaseMessage' sent by ATS to client to confirm that a session ID was destroyed.
- ATS_ADDRESS_ADD = 353 // Type of the 'struct AddressUpdateMessage' sent by client to ATS to add a new address
- ATS_ADDRESSLIST_REQUEST = 354 // Type of the 'struct AddressListRequestMessage' sent by client to ATS to request information about addresses
- ATS_ADDRESSLIST_RESPONSE = 355 // Type of the 'struct AddressListResponseMessage' sent by ATS to client with information about addresses
- ATS_PREFERENCE_FEEDBACK = 356 // Type of the 'struct ChangePreferenceMessage' sent by clients to ATS to ask for allocation preference changes.
-
- //------------------------------------------------------------------
- // TRANSPORT message types
- //------------------------------------------------------------------
-
- TRANSPORT_START = 360 // Message from the core saying that the transport server should start giving it messages. This should automatically trigger the transmission of a HELLO message.
- TRANSPORT_CONNECT = 361 // Message from TRANSPORT notifying about a client that connected to us.
- TRANSPORT_DISCONNECT = 362 // Message from TRANSPORT notifying about a client that disconnected from us.
- TRANSPORT_SEND = 363 // Request to TRANSPORT to transmit a message.
- TRANSPORT_SEND_OK = 364 // Confirmation from TRANSPORT that message for transmission has been queued (and that the next message to this peer can now be passed to the service). Note that this confirmation does NOT imply that the message was fully transmitted.
- TRANSPORT_RECV = 365 // Message from TRANSPORT notifying about a message that was received.
- TRANSPORT_SET_QUOTA = 366 // Message telling transport to limit its receive rate.
- TRANSPORT_ADDRESS_TO_STRING = 367 // Request to look addresses of peers in server.
- TRANSPORT_ADDRESS_TO_STRING_REPLY = 368 // Response to the address lookup request.
- TRANSPORT_BLACKLIST_INIT = 369 // Register a client that wants to do blacklisting.
- TRANSPORT_BLACKLIST_QUERY = 370 // Query to a blacklisting client (is this peer blacklisted)?
- TRANSPORT_BLACKLIST_REPLY = 371 // Reply from blacklisting client (answer to blacklist query).
- TRANSPORT_PING = 372 // Transport PING message
- TRANSPORT_PONG = 373 // Transport PONG message
- TRANSPORT_SESSION_SYN = 375 // Transport SYN message exchanged between transport services to indicate that a session should be marked as 'connected'.
- TRANSPORT_SESSION_SYN_ACK = 376 // Transport SYN_ACK message exchanged between transport services to indicate that a SYN message was accepted
- TRANSPORT_SESSION_ACK = 377 // Transport ACK message exchanged between transport services to indicate that a SYN_ACK message was accepted
- TRANSPORT_SESSION_DISCONNECT = 378 // Transport DISCONNECT message exchanged between transport services to indicate that a connection should be dropped.
- TRANSPORT_SESSION_QUOTA = 379 // Message exchanged between transport services to indicate that the sender should limit its transmission rate to the indicated quota.
- TRANSPORT_MONITOR_PEER_REQUEST = 380 // Request to monitor addresses used by a peer or all peers.
- TRANSPORT_SESSION_KEEPALIVE = 381 // Message send by a peer to notify the other to keep the session alive and measure latency in a regular interval
- TRANSPORT_SESSION_KEEPALIVE_RESPONSE = 382 // Response to a #TRANSPORT_SESSION_KEEPALIVE message to measure latency in a regular interval
- TRANSPORT_MONITOR_PEER_RESPONSE = 383 // Response to #TRANSPORT_MONITOR_PEER_REQUEST request to iterate over all known addresses.
- TRANSPORT_BROADCAST_BEACON = 384 // Message send by a peer to notify the other to keep the session alive.
- TRANSPORT_TRAFFIC_METRIC = 385 // Message containing traffic metrics for transport service
- TRANSPORT_MONITOR_PLUGIN_START = 388 // Request to start monitoring the connection state of plugins.
- TRANSPORT_MONITOR_PLUGIN_EVENT = 389 // Monitoring event about the connection state of plugins, generated in response to a subscription initiated via #TRANSPORT_MONITOR_PLUGIN_START
- TRANSPORT_MONITOR_PLUGIN_SYNC = 390 // Monitoring event notifying client that the initial iteration is now completed and we are in sync with the state of the subsystem.
- TRANSPORT_MONITOR_PEER_RESPONSE_END = 391 // terminating list of replies.
-
- //------------------------------------------------------------------
- // FS-PUBLISH-HELPER IPC Messages
- //------------------------------------------------------------------
-
- FS_PUBLISH_HELPER_PROGRESS_FILE = 420 // Progress information from the helper: found a file
- FS_PUBLISH_HELPER_PROGRESS_DIRECTORY = 421 // Progress information from the helper: found a directory
- FS_PUBLISH_HELPER_ERROR = 422 // Error signal from the helper.
- FS_PUBLISH_HELPER_SKIP_FILE = 423 // Signal that helper skipped a file.
- FS_PUBLISH_HELPER_COUNTING_DONE = 424 // Signal that helper is done scanning the directory tree.
- FS_PUBLISH_HELPER_META_DATA = 425 // Extracted meta data from the helper.
- FS_PUBLISH_HELPER_FINISHED = 426 // Signal that helper is done.
-
- //------------------------------------------------------------------
- // NAMECACHE message types
- //------------------------------------------------------------------
-
- NAMECACHE_LOOKUP_BLOCK = 431 // Client to service: lookup block
- NAMECACHE_LOOKUP_BLOCK_RESPONSE = 432 // Service to client: result of block lookup
- NAMECACHE_BLOCK_CACHE = 433 // Client to service: cache a block
- NAMECACHE_BLOCK_CACHE_RESPONSE = 434 // Service to client: result of block cache request
-
- //------------------------------------------------------------------
- // NAMESTORE message types
- //------------------------------------------------------------------
-
- NAMESTORE_RECORD_STORE = 435 // Client to service: store records (as authority)
- NAMESTORE_RECORD_STORE_RESPONSE = 436 // Service to client: result of store operation.
- NAMESTORE_RECORD_LOOKUP = 437 // Client to service: lookup label
- NAMESTORE_RECORD_LOOKUP_RESPONSE = 438 // Service to client: lookup label
- NAMESTORE_ZONE_TO_NAME = 439 // Client to service: "reverse" lookup for zone name based on zone key
- NAMESTORE_ZONE_TO_NAME_RESPONSE = 440 // Service to client: result of zone-to-name lookup.
- NAMESTORE_MONITOR_START = 441 // Client to service: start monitoring (yields sequence of "ZONE_ITERATION_RESPONSES" --- forever).
- NAMESTORE_MONITOR_SYNC = 442 // Service to client: you're now in sync.
- NAMESTORE_RECORD_RESULT = 443 // Service to client: here is a (plaintext) record you requested.
- NAMESTORE_MONITOR_NEXT = 444 // Client to service: I am now ready for the next (set of) monitor events. Monitoring equivalent of #NAMESTORE_ZONE_ITERATION_NEXT.
- NAMESTORE_ZONE_ITERATION_START = 445 // Client to service: please start iteration; receives "NAMESTORE_LOOKUP_NAME_RESPONSE" messages in return.
- NAMESTORE_ZONE_ITERATION_NEXT = 447 // Client to service: next record(s) in iteration please.
- NAMESTORE_ZONE_ITERATION_STOP = 448 // Client to service: stop iterating.
-
- //------------------------------------------------------------------
- // LOCKMANAGER message types
- //------------------------------------------------------------------
-
- LOCKMANAGER_ACQUIRE = 450 // Message to acquire Lock
- LOCKMANAGER_RELEASE = 451 // Message to release lock
- LOCKMANAGER_SUCCESS = 452 // SUCCESS reply from lockmanager
-
- //------------------------------------------------------------------
- // TESTBED message types
- //------------------------------------------------------------------
-
- TESTBED_INIT = 460 // Initial message from a client to a testing control service
- TESTBED_ADD_HOST = 461 // Message to add host
- TESTBED_ADD_HOST_SUCCESS = 462 // Message to signal that a add host succeeded
- TESTBED_LINK_CONTROLLERS = 463 // Message to link delegated controller to slave controller
- TESTBED_CREATE_PEER = 464 // Message to create a peer at a host
- TESTBED_RECONFIGURE_PEER = 465 // Message to reconfigure a peer
- TESTBED_START_PEER = 466 // Message to start a peer at a host
- TESTBED_STOP_PEER = 467 // Message to stop a peer at a host
- TESTBED_DESTROY_PEER = 468 // Message to destroy a peer
- TESTBED_CONFIGURE_UNDERLAY_LINK = 469 // Configure underlay link message
- TESTBED_OVERLAY_CONNECT = 470 // Message to connect peers in a overlay
- TESTBED_PEER_EVENT = 471 // Message for peer events
- TESTBED_PEER_CONNECT_EVENT = 472 // Message for peer connect events
- TESTBED_OPERATION_FAIL_EVENT = 473 // Message for operation events
- TESTBED_CREATE_PEER_SUCCESS = 474 // Message to signal successful peer creation
- TESTBED_GENERIC_OPERATION_SUCCESS = 475 // Message to signal a generic operation has been successful
- TESTBED_GET_PEER_INFORMATION = 476 // Message to get a peer's information
- TESTBED_PEER_INFORMATION = 477 // Message containing the peer's information
- TESTBED_REMOTE_OVERLAY_CONNECT = 478 // Message to request a controller to make one of its peer to connect to another peer using the contained HELLO
- TESTBED_GET_SLAVE_CONFIGURATION = 479 // Message to request configuration of a slave controller
- TESTBED_SLAVE_CONFIGURATION = 480 // Message which contains the configuration of slave controller
- TESTBED_LINK_CONTROLLERS_RESULT = 481 // Message to signal the result of #TESTBED_LINK_CONTROLLERS request
- TESTBED_SHUTDOWN_PEERS = 482 // A controller receiving this message floods it to its directly-connected sub-controllers and then stops and destroys all peers
- TESTBED_MANAGE_PEER_SERVICE = 483 // Message to start/stop a service of a peer
- TESTBED_BARRIER_INIT = 484 // Message to initialise a barrier. Messages of these type are flooded to all sub-controllers
- TESTBED_BARRIER_CANCEL = 485 // Message to cancel a barrier. This message is flooded to all sub-controllers
- TESTBED_BARRIER_STATUS = 486 // Message for signalling status of a barrier
- TESTBED_BARRIER_WAIT = 487 // Message sent by a peer when it has reached a barrier and is waiting for it to be crossed
- TESTBED_MAX = 488 // Not really a message, but for careful checks on the testbed messages; Should always be the maximum and never be used to send messages with this type
- TESTBED_HELPER_INIT = 495 // The initialization message towards gnunet-testbed-helper
- TESTBED_HELPER_REPLY = 496 // The reply message from gnunet-testbed-helper
-
- //------------------------------------------------------------------
- // GNS.
- //------------------------------------------------------------------
-
- GNS_LOOKUP = 500 // Client would like to resolve a name.
- GNS_LOOKUP_RESULT = 501 // Service response to name resolution request from client.
- GNS_REVERSE_LOOKUP = 502 // Reverse lookup
- GNS_REVERSE_LOOKUP_RESULT = 503 // Response to reverse lookup
-
- //------------------------------------------------------------------
- // CONSENSUS message types
- //------------------------------------------------------------------
-
- CONSENSUS_CLIENT_JOIN = 520 // Join a consensus session. Sent by client to service as first message.
- CONSENSUS_CLIENT_INSERT = 521 // Insert an element. Sent by client to service.
- CONSENSUS_CLIENT_BEGIN = 522 // Begin accepting new elements from other participants. Sent by client to service.
- CONSENSUS_CLIENT_RECEIVED_ELEMENT = 523 // Sent by service when a new element is added.
- CONSENSUS_CLIENT_CONCLUDE = 524 // Sent by client to service in order to start the consensus conclusion.
- CONSENSUS_CLIENT_CONCLUDE_DONE = 525 // Sent by service to client in order to signal a completed consensus conclusion. Last message sent in a consensus session.
- CONSENSUS_CLIENT_ACK = 540 // Sent by client to service, telling whether a received element should be accepted and propagated further or not.
- CONSENSUS_P2P_DELTA_ESTIMATE = 541 // Strata estimator.
- CONSENSUS_P2P_DIFFERENCE_DIGEST = 542 // IBF containing all elements of a peer.
- CONSENSUS_P2P_ELEMENTS = 543 // One or more elements that are sent from peer to peer.
- CONSENSUS_P2P_ELEMENTS_REQUEST = 544 // Elements, and requests for further elements
- CONSENSUS_P2P_ELEMENTS_REPORT = 545 // Elements that a peer reports to be missing at the remote peer.
- CONSENSUS_P2P_HELLO = 546 // Initialization message for consensus p2p communication.
- CONSENSUS_P2P_SYNCED = 547 // Report that the peer is synced with the partner after successfully decoding the invertible bloom filter.
- CONSENSUS_P2P_FIN = 548 // Interaction os over, got synched and reported all elements
- CONSENSUS_P2P_ABORT = 548 // Abort a round, don't send requested elements anymore
- CONSENSUS_P2P_ROUND_CONTEXT = 547 // Abort a round, don't send requested elements anymore
-
- //------------------------------------------------------------------
- // SET message types
- //------------------------------------------------------------------
-
- SET_UNION_P2P_REQUEST_FULL = 565 // Demand the whole element from the other peer, given only the hash code.
- SET_UNION_P2P_DEMAND = 566 // Demand the whole element from the other peer, given only the hash code.
- SET_UNION_P2P_INQUIRY = 567 // Tell the other peer to send us a list of hashes that match an IBF key.
- SET_UNION_P2P_OFFER = 568 // Tell the other peer which hashes match a given IBF key.
- SET_REJECT = 569 // Reject a set request.
- SET_CANCEL = 570 // Cancel a set operation
- SET_ITER_ACK = 571 // Acknowledge result from iteration
- SET_RESULT = 572 // Create an empty set
- SET_ADD = 573 // Add element to set
- SET_REMOVE = 574 // Remove element from set
- SET_LISTEN = 575 // Listen for operation requests
- SET_ACCEPT = 576 // Accept a set request
- SET_EVALUATE = 577 // Evaluate a set operation
- SET_CONCLUDE = 578 // Start a set operation with the given set
- SET_REQUEST = 579 // Notify the client of a request from a remote peer
- SET_CREATE = 580 // Create a new local set
- SET_P2P_OPERATION_REQUEST = 581 // Request a set operation from a remote peer.
- SET_UNION_P2P_SE = 582 // Strata estimator.
- SET_UNION_P2P_IBF = 583 // Invertible bloom filter.
- SET_P2P_ELEMENTS = 584 // Actual set elements.
- SET_P2P_ELEMENT_REQUESTS = 585 // Requests for the elements with the given hashes.
- SET_UNION_P2P_DONE = 586 // Set operation is done.
- SET_ITER_REQUEST = 587 // Start iteration over set elements.
- SET_ITER_ELEMENT = 588 // Element result for the iterating client.
- SET_ITER_DONE = 589 // Iteration end marker for the client.
- SET_UNION_P2P_SEC = 590 // Compressed strata estimator.
- SET_INTERSECTION_P2P_ELEMENT_INFO = 591 // Information about the element count for intersection
- SET_INTERSECTION_P2P_BF = 592 // Bloom filter message for intersection exchange started by Bob.
- SET_INTERSECTION_P2P_DONE = 593 // Intersection operation is done.
- SET_COPY_LAZY_PREPARE = 594 // Ask the set service to prepare a copy of a set.
- SET_COPY_LAZY_RESPONSE = 595 // Give the client an ID for connecting to the set's copy.
- SET_COPY_LAZY_CONNECT = 596 // Sent by the client to the server to connect to an existing, lazily copied set.
- SET_UNION_P2P_FULL_DONE = 597 // Request all missing elements from the other peer, based on their sets and the elements we previously sent with #SET_P2P_ELEMENTS.
- SET_UNION_P2P_FULL_ELEMENT = 598 // Send a set element, not as response to a demand but because we're sending the full set.
- SET_UNION_P2P_OVER = 599 // Request all missing elements from the other peer, based on their sets and the elements we previously sent with #SET_P2P_ELEMENTS.
-
- //------------------------------------------------------------------
- // TESTBED LOGGER message types
- //------------------------------------------------------------------
-
- TESTBED_LOGGER_MSG = 600 // Message for TESTBED LOGGER
- TESTBED_LOGGER_ACK = 601 // Message for TESTBED LOGGER acknowledgement
-
- REGEX_ANNOUNCE = 620 // Advertise regex capability.
- REGEX_SEARCH = 621 // Search for peer with matching capability.
- REGEX_RESULT = 622 // Result in response to regex search.
-
- //------------------------------------------------------------------
- // IDENTITY message types
- //------------------------------------------------------------------
-
- IDENTITY_START = 624 // First message send from identity client to service (to subscribe to updates).
- IDENTITY_RESULT_CODE = 625 // Generic response from identity service with success and/or error message.
- IDENTITY_UPDATE = 626 // Update about identity status from service to clients.
- IDENTITY_GET_DEFAULT = 627 // Client requests to know default identity for a subsystem.
- IDENTITY_SET_DEFAULT = 628 // Client sets default identity; or service informs about default identity.
- IDENTITY_CREATE = 629 // Create new identity (client->service).
- IDENTITY_RENAME = 630 // Rename existing identity (client->service).
- IDENTITY_DELETE = 631 // Delete identity (client->service).
- IDENTITY_LOOKUP = 632
- IDENTITY_LOOKUP_BY_NAME = 633
-
- //------------------------------------------------------------------
- // REVOCATION message types
- //------------------------------------------------------------------
-
- REVOCATION_QUERY = 636 // Client to service: was this key revoked?
- REVOCATION_QUERY_RESPONSE = 637 // Service to client: answer if key was revoked!
- REVOCATION_REVOKE = 638 // Client to service OR peer-to-peer: revoke this key!
- REVOCATION_REVOKE_RESPONSE = 639 // Service to client: revocation confirmed
-
- //------------------------------------------------------------------
- // SCALARPRODUCT message types
- //------------------------------------------------------------------
-
- SCALARPRODUCT_CLIENT_TO_ALICE = 640 // Client -> Alice
- SCALARPRODUCT_CLIENT_TO_BOB = 641 // Client -> Bob
- SCALARPRODUCT_CLIENT_MULTIPART_ALICE = 642 // Client -> Alice multipart
- SCALARPRODUCT_CLIENT_MULTIPART_BOB = 643 // Client -> Bob multipart
- SCALARPRODUCT_SESSION_INITIALIZATION = 644 // Alice -> Bob session initialization
- SCALARPRODUCT_ALICE_CRYPTODATA = 645 // Alice -> Bob SP crypto-data (after intersection)
- SCALARPRODUCT_BOB_CRYPTODATA = 647 // Bob -> Alice SP crypto-data
- SCALARPRODUCT_BOB_CRYPTODATA_MULTIPART = 648 // Bob -> Alice SP crypto-data multipart
- SCALARPRODUCT_RESULT = 649 // Alice/Bob -> Client Result
- SCALARPRODUCT_ECC_SESSION_INITIALIZATION = 650 // Alice -> Bob ECC session initialization
- SCALARPRODUCT_ECC_ALICE_CRYPTODATA = 651 // Alice -> Bob ECC crypto data
- SCALARPRODUCT_ECC_BOB_CRYPTODATA = 652 // Bob -> Alice ECC crypto data
-
- //------------------------------------------------------------------
- // PSYCSTORE message types
- //------------------------------------------------------------------
-
- PSYCSTORE_MEMBERSHIP_STORE = 660 // Store a membership event.
- PSYCSTORE_MEMBERSHIP_TEST = 661 // Test for membership of a member at a particular point in time.
- PSYCSTORE_FRAGMENT_STORE = 662 //
- PSYCSTORE_FRAGMENT_GET = 663 //
- PSYCSTORE_MESSAGE_GET = 664 //
- PSYCSTORE_MESSAGE_GET_FRAGMENT = 665 //
- PSYCSTORE_COUNTERS_GET = 666 //
- PSYCSTORE_STATE_MODIFY = 668 //
- PSYCSTORE_STATE_SYNC = 669 //
- PSYCSTORE_STATE_RESET = 670 //
- PSYCSTORE_STATE_HASH_UPDATE = 671 //
- PSYCSTORE_STATE_GET = 672 //
- PSYCSTORE_STATE_GET_PREFIX = 673 //
- PSYCSTORE_RESULT_CODE = 674 // Generic response from PSYCstore service with success and/or error message.
- PSYCSTORE_RESULT_FRAGMENT = 675 //
- PSYCSTORE_RESULT_COUNTERS = 676 //
- PSYCSTORE_RESULT_STATE = 677 //
-
- //------------------------------------------------------------------
- // PSYC message types
- //------------------------------------------------------------------
-
- PSYC_RESULT_CODE = 680 // S->C: result of an operation
- PSYC_MASTER_START = 681 // C->S: request to start a channel as a master
- PSYC_MASTER_START_ACK = 682 // S->C: master start acknowledgement
- PSYC_SLAVE_JOIN = 683 // C->S: request to join a channel as a slave
- PSYC_SLAVE_JOIN_ACK = 684 // S->C: slave join acknowledgement
- PSYC_PART_REQUEST = 685 // C->S: request to part from a channel
- PSYC_PART_ACK = 686 // S->C: acknowledgement that a slave of master parted from a channel
- PSYC_JOIN_REQUEST = 687 // M->S->C: incoming join request from multicast
- PSYC_JOIN_DECISION = 688 // C->S->M: decision about a join request
- PSYC_CHANNEL_MEMBERSHIP_STORE = 689 // C->S: request to add/remove channel slave in the membership database.
- PSYC_MESSAGE = 691 // S<--C: PSYC message which contains one or more message parts.
- PSYC_MESSAGE_HEADER = 692 // M<->S<->C: PSYC message which contains a header and one or more message parts.
- PSYC_MESSAGE_METHOD = 693 // Message part: method
- PSYC_MESSAGE_MODIFIER = 694 // Message part: modifier
- PSYC_MESSAGE_MOD_CONT = 695 // Message part: modifier continuation
- PSYC_MESSAGE_DATA = 696 // Message part: data
- PSYC_MESSAGE_END = 697 // Message part: end of message
- PSYC_MESSAGE_CANCEL = 698 // Message part: message cancelled
- PSYC_MESSAGE_ACK = 699 // S->C: message acknowledgement
- PSYC_HISTORY_REPLAY = 701 // C->S: request channel history replay from PSYCstore.
- PSYC_HISTORY_RESULT = 702 // S->C: result for a channel history request
- PSYC_STATE_GET = 703 // C->S: request best matching state variable from PSYCstore.
- PSYC_STATE_GET_PREFIX = 704 // C->S: request state variables with a given prefix from PSYCstore.
- PSYC_STATE_RESULT = 705 // S->C: result for a state request.
-
- //------------------------------------------------------------------
- // CONVERSATION message types
- //------------------------------------------------------------------
-
- CONVERSATION_AUDIO = 730 // Message to transmit the audio between helper and speaker/microphone library.
- CONVERSATION_CS_PHONE_REGISTER = 731 // Client -> Server message to register a phone.
- CONVERSATION_CS_PHONE_PICK_UP = 732 // Client -> Server message to reject/hangup a call
- CONVERSATION_CS_PHONE_HANG_UP = 733 // Client -> Server message to reject/hangup a call
- CONVERSATION_CS_PHONE_CALL = 734 // Client <- Server message to indicate a ringing phone
- CONVERSATION_CS_PHONE_RING = 735 // Client <- Server message to indicate a ringing phone
- CONVERSATION_CS_PHONE_SUSPEND = 736 // Client <-> Server message to suspend connection.
- CONVERSATION_CS_PHONE_RESUME = 737 // Client <-> Server message to resume connection.
- CONVERSATION_CS_PHONE_PICKED_UP = 738 // Service -> Client message to notify that phone was picked up.
- CONVERSATION_CS_AUDIO = 739 // Client <-> Server message to send audio data.
- CONVERSATION_CADET_PHONE_RING = 740 // Cadet: call initiation
- CONVERSATION_CADET_PHONE_HANG_UP = 741 // Cadet: hang up / refuse call
- CONVERSATION_CADET_PHONE_PICK_UP = 742 // Cadet: pick up phone (establish audio channel)
- CONVERSATION_CADET_PHONE_SUSPEND = 743 // Cadet: phone suspended.
- CONVERSATION_CADET_PHONE_RESUME = 744 // Cadet: phone resumed.
- CONVERSATION_CADET_AUDIO = 745 // Cadet: audio data
-
- //------------------------------------------------------------------
- // MULTICAST message types
- //------------------------------------------------------------------
-
- MULTICAST_ORIGIN_START = 750 // C->S: Start the origin.
- MULTICAST_MEMBER_JOIN = 751 // C->S: Join group as a member.
- MULTICAST_JOIN_REQUEST = 752 // C<--S<->T: A peer wants to join the group. Unicast message to the origin or another group member.
- MULTICAST_JOIN_DECISION = 753 // C<->S<->T: Response to a join request. Unicast message from a group member to the peer wanting to join.
- MULTICAST_PART_REQUEST = 754 // A peer wants to part the group.
- MULTICAST_PART_ACK = 755 // Acknowledgement sent in response to a part request. Unicast message from a group member to the peer wanting to part.
- MULTICAST_GROUP_END = 756 // Group terminated.
- MULTICAST_MESSAGE = 757 // C<->S<->T: Multicast message from the origin to all members.
- MULTICAST_REQUEST = 758 // C<->S<->T: Unicast request from a group member to the origin.
- MULTICAST_FRAGMENT_ACK = 759 // C->S: Acknowledgement of a message or request fragment for the client.
- MULTICAST_REPLAY_REQUEST = 760 // C<->S<->T: Replay request from a group member to another member.
- MULTICAST_REPLAY_RESPONSE = 761 // C<->S<->T: Replay response from a group member to another member.
- MULTICAST_REPLAY_RESPONSE_END = 762 // C<->S: End of replay response.
-
- //------------------------------------------------------------------
- // SECRETSHARING message types
- //------------------------------------------------------------------
-
- SECRETSHARING_CLIENT_GENERATE = 780 // Establish a new session.
- SECRETSHARING_CLIENT_DECRYPT = 781 // Request the decryption of a ciphertext.
- SECRETSHARING_CLIENT_DECRYPT_DONE = 782 // The service succeeded in decrypting a ciphertext.
- SECRETSHARING_CLIENT_SECRET_READY = 783 // Contains the peer's share.
-
- //------------------------------------------------------------------
- // PEERSTORE message types
- //------------------------------------------------------------------
-
- PEERSTORE_STORE = 820 // Store request message
- PEERSTORE_ITERATE = 821 // Iteration request
- PEERSTORE_ITERATE_RECORD = 822 // Iteration record message
- PEERSTORE_ITERATE_END = 823 // Iteration end message
- PEERSTORE_WATCH = 824 // Watch request
- PEERSTORE_WATCH_RECORD = 825 // Watch response
- PEERSTORE_WATCH_CANCEL = 826 // Watch cancel request
-
- //------------------------------------------------------------------
- // SOCIAL message types
- //------------------------------------------------------------------
-
- SOCIAL_RESULT_CODE = 840 // S->C: result of an operation
- SOCIAL_HOST_ENTER = 841 // C->S: request to enter a place as the host
- SOCIAL_HOST_ENTER_ACK = 842 // S->C: host enter acknowledgement
- SOCIAL_GUEST_ENTER = 843 // C->S: request to enter a place as a guest
- SOCIAL_GUEST_ENTER_BY_NAME = 844 // C->S: request to enter a place as a guest, using a GNS address
- SOCIAL_GUEST_ENTER_ACK = 845 // S->C: guest enter acknowledgement
- SOCIAL_ENTRY_REQUEST = 846 // P->S->C: incoming entry request from PSYC
- SOCIAL_ENTRY_DECISION = 847 // C->S->P: decision about an entry request
- SOCIAL_PLACE_LEAVE = 848 // C->S: request to leave a place
- SOCIAL_PLACE_LEAVE_ACK = 849 // S->C: place leave acknowledgement
- SOCIAL_ZONE_ADD_PLACE = 850 // C->S: add place to GNS zone
- SOCIAL_ZONE_ADD_NYM = 851 // C->S: add nym to GNS zone
- SOCIAL_APP_CONNECT = 852 // C->S: connect application
- SOCIAL_APP_DETACH = 853 // C->S: detach a place from application
- SOCIAL_APP_EGO = 854 // S->C: notify about an existing ego
- SOCIAL_APP_EGO_END = 855 // S->C: end of ego list
- SOCIAL_APP_PLACE = 856 // S->C: notify about an existing place
- SOCIAL_APP_PLACE_END = 857 // S->C: end of place list
- SOCIAL_MSG_PROC_SET = 858 // C->S: set message processing flags
- SOCIAL_MSG_PROC_CLEAR = 859 // C->S: clear message processing flags
-
- //------------------------------------------------------------------
- // X-VINE DHT messages
- //------------------------------------------------------------------
-
- XDHT_P2P_TRAIL_SETUP = 880 // Trail setup request is received by a peer.
- XDHT_P2P_TRAIL_SETUP_RESULT = 881 // Trail to a particular peer is returned to this peer.
- XDHT_P2P_VERIFY_SUCCESSOR = 882 // Verify if your immediate successor is still your immediate successor.
- XDHT_P2P_NOTIFY_NEW_SUCCESSOR = 883 // Notify your new immediate successor that you are its new predecessor.
- XDHT_P2P_VERIFY_SUCCESSOR_RESULT = 884 // Message which contains the immediate predecessor of requested successor
- XDHT_P2P_GET_RESULT = 885 // Message which contains the get result.
- XDHT_P2P_TRAIL_SETUP_REJECTION = 886 // Trail Rejection Message.
- XDHT_P2P_TRAIL_TEARDOWN = 887 // Trail Tear down Message.
- XDHT_P2P_ADD_TRAIL = 888 // Routing table add message.
- XDHT_P2P_PUT = 890 // Peer is storing the data in DHT.
- XDHT_P2P_GET = 891 // Peer tries to find data in DHT.
- XDHT_P2P_NOTIFY_SUCCESSOR_CONFIRMATION = 892 // Send back peer that considers you are its successor.
-
- DHT_ACT_MALICIOUS = 893 // Turn X-VINE DHT service malicious
- DHT_CLIENT_ACT_MALICIOUS_OK = 894 // Acknowledge receiving ACT MALICIOUS request
-
- //------------------------------------------------------------------
- // Whanau DHT messages
- //------------------------------------------------------------------
-
- WDHT_RANDOM_WALK = 910 // This message contains the query for performing a random walk
- WDHT_RANDOM_WALK_RESPONSE = 911 // This message contains the result of a random walk
- WDHT_TRAIL_DESTROY = 912 // This message contains a notification for the death of a trail
- WDHT_TRAIL_ROUTE = 913 // This message are used to route a query to a peer
- WDHT_SUCCESSOR_FIND = 914 // This message contains the query to transfer successor values.
- WDHT_GET = 915 // Message which contains the get query
- WDHT_PUT = 916 // Message which contains the "put", a response to #WDHT_SUCCESSOR_FIND.
- WDHT_GET_RESULT = 917 // Message which contains the get result, a response to #WDHT_GET.
-
- //------------------------------------------------------------------
- // RPS messages
- //------------------------------------------------------------------
-
- RPS_PP_CHECK_LIVE = 950 // RPS check liveliness message to check liveliness of other peer
- RPS_PP_PUSH = 951 // RPS PUSH message to push own ID to another peer
- RPS_PP_PULL_REQUEST = 952 // RPS PULL REQUEST message to request the local view of another peer
- RPS_PP_PULL_REPLY = 953 // RPS PULL REPLY message which contains the view of the other peer
- RPS_CS_SEED = 954 // RPS CS SEED Message for the Client to seed peers into rps
- RPS_ACT_MALICIOUS = 955 // Turn RPS service malicious
- RPS_CS_SUB_START = 956 // RPS client-service message to start a sub sampler
- RPS_CS_SUB_STOP = 957 // RPS client-service message to stop a sub sampler
-
- //------------------------------------------------------------------
- // RECLAIM messages
- //------------------------------------------------------------------
-
- RECLAIM_ATTRIBUTE_STORE = 961
- RECLAIM_SUCCESS_RESPONSE = 962
- RECLAIM_ATTRIBUTE_ITERATION_START = 963
- RECLAIM_ATTRIBUTE_ITERATION_STOP = 964
- RECLAIM_ATTRIBUTE_ITERATION_NEXT = 965
- RECLAIM_ATTRIBUTE_RESULT = 966
- RECLAIM_ISSUE_TICKET = 967
- RECLAIM_TICKET_RESULT = 968
- RECLAIM_REVOKE_TICKET = 969
- RECLAIM_REVOKE_TICKET_RESULT = 970
- RECLAIM_CONSUME_TICKET = 971
- RECLAIM_CONSUME_TICKET_RESULT = 972
- RECLAIM_TICKET_ITERATION_START = 973
- RECLAIM_TICKET_ITERATION_STOP = 974
- RECLAIM_TICKET_ITERATION_NEXT = 975
- RECLAIM_ATTRIBUTE_DELETE = 976
-
- //------------------------------------------------------------------
- // CREDENTIAL messages
- //------------------------------------------------------------------
-
- CREDENTIAL_VERIFY = 981 //
- CREDENTIAL_VERIFY_RESULT = 982 //
- CREDENTIAL_COLLECT = 983 //
- CREDENTIAL_COLLECT_RESULT = 984 //
-
- //------------------------------------------------------------------
- // CADET messages
- //------------------------------------------------------------------
-
- CADET_CONNECTION_CREATE = 1000 // Request the creation of a connection
- CADET_CONNECTION_CREATE_ACK = 1001 // Send origin an ACK that the connection is complete
- CADET_CONNECTION_BROKEN = 1002 // Notify that a connection is no longer valid
- CADET_CONNECTION_DESTROY = 1003 // Request the destuction of a connection
- CADET_CONNECTION_PATH_CHANGED_UNIMPLEMENTED = 1004 // At some point, the route will spontaneously change TODO
- CADET_CONNECTION_HOP_BY_HOP_ENCRYPTED_ACK = 1005 // Hop-by-hop, connection dependent ACK. deprecated
-
- CADET_TUNNEL_ENCRYPTED_POLL = 1006 // We do not bother with ACKs for #CADET_TUNNEL_ENCRYPTED messages, but we instead poll for one if we got nothing for a while and start to be worried. deprecated
- CADET_TUNNEL_KX = 1007 // Axolotl key exchange.
- CADET_TUNNEL_ENCRYPTED = 1008 // Axolotl encrypted data.
- CADET_TUNNEL_KX_AUTH = 1009 // Axolotl key exchange response with authentication.
-
- CADET_CHANNEL_APP_DATA = 1010 // Payload data (inside an encrypted tunnel).
- CADET_CHANNEL_APP_DATA_ACK = 1011 // Confirm payload data end-to-end.
- CADET_CHANNEL_KEEPALIVE = 1012 // Announce connection is still alive (direction sensitive).
- CADET_CHANNEL_OPEN = 1013 // Ask the cadet service to create a new channel.
- CADET_CHANNEL_DESTROY = 1014 // Ask the cadet service to destroy a channel.
- CADET_CHANNEL_OPEN_ACK = 1015 // Confirm the creation of a channel
- CADET_CHANNEL_OPEN_NACK_DEPRECATED = 1016 // Reject the creation of a channel deprecated
-
- CADET_LOCAL_DATA = 1020 // Payload client <-> service
- CADET_LOCAL_ACK = 1021 // Local ACK for data.
- CADET_LOCAL_PORT_OPEN = 1022 // Start listening on a port.
- CADET_LOCAL_PORT_CLOSE = 1023 // Stop listening on a port.
- CADET_LOCAL_CHANNEL_CREATE = 1024 // Ask the cadet service to create a new channel.
- CADET_LOCAL_CHANNEL_DESTROY = 1025 // Tell client that a channel was destroyed.
-
- CADET_LOCAL_REQUEST_INFO_CHANNEL = 1030 // Local information about all channels of service.
- CADET_LOCAL_INFO_CHANNEL = 1031 // Local information of service about a specific channel.
- CADET_LOCAL_INFO_CHANNEL_END = 1032 // End of local information of service about channels.
- CADET_LOCAL_REQUEST_INFO_PEERS = 1033 // Request local information about all peers known to the service.
- CADET_LOCAL_INFO_PEERS = 1034 // Local information about all peers known to the service.
- CADET_LOCAL_INFO_PEERS_END = 1035 // End of local information about all peers known to the service.
- CADET_LOCAL_REQUEST_INFO_PATH = 1036 // Request local information of service about paths to specific peer.
- CADET_LOCAL_INFO_PATH = 1037 // Local information of service about a specific path.
- CADET_LOCAL_INFO_PATH_END = 1038 // End of local information of service about a specific path.
- CADET_LOCAL_REQUEST_INFO_TUNNELS = 1039 // Request local information about all tunnels of service.
- CADET_LOCAL_INFO_TUNNELS = 1040 // Local information about all tunnels of service.
- CADET_LOCAL_INFO_TUNNELS_END = 1041 // End of local information about all tunnels of service.
-
- CADET_CLI = 1059 // Traffic (net-cat style) used by the Command Line Interface.
-
- //------------------------------------------------------------------
- // NAT messages
- //------------------------------------------------------------------
-
- NAT_REGISTER = 1060 // Message to ask NAT service to register a client.
- NAT_HANDLE_STUN = 1061 // Message to ask NAT service to handle a STUN packet.
- NAT_REQUEST_CONNECTION_REVERSAL = 1062 // Message to ask NAT service to request connection reversal.
- NAT_CONNECTION_REVERSAL_REQUESTED = 1063 // Message to from NAT service notifying us that connection reversal was requested by another peer.
- NAT_ADDRESS_CHANGE = 1064 // Message to from NAT service notifying us that one of our addresses changed.
- NAT_AUTO_REQUEST_CFG = 1066 // Message to ask NAT service to request autoconfiguration.
- NAT_AUTO_CFG_RESULT = 1065 // Message from NAT service with the autoconfiguration result.
-
- //------------------------------------------------------------------
- // AUCTION messages
- //------------------------------------------------------------------
-
- AUCTION_CLIENT_CREATE = 1110 // Client wants to create a new auction.
- AUCTION_CLIENT_JOIN = 1111 // Client wants to join an existing auction.
- AUCTION_CLIENT_OUTCOME = 1112 // Service reports the auction outcome to the client.
-
- //------------------------------------------------------------------
- // RPS_DEBUG messages
- //------------------------------------------------------------------
-
- RPS_CS_DEBUG_VIEW_REQUEST = 1130 // Request updates of the view
- RPS_CS_DEBUG_VIEW_REPLY = 1131 // Send update of the view
- RPS_CS_DEBUG_VIEW_CANCEL = 1132 // Cancel getting updates of the view
- RPS_CS_DEBUG_STREAM_REQUEST = 1133 // Request biased input stream
- RPS_CS_DEBUG_STREAM_REPLY = 1134 // Send peer of biased stream
- RPS_CS_DEBUG_STREAM_CANCEL = 1135 // Cancel getting biased stream
-
- //------------------------------------------------------------------
- // CATCH-ALL_DEBUG message
- //------------------------------------------------------------------
-
- ALL = 65535 // Type used to match 'all' message types.
-)
diff --git a/src/gnunet/service/dht/blocks/filters.go b/src/gnunet/service/dht/blocks/filters.go
@@ -103,14 +103,14 @@ const (
// by the local peer.
type ResultFilter interface {
- // Add entry to filter
+ // Add block to filter
Add(Block)
// Contains returns true if block is filtered
Contains(Block) bool
// ContainsHash returns true if block hash is filtered
- ContainsHash(bh *crypto.HashCode) bool
+ ContainsHash(*crypto.HashCode) bool
// Bytes returns the binary representation of a result filter
Bytes() []byte
@@ -141,18 +141,19 @@ func NewGenericResultFilter() *GenericResultFilter {
// Add a block to the result filter.
func (rf *GenericResultFilter) Add(b Block) {
- rf.bf.Add(b.Bytes())
+ bh := crypto.Hash(b.Bytes())
+ rf.bf.Add(bh.Data)
}
// Contains returns true if a block is filtered
func (rf *GenericResultFilter) Contains(b Block) bool {
bh := crypto.Hash(b.Bytes())
- return rf.bf.Contains(bh.Bits)
+ return rf.bf.Contains(bh.Data)
}
// ContainsHash returns true if a block hash is filtered
func (rf *GenericResultFilter) ContainsHash(bh *crypto.HashCode) bool {
- return rf.bf.Contains(bh.Bits)
+ return rf.bf.Contains(bh.Data)
}
// Bytes returns the binary representation of a result filter
diff --git a/src/gnunet/service/dht/blocks/generic.go b/src/gnunet/service/dht/blocks/generic.go
@@ -19,7 +19,6 @@
package blocks
import (
- "encoding/hex"
"fmt"
"gnunet/crypto"
"gnunet/enums"
@@ -141,7 +140,7 @@ func (q *GenericQuery) Decrypt(b Block) error {
// String returns the human-readable representation of a block
func (q *GenericQuery) String() string {
- return fmt.Sprintf("GenericQuery{btype=%d,key=%s}", q.btype, hex.EncodeToString(q.Key().Bits))
+ return fmt.Sprintf("GenericQuery{btype=%s,key=%s}", q.btype, q.Key().Short())
}
// NewGenericQuery creates a simple Query from hash code.
@@ -155,46 +154,73 @@ func NewGenericQuery(key *crypto.HashCode, btype enums.BlockType, flags uint16)
}
//----------------------------------------------------------------------
+// Generic block (custom implementation unknown to gnunet-go)
+//----------------------------------------------------------------------
-// GenericBlock is the block in simple binary representation
+// GenericBlock is used for custom blocks not known to the DHT
type GenericBlock struct {
- block []byte // block data
- btype enums.BlockType // block type
- expire util.AbsoluteTime // expiration date
+ BType enums.BlockType // block type
+ Expire_ util.AbsoluteTime // expiration time
+ Data []byte // block data
+}
+
+// NewGenericBlock creates a custom block instance
+func NewGenericBlock(btype enums.BlockType, expire util.AbsoluteTime, blk []byte) Block {
+ return &GenericBlock{
+ BType: btype,
+ Expire_: expire,
+ Data: util.Clone(blk),
+ }
}
-// Bytes returns the binary representation
+// Bytes returns the DHT block data (unstructured without type and
+// expiration information.
func (b *GenericBlock) Bytes() []byte {
- return b.block
+ return util.Clone(b.Data)
}
-// Type returns the block type
+// Return the block type
func (b *GenericBlock) Type() enums.BlockType {
- return b.btype
+ return b.BType
}
-// Expire returns the block expiration
+// Expire returns the block expiration (never for custom blocks)
func (b *GenericBlock) Expire() util.AbsoluteTime {
- return b.expire
+ return util.AbsoluteTimeNever()
+}
+
+// Verify the integrity of a block (optional). Override in custom query
+// types to implement block-specific integrity checks (see GNSBlock for
+// example). This verification is usually weaker than the verification
+// method from a Query (see GNSBlock.Verify for explanation).
+func (b *GenericBlock) Verify() (bool, error) {
+ return true, nil
}
// String returns the human-readable representation of a block
func (b *GenericBlock) String() string {
- return fmt.Sprintf("GenericBlock{type=%d,expires=%s,data=[%d]}",
- b.btype, b.expire.String(), len(b.block))
+ return fmt.Sprintf("Block{type=%s,expire=%s,data=[%d]", b.BType, b.Expire_, len(b.Data))
}
-// Verify interface method implementation
-func (b *GenericBlock) Verify() (bool, error) {
- // no verification, no errors ;)
- return true, nil
-}
+//----------------------------------------------------------------------
+// Block factory: extend for custom block types
+//----------------------------------------------------------------------
+
+// Known block factories
+var (
+ blkFactory = map[enums.BlockType]func() Block{
+ enums.BLOCK_TYPE_GNS_NAMERECORD: NewGNSBlock,
+ enums.BLOCK_TYPE_DHT_URL_HELLO: NewHelloBlock,
+ }
+)
// NewGenericBlock creates a Block from binary data.
-func NewGenericBlock(buf []byte) *GenericBlock {
- return &GenericBlock{
- block: util.Clone(buf),
- btype: enums.BLOCK_TYPE_ANY, // unknown block type
- expire: util.AbsoluteTimeNever(), // never expires
+func NewBlock(btype enums.BlockType, expires util.AbsoluteTime, blk []byte) (b Block, err error) {
+ fac, ok := blkFactory[btype]
+ if !ok {
+ return NewGenericBlock(btype, expires, blk), nil
}
+ b = fac()
+ err = data.Unmarshal(b, blk)
+ return
}
diff --git a/src/gnunet/service/dht/blocks/gns.go b/src/gnunet/service/dht/blocks/gns.go
@@ -128,7 +128,6 @@ type SignedGNSBlockData struct {
// An encrypted and signed container for GNS resource records that represents
// the "atomic" data structure associated with a GNS label in a given zone.
type GNSBlock struct {
- GenericBlock
// persistent
DerivedKeySig *crypto.ZoneSignature // Derived key used for signing
@@ -147,19 +146,28 @@ func (b *GNSBlock) Bytes() []byte {
return buf
}
+// Expire returns the expiration date of the block.
+func (b *GNSBlock) Expire() util.AbsoluteTime {
+ return b.Body.Expire
+}
+
+// Type returns the requested block type
+func (b *GNSBlock) Type() enums.BlockType {
+ return enums.BLOCK_TYPE_GNS_NAMERECORD
+}
+
// String returns the human-readable representation of a GNSBlock
func (b *GNSBlock) String() string {
return fmt.Sprintf("GNSBlock{Verified=%v,Decrypted=%v,data=[%d]}",
b.verified, b.decrypted, len(b.Body.Data))
}
-// NewBlock instantiates an empty GNS block
-func NewBlock() *GNSBlock {
+// NewGNSBlock instantiates an empty GNS block
+func NewGNSBlock() Block {
return &GNSBlock{
DerivedKeySig: nil,
Body: &SignedGNSBlockData{
Purpose: new(crypto.SignaturePurpose),
- Expire: *new(util.AbsoluteTime),
Data: nil,
},
checked: false,
diff --git a/src/gnunet/service/dht/blocks/hello.go b/src/gnunet/service/dht/blocks/hello.go
@@ -57,23 +57,32 @@ const helloPrefix = "gnunet://hello/"
type HelloBlock struct {
PeerID *util.PeerID `` // peer identifier
Signature *util.PeerSignature `` // signature
- Expires util.AbsoluteTime `` // Expiration date
+ Expire_ util.AbsoluteTime `` // Expiration date
AddrBin []byte `size:"*"` // raw address data
// transient attributes
addrs []*util.Address // cooked address data
}
-// NewHelloBlock initializes a new HELLO block (unsigned)
-func NewHelloBlock(peer *util.PeerID, addrs []*util.Address, ttl time.Duration) *HelloBlock {
+// NewHelloBlock initializes an empty HELLO block
+func NewHelloBlock() Block {
+ return new(HelloBlock)
+}
+
+// InitHelloBlock initializes a new HELLO block (unsigned)
+func InitHelloBlock(peer *util.PeerID, addrs []*util.Address, ttl time.Duration) *HelloBlock {
hb := new(HelloBlock)
hb.PeerID = peer
// limit expiration to second precision (HELLO-URL compatibility)
- hb.Expires = util.NewAbsoluteTimeEpoch(uint64(time.Now().Add(ttl).Unix()))
+ hb.SetExpire(ttl)
hb.SetAddresses(addrs)
return hb
}
+func (h *HelloBlock) SetExpire(ttl time.Duration) {
+ h.Expire_ = util.NewAbsoluteTimeEpoch(uint64(time.Now().Add(ttl).Unix()))
+}
+
// SetAddresses adds a bulk of addresses for this HELLO block.
func (h *HelloBlock) SetAddresses(a []*util.Address) {
if len(a) == 0 {
@@ -87,6 +96,9 @@ func (h *HelloBlock) SetAddresses(a []*util.Address) {
// Addresses returns the list of addresses
func (h *HelloBlock) Addresses() []*util.Address {
+ if h.addrs == nil {
+ h.finalize()
+ }
return util.Clone(h.addrs)
}
@@ -132,8 +144,8 @@ func ParseHelloBlockFromURL(u string, checkExpiry bool) (h *HelloBlock, err erro
if exp, err = strconv.ParseUint(q[0], 10, 64); err != nil {
return
}
- h.Expires = util.NewAbsoluteTimeEpoch(exp)
- if checkExpiry && h.Expires.Expired() {
+ h.Expire_ = util.NewAbsoluteTimeEpoch(exp)
+ if checkExpiry && h.Expire_.Expired() {
err = ErrHelloExpired
return
}
@@ -228,13 +240,13 @@ func (h *HelloBlock) Bytes() []byte {
// Expire returns the block expiration
func (h *HelloBlock) Expire() util.AbsoluteTime {
- return h.Expires
+ return h.Expire_
}
// String returns the human-readable representation of a block
func (h *HelloBlock) String() string {
return fmt.Sprintf("HelloBlock{peer=%s,expires=%s,addrs=[%d]}",
- h.PeerID, h.Expires, len(h.Addresses()))
+ h.PeerID, h.Expire_, len(h.Addresses()))
}
// URL returns the HELLO URL for the data.
@@ -243,7 +255,7 @@ func (h *HelloBlock) URL() string {
helloPrefix,
h.PeerID.String(),
util.EncodeBinaryToString(h.Signature.Data),
- h.Expires.Epoch(),
+ h.Expire_.Epoch(),
)
for i, a := range h.addrs {
if i > 0 {
@@ -256,16 +268,16 @@ func (h *HelloBlock) URL() string {
return u
}
-// Equals returns true if two HELLOs are the same. The expiration
+// Equal returns true if two HELLOs are the same. The expiration
// timestamp is ignored in the comparison.
-func (h *HelloBlock) Equals(g *HelloBlock) bool {
- if !h.PeerID.Equals(g.PeerID) ||
- !util.Equals(h.Signature.Data, g.Signature.Data) ||
+func (h *HelloBlock) Equal(g *HelloBlock) bool {
+ if !h.PeerID.Equal(g.PeerID) ||
+ !util.Equal(h.Signature.Data, g.Signature.Data) ||
len(h.addrs) != len(g.addrs) {
return false
}
for i, a := range h.addrs {
- if !a.Equals(g.addrs[i]) {
+ if !a.Equal(g.addrs[i]) {
return false
}
}
@@ -303,7 +315,7 @@ func (h *HelloBlock) SignedData() []byte {
err := binary.Write(buf, binary.BigEndian, size)
if err == nil {
if err = binary.Write(buf, binary.BigEndian, purpose); err == nil {
- if err = binary.Write(buf, binary.BigEndian, h.Expires /*.Epoch()*1000000*/); err == nil {
+ if err = binary.Write(buf, binary.BigEndian, h.Expire_); err == nil {
if n, err = buf.Write(hAddr[:]); err == nil {
if n != len(hAddr[:]) {
err = errors.New("signed data size mismatch")
@@ -346,7 +358,7 @@ func (bh *HelloBlockHandler) ValidateBlockKey(b Block, key *crypto.HashCode) boo
logger.Println(logger.WARN, "[HelloHdlr] ValidateBlockKey: not a HELLO block")
return false
}
- return key.Equals(bkey)
+ return key.Equal(bkey)
}
// DeriveBlockKey is used to synthesize the block key from the block
@@ -473,7 +485,7 @@ func (rf *HelloResultFilter) Contains(b Block) bool {
// ContainsHash checks if a block hash is contained in the result filter
func (rf *HelloResultFilter) ContainsHash(bh *crypto.HashCode) bool {
- return rf.bf.Contains(bh.Bits)
+ return rf.bf.Contains(bh.Data)
}
// Bytes returns a binary representation of a HELLO result filter
diff --git a/src/gnunet/service/dht/blocks/hello_test.go b/src/gnunet/service/dht/blocks/hello_test.go
@@ -64,7 +64,7 @@ func setup(t *testing.T) {
}
// create new HELLO block
- block = NewHelloBlock(peer, addrList, time.Hour)
+ block = InitHelloBlock(peer, addrList, time.Hour)
// sign block.
sig, err := sk.EdSign(block.SignedData())
@@ -144,8 +144,8 @@ func TestHelloDebug(t *testing.T) {
t.Log("Block: " + hex.EncodeToString(buf))
t.Log("PeerID: " + hb.PeerID.String())
t.Log(" -> " + hex.EncodeToString(hb.PeerID.Bytes()))
- t.Logf("Expire: %d", hb.Expires.Val)
- t.Logf(" -> " + hb.Expires.String())
+ t.Logf("Expire: %d", hb.Expire_.Val)
+ t.Logf(" -> " + hb.Expire_.String())
var exp util.AbsoluteTime
if err = data.Unmarshal(&exp, buf[32:40]); err != nil {
t.Fatal(err)
diff --git a/src/gnunet/service/dht/local.go b/src/gnunet/service/dht/local.go
@@ -31,7 +31,7 @@ import (
func (m *Module) lookupHelloCache(label string, addr *PeerAddress, rf blocks.ResultFilter, approx bool) (results []*store.DHTResult) {
logger.Printf(logger.DBG, "[%s] GET message for HELLO: check cache", label)
// find best cached HELLO
- return m.rtable.LookupHello(addr, rf, approx)
+ return m.rtable.LookupHello(addr, rf, approx, label)
}
// getLocalStorage tries to find the requested block in local storage
diff --git a/src/gnunet/service/dht/messages.go b/src/gnunet/service/dht/messages.go
@@ -20,6 +20,7 @@ package dht
import (
"context"
+ "gnunet/core"
"gnunet/crypto"
"gnunet/enums"
"gnunet/message"
@@ -42,20 +43,13 @@ import (
func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn message.Message, back transport.Responder) bool {
// assemble log label
label := "dht"
- if v := ctx.Value("label"); v != nil {
+ if v := ctx.Value(core.CtxKey("label")); v != nil {
if s, ok := v.(string); ok && len(s) > 0 {
- label = "dht-" + s
+ label = s
}
}
- logger.Printf(logger.INFO, "[%s] message received from %s", label, sender)
local := m.core.PeerID()
- // check for local message
- if sender.Equals(local) {
- logger.Printf(logger.WARN, "[%s] dropping local message received: %s", label, util.Dump(msgIn, "json"))
- return false
- }
-
// process message
switch msg := msgIn.(type) {
@@ -66,10 +60,11 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
//--------------------------------------------------------------
// DHT-P2P GET
//--------------------------------------------------------------
- logger.Printf(logger.INFO, "[%s] Handling DHT-P2P-GET message", label)
+ logger.Printf(logger.INFO, "[%s] DHT-P2P-GET from %s (type %s, flags=%s)",
+ label, sender.Short(), msg.BType, message.DHTFlags(msg.Flags))
// assemble query and initialize (cache) results
- query := blocks.NewGenericQuery(msg.Query, enums.BlockType(msg.BType), msg.Flags)
+ query := blocks.NewGenericQuery(msg.Query, msg.BType, msg.Flags)
var results []*store.DHTResult
//--------------------------------------------------------------
@@ -79,7 +74,7 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
if ok {
// validate block query
if !blockHdlr.ValidateBlockQuery(msg.Query, msg.XQuery) {
- logger.Printf(logger.WARN, "[%s] DHT-P2P-GET invalid query -- discarded", label)
+ logger.Printf(logger.WARN, "[%s] invalid query -- discarded", label)
return false
}
} else {
@@ -114,14 +109,19 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
//----------------------------------------------------------
// check if we need to respond (and how) (9.4.3.3)
addr := NewQueryAddress(query.Key())
- closest := m.rtable.IsClosestPeer(nil, addr, msg.PeerFilter, 0)
demux := int(msg.Flags)&enums.DHT_RO_DEMULTIPLEX_EVERYWHERE != 0
approx := int(msg.Flags)&enums.DHT_RO_FIND_APPROXIMATE != 0
-
+ closest := false
+ // only check for closest node if we are not looking for our own HELLO
+ if msg.Flags&enums.DHT_RO_DISCOVERY == 0 {
+ closest = m.rtable.IsClosestPeer(nil, addr, msg.PeerFilter, 0)
+ } else {
+ // remove discovery flag
+ msg.Flags &^= enums.DHT_RO_DISCOVERY
+ }
// enforced actions
- doResult := closest || (demux && approx)
- doForward := !closest || (demux && !approx)
- logger.Printf(logger.DBG, "[%s] GET message: closest=%v, demux=%v, approx=%v --> result=%v, forward=%v",
+ doResult, doForward := getActions(closest, demux, approx)
+ logger.Printf(logger.DBG, "[%s] Actions: closest=%v, demux=%v, approx=%v --> result=%v, forward=%v",
label, closest, demux, approx, doResult, doForward)
//------------------------------------------------------
@@ -144,7 +144,11 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
results = append(results, lclResults...)
}
}
- // if we have results, send them as response
+ // if we have results, send them as response on the back channel
+ rcv := "locally"
+ if back.Receiver() != nil {
+ rcv = back.Receiver().Short()
+ }
for _, result := range results {
var pth *path.Path
// check if record the route
@@ -156,9 +160,9 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
pth.Add(pe)
}
- logger.Printf(logger.INFO, "[%s] sending DHT result message to caller", label)
+ logger.Printf(logger.INFO, "[%s] sending result message to %s", label, rcv)
if err := m.sendResult(ctx, query, result.Entry.Blk, pth, back); err != nil {
- logger.Printf(logger.ERROR, "[%s] Failed to send DHT result message: %s", label, err.Error())
+ logger.Printf(logger.ERROR, "[%s] Failed to send result message: %s", label, err.Error())
}
}
}
@@ -174,21 +178,22 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
for n := 0; n < numForward; n++ {
if p := m.rtable.SelectClosestPeer(addr, pf, 0); p != nil {
// forward message to peer
- logger.Printf(logger.INFO, "[%s] forward DHT get message to %s", label, p.String())
- if err := back.Send(ctx, msgOut); err != nil {
- logger.Printf(logger.ERROR, "[%s] Failed to forward DHT get message: %s", label, err.Error())
+ logger.Printf(logger.INFO, "[%s] forward GET message to %s", label, p.Peer.Short())
+ if err := m.core.Send(ctx, p.Peer, msgOut); err != nil {
+ logger.Printf(logger.ERROR, "[%s] Failed to forward GET message: %s", label, err.Error())
}
pf.Add(p.Peer)
// create open get-forward result handler
- rh := NewForwardResultHandler(msg, rf, back)
- logger.Printf(logger.INFO, "[%s] DHT-P2P-GET task #%d (%s) started", label, rh.ID(), rh.Key())
+ rh := NewResultHandler(msg, rf, back)
+ logger.Printf(logger.INFO, "[%s] result handler task #%d (key %s) started",
+ label, rh.ID(), rh.Key().Short())
m.reshdlrs.Add(rh)
} else {
break
}
}
}
- logger.Printf(logger.INFO, "[%s] Handling DHT-P2P-GET message done", label)
+ logger.Printf(logger.INFO, "[%s] DHT-P2P-GET done", label)
//==================================================================
// DHT-P2P-PUT
@@ -197,41 +202,46 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
//----------------------------------------------------------
// DHT-P2P PUT
//----------------------------------------------------------
- logger.Printf(logger.INFO, "[%s] Handling DHT-P2P-PUT message", label)
+ logger.Printf(logger.INFO, "[%s] DHT-P2P-PUT from %s (type %s, flags=%s)",
+ label, sender.Short(), msg.BType, message.DHTFlags(msg.Flags))
// assemble query and entry
- query := blocks.NewGenericQuery(msg.Key, enums.BlockType(msg.BType), msg.Flags)
+ query := blocks.NewGenericQuery(msg.Key, msg.BType, msg.Flags)
+ blk, err := blocks.NewBlock(msg.BType, msg.Expire, msg.Block)
+ if err != nil {
+ logger.Printf(logger.ERROR, "[%s] message block problem: %s", label, err.Error())
+ return false
+ }
entry := &store.DHTEntry{
- Blk: blocks.NewGenericBlock(msg.Block),
+ Blk: blk,
Path: nil,
}
//--------------------------------------------------------------
// check if request is expired (9.3.2.1)
- if msg.Expiration.Expired() {
- logger.Printf(logger.WARN, "[%s] DHT-P2P-PUT message expired (%s)", label, msg.Expiration.String())
+ if msg.Expire.Expired() {
+ logger.Printf(logger.WARN, "[%s] PUT message expired (%s) -- ignored", label, msg.Expire)
return false
}
- btype := enums.BlockType(msg.BType)
- blockHdlr, ok := blocks.BlockHandlers[btype]
+ blockHdlr, ok := blocks.BlockHandlers[msg.BType]
if ok { // (9.3.2.2)
// reconstruct block instance
if block, err := blockHdlr.ParseBlock(msg.Block); err == nil {
// validate block key (9.3.2.3)
if !blockHdlr.ValidateBlockKey(block, msg.Key) {
- logger.Printf(logger.WARN, "[%s] DHT-P2P-PUT invalid key -- discarded", label)
+ logger.Printf(logger.WARN, "[%s] PUT invalid key -- discarded", label)
return false
}
// validate block payload (9.3.2.4)
if !blockHdlr.ValidateBlockStoreRequest(block) {
- logger.Printf(logger.WARN, "[%s] DHT-P2P-PUT invalid payload -- discarded", label)
+ logger.Printf(logger.WARN, "[%s] PUT invalid payload -- discarded", label)
return false
}
}
} else {
- logger.Printf(logger.INFO, "[%s] No validator defined for block type %s", label, btype.String())
+ logger.Printf(logger.INFO, "[%s] No validator defined for block type %s", label, msg.BType)
blockHdlr = nil
}
// clone peer filter
@@ -242,7 +252,9 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
addr := NewQueryAddress(msg.Key)
closest := m.rtable.IsClosestPeer(nil, addr, msg.PeerFilter, 0)
demux := int(msg.Flags)&enums.DHT_RO_DEMULTIPLEX_EVERYWHERE != 0
- logger.Printf(logger.DBG, "[%s] PUT message: closest=%v, demux=%v", label, closest, demux)
+ doStore, doForward := putActions(closest, demux)
+ logger.Printf(logger.DBG, "[%s] Actions: closest=%v, demux=%v => doStore=%v, doForward=%v",
+ label, closest, demux, doStore, doForward)
//--------------------------------------------------------------
// check if sender is in peer filter (9.3.2.5)
@@ -259,7 +271,7 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
//--------------------------------------------------------------
// store locally if we are closest peer or demux is set (9.3.2.8)
- if closest || demux {
+ if doStore {
// store in local storage
if err := m.store.Put(query, entry); err != nil {
logger.Printf(logger.ERROR, "[%s] failed to store DHT entry: %s", label, err.Error())
@@ -268,7 +280,7 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
//--------------------------------------------------------------
// if the put is for a HELLO block, add the sender to the
// routing table (9.3.2.9)
- if btype == enums.BLOCK_TYPE_DHT_HELLO {
+ if msg.BType == enums.BLOCK_TYPE_DHT_HELLO {
// get addresses from HELLO block
hello, err := blocks.ParseHelloBlockFromBytes(msg.Block)
if err != nil {
@@ -290,7 +302,7 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
}
//--------------------------------------------------------------
// check if we need to forward
- if !closest || demux {
+ if doForward {
// add local node to filter
pf.Add(local)
@@ -310,9 +322,9 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
msgOut := msg.Update(pp, pf, msg.HopCount+1)
// forward message to peer
- logger.Printf(logger.INFO, "[%s] forward DHT put message to %s", label, p.String())
- if err := back.Send(ctx, msgOut); err != nil {
- logger.Printf(logger.ERROR, "[%s] Failed to forward DHT put message: %s", label, err.Error())
+ logger.Printf(logger.INFO, "[%s] forward PUT message to %s", label, p.Peer.Short())
+ if err := m.core.Send(ctx, p.Peer, msgOut); err != nil {
+ logger.Printf(logger.ERROR, "[%s] Failed to forward PUT message: %s", label, err.Error())
}
// add forward node to filter
pf.Add(p.Peer)
@@ -321,7 +333,7 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
}
}
}
- logger.Printf(logger.INFO, "[%s] Handling DHT-P2P-PUT message done", label)
+ logger.Printf(logger.INFO, "[%s] DHT-P2P-PUT done", label)
//==================================================================
// DHT-P2P-RESULT
@@ -330,14 +342,14 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
//----------------------------------------------------------
// DHT-P2P RESULT
//----------------------------------------------------------
- logger.Printf(logger.INFO, "[%s] Handling DHT-P2P-RESULT message for type %s",
- label, enums.BlockType(msg.BType).String())
+ logger.Printf(logger.INFO, "[%s] DHT-P2P-RESULT from %s (type %s, flags=%s)",
+ label, sender.Short(), msg.BType, message.DHTFlags(msg.Flags))
//--------------------------------------------------------------
// check if request is expired (9.5.2.1)
- if msg.Expires.Expired() {
- logger.Printf(logger.WARN, "[%s] DHT-P2P-RESULT message expired (%s)",
- label, msg.Expires.String())
+ if msg.Expire.Expired() {
+ logger.Printf(logger.WARN, "[%s] message expired (%s) -- ignoring",
+ label, msg.Expire.String())
return false
}
//--------------------------------------------------------------
@@ -349,7 +361,7 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
if block, err := blockHdlr.ParseBlock(msg.Block); err == nil {
// validate block (9.5.2.2)
if !blockHdlr.ValidateBlockStoreRequest(block) {
- logger.Printf(logger.WARN, "[%s] DHT-P2P-RESULT invalid block -- discarded", label)
+ logger.Printf(logger.WARN, "[%s] RESULT invalid block -- discarded", label)
return false
}
// Compute block key (9.5.2.4)
@@ -390,19 +402,19 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
}
}
// message forwarding to responder
- key := msg.Query.String()
- logger.Printf(logger.DBG, "[%s] DHT-P2P-RESULT key = %s", label, key)
+ logger.Printf(logger.DBG, "[%s] result key = %s", label, msg.Query.Short())
handled := false
+ key := msg.Query.String()
if list, ok := m.reshdlrs.Get(key); ok {
for _, rh := range list {
- logger.Printf(logger.DBG, "[%s] Task #%d for DHT-P2P-RESULT found", label, rh.ID())
+ logger.Printf(logger.DBG, "[%s] Result handler task #%d found", label, rh.ID())
//--------------------------------------------------------------
// check task list for handler (9.5.2.6)
- if rh.Flags()&enums.DHT_RO_FIND_APPROXIMATE == 0 && blkKey != nil && !blkKey.Equals(rh.Key()) {
+ if rh.Flags()&enums.DHT_RO_FIND_APPROXIMATE == 0 && blkKey != nil && !blkKey.Equal(rh.Key()) {
// (9.5.2.6.a) derived key mismatch
logger.Printf(logger.ERROR, "[%s] derived block key / query key mismatch:", label)
- logger.Printf(logger.ERROR, "[%s] --> %s != %s", label, blkKey.String(), rh.Key().String())
+ logger.Printf(logger.ERROR, "[%s] --> %s != %s", label, blkKey, rh.Key())
return false
}
// (9.5.2.6.b+c) check block against query
@@ -419,9 +431,10 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
}
}
if !handled {
- logger.Printf(logger.WARN, "[%s] DHT-P2P-RESULT not processed (no handler)", label)
+ logger.Printf(logger.WARN, "[%s] RESULT not processed (no handler)", label)
+ } else {
+ logger.Printf(logger.INFO, "[%s] DHT-P2P-RESULT done", label)
}
- logger.Printf(logger.INFO, "[%s] Handling DHT-P2P-RESULT message done", label)
return handled
//==================================================================
@@ -431,11 +444,11 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
//----------------------------------------------------------
// DHT-P2P HELLO
//----------------------------------------------------------
- logger.Printf(logger.INFO, "[%s] Handling DHT-P2P-HELLO message", label)
+ logger.Printf(logger.INFO, "[%s] DHT-P2P-HELLO from %s", label, sender.Short())
// verify integrity of message
if ok, err := msg.Verify(sender); !ok || err != nil {
- logger.Printf(logger.WARN, "[%s] Received invalid DHT_P2P_HELLO message", label)
+ logger.Printf(logger.WARN, "[%s] Received invalid HELLO message", label)
if err != nil {
logger.Printf(logger.ERROR, "[%s] --> %s", label, err.Error())
}
@@ -444,20 +457,20 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
// keep peer addresses in core for transports
aList, err := msg.Addresses()
if err != nil {
- logger.Printf(logger.ERROR, "[%s] Failed to parse addresses from DHT_P2P_HELLO message", label)
+ logger.Printf(logger.ERROR, "[%s] Failed to parse addresses from HELLO message", label)
return false
}
- if newPeer := m.core.Learn(ctx, sender, aList); newPeer {
+ if newPeer := m.core.Learn(ctx, sender, aList, label); newPeer {
// we added a previously unknown peer: send a HELLO
var msgOut *message.DHTP2PHelloMsg
- if msgOut, err = m.getHello(); err != nil {
+ if msgOut, err = m.getHello(label); err != nil {
return false
}
- logger.Printf(logger.INFO, "[%s] Sending HELLO to %s: %s", label, sender, msgOut)
+ logger.Printf(logger.INFO, "[%s] Sending own HELLO to %s", label, sender.Short())
err = m.core.Send(ctx, sender, msgOut)
// no error if the message might have been sent
if err != nil && err != transport.ErrEndpMaybeSent {
- logger.Printf(logger.ERROR, "[%s] Failed to send HELLO message: %s", label, err.Error())
+ logger.Printf(logger.ERROR, "[%s] -> failed to send HELLO message: %s", label, err.Error())
}
}
@@ -466,14 +479,14 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
isNew := true
if hb, ok := m.rtable.GetHello(k); ok {
// cache entry exists: is the HELLO message more recent?
- _, isNew = hb.Expires.Diff(msg.Expires)
+ _, isNew = hb.Expire_.Diff(msg.Expire)
}
// we need to cache a new(er) HELLO
if isNew {
m.rtable.CacheHello(&blocks.HelloBlock{
PeerID: sender,
Signature: msg.Signature,
- Expires: msg.Expires,
+ Expire_: msg.Expire,
AddrBin: util.Clone(msg.AddrList),
})
}
@@ -486,51 +499,68 @@ func (m *Module) HandleMessage(ctx context.Context, sender *util.PeerID, msgIn m
//----------------------------------------------------------
// DHT PUT
//----------------------------------------------------------
- logger.Printf(logger.INFO, "[%s] Handling DHTClientPut message", label)
+ logger.Printf(logger.INFO, "[%s] Ignoring DHTClientPut message", label)
case *message.DHTClientGetMsg:
//----------------------------------------------------------
// DHT GET
//----------------------------------------------------------
- logger.Printf(logger.INFO, "[%s] Handling DHTClientGet message", label)
+ logger.Printf(logger.INFO, "[%s] Ignoring DHTClientGet message", label)
case *message.DHTClientGetResultsKnownMsg:
//----------------------------------------------------------
// DHT GET-RESULTS-KNOWN
//----------------------------------------------------------
- logger.Printf(logger.INFO, "[%s] Handling DHTClientGetResultsKnown message", label)
+ logger.Printf(logger.INFO, "[%s] Ignoring DHTClientGetResultsKnown message", label)
case *message.DHTClientGetStopMsg:
//----------------------------------------------------------
// DHT GET-STOP
//----------------------------------------------------------
- logger.Printf(logger.INFO, "[%s] Handling DHTClientGetStop message", label)
+ logger.Printf(logger.INFO, "[%s] Ignoring DHTClientGetStop message", label)
case *message.DHTClientResultMsg:
//----------------------------------------------------------
// DHT RESULT
//----------------------------------------------------------
- logger.Printf(logger.INFO, "[%s] Handling DHTClientResult message", label)
+ logger.Printf(logger.INFO, "[%s] Ignoring DHTClientResult message", label)
default:
//----------------------------------------------------------
// UNKNOWN message type received
//----------------------------------------------------------
- logger.Printf(logger.ERROR, "[%s] Unhandled message of type (%d)\n", label, msgIn.Header().MsgType)
+ logger.Printf(logger.ERROR, "[%s] Unhandled message of type (%s)\n", label, msgIn.Type())
return false
}
return true
}
+//----------------------------------------------------------------------
+// Helpers
+//----------------------------------------------------------------------
+
// send a result back to caller
func (m *Module) sendResult(ctx context.Context, query blocks.Query, blk blocks.Block, pth *path.Path, back transport.Responder) error {
// assemble result message
out := message.NewDHTP2PResultMsg()
- out.BType = uint32(query.Type())
- out.Expires = blk.Expire()
+ out.BType = query.Type()
+ out.Flags = query.Flags()
+ out.Expire = blk.Expire()
out.Query = query.Key()
out.Block = blk.Bytes()
out.MsgSize += uint16(len(out.Block))
+ out.SetPath(pth)
+
// send message
return back.Send(ctx, out)
}
+
+// get enforced action for GET message
+func getActions(closest, demux, approx bool) (doResult, doForward bool) {
+ return closest || (demux && approx), !closest || (demux && !approx)
+}
+
+// get enforced action for PUT message
+func putActions(closest, demux bool) (doStore, doForward bool) {
+ return closest || demux, !closest || demux
+}
diff --git a/src/gnunet/service/dht/messages_test.go b/src/gnunet/service/dht/messages_test.go
@@ -0,0 +1,73 @@
+// This file is part of gnunet-go, a GNUnet-implementation in Golang.
+// Copyright (C) 2019-2022 Bernd Fix >Y<
+//
+// gnunet-go is free software: you can redistribute it and/or modify it
+// under the terms of the GNU Affero General Public License as published
+// by the Free Software Foundation, either version 3 of the License,
+// or (at your option) any later version.
+//
+// gnunet-go 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
+// Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+// SPDX-License-Identifier: AGPL3.0-or-later
+
+package dht
+
+import "testing"
+
+func TestGetActions(t *testing.T) {
+ var data = [][]bool{
+ // closest, demux, approx => doResult, doForward
+ //
+ // | N | N | N | => | N | Y | Forward GET msg to neighbors
+ // | Y | N | N | => | Y | N | Return block if in DHT
+ // | N | N | Y | => | N | Y | Forward GET msg to neighbors
+ // | Y | N | Y | => | Y | N | Return best-match block from DHT
+ // | N | Y | N | => | N | Y | Forward GET msg to neighbors
+ // | Y | Y | N | => | Y | Y | Return block if in DHT and forward GET
+ // | N | Y | Y | => | Y | Y | Return best-match block from DHT than forward GET
+ // | Y | Y | Y | => | Y | N | Return best-match block from DHT
+ //
+ {false, false, false, false, true},
+ {true, false, false, true, false},
+ {false, false, true, false, true},
+ {true, false, true, true, false},
+ {false, true, false, false, true},
+ {true, true, false, true, true},
+ {false, true, true, true, true},
+ {true, true, true, true, false},
+ }
+ for i, d := range data {
+ r1, r2 := getActions(d[0], d[1], d[2])
+ if r1 != d[3] || r2 != d[4] {
+ t.Errorf("Failed entry #%d: %v -- got: %v,%v", i, d, r1, r2)
+ }
+ }
+}
+
+func TestPutActions(t *testing.T) {
+ var data = [][]bool{
+ // closest, demux => doStore, doForward
+ //
+ // | N | N | => | N | Y | Forward PUT msg
+ // | Y | N | => | Y | N | store block in DHT
+ // | N | Y | => | Y | Y | Store block in DHT and forward PUT msg
+ // | Y | Y | => | Y | Y | Store block in DHT and forward PUT msg
+ //
+ {false, false, false, true},
+ {true, false, true, false},
+ {false, true, true, true},
+ {true, true, true, true},
+ }
+ for i, d := range data {
+ r1, r2 := putActions(d[0], d[1])
+ if r1 != d[2] || r2 != d[3] {
+ t.Errorf("Failed entry #%d: %v -- got: %v,%v", i, d, r1, r2)
+ }
+ }
+}
diff --git a/src/gnunet/service/dht/module.go b/src/gnunet/service/dht/module.go
@@ -20,7 +20,8 @@ package dht
import (
"context"
- "errors"
+ "encoding/hex"
+ "fmt"
"gnunet/config"
"gnunet/core"
"gnunet/crypto"
@@ -71,10 +72,15 @@ func (lr *LocalBlockResponder) Send(ctx context.Context, msg message.Message) er
case *message.DHTP2PResultMsg:
// deliver incoming blocks
go func() {
- lr.ch <- blocks.NewGenericBlock(res.Block)
+ blk, err := blocks.NewBlock(enums.BlockType(res.BType), res.Expire, res.Block)
+ if err == nil {
+ lr.ch <- blk
+ } else {
+ logger.Println(logger.WARN, "[local] DHT-RESULT block problem: "+err.Error())
+ }
}()
default:
- logger.Println(logger.WARN, "[local] not a DHT-RESULT -- skipped")
+ logger.Printf(logger.WARN, "[local] %d not a DHT-RESULT -- skipped", "")
}
return nil
}
@@ -133,8 +139,8 @@ func NewModule(ctx context.Context, c *core.Core, cfg *config.DHTConfig) (m *Mod
// run periodic tasks (8.2. peer discovery)
ticker := time.NewTicker(5 * time.Minute)
- key := crypto.Hash(m.core.PeerID().Data)
- flags := uint16(enums.DHT_RO_FIND_APPROXIMATE | enums.DHT_RO_DEMULTIPLEX_EVERYWHERE)
+ key := crypto.Hash(m.core.PeerID().Bytes())
+ flags := uint16(enums.DHT_RO_FIND_APPROXIMATE | enums.DHT_RO_DEMULTIPLEX_EVERYWHERE | enums.DHT_RO_DISCOVERY)
var resCh <-chan blocks.Block
go func() {
for {
@@ -142,25 +148,29 @@ func NewModule(ctx context.Context, c *core.Core, cfg *config.DHTConfig) (m *Mod
// initiate peer discovery
case <-ticker.C:
// query DHT for our own HELLO block
- query := blocks.NewGenericQuery(key, enums.BLOCK_TYPE_DHT_HELLO, flags)
+ query := blocks.NewGenericQuery(key, enums.BLOCK_TYPE_DHT_URL_HELLO, flags)
+ logger.Printf(logger.DBG, "[dht-discovery] own HELLO key %s", query.Key().Short())
resCh = m.Get(ctx, query)
// handle peer discover results
case res := <-resCh:
// check for correct type
btype := res.Type()
- if btype == enums.BLOCK_TYPE_DHT_HELLO {
+ if btype == enums.BLOCK_TYPE_DHT_URL_HELLO {
hb, ok := res.(*blocks.HelloBlock)
if !ok {
- logger.Printf(logger.WARN, "[dht] peer discovery received invalid block data")
+ logger.Println(logger.WARN, "[dht-discovery] received invalid block data")
+ logger.Printf(logger.DBG, "[dht-discovery] -> %s", hex.EncodeToString(res.Bytes()))
} else {
// cache HELLO block
m.rtable.CacheHello(hb)
// add sender to routing table
- m.rtable.Add(NewPeerAddress(hb.PeerID), "dht")
+ m.rtable.Add(NewPeerAddress(hb.PeerID), "dht-discovery")
+ // learn addresses
+ m.core.Learn(ctx, hb.PeerID, hb.Addresses(), "dht-discovery")
}
} else {
- logger.Printf(logger.WARN, "[dht] peer discovery received invalid block type %s", btype.String())
+ logger.Printf(logger.WARN, "[dht-discovery] received invalid block type %s", btype)
}
// termination
@@ -198,9 +208,10 @@ func (m *Module) Get(ctx context.Context, query blocks.Query) <-chan blocks.Bloc
// assemble a new GET message
msg := message.NewDHTP2PGetMsg()
- msg.BType = uint32(query.Type())
+ msg.BType = query.Type()
msg.Flags = query.Flags()
msg.HopCount = 0
+ msg.Query = query.Key()
msg.ReplLevel = uint16(m.cfg.Routing.ReplLevel)
msg.PeerFilter = blocks.NewPeerFilter()
msg.ResFilter = rf.Bytes()
@@ -231,11 +242,6 @@ func (m *Module) Get(ctx context.Context, query blocks.Query) <-chan blocks.Bloc
return hdlr.C()
}
-// GetApprox returns the first block not excluded ["dht:getapprox"]
-func (m *Module) GetApprox(ctx context.Context, query blocks.Query, rf blocks.ResultFilter) (results []*store.DHTResult, err error) {
- return m.store.GetApprox("dht", query, rf)
-}
-
// Put a block into the DHT ["dht:put"]
func (m *Module) Put(ctx context.Context, query blocks.Query, block blocks.Block) error {
// get additional query parameters
@@ -245,12 +251,12 @@ func (m *Module) Put(ctx context.Context, query blocks.Query, block blocks.Block
}
// assemble a new PUT message
msg := message.NewDHTP2PPutMsg()
- msg.BType = uint32(query.Type())
+ msg.BType = query.Type()
msg.Flags = query.Flags()
msg.HopCount = 0
msg.PeerFilter = blocks.NewPeerFilter()
msg.ReplLvl = uint16(m.cfg.Routing.ReplLevel)
- msg.Expiration = expire
+ msg.Expire = expire
msg.Block = block.Bytes()
msg.Key = query.Key().Clone()
msg.TruncOrigin = nil
@@ -259,7 +265,9 @@ func (m *Module) Put(ctx context.Context, query blocks.Query, block blocks.Block
msg.MsgSize += uint16(len(msg.Block))
// send message
- go m.HandleMessage(ctx, nil, msg, nil)
+ self := m.core.PeerID()
+ msg.PeerFilter.Add(self)
+ go m.HandleMessage(ctx, self, msg, nil)
return nil
}
@@ -277,16 +285,16 @@ func (m *Module) Filter() *core.EventFilter {
// messages we are interested in:
// (1) DHT_P2P messages
- f.AddMsgType(message.DHT_P2P_PUT)
- f.AddMsgType(message.DHT_P2P_GET)
- f.AddMsgType(message.DHT_P2P_RESULT)
- f.AddMsgType(message.DHT_P2P_HELLO)
+ f.AddMsgType(enums.MSG_DHT_P2P_PUT)
+ f.AddMsgType(enums.MSG_DHT_P2P_GET)
+ f.AddMsgType(enums.MSG_DHT_P2P_RESULT)
+ f.AddMsgType(enums.MSG_DHT_P2P_HELLO)
// (2) DHT messages (legacy, not implemented)
- f.AddMsgType(message.DHT_CLIENT_GET)
- f.AddMsgType(message.DHT_CLIENT_GET_RESULTS_KNOWN)
- f.AddMsgType(message.DHT_CLIENT_GET_STOP)
- f.AddMsgType(message.DHT_CLIENT_PUT)
- f.AddMsgType(message.DHT_CLIENT_RESULT)
+ f.AddMsgType(enums.MSG_DHT_CLIENT_GET)
+ f.AddMsgType(enums.MSG_DHT_CLIENT_GET_RESULTS_KNOWN)
+ f.AddMsgType(enums.MSG_DHT_CLIENT_GET_STOP)
+ f.AddMsgType(enums.MSG_DHT_CLIENT_PUT)
+ f.AddMsgType(enums.MSG_DHT_CLIENT_RESULT)
return f
}
@@ -297,27 +305,28 @@ func (m *Module) event(ctx context.Context, ev *core.Event) {
// New peer connected:
case core.EV_CONNECT:
// Add peer to routing table
- logger.Printf(logger.INFO, "[dht-event] Peer %s connected", ev.Peer)
+ logger.Printf(logger.INFO, "[dht-event] Peer %s connected", ev.Peer.Short())
m.rtable.Add(NewPeerAddress(ev.Peer), "dht-event")
// Peer disconnected:
case core.EV_DISCONNECT:
// Remove peer from routing table
- logger.Printf(logger.INFO, "[dht-event] Peer %s disconnected", ev.Peer)
- m.rtable.Remove(NewPeerAddress(ev.Peer), 0)
+ logger.Printf(logger.INFO, "[dht-event] Peer %s disconnected", ev.Peer.Short())
+ m.rtable.Remove(NewPeerAddress(ev.Peer), "dht-event", 0)
// Message received.
case core.EV_MESSAGE:
- logger.Printf(logger.INFO, "[dht-event] Message received: %s", ev.Msg.String())
-
+ // generate tracking label
+ label := fmt.Sprintf("dht-msg-%d", util.NextID())
+ tctx := context.WithValue(ctx, core.CtxKey("label"), label)
// check if peer is in routing table (connected peer)
- if !m.rtable.Contains(NewPeerAddress(ev.Peer)) {
- logger.Printf(logger.WARN, "[dht-event] message %d from unregistered peer -- discarded", ev.Msg.Header().MsgType)
+ if !m.rtable.Contains(NewPeerAddress(ev.Peer), label) {
+ logger.Printf(logger.WARN, "[%s] message %d from unregistered peer -- discarded", label, ev.Msg.Type())
return
}
// process message
- if !m.HandleMessage(ctx, ev.Peer, ev.Msg, ev.Resp) {
- logger.Println(logger.WARN, "[dht-event] Message NOT handled!")
+ if !m.HandleMessage(tctx, ev.Peer, ev.Msg, ev.Resp) {
+ logger.Printf(logger.WARN, "[%s] %s message NOT handled", label, ev.Msg.Type())
}
}
}
@@ -337,20 +346,20 @@ func (m *Module) heartbeat(ctx context.Context) {
//----------------------------------------------------------------------
// Send the currently active HELLO to given network address
-func (m *Module) SendHello(ctx context.Context, addr *util.Address) (err error) {
+func (m *Module) SendHello(ctx context.Context, addr *util.Address, label string) (err error) {
// get (buffered) HELLO
var msg *message.DHTP2PHelloMsg
- if msg, err = m.getHello(); err != nil {
+ if msg, err = m.getHello(label); err != nil {
return
}
- logger.Printf(logger.INFO, "[core] Sending HELLO to %s: %s", addr.URI(), msg)
+ logger.Printf(logger.INFO, "[%s] Sending own HELLO to %s", label, addr.URI())
return m.core.SendToAddr(ctx, addr, msg)
}
// get the recent HELLO if it is defined and not expired;
// create a new HELLO otherwise.
-func (m *Module) getHello() (msg *message.DHTP2PHelloMsg, err error) {
- if m.lastHello == nil || m.lastHello.Expires.Expired() {
+func (m *Module) getHello(label string) (msg *message.DHTP2PHelloMsg, err error) {
+ if m.lastHello == nil || m.lastHello.Expire.Expired() {
// assemble new (signed) HELLO block
var addrList []*util.Address
if addrList, err = m.core.Addresses(); err != nil {
@@ -359,7 +368,7 @@ func (m *Module) getHello() (msg *message.DHTP2PHelloMsg, err error) {
// assemble HELLO data
hb := new(blocks.HelloBlock)
hb.PeerID = m.core.PeerID()
- hb.Expires = util.NewAbsoluteTime(time.Now().Add(message.HelloAddressExpiration))
+ hb.Expire_ = util.NewAbsoluteTime(time.Now().Add(message.HelloAddressExpiration))
hb.SetAddresses(addrList)
// sign HELLO block
@@ -368,12 +377,11 @@ func (m *Module) getHello() (msg *message.DHTP2PHelloMsg, err error) {
}
// assemble HELLO message
msg = message.NewDHTP2PHelloMsg()
- msg.Expires = hb.Expires
+ msg.Expire = hb.Expire_
msg.SetAddresses(hb.Addresses())
if err = m.core.Sign(msg); err != nil {
return
}
-
// save for later use
m.lastHello = msg
@@ -381,12 +389,12 @@ func (m *Module) getHello() (msg *message.DHTP2PHelloMsg, err error) {
var ok bool
if ok, err = msg.Verify(m.core.PeerID()); !ok || err != nil {
if !ok {
- err = errors.New("failed to verify own HELLO")
+ err = fmt.Errorf("[%s] failed to verify own HELLO", label)
}
logger.Println(logger.ERROR, err.Error())
return
}
- logger.Println(logger.DBG, "[dht] New HELLO: "+util.Dump(msg, "hex"))
+ logger.Printf(logger.INFO, "[%s] new own HELLO created (expires %s)", label, msg.Expire)
return
}
// we have a valid HELLO for re-use.
@@ -401,7 +409,6 @@ func (m *Module) getHello() (msg *message.DHTP2PHelloMsg, err error) {
func (m *Module) Export(fcn map[string]any) {
// add exported functions from module
fcn["dht:get"] = m.Get
- fcn["dht:getapprox"] = m.GetApprox
fcn["dht:put"] = m.Put
}
diff --git a/src/gnunet/service/dht/path/elements.go b/src/gnunet/service/dht/path/elements.go
@@ -60,7 +60,7 @@ func (e *Entry) String() string {
//----------------------------------------------------------------------
// shared path element data across types
type elementData struct {
- Expiration util.AbsoluteTime // expiration date
+ Expire util.AbsoluteTime // expiration date
BlockHash *crypto.HashCode // block hash
PeerPredecessor *util.PeerID // predecessor peer
PeerSuccessor *util.PeerID // successor peer
diff --git a/src/gnunet/service/dht/path/handling.go b/src/gnunet/service/dht/path/handling.go
@@ -129,7 +129,7 @@ func (p *Path) Clone() *Path {
func (p *Path) NewElement(pred, signer, succ *util.PeerID) *Element {
return &Element{
elementData: elementData{
- Expiration: p.Expire,
+ Expire: p.Expire,
BlockHash: p.BlkHash,
PeerPredecessor: pred,
PeerSuccessor: succ,
diff --git a/src/gnunet/service/dht/resulthandler.go b/src/gnunet/service/dht/resulthandler.go
@@ -44,31 +44,6 @@ import (
// different GET requests and/or differnent originators).
//======================================================================
-// ResultHandler interface
-type ResultHandler interface {
-
- // ID returna the handler id
- ID() int
-
- // Done returns true if handler can be removed
- Done() bool
-
- // Key returns the query/store key as string
- Key() *crypto.HashCode
-
- // Flags returns the query flags
- Flags() uint16
-
- // Compare two result handlers
- Compare(ResultHandler) int
-
- // Merge two result handlers that are the same except for result filter
- Merge(ResultHandler) bool
-
- // Handle result message
- Handle(ctx context.Context, msg *message.DHTP2PResultMsg, pth *path.Path, sender, local *util.PeerID) bool
-}
-
// Compare return values
//nolint:stylecheck // allow non-camel-case in constants
const (
@@ -78,24 +53,23 @@ const (
RHC_REPLACE = blocks.CMP_1 // the two result handlers are siblings
)
-//----------------------------------------------------------------------
-
-// Generic (shared) result handler data structure
-type GenericResultHandler struct {
+// ResultHandler for handling DHT-RESULT messages
+type ResultHandler struct {
id int // task identifier
key *crypto.HashCode // GET query key
- btype uint32 // content type of the payload
+ btype enums.BlockType // content type of the payload
flags uint16 // processing flags
resFilter blocks.ResultFilter // result filter
xQuery []byte // extended query
started util.AbsoluteTime // Timestamp of session start
active bool // is the task active?
+ resp transport.Responder // back-channel to deliver result
}
-// NewGenericResultHandler creates an instance from a DHT-GET message and a
+// NewResultHandler creates an instance from a DHT-GET message and a
// result filter instance.
-func NewGenericResultHandler(msg *message.DHTP2PGetMsg, rf blocks.ResultFilter) *GenericResultHandler {
- return &GenericResultHandler{
+func NewResultHandler(msg *message.DHTP2PGetMsg, rf blocks.ResultFilter, back transport.Responder) *ResultHandler {
+ return &ResultHandler{
id: util.NextID(),
key: msg.Query.Clone(),
btype: msg.BType,
@@ -104,37 +78,45 @@ func NewGenericResultHandler(msg *message.DHTP2PGetMsg, rf blocks.ResultFilter)
xQuery: util.Clone(msg.XQuery),
started: util.AbsoluteTimeNow(),
active: true,
+ resp: back,
}
}
// ID returns the result handler identifier
-func (t *GenericResultHandler) ID() int {
+func (t *ResultHandler) ID() int {
return t.id
}
// Key returns the key string
-func (t *GenericResultHandler) Key() *crypto.HashCode {
+func (t *ResultHandler) Key() *crypto.HashCode {
return t.key
}
// Flags returns the query flags
-func (t *GenericResultHandler) Flags() uint16 {
+func (t *ResultHandler) Flags() uint16 {
return t.flags
}
// Done returns true if the result handler is no longer active.
-func (t *GenericResultHandler) Done() bool {
+func (t *ResultHandler) Done() bool {
return !t.active || t.started.Add(time.Hour).Expired()
}
// Compare two handlers
-func (t *GenericResultHandler) Compare(h *GenericResultHandler) int {
+func (t *ResultHandler) Compare(h *ResultHandler) int {
+ // check for same recipient
+ tRcv := t.resp.Receiver()
+ hRcv := h.resp.Receiver()
+ if !hRcv.Equal(tRcv) {
+ logger.Printf(logger.DBG, "[rh] recipients differ: %v -- %v", hRcv, tRcv)
+ return RHC_DIFFER
+ }
// check if base attributes differ
- if !t.key.Equals(h.key) ||
+ if !t.key.Equal(h.key) ||
t.btype != h.btype ||
t.flags != h.flags ||
!bytes.Equal(t.xQuery, h.xQuery) {
- logger.Printf(logger.DBG, "[grh] base fields differ")
+ logger.Printf(logger.DBG, "[rh] base fields differ")
return RHC_DIFFER
}
// compare result filters; if they are different, replace
@@ -147,180 +129,52 @@ func (t *GenericResultHandler) Compare(h *GenericResultHandler) int {
}
// Merge two result handlers that are the same except for result filter
-func (t *GenericResultHandler) Merge(a *GenericResultHandler) bool {
+func (t *ResultHandler) Merge(a *ResultHandler) bool {
return t.resFilter.Merge(a.resFilter)
}
// Proceed return true if the message is to be processed in derived implementations
-func (t *GenericResultHandler) Proceed(ctx context.Context, msg *message.DHTP2PResultMsg) bool {
- block := blocks.NewGenericBlock(msg.Block)
- if !t.resFilter.Contains(block) {
- t.resFilter.Add(block)
+func (t *ResultHandler) Proceed(ctx context.Context, msg *message.DHTP2PResultMsg) bool {
+ blk, err := blocks.NewBlock(enums.BlockType(msg.BType), msg.Expire, msg.Block)
+ if err == nil && !t.resFilter.Contains(blk) {
+ t.resFilter.Add(blk)
return true
}
return false
}
-//----------------------------------------------------------------------
-// Result handler for forwarded GET requests
-//----------------------------------------------------------------------
-
-// ForwardResultHandler data structure
-type ForwardResultHandler struct {
- GenericResultHandler
-
- resp transport.Responder // responder for communicating back to originator
-}
-
-// NewForwardResultHandler derived from DHT-GET message
-func NewForwardResultHandler(msgIn message.Message, rf blocks.ResultFilter, back transport.Responder) *ForwardResultHandler {
- // check for correct message type and handler function
- msg, ok := msgIn.(*message.DHTP2PGetMsg)
- if ok {
- return &ForwardResultHandler{
- GenericResultHandler: *NewGenericResultHandler(msg, rf),
- resp: back,
- }
- }
- return nil
-}
-
// Handle incoming DHT-P2P-RESULT message
-func (t *ForwardResultHandler) Handle(ctx context.Context, msg *message.DHTP2PResultMsg, pth *path.Path, sender, local *util.PeerID) bool {
+func (t *ResultHandler) Handle(ctx context.Context, msg *message.DHTP2PResultMsg, pth *path.Path, sender, local *util.PeerID) bool {
// don't send result if it is filtered out
if !t.Proceed(ctx, msg) {
logger.Printf(logger.DBG, "[dht-task-%d] result filtered out -- already known", t.id)
return false
}
- // extend path if route is recorded
- pp := pth.Clone()
- if msg.Flags&enums.DHT_RO_RECORD_ROUTE != 0 {
- // yes: add path element for remote receivers
- if rcv := t.resp.Receiver(); rcv != nil {
+ // check if we are delivering results to remote nodes
+ rcv := t.resp.Receiver()
+ tgt := "locally"
+ if rcv != nil {
+ // extend path if route is recorded
+ var pp *path.Path
+ if msg.Flags&enums.DHT_RO_RECORD_ROUTE != 0 {
+ pp = pth.Clone()
+ // yes: add path element
pe := pp.NewElement(sender, local, rcv)
pp.Add(pe)
}
+ // build updated PUT message
+ msg = msg.Update(pp)
+ tgt = rcv.Short()
}
-
- // build updated PUT message
- msgOut := msg.Update(pp)
-
// send result message back to originator (result forwarding).
- logger.Printf(logger.INFO, "[dht-task-%d] sending result back to originator", t.id)
- if err := t.resp.Send(ctx, msgOut); err != nil && err != transport.ErrEndpMaybeSent {
- logger.Printf(logger.ERROR, "[dht-task-%d] sending result back to originator failed: %s", t.id, err.Error())
+ logger.Printf(logger.INFO, "[dht-task-%d] sending result back %s", t.id, tgt)
+ if err := t.resp.Send(ctx, msg); err != nil && err != transport.ErrEndpMaybeSent {
+ logger.Printf(logger.ERROR, "[dht-task-%d] sending result back %s failed: %s", t.id, tgt, err.Error())
return false
}
return true
}
-// Compare two forward result filters
-func (t *ForwardResultHandler) Compare(h ResultHandler) int {
- // check for correct handler type
- ht, ok := h.(*ForwardResultHandler)
- if !ok {
- logger.Println(logger.DBG, "[frh] can't compare apples with oranges")
- return RHC_DIFFER
- }
- // check for same recipient
- if ht.resp.Receiver().Equals(t.resp.Receiver()) {
- logger.Printf(logger.DBG, "[frh] recipients differ: %s -- %s", ht.resp.Receiver(), t.resp.Receiver())
- return RHC_DIFFER
- }
- // check generic handler data
- return t.GenericResultHandler.Compare(&ht.GenericResultHandler)
-}
-
-// Merge two forward result handlers
-func (t *ForwardResultHandler) Merge(h ResultHandler) bool {
- // check for correct handler type
- ht, ok := h.(*ForwardResultHandler)
- if !ok {
- return false
- }
- return t.GenericResultHandler.Merge(&ht.GenericResultHandler)
-}
-
-//----------------------------------------------------------------------
-// Result handler for locally-initiated GET requests:
-//
-// Before sending the GET request a handler is added for the request:
-//
-// rc := make(chan any)
-// myRH := NewDirectResultHandler(msg, rf, MyCustomHandler, rc)
-// m.reshdlrs.Add(myRH)
-//
-// If a matching response is received, the custom handler is executed
-// in a separate go-routine. A custom handler returns a result (or error) on
-// a back channel and should be context-sensitive (termination).
-//
-// If an asynchronous behaviour is required, use 'ret := <-rc' to wait for
-// completion; synchronous execution does not require 'rc' (which can be set
-// to nil).
-//----------------------------------------------------------------------
-
-// ResultHandlerFcn is the function prototype for custom handlers:
-type ResultHandlerFcn func(context.Context, *message.DHTP2PResultMsg, *path.Path, chan<- any) bool
-
-// DirectResultHandler for local DHT-P2P-GET requests
-type DirectResultHandler struct {
- GenericResultHandler
-
- hdlr ResultHandlerFcn // Hdlr is a custom message handler
- rc chan any // handler result channel
-}
-
-// NewDirectResultHandler create a new GET handler instance
-func NewDirectResultHandler(msgIn message.Message, rf blocks.ResultFilter, hdlr ResultHandlerFcn, rc chan any) *DirectResultHandler {
- // check for correct message type and handler function
- msg, ok := msgIn.(*message.DHTP2PGetMsg)
- if ok {
- return &DirectResultHandler{
- GenericResultHandler: *NewGenericResultHandler(msg, rf),
- hdlr: hdlr,
- rc: rc,
- }
- }
- return nil
-}
-
-// Handle incoming DHT-P2P-RESULT message
-func (t *DirectResultHandler) Handle(ctx context.Context, msg *message.DHTP2PResultMsg, pth *path.Path, sender, local *util.PeerID) bool {
- // don't send result if it is filtered out
- if !t.Proceed(ctx, msg) {
- logger.Printf(logger.DBG, "[dht-task-%d] result filtered out -- already known", t.id)
- return false
- }
- // check for correct message type and handler function
- if t.hdlr != nil {
- logger.Printf(logger.INFO, "[dht-task-%d] handling result message", t.id)
- return t.hdlr(ctx, msg, pth, t.rc)
- }
- return false
-}
-
-// Compare two direct result handlers
-func (t *DirectResultHandler) Compare(h ResultHandler) int {
- // check for correct handler type
- ht, ok := h.(*DirectResultHandler)
- if !ok {
- return RHC_DIFFER
- }
- // check generic handler data
- return t.GenericResultHandler.Compare(&ht.GenericResultHandler)
-}
-
-// Merge two direct result handlers
-func (t *DirectResultHandler) Merge(h ResultHandler) bool {
- // check for correct handler type
- ht, ok := h.(*DirectResultHandler)
- if !ok {
- return false
- }
- // check generic handler data
- return t.GenericResultHandler.Merge(&ht.GenericResultHandler)
-}
-
//----------------------------------------------------------------------
// Handler list for book-keeping:
// * For each query/store key there can be multiple result handlers.
@@ -328,24 +182,24 @@ func (t *DirectResultHandler) Merge(h ResultHandler) bool {
// ResultHandlerList holds the currently active tasks
type ResultHandlerList struct {
- list *util.Map[string, []ResultHandler] // map of handlers
+ list *util.Map[string, []*ResultHandler] // map of handlers
}
// NewResultHandlerList creates a new task list
func NewResultHandlerList() *ResultHandlerList {
return &ResultHandlerList{
- list: util.NewMap[string, []ResultHandler](),
+ list: util.NewMap[string, []*ResultHandler](),
}
}
// Add handler to list
-func (t *ResultHandlerList) Add(hdlr ResultHandler) bool {
+func (t *ResultHandlerList) Add(hdlr *ResultHandler) bool {
// get current list of handlers for key
key := hdlr.Key().String()
list, ok := t.list.Get(key, 0)
modified := false
if !ok {
- list = make([]ResultHandler, 0)
+ list = make([]*ResultHandler, 0)
} else {
// check if handler is already available
loop:
@@ -353,23 +207,23 @@ func (t *ResultHandlerList) Add(hdlr ResultHandler) bool {
switch h.Compare(hdlr) {
case RHC_SAME:
// already in list; no need to add again
- logger.Println(logger.DBG, "[rhl] SAME")
+ logger.Println(logger.DBG, "[rhl] resultfilter compare: SAME")
return false
case RHC_MERGE:
// merge the two result handlers
oldMod := modified
modified = h.Merge(hdlr) || modified
- logger.Printf(logger.DBG, "[rhl] MERGE (%v -- %v)", oldMod, modified)
+ logger.Printf(logger.DBG, "[rhl] resultfilter compare: MERGE (%v -- %v)", oldMod, modified)
break loop
case RHC_REPLACE:
// replace the old handler with the new one
- logger.Println(logger.DBG, "[rhl] REPLACE")
+ logger.Printf(logger.DBG, "[rhl] resultfilter compare: REPLACE #%d with #%d", list[i].id, hdlr.id)
list[i] = hdlr
modified = true
break loop
case RHC_DIFFER:
// try next
- logger.Println(logger.DBG, "[rhl] DIFFER")
+ logger.Println(logger.DBG, "[rhl] resultfilter compare: DIFFER")
}
}
}
@@ -382,14 +236,14 @@ func (t *ResultHandlerList) Add(hdlr ResultHandler) bool {
}
// Get handler list for given key
-func (t *ResultHandlerList) Get(key string) ([]ResultHandler, bool) {
+func (t *ResultHandlerList) Get(key string) ([]*ResultHandler, bool) {
return t.list.Get(key, 0)
}
// Cleanup removes expired tasks from list
func (t *ResultHandlerList) Cleanup() {
- err := t.list.ProcessRange(func(key string, list []ResultHandler, pid int) error {
- var newList []ResultHandler
+ err := t.list.ProcessRange(func(key string, list []*ResultHandler, pid int) error {
+ var newList []*ResultHandler
changed := false
for _, rh := range list {
if !rh.Done() {
@@ -404,6 +258,6 @@ func (t *ResultHandlerList) Cleanup() {
return nil
}, false)
if err != nil {
- logger.Printf(logger.ERROR, "[ResultHandlerList] clean-up error: %s", err.Error())
+ logger.Printf(logger.ERROR, "[rh-list] clean-up error: %s", err.Error())
}
}
diff --git a/src/gnunet/service/dht/routingtable.go b/src/gnunet/service/dht/routingtable.go
@@ -66,7 +66,7 @@ func NewPeerAddress(peer *util.PeerID) *PeerAddress {
func NewQueryAddress(key *crypto.HashCode) *PeerAddress {
return &PeerAddress{
Peer: nil,
- Key: crypto.NewHashCode(key.Bits),
+ Key: crypto.NewHashCode(key.Data),
lastSeen: util.AbsoluteTimeNow(),
lastUsed: util.AbsoluteTimeNow(),
}
@@ -74,18 +74,18 @@ func NewQueryAddress(key *crypto.HashCode) *PeerAddress {
// String returns a human-readble representation of an address.
func (addr *PeerAddress) String() string {
- return hex.EncodeToString(addr.Key.Bits)
+ return hex.EncodeToString(addr.Key.Data)
}
-// Equals returns true if two peer addresses are the same.
-func (addr *PeerAddress) Equals(p *PeerAddress) bool {
- return bytes.Equal(addr.Key.Bits, p.Key.Bits)
+// Equal returns true if two peer addresses are the same.
+func (addr *PeerAddress) Equal(p *PeerAddress) bool {
+ return bytes.Equal(addr.Key.Data, p.Key.Data)
}
// Distance between two addresses: returns a distance value and a
// bucket index (smaller index = less distant).
func (addr *PeerAddress) Distance(p *PeerAddress) (*math.Int, int) {
- r := util.Distance(addr.Key.Bits, p.Key.Bits)
+ r := util.Distance(addr.Key.Data, p.Key.Data)
return r, 512 - r.BitLen()
}
@@ -136,24 +136,22 @@ func NewRoutingTable(ref *PeerAddress, cfg *config.RoutingConfig) *RoutingTable
// Returns true if the entry was added, false otherwise.
func (rt *RoutingTable) Add(p *PeerAddress, label string) bool {
k := p.String()
- logger.Printf(logger.DBG, "[%s] Add(%s)", label, k)
// check if peer is already known
if px, ok := rt.list.Get(k, 0); ok {
- logger.Printf(logger.DBG, "[%s] --> already known", label)
px.lastSeen = util.AbsoluteTimeNow()
return false
}
// compute distance (bucket index) and insert address.
_, idx := p.Distance(rt.ref)
if rt.buckets[idx].Add(p) {
- logger.Printf(logger.DBG, "[%s] --> entry added", label)
p.lastUsed = util.AbsoluteTimeNow()
rt.list.Put(k, p, 0)
+ logger.Printf(logger.INFO, "[%s] %s added to routing table",
+ label, p.Peer.Short())
return true
}
// Full bucket: we did not add the address to the routing table.
- logger.Printf(logger.DBG, "[%s] --> bucket[%d] full -- discarded", label, idx)
return false
}
@@ -178,41 +176,39 @@ func (rt *RoutingTable) Check(p *PeerAddress) int {
// Remove peer address from routing table.
// Returns true if the entry was removed, false otherwise.
-func (rt *RoutingTable) Remove(p *PeerAddress, pid int) bool {
- k := p.String()
- logger.Printf(logger.DBG, "[RT] Remove(%s)", k)
-
+func (rt *RoutingTable) Remove(p *PeerAddress, label string, pid int) bool {
// compute distance (bucket index) and remove entry from bucket
rc := false
_, idx := p.Distance(rt.ref)
if rt.buckets[idx].Remove(p) {
- logger.Println(logger.DBG, "[RT] --> entry removed from bucket and internal lists")
+ logger.Printf(logger.DBG, "[%s] %s removed from RT (bucket and internal lists)", label, p.Peer.Short())
rc = true
} else {
// remove from internal list
- logger.Println(logger.DBG, "[RT] --> entry removed from internal lists only")
+ logger.Printf(logger.DBG, "[%s] %s removed from RT (internal lists only)", label, p.Peer.Short())
}
- rt.list.Delete(k, 0)
+ rt.list.Delete(p.String(), 0)
// delete from HELLO cache
rt.helloCache.Delete(p.Peer.String(), pid)
return rc
}
// Contains checks if a peer is available in the routing table
-func (rt *RoutingTable) Contains(p *PeerAddress) bool {
+func (rt *RoutingTable) Contains(p *PeerAddress, label string) bool {
k := p.String()
- logger.Printf(logger.DBG, "[RT] Contains(%s)?", k)
// check for peer in internal list
px, ok := rt.list.Get(k, 0)
if !ok {
- logger.Println(logger.DBG, "[RT] --> NOT found in current list:")
+ logger.Printf(logger.WARN, "[%s] %s NOT found in RT", label, p.Peer.Short())
+ var list []string
_ = rt.list.ProcessRange(func(key string, val *PeerAddress, _ int) error {
- logger.Printf(logger.DBG, "[RT] * %s", val)
+ list = append(list, val.Peer.Short())
return nil
}, true)
+ logger.Printf(logger.DBG, "[%s] RT=%v", list)
} else {
- logger.Println(logger.DBG, "[RT] --> found in current list")
+ //logger.Println(logger.DBG, "[RT] --> found in current list")
px.lastSeen = util.AbsoluteTimeNow()
}
return ok
@@ -310,7 +306,7 @@ func (rt *RoutingTable) IsClosestPeer(p, k *PeerAddress, pf *blocks.PeerFilter,
return d1.Cmp(d0) < 0
}
// check if p is closest peer
- return n.Equals(p)
+ return n.Equal(p)
}
// ComputeOutDegree computes the number of neighbors that a message should be forwarded to.
@@ -340,23 +336,23 @@ func (rt *RoutingTable) ComputeOutDegree(repl, hop uint16) int {
func (rt *RoutingTable) heartbeat(ctx context.Context) {
// check for dead or expired peers
- logger.Println(logger.DBG, "[dht] RT heartbeat...")
+ logger.Println(logger.DBG, "[dht-rt-hb] RT heartbeat...")
timeout := util.NewRelativeTime(time.Duration(rt.cfg.PeerTTL) * time.Second)
if err := rt.list.ProcessRange(func(k string, p *PeerAddress, pid int) error {
// check if we can/need to drop a peer
drop := timeout.Compare(p.lastSeen.Elapsed()) < 0
if drop || timeout.Compare(p.lastUsed.Elapsed()) < 0 {
- logger.Printf(logger.DBG, "[RT] removing %v: %v, %v", p, p.lastSeen.Elapsed(), p.lastUsed.Elapsed())
- rt.Remove(p, pid)
+ logger.Printf(logger.DBG, "[dht-rt-hb] removing %v: %v, %v", p, p.lastSeen.Elapsed(), p.lastUsed.Elapsed())
+ rt.Remove(p, "dht-rt-hb", pid)
}
return nil
}, false); err != nil {
- logger.Println(logger.ERROR, "[dht] RT heartbeat failed: "+err.Error())
+ logger.Println(logger.ERROR, "[dht-rt-hb] RT heartbeat failed: "+err.Error())
}
// drop expired entries from the HELLO cache
_ = rt.helloCache.ProcessRange(func(key string, val *blocks.HelloBlock, pid int) error {
- if val.Expires.Expired() {
+ if val.Expire_.Expired() {
rt.helloCache.Delete(key, pid)
}
return nil
@@ -369,7 +365,7 @@ func (rt *RoutingTable) heartbeat(ctx context.Context) {
//----------------------------------------------------------------------
// LookupHello returns blocks from the HELLO cache for given query.
-func (rt *RoutingTable) LookupHello(addr *PeerAddress, rf blocks.ResultFilter, approx bool) (results []*store.DHTResult) {
+func (rt *RoutingTable) LookupHello(addr *PeerAddress, rf blocks.ResultFilter, approx bool, label string) (results []*store.DHTResult) {
// iterate over cached HELLOs to find matches;
// approximate search is limited by distance (max. diff for bucket index is 16)
_ = rt.helloCache.ProcessRange(func(key string, hb *blocks.HelloBlock, _ int) error {
@@ -390,7 +386,7 @@ func (rt *RoutingTable) LookupHello(addr *PeerAddress, rf blocks.ResultFilter, a
results = append(results, result)
}
} else {
- logger.Printf(logger.DBG, "[RT] GET-HELLO: cache block is filtered")
+ logger.Printf(logger.DBG, "[%s] LookupHello: cached HELLO block is filtered")
}
return nil
}, true)
@@ -479,7 +475,7 @@ func (b *Bucket) Remove(p *PeerAddress) bool {
defer b.Unlock()
for i, pe := range b.list {
- if pe.Equals(p) {
+ if pe.Equal(p) {
// found entry: remove it
b.list = append(b.list[:i], b.list[i+1:]...)
return true
diff --git a/src/gnunet/service/dht/routingtable_test.go b/src/gnunet/service/dht/routingtable_test.go
@@ -101,7 +101,7 @@ func TestRT(t *testing.T) {
t.Logf("[%6d] %s %s\n", e, task.addr, msg)
}
disconnected := func(task *Entry, e int64, msg string) {
- rt.Remove(task.addr, 0)
+ rt.Remove(task.addr, "test", 0)
task.online = false
task.last = e
t.Logf("[%6d] %s %s\n", e, task.addr, msg)
diff --git a/src/gnunet/service/dht/service.go b/src/gnunet/service/dht/service.go
@@ -83,7 +83,7 @@ loop:
logger.Printf(logger.INFO, "[dht:%d:%d] Received request: %v\n", id, reqID, msg)
// handle message
- valueCtx := context.WithValue(ctx, service.CtxKey("label"), fmt.Sprintf(":%d:%d", id, reqID))
+ valueCtx := context.WithValue(ctx, core.CtxKey("label"), fmt.Sprintf(":%d:%d", id, reqID))
s.HandleMessage(valueCtx, nil, msg, mc)
}
// close client connection
diff --git a/src/gnunet/service/gns/block_handler.go b/src/gnunet/service/gns/block_handler.go
@@ -132,10 +132,10 @@ func NewBlockHandlerList(records []*message.ResourceRecord, labels []string) (*B
continue
}
// check for expired record
- if rec.Expires.Expired() {
+ if rec.Expire.Expired() {
// do we have an associated shadow record?
for _, shadow := range shadows {
- if shadow.Type == rec.Type && !shadow.Expires.Expired() {
+ if shadow.RType == rec.RType && !shadow.Expire.Expired() {
// deliver un-expired shadow record instead.
shadow.Flags &^= uint32(enums.GNS_FLAG_SHADOW)
active = append(active, shadow)
@@ -153,7 +153,7 @@ func NewBlockHandlerList(records []*message.ResourceRecord, labels []string) (*B
logger.Printf(logger.DBG, "[gns] handler_list: skip %v\n", rec)
continue
}
- rrType := enums.GNSType(rec.Type)
+ rrType := enums.GNSType(rec.RType)
hl.counts.Add(rrType)
// check for custom handler type
@@ -224,12 +224,12 @@ type ZoneKeyHandler struct {
// NewZoneHandler returns a new BlockHandler instance
func NewZoneHandler(rec *message.ResourceRecord, labels []string) (BlockHandler, error) {
// check if we have an implementation for the zone type
- if crypto.GetImplementation(rec.Type) == nil {
+ if crypto.GetImplementation(rec.RType) == nil {
return nil, ErrInvalidRecordType
}
// assemble handler
h := &ZoneKeyHandler{
- ztype: rec.Type,
+ ztype: rec.RType,
zkey: nil,
}
// add the record to the handler
@@ -242,7 +242,7 @@ func NewZoneHandler(rec *message.ResourceRecord, labels []string) (BlockHandler,
// AddRecord inserts a PKEY record into the handler.
func (h *ZoneKeyHandler) AddRecord(rec *message.ResourceRecord, labels []string) (err error) {
// check record type
- if rec.Type != h.ztype {
+ if rec.RType != h.ztype {
return ErrInvalidRecordType
}
// check for sole zone key record in block
@@ -292,7 +292,7 @@ type Gns2DnsHandler struct {
// NewGns2DnsHandler returns a new BlockHandler instance
func NewGns2DnsHandler(rec *message.ResourceRecord, labels []string) (BlockHandler, error) {
- if enums.GNSType(rec.Type) != enums.GNS_TYPE_GNS2DNS {
+ if enums.GNSType(rec.RType) != enums.GNS_TYPE_GNS2DNS {
return nil, ErrInvalidRecordType
}
h := &Gns2DnsHandler{
@@ -308,7 +308,7 @@ func NewGns2DnsHandler(rec *message.ResourceRecord, labels []string) (BlockHandl
// AddRecord inserts a GNS2DNS record into the handler.
func (h *Gns2DnsHandler) AddRecord(rec *message.ResourceRecord, labels []string) error {
- if enums.GNSType(rec.Type) != enums.GNS_TYPE_GNS2DNS {
+ if enums.GNSType(rec.RType) != enums.GNS_TYPE_GNS2DNS {
return ErrInvalidRecordType
}
logger.Printf(logger.DBG, "[gns] GNS2DNS data: %s\n", hex.EncodeToString(rec.Data))
@@ -367,7 +367,7 @@ type BoxHandler struct {
// NewBoxHandler returns a new BlockHandler instance
func NewBoxHandler(rec *message.ResourceRecord, labels []string) (BlockHandler, error) {
- if enums.GNSType(rec.Type) != enums.GNS_TYPE_BOX {
+ if enums.GNSType(rec.RType) != enums.GNS_TYPE_BOX {
return nil, ErrInvalidRecordType
}
h := &BoxHandler{
@@ -381,7 +381,7 @@ func NewBoxHandler(rec *message.ResourceRecord, labels []string) (BlockHandler,
// AddRecord inserts a BOX record into the handler.
func (h *BoxHandler) AddRecord(rec *message.ResourceRecord, labels []string) error {
- if enums.GNSType(rec.Type) != enums.GNS_TYPE_BOX {
+ if enums.GNSType(rec.RType) != enums.GNS_TYPE_BOX {
return ErrInvalidRecordType
}
logger.Printf(logger.DBG, "[box-rr] for labels %v\n", labels)
@@ -417,9 +417,9 @@ func (h *BoxHandler) Records(kind RRTypeList) *message.RecordSet {
if kind.HasType(enums.GNSType(box.Type)) {
// valid box found: assemble new resource record.
rr := new(message.ResourceRecord)
- rr.Expires = box.rec.Expires
+ rr.Expire = box.rec.Expire
rr.Flags = box.rec.Flags
- rr.Type = box.Type
+ rr.RType = box.Type
rr.Size = uint32(len(box.RR))
rr.Data = box.RR
rs.AddRecord(rr)
@@ -445,7 +445,7 @@ type LehoHandler struct {
// NewLehoHandler returns a new BlockHandler instance
func NewLehoHandler(rec *message.ResourceRecord, labels []string) (BlockHandler, error) {
- if enums.GNSType(rec.Type) != enums.GNS_TYPE_LEHO {
+ if enums.GNSType(rec.RType) != enums.GNS_TYPE_LEHO {
return nil, ErrInvalidRecordType
}
h := &LehoHandler{
@@ -459,7 +459,7 @@ func NewLehoHandler(rec *message.ResourceRecord, labels []string) (BlockHandler,
// AddRecord inserts a LEHO record into the handler.
func (h *LehoHandler) AddRecord(rec *message.ResourceRecord, labels []string) error {
- if enums.GNSType(rec.Type) != enums.GNS_TYPE_LEHO {
+ if enums.GNSType(rec.RType) != enums.GNS_TYPE_LEHO {
return ErrInvalidRecordType
}
h.name = string(rec.Data)
@@ -500,7 +500,7 @@ type CnameHandler struct {
// NewCnameHandler returns a new BlockHandler instance
func NewCnameHandler(rec *message.ResourceRecord, labels []string) (BlockHandler, error) {
- if enums.GNSType(rec.Type) != enums.GNS_TYPE_DNS_CNAME {
+ if enums.GNSType(rec.RType) != enums.GNS_TYPE_DNS_CNAME {
return nil, ErrInvalidRecordType
}
h := &CnameHandler{
@@ -514,7 +514,7 @@ func NewCnameHandler(rec *message.ResourceRecord, labels []string) (BlockHandler
// AddRecord inserts a CNAME record into the handler.
func (h *CnameHandler) AddRecord(rec *message.ResourceRecord, labels []string) error {
- if enums.GNSType(rec.Type) != enums.GNS_TYPE_DNS_CNAME {
+ if enums.GNSType(rec.RType) != enums.GNS_TYPE_DNS_CNAME {
return ErrInvalidRecordType
}
if h.rec != nil {
@@ -557,7 +557,7 @@ type VpnHandler struct {
// NewVpnHandler returns a new BlockHandler instance
func NewVpnHandler(rec *message.ResourceRecord, labels []string) (BlockHandler, error) {
- if enums.GNSType(rec.Type) != enums.GNS_TYPE_VPN {
+ if enums.GNSType(rec.RType) != enums.GNS_TYPE_VPN {
return nil, ErrInvalidRecordType
}
h := &VpnHandler{}
@@ -569,7 +569,7 @@ func NewVpnHandler(rec *message.ResourceRecord, labels []string) (BlockHandler,
// AddRecord inserts a VPN record into the handler.
func (h *VpnHandler) AddRecord(rec *message.ResourceRecord, labels []string) error {
- if enums.GNSType(rec.Type) != enums.GNS_TYPE_VPN {
+ if enums.GNSType(rec.RType) != enums.GNS_TYPE_VPN {
return ErrInvalidRecordType
}
if h.rec != nil {
diff --git a/src/gnunet/service/gns/dns.go b/src/gnunet/service/gns/dns.go
@@ -176,9 +176,9 @@ func QueryDNS(id int, name string, server net.IP, kind RRTypeList) *message.Reco
// create a new GNS resource record
rr := new(message.ResourceRecord)
expires := time.Now().Add(time.Duration(record.Header().Ttl) * time.Second)
- rr.Expires = util.NewAbsoluteTime(expires)
+ rr.Expire = util.NewAbsoluteTime(expires)
rr.Flags = 0
- rr.Type = uint32(record.Header().Rrtype)
+ rr.RType = uint32(record.Header().Rrtype)
rr.Size = uint32(record.Header().Rdlength)
rr.Data = make([]byte, rr.Size)
@@ -230,7 +230,7 @@ func (m *Module) ResolveDNS(
// traverse resource records for 'A' and 'AAAA' records.
rec_loop:
for _, rec := range set.Records {
- switch enums.GNSType(rec.Type) {
+ switch enums.GNSType(rec.RType) {
case enums.GNS_TYPE_DNS_AAAA:
addr = net.IP(rec.Data)
// we prefer IPv6
diff --git a/src/gnunet/service/gns/module.go b/src/gnunet/service/gns/module.go
@@ -113,10 +113,10 @@ func NewModule(ctx context.Context, c *core.Core) (m *Module) {
// Filter returns the event filter for the service
func (m *Module) Filter() *core.EventFilter {
f := core.NewEventFilter()
- f.AddMsgType(message.GNS_LOOKUP)
- f.AddMsgType(message.GNS_LOOKUP_RESULT)
- f.AddMsgType(message.GNS_REVERSE_LOOKUP)
- f.AddMsgType(message.GNS_REVERSE_LOOKUP_RESULT)
+ f.AddMsgType(enums.MSG_GNS_LOOKUP)
+ f.AddMsgType(enums.MSG_GNS_LOOKUP_RESULT)
+ f.AddMsgType(enums.MSG_GNS_REVERSE_LOOKUP)
+ f.AddMsgType(enums.MSG_GNS_REVERSE_LOOKUP_RESULT)
return f
}
@@ -299,8 +299,8 @@ func (m *Module) ResolveRelative(
// the longest-living record in the current set.
expires := util.AbsoluteTimeNow()
for _, rec := range set.Records {
- if rec.Expires.Compare(expires) > 0 {
- expires = rec.Expires
+ if rec.Expire.Compare(expires) > 0 {
+ expires = rec.Expire
}
}
set.Records = append(set.Records, m.newLEHORecord(inst.Query, expires))
@@ -340,7 +340,7 @@ func (m *Module) ResolveRelative(
set = message.NewRecordSet()
for _, rec := range records {
// is this the record type we are looking for?
- if kind.HasType(enums.GNSType(rec.Type)) {
+ if kind.HasType(enums.GNSType(rec.RType)) {
// add it to the result
if rec = hdlrs.FinalizeRecord(rec); rec != nil {
set.AddRecord(rec)
@@ -363,7 +363,7 @@ func (m *Module) ResolveRelative(
// asking for explicitly.
if set.Count > 0 {
for _, rec := range records {
- if !kind.HasType(enums.GNSType(rec.Type)) && (int(rec.Flags)&enums.GNS_FLAG_SUPPL) != 0 {
+ if !kind.HasType(enums.GNSType(rec.RType)) && (int(rec.Flags)&enums.GNS_FLAG_SUPPL) != 0 {
set.AddRecord(rec)
}
}
@@ -472,9 +472,9 @@ func (m *Module) Lookup(
// newLEHORecord creates a new supplemental GNS record of type LEHO.
func (m *Module) newLEHORecord(name string, expires util.AbsoluteTime) *message.ResourceRecord {
rr := new(message.ResourceRecord)
- rr.Expires = expires
+ rr.Expire = expires
rr.Flags = uint32(enums.GNS_FLAG_SUPPL)
- rr.Type = uint32(enums.GNS_TYPE_LEHO)
+ rr.RType = uint32(enums.GNS_TYPE_LEHO)
rr.Size = uint32(len(name) + 1)
rr.Data = make([]byte, rr.Size)
copy(rr.Data, []byte(name))
diff --git a/src/gnunet/service/gns/service.go b/src/gnunet/service/gns/service.go
@@ -96,7 +96,7 @@ func (s *Service) ServeClient(ctx context.Context, id int, mc *service.Connectio
logger.Printf(logger.INFO, "[gns:%d:%d] Received request: %v\n", id, reqID, msg)
// handle message
- valueCtx := context.WithValue(ctx, service.CtxKey("label"), fmt.Sprintf(":%d:%d", id, reqID))
+ valueCtx := context.WithValue(ctx, core.CtxKey("label"), fmt.Sprintf(":%d:%d", id, reqID))
s.HandleMessage(valueCtx, nil, msg, mc)
}
// close client connection
@@ -136,7 +136,7 @@ func (s *Service) HandleMessage(ctx context.Context, sender *util.PeerID, msg me
logger.Printf(logger.DBG, "[gns%s] Lookup request finished.\n", label)
}()
- kind := NewRRTypeList(enums.GNSType(m.Type))
+ kind := NewRRTypeList(enums.GNSType(m.RType))
recset, err := s.Resolve(ctx, label, m.Zone, kind, int(m.Options), 0)
if err != nil {
logger.Printf(logger.ERROR, "[gns%s] Failed to lookup block: %s\n", label, err.Error())
@@ -159,7 +159,7 @@ func (s *Service) HandleMessage(ctx context.Context, sender *util.PeerID, msg me
logger.Printf(logger.DBG, "[gns%s] Record #%d: %v\n", label, i, rec)
// is this the record type we are looking for?
- if rec.Type == m.Type || enums.GNSType(m.Type) == enums.GNS_TYPE_ANY {
+ if rec.RType == m.RType || enums.GNSType(m.RType) == enums.GNS_TYPE_ANY {
// add it to the response message
if err := resp.AddRecord(rec); err != nil {
logger.Printf(logger.ERROR, "[gns%s] failed: %sv", label, err.Error())
@@ -173,7 +173,7 @@ func (s *Service) HandleMessage(ctx context.Context, sender *util.PeerID, msg me
//----------------------------------------------------------
// UNKNOWN message type received
//----------------------------------------------------------
- logger.Printf(logger.ERROR, "[gns%s] Unhandled message of type (%d)\n", label, msg.Header().MsgType)
+ logger.Printf(logger.ERROR, "[gns%s] Unhandled message of type (%s)\n", label, msg.Type())
return false
}
return true
@@ -238,7 +238,7 @@ func (s *Service) RevokeKey(ctx context.Context, rd *revocation.RevData) (succes
// LookupNamecache returns a cached lookup (if available)
func (s *Service) LookupNamecache(ctx context.Context, query *blocks.GNSQuery) (block *blocks.GNSBlock, err error) {
- logger.Printf(logger.DBG, "[gns] LookupNamecache(%s)...\n", hex.EncodeToString(query.Key().Bits))
+ logger.Printf(logger.DBG, "[gns] LookupNamecache(%s)...\n", hex.EncodeToString(query.Key().Data))
// assemble Namecache request
req := message.NewNamecacheLookupMsg(query.Key())
@@ -292,7 +292,7 @@ func (s *Service) LookupNamecache(ctx context.Context, query *blocks.GNSQuery) (
break
}
default:
- logger.Printf(logger.ERROR, "[gns] Got invalid response type (%d)\n", m.Header().MsgType)
+ logger.Printf(logger.ERROR, "[gns] Got invalid response type (%s)\n", m.Type())
err = ErrInvalidResponseType
}
return
@@ -328,7 +328,7 @@ func (s *Service) StoreNamecache(ctx context.Context, query *blocks.GNSQuery, bl
}
return fmt.Errorf("failed with rc=%d", m.Result)
default:
- logger.Printf(logger.ERROR, "[gns] Got invalid response type (%d)\n", m.Header().MsgType)
+ logger.Printf(logger.ERROR, "[gns] Got invalid response type (%s)\n", m.Type())
err = ErrInvalidResponseType
}
return
@@ -340,7 +340,7 @@ func (s *Service) StoreNamecache(ctx context.Context, query *blocks.GNSQuery, bl
// LookupDHT gets a GNS block from the DHT for the given query key.
func (s *Service) LookupDHT(ctx context.Context, query blocks.Query) (block blocks.Block, err error) {
- logger.Printf(logger.DBG, "[gns] LookupDHT(%s)...\n", hex.EncodeToString(query.Key().Bits))
+ logger.Printf(logger.DBG, "[gns] LookupDHT(%s)...\n", hex.EncodeToString(query.Key().Data))
block = nil
// client-connect to the DHT service
@@ -375,7 +375,7 @@ func (s *Service) LookupDHT(ctx context.Context, query blocks.Query) (block bloc
reqGet := message.NewDHTClientGetMsg(query.Key())
reqGet.ID = uint64(util.NextID())
reqGet.ReplLevel = uint32(enums.GNS_REPLICATION_LEVEL)
- reqGet.Type = uint32(enums.BLOCK_TYPE_GNS_NAMERECORD)
+ reqGet.BType = enums.BLOCK_TYPE_GNS_NAMERECORD
reqGet.Options = uint32(enums.DHT_RO_DEMULTIPLEX_EVERYWHERE)
if err = interact(reqGet, true); err != nil {
@@ -413,7 +413,7 @@ func (s *Service) LookupDHT(ctx context.Context, query blocks.Query) (block bloc
break
}
// check if result is of requested type
- if enums.BlockType(m.Type) != enums.BLOCK_TYPE_GNS_NAMERECORD {
+ if enums.BlockType(m.BType) != enums.BLOCK_TYPE_GNS_NAMERECORD {
logger.Println(logger.ERROR, "[gns] DHT response has wrong type")
break
}
diff --git a/src/gnunet/service/module.go b/src/gnunet/service/module.go
@@ -81,9 +81,6 @@ type EventHandler func(context.Context, *core.Event)
// Heartbeat is a function prototype for periodic tasks
type Heartbeat func(context.Context)
-// CtxKey is a value-context key
-type CtxKey string
-
//----------------------------------------------------------------------
// Generic module implementation
//----------------------------------------------------------------------
@@ -121,7 +118,7 @@ func (m *ModuleImpl) Run(
select {
// Handle events
case event := <-m.ch:
- hCtx := context.WithValue(ctx, CtxKey("label"), event.Label)
+ hCtx := context.WithValue(ctx, core.CtxKey("label"), event.Label)
hdlr(hCtx, event)
// wait for terminate signal
diff --git a/src/gnunet/service/revocation/module.go b/src/gnunet/service/revocation/module.go
@@ -23,7 +23,7 @@ import (
"gnunet/config"
"gnunet/core"
"gnunet/crypto"
- "gnunet/message"
+ "gnunet/enums"
"gnunet/service"
"gnunet/service/store"
"gnunet/util"
@@ -85,10 +85,10 @@ func NewModule(ctx context.Context, c *core.Core) (m *Module) {
// Filter returns the event filter for the service
func (m *Module) Filter() *core.EventFilter {
f := core.NewEventFilter()
- f.AddMsgType(message.REVOCATION_QUERY)
- f.AddMsgType(message.REVOCATION_QUERY_RESPONSE)
- f.AddMsgType(message.REVOCATION_REVOKE)
- f.AddMsgType(message.REVOCATION_REVOKE_RESPONSE)
+ f.AddMsgType(enums.MSG_REVOCATION_QUERY)
+ f.AddMsgType(enums.MSG_REVOCATION_QUERY_RESPONSE)
+ f.AddMsgType(enums.MSG_REVOCATION_REVOKE)
+ f.AddMsgType(enums.MSG_REVOCATION_REVOKE_RESPONSE)
return f
}
diff --git a/src/gnunet/service/revocation/service.go b/src/gnunet/service/revocation/service.go
@@ -75,7 +75,7 @@ func (s *Service) ServeClient(ctx context.Context, id int, mc *service.Connectio
logger.Printf(logger.INFO, "[revocation:%d:%d] Received request: %v\n", id, reqID, msg)
// handle message
- valueCtx := context.WithValue(ctx, service.CtxKey("label"), fmt.Sprintf(":%d:%d", id, reqID))
+ valueCtx := context.WithValue(ctx, core.CtxKey("label"), fmt.Sprintf(":%d:%d", id, reqID))
s.HandleMessage(valueCtx, nil, msg, mc)
}
// close client connection
@@ -157,7 +157,7 @@ func (s *Service) HandleMessage(ctx context.Context, sender *util.PeerID, msg me
//----------------------------------------------------------
// UNKNOWN message type received
//----------------------------------------------------------
- logger.Printf(logger.ERROR, "[revocation%s] Unhandled message of type (%d)\n", label, msg.Header().MsgType)
+ logger.Printf(logger.ERROR, "[revocation%s] Unhandled message of type (%s)\n", label, msg.Type())
return false
}
return true
diff --git a/src/gnunet/service/store/store_dht.go b/src/gnunet/service/store/store_dht.go
@@ -166,9 +166,15 @@ func (s *DHTStore) Put(query blocks.Query, entry *DHTEntry) (err error) {
btype := query.Type()
expire := entry.Blk.Expire()
blkSize := len(entry.Blk.Bytes())
+ pl := 0
+ if entry.Path != nil {
+ pl = int(entry.Path.NumList)
+ }
+ logger.Printf(logger.INFO, "[dht-store] storing %d bytes under key %s (path: %d)",
+ blkSize, query.Key().Short(), pl)
// write entry to file for storage
- if err = s.writeEntry(query.Key().Bits, entry); err != nil {
+ if err = s.writeEntry(query.Key().Data, entry); err != nil {
return
}
// compile metadata
@@ -220,13 +226,13 @@ func (s *DHTStore) Get(label string, query blocks.Query, rf blocks.ResultFilter)
}
// read entry from storage
var entry *DHTEntry
- if entry, err = s.readEntry(md.key.Bits); err != nil {
+ if entry, err = s.readEntry(md); err != nil {
logger.Printf(logger.ERROR, "[%s] can't read DHT entry: %s", label, err)
continue
}
results = append(results, entry)
// mark the block as newly used
- if err = s.meta.Used(md.key.Bits, md.btype); err != nil {
+ if err = s.meta.Used(md.key.Data, md.btype); err != nil {
logger.Printf(logger.ERROR, "[%s] can't flag DHT entry as used: %s", label, err)
continue
}
@@ -246,13 +252,13 @@ func (s *DHTStore) GetApprox(label string, query blocks.Query, rf blocks.ResultF
return
}
// check distance (max. 16 bucktes off)
- dist := util.Distance(md.key.Bits, query.Key().Bits)
+ dist := util.Distance(md.key.Data, query.Key().Data)
if (512 - dist.BitLen()) > 16 {
return
}
// read entry from storage
var entry *DHTEntry
- if entry, err = s.readEntry(md.key.Bits); err != nil {
+ if entry, err = s.readEntry(md); err != nil {
logger.Printf(logger.ERROR, "[%s] failed to retrieve block for %s", label, md.key.String())
return
}
@@ -278,9 +284,9 @@ type entryLayout struct {
}
// read entry from storage for given key
-func (s *DHTStore) readEntry(key []byte) (entry *DHTEntry, err error) {
+func (s *DHTStore) readEntry(md *FileMetadata) (entry *DHTEntry, err error) {
// get path and filename from key
- folder, fname := s.expandPath(key)
+ folder, fname := s.expandPath(md.key.Data)
// open file for reading
var file *os.File
@@ -300,7 +306,9 @@ func (s *DHTStore) readEntry(key []byte) (entry *DHTEntry, err error) {
}
// assemble entry
entry = new(DHTEntry)
- entry.Blk = blocks.NewGenericBlock(val.Block)
+ if entry.Blk, err = blocks.NewBlock(md.btype, md.expires, val.Block); err != nil {
+ return
+ }
entry.Path, err = path.NewPathFromBytes(val.Path)
return
}
@@ -366,12 +374,12 @@ func (s *DHTStore) dropFile(md *FileMetadata) (err error) {
// adjust total size
s.totalSize -= md.size
// remove from database
- if err = s.meta.Drop(md.key.Bits, md.btype); err != nil {
+ if err = s.meta.Drop(md.key.Data, md.btype); err != nil {
logger.Printf(logger.ERROR, "[store] can't remove metadata (%s,%d): %s", md.key, md.btype, err.Error())
return
}
// remove from filesystem
- h := hex.EncodeToString(md.key.Bits)
+ h := hex.EncodeToString(md.key.Data)
path := fmt.Sprintf("%s/%s/%s/%s", s.path, h[:2], h[2:4], h[4:])
if err = os.Remove(path); err != nil {
logger.Printf(logger.ERROR, "[store] can't remove file %s: %s", path, err.Error())
diff --git a/src/gnunet/service/store/store_dht_meta.go b/src/gnunet/service/store/store_dht_meta.go
@@ -99,7 +99,7 @@ func OpenMetaDB(path string) (db *FileMetaDB, err error) {
func (db *FileMetaDB) Store(md *FileMetadata) (err error) {
sql := "replace into meta(qkey,btype,bhash,size,stored,expires,lastUsed,usedCount) values(?,?,?,?,?,?,?,?)"
_, err = db.conn.Exec(sql,
- md.key.Bits, md.btype, md.bhash.Bits, md.size, md.stored.Epoch(),
+ md.key.Data, md.btype, md.bhash.Data, md.size, md.stored.Epoch(),
md.expires.Epoch(), md.lastUsed.Epoch(), md.usedCount)
return
}
@@ -111,9 +111,9 @@ func (db *FileMetaDB) Get(query blocks.Query) (mds []*FileMetadata, err error) {
btype := query.Type()
var rows *sql.Rows
if btype == enums.BLOCK_TYPE_ANY {
- rows, err = db.conn.Query(stmt, query.Key().Bits)
+ rows, err = db.conn.Query(stmt, query.Key().Data)
} else {
- rows, err = db.conn.Query(stmt+" and btype=?", query.Key().Bits, btype)
+ rows, err = db.conn.Query(stmt+" and btype=?", query.Key().Data, btype)
}
if err != nil {
return
@@ -124,7 +124,7 @@ func (db *FileMetaDB) Get(query blocks.Query) (mds []*FileMetadata, err error) {
md.key = query.Key()
md.btype = btype
var st, exp, lu uint64
- if err = rows.Scan(&md.size, &md.bhash.Bits, &st, &exp, &lu, &md.usedCount); err != nil {
+ if err = rows.Scan(&md.size, &md.bhash.Data, &st, &exp, &lu, &md.usedCount); err != nil {
if err == sql.ErrNoRows {
md = nil
err = nil
@@ -194,7 +194,7 @@ func (db *FileMetaDB) Traverse(f func(*FileMetadata)) error {
md := NewFileMetadata()
for rows.Next() {
var st, exp, lu uint64
- err = rows.Scan(&md.key.Bits, &md.btype, &md.bhash.Bits, &md.size, &st, &exp, &lu, &md.usedCount)
+ err = rows.Scan(&md.key.Data, &md.btype, &md.bhash.Data, &md.size, &st, &exp, &lu, &md.usedCount)
if err != nil {
return err
}
diff --git a/src/gnunet/service/store/store_dht_test.go b/src/gnunet/service/store/store_dht_test.go
@@ -66,6 +66,8 @@ func TestDHTFilesStore(t *testing.T) {
rf := blocks.NewGenericResultFilter()
// First round: save blocks
+ btype := enums.BLOCK_TYPE_TEST
+ expire := util.AbsoluteTimeNever()
for i := 0; i < fsNumBlocks; i++ {
// generate random block
size := 1024 + rand.Intn(62000) //nolint:gosec // good enough for testing
@@ -73,10 +75,13 @@ func TestDHTFilesStore(t *testing.T) {
if _, err = rand.Read(buf); err != nil { //nolint:gosec // good enough for testing
t.Fatal(err)
}
- blk := blocks.NewGenericBlock(buf)
+ var blk blocks.Block
+ if blk, err = blocks.NewBlock(btype, expire, buf); err != nil {
+ t.Fatal(err)
+ }
// generate associated key
k := crypto.Hash(buf)
- key := blocks.NewGenericQuery(k, enums.BLOCK_TYPE_ANY, 0)
+ key := blocks.NewGenericQuery(k, enums.BLOCK_TYPE_TEST, 0)
// store entry
val := &DHTEntry{
@@ -105,9 +110,9 @@ func TestDHTFilesStore(t *testing.T) {
k := crypto.Hash(buf)
// do the keys match?
- if !k.Equals(key.Key()) {
- t.Log(hex.EncodeToString(k.Bits))
- t.Log(hex.EncodeToString(key.Key().Bits))
+ if !k.Equal(key.Key()) {
+ t.Log(hex.EncodeToString(k.Data))
+ t.Log(hex.EncodeToString(key.Key().Data))
t.Fatal("key/value mismatch")
}
}
diff --git a/src/gnunet/transport/reader_writer.go b/src/gnunet/transport/reader_writer.go
@@ -41,6 +41,13 @@ func WriteMessage(ctx context.Context, wrt io.WriteCloser, msg message.Message)
if buf, err = data.Marshal(msg); err != nil {
return
}
+ /*
+ // debug for outgoing messages
+ if msg.Type() == enums.MSG_DHT_P2P_HELLO {
+ logger.Printf(logger.DBG, "[rw_msg] msg=%s", hex.EncodeToString(buf))
+ logger.Printf(logger.DBG, "[rw_msg] msg=%s", util.Dump(msg, "json"))
+ }
+ */
// check message header size and packet size
mh, err := message.GetMsgHeader(buf)
if err != nil {
@@ -92,7 +99,7 @@ func ReadMessage(ctx context.Context, rdr io.ReadCloser, buf []byte) (msg messag
if err = get(0, 4); err != nil {
return
}
- var mh *message.Header
+ var mh *message.MsgHeader
if mh, err = message.GetMsgHeader(buf[:4]); err != nil {
return
}
@@ -108,6 +115,13 @@ func ReadMessage(ctx context.Context, rdr io.ReadCloser, buf []byte) (msg messag
return
}
err = data.Unmarshal(msg, buf[:mh.MsgSize])
+ /*
+ // debug for incoming messages
+ if mh.MsgType == enums.MSG_DHT_P2P_RESULT {
+ logger.Printf(logger.DBG, "[rw_msg] msg=%s", hex.EncodeToString(buf[:mh.MsgSize]))
+ logger.Printf(logger.DBG, "[rw_msg] msg=%s", util.Dump(msg, "json"))
+ }
+ */
return
}
diff --git a/src/gnunet/util/address.go b/src/gnunet/util/address.go
@@ -29,7 +29,7 @@ import (
type Address struct {
Netw string // network protocol
Options uint32 // address options
- Expires AbsoluteTime // expiration date for address
+ Expire AbsoluteTime // expiration date for address
Address []byte // address data (protocol-dependent)
}
@@ -39,7 +39,7 @@ func NewAddress(transport string, addr string) *Address {
Netw: transport,
Options: 0,
Address: Clone([]byte(addr)),
- Expires: AbsoluteTimeNever(),
+ Expire: AbsoluteTimeNever(),
}
}
@@ -50,7 +50,7 @@ func NewAddressWrap(addr net.Addr) *Address {
Netw: addr.Network(),
Options: 0,
Address: []byte(addr.String()),
- Expires: AbsoluteTimeNever(),
+ Expire: AbsoluteTimeNever(),
}
}
@@ -67,8 +67,8 @@ func ParseAddress(s string) (addr *Address, err error) {
return
}
-// Equals return true if two addresses match.
-func (a *Address) Equals(b *Address) bool {
+// Equal return true if two addresses match.
+func (a *Address) Equal(b *Address) bool {
return a.Netw == b.Netw &&
a.Options == b.Options &&
bytes.Equal(a.Address, b.Address)
@@ -115,7 +115,7 @@ func NewPeerAddrList() *PeerAddrList {
func (a *PeerAddrList) Add(peer *PeerID, addr *Address) (mode int) {
// check for expired address.
mode = 0
- if !addr.Expires.Expired() {
+ if !addr.Expire.Expired() {
// run add operation
_ = a.list.Process(func(pid int) error {
id := peer.String()
@@ -125,7 +125,7 @@ func (a *PeerAddrList) Add(peer *PeerID, addr *Address) (mode int) {
mode = 1
} else {
for _, a := range list {
- if a.Equals(addr) {
+ if a.Equal(addr) {
return nil
}
}
@@ -146,7 +146,7 @@ func (a *PeerAddrList) Get(peer *PeerID, transport string) (res []*Address) {
if ok {
for _, addr := range list {
// check for expired address.
- if addr.Expires.Expired() {
+ if addr.Expire.Expired() {
// skip expired
continue
}
diff --git a/src/gnunet/util/array.go b/src/gnunet/util/array.go
@@ -43,8 +43,8 @@ func Clone[T []E, E any](d T) T {
return r
}
-// Equals returns true if two arrays match.
-func Equals[T []E, E comparable](a, b T) bool {
+// Equal returns true if two arrays match.
+func Equal[T []E, E comparable](a, b T) bool {
if len(a) != len(b) {
return false
}
diff --git a/src/gnunet/util/misc.go b/src/gnunet/util/misc.go
@@ -96,6 +96,18 @@ func StripPathRight(s string) string {
return s
}
+// Shorten string for output
+func Shorten(s string, n int) string {
+ l := len(s)
+ p := n - 3
+ if p < 3 {
+ return s
+ }
+ k := p % 2
+ p /= 2
+ return s[:p+k] + "..." + s[l-p:]
+}
+
//----------------------------------------------------------------------
// Dump instance
func Dump(obj any, format string) string {
diff --git a/src/gnunet/util/peer.go b/src/gnunet/util/peer.go
@@ -80,8 +80,11 @@ func NewPeerID(data []byte) (p *PeerID) {
}
}
-// Equals returns true if two peer IDs match.
-func (p *PeerID) Equals(q *PeerID) bool {
+// Equal returns true if two peer IDs match.
+func (p *PeerID) Equal(q *PeerID) bool {
+ if q == nil {
+ return p == nil
+ }
return bytes.Equal(p.Data, q.Data)
}
@@ -90,6 +93,11 @@ func (p *PeerID) String() string {
return EncodeBinaryToString(p.Data)
}
+// SHort returns a shortened peer id for display
+func (p *PeerID) Short() string {
+ return p.String()[:8]
+}
+
// Bytes returns the binary representation of a peer identifier.
func (p *PeerID) Bytes() []byte {
return Clone(p.Data)
diff --git a/src/gnunet/util/time.go b/src/gnunet/util/time.go
@@ -81,6 +81,13 @@ func (t AbsoluteTime) Add(d time.Duration) AbsoluteTime {
}
}
+// Add a relative time to an absolute time yielding a new absolute time.
+func (t AbsoluteTime) AddRelative(d RelativeTime) AbsoluteTime {
+ return AbsoluteTime{
+ Val: t.Val + d.Val,
+ }
+}
+
// Elapsed time since 't'. Return 0 if 't' is in the future.
func (t AbsoluteTime) Elapsed() RelativeTime {
dt, elapsed := t.Diff(AbsoluteTimeNow())
@@ -107,11 +114,7 @@ func (t AbsoluteTime) Diff(t2 AbsoluteTime) (dt RelativeTime, elapsed bool) {
// Expired returns true if the timestamp is in the past.
func (t AbsoluteTime) Expired() bool {
- // check for "never"
- if t.Val == math.MaxUint64 {
- return false
- }
- return t.Val < uint64(time.Now().Unix())
+ return t.Compare(AbsoluteTimeNow()) < 0
}
// Compare two times (-1 = (t < t2), 0 = (t == t2), 1 = (t > t2)