//internal static string CreateHash(Packet p) //{ // string hash = ""; // string preIPHash = ""; // string preTCPHash = ""; // string preUDPHash = ""; // IPpacket ip = p.IpPacket; // TCPpacket tcp = p.TcpPacket; // UDPpacket udp = p.UdpPacket; // preIPHash = ip.DesIP + ip.Flags + ip.FragmentationOffset + ip.HeaderLength + ip.Identification + ip.MessageLength + ip.Protocol + ip.SrcIP + ip.Tos + ip.TotalLength + ip.Ttl + ip.Version; // if (p.Type == "TCP") // preTCPHash = tcp.AckNumber + tcp.Checksum + tcp.DataOffset + tcp.DesPort + tcp.HeaderLength + tcp.MessageLength + tcp.SeqNumber + tcp.SrcPort + tcp.UrgentPointer + tcp.Window; // else // preUDPHash = udp.Checksum + udp.DesPort + udp.Length_Header_and_Data + udp.SrcPort; // hash += preIPHash + preTCPHash + preUDPHash; // hash = GetMd5Hash(hash); // return hash; //} internal static string CreateHash(Packet p, byte[] payload) { string stringToBeHashed = ""; IPpacket ip = p.IpPacket; TCPpacket tcp = p.TcpPacket; UDPpacket udp = p.UdpPacket; stringToBeHashed = ip.SrcIP + ip.DesIP + ip.Identification + ip.TotalLength; if (tcp != null) { stringToBeHashed += tcp.DesPort; } else { stringToBeHashed += udp.DesPort; } byte[] indexBuffer = Encoding.UTF8.GetBytes(stringToBeHashed); if (payload != null && payload.Length != 0) { byte[] totalBuffer = new byte[indexBuffer.Length + payload.Length]; Buffer.BlockCopy(indexBuffer, 0, totalBuffer, 0, indexBuffer.Length); Buffer.BlockCopy(payload, 0, totalBuffer, indexBuffer.Length, payload.Length); return(GetMd5Hash(totalBuffer, totalBuffer.Length)); } else { return(GetMd5Hash(indexBuffer, indexBuffer.Length)); } }
public void WriteDataBulk(USBPacket packet) { if (packet.data == null) { return; } byte[] packetToSend; if (packet.data[5] != 64) { packetToSend = new byte[packet.data.Length - 8]; Array.Copy(packet.data, 8, packetToSend, 0, packetToSend.Length); } else { packetToSend = new byte[packet.data.Length - 12]; Array.Copy(packet.data, 12, packetToSend, 0, packetToSend.Length); if ((packetToSend[14] & 0xF0) == 0x40) //IP packet { ushort cksum; IPHeaderLength = (ushort)((packetToSend[14] & 0x0F) * 4); if (packetToSend[23] == 0x06) // TCP packet { IPpacket tcpPacket = new IPpacket(IPHeaderLength, IPpacket.PacketType.TCP); tcpPacket.ReadFromBuffer(packetToSend); cksum = tcpPacket.GetChecksum(); cksum -= 1; packetToSend[MACHeaderLegth + IPHeaderLength + 16] = (byte)((cksum >> 8) & 0xFF); packetToSend[MACHeaderLegth + IPHeaderLength + 17] = (byte)((cksum) & 0xFF); } else if (packetToSend[23] == 0x11) // UDP packet { IPpacket udpPacket = new IPpacket(IPHeaderLength, IPpacket.PacketType.UDP); udpPacket.ReadFromBuffer(packetToSend); cksum = udpPacket.GetChecksum(); cksum -= 1; packetToSend[MACHeaderLegth + IPHeaderLength + 6] = (byte)((cksum >> 8) & 0xFF); packetToSend[MACHeaderLegth + IPHeaderLength + 7] = (byte)((cksum) & 0xFF); } } } if (Misc.TryCreateFrameOrLogWarning(this, packetToSend, out var frame, addCrc: true)) { FrameReady?.Invoke(frame); } }
public void WriteDataBulk(USBPacket packet) { if (packet.data == null) { return; } byte[] packetToSend; if (packet.data[5] != 64) { packetToSend = new byte[packet.data.Length - 8]; Array.Copy(packet.data, 8, packetToSend, 0, packetToSend.Length); } else { packetToSend = new byte[packet.data.Length - 12]; Array.Copy(packet.data, 12, packetToSend, 0, packetToSend.Length); if ((packetToSend[14] & 0xF0) == 0x40) //IP packet { ushort cksum; IPHeaderLength = (ushort)((packetToSend[14] & 0x0F) * 4); if (packetToSend[23] == 0x06) // TCP packet { IPpacket tcpPacket = new IPpacket(IPHeaderLength, IPpacket.PacketType.TCP); tcpPacket.ReadFromBuffer(packetToSend); cksum = tcpPacket.GetChecksum(); cksum -= 1; packetToSend[MACHeaderLegth + IPHeaderLength + 16] = (byte)((cksum >> 8) & 0xFF); packetToSend[MACHeaderLegth + IPHeaderLength + 17] = (byte)((cksum) & 0xFF); } else if (packetToSend[23] == 0x11) // UDP packet { IPpacket udpPacket = new IPpacket(IPHeaderLength, IPpacket.PacketType.UDP); udpPacket.ReadFromBuffer(packetToSend); cksum = udpPacket.GetChecksum(); cksum -= 1; packetToSend[MACHeaderLegth + IPHeaderLength + 6] = (byte)((cksum >> 8) & 0xFF); packetToSend[MACHeaderLegth + IPHeaderLength + 7] = (byte)((cksum) & 0xFF); } } } var frame = new EthernetFrame(packetToSend); Link.TransmitFrameFromInterface(frame); }
internal static IPpacket CreateIPpacket(IPHeader ipHeader) { IPpacket ip = new IPpacket(); ip.DesIP = ipHeader.DestinationAddress.ToString(); ip.Flags = ipHeader.Flags_con; ip.FragmentationOffset = ipHeader.FragmentationOffset; ip.HeaderLength = ipHeader.HeaderLength; ip.Identification = ipHeader.Identification; ip.Protocol = ipHeader.ProtocolString; ip.SrcIP = ipHeader.SourceAddress.ToString(); ip.Tos = ipHeader.DifferentiatedServices_con; ip.TotalLength = ipHeader.TotalLength; ip.Ttl = ipHeader.TTL; ip.Version = ipHeader.Version_con; ip.HeaderLength = ipHeader.HeaderLength; ip.MessageLength = ipHeader.MessageLength.ToString(); return(ip); }
private void SendFrames() { lock(sync) { txBufferDescriptor txBD = new txBufferDescriptor(machine.SystemBus); bool interrupt = false; List <byte> packet = new List<byte>(); txBD.Fetch(registers.TxQueueBaseAddr); while(!txBD.Used) { while(!txBD.Last) { packet.AddRange(machine.SystemBus.ReadBytes(txBD.Word0, txBD.Length)); txBD.Used = true; txBD.WriteBack(); if(txBD.Wrap) { registers.TxQueueBaseAddr = txBufferBase; } else { registers.TxQueueBaseAddr += 8; } txBD.Fetch(registers.TxQueueBaseAddr); } interrupt = false; txBD.Used = true; packet.AddRange(machine.SystemBus.ReadBytes(txBD.Word0, txBD.Length)); if((registers.DMAConfig & 1u << 11) != 0)//if checksum offload enable { if((packet[14] & 0xF0) == 0x40) //IP packet { ushort cksum; IPHeaderLength = (ushort)((packet[14] & 0x0F) * 4); if(packet[23] == 0x06) // TCP packet { IPpacket tcpPacket = new IPpacket(IPHeaderLength, IPpacket.PacketType.TCP); tcpPacket.ReadFromBuffer(packet.ToArray()); cksum = tcpPacket.GetChecksum(); cksum -= 1; packet[MACHeaderLegth + IPHeaderLength + 16] = (byte)((cksum >> 8) & 0xFF); packet[MACHeaderLegth + IPHeaderLength + 17] = (byte)((cksum) & 0xFF); } else if(packet[23] == 0x11) // UDP packet { IPpacket udpPacket = new IPpacket(IPHeaderLength, IPpacket.PacketType.UDP); udpPacket.ReadFromBuffer(packet.ToArray()); cksum = udpPacket.GetChecksum(); cksum -= 1; packet[MACHeaderLegth + IPHeaderLength + 6] = (byte)((cksum >> 8) & 0xFF); packet[MACHeaderLegth + IPHeaderLength + 7] = (byte)((cksum) & 0xFF); } } } if(Link.IsConnected) { var frame = new EthernetFrame(packet.ToArray()); this.Log(LogLevel.Noisy, "Sending packet length {0}", packet.ToArray().Length); Link.TransmitFrameFromInterface(frame); } txBD.WriteBack(); if(txBD.Wrap) { registers.TxQueueBaseAddr = txBufferBase; } else { registers.TxQueueBaseAddr += 8; } registers.TxStatus |= 1u << 5; //tx complete txBD.Fetch(registers.TxQueueBaseAddr); if(txBD.Used) { registers.TxStatus |= 0x01; if((registers.InterruptMask & (1u << 3)) == 0) { registers.InterruptStatus |= 1u << 3; interrupt = true; } } if((registers.InterruptMask & (1u << 7)) == 0) { registers.InterruptStatus |= 1u << 7; interrupt = true; } if(interrupt) { IRQ.Set(); } } } }
private void SendFrames() { lock (sync) { txBufferDescriptor txBD = new txBufferDescriptor(machine.SystemBus); bool interrupt = false; List <byte> packet = new List <byte>(); txBD.Fetch(registers.TxQueueBaseAddr); while (!txBD.Used) { while (!txBD.Last) { packet.AddRange(machine.SystemBus.ReadBytes(txBD.Word0, txBD.Length)); txBD.Used = true; txBD.WriteBack(); if (txBD.Wrap) { registers.TxQueueBaseAddr = txBufferBase; } else { registers.TxQueueBaseAddr += 8; } txBD.Fetch(registers.TxQueueBaseAddr); } interrupt = false; txBD.Used = true; packet.AddRange(machine.SystemBus.ReadBytes(txBD.Word0, txBD.Length)); if ((registers.DMAConfig & 1u << 11) != 0) //if checksum offload enable { if ((packet[14] & 0xF0) == 0x40) //IP packet { ushort cksum; IPHeaderLength = (ushort)((packet[14] & 0x0F) * 4); if (packet[23] == 0x06) // TCP packet { IPpacket tcpPacket = new IPpacket(IPHeaderLength, IPpacket.PacketType.TCP); tcpPacket.ReadFromBuffer(packet.ToArray()); cksum = tcpPacket.GetChecksum(); cksum -= 1; packet[MACHeaderLegth + IPHeaderLength + 16] = (byte)((cksum >> 8) & 0xFF); packet[MACHeaderLegth + IPHeaderLength + 17] = (byte)((cksum) & 0xFF); } else if (packet[23] == 0x11) // UDP packet { IPpacket udpPacket = new IPpacket(IPHeaderLength, IPpacket.PacketType.UDP); udpPacket.ReadFromBuffer(packet.ToArray()); cksum = udpPacket.GetChecksum(); cksum -= 1; packet[MACHeaderLegth + IPHeaderLength + 6] = (byte)((cksum >> 8) & 0xFF); packet[MACHeaderLegth + IPHeaderLength + 7] = (byte)((cksum) & 0xFF); } } } if (Link.IsConnected) { EthernetFrame frame; if (!txBD.NoCRC) { frame = EthernetFrame.CreateEthernetFrameWithCRC(packet.ToArray()); } else { frame = EthernetFrame.CreateEthernetFrameWithoutCRC(packet.ToArray()); } this.Log(LogLevel.Noisy, "Sending packet length {0}", packet.ToArray().Length); Link.TransmitFrameFromInterface(frame); } txBD.WriteBack(); if (txBD.Wrap) { registers.TxQueueBaseAddr = txBufferBase; } else { registers.TxQueueBaseAddr += 8; } registers.TxStatus |= 1u << 5; //tx complete txBD.Fetch(registers.TxQueueBaseAddr); if (txBD.Used) { registers.TxStatus |= 0x01; if ((registers.InterruptMask & (1u << 3)) == 0) { registers.InterruptStatus |= 1u << 3; interrupt = true; } } if ((registers.InterruptMask & (1u << 7)) == 0) { registers.InterruptStatus |= 1u << 7; interrupt = true; } if (interrupt) { IRQ.Set(); } } } }
public void WriteDataBulk(USBPacket packet) { if(packet.data == null) return; byte[] packetToSend; if(packet.data[5] != 64) { packetToSend = new byte[packet.data.Length - 8]; Array.Copy(packet.data, 8, packetToSend, 0, packetToSend.Length); } else { packetToSend = new byte[packet.data.Length - 12]; Array.Copy(packet.data, 12, packetToSend, 0, packetToSend.Length); if((packetToSend[14] & 0xF0) == 0x40) //IP packet { ushort cksum; IPHeaderLength = (ushort)((packetToSend[14] & 0x0F) * 4); if(packetToSend[23] == 0x06) // TCP packet { IPpacket tcpPacket = new IPpacket(IPHeaderLength, IPpacket.PacketType.TCP); tcpPacket.ReadFromBuffer(packetToSend); cksum = tcpPacket.GetChecksum(); cksum -= 1; packetToSend[MACHeaderLegth + IPHeaderLength + 16] = (byte)((cksum >> 8) & 0xFF); packetToSend[MACHeaderLegth + IPHeaderLength + 17] = (byte)((cksum) & 0xFF); } else if(packetToSend[23] == 0x11) // UDP packet { IPpacket udpPacket = new IPpacket(IPHeaderLength, IPpacket.PacketType.UDP); udpPacket.ReadFromBuffer(packetToSend); cksum = udpPacket.GetChecksum(); cksum -= 1; packetToSend[MACHeaderLegth + IPHeaderLength + 6] = (byte)((cksum >> 8) & 0xFF); packetToSend[MACHeaderLegth + IPHeaderLength + 7] = (byte)((cksum) & 0xFF); } } } var frame = new EthernetFrame(packetToSend); Link.TransmitFrameFromInterface(frame); }