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); }
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); }
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}"); } } }
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); }
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); }