etherlink.hh revision 2566
11758Ssaidi@eecs.umich.edu/*
21758Ssaidi@eecs.umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan
31758Ssaidi@eecs.umich.edu * All rights reserved.
41758Ssaidi@eecs.umich.edu *
51758Ssaidi@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
61758Ssaidi@eecs.umich.edu * modification, are permitted provided that the following conditions are
71758Ssaidi@eecs.umich.edu * met: redistributions of source code must retain the above copyright
81758Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
91758Ssaidi@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
101758Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
111758Ssaidi@eecs.umich.edu * documentation and/or other materials provided with the distribution;
121758Ssaidi@eecs.umich.edu * neither the name of the copyright holders nor the names of its
131758Ssaidi@eecs.umich.edu * contributors may be used to endorse or promote products derived from
141758Ssaidi@eecs.umich.edu * this software without specific prior written permission.
151758Ssaidi@eecs.umich.edu *
161758Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
171758Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
181758Ssaidi@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
191758Ssaidi@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
201758Ssaidi@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
211758Ssaidi@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
221758Ssaidi@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
231758Ssaidi@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
241758Ssaidi@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
251758Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262665Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272665Ssaidi@eecs.umich.edu */
281758Ssaidi@eecs.umich.edu
291049Sbinkertn@umich.edu/* @file
301049Sbinkertn@umich.edu * Device module for modelling a fixed bandwidth full duplex ethernet link
311049Sbinkertn@umich.edu */
321049Sbinkertn@umich.edu
331049Sbinkertn@umich.edu#ifndef __DEV_ETHERLINK_HH__
341049Sbinkertn@umich.edu#define __DEV_ETHERLINK_HH__
351049Sbinkertn@umich.edu
361049Sbinkertn@umich.edu#include "dev/etherint.hh"
371049Sbinkertn@umich.edu#include "dev/etherpkt.hh"
381049Sbinkertn@umich.edu#include "sim/eventq.hh"
391049Sbinkertn@umich.edu#include "sim/host.hh"
401049Sbinkertn@umich.edu#include "sim/sim_object.hh"
411049Sbinkertn@umich.edu
421049Sbinkertn@umich.educlass EtherDump;
431049Sbinkertn@umich.educlass Checkpoint;
441049Sbinkertn@umich.edu/*
451049Sbinkertn@umich.edu * Model for a fixed bandwidth full duplex ethernet link
461049Sbinkertn@umich.edu */
471049Sbinkertn@umich.educlass EtherLink : public SimObject
481049Sbinkertn@umich.edu{
491049Sbinkertn@umich.edu  protected:
501049Sbinkertn@umich.edu    class Interface;
511049Sbinkertn@umich.edu
521049Sbinkertn@umich.edu    friend class LinkDelayEvent;
531049Sbinkertn@umich.edu     /*
541049Sbinkertn@umich.edu      * Model for a single uni-directional link
551049Sbinkertn@umich.edu      */
561049Sbinkertn@umich.edu    class Link
571049Sbinkertn@umich.edu    {
581049Sbinkertn@umich.edu      protected:
591049Sbinkertn@umich.edu        std::string objName;
601049Sbinkertn@umich.edu
611049Sbinkertn@umich.edu        EtherLink *parent;
621049Sbinkertn@umich.edu        int number;
631049Sbinkertn@umich.edu
641049Sbinkertn@umich.edu        Interface *txint;
651049Sbinkertn@umich.edu        Interface *rxint;
661049Sbinkertn@umich.edu
671049Sbinkertn@umich.edu        double ticksPerByte;
681049Sbinkertn@umich.edu        Tick linkDelay;
691049Sbinkertn@umich.edu        Tick delayVar;
701049Sbinkertn@umich.edu        EtherDump *dump;
711049Sbinkertn@umich.edu
721049Sbinkertn@umich.edu      protected:
731049Sbinkertn@umich.edu        /*
741049Sbinkertn@umich.edu         * Transfer is complete
751049Sbinkertn@umich.edu         */
761049Sbinkertn@umich.edu        EthPacketPtr packet;
771049Sbinkertn@umich.edu        void txDone();
781049Sbinkertn@umich.edu        typedef EventWrapper<Link, &Link::txDone> DoneEvent;
791049Sbinkertn@umich.edu        friend void DoneEvent::process();
801049Sbinkertn@umich.edu        DoneEvent doneEvent;
811049Sbinkertn@umich.edu
821049Sbinkertn@umich.edu        friend class LinkDelayEvent;
831049Sbinkertn@umich.edu        void txComplete(EthPacketPtr packet);
841049Sbinkertn@umich.edu
851049Sbinkertn@umich.edu      public:
861049Sbinkertn@umich.edu        Link(const std::string &name, EtherLink *p, int num,
871049Sbinkertn@umich.edu             double rate, Tick delay, Tick delay_var, EtherDump *dump);
881049Sbinkertn@umich.edu        ~Link() {}
891049Sbinkertn@umich.edu
901049Sbinkertn@umich.edu        const std::string name() const { return objName; }
911049Sbinkertn@umich.edu
921049Sbinkertn@umich.edu        bool busy() const { return (bool)packet; }
931049Sbinkertn@umich.edu        bool transmit(EthPacketPtr packet);
941049Sbinkertn@umich.edu
951049Sbinkertn@umich.edu        void setTxInt(Interface *i) { assert(!txint); txint = i; }
961049Sbinkertn@umich.edu        void setRxInt(Interface *i) { assert(!rxint); rxint = i; }
971049Sbinkertn@umich.edu
981049Sbinkertn@umich.edu        void serialize(const std::string &base, std::ostream &os);
991049Sbinkertn@umich.edu        void unserialize(const std::string &base, Checkpoint *cp,
1001049Sbinkertn@umich.edu                                 const std::string &section);
1011049Sbinkertn@umich.edu    };
1021049Sbinkertn@umich.edu
1031049Sbinkertn@umich.edu    /*
1041049Sbinkertn@umich.edu     * Interface at each end of the link
1051049Sbinkertn@umich.edu     */
1061049Sbinkertn@umich.edu    class Interface : public EtherInt
1071049Sbinkertn@umich.edu    {
1081049Sbinkertn@umich.edu      private:
1091049Sbinkertn@umich.edu        Link *txlink;
1101049Sbinkertn@umich.edu
1111049Sbinkertn@umich.edu      public:
1121049Sbinkertn@umich.edu        Interface(const std::string &name, Link *txlink, Link *rxlink);
1131049Sbinkertn@umich.edu        bool recvPacket(EthPacketPtr packet) { return txlink->transmit(packet); }
1141049Sbinkertn@umich.edu        void sendDone() { peer->sendDone(); }
1151049Sbinkertn@umich.edu    };
1161049Sbinkertn@umich.edu
1171049Sbinkertn@umich.edu    Link *link[2];
1181049Sbinkertn@umich.edu    EtherInt *interface[2];
1191049Sbinkertn@umich.edu
1201049Sbinkertn@umich.edu  public:
1211049Sbinkertn@umich.edu    EtherLink(const std::string &name, EtherInt *peer0, EtherInt *peer1,
1221049Sbinkertn@umich.edu              double rate, Tick delay, Tick delayVar, EtherDump *dump);
1231049Sbinkertn@umich.edu    virtual ~EtherLink();
1241049Sbinkertn@umich.edu
1251049Sbinkertn@umich.edu    virtual void serialize(std::ostream &os);
1261049Sbinkertn@umich.edu    virtual void unserialize(Checkpoint *cp, const std::string &section);
1271049Sbinkertn@umich.edu
1281049Sbinkertn@umich.edu};
1291049Sbinkertn@umich.edu
1301049Sbinkertn@umich.edu#endif // __ETHERLINK_HH__
1311049Sbinkertn@umich.edu