From 3549ce35ff905467c90bb3396b3c4a126fe0dd7f Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Mon, 27 Jun 2022 14:28:40 -0400 Subject: [PATCH] Prevent payload which has looped back to sender from being acked --- router/xgress/link_receive_buffer.go | 5 +++-- router/xgress/messages.go | 8 ++++---- router/xgress/messages_test.go | 4 ++-- router/xgress/xgress.go | 5 ++++- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/router/xgress/link_receive_buffer.go b/router/xgress/link_receive_buffer.go index c2fbc1116..62d0211a5 100644 --- a/router/xgress/link_receive_buffer.go +++ b/router/xgress/link_receive_buffer.go @@ -107,8 +107,9 @@ func (buffer *LinkReceiveBuffer) Inspect() *inspect.XgressRecvBufferDetail { func (buffer *LinkReceiveBuffer) inspectComplete() *inspect.XgressRecvBufferDetail { nextPayload := "none" - if head := buffer.PeekHead(); head != nil { - nextPayload = fmt.Sprintf("%v", head.Sequence) + if head := buffer.tree.LeftValue(); head != nil { + payload := head.(*Payload) + nextPayload = fmt.Sprintf("%v", payload.Sequence) } return &inspect.XgressRecvBufferDetail{ diff --git a/router/xgress/messages.go b/router/xgress/messages.go index 987377fa3..f5d05808f 100644 --- a/router/xgress/messages.go +++ b/router/xgress/messages.go @@ -66,7 +66,7 @@ type PayloadFlag uint32 const ( PayloadFlagCircuitEnd PayloadFlag = 1 - PayloadFlagEgress PayloadFlag = 2 + PayloadFlagOriginator PayloadFlag = 2 PayloadFlagCircuitStart PayloadFlag = 4 ) @@ -86,7 +86,7 @@ func (header *Header) GetFlags() string { } func (header *Header) GetOriginator() Originator { - if isPayloadFlagSet(header.Flags, PayloadFlagEgress) { + if isPayloadFlagSet(header.Flags, PayloadFlagOriginator) { return Terminator } return Initiator @@ -267,9 +267,9 @@ func (payload *Payload) IsCircuitStartFlagSet() bool { func SetOriginatorFlag(flags uint32, originator Originator) uint32 { if originator == Initiator { - return ^uint32(PayloadFlagEgress) & flags + return ^uint32(PayloadFlagOriginator) & flags } - return uint32(PayloadFlagEgress) | flags + return uint32(PayloadFlagOriginator) | flags } func (payload *Payload) GetLoggerFields() logrus.Fields { diff --git a/router/xgress/messages_test.go b/router/xgress/messages_test.go index 9d54f99e1..d3bd7b191 100644 --- a/router/xgress/messages_test.go +++ b/router/xgress/messages_test.go @@ -55,14 +55,14 @@ func TestSetOriginatorFlag(t *testing.T) { flags: 0, originator: Terminator, }, - want: uint32(PayloadFlagEgress), + want: uint32(PayloadFlagOriginator), }, {name: "set end of circuit to egress", args: args{ flags: uint32(PayloadFlagCircuitEnd), originator: Terminator, }, - want: uint32(PayloadFlagCircuitEnd) | uint32(PayloadFlagEgress), + want: uint32(PayloadFlagCircuitEnd) | uint32(PayloadFlagOriginator), }, } for _, tt := range tests { diff --git a/router/xgress/xgress.go b/router/xgress/xgress.go index 3dea1ef10..c1d1bf873 100644 --- a/router/xgress/xgress.go +++ b/router/xgress/xgress.go @@ -564,7 +564,10 @@ func (self *Xgress) nextReceiveSequence() int32 { func (self *Xgress) PayloadReceived(payload *Payload) { log := pfxlog.ContextLogger(self.Label()).WithFields(payload.GetLoggerFields()) log.Debug("payload received") - if self.linkRxBuffer.ReceiveUnordered(payload, self.Options.RxBufferSize) { + if self.originator == payload.GetOriginator() { + // a payload sent from this xgress has arrived back at this xgress, instead of the other end + log.Warn("ouroboros (circuit cycle) detected, dropping payload") + } else if self.linkRxBuffer.ReceiveUnordered(payload, self.Options.RxBufferSize) { log.Debug("ready to acknowledge") ack := NewAcknowledgement(self.circuitId, self.originator)