Beispiel #1
0
        private void HandleEndpointTunnelRequest(
            II2NPHeader msg,
            IEnumerable <AesEGBuildRequestRecord> records,
            EGBuildRequestRecord myrec,
            BuildRequestRecord drec)
        {
            var tunnel   = new EndpointTunnel(drec);
            var replykey = drec.ReplyKey.Key.Clone();
            var replyiv  = drec.ReplyIV.Clone();

            tunnel.EstablishedTime.SetNow();

            var doaccept = AcceptingTunnels(drec);

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

            Logging.LogDebug(() => string.Format("HandleEndpointTunnelRequest {3}: {0} Endpoint tunnel request: {1} for tunnel id {2}.",
                                                 tunnel.Destination.Id32Short,
                                                 response,
                                                 tunnel.ReceiveTunnelId,
                                                 tunnel.TunnelDebugTrace));
            TunnelProvider.UpdateTunnelBuildReply(records, myrec, replykey, replyiv, response);

            var responsemessage = new VariableTunnelBuildReplyMessage(records.Select(r => new BuildResponseRecord(r)));
            var buildreplymsg   = new TunnelGatewayMessage(responsemessage.GetHeader16(tunnel.ResponseMessageId), tunnel.ResponseTunnelId);

            if (response == BuildResponseRecord.RequestResponse.Accept)
            {
                AddTunnel(tunnel);
                TunnelMgr.AddExternalTunnel(tunnel);
                AcceptedTunnelBuildRequest(drec);
            }
            TransportProvider.Send(tunnel.Destination, buildreplymsg);
        }
Beispiel #2
0
        private void HandleTunnelData(List <TunnelDataMessage> msgs)
        {
            DecryptTunnelMessages(msgs);

            var newmsgs = Reassembler.Process(msgs);

            foreach (var one in newmsgs)
            {
                if (one.GetType() == typeof(TunnelMessageLocal))
                {
                    DebugUtils.Log("InboundTunnel " + TunnelDebugTrace + " TunnelData distributed Local :\r\n" + one.Header.ToString());
                    MessageReceived(((TunnelMessageLocal)one).Header);
                }
                else
                if (one.GetType() == typeof(TunnelMessageRouter))
                {
                    DebugUtils.Log("InboundTunnel " + TunnelDebugTrace + " TunnelData distributed Router :\r\n" + one.Header.ToString());
                    TransportProvider.Send(((TunnelMessageRouter)one).Destination, one.Header.Message);
                }
                else
                if (one.GetType() == typeof(TunnelMessageTunnel))
                {
                    var tone = (TunnelMessageTunnel)one;
                    DebugUtils.Log("InboundTunnel " + TunnelDebugTrace + " TunnelData distributed Tunnel :\r\n" + one.Header.ToString());
                    var gwmsg = new TunnelGatewayMessage(tone.Header, tone.Tunnel);
                    TransportProvider.Send(tone.Destination, gwmsg);
                }
                else
                {
                    DebugUtils.LogWarning("InboundTunnel " + TunnelDebugTrace + " TunnelData without routing rules:\r\n" + one.Header.ToString());
                }
            }
        }
        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);
        }
Beispiel #4
0
        private void HandleTunnelData(List <TunnelDataMessage> msgs)
        {
            DecryptTunnelMessages(msgs);

            var newmsgs = Reassembler.Process(msgs);

            foreach (var one in newmsgs)
            {
                if (one.GetType() == typeof(TunnelMessageLocal))
                {
#if LOG_ALL_TUNNEL_TRANSFER
                    Logging.Log($"InboundTunnel {TunnelDebugTrace} TunnelData distributed Local :\r\n{one.Header}");
#endif
                    MessageReceived(((TunnelMessageLocal)one).Header);
                }
                else
                if (one.GetType() == typeof(TunnelMessageRouter))
                {
#if LOG_ALL_TUNNEL_TRANSFER
                    Logging.Log($"InboundTunnel {TunnelDebugTrace} TunnelData distributed Router :\r\n{one.Header}");
#endif
                    TransportProvider.Send(((TunnelMessageRouter)one).Destination, one.Header.Message);
                }
                else
                if (one.GetType() == typeof(TunnelMessageTunnel))
                {
                    var tone = (TunnelMessageTunnel)one;
#if LOG_ALL_TUNNEL_TRANSFER
                    Logging.Log($"InboundTunnel {TunnelDebugTrace} TunnelData distributed Tunnel :\r\n{one.Header}");
#endif
                    var gwmsg = new TunnelGatewayMessage(tone.Header, tone.Tunnel);
                    TransportProvider.Send(tone.Destination, gwmsg);
                }
                else
                {
                    Logging.LogWarning($"InboundTunnel {TunnelDebugTrace} TunnelData without routing rules:\r\n{one.Header}");
                }
            }
        }
Beispiel #5
0
        private bool HandleTunnelData(IEnumerable <TunnelDataMessage> msgs)
        {
            EncryptTunnelMessages(msgs);

            var newmsgs = Reassembler.Process(msgs);
            var dropped = 0;

            foreach (var one in newmsgs)
            {
                if (Limiter.DropMessage())
                {
                    ++dropped;
                    continue;
                }

                try
                {
                    if (one.GetType() == typeof(TunnelMessageLocal))
                    {
                        MessageReceived(((TunnelMessageLocal)one).Header);
                        DebugUtils.Log("EndpointTunnel " + Destination.Id32Short + " TunnelData destination Local. Dropped.\r\n" + one.Header.ToString());
                    }
                    else if (one.GetType() == typeof(TunnelMessageRouter))
                    {
#if LOG_ALL_TUNNEL_TRANSFER
                        if (FilterMessageTypes.Update(new HashedItemGroup(Destination, 0x2317)))
                        {
                            DebugUtils.LogDebug("EndpointTunnel " + Destination.Id32Short + " TunnelData Router :\r\n" + one.Header.MessageType.ToString());
                        }
#endif
                        var msg = one.Header.Message;
                        Bandwidth.DataSent(msg.Payload.Length);
                        TransportProvider.Send(((TunnelMessageRouter)one).Destination, msg);
                    }
                    else if (one.GetType() == typeof(TunnelMessageTunnel))
                    {
                        var tone = (TunnelMessageTunnel)one;
#if LOG_ALL_TUNNEL_TRANSFER
                        if (FilterMessageTypes.Update(new HashedItemGroup(Destination, 0x6375)))
                        {
                            DebugUtils.LogDebug("EndpointTunnel " + Destination.Id32Short + " TunnelData Tunnel :\r\n" + one.Header.MessageType.ToString());
                        }
#endif
                        var gwmsg = new TunnelGatewayMessage(tone.Header, tone.Tunnel);

                        Bandwidth.DataSent(gwmsg.Payload.Length);
                        TransportProvider.Send(tone.Destination, gwmsg);
                    }
                    else
                    {
                        DebugUtils.LogDebug("EndpointTunnel " + Destination.Id32Short + " TunnelData of unexpected type: " + one.Header.ToString());
                    }
                }
                catch (Exception ex)
                {
                    DebugUtils.Log("EndpointTunnel", ex);
                    throw; // Kill tunnel is strange things happen
                }
            }

#if LOG_ALL_TUNNEL_TRANSFER
            if (dropped > 0)
            {
                DebugUtils.LogDebug(() => string.Format("{0} bandwidth limit. {1} dropped messages. {2}", this, dropped, Bandwidth));
            }
#endif

            return(true);
        }
Beispiel #6
0
        public static I2NPMessage GetMessage(
            I2NPMessage.MessageTypes messagetype,
            BufRef reader,
            uint?msgid = null)
        {
            I2NPMessage result = null;

            try
            {
                switch (messagetype)
                {
                case I2NPMessage.MessageTypes.Garlic:
                    result = new GarlicMessage(reader);
                    break;

                case I2NPMessage.MessageTypes.Data:
                    result = new DataMessage(reader);
                    break;

                case I2NPMessage.MessageTypes.DatabaseSearchReply:
                    result = new DatabaseSearchReplyMessage(reader);
                    break;

                case I2NPMessage.MessageTypes.DatabaseStore:
                    result = new DatabaseStoreMessage(reader);
                    break;

                case I2NPMessage.MessageTypes.DeliveryStatus:
                    result = new DeliveryStatusMessage(reader);
                    break;

                case I2NPMessage.MessageTypes.TunnelData:
                    result = new TunnelDataMessage(reader);
                    break;

                case I2NPMessage.MessageTypes.TunnelGateway:
                    result = new TunnelGatewayMessage(reader);
                    break;

                case I2NPMessage.MessageTypes.DatabaseLookup:
                    result = new DatabaseLookupMessage(reader);
                    break;

                case I2NPMessage.MessageTypes.VariableTunnelBuild:
                    result = new VariableTunnelBuildMessage(reader);
                    break;

                case I2NPMessage.MessageTypes.TunnelBuild:
                    result = new TunnelBuildMessage(reader);
                    break;

                case I2NPMessage.MessageTypes.TunnelBuildReply:
                    result = new TunnelBuildReplyMessage(reader);
                    break;

                case I2NPMessage.MessageTypes.VariableTunnelBuildReply:
                    result = new VariableTunnelBuildReplyMessage(reader);
                    break;

                default:
                    Logging.LogDebug($"GetMessage: '{messagetype}' is not a known message type!");
                    throw new NotImplementedException();
                }
            }
            catch (Exception ex)
            {
                Logging.Log("GetMessage", ex);
                throw;
            }

            if (result != null && msgid.HasValue)
            {
                result.MessageId = msgid.Value;
            }

            return(result);
        }