public void MakeAndReadFragments5_2() { var origmsgs = new List <TunnelMessage>(); for (int i = 0; i < 5; ++i) { var adatarec = new DataMessage(new BufLen(BufUtils.RandomBytes(2048))); var amsg = new TunnelMessageRouter( adatarec, new I2PIdentHash(true)); origmsgs.Add(amsg); } var msgs = TunnelDataMessage.MakeFragments(origmsgs, BufUtils.RandomUint()); var mkmsg = new TunnelDataFragmentReassembly(); var recvtmsgs = msgs .Chunk(a => 2) .Shuffle() .Select(m => mkmsg.Process(m, out var _)) .SelectMany(b => b); Assert.IsTrue(origmsgs.All(o => recvtmsgs.Any(m => m.Delivery == o.Delivery && m.Message.CreateHeader16.HeaderAndPayload == o.Message.CreateHeader16.HeaderAndPayload ))); }
public void MakeAndReadFragment() { var arec = new DatabaseLookupMessage( new I2PIdentHash(true), new I2PIdentHash(true), DatabaseLookupMessage.LookupTypes.Normal); var msg = new TunnelMessageRouter( arec, new I2PIdentHash(true)); var refmsgdata = msg.Message.CreateHeader16.HeaderAndPayload; var fragments = TunnelDataMessage.MakeFragments( new TunnelMessage[] { msg }, BufUtils.RandomUint()); var mkmsg = new TunnelDataFragmentReassembly(); var recvtmsgs = mkmsg.Process(fragments.Shuffle().ToArray(), out var _); foreach (var rmsg in recvtmsgs) { var rmsgdata = rmsg.Message.CreateHeader16.HeaderAndPayload; Assert.IsTrue(msg.Delivery == rmsg.Delivery); Assert.IsTrue(refmsgdata == rmsgdata); } }
public void TestSimpleTunnelDataCreation() { var smalldata = BufUtils.RandomBytes(38); var srcmsgs = new List <TunnelMessage>(); srcmsgs.Add(new TunnelMessageLocal(new DeliveryStatusMessage(1234))); var msgfrags = TunnelDataMessage.MakeFragments(srcmsgs, 0x3e5c); Assert.IsTrue(msgfrags.Count() == 1); var firstmsg = msgfrags.First(); var serialized = firstmsg.CreateHeader16.HeaderAndPayload; var recovered = I2NPMessage.ReadHeader16(new BufRefLen(serialized)); var reassembler = new TunnelDataFragmentReassembly(); var reassembledmsgs = reassembler.Process( new TunnelDataMessage[] { (TunnelDataMessage)recovered.Message }, out var _); Assert.IsTrue(reassembledmsgs.Count() == 1); var firstrecinstr = reassembledmsgs.First(); Assert.IsTrue(firstrecinstr.Delivery == TunnelMessage.DeliveryTypes.Local); Assert.IsTrue(firstrecinstr.Message.MessageType == I2NPMessage.MessageTypes.DeliveryStatus); Assert.IsTrue(((DeliveryStatusMessage)firstrecinstr.Message).StatusMessageId == 1234); }
public void MakeAndReadFragmentsWithSerialize() { var origmsgs = new List <TunnelMessage>(); for (int i = 0; i < 200; ++i) { switch (BufUtils.RandomInt(3)) { case 0: var adatarec = new DataMessage( new BufLen( BufUtils.RandomBytes(2048 + BufUtils.RandomInt(1024)))); origmsgs.Add(new TunnelMessageLocal(adatarec)); break; case 1: var arec = new DatabaseLookupMessage( new I2PIdentHash(true), new I2PIdentHash(true), DatabaseLookupMessage.LookupTypes.RouterInfo); origmsgs.Add(new TunnelMessageRouter( arec, new I2PIdentHash(true))); break; case 2: var adatarec2 = new DataMessage( new BufLen( BufUtils.RandomBytes(2048 + BufUtils.RandomInt(1024)))); origmsgs.Add(new TunnelMessageTunnel(adatarec2, new I2PIdentHash(true), BufUtils.RandomUint())); break; } } var msgs = TunnelDataMessage.MakeFragments(origmsgs, BufUtils.RandomUint()); var recvlist = new List <TunnelDataMessage>(); foreach (var msg in msgs) { recvlist.Add((TunnelDataMessage)I2NPMessage.ReadHeader16( new BufRefLen(msg.CreateHeader16.HeaderAndPayload)).Message); } var mkmsg = new TunnelDataFragmentReassembly(); var recvtmsgs = mkmsg.Process(recvlist, out var _); foreach (var rmsg in recvtmsgs) { Assert.IsTrue(origmsgs.SingleOrDefault(m => m.Delivery == rmsg.Delivery && m.Message.CreateHeader16.HeaderAndPayload == rmsg.Message.CreateHeader16.HeaderAndPayload ) != null); } }
private bool HandleReceiveQueue() { II2NPHeader16[] messages = null; lock ( ReceiveQueue ) { if (ReceiveQueue.Count == 0) { return(true); } var msgs = new List <II2NPHeader16>(); int dropped = 0; foreach (var msg in ReceiveQueue) { if (Limiter.DropMessage()) { ++dropped; continue; } msgs.Add((II2NPHeader16)msg); } messages = msgs.ToArray(); #if LOG_ALL_TUNNEL_TRANSFER if (dropped > 0) { if (FilterMessageTypes.Update(new HashedItemGroup(Destination, 0x63e9))) { Logging.LogDebug(() => string.Format("{0} bandwidth limit. {1} dropped messages. {2}", this, dropped, Bandwidth)); } } #endif } if (messages == null || messages.Length == 0) { return(true); } var tdata = TunnelDataMessage.MakeFragments(messages.Select(msg => (TunnelMessage)(new TunnelMessageLocal(msg))), SendTunnelId); EncryptTunnelMessages(tdata); #if LOG_ALL_TUNNEL_TRANSFER if (FilterMessageTypes.Update(new HashedItemGroup(Destination, 0x17f3))) { Logging.Log("GatewayTunnel " + Destination.Id32Short + ": TunnelData sent."); } #endif foreach (var tdmsg in tdata) { Bandwidth.DataSent(tdmsg.Payload.Length); TransportProvider.Send(Destination, tdmsg); } return(true); }
public void MakeAndReadFragments() { var origmsgs = new List <TunnelMessage>(); for (int i = 0; i < 200; ++i) { switch (BufUtils.RandomInt(3)) { case 0: var adatarec = new DataMessage(new BufLen(BufUtils.Random(2048 + BufUtils.RandomInt(1024)))); origmsgs.Add(new TunnelMessageTunnel( adatarec.Header16, new I2PIdentHash(true), BufUtils.RandomUint())); break; case 1: var arec = new DatabaseLookupMessage( new I2PIdentHash(true), new I2PIdentHash(true), DatabaseLookupMessage.LookupTypes.Normal); origmsgs.Add(new TunnelMessageRouter(arec.Header16, new I2PIdentHash(true))); break; case 2: var adatarec2 = new DataMessage(new BufLen(BufUtils.Random(2048 + BufUtils.RandomInt(1024)))); origmsgs.Add(new TunnelMessageLocal(adatarec2.Header16)); break; } } var msgs = TunnelDataMessage.MakeFragments(origmsgs, BufUtils.RandomUint()); var mkmsg = new TunnelDataFragmentReassembly(); var recvtmsgs = mkmsg.Process(msgs); foreach (var rmsg in recvtmsgs) { Assert.IsTrue(origmsgs.SingleOrDefault(m => m.Delivery == rmsg.Delivery && m.Header.HeaderAndPayload == rmsg.Header.HeaderAndPayload ) != null); } }
public void TestSingleLargeTunnelDataCreation() { var sourcedata = new BufLen(BufUtils.RandomBytes(9000)); var srcmsgs = new List <TunnelMessage>(); srcmsgs.Add(new TunnelMessageTunnel(new DataMessage(sourcedata), new I2PIdentHash(true), 4242)); var msgfrags = TunnelDataMessage.MakeFragments(srcmsgs, 0x3e5c); Assert.IsTrue(msgfrags.Count() == 10); var serbuf = new List <byte>(); foreach (var frag in msgfrags) { serbuf.AddRange(frag.CreateHeader16.HeaderAndPayload); } var serbufarray = serbuf.ToArray(); var reassembler = new TunnelDataFragmentReassembly(); var reader = new BufRefLen(serbufarray); var readmsgs = new List <TunnelDataMessage>(); while (reader.Length > 0) { readmsgs.Add((TunnelDataMessage)(I2NPMessage.ReadHeader16(reader)).Message); } var reassembledmsgs = reassembler.Process(readmsgs, out var _); Assert.IsTrue(reassembledmsgs.Count() == 1); Assert.IsTrue(reassembler.BufferedFragmentCount == 0); var firstrecinstr = reassembledmsgs.First(); Assert.IsTrue(firstrecinstr.Delivery == TunnelMessage.DeliveryTypes.Tunnel); Assert.IsTrue(((TunnelMessageTunnel)firstrecinstr).Tunnel == 4242); Assert.IsTrue(firstrecinstr.Message.MessageType == I2NPMessage.MessageTypes.Data); var datamsg = (DataMessage)firstrecinstr.Message; Assert.IsTrue(datamsg.DataMessagePayloadLength == sourcedata.Length); Assert.IsTrue(datamsg.DataMessagePayload == sourcedata); }
private bool CreateTunnelMessageFragments(IEnumerable <TunnelMessage> messages) { var data = TunnelDataMessage.MakeFragments(messages, SendTunnelId); var encr = OutboundGatewayDecrypt(data); foreach (var msg in encr) { #if LOG_ALL_TUNNEL_TRANSFER if (FilterMessageTypes.Update(new HashedItemGroup((int)msg.MessageType, 0x4272))) { Logging.LogDebug($"OutboundTunnel: Send {NextHop.Id32Short} : {msg}"); } #endif Bandwidth.DataSent(msg.Payload.Length); TransportProvider.Send(NextHop, msg); } return(true); }
public void MakeAndReadFragments100() { var origmsgs = new List <TunnelMessage>(); for (int i = 0; i < 100; ++i) { switch (BufUtils.RandomInt(3)) { case 0: var adatarec = new DataMessage(new BufLen(BufUtils.RandomBytes(2048))); origmsgs.Add(new TunnelMessageTunnel( adatarec, new I2PIdentHash(true), BufUtils.RandomUint())); break; case 1: var arec = new DatabaseLookupMessage( new I2PIdentHash(true), new I2PIdentHash(true), DatabaseLookupMessage.LookupTypes.Normal); origmsgs.Add(new TunnelMessageRouter( arec, new I2PIdentHash(true))); break; case 2: var adatarec2 = new DataMessage( new BufLen( BufUtils.RandomBytes(2048 + BufUtils.RandomInt(1024)))); origmsgs.Add(new TunnelMessageLocal(adatarec2)); break; } } var msgs = TunnelDataMessage.MakeFragments(origmsgs, BufUtils.RandomUint()); var mkmsg = new TunnelDataFragmentReassembly(); var chunks = msgs .Shuffle() .ToArray() .Chunk(a => 1 + BufUtils.RandomInt(10)) .Shuffle(); var recvtmsgs = chunks.SelectMany(c => mkmsg.Process(c, out var _)).ToArray(); Assert.IsTrue(origmsgs.All(o => recvtmsgs.Any(m => m.Delivery == o.Delivery && m.Message.CreateHeader16.HeaderAndPayload == o.Message.CreateHeader16.HeaderAndPayload ))); var mkmsg2 = new TunnelDataFragmentReassembly(); var chunks2 = msgs .Shuffle() .ToArray() .Skip(1) .Chunk(a => 1 + BufUtils.RandomInt(10)) .Shuffle(); var recvtmsgs2 = chunks2.SelectMany(c => mkmsg2.Process(c, out var _)).ToArray(); Assert.IsFalse(origmsgs.All(o => recvtmsgs2.Any(m => m.Delivery == o.Delivery && m.Message.CreateHeader16.HeaderAndPayload == o.Message.CreateHeader16.HeaderAndPayload ))); }
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); }