示例#1
0
 public SentRequest(DrpPeerEngine engine, Logger logger, IPEndPoint destinationEndpoint, ConnectionToNeighbor destinationNeighborNullable, byte[] requestUdpData,
                    RequestP2pSequenceNumber16 sentReqP2pSeq16, LowLevelUdpResponseScanner ack1Scanner)
 {
     _destinationEndpoint = destinationEndpoint;
     _logger                      = logger;
     _requestUdpData              = requestUdpData;
     _sentReqP2pSeq16             = sentReqP2pSeq16;
     _ack1Scanner                 = ack1Scanner;
     _destinationNeighborNullable = destinationNeighborNullable;
     _engine                      = engine;
 }
        /// <param name="waitNhaFromNeighborNullable">is used to verify NPACK.NeighborHMAC</param>
        internal async Task <NeighborPeerAckPacket> OptionallySendUdpRequestAsync_Retransmit_WaitForNeighborPeerAck(string completionActionVisibleId, byte[] requestPacketDataNullable, IPEndPoint responderEndpoint,
                                                                                                                    RequestP2pSequenceNumber16 reqP2pSeq16, ConnectionToNeighbor waitNhaFromNeighborNullable = null, Action <BinaryWriter> npaRequestFieldsForNeighborHmacNullable = null)
        {
            var npaScanner = NeighborPeerAckPacket.GetScanner(reqP2pSeq16, waitNhaFromNeighborNullable, npaRequestFieldsForNeighborHmacNullable);

            if (WriteToLog_udp_deepDetail_enabled)
            {
                WriteToLog_udp_deepDetail($"waiting for NPACK, scanner: {MiscProcedures.ByteArrayToString(npaScanner.ResponseFirstBytes)} npaSeq={reqP2pSeq16}");
            }
            var nextHopResponsePacketData = await SendUdpRequestAsync_Retransmit(
                new PendingLowLevelUdpRequest(completionActionVisibleId, responderEndpoint,
                                              npaScanner,
                                              DateTimeNowUtc, Configuration.UdpLowLevelRequests_ExpirationTimeoutS,
                                              requestPacketDataNullable,
                                              Configuration.UdpLowLevelRequests_InitialRetransmissionTimeoutS, Configuration.UdpLowLevelRequests_RetransmissionTimeoutIncrement
                                              ));

            if (nextHopResponsePacketData == null)
            {
                string desc = "no NPACK response to DRP request '";
                if (requestPacketDataNullable != null)
                {
                    desc += (PacketTypes)requestPacketDataNullable[0];
                }
                desc += $"' - timeout expired ({Configuration.UdpLowLevelRequests_ExpirationTimeoutS}s) completionAction={completionActionVisibleId}";
                if (waitNhaFromNeighborNullable != null)
                {
                    desc += $", neighbor={waitNhaFromNeighborNullable}";
                }
                throw new DrpTimeoutException(desc);
            }

            var nextHopResponsePacket = new NeighborPeerAckPacket(nextHopResponsePacketData);

            if (nextHopResponsePacket.ResponseCode != ResponseOrFailureCode.accepted)
            {
                if (WriteToLog_udp_deepDetail_enabled)
                {
                    WriteToLog_udp_deepDetail($"got NPACK with {nextHopResponsePacket.ResponseCode} throwing exception");
                }
                throw new RequestRejectedException(nextHopResponsePacket.ResponseCode);
            }
            return(nextHopResponsePacket);
        }