Exemplo n.º 1
0
        //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));
            }
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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();
                    }
            
                }
            }
        }
Exemplo n.º 6
0
        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();
                    }
                }
            }
        }
Exemplo n.º 7
0
        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);
        }