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(); } }
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); }
// 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); } }