Esempio n. 1
0
 public void AddDatabaseSearchReply(DatabaseSearchReplyMessage dbsr)
 {
     if (DatabaseSearchReplies != null)
     {
         ThreadPool.QueueUserWorkItem(a => DatabaseSearchReplies(dbsr));
     }
 }
Esempio n. 2
0
        void NetDb_DatabaseSearchReplies(DatabaseSearchReplyMessage dsm)
        {
#if LOG_ALL_IDENT_LOOKUPS
            StringBuilder foundrouters = new StringBuilder();
#else
            string foundrouters = "";
#endif

            foreach (var router in dsm.Peers)
            {
#if LOG_ALL_IDENT_LOOKUPS
                foundrouters.AppendFormat("{0}{1}", (foundrouters.Length != 0 ? ", " : ""), router.Id32Short);
#endif
                if (NetDb.Inst.Contains(router))
                {
#if LOG_ALL_IDENT_LOOKUPS
                    Logging.Log($"IdentResolver: Not looking up RouterInfo {router.Id32Short} from SearchReply as its already known.");
#endif
                    continue;
                }
                LookupRouterInfo(router);
            }

            if (!OutstandingQueries.TryGetValue(dsm.Key, out var info))
            {
                return;
            }

            ++info.Retries;
            --info.WaitingFor;

            if (info.WaitingFor > 0)
            {
                return;
            }

            if (info.Retries <= DatabaseLookupRetries)
            {
#if LOG_ALL_IDENT_LOOKUPS
                Logging.Log(string.Format("IdentResolver: Lookup of {0} {1} resulted in alternative servers to query {2}. Retrying.",
                                          (info.LookupType == DatabaseLookupMessage.LookupTypes.RouterInfo ? "RouterInfo" : "LeaseSet"),
                                          dsm.Key.Id32Short, foundrouters));
#endif

                if (info.LookupType == DatabaseLookupMessage.LookupTypes.RouterInfo)
                {
                    SendRIDatabaseLookup(info.IdentKey, info);
                    info.LastQuery = TickCounter.Now;
                }
                else
                {
                    SendLSDatabaseLookup(info.IdentKey, info);
                    info.LastQuery = TickCounter.Now;
                }
            }
            else
            {
                Logging.Log(string.Format("IdentResolver: Lookup of {0} {1} resulted in alternative server to query {2}. Lookup failed.",
                                          (info.LookupType == DatabaseLookupMessage.LookupTypes.RouterInfo ? "RouterInfo" : "LeaseSet"),
                                          dsm.Key.Id32Short, foundrouters));

                OutstandingQueries.TryRemove(dsm.Key, out _);
                if (LookupFailure != null)
                {
                    ThreadPool.QueueUserWorkItem(a => LookupFailure(dsm.Key));
                }
            }
        }
Esempio n. 3
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);
        }