private IPPacket(HW.Network.MACAddress srcMAC, HW.Network.MACAddress destMAC, UInt16 dataLength, byte protocol, IPv4Address source, IPv4Address dest) : base(destMAC, srcMAC, 0x0800, dataLength + 14 + 20) { mRawData[14] = 0x45; mRawData[15] = 0; ipLength = (UInt16)(dataLength + 20); ipHeaderLength = 5; mRawData[16] = (byte)((ipLength >> 8) & 0xFF); mRawData[17] = (byte)((ipLength >> 0) & 0xFF); fragmentID = TCPIPStack.NextIPFragmentID(); mRawData[18] = (byte)((fragmentID >> 8) & 0xFF); mRawData[19] = (byte)((fragmentID >> 0) & 0xFF); mRawData[20] = 0x00; mRawData[21] = 0x00; mRawData[22] = 0x80; mRawData[23] = protocol; mRawData[24] = 0x00; mRawData[25] = 0x00; for (int b = 0; b < 4; b++) { mRawData[26 + b] = source.address[b]; mRawData[30 + b] = dest.address[b]; } ipCRC = CalcIPCRC(20); mRawData[24] = (byte)((ipCRC >> 8) & 0xFF); mRawData[25] = (byte)((ipCRC >> 0) & 0xFF); initFields(); }
internal static void AddPacket(IPPacket packet) { ensureQueueExists(); HW.Network.NetworkDevice nic = TCPIPStack.FindInterface(packet.SourceIP); packet.SourceMAC = nic.MACAddress; queue.Add(new BufferEntry(nic, packet)); }
public TCPStreamModifierStack(TCPIPStack stAlice, TCPIPStack stBob, NetworkStreamModifier[] mods) { dictIsDisposed = new Dictionary <NetworkStreamModifier, int>(); StackAlice = stAlice; StackBob = stBob; Modifiers = mods; foreach (NetworkStreamModifier nsModifier in mods) { dictIsDisposed.Add(nsModifier, 2); nsModifier.AliceLoopClosed += new EventHandler(nsModifier_AliceLoopClosed); nsModifier.BobLoopClosed += new EventHandler(nsModifier_BobLoopClosed); } }
protected override Frame ModifyTraffic(Frame fInputFrame) { if (!bIsShuttingDown) { IP.IPFrame ipFrame = GetIPv4Frame(fInputFrame); TCP.TCPFrame tcpFrame = GetTCPFrame(fInputFrame); if (ipFrame == null || tcpFrame == null) { return(fInputFrame); } if (IsLocal(ipFrame)) { return(fInputFrame); } if (!ShouldIntercept(ipFrame.SourceAddress, ipFrame.DestinationAddress, tcpFrame.SourcePort, tcpFrame.DestinationPort)) { return(fInputFrame); } bool bFound = false; lock (lStacks) { foreach (TCPStreamModifierStack tcpStack in lStacks) { if (tcpStack.StackAlice.PushUp(fInputFrame, false) || tcpStack.StackBob.PushUp(fInputFrame, false)) { bFound = true; break; } } if (!bFound) { //We have to create a new stack... TCPIPStack sAlice; TCPIPStack sBob; NetworkStreamModifier[] arMods; sAlice = new TCPIPStack(ipFrame.DestinationAddress, ipFrame.SourceAddress, tcpFrame.DestinationPort, tcpFrame.SourcePort); sAlice.ProtocolParser = this.ProtocolParser; sBob = new TCPIPStack(ipFrame.SourceAddress, ipFrame.DestinationAddress, tcpFrame.SourcePort, tcpFrame.DestinationPort); sBob.ProtocolParser = this.ProtocolParser; sAlice.FrameEncapsulated += new FrameProcessedEventHandler(Stack_FrameEncapsulated); sBob.FrameEncapsulated += new FrameProcessedEventHandler(Stack_FrameEncapsulated); sAlice.TCPSocket.StateChange += new EventHandler <TCPSocketEventArgs>(TCPSocket_StateChange); sBob.TCPSocket.StateChange += new EventHandler <TCPSocketEventArgs>(TCPSocket_StateChange); arMods = CreateAndLinkStreamOperators(new SocketNetworkStream(sAlice), new SocketNetworkStream(sBob)); TCPStreamModifierStack tsmsStack = new TCPStreamModifierStack(sAlice, sBob, arMods); foreach (NetworkStreamModifier sModifier in tsmsStack.Modifiers) { sModifier.Start(); //sModifier.AliceLoopClosed += new EventHandler(sModifier_AliceLoopClosed); //sModifier.BobLoopClosed += new EventHandler(sModifier_BobLoopClosed); sModifier.AliceLoopError += new ExceptionEventHandler(sModifier_AliceLoopError); sModifier.BobLoopError += new ExceptionEventHandler(sModifier_BobLoopError); } tsmsStack.StackAlice.Listen(); tsmsStack.StackAlice.PushUp(fInputFrame, false); tsmsStack.StackBob.ConnectAsync(); lStacks.Add(tsmsStack); //Notify Created InvokeExternalAsync(StackCreated, new TCPStreamModifierEventArgs(tsmsStack)); } } return(null); } return(fInputFrame); }
internal static void Send() { ensureQueueExists(); if (queue.Count < 1) { return; } //foreach (BufferEntry entry in queue) for (int e = 0; e < queue.Count; e++) { BufferEntry entry = queue[e]; if (entry.Status == BufferEntry.EntryStatus.ADDED) { if (TCPIPStack.IsLocalAddress(entry.Packet.DestinationIP) == false) { entry.nextHop = TCPIPStack.FindRoute(entry.Packet.DestinationIP); if (entry.nextHop == null) { entry.Status = BufferEntry.EntryStatus.DONE; continue; } if (ARP.ARPCache.Contains(entry.nextHop) == true) { entry.Packet.DestinationMAC = ARP.ARPCache.Resolve(entry.nextHop); entry.NIC.QueueBytes(entry.Packet.RawData); entry.Status = BufferEntry.EntryStatus.DONE; } else { ARP.ARPRequest_EthernetIPv4 arp_request = new ARP.ARPRequest_EthernetIPv4(entry.NIC.MACAddress, entry.Packet.SourceIP, HW.Network.MACAddress.Broadcast, entry.nextHop); entry.NIC.QueueBytes(arp_request.RawData); entry.Status = BufferEntry.EntryStatus.ROUTE_ARP_SENT; } continue; } if (ARP.ARPCache.Contains(entry.Packet.DestinationIP) == true) { entry.Packet.DestinationMAC = ARP.ARPCache.Resolve(entry.Packet.DestinationIP); entry.NIC.QueueBytes(entry.Packet.RawData); entry.Status = BufferEntry.EntryStatus.DONE; } else { ARP.ARPRequest_EthernetIPv4 arp_request = new ARP.ARPRequest_EthernetIPv4(entry.NIC.MACAddress, entry.Packet.SourceIP, HW.Network.MACAddress.Broadcast, entry.Packet.DestinationIP); entry.NIC.QueueBytes(arp_request.RawData); entry.Status = BufferEntry.EntryStatus.ARP_SENT; } } else if (entry.Status == BufferEntry.EntryStatus.JUST_SEND) { entry.NIC.QueueBytes(entry.Packet.RawData); entry.Status = BufferEntry.EntryStatus.DONE; } } int i = 0; while (i < queue.Count) { if (queue[i].Status == BufferEntry.EntryStatus.DONE) { queue.RemoveAt(i); } else { i++; } } }