private static I2NPMessage CreateReplyMessage(
            II2NPHeader msg,
            TunnelBuildRequestDecrypt decrypt,
            BuildResponseRecord.RequestResponse response)
        {
            var newrecords = decrypt.CreateTunnelBuildReplyRecords(response);

            if (msg.MessageType == I2NPMessage.MessageTypes.VariableTunnelBuild)
            {
                return(new VariableTunnelBuildMessage(newrecords));
            }
            else
            {
                return(new TunnelBuildMessage(newrecords));
            }
        }
        private void HandleEndpointTunnelRequest(
            II2NPHeader msg,
            TunnelBuildRequestDecrypt decrypt)
        {
            var config = new TunnelConfig(
                TunnelConfig.TunnelDirection.Inbound,
                TunnelConfig.TunnelPool.External,
                new TunnelInfo(new List <HopInfo>
            {
                new HopInfo(
                    RouterContext.Inst.MyRouterIdentity,
                    new I2PTunnelId())
            }
                               ));

            var tunnel = new EndpointTunnel(this, config, decrypt.Decrypted);

            tunnel.EstablishedTime.SetNow();

            var doaccept = AcceptingTunnels(decrypt.Decrypted);

            var response = doaccept
                    ? BuildResponseRecord.RequestResponse.Accept
                    : BuildResponseRecord.DefaultErrorReply;

            Logging.LogDebug($"HandleEndpointTunnelRequest {tunnel.TunnelDebugTrace}: " +
                             $"{tunnel.Destination.Id32Short} Endpoint tunnel request: {response} " +
                             $"for tunnel id {tunnel.ReceiveTunnelId}.");

            var newrecords = decrypt.CreateTunnelBuildReplyRecords(response);

            var responsemessage = new VariableTunnelBuildReplyMessage(
                newrecords.Select(r => new BuildResponseRecord(r)),
                tunnel.ResponseMessageId);

            var buildreplymsg = new TunnelGatewayMessage(
                responsemessage,
                tunnel.ResponseTunnelId);

            if (response == BuildResponseRecord.RequestResponse.Accept)
            {
                RunningEndpointTunnels[tunnel] = 1;
                TunnelMgr.AddTunnel(tunnel);
                AcceptedTunnelBuildRequest(decrypt.Decrypted);
            }
            TransportProvider.Send(tunnel.Destination, buildreplymsg);
        }