public async Task RespondWithFailure(ResponseOrFailureCode responseCode) { ReceivedFromNeighborNullable?.AssertIsNotDisposed(); var failure = new FailurePacket { ReqP2pSeq16 = ReqP2pSeq16, ResponseCode = responseCode, }; var failureUdpData = failure.Encode_OpionallySignNeighborHMAC(ReceivedFromNeighborNullable); await _engine.OptionallySendUdpRequestAsync_Retransmit_WaitForNeighborPeerAck("RoutedRequest failure 123123", failureUdpData, ReceivedFromEndpoint, failure.ReqP2pSeq16, ReceivedFromNeighborNullable, failure.GetSignedFieldsForNeighborHMAC); }
public async Task <byte[]> SendRequestAsync(string completionActionVisibleId) { // wait for NPACK (-accepted or -failure) _logger.WriteToLog_detail($"[{completionActionVisibleId}] >> SendRequestAsync() _requestUdpData={MiscProcedures.GetArrayHashCodeString(_requestUdpData)}"); await _engine.OptionallySendUdpRequestAsync_Retransmit_WaitForNeighborPeerAck(completionActionVisibleId + "_first_npack", _requestUdpData, _destinationEndpoint, _sentReqP2pSeq16); // wait for ACK1 OR FAILURE await Task.WhenAny( WaitForAck1Async(completionActionVisibleId + "_ack1"), WaitForFailureAsync(completionActionVisibleId + "_failure") ); if (_pendingAck1Request != null) { _engine.CancelPendingRequest(_pendingAck1Request); _pendingAck1Request = null; } if (_pendingFailureRequest != null) { _engine.CancelPendingRequest(_pendingFailureRequest); _pendingFailureRequest = null; } if (_waitForAck1Completed) { if (Ack1UdpData == null) { ThrowTimeoutException(completionActionVisibleId); } _logger.WriteToLog_detail($"received ACK1"); return(Ack1UdpData); } else if (_waitForFailureCompleted) { if (_failureUdpData == null) { ThrowTimeoutException(completionActionVisibleId); } _logger.WriteToLog_detail($"received FAILURE"); var failure = FailurePacket.DecodeAndOptionallyVerify(_failureUdpData, _sentReqP2pSeq16); if (_failureUdpData != null) { // send NPACK to FAILURE var npAckToFailure = new NeighborPeerAckPacket { ReqP2pSeq16 = _sentReqP2pSeq16, ResponseCode = ResponseOrFailureCode.accepted }; if (_destinationNeighborNullable != null) { npAckToFailure.NeighborToken32 = _destinationNeighborNullable.RemoteNeighborToken32; npAckToFailure.NeighborHMAC = _destinationNeighborNullable.GetNeighborHMAC(w => npAckToFailure.GetSignedFieldsForNeighborHMAC(w, failure.GetSignedFieldsForNeighborHMAC)); } var npAckToFailureUdpData = npAckToFailure.Encode(_destinationNeighborNullable == null); _engine.RespondToRequestAndRetransmissions(_failureUdpData, npAckToFailureUdpData, _destinationEndpoint); } throw new RequestRejectedException(failure.ResponseCode); } else { throw new InvalidOperationException(); } }