etherlink.hh revision 4981
15081Sgblack@eecs.umich.edu/* 25081Sgblack@eecs.umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan 35081Sgblack@eecs.umich.edu * All rights reserved. 45081Sgblack@eecs.umich.edu * 55081Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 65081Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 75081Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 85081Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 95081Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 105081Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 115081Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 125081Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 135081Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 145081Sgblack@eecs.umich.edu * this software without specific prior written permission. 155081Sgblack@eecs.umich.edu * 165081Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175081Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185081Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195081Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205081Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215081Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225081Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235081Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245081Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255081Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265081Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275081Sgblack@eecs.umich.edu * 285081Sgblack@eecs.umich.edu * Authors: Nathan Binkert 295081Sgblack@eecs.umich.edu */ 305081Sgblack@eecs.umich.edu 315081Sgblack@eecs.umich.edu/* @file 325081Sgblack@eecs.umich.edu * Device module for modelling a fixed bandwidth full duplex ethernet link 335081Sgblack@eecs.umich.edu */ 345081Sgblack@eecs.umich.edu 355081Sgblack@eecs.umich.edu#ifndef __DEV_ETHERLINK_HH__ 365081Sgblack@eecs.umich.edu#define __DEV_ETHERLINK_HH__ 375081Sgblack@eecs.umich.edu 385081Sgblack@eecs.umich.edu#include "dev/etherobject.hh" 395081Sgblack@eecs.umich.edu#include "dev/etherint.hh" 405081Sgblack@eecs.umich.edu#include "dev/etherpkt.hh" 415081Sgblack@eecs.umich.edu#include "params/EtherLink.hh" 425081Sgblack@eecs.umich.edu#include "sim/eventq.hh" 435081Sgblack@eecs.umich.edu#include "sim/host.hh" 445081Sgblack@eecs.umich.edu#include "sim/sim_object.hh" 455081Sgblack@eecs.umich.edu 465081Sgblack@eecs.umich.educlass EtherDump; 475081Sgblack@eecs.umich.educlass Checkpoint; 485081Sgblack@eecs.umich.edu/* 495081Sgblack@eecs.umich.edu * Model for a fixed bandwidth full duplex ethernet link 505081Sgblack@eecs.umich.edu */ 515081Sgblack@eecs.umich.educlass EtherLink : public EtherObject 525081Sgblack@eecs.umich.edu{ 535081Sgblack@eecs.umich.edu protected: 545081Sgblack@eecs.umich.edu class Interface; 555081Sgblack@eecs.umich.edu 565081Sgblack@eecs.umich.edu friend class LinkDelayEvent; 575081Sgblack@eecs.umich.edu /* 585081Sgblack@eecs.umich.edu * Model for a single uni-directional link 595081Sgblack@eecs.umich.edu */ 605081Sgblack@eecs.umich.edu class Link 615081Sgblack@eecs.umich.edu { 625081Sgblack@eecs.umich.edu protected: 635081Sgblack@eecs.umich.edu std::string objName; 645081Sgblack@eecs.umich.edu 655081Sgblack@eecs.umich.edu EtherLink *parent; 665081Sgblack@eecs.umich.edu int number; 675081Sgblack@eecs.umich.edu 685081Sgblack@eecs.umich.edu Interface *txint; 695081Sgblack@eecs.umich.edu Interface *rxint; 705081Sgblack@eecs.umich.edu 715119Sgblack@eecs.umich.edu double ticksPerByte; 725081Sgblack@eecs.umich.edu Tick linkDelay; 735081Sgblack@eecs.umich.edu Tick delayVar; 745081Sgblack@eecs.umich.edu EtherDump *dump; 755081Sgblack@eecs.umich.edu 765081Sgblack@eecs.umich.edu protected: 775081Sgblack@eecs.umich.edu /* 785081Sgblack@eecs.umich.edu * Transfer is complete 795081Sgblack@eecs.umich.edu */ 805119Sgblack@eecs.umich.edu EthPacketPtr packet; 815081Sgblack@eecs.umich.edu void txDone(); 825081Sgblack@eecs.umich.edu typedef EventWrapper<Link, &Link::txDone> DoneEvent; 835081Sgblack@eecs.umich.edu friend void DoneEvent::process(); 845081Sgblack@eecs.umich.edu DoneEvent doneEvent; 856081Sgblack@eecs.umich.edu 866081Sgblack@eecs.umich.edu friend class LinkDelayEvent; 876081Sgblack@eecs.umich.edu void txComplete(EthPacketPtr packet); 886081Sgblack@eecs.umich.edu 896081Sgblack@eecs.umich.edu public: 906081Sgblack@eecs.umich.edu Link(const std::string &name, EtherLink *p, int num, 916081Sgblack@eecs.umich.edu double rate, Tick delay, Tick delay_var, EtherDump *dump); 926081Sgblack@eecs.umich.edu ~Link() {} 936081Sgblack@eecs.umich.edu 946081Sgblack@eecs.umich.edu const std::string name() const { return objName; } 956081Sgblack@eecs.umich.edu 966081Sgblack@eecs.umich.edu bool busy() const { return (bool)packet; } 976081Sgblack@eecs.umich.edu bool transmit(EthPacketPtr packet); 986081Sgblack@eecs.umich.edu 996081Sgblack@eecs.umich.edu void setTxInt(Interface *i) { assert(!txint); txint = i; } 1006081Sgblack@eecs.umich.edu void setRxInt(Interface *i) { assert(!rxint); rxint = i; } 1016081Sgblack@eecs.umich.edu 1025081Sgblack@eecs.umich.edu void serialize(const std::string &base, std::ostream &os); 1035081Sgblack@eecs.umich.edu void unserialize(const std::string &base, Checkpoint *cp, 1045119Sgblack@eecs.umich.edu const std::string §ion); 1055081Sgblack@eecs.umich.edu }; 1065081Sgblack@eecs.umich.edu 1075081Sgblack@eecs.umich.edu /* 1085081Sgblack@eecs.umich.edu * Interface at each end of the link 1095081Sgblack@eecs.umich.edu */ 1105081Sgblack@eecs.umich.edu class Interface : public EtherInt 1115081Sgblack@eecs.umich.edu { 1125119Sgblack@eecs.umich.edu private: 1135081Sgblack@eecs.umich.edu Link *txlink; 1145081Sgblack@eecs.umich.edu 1155081Sgblack@eecs.umich.edu public: 1165081Sgblack@eecs.umich.edu Interface(const std::string &name, Link *txlink, Link *rxlink); 1176081Sgblack@eecs.umich.edu bool recvPacket(EthPacketPtr packet) { return txlink->transmit(packet); } 1186081Sgblack@eecs.umich.edu void sendDone() { peer->sendDone(); } 1196081Sgblack@eecs.umich.edu bool isBusy() { return txlink->busy(); } 1206081Sgblack@eecs.umich.edu }; 1216081Sgblack@eecs.umich.edu 1226081Sgblack@eecs.umich.edu Link *link[2]; 1236081Sgblack@eecs.umich.edu Interface *interface[2]; 1246081Sgblack@eecs.umich.edu 1256081Sgblack@eecs.umich.edu public: 1266081Sgblack@eecs.umich.edu typedef EtherLinkParams Params; 1276081Sgblack@eecs.umich.edu EtherLink(const Params *p); 1286081Sgblack@eecs.umich.edu virtual ~EtherLink(); 1296081Sgblack@eecs.umich.edu 1306081Sgblack@eecs.umich.edu const Params * 1316081Sgblack@eecs.umich.edu params() const 1325081Sgblack@eecs.umich.edu { 1335081Sgblack@eecs.umich.edu return dynamic_cast<const Params *>(_params); 1345081Sgblack@eecs.umich.edu } 1355081Sgblack@eecs.umich.edu 1365081Sgblack@eecs.umich.edu virtual EtherInt *getEthPort(const std::string &if_name, int idx); 1375081Sgblack@eecs.umich.edu 1385081Sgblack@eecs.umich.edu virtual void serialize(std::ostream &os); 1395081Sgblack@eecs.umich.edu virtual void unserialize(Checkpoint *cp, const std::string §ion); 1405081Sgblack@eecs.umich.edu 1415081Sgblack@eecs.umich.edu}; 1425081Sgblack@eecs.umich.edu 1435081Sgblack@eecs.umich.edu#endif // __ETHERLINK_HH__ 1445081Sgblack@eecs.umich.edu