etherlink.hh revision 558
113481Sgiacomo.travaglini@arm.com/*
213481Sgiacomo.travaglini@arm.com * Copyright (c) 2003 The Regents of The University of Michigan
313481Sgiacomo.travaglini@arm.com * All rights reserved.
413481Sgiacomo.travaglini@arm.com *
513481Sgiacomo.travaglini@arm.com * Redistribution and use in source and binary forms, with or without
613481Sgiacomo.travaglini@arm.com * modification, are permitted provided that the following conditions are
713481Sgiacomo.travaglini@arm.com * met: redistributions of source code must retain the above copyright
813481Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer;
913481Sgiacomo.travaglini@arm.com * redistributions in binary form must reproduce the above copyright
1013481Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer in the
1113481Sgiacomo.travaglini@arm.com * documentation and/or other materials provided with the distribution;
1213481Sgiacomo.travaglini@arm.com * neither the name of the copyright holders nor the names of its
1313481Sgiacomo.travaglini@arm.com * contributors may be used to endorse or promote products derived from
1413481Sgiacomo.travaglini@arm.com * this software without specific prior written permission.
1513481Sgiacomo.travaglini@arm.com *
1613481Sgiacomo.travaglini@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1713481Sgiacomo.travaglini@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1813481Sgiacomo.travaglini@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1913481Sgiacomo.travaglini@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2013481Sgiacomo.travaglini@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2113481Sgiacomo.travaglini@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2213481Sgiacomo.travaglini@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2313481Sgiacomo.travaglini@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2413481Sgiacomo.travaglini@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2513481Sgiacomo.travaglini@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2613481Sgiacomo.travaglini@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2713481Sgiacomo.travaglini@arm.com */
2813481Sgiacomo.travaglini@arm.com
2913481Sgiacomo.travaglini@arm.com/* @file
3013481Sgiacomo.travaglini@arm.com * Device module for modelling a fixed bandwidth full duplex ethernet link
3113481Sgiacomo.travaglini@arm.com */
3213481Sgiacomo.travaglini@arm.com
3313481Sgiacomo.travaglini@arm.com#ifndef __ETHERLINK_HH__
3413481Sgiacomo.travaglini@arm.com#define __ETHERLINK_HH__
3513481Sgiacomo.travaglini@arm.com
3613481Sgiacomo.travaglini@arm.com#include "sim/host.hh"
3713481Sgiacomo.travaglini@arm.com#include "sim/eventq.hh"
3813481Sgiacomo.travaglini@arm.com#include "dev/etherint.hh"
3913481Sgiacomo.travaglini@arm.com#include "dev/etherpkt.hh"
4013481Sgiacomo.travaglini@arm.com#include "sim/sim_object.hh"
4113481Sgiacomo.travaglini@arm.com
4213481Sgiacomo.travaglini@arm.comclass EtherDump;
4313481Sgiacomo.travaglini@arm.com
4413481Sgiacomo.travaglini@arm.com/*
4513481Sgiacomo.travaglini@arm.com * Model for a fixed bandwidth full duplex ethernet link
4613481Sgiacomo.travaglini@arm.com */
4713481Sgiacomo.travaglini@arm.comclass EtherLink : public SimObject
4813481Sgiacomo.travaglini@arm.com{
4913481Sgiacomo.travaglini@arm.com  protected:
5013481Sgiacomo.travaglini@arm.com    class Interface;
5113481Sgiacomo.travaglini@arm.com
5213481Sgiacomo.travaglini@arm.com     /*
5313481Sgiacomo.travaglini@arm.com      * Model for a single uni-directional link
5413481Sgiacomo.travaglini@arm.com      */
5513481Sgiacomo.travaglini@arm.com    class Link : public Serializable {
5613481Sgiacomo.travaglini@arm.com      protected:
5713481Sgiacomo.travaglini@arm.com        std::string objName;
5813481Sgiacomo.travaglini@arm.com
5913481Sgiacomo.travaglini@arm.com        Interface *txint;
6013481Sgiacomo.travaglini@arm.com        Interface *rxint;
6113481Sgiacomo.travaglini@arm.com
6213481Sgiacomo.travaglini@arm.com        double ticks_per_byte;
6313481Sgiacomo.travaglini@arm.com        EtherDump *dump;
6413481Sgiacomo.travaglini@arm.com
6513481Sgiacomo.travaglini@arm.com      protected:
6613481Sgiacomo.travaglini@arm.com        /*
6713481Sgiacomo.travaglini@arm.com         * Transfer is complete
6813481Sgiacomo.travaglini@arm.com         */
6913481Sgiacomo.travaglini@arm.com        class DoneEvent : public Event
7013481Sgiacomo.travaglini@arm.com        {
7113481Sgiacomo.travaglini@arm.com          protected:
7213481Sgiacomo.travaglini@arm.com            Link *link;
7313481Sgiacomo.travaglini@arm.com
7413481Sgiacomo.travaglini@arm.com          public:
7513481Sgiacomo.travaglini@arm.com            DoneEvent(EventQueue *q, Link *l)
7613481Sgiacomo.travaglini@arm.com                : Event(q), link(l) {}
7713481Sgiacomo.travaglini@arm.com            virtual void process() { link->txDone(); }
7813481Sgiacomo.travaglini@arm.com            virtual const char *description()
7913481Sgiacomo.travaglini@arm.com                { return "ethernet link completion"; }
8013481Sgiacomo.travaglini@arm.com        };
8113481Sgiacomo.travaglini@arm.com
8213481Sgiacomo.travaglini@arm.com        friend class DoneEvent;
8313481Sgiacomo.travaglini@arm.com        DoneEvent event;
8413481Sgiacomo.travaglini@arm.com        PacketPtr packet;
8513481Sgiacomo.travaglini@arm.com
8613481Sgiacomo.travaglini@arm.com        void txDone();
8713481Sgiacomo.travaglini@arm.com
8813481Sgiacomo.travaglini@arm.com      public:
8913481Sgiacomo.travaglini@arm.com        Link(const std::string &name, double rate, EtherDump *dump);
9013481Sgiacomo.travaglini@arm.com        ~Link() {}
9113481Sgiacomo.travaglini@arm.com
9213481Sgiacomo.travaglini@arm.com        virtual const std::string name() const { return objName; }
9313481Sgiacomo.travaglini@arm.com
9413481Sgiacomo.travaglini@arm.com        bool busy() const { return (bool)packet; }
9513481Sgiacomo.travaglini@arm.com        bool transmit(PacketPtr &packet);
9613481Sgiacomo.travaglini@arm.com
9713481Sgiacomo.travaglini@arm.com        void setTxInt(Interface *i) { assert(!txint); txint = i; }
9813481Sgiacomo.travaglini@arm.com        void setRxInt(Interface *i) { assert(!rxint); rxint = i; }
9913481Sgiacomo.travaglini@arm.com
10013481Sgiacomo.travaglini@arm.com        virtual void serialize(std::ostream &os);
10113481Sgiacomo.travaglini@arm.com        virtual void unserialize(Checkpoint *cp, const std::string &section);
10213481Sgiacomo.travaglini@arm.com    };
10313481Sgiacomo.travaglini@arm.com
10413481Sgiacomo.travaglini@arm.com    /*
10513481Sgiacomo.travaglini@arm.com     * Interface at each end of the link
10613481Sgiacomo.travaglini@arm.com     */
10713481Sgiacomo.travaglini@arm.com    class Interface : public EtherInt
10813481Sgiacomo.travaglini@arm.com    {
10913481Sgiacomo.travaglini@arm.com      private:
11013481Sgiacomo.travaglini@arm.com        Link *txlink;
11113481Sgiacomo.travaglini@arm.com
11213481Sgiacomo.travaglini@arm.com      public:
11313481Sgiacomo.travaglini@arm.com        Interface(const std::string &name, Link *txlink, Link *rxlink);
11413481Sgiacomo.travaglini@arm.com        bool recvPacket(PacketPtr &packet) { return txlink->transmit(packet); }
11513481Sgiacomo.travaglini@arm.com        void sendDone() { }
11613481Sgiacomo.travaglini@arm.com    };
11713481Sgiacomo.travaglini@arm.com
11813481Sgiacomo.travaglini@arm.com    Link *link1;
11913481Sgiacomo.travaglini@arm.com    Link *link2;
12013481Sgiacomo.travaglini@arm.com
12113481Sgiacomo.travaglini@arm.com    EtherInt *int1;
12213481Sgiacomo.travaglini@arm.com    EtherInt *int2;
12313481Sgiacomo.travaglini@arm.com
12413481Sgiacomo.travaglini@arm.com  public:
12513481Sgiacomo.travaglini@arm.com    EtherLink(const std::string &name, EtherInt *i1, EtherInt *i2,
12613481Sgiacomo.travaglini@arm.com              Tick speed, EtherDump *dump);
12713481Sgiacomo.travaglini@arm.com    virtual ~EtherLink();
12813481Sgiacomo.travaglini@arm.com
12913481Sgiacomo.travaglini@arm.com    virtual void serialize(std::ostream &os);
13013481Sgiacomo.travaglini@arm.com    virtual void unserialize(Checkpoint *cp, const std::string &section);
13113481Sgiacomo.travaglini@arm.com
13213481Sgiacomo.travaglini@arm.com};
13313481Sgiacomo.travaglini@arm.com
13413481Sgiacomo.travaglini@arm.com#endif // __ETHERLINK_HH__
13513481Sgiacomo.travaglini@arm.com