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 §ion); 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 §ion); 1271049Sbinkertn@umich.edu 1281049Sbinkertn@umich.edu}; 1291049Sbinkertn@umich.edu 1301049Sbinkertn@umich.edu#endif // __ETHERLINK_HH__ 1311049Sbinkertn@umich.edu