private bool HandleTunnelMessage(I2NPMessage msg) { #if LOG_ALL_TUNNEL_TRANSFER Logging.LogDebug($"{this} HandleReceiveQueue: {msg.MessageType}"); #endif switch (msg.MessageType) { case I2NPMessage.MessageTypes.TunnelBuildReply: case I2NPMessage.MessageTypes.TunnelData: throw new NotImplementedException($"Should not happen {TunnelDebugTrace}"); case I2NPMessage.MessageTypes.VariableTunnelBuildReply: ThreadPool.QueueUserWorkItem(cb => { TunnelProvider.Inst.HandleTunnelBuildReply((VariableTunnelBuildReplyMessage)msg); }); return(true); case I2NPMessage.MessageTypes.DeliveryStatus: #if LOG_ALL_TUNNEL_TRANSFER Logging.LogDebug($"{this}: DeliveryStatus: {msg.Message}"); #endif ThreadPool.QueueUserWorkItem(cb => { lock ( DeliveryStatusReceivedLock ) { DeliveryStatusReceived?.Invoke((DeliveryStatusMessage)msg); } }); break; case I2NPMessage.MessageTypes.DatabaseStore: var ds = (DatabaseStoreMessage)msg; ThreadPool.QueueUserWorkItem(cb => { Router.HandleDatabaseStore(ds); }); break; case I2NPMessage.MessageTypes.DatabaseSearchReply: var dsr = (DatabaseSearchReplyMessage)msg; ThreadPool.QueueUserWorkItem(cb => { NetDb.Inst.AddDatabaseSearchReply(dsr); }); break; case I2NPMessage.MessageTypes.Garlic: var garlic = (GarlicMessage)msg; #if LOG_ALL_TUNNEL_TRANSFER || LOG_ALL_LEASE_MGMT Logging.Log($"{this}: Garlic received"); #endif ThreadPool.QueueUserWorkItem(cb => { lock ( GarlicMessageReceivedLock ) { GarlicMessageReceived?.Invoke(garlic); } }); break; default: Logging.LogWarning($"{this}: HandleReceiveQueue: Dropped {msg}"); break; } return(true); }
private bool HandleReceiveQueue() { II2NPHeader msg = null; List <TunnelDataMessage> tdmsgs = null; lock ( ReceiveQueue ) { if (ReceiveQueue.Count == 0) { return(true); } if (ReceiveQueue.Any(mq => mq.MessageType == I2NPMessage.MessageTypes.TunnelData)) { var removelist = ReceiveQueue.Where(mq => mq.MessageType == I2NPMessage.MessageTypes.TunnelData); tdmsgs = removelist.Select(mq => (TunnelDataMessage)mq.Message).ToList(); foreach (var one in removelist.ToArray()) { ReceiveQueue.Remove(one); } } else { msg = ReceiveQueue.Last.Value; ReceiveQueue.RemoveLast(); } } if (tdmsgs != null) { HandleTunnelData(tdmsgs); return(true); } #if LOG_ALL_TUNNEL_TRANSFER Logging.LogDebug($"InboundTunnel {TunnelDebugTrace} HandleReceiveQueue: {msg.MessageType}"); #endif switch (msg.MessageType) { case I2NPMessage.MessageTypes.TunnelData: throw new NotImplementedException("Should not happen " + TunnelDebugTrace); case I2NPMessage.MessageTypes.TunnelBuildReply: case I2NPMessage.MessageTypes.VariableTunnelBuildReply: ThreadPool.QueueUserWorkItem(cb => { TunnelProvider.Inst.HandleTunnelBuildReply((II2NPHeader16)msg); }); return(true); case I2NPMessage.MessageTypes.DeliveryStatus: #if LOG_ALL_TUNNEL_TRANSFER Logging.LogDebug($"InboundTunnel {TunnelDebugTrace}: DeliveryStatus: {msg.Message}"); #endif ThreadPool.QueueUserWorkItem(cb => { lock ( DeliveryStatusReceivedLock ) { DeliveryStatusReceived?.Invoke((DeliveryStatusMessage)msg.Message); } }); break; case I2NPMessage.MessageTypes.DatabaseStore: var ds = (DatabaseStoreMessage)msg.Message; ThreadPool.QueueUserWorkItem(cb => { TunnelProvider.HandleDatabaseStore(ds); }); break; case I2NPMessage.MessageTypes.Garlic: #if LOG_ALL_TUNNEL_TRANSFER Logging.Log($"InboundTunnel {TunnelDebugTrace}: Garlic: {msg.Message}"); #endif ThreadPool.QueueUserWorkItem(cb => { lock ( GarlicMessageReceivedLock ) { GarlicMessageReceived?.Invoke((GarlicMessage)msg.Message); } }); break; default: Logging.LogWarning($"InboundTunnel {TunnelDebugTrace} HandleReceiveQueue: Dropped {msg}"); break; } return(true); }