示例#1
0
        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));
 }
示例#3
0
 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);
     }
 }
示例#4
0
        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++;
                }
            }
        }