etherlink.hh revision 558
15612Sgblack@eecs.umich.edu/* 25612Sgblack@eecs.umich.edu * Copyright (c) 2003 The Regents of The University of Michigan 35612Sgblack@eecs.umich.edu * All rights reserved. 45612Sgblack@eecs.umich.edu * 55612Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 65612Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 75612Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 85612Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 95612Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 105612Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 115612Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 125612Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 135612Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 145612Sgblack@eecs.umich.edu * this software without specific prior written permission. 155612Sgblack@eecs.umich.edu * 165612Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175612Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185612Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195612Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205612Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215612Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225612Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235612Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245612Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255612Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265612Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275612Sgblack@eecs.umich.edu */ 285612Sgblack@eecs.umich.edu 295612Sgblack@eecs.umich.edu/* @file 305612Sgblack@eecs.umich.edu * Device module for modelling a fixed bandwidth full duplex ethernet link 315612Sgblack@eecs.umich.edu */ 325612Sgblack@eecs.umich.edu 335612Sgblack@eecs.umich.edu#ifndef __ETHERLINK_HH__ 345612Sgblack@eecs.umich.edu#define __ETHERLINK_HH__ 355612Sgblack@eecs.umich.edu 365612Sgblack@eecs.umich.edu#include "sim/host.hh" 375612Sgblack@eecs.umich.edu#include "sim/eventq.hh" 385612Sgblack@eecs.umich.edu#include "dev/etherint.hh" 395612Sgblack@eecs.umich.edu#include "dev/etherpkt.hh" 405612Sgblack@eecs.umich.edu#include "sim/sim_object.hh" 415612Sgblack@eecs.umich.edu 425612Sgblack@eecs.umich.educlass EtherDump; 435612Sgblack@eecs.umich.edu 445612Sgblack@eecs.umich.edu/* 455612Sgblack@eecs.umich.edu * Model for a fixed bandwidth full duplex ethernet link 465612Sgblack@eecs.umich.edu */ 475612Sgblack@eecs.umich.educlass EtherLink : public SimObject 485612Sgblack@eecs.umich.edu{ 495612Sgblack@eecs.umich.edu protected: 505612Sgblack@eecs.umich.edu class Interface; 515612Sgblack@eecs.umich.edu 525612Sgblack@eecs.umich.edu /* 535612Sgblack@eecs.umich.edu * Model for a single uni-directional link 545612Sgblack@eecs.umich.edu */ 555612Sgblack@eecs.umich.edu class Link : public Serializable { 565612Sgblack@eecs.umich.edu protected: 575612Sgblack@eecs.umich.edu std::string objName; 585612Sgblack@eecs.umich.edu 595612Sgblack@eecs.umich.edu Interface *txint; 605612Sgblack@eecs.umich.edu Interface *rxint; 615612Sgblack@eecs.umich.edu 625612Sgblack@eecs.umich.edu double ticks_per_byte; 635612Sgblack@eecs.umich.edu EtherDump *dump; 645612Sgblack@eecs.umich.edu 655612Sgblack@eecs.umich.edu protected: 665612Sgblack@eecs.umich.edu /* 675612Sgblack@eecs.umich.edu * Transfer is complete 685612Sgblack@eecs.umich.edu */ 695612Sgblack@eecs.umich.edu class DoneEvent : public Event 705612Sgblack@eecs.umich.edu { 715612Sgblack@eecs.umich.edu protected: 725612Sgblack@eecs.umich.edu Link *link; 735612Sgblack@eecs.umich.edu 745612Sgblack@eecs.umich.edu public: 755612Sgblack@eecs.umich.edu DoneEvent(EventQueue *q, Link *l) 765612Sgblack@eecs.umich.edu : Event(q), link(l) {} 775612Sgblack@eecs.umich.edu virtual void process() { link->txDone(); } 785612Sgblack@eecs.umich.edu virtual const char *description() 795612Sgblack@eecs.umich.edu { return "ethernet link completion"; } 805612Sgblack@eecs.umich.edu }; 815612Sgblack@eecs.umich.edu 825612Sgblack@eecs.umich.edu friend class DoneEvent; 835612Sgblack@eecs.umich.edu DoneEvent event; 845612Sgblack@eecs.umich.edu PacketPtr packet; 855612Sgblack@eecs.umich.edu 865612Sgblack@eecs.umich.edu void txDone(); 875612Sgblack@eecs.umich.edu 885612Sgblack@eecs.umich.edu public: 895612Sgblack@eecs.umich.edu Link(const std::string &name, double rate, EtherDump *dump); 905612Sgblack@eecs.umich.edu ~Link() {} 915612Sgblack@eecs.umich.edu 925612Sgblack@eecs.umich.edu virtual const std::string name() const { return objName; } 935612Sgblack@eecs.umich.edu 945615Sgblack@eecs.umich.edu bool busy() const { return (bool)packet; } 955615Sgblack@eecs.umich.edu bool transmit(PacketPtr &packet); 965612Sgblack@eecs.umich.edu 975615Sgblack@eecs.umich.edu void setTxInt(Interface *i) { assert(!txint); txint = i; } 985615Sgblack@eecs.umich.edu void setRxInt(Interface *i) { assert(!rxint); rxint = i; } 995615Sgblack@eecs.umich.edu 1005615Sgblack@eecs.umich.edu virtual void serialize(std::ostream &os); 1015615Sgblack@eecs.umich.edu virtual void unserialize(Checkpoint *cp, const std::string §ion); 1025615Sgblack@eecs.umich.edu }; 1035612Sgblack@eecs.umich.edu 1045612Sgblack@eecs.umich.edu /* 1055612Sgblack@eecs.umich.edu * Interface at each end of the link 1065612Sgblack@eecs.umich.edu */ 1075612Sgblack@eecs.umich.edu class Interface : public EtherInt 1085612Sgblack@eecs.umich.edu { 1095612Sgblack@eecs.umich.edu private: 1105615Sgblack@eecs.umich.edu Link *txlink; 1115612Sgblack@eecs.umich.edu 1125615Sgblack@eecs.umich.edu public: 1135615Sgblack@eecs.umich.edu Interface(const std::string &name, Link *txlink, Link *rxlink); 1145615Sgblack@eecs.umich.edu bool recvPacket(PacketPtr &packet) { return txlink->transmit(packet); } 1155612Sgblack@eecs.umich.edu void sendDone() { } 1165612Sgblack@eecs.umich.edu }; 1175612Sgblack@eecs.umich.edu 1185612Sgblack@eecs.umich.edu Link *link1; 1195612Sgblack@eecs.umich.edu Link *link2; 1205612Sgblack@eecs.umich.edu 1215612Sgblack@eecs.umich.edu EtherInt *int1; 1225612Sgblack@eecs.umich.edu EtherInt *int2; 1235612Sgblack@eecs.umich.edu 1245612Sgblack@eecs.umich.edu public: 1255612Sgblack@eecs.umich.edu EtherLink(const std::string &name, EtherInt *i1, EtherInt *i2, 1265612Sgblack@eecs.umich.edu Tick speed, EtherDump *dump); 1275612Sgblack@eecs.umich.edu virtual ~EtherLink(); 1285612Sgblack@eecs.umich.edu 1295612Sgblack@eecs.umich.edu virtual void serialize(std::ostream &os); 1305612Sgblack@eecs.umich.edu virtual void unserialize(Checkpoint *cp, const std::string §ion); 1315612Sgblack@eecs.umich.edu 1325612Sgblack@eecs.umich.edu}; 1335612Sgblack@eecs.umich.edu 1345612Sgblack@eecs.umich.edu#endif // __ETHERLINK_HH__ 1355612Sgblack@eecs.umich.edu