コード例 #1
0
        public Packet(int fragments)
        {
            this.toDeviceFlags   = 0;
            this.fromDeviceFlags = 0;

            this.fragments = new PacketFragment[fragments];
            for (int i = 0; i < fragments; i++)
            {
                this.fragments[i] = new PacketFragment();
            }
        }
コード例 #2
0
        private FromDeviceFlags GetRecvPktFlags(uint stat_err_flags)
        {
            FromDeviceFlags fromDevFlags = 0;

            if (((RxErrStatFields.CRC_ERROR | RxErrStatFields.SYMBOL_ERROR |
                  RxErrStatFields.SEQUENCE_ERROR | RxErrStatFields.CARRIER_EXT_ERROR |
                  RxErrStatFields.RX_DATA_ERROR) & stat_err_flags) != 0)
            {
                Intel.DebugPrint("Packet Rsv Error\n");
                fromDevFlags |= FromDeviceFlags.ReceiveError;
            }
            else
            {
                fromDevFlags |= FromDeviceFlags.ReceiveSuccess;
            }

            if (((stat_err_flags & RxErrStatFields.IGNORE_CHECKSUM) == 0) &&
                ((stat_err_flags & RxErrStatFields.IP_CHECKSUM_CALC) != 0))
            {
                if ((stat_err_flags & RxErrStatFields.IP_CHECKSUM_ERROR) != 0)
                {
                    Intel.DebugPrint("Bad Ip Checksum\n");
                    fromDevFlags |= FromDeviceFlags.BadIp4Checksum;
                }
                else
                {
                    // Good IP checksum flag???
                }
            }

            if (((stat_err_flags & RxErrStatFields.IGNORE_CHECKSUM) == 0) &&
                ((stat_err_flags & RxErrStatFields.TCP_CHECKSUM_CALC) != 0))
            {
                if ((stat_err_flags & RxErrStatFields.TCP_CHECKSUM_ERROR) != 0)
                {
                    fromDevFlags |= (FromDeviceFlags.BadTcp4Checksum |
                                     FromDeviceFlags.BadUdp4Checksum);
                    // don't know if UDP or TCP
                    Intel.DebugPrint("Bad TCP/UDP Checksum\n");
                }
                else
                {
                    fromDevFlags |= (FromDeviceFlags.GoodTcp4Checksum |
                                     FromDeviceFlags.GoodUdp4Checksum);
                }
            }

            //DebugStub.Assert((fromDevFlags == (FromDeviceFlags.ReceiveSuccess)) || (fromDevFlags == (FromDeviceFlags.ReceiveSuccess | FromDeviceFlags.GoodTcp4Checksum | FromDeviceFlags.GoodUdp4Checksum)));

            return(fromDevFlags);
        }
コード例 #3
0
ファイル: Nic.cs プロジェクト: Paul1nh0/Singularity
        // Get the received packets from the adapter
        void DeMuxReceivedPackets()
        {
            //Grab the latest set of packets
            RxExchange();

            PacketFifo newPackets = this.rxFifo.Acquire();

            try {
                int count = newPackets.Count;
                for (int i = 0; i < count; i++)
                {
                    Packet packet = newPackets.Pop();

                    // If packet from device has an error
                    // recycle it right away.
                    FromDeviceFlags fromFlags = packet.FromDeviceFlags;
                    if ((fromFlags & FromDeviceFlags.ReceiveError) != 0)
                    {
                        DebugStub.Print("Packet had error???\n");
                        newPackets.Push(packet);
                        continue;
                    }
                    Bytes data = packet.ReleaseFragment(0);
                    Ethernet.ProcessIncomingPacket(data, this);
#if  false
                    if (filterAdapter == null ||
                        filterAdapter.ProcessIncomingPacket(data))
                    {
                        Ethernet.ProcessIncomingPacket(data, this);
                    }
                    else
                    {
                        //delete data;
                    }
#endif
                    //XXX Totally inefficient first try immediately replaces
                    //the lost data.
                    Bytes nxtPacket = new Bytes(new byte[this.mtu]);
                    packet.SetFragment(0, nxtPacket);
                    newPackets.Push(packet);
                }
            }
            finally {
                this.rxFifo.Release(newPackets);
            }
        }