etherlink.hh revision 2665
12632Sstever@eecs.umich.edu/*
22632Sstever@eecs.umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan
32632Sstever@eecs.umich.edu * All rights reserved.
42632Sstever@eecs.umich.edu *
52632Sstever@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
62632Sstever@eecs.umich.edu * modification, are permitted provided that the following conditions are
72632Sstever@eecs.umich.edu * met: redistributions of source code must retain the above copyright
82632Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
92632Sstever@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
102632Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
112632Sstever@eecs.umich.edu * documentation and/or other materials provided with the distribution;
122632Sstever@eecs.umich.edu * neither the name of the copyright holders nor the names of its
132632Sstever@eecs.umich.edu * contributors may be used to endorse or promote products derived from
142632Sstever@eecs.umich.edu * this software without specific prior written permission.
152632Sstever@eecs.umich.edu *
162632Sstever@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172632Sstever@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182632Sstever@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192632Sstever@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202632Sstever@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212632Sstever@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222632Sstever@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232632Sstever@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242632Sstever@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252632Sstever@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262632Sstever@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272632Sstever@eecs.umich.edu *
282632Sstever@eecs.umich.edu * Authors: Nathan Binkert
292632Sstever@eecs.umich.edu */
302632Sstever@eecs.umich.edu
312632Sstever@eecs.umich.edu/* @file
322632Sstever@eecs.umich.edu * Device module for modelling a fixed bandwidth full duplex ethernet link
332632Sstever@eecs.umich.edu */
342632Sstever@eecs.umich.edu
352632Sstever@eecs.umich.edu#ifndef __DEV_ETHERLINK_HH__
362632Sstever@eecs.umich.edu#define __DEV_ETHERLINK_HH__
372632Sstever@eecs.umich.edu
382632Sstever@eecs.umich.edu#include "dev/etherint.hh"
392632Sstever@eecs.umich.edu#include "dev/etherpkt.hh"
402632Sstever@eecs.umich.edu#include "sim/eventq.hh"
412632Sstever@eecs.umich.edu#include "sim/host.hh"
422632Sstever@eecs.umich.edu#include "sim/sim_object.hh"
432632Sstever@eecs.umich.edu
442632Sstever@eecs.umich.educlass EtherDump;
452632Sstever@eecs.umich.educlass Checkpoint;
462632Sstever@eecs.umich.edu/*
472632Sstever@eecs.umich.edu * Model for a fixed bandwidth full duplex ethernet link
482632Sstever@eecs.umich.edu */
492632Sstever@eecs.umich.educlass EtherLink : public SimObject
502632Sstever@eecs.umich.edu{
512632Sstever@eecs.umich.edu  protected:
522632Sstever@eecs.umich.edu    class Interface;
532632Sstever@eecs.umich.edu
542632Sstever@eecs.umich.edu    friend class LinkDelayEvent;
552632Sstever@eecs.umich.edu     /*
562632Sstever@eecs.umich.edu      * Model for a single uni-directional link
572632Sstever@eecs.umich.edu      */
582632Sstever@eecs.umich.edu    class Link
592632Sstever@eecs.umich.edu    {
602632Sstever@eecs.umich.edu      protected:
612632Sstever@eecs.umich.edu        std::string objName;
622632Sstever@eecs.umich.edu
632632Sstever@eecs.umich.edu        EtherLink *parent;
642632Sstever@eecs.umich.edu        int number;
652632Sstever@eecs.umich.edu
662632Sstever@eecs.umich.edu        Interface *txint;
672632Sstever@eecs.umich.edu        Interface *rxint;
682632Sstever@eecs.umich.edu
692632Sstever@eecs.umich.edu        double ticksPerByte;
702632Sstever@eecs.umich.edu        Tick linkDelay;
712632Sstever@eecs.umich.edu        Tick delayVar;
722632Sstever@eecs.umich.edu        EtherDump *dump;
732632Sstever@eecs.umich.edu
742632Sstever@eecs.umich.edu      protected:
752632Sstever@eecs.umich.edu        /*
762632Sstever@eecs.umich.edu         * Transfer is complete
772632Sstever@eecs.umich.edu         */
782632Sstever@eecs.umich.edu        EthPacketPtr packet;
792632Sstever@eecs.umich.edu        void txDone();
802632Sstever@eecs.umich.edu        typedef EventWrapper<Link, &Link::txDone> DoneEvent;
812632Sstever@eecs.umich.edu        friend void DoneEvent::process();
822632Sstever@eecs.umich.edu        DoneEvent doneEvent;
832632Sstever@eecs.umich.edu
842632Sstever@eecs.umich.edu        friend class LinkDelayEvent;
852632Sstever@eecs.umich.edu        void txComplete(EthPacketPtr packet);
862632Sstever@eecs.umich.edu
872632Sstever@eecs.umich.edu      public:
882632Sstever@eecs.umich.edu        Link(const std::string &name, EtherLink *p, int num,
892632Sstever@eecs.umich.edu             double rate, Tick delay, Tick delay_var, EtherDump *dump);
902632Sstever@eecs.umich.edu        ~Link() {}
912632Sstever@eecs.umich.edu
922632Sstever@eecs.umich.edu        const std::string name() const { return objName; }
932632Sstever@eecs.umich.edu
942632Sstever@eecs.umich.edu        bool busy() const { return (bool)packet; }
952632Sstever@eecs.umich.edu        bool transmit(EthPacketPtr packet);
962632Sstever@eecs.umich.edu
972632Sstever@eecs.umich.edu        void setTxInt(Interface *i) { assert(!txint); txint = i; }
982632Sstever@eecs.umich.edu        void setRxInt(Interface *i) { assert(!rxint); rxint = i; }
992632Sstever@eecs.umich.edu
1002632Sstever@eecs.umich.edu        void serialize(const std::string &base, std::ostream &os);
1012632Sstever@eecs.umich.edu        void unserialize(const std::string &base, Checkpoint *cp,
1022632Sstever@eecs.umich.edu                                 const std::string &section);
1032632Sstever@eecs.umich.edu    };
1042632Sstever@eecs.umich.edu
1052632Sstever@eecs.umich.edu    /*
1062632Sstever@eecs.umich.edu     * Interface at each end of the link
1072632Sstever@eecs.umich.edu     */
1082632Sstever@eecs.umich.edu    class Interface : public EtherInt
1092632Sstever@eecs.umich.edu    {
1102632Sstever@eecs.umich.edu      private:
111        Link *txlink;
112
113      public:
114        Interface(const std::string &name, Link *txlink, Link *rxlink);
115        bool recvPacket(EthPacketPtr packet) { return txlink->transmit(packet); }
116        void sendDone() { peer->sendDone(); }
117    };
118
119    Link *link[2];
120    EtherInt *interface[2];
121
122  public:
123    EtherLink(const std::string &name, EtherInt *peer0, EtherInt *peer1,
124              double rate, Tick delay, Tick delayVar, EtherDump *dump);
125    virtual ~EtherLink();
126
127    virtual void serialize(std::ostream &os);
128    virtual void unserialize(Checkpoint *cp, const std::string &section);
129
130};
131
132#endif // __ETHERLINK_HH__
133