etherlink.hh revision 558
15612Sgblack@eecs.umich.edu/*
25612Sgblack@eecs.umich.edu * Copyright (c) 2003 The Regents of The University of Michigan
35612Sgblack@eecs.umich.edu * All rights reserved.
45612Sgblack@eecs.umich.edu *
55612Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
65612Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
75612Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
85612Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
95612Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
105612Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
115612Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
125612Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
135612Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
145612Sgblack@eecs.umich.edu * this software without specific prior written permission.
155612Sgblack@eecs.umich.edu *
165612Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
175612Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
185612Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
195612Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
205612Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215612Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225612Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235612Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245612Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255612Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265612Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275612Sgblack@eecs.umich.edu */
285612Sgblack@eecs.umich.edu
295612Sgblack@eecs.umich.edu/* @file
305612Sgblack@eecs.umich.edu * Device module for modelling a fixed bandwidth full duplex ethernet link
315612Sgblack@eecs.umich.edu */
325612Sgblack@eecs.umich.edu
335612Sgblack@eecs.umich.edu#ifndef __ETHERLINK_HH__
345612Sgblack@eecs.umich.edu#define __ETHERLINK_HH__
355612Sgblack@eecs.umich.edu
365612Sgblack@eecs.umich.edu#include "sim/host.hh"
375612Sgblack@eecs.umich.edu#include "sim/eventq.hh"
385612Sgblack@eecs.umich.edu#include "dev/etherint.hh"
395612Sgblack@eecs.umich.edu#include "dev/etherpkt.hh"
405612Sgblack@eecs.umich.edu#include "sim/sim_object.hh"
415612Sgblack@eecs.umich.edu
425612Sgblack@eecs.umich.educlass EtherDump;
435612Sgblack@eecs.umich.edu
445612Sgblack@eecs.umich.edu/*
455612Sgblack@eecs.umich.edu * Model for a fixed bandwidth full duplex ethernet link
465612Sgblack@eecs.umich.edu */
475612Sgblack@eecs.umich.educlass EtherLink : public SimObject
485612Sgblack@eecs.umich.edu{
495612Sgblack@eecs.umich.edu  protected:
505612Sgblack@eecs.umich.edu    class Interface;
515612Sgblack@eecs.umich.edu
525612Sgblack@eecs.umich.edu     /*
535612Sgblack@eecs.umich.edu      * Model for a single uni-directional link
545612Sgblack@eecs.umich.edu      */
555612Sgblack@eecs.umich.edu    class Link : public Serializable {
565612Sgblack@eecs.umich.edu      protected:
575612Sgblack@eecs.umich.edu        std::string objName;
585612Sgblack@eecs.umich.edu
595612Sgblack@eecs.umich.edu        Interface *txint;
605612Sgblack@eecs.umich.edu        Interface *rxint;
615612Sgblack@eecs.umich.edu
625612Sgblack@eecs.umich.edu        double ticks_per_byte;
635612Sgblack@eecs.umich.edu        EtherDump *dump;
645612Sgblack@eecs.umich.edu
655612Sgblack@eecs.umich.edu      protected:
665612Sgblack@eecs.umich.edu        /*
675612Sgblack@eecs.umich.edu         * Transfer is complete
685612Sgblack@eecs.umich.edu         */
695612Sgblack@eecs.umich.edu        class DoneEvent : public Event
705612Sgblack@eecs.umich.edu        {
715612Sgblack@eecs.umich.edu          protected:
725612Sgblack@eecs.umich.edu            Link *link;
735612Sgblack@eecs.umich.edu
745612Sgblack@eecs.umich.edu          public:
755612Sgblack@eecs.umich.edu            DoneEvent(EventQueue *q, Link *l)
765612Sgblack@eecs.umich.edu                : Event(q), link(l) {}
775612Sgblack@eecs.umich.edu            virtual void process() { link->txDone(); }
785612Sgblack@eecs.umich.edu            virtual const char *description()
795612Sgblack@eecs.umich.edu                { return "ethernet link completion"; }
805612Sgblack@eecs.umich.edu        };
815612Sgblack@eecs.umich.edu
825612Sgblack@eecs.umich.edu        friend class DoneEvent;
835612Sgblack@eecs.umich.edu        DoneEvent event;
845612Sgblack@eecs.umich.edu        PacketPtr packet;
855612Sgblack@eecs.umich.edu
865612Sgblack@eecs.umich.edu        void txDone();
875612Sgblack@eecs.umich.edu
885612Sgblack@eecs.umich.edu      public:
895612Sgblack@eecs.umich.edu        Link(const std::string &name, double rate, EtherDump *dump);
905612Sgblack@eecs.umich.edu        ~Link() {}
915612Sgblack@eecs.umich.edu
925612Sgblack@eecs.umich.edu        virtual const std::string name() const { return objName; }
935612Sgblack@eecs.umich.edu
945615Sgblack@eecs.umich.edu        bool busy() const { return (bool)packet; }
955615Sgblack@eecs.umich.edu        bool transmit(PacketPtr &packet);
965612Sgblack@eecs.umich.edu
975615Sgblack@eecs.umich.edu        void setTxInt(Interface *i) { assert(!txint); txint = i; }
985615Sgblack@eecs.umich.edu        void setRxInt(Interface *i) { assert(!rxint); rxint = i; }
995615Sgblack@eecs.umich.edu
1005615Sgblack@eecs.umich.edu        virtual void serialize(std::ostream &os);
1015615Sgblack@eecs.umich.edu        virtual void unserialize(Checkpoint *cp, const std::string &section);
1025615Sgblack@eecs.umich.edu    };
1035612Sgblack@eecs.umich.edu
1045612Sgblack@eecs.umich.edu    /*
1055612Sgblack@eecs.umich.edu     * Interface at each end of the link
1065612Sgblack@eecs.umich.edu     */
1075612Sgblack@eecs.umich.edu    class Interface : public EtherInt
1085612Sgblack@eecs.umich.edu    {
1095612Sgblack@eecs.umich.edu      private:
1105615Sgblack@eecs.umich.edu        Link *txlink;
1115612Sgblack@eecs.umich.edu
1125615Sgblack@eecs.umich.edu      public:
1135615Sgblack@eecs.umich.edu        Interface(const std::string &name, Link *txlink, Link *rxlink);
1145615Sgblack@eecs.umich.edu        bool recvPacket(PacketPtr &packet) { return txlink->transmit(packet); }
1155612Sgblack@eecs.umich.edu        void sendDone() { }
1165612Sgblack@eecs.umich.edu    };
1175612Sgblack@eecs.umich.edu
1185612Sgblack@eecs.umich.edu    Link *link1;
1195612Sgblack@eecs.umich.edu    Link *link2;
1205612Sgblack@eecs.umich.edu
1215612Sgblack@eecs.umich.edu    EtherInt *int1;
1225612Sgblack@eecs.umich.edu    EtherInt *int2;
1235612Sgblack@eecs.umich.edu
1245612Sgblack@eecs.umich.edu  public:
1255612Sgblack@eecs.umich.edu    EtherLink(const std::string &name, EtherInt *i1, EtherInt *i2,
1265612Sgblack@eecs.umich.edu              Tick speed, EtherDump *dump);
1275612Sgblack@eecs.umich.edu    virtual ~EtherLink();
1285612Sgblack@eecs.umich.edu
1295612Sgblack@eecs.umich.edu    virtual void serialize(std::ostream &os);
1305612Sgblack@eecs.umich.edu    virtual void unserialize(Checkpoint *cp, const std::string &section);
1315612Sgblack@eecs.umich.edu
1325612Sgblack@eecs.umich.edu};
1335612Sgblack@eecs.umich.edu
1345612Sgblack@eecs.umich.edu#endif // __ETHERLINK_HH__
1355612Sgblack@eecs.umich.edu