Esempio n. 1
0
        public void LookupLeaseSet(I2PIdentHash ident)
        {
            var newitem = new IdentUpdateRequestInfo(ident, DatabaseLookupMessage.LookupTypes.LeaseSet);

            lock ( OutstandingQueries )
            {
                DebugUtils.Log(string.Format("IdentResolver: Starting lookup of LeaseSet for {0}.", ident.Id32Short));
                OutstandingQueries[ident] = newitem;
            }
            SendLSDatabaseLookup(ident, newitem);
        }
Esempio n. 2
0
        public void LookupRouterInfo(I2PIdentHash ident)
        {
            var newitem = new IdentUpdateRequestInfo(ident, DatabaseLookupMessage.LookupTypes.RouterInfo);

            lock ( OutstandingQueries )
            {
#if LOG_ALL_IDENT_LOOKUPS
                Logging.Log($"IdentResolver: Starting lookup of RouterInfo for {ident.Id32Short}.");
#endif
                OutstandingQueries[ident] = newitem;
            }
            SendRIDatabaseLookup(ident, newitem);
        }
Esempio n. 3
0
        private void SendRIDatabaseLookup(I2PIdentHash ident, IdentUpdateRequestInfo info)
        {
            var ff = NetDb.Inst.GetClosestFloodfill(
                ident,
                10 + 3 * info.Retries,
                info.AlreadyQueried,
                false);

            if (!ff.Any())
            {
                Logging.Log($"IdentResolver: failed to find a floodfill router to lookup ({ident}): ");
                return;
            }

            ff.Shuffle();
            ff = ff.Take(DatabaseLookupSelectFloodfillCount).ToArray();

            foreach (var oneff in ff)
            {
                try
                {
                    var msg = new DatabaseLookupMessage(
                        ident,
                        RouterContext.Inst.MyRouterIdentity.IdentHash,
                        DatabaseLookupMessage.LookupTypes.RouterInfo);

                    TransportProvider.Send(oneff, msg);
#if LOG_ALL_IDENT_LOOKUPS
                    Logging.Log($"IdentResolver: RouterInfo query {msg.Key.Id32Short} sent to {oneff.Id32Short}");
#endif
                }
                catch (Exception ex)
                {
                    Logging.Log("SendRIDatabaseLookup", ex);
                }
            }

            foreach (var f in ff)
            {
                info.AlreadyQueried.Add(f);
            }
        }
Esempio n. 4
0
        private void SendRIDatabaseLookup(I2PIdentHash ident, IdentUpdateRequestInfo info)
        {
            var ff = NetDb.Inst.GetClosestFloodfill(ident, 10, info.AlreadyQueried, false).ToArray();

            if (ff == null || ff.Length == 0)
            {
                DebugUtils.Log("IdentResolver: failed to find a floodfill router to lookup (" + ident.ToString() + "): ");
                return;
            }

            ff.Shuffle();
            ff = ff.Take(DatabaseLookupSelectFloodfillCount).ToArray();

            foreach (var oneff in ff)
            {
                try
                {
                    var msg = new DatabaseLookupMessage(
                        ident,
                        RouterContext.Inst.MyRouterIdentity.IdentHash,
                        DatabaseLookupMessage.LookupTypes.RouterInfo);

                    TransportProvider.Send(oneff, msg);
#if LOG_ALL_IDENT_LOOKUPS
                    DebugUtils.Log("IdentResolver: RouterInfo query " + msg.Key.Id32Short + " sent to " + oneff.Id32Short);
#endif
                }
                catch (Exception ex)
                {
                    DebugUtils.Log("SendRIDatabaseLookup", ex);
                }
            }

            lock (info.AlreadyQueried)
            {
                info.AlreadyQueried.AddRange(ff);
            }
        }
Esempio n. 5
0
        private void SendLSDatabaseLookup(I2PIdentHash ident, IdentUpdateRequestInfo info)
        {
            var outtunnel   = TunnelProvider.Inst.GetEstablishedOutboundTunnel(true);
            var replytunnel = TunnelProvider.Inst.GetInboundTunnel(true);

            if (outtunnel is null || replytunnel is null)
            {
                Logging.LogDebug($"SendLSDatabaseLookup: " +
                                 $"outtunnel: {outtunnel}, replytunnel: {replytunnel}");
                return;
            }

            var getnext = DateTime.UtcNow.Hour >= 23;
            var ff      = NetDb.Inst.GetClosestFloodfill(
                ident,
                DatabaseLookupSelectFloodfillCount + 2 * info.Retries,
                info.AlreadyQueried,
                getnext)
                          .Select(r => new { Id = r, NetDb.Inst.Statistics[r].Score });

#if LOG_ALL_IDENT_LOOKUPS
            StringBuilder foundrouters     = new StringBuilder();
            StringBuilder foundrouterskeys = new StringBuilder();

            foreach (var router in ff)
            {
                foundrouters.AppendFormat("{0}{1}{2}", (foundrouters.Length != 0 ? ", " : ""),
                                          router.Id32Short,
                                          FreenetBase64.Encode(router.Hash));
                foundrouterskeys.AppendFormat("{0}{1}{2}", (foundrouterskeys.Length != 0 ? ", " : ""),
                                              router.Id32Short,
                                              FreenetBase64.Encode(router.RoutingKey.Hash));
            }
            var st  = foundrouters.ToString();
            var st2 = foundrouterskeys.ToString();
#endif

            if (!ff.Any())
            {
                Logging.Log($"IdentResolver failed to find a floodfill router to lookup ({ident}): ");
                return;
            }

            var minscore = ff.Min(r => r.Score);

            for (int i = 0; i < DatabaseLookupSelectFloodfillCount; ++i)
            {
                var oneff = ff
                            .RandomWeighted(r => r.Score - minscore + 0.1)
                            .Id;
                try
                {
                    var msg = new DatabaseLookupMessage(
                        ident,
                        replytunnel.Destination, replytunnel.GatewayTunnelId,
                        DatabaseLookupMessage.LookupTypes.LeaseSet, null);

                    outtunnel.Send(new TunnelMessageRouter(msg, oneff));

                    info.AlreadyQueried.Add(oneff);

#if !LOG_ALL_IDENT_LOOKUPS
                    Logging.Log($"IdentResolver: LeaseSet query {msg.Key.Id32Short} " +
                                $"sent to {oneff.Id32Short}. Dist: {oneff ^ msg.Key.RoutingKey}");
#endif
                }
                catch (Exception ex)
                {
                    Logging.Log("SendLSDatabaseLookup", ex);
                }
            }
        }
Esempio n. 6
0
        private void SendLSDatabaseLookup(I2PIdentHash ident, IdentUpdateRequestInfo info)
        {
            /*
             * var replytunnel = TunnelProvider.Inst.GetInboundTunnel();
             * if ( replytunnel == null ) return;
             */

            var ff = NetDb.Inst.GetClosestFloodfill(ident, DatabaseLookupSelectFloodfillCount * 2, info.AlreadyQueried, false).ToArray();

#if LOG_ALL_IDENT_LOOKUPS
            StringBuilder foundrouters     = new StringBuilder();
            StringBuilder foundrouterskeys = new StringBuilder();

            foreach (var router in ff)
            {
                foundrouters.AppendFormat("{0}{1}{2}", (foundrouters.Length != 0 ? ", " : ""),
                                          router.Id32Short,
                                          FreenetBase64.Encode(router.Hash));
                foundrouterskeys.AppendFormat("{0}{1}{2}", (foundrouterskeys.Length != 0 ? ", " : ""),
                                              router.Id32Short,
                                              FreenetBase64.Encode(router.RoutingKey.Hash));
            }
            var st  = foundrouters.ToString();
            var st2 = foundrouterskeys.ToString();
#endif

            if (ff == null || ff.Length == 0)
            {
                DebugUtils.Log("IdentResolver failed to find a floodfill router to lookup (" + ident.ToString() + "): ");
                return;
            }

            ff.Shuffle();
            ff = ff.Take(DatabaseLookupSelectFloodfillCount).ToArray();

            foreach (var oneff in ff)
            {
                try
                {
                    var msg = new DatabaseLookupMessage(
                        ident,
                        RouterContext.Inst.MyRouterIdentity.IdentHash,
                        DatabaseLookupMessage.LookupTypes.LeaseSet);

                    /*
                     * var msg = new DatabaseLookupMessage(
                     *          ident,
                     *          replytunnel.Destination, replytunnel.GatewayTunnelId,
                     *          DatabaseLookupMessage.LookupTypes.LeaseSet, null );
                     */

                    //TunnelProvider.Inst.SendEncrypted( oneff.Identity, false, msg );
                    TransportProvider.Send(oneff, msg);
#if LOG_ALL_IDENT_LOOKUPS
                    DebugUtils.Log(string.Format("IdentResolver: LeaseSet query {0} sent to {1}. Dist: {2}",
                                                 msg.Key.Id32Short,
                                                 oneff.Id32Short,
                                                 oneff ^ msg.Key.RoutingKey));
#endif
                }
                catch (Exception ex)
                {
                    DebugUtils.Log("SendLSDatabaseLookup", ex);
                }
            }

            lock (info.AlreadyQueried)
            {
                info.AlreadyQueried.AddRange(ff);
            }
        }