Ping test now terminates on completion or waits and fails

This commit is contained in:
David Vennik
2022-12-29 09:56:47 +00:00
parent dd440bbac6
commit aa9ea1d2b8
3 changed files with 67 additions and 25 deletions

View File

@@ -13,6 +13,7 @@ import (
"github.com/Indra-Labs/indra/pkg/key/pub"
"github.com/Indra-Labs/indra/pkg/key/signer"
"github.com/Indra-Labs/indra/pkg/node"
"github.com/Indra-Labs/indra/pkg/nonce"
"github.com/Indra-Labs/indra/pkg/slice"
"github.com/Indra-Labs/indra/pkg/types"
"github.com/Indra-Labs/indra/pkg/wire"
@@ -47,10 +48,19 @@ type Client struct {
*address.ReceiveCache
Circuits
Sessions
Confirms
sync.Mutex
*signer.KeySet
qu.C
}
type ConfirmHook func(cf *confirm.OnionSkin)
type ConfirmCallback struct {
nonce.ID
Hook ConfirmHook
}
type Confirms []ConfirmCallback
func New(tpt ifc.Transport, hdrPrv *prv.Key, no *node.Node,
nodes node.Nodes) (c *Client, e error) {
@@ -94,40 +104,40 @@ func (cl *Client) runner() (out bool) {
}
switch on := onion.(type) {
case *cipher.OnionSkin:
log.I.Ln(reflect.TypeOf(on))
log.T.Ln(reflect.TypeOf(on))
cl.cipher(on, b, c)
case *confirm.OnionSkin:
log.I.Ln(reflect.TypeOf(on))
log.T.Ln(reflect.TypeOf(on))
cl.confirm(on, b, c)
case *delay.OnionSkin:
log.I.Ln(reflect.TypeOf(on))
log.T.Ln(reflect.TypeOf(on))
cl.delay(on, b, c)
case *exit.OnionSkin:
log.I.Ln(reflect.TypeOf(on))
log.T.Ln(reflect.TypeOf(on))
cl.exit(on, b, c)
case *forward.OnionSkin:
log.I.Ln(reflect.TypeOf(on))
log.T.Ln(reflect.TypeOf(on))
cl.forward(on, b, c)
case *layer.OnionSkin:
log.I.Ln(reflect.TypeOf(on))
log.T.Ln(reflect.TypeOf(on))
cl.layer(on, b, c)
case *noop.OnionSkin:
log.I.Ln(reflect.TypeOf(on))
log.T.Ln(reflect.TypeOf(on))
cl.noop(on, b, c)
case *purchase.OnionSkin:
log.I.Ln(reflect.TypeOf(on))
log.T.Ln(reflect.TypeOf(on))
cl.purchase(on, b, c)
case *reverse.OnionSkin:
log.I.Ln(reflect.TypeOf(on))
log.T.Ln(reflect.TypeOf(on))
cl.reply(on, b, c)
case *response.OnionSkin:
log.I.Ln(reflect.TypeOf(on))
log.T.Ln(reflect.TypeOf(on))
cl.response(on, b, c)
case *session.OnionSkin:
log.I.Ln(reflect.TypeOf(on))
log.T.Ln(reflect.TypeOf(on))
cl.session(on, b, c)
case *token.OnionSkin:
log.I.Ln(reflect.TypeOf(on))
log.T.Ln(reflect.TypeOf(on))
cl.token(on, b, c)
default:
log.I.S("unrecognised packet", b)
@@ -146,7 +156,13 @@ func (cl *Client) confirm(on *confirm.OnionSkin, b slice.Bytes,
// This will be an 8 byte nonce that confirms a message passed, ping and
// cipher onions return these, as they are pure forward messages that
// send a message one way and the confirmation is the acknowledgement.
log.I.S(on)
// log.I.S(on)
for i := range cl.Confirms {
// log.I.S(cl.Confirms[i].ID, on.ID)
if on.ID == cl.Confirms[i].ID {
cl.Confirms[i].Hook(on)
}
}
}
func (cl *Client) delay(on *delay.OnionSkin, b slice.Bytes, cur *slice.Cursor) {
@@ -167,28 +183,28 @@ func (cl *Client) forward(on *forward.OnionSkin, b slice.Bytes, c *slice.Cursor)
if on.AddrPort.String() == cl.Node.AddrPort.String() {
// it is for us, we want to unwrap the next
// part.
log.I.Ln("processing new message", *c)
log.T.Ln("processing new message", *c)
b = append(b[*c:], slice.NoisePad(int(*c))...)
cl.Node.Send(b)
} else {
// we need to forward this message onion.
log.I.Ln("forwarding")
log.T.Ln("forwarding")
cl.Send(on.AddrPort, b)
}
}
func (cl *Client) layer(on *layer.OnionSkin, b slice.Bytes, c *slice.Cursor) {
// this is probably an encrypted layer for us.
log.I.Ln("decrypting onion skin")
log.T.Ln("decrypting onion skin")
// log.I.S(on, b[*c:].ToBytes())
rcv := cl.ReceiveCache.FindCloaked(on.Cloak)
if rcv == nil {
log.I.Ln("no matching key found from cloaked key")
log.T.Ln("no matching key found from cloaked key")
return
}
on.Decrypt(rcv.Key, b, c)
b = append(b[*c:], slice.NoisePad(int(*c))...)
log.I.S(b.ToBytes())
log.T.S(b.ToBytes())
cl.Node.Send(b)
}
@@ -236,6 +252,15 @@ func (cl *Client) token(t *token.OnionSkin, b slice.Bytes, cur *slice.Cursor) {
return
}
func (cl *Client) RegisterConfirmation(id nonce.ID, hook ConfirmHook) {
cl.Mutex.Lock()
cl.Confirms = append(cl.Confirms, ConfirmCallback{
ID: id,
Hook: hook,
})
cl.Mutex.Unlock()
}
func (cl *Client) Cleanup() {
// Do cleanup stuff before shutdown.
}

View File

@@ -13,11 +13,14 @@ import (
"github.com/Indra-Labs/indra/pkg/slice"
"github.com/Indra-Labs/indra/pkg/transport"
"github.com/Indra-Labs/indra/pkg/wire"
"github.com/Indra-Labs/indra/pkg/wire/confirm"
log2 "github.com/cybriq/proc/pkg/log"
"github.com/cybriq/qu"
)
func TestPing(t *testing.T) {
log2.CodeLoc = true
// log2.SetLogLevel(log2.Trace)
var clients [4]*Client
var nodes [4]*node.Node
var transports [4]ifc.Transport
@@ -69,15 +72,29 @@ func TestPing(t *testing.T) {
hop[i] = clients[0].Nodes[i]
}
os := wire.Ping(pn, clients[0].Node, hop, ks)
log.I.S(os)
// log.I.S(os)
quit := qu.T()
log.I.S("sending ping with ID", os[len(os)-1].(*confirm.OnionSkin))
clients[0].RegisterConfirmation(
os[len(os)-1].(*confirm.OnionSkin).ID,
func(cf *confirm.OnionSkin) {
log.I.S("received ping confirmation ID", cf)
quit.Q()
},
)
o := os.Assemble()
b := wire.EncodeOnion(o)
// log.I.S(b.ToBytes())
hop[0].Send(b)
time.Sleep(time.Second * 5)
go func() {
time.Sleep(time.Second * 2)
quit.Q()
t.Error("ping got stuck")
}()
<-quit.Wait()
for _, v := range clients {
v.Shutdown()
}
}
//

View File

@@ -10,11 +10,11 @@ var (
// GitRef is the gitref, as in refs/heads/branchname.
GitRef = "refs/heads/main"
// ParentGitCommit is the commit hash of the parent HEAD.
ParentGitCommit = "ed542f0b9ced648125640f1f8c4f5f4fe55cd677"
ParentGitCommit = "00b39b876b26ec360bd3557c579bb174c36a426b"
// BuildTime stores the time when the current binary was built.
BuildTime = "2022-12-29T09:14:38Z"
BuildTime = "2022-12-29T09:56:47Z"
// SemVer lists the (latest) git tag on the release.
SemVer = "v0.0.257"
SemVer = "v0.0.258"
// PathBase is the path base returned from runtime caller.
PathBase = "/home/loki/src/github.com/Indra-Labs/indra/"
// Major is the major number from the tag.
@@ -22,7 +22,7 @@ var (
// Minor is the minor number from the tag.
Minor = 0
// Patch is the patch version number from the tag.
Patch = 257
Patch = 258
)
// Version returns a pretty printed version information string.