public void AddDatabaseSearchReply(DatabaseSearchReplyMessage dbsr) { if (DatabaseSearchReplies != null) { ThreadPool.QueueUserWorkItem(a => DatabaseSearchReplies(dbsr)); } }
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)); } } }
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); }