/// <summary> /// This scenario replays a TCP handshake between an inside client and an outside server. /// </summary> /// <remarks> /// These frames are intended to be identical to those generated in the run.py script in the both_simple_experiment test folder. /// The hex strings were obtained by printing the packet data with `str(pkt).encode("HEX")`. This is not a particularly efficient workflow, /// and a way of running the original `run.py` test script so that the C# code can be debugged and compared with the simulation of the Verilog /// would certainly be an improvement. /// </remarks> static void SetupScenario1(MockFrameController controller) { // Syn from client var d = MockUtil.CreateData(ParseHexString("222233445566b2b2c3d4e5f6080045000028000100004006af22c0a801010a0000043333005000000000000000005002200090b20000"), 1); controller.QueueReceiveFrame(new FrameInfo(d, TimeSpan.Zero)); // Syn+Ack from server d = MockUtil.CreateData(ParseHexString("122233445566a2b2c3d4e5f608004500002800010000400666cb0a0000040a00000100500401000000000000000050122000777d0000"), 0); controller.QueueReceiveFrame(new FrameInfo(d, TimeSpan.Zero)); // Ack from client d = MockUtil.CreateData(ParseHexString("222233445566b2b2c3d4e5f6080045000028000100004006af22c0a801010a0000043333005000000000000000005010200090a40000"), 1); controller.QueueReceiveFrame(new FrameInfo(d, TimeSpan.Zero)); // Data from client (could be request) d = MockUtil.CreateData(ParseHexString("222233445566b2b2c3d4e5f6080045000054000100004006aef6c0a801010a00000433330050000000000000000050002000895b00005065746572207069706572207069636b65642061207065636b206f66207069636b6c65642070657070657273"), 1); controller.QueueReceiveFrame(new FrameInfo(d, TimeSpan.Zero)); // Data from server (could be response) d = MockUtil.CreateData(ParseHexString("122233445566a2b2c3d4e5f6080045000054000100004006669f0a0000040a00000100500401000000000000000050102000dafb000041207065636b206f66207069636b6c65642070657070657273205065746572205069706572207069636b6564"), 0); controller.QueueReceiveFrame(new FrameInfo(d, TimeSpan.Zero)); // Fin shutdown from client d = MockUtil.CreateData(ParseHexString("222233445566b2b2c3d4e5f6080045000028000100004006af22c0a801010a0000043333005000000000000000005011200090a30000"), 1); controller.QueueReceiveFrame(new FrameInfo(d, TimeSpan.Zero)); // Fin+Ack from server d = MockUtil.CreateData(ParseHexString("122233445566a2b2c3d4e5f608004500002800010000400666cb0a0000040a00000100500401000000000000000050112000777e0000"), 0); controller.QueueReceiveFrame(new FrameInfo(d, TimeSpan.Zero)); // Ack from client d = MockUtil.CreateData(ParseHexString("222233445566b2b2c3d4e5f6080045000028000100004006af22c0a801010a0000043333005000000000000000005010200090a40000"), 1); controller.QueueReceiveFrame(new FrameInfo(d, TimeSpan.Zero)); }
/// <summary> /// This scenario replays a single ARP request. /// </summary> /// <remarks>The data was copied from a tcpdump trace from running the NAT in Mininet on Pax.</remarks> static void SetupScenario2(MockFrameController controller) { // ARP request var d = MockUtil.CreateData(ParseHexString("ffffffffffffb2b2c3d4e5f608060001080006040001b2b2c3d4e5f6c0a8010a000000000000c0a80101"), 1); controller.QueueReceiveFrame(new FrameInfo(d, TimeSpan.Zero)); }
static void Main(string[] args) { var controller = new MockFrameController(); SetupScenario1(controller); controller.OnSendFrame += (sender, e) => { Console.WriteLine("Send frame on {0:x2}:", e.Frame.Data.GetSendIntf()); Console.WriteLine(e.Frame.Data.ToHexString()); }; // Run the Nat implementation Transceiver.FrameController = controller; controller.Start(); NAT.EntryPoint(); }
public PaxNatPacketProcessor(ulong?nf0_mac = null, ulong?nf1_mac = null, ulong?nf2_mac = null, ulong?nf3_mac = null, ulong?nf0_next_hop_mac = null, ulong?nf1_next_hop_mac = null, ulong?nf2_next_hop_mac = null, ulong?nf3_next_hop_mac = null, IPAddress nat_inside_ip = null, IPAddress nat_outside_ip = null, ushort?tcp_start_port = null) { // Configure via ctor parameters if (nf0_mac.HasValue) { NAT.nf0Mac = nf0_mac.Value; } if (nf1_mac.HasValue) { NAT.nf1Mac = nf1_mac.Value; } if (nf2_mac.HasValue) { NAT.nf2Mac = nf2_mac.Value; } if (nf3_mac.HasValue) { NAT.nf3Mac = nf3_mac.Value; } if (nf0_next_hop_mac.HasValue) { NAT.nf0NextHopMac = nf0_next_hop_mac.Value; } if (nf1_next_hop_mac.HasValue) { NAT.nf1NextHopMac = nf1_next_hop_mac.Value; } if (nf2_next_hop_mac.HasValue) { NAT.nf2NextHopMac = nf2_next_hop_mac.Value; } if (nf3_next_hop_mac.HasValue) { NAT.nf3NextHopMac = nf3_next_hop_mac.Value; } if (nat_inside_ip != null) { NAT.myInsideIP = ToUint(nat_inside_ip); } if (nat_outside_ip != null) { NAT.myOutsideIP = ToUint(nat_outside_ip); } if (tcp_start_port.HasValue) { NAT.nextPort = tcp_start_port.Value; } // Send frames on intf var controller = new MockFrameController(); controller.OnSendFrame += (sender, e) => { // NAT has sent frame - send on physical interface #if DEBUG Console.WriteLine("TX packet"); #endif // Check which output port int out_port = e.Frame.Data.GetOutputPortNumber(); #if DEBUG Console.WriteLine("Out port: {0} SendIntf: 0x{1:x2}", out_port, e.Frame.Data.GetSendIntf()); #endif if (out_port >= 0) { // Swap endianness //e.Frame.SwapTdataEndianness(); #if DEBUG // Print tdata Console.WriteLine("tdata"); Console.WriteLine("======"); for (int i = 0; i < e.Frame.Data.tdata.Length; i++) { Console.WriteLine("<><><>> {0:x16}", e.Frame.Data.tdata[i]); if (e.Frame.Data.tlast[i]) { break; } } Console.WriteLine("<><><>> tuser_low {0:x}", e.Frame.Data.tuser_low[0]); Console.WriteLine(); #endif // Copy data to byte array int length = e.Frame.Data.GetKeepLength(); // Length in bytes byte[] data = new byte[length]; Buffer.BlockCopy(e.Frame.Data.tdata, 0, data, 0, length); // FIXME not great for performance to copy twice :/ #if DEBUG // Update checksums for mininet testing. var pkt = Packet.ParsePacket(LinkLayers.Ethernet, data); if (pkt.PayloadPacket is IpPacket) { var ip = (IPv4Packet)pkt.PayloadPacket; if (ip.Checksum != ip.CalculateIPChecksum()) { Console.WriteLine("! IP Checksum incorrect ({0:x4} != {1:x4})", ip.Checksum, ip.CalculateIPChecksum()); } } if (pkt.PayloadPacket.PayloadPacket is TcpPacket) { var tcp = (TcpPacket)pkt.PayloadPacket.PayloadPacket; if (tcp.Checksum != tcp.CalculateTCPChecksum()) { Console.WriteLine("! TCP Checksum incorrect ({0:x4} != {1:x4})", tcp.Checksum, tcp.CalculateTCPChecksum()); } } Console.WriteLine("Sending packet length {0}", length); #endif // Send the frame var device = Pax.PaxConfig.deviceMap[out_port]; device.SendPacket(data); } }; NAT.FrameController = controller; controller.Start(); }