etherlink.hh revision 558
113481Sgiacomo.travaglini@arm.com/* 213481Sgiacomo.travaglini@arm.com * Copyright (c) 2003 The Regents of The University of Michigan 313481Sgiacomo.travaglini@arm.com * All rights reserved. 413481Sgiacomo.travaglini@arm.com * 513481Sgiacomo.travaglini@arm.com * Redistribution and use in source and binary forms, with or without 613481Sgiacomo.travaglini@arm.com * modification, are permitted provided that the following conditions are 713481Sgiacomo.travaglini@arm.com * met: redistributions of source code must retain the above copyright 813481Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer; 913481Sgiacomo.travaglini@arm.com * redistributions in binary form must reproduce the above copyright 1013481Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer in the 1113481Sgiacomo.travaglini@arm.com * documentation and/or other materials provided with the distribution; 1213481Sgiacomo.travaglini@arm.com * neither the name of the copyright holders nor the names of its 1313481Sgiacomo.travaglini@arm.com * contributors may be used to endorse or promote products derived from 1413481Sgiacomo.travaglini@arm.com * this software without specific prior written permission. 1513481Sgiacomo.travaglini@arm.com * 1613481Sgiacomo.travaglini@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1713481Sgiacomo.travaglini@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1813481Sgiacomo.travaglini@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1913481Sgiacomo.travaglini@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2013481Sgiacomo.travaglini@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2113481Sgiacomo.travaglini@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2213481Sgiacomo.travaglini@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2313481Sgiacomo.travaglini@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2413481Sgiacomo.travaglini@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2513481Sgiacomo.travaglini@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2613481Sgiacomo.travaglini@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2713481Sgiacomo.travaglini@arm.com */ 2813481Sgiacomo.travaglini@arm.com 2913481Sgiacomo.travaglini@arm.com/* @file 3013481Sgiacomo.travaglini@arm.com * Device module for modelling a fixed bandwidth full duplex ethernet link 3113481Sgiacomo.travaglini@arm.com */ 3213481Sgiacomo.travaglini@arm.com 3313481Sgiacomo.travaglini@arm.com#ifndef __ETHERLINK_HH__ 3413481Sgiacomo.travaglini@arm.com#define __ETHERLINK_HH__ 3513481Sgiacomo.travaglini@arm.com 3613481Sgiacomo.travaglini@arm.com#include "sim/host.hh" 3713481Sgiacomo.travaglini@arm.com#include "sim/eventq.hh" 3813481Sgiacomo.travaglini@arm.com#include "dev/etherint.hh" 3913481Sgiacomo.travaglini@arm.com#include "dev/etherpkt.hh" 4013481Sgiacomo.travaglini@arm.com#include "sim/sim_object.hh" 4113481Sgiacomo.travaglini@arm.com 4213481Sgiacomo.travaglini@arm.comclass EtherDump; 4313481Sgiacomo.travaglini@arm.com 4413481Sgiacomo.travaglini@arm.com/* 4513481Sgiacomo.travaglini@arm.com * Model for a fixed bandwidth full duplex ethernet link 4613481Sgiacomo.travaglini@arm.com */ 4713481Sgiacomo.travaglini@arm.comclass EtherLink : public SimObject 4813481Sgiacomo.travaglini@arm.com{ 4913481Sgiacomo.travaglini@arm.com protected: 5013481Sgiacomo.travaglini@arm.com class Interface; 5113481Sgiacomo.travaglini@arm.com 5213481Sgiacomo.travaglini@arm.com /* 5313481Sgiacomo.travaglini@arm.com * Model for a single uni-directional link 5413481Sgiacomo.travaglini@arm.com */ 5513481Sgiacomo.travaglini@arm.com class Link : public Serializable { 5613481Sgiacomo.travaglini@arm.com protected: 5713481Sgiacomo.travaglini@arm.com std::string objName; 5813481Sgiacomo.travaglini@arm.com 5913481Sgiacomo.travaglini@arm.com Interface *txint; 6013481Sgiacomo.travaglini@arm.com Interface *rxint; 6113481Sgiacomo.travaglini@arm.com 6213481Sgiacomo.travaglini@arm.com double ticks_per_byte; 6313481Sgiacomo.travaglini@arm.com EtherDump *dump; 6413481Sgiacomo.travaglini@arm.com 6513481Sgiacomo.travaglini@arm.com protected: 6613481Sgiacomo.travaglini@arm.com /* 6713481Sgiacomo.travaglini@arm.com * Transfer is complete 6813481Sgiacomo.travaglini@arm.com */ 6913481Sgiacomo.travaglini@arm.com class DoneEvent : public Event 7013481Sgiacomo.travaglini@arm.com { 7113481Sgiacomo.travaglini@arm.com protected: 7213481Sgiacomo.travaglini@arm.com Link *link; 7313481Sgiacomo.travaglini@arm.com 7413481Sgiacomo.travaglini@arm.com public: 7513481Sgiacomo.travaglini@arm.com DoneEvent(EventQueue *q, Link *l) 7613481Sgiacomo.travaglini@arm.com : Event(q), link(l) {} 7713481Sgiacomo.travaglini@arm.com virtual void process() { link->txDone(); } 7813481Sgiacomo.travaglini@arm.com virtual const char *description() 7913481Sgiacomo.travaglini@arm.com { return "ethernet link completion"; } 8013481Sgiacomo.travaglini@arm.com }; 8113481Sgiacomo.travaglini@arm.com 8213481Sgiacomo.travaglini@arm.com friend class DoneEvent; 8313481Sgiacomo.travaglini@arm.com DoneEvent event; 8413481Sgiacomo.travaglini@arm.com PacketPtr packet; 8513481Sgiacomo.travaglini@arm.com 8613481Sgiacomo.travaglini@arm.com void txDone(); 8713481Sgiacomo.travaglini@arm.com 8813481Sgiacomo.travaglini@arm.com public: 8913481Sgiacomo.travaglini@arm.com Link(const std::string &name, double rate, EtherDump *dump); 9013481Sgiacomo.travaglini@arm.com ~Link() {} 9113481Sgiacomo.travaglini@arm.com 9213481Sgiacomo.travaglini@arm.com virtual const std::string name() const { return objName; } 9313481Sgiacomo.travaglini@arm.com 9413481Sgiacomo.travaglini@arm.com bool busy() const { return (bool)packet; } 9513481Sgiacomo.travaglini@arm.com bool transmit(PacketPtr &packet); 9613481Sgiacomo.travaglini@arm.com 9713481Sgiacomo.travaglini@arm.com void setTxInt(Interface *i) { assert(!txint); txint = i; } 9813481Sgiacomo.travaglini@arm.com void setRxInt(Interface *i) { assert(!rxint); rxint = i; } 9913481Sgiacomo.travaglini@arm.com 10013481Sgiacomo.travaglini@arm.com virtual void serialize(std::ostream &os); 10113481Sgiacomo.travaglini@arm.com virtual void unserialize(Checkpoint *cp, const std::string §ion); 10213481Sgiacomo.travaglini@arm.com }; 10313481Sgiacomo.travaglini@arm.com 10413481Sgiacomo.travaglini@arm.com /* 10513481Sgiacomo.travaglini@arm.com * Interface at each end of the link 10613481Sgiacomo.travaglini@arm.com */ 10713481Sgiacomo.travaglini@arm.com class Interface : public EtherInt 10813481Sgiacomo.travaglini@arm.com { 10913481Sgiacomo.travaglini@arm.com private: 11013481Sgiacomo.travaglini@arm.com Link *txlink; 11113481Sgiacomo.travaglini@arm.com 11213481Sgiacomo.travaglini@arm.com public: 11313481Sgiacomo.travaglini@arm.com Interface(const std::string &name, Link *txlink, Link *rxlink); 11413481Sgiacomo.travaglini@arm.com bool recvPacket(PacketPtr &packet) { return txlink->transmit(packet); } 11513481Sgiacomo.travaglini@arm.com void sendDone() { } 11613481Sgiacomo.travaglini@arm.com }; 11713481Sgiacomo.travaglini@arm.com 11813481Sgiacomo.travaglini@arm.com Link *link1; 11913481Sgiacomo.travaglini@arm.com Link *link2; 12013481Sgiacomo.travaglini@arm.com 12113481Sgiacomo.travaglini@arm.com EtherInt *int1; 12213481Sgiacomo.travaglini@arm.com EtherInt *int2; 12313481Sgiacomo.travaglini@arm.com 12413481Sgiacomo.travaglini@arm.com public: 12513481Sgiacomo.travaglini@arm.com EtherLink(const std::string &name, EtherInt *i1, EtherInt *i2, 12613481Sgiacomo.travaglini@arm.com Tick speed, EtherDump *dump); 12713481Sgiacomo.travaglini@arm.com virtual ~EtherLink(); 12813481Sgiacomo.travaglini@arm.com 12913481Sgiacomo.travaglini@arm.com virtual void serialize(std::ostream &os); 13013481Sgiacomo.travaglini@arm.com virtual void unserialize(Checkpoint *cp, const std::string §ion); 13113481Sgiacomo.travaglini@arm.com 13213481Sgiacomo.travaglini@arm.com}; 13313481Sgiacomo.travaglini@arm.com 13413481Sgiacomo.travaglini@arm.com#endif // __ETHERLINK_HH__ 13513481Sgiacomo.travaglini@arm.com