etherlink.hh revision 10905
15703SN/A/* 25703SN/A * Copyright (c) 2002-2005 The Regents of The University of Michigan 311570SCurtis.Dunham@arm.com * All rights reserved. 411570SCurtis.Dunham@arm.com * 511570SCurtis.Dunham@arm.com * Redistribution and use in source and binary forms, with or without 65703SN/A * modification, are permitted provided that the following conditions are 711570SCurtis.Dunham@arm.com * met: redistributions of source code must retain the above copyright 811570SCurtis.Dunham@arm.com * notice, this list of conditions and the following disclaimer; 911570SCurtis.Dunham@arm.com * redistributions in binary form must reproduce the above copyright 1011570SCurtis.Dunham@arm.com * notice, this list of conditions and the following disclaimer in the 1111570SCurtis.Dunham@arm.com * documentation and/or other materials provided with the distribution; 1211570SCurtis.Dunham@arm.com * neither the name of the copyright holders nor the names of its 1311570SCurtis.Dunham@arm.com * contributors may be used to endorse or promote products derived from 1410036SAli.Saidi@ARM.com * this software without specific prior written permission. 1510036SAli.Saidi@ARM.com * 1611570SCurtis.Dunham@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1711570SCurtis.Dunham@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1811570SCurtis.Dunham@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1911570SCurtis.Dunham@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011570SCurtis.Dunham@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2110576Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211570SCurtis.Dunham@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311570SCurtis.Dunham@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411570SCurtis.Dunham@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511570SCurtis.Dunham@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2611570SCurtis.Dunham@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711570SCurtis.Dunham@arm.com * 2811570SCurtis.Dunham@arm.com * Authors: Nathan Binkert 2911570SCurtis.Dunham@arm.com */ 3011570SCurtis.Dunham@arm.com 3111570SCurtis.Dunham@arm.com/* @file 3210576Sandreas.hansson@arm.com * Device module for modelling a fixed bandwidth full duplex ethernet link 3311570SCurtis.Dunham@arm.com */ 3411570SCurtis.Dunham@arm.com 3511570SCurtis.Dunham@arm.com#ifndef __DEV_ETHERLINK_HH__ 3611570SCurtis.Dunham@arm.com#define __DEV_ETHERLINK_HH__ 3711570SCurtis.Dunham@arm.com 3811570SCurtis.Dunham@arm.com#include "base/types.hh" 3911570SCurtis.Dunham@arm.com#include "dev/etherint.hh" 4011502SCurtis.Dunham@arm.com#include "dev/etherobject.hh" 4111570SCurtis.Dunham@arm.com#include "dev/etherpkt.hh" 4211570SCurtis.Dunham@arm.com#include "params/EtherLink.hh" 4311570SCurtis.Dunham@arm.com#include "sim/eventq.hh" 4411570SCurtis.Dunham@arm.com#include "sim/sim_object.hh" 4511570SCurtis.Dunham@arm.com 4611570SCurtis.Dunham@arm.comclass EtherDump; 4711570SCurtis.Dunham@arm.comclass Checkpoint; 4811570SCurtis.Dunham@arm.com/* 4911570SCurtis.Dunham@arm.com * Model for a fixed bandwidth full duplex ethernet link 5011570SCurtis.Dunham@arm.com */ 5111570SCurtis.Dunham@arm.comclass EtherLink : public EtherObject 5211502SCurtis.Dunham@arm.com{ 5311570SCurtis.Dunham@arm.com protected: 5411570SCurtis.Dunham@arm.com class Interface; 5511570SCurtis.Dunham@arm.com 5611570SCurtis.Dunham@arm.com friend class LinkDelayEvent; 5711570SCurtis.Dunham@arm.com /* 5811570SCurtis.Dunham@arm.com * Model for a single uni-directional link 5911570SCurtis.Dunham@arm.com */ 6011570SCurtis.Dunham@arm.com class Link 6111570SCurtis.Dunham@arm.com { 6211570SCurtis.Dunham@arm.com protected: 6311570SCurtis.Dunham@arm.com std::string objName; 6410892Sandreas.hansson@arm.com 6511336Sandreas.hansson@arm.com EtherLink *parent; 6611570SCurtis.Dunham@arm.com int number; 6711570SCurtis.Dunham@arm.com 6811570SCurtis.Dunham@arm.com Interface *txint; 6911570SCurtis.Dunham@arm.com Interface *rxint; 7011570SCurtis.Dunham@arm.com 7111570SCurtis.Dunham@arm.com double ticksPerByte; 7211570SCurtis.Dunham@arm.com Tick linkDelay; 7311570SCurtis.Dunham@arm.com Tick delayVar; 7411570SCurtis.Dunham@arm.com EtherDump *dump; 7511570SCurtis.Dunham@arm.com 7611570SCurtis.Dunham@arm.com protected: 7711570SCurtis.Dunham@arm.com /* 7811570SCurtis.Dunham@arm.com * Transfer is complete 7911570SCurtis.Dunham@arm.com */ 8011570SCurtis.Dunham@arm.com EthPacketPtr packet; 8111570SCurtis.Dunham@arm.com void txDone(); 8211570SCurtis.Dunham@arm.com typedef EventWrapper<Link, &Link::txDone> DoneEvent; 8311570SCurtis.Dunham@arm.com friend void DoneEvent::process(); 8411570SCurtis.Dunham@arm.com DoneEvent doneEvent; 8511570SCurtis.Dunham@arm.com 8611570SCurtis.Dunham@arm.com friend class LinkDelayEvent; 8711570SCurtis.Dunham@arm.com void txComplete(EthPacketPtr packet); 8811570SCurtis.Dunham@arm.com 8911570SCurtis.Dunham@arm.com public: 9011570SCurtis.Dunham@arm.com Link(const std::string &name, EtherLink *p, int num, 9111570SCurtis.Dunham@arm.com double rate, Tick delay, Tick delay_var, EtherDump *dump); 9211570SCurtis.Dunham@arm.com ~Link() {} 9311570SCurtis.Dunham@arm.com 9411570SCurtis.Dunham@arm.com const std::string name() const { return objName; } 9511570SCurtis.Dunham@arm.com 9611570SCurtis.Dunham@arm.com bool busy() const { return (bool)packet; } 9711570SCurtis.Dunham@arm.com bool transmit(EthPacketPtr packet); 989978Sandreas.hansson@arm.com 9911570SCurtis.Dunham@arm.com void setTxInt(Interface *i) { assert(!txint); txint = i; } 10011570SCurtis.Dunham@arm.com void setRxInt(Interface *i) { assert(!rxint); rxint = i; } 1019978Sandreas.hansson@arm.com 1029978Sandreas.hansson@arm.com void serialize(const std::string &base, CheckpointOut &cp) const; 1039978Sandreas.hansson@arm.com void unserialize(const std::string &base, CheckpointIn &cp); 1049978Sandreas.hansson@arm.com }; 1059978Sandreas.hansson@arm.com 1069978Sandreas.hansson@arm.com /* 10711570SCurtis.Dunham@arm.com * Interface at each end of the link 1089978Sandreas.hansson@arm.com */ 1099978Sandreas.hansson@arm.com class Interface : public EtherInt 1109978Sandreas.hansson@arm.com { 1119978Sandreas.hansson@arm.com private: 1129978Sandreas.hansson@arm.com Link *txlink; 1139978Sandreas.hansson@arm.com 11411570SCurtis.Dunham@arm.com public: 11511570SCurtis.Dunham@arm.com Interface(const std::string &name, Link *txlink, Link *rxlink); 11611570SCurtis.Dunham@arm.com bool recvPacket(EthPacketPtr packet) { return txlink->transmit(packet); } 11711570SCurtis.Dunham@arm.com void sendDone() { peer->sendDone(); } 11811570SCurtis.Dunham@arm.com bool isBusy() { return txlink->busy(); } 11911502SCurtis.Dunham@arm.com }; 12011502SCurtis.Dunham@arm.com 12111336Sandreas.hansson@arm.com Link *link[2]; 12210352Sandreas.hansson@arm.com Interface *interface[2]; 12310352Sandreas.hansson@arm.com 12410352Sandreas.hansson@arm.com public: 12510352Sandreas.hansson@arm.com typedef EtherLinkParams Params; 12610352Sandreas.hansson@arm.com EtherLink(const Params *p); 12710352Sandreas.hansson@arm.com virtual ~EtherLink(); 12810352Sandreas.hansson@arm.com 12910352Sandreas.hansson@arm.com const Params * 13010352Sandreas.hansson@arm.com params() const 13110352Sandreas.hansson@arm.com { 13210352Sandreas.hansson@arm.com return dynamic_cast<const Params *>(_params); 13310352Sandreas.hansson@arm.com } 13410352Sandreas.hansson@arm.com 13510352Sandreas.hansson@arm.com virtual EtherInt *getEthPort(const std::string &if_name, int idx); 13610352Sandreas.hansson@arm.com 13710242Ssteve.reinhardt@amd.com void serialize(CheckpointOut &cp) const M5_ATTR_OVERRIDE; 13810148Sandreas.hansson@arm.com void unserialize(CheckpointIn &cp) M5_ATTR_OVERRIDE; 1399312Sandreas.hansson@arm.com 1409312Sandreas.hansson@arm.com}; 1419312Sandreas.hansson@arm.com 1429312Sandreas.hansson@arm.com#endif // __ETHERLINK_HH__ 1439312Sandreas.hansson@arm.com