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 §ion); 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 §ion); 129 130}; 131 132#endif // __ETHERLINK_HH__ 133