Esempio n. 1
0
        public static void WriteUDPHeader(CircularFrameBuffer cfb, UDPParser up, EthernetParserGenerator ep,
                                          IPv4ParserGenerator ip, byte ports)
        {
            Emu.Status  = 0xff0;
            ip.Protocol = 17;
            ip.AssembleHeader();
            //Emu.PktIn = ip.CalculateCheckSum();
            //ip.HeaderChecksum = ip.CalculateCheckSum();
            //ip.AssembleHeader();
            ep.WriteToBuffer(cfb.PushData);
            ip.WriteToBuffer(cfb.PushData, 0);

            InterfaceFunctions.SetDestInterface(ports, cfb.PushData);
            cfb.PushData.Tkeep = 0xFFFFFFFF;
            cfb.PushData.Tlast = false;
            Kiwi.Pause();

            cfb.Push(cfb.PushData, true);
            Emu.Status = 0xff1;
            cfb.ResetPeek();

            cfb.PushData.Reset();

            ip.WriteToBuffer(cfb.PushData, 1);

            up.WriteToBuffer(cfb.PushData, (byte)(16 + (ip.IHL - 5) * 32));
            cfb.PushData.Tkeep = 0x0000003FF;
            cfb.PushData.Tlast = true;
            Kiwi.Pause();
            cfb.Push(cfb.PushData);
            Emu.Status = 0xff2;
        }
        /*
         * Function: RecvOne
         * Description: Receive and buffer a single segment of the ethernet frame.
         */
        public static bool RecvOne(CircularFrameBuffer cfb, bool stop, bool wait = false)
        {
            Emu.s_axis_tready = false;
            Emu.Status        = 1;
            while (wait)
            {
                wait = !Emu.s_axis_tvalid;
            }
            bool cont = !stop;

            if (Emu.s_axis_tvalid && cfb.CanPush())
            {
                Emu.s_axis_tready     = true;
                cfb.PushData.Tkeep    = Emu.s_axis_tkeep;
                cfb.PushData.Tlast    = Emu.s_axis_tlast;
                cfb.PushData.Tdata0   = Emu.s_axis_tdata_0;
                cfb.PushData.Tdata1   = Emu.s_axis_tdata_1;
                cfb.PushData.Tdata2   = Emu.s_axis_tdata_2;
                cfb.PushData.Tdata3   = Emu.s_axis_tdata_3;
                cfb.PushData.TuserHi  = Emu.s_axis_tuser_hi;
                cfb.PushData.TuserLow = Emu.s_axis_tuser_low;

                Emu.s_axis_tready = cont;

                cfb.Push(cfb.PushData);

                Emu.Status = 2;

                //Kiwi.Pause();
                return(true);
            }

            Emu.s_axis_tready = false;
            return(false);
        }
Esempio n. 3
0
        public static void WriteIPv4EthernetHeader(CircularFrameBuffer cfb, EthernetParserGenerator ep, IPv4ParserGenerator ip,
                                                   byte ports)
        {
            ip.AssembleHeader();
            ep.WriteToBuffer(cfb.PushData);
            ip.WriteToBuffer(cfb.PushData, 0);

            cfb.PushData.Tkeep = 0xFFFFFFFF;
            cfb.PushData.Tlast = false;

            InterfaceFunctions.SetDestInterface(ports, cfb.PushData);

            cfb.Push(cfb.PushData);

            cfb.PushData.Reset();

            ip.WriteToBuffer(cfb.PushData, 1);

            cfb.Push(cfb.PushData);
        }
        /*
         * Function: RecvFrame
         * Description: Receive and buffer an entire Ethernet frame.
         */
        public static uint RecvFrame(CircularFrameBuffer cfb)
        {
            // The start condition
            var doneReading = false;

            // Local variables - counters
            var  cnt   = 0U;
            uint psize = 0;

            while (!doneReading)
            {
                if (Emu.s_axis_tvalid && cfb.CanPush() && Emu.s_axis_tready) // Receive data
                {
                    cfb.PushData.Tkeep    = Emu.s_axis_tkeep;
                    cfb.PushData.Tlast    = Emu.s_axis_tlast;
                    cfb.PushData.Tdata0   = Emu.s_axis_tdata_0;
                    cfb.PushData.Tdata1   = Emu.s_axis_tdata_1;
                    cfb.PushData.Tdata2   = Emu.s_axis_tdata_2;
                    cfb.PushData.Tdata3   = Emu.s_axis_tdata_3;
                    cfb.PushData.TuserHi  = Emu.s_axis_tuser_hi;
                    cfb.PushData.TuserLow = Emu.s_axis_tuser_low;

                    Emu.s_axis_tready = !Emu.s_axis_tlast;

                    cfb.Push(cfb.PushData);

                    psize = cnt++;
                    // Condition to stop receiving data
                    doneReading = Emu.s_axis_tlast || !Emu.s_axis_tvalid;


                    if (!cfb.CanPush()) // Buffer is full, stop receiving data
                    {
                        Emu.s_axis_tready = false;
                    }
                }
                else if (!cfb.CanPush()) // Buffer is still full
                {
                    Emu.s_axis_tready = false;
                }
                else if (!Emu.s_axis_tready) // Restart receiving data
                {
                    Emu.s_axis_tready = true;
                }

                //Kiwi.Pause();
            }

            Emu.PktIn++;

            Emu.s_axis_tready = false;
            return(psize);
        }