etherlink.hh revision 56
14479Sbinkertn@umich.edu/* 24479Sbinkertn@umich.edu * Copyright (c) 2003 The Regents of The University of Michigan 34479Sbinkertn@umich.edu * All rights reserved. 44479Sbinkertn@umich.edu * 54479Sbinkertn@umich.edu * Redistribution and use in source and binary forms, with or without 64479Sbinkertn@umich.edu * modification, are permitted provided that the following conditions are 74479Sbinkertn@umich.edu * met: redistributions of source code must retain the above copyright 84479Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer; 94479Sbinkertn@umich.edu * redistributions in binary form must reproduce the above copyright 104479Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer in the 114479Sbinkertn@umich.edu * documentation and/or other materials provided with the distribution; 124479Sbinkertn@umich.edu * neither the name of the copyright holders nor the names of its 134479Sbinkertn@umich.edu * contributors may be used to endorse or promote products derived from 144479Sbinkertn@umich.edu * this software without specific prior written permission. 154479Sbinkertn@umich.edu * 164479Sbinkertn@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 174479Sbinkertn@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 184479Sbinkertn@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 194479Sbinkertn@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 204479Sbinkertn@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 214479Sbinkertn@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 224479Sbinkertn@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 234479Sbinkertn@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 244479Sbinkertn@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 254479Sbinkertn@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 264479Sbinkertn@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274479Sbinkertn@umich.edu */ 284479Sbinkertn@umich.edu 294479Sbinkertn@umich.edu/* @file 304479Sbinkertn@umich.edu * Device module for modelling a fixed bandwidth full duplex ethernet link 314479Sbinkertn@umich.edu */ 324479Sbinkertn@umich.edu 334479Sbinkertn@umich.edu#ifndef __ETHERLINK_HH__ 344479Sbinkertn@umich.edu#define __ETHERLINK_HH__ 354479Sbinkertn@umich.edu 364479Sbinkertn@umich.edu#include "sim/host.hh" 374479Sbinkertn@umich.edu#include "sim/eventq.hh" 384479Sbinkertn@umich.edu#include "dev/etherint.hh" 394479Sbinkertn@umich.edu#include "dev/etherpkt.hh" 404479Sbinkertn@umich.edu#include "sim/sim_object.hh" 414479Sbinkertn@umich.edu 424479Sbinkertn@umich.educlass EtherDump; 434479Sbinkertn@umich.edu 444479Sbinkertn@umich.edu/* 454479Sbinkertn@umich.edu * Model for a fixed bandwidth full duplex ethernet link 464479Sbinkertn@umich.edu */ 474479Sbinkertn@umich.educlass EtherLink : public SimObject 484479Sbinkertn@umich.edu{ 494479Sbinkertn@umich.edu protected: 504479Sbinkertn@umich.edu class Interface; 514479Sbinkertn@umich.edu 524479Sbinkertn@umich.edu /* 534479Sbinkertn@umich.edu * Model for a single uni-directional link 544479Sbinkertn@umich.edu */ 554479Sbinkertn@umich.edu class Link : public Serializeable { 564479Sbinkertn@umich.edu protected: 574479Sbinkertn@umich.edu Interface *txint; 584479Sbinkertn@umich.edu Interface *rxint; 594479Sbinkertn@umich.edu 604479Sbinkertn@umich.edu double ticks_per_byte; 614479Sbinkertn@umich.edu EtherDump *dump; 624479Sbinkertn@umich.edu 634479Sbinkertn@umich.edu protected: 644479Sbinkertn@umich.edu /* 654479Sbinkertn@umich.edu * Transfer is complete 664479Sbinkertn@umich.edu */ 674479Sbinkertn@umich.edu class DoneEvent : public Event 684479Sbinkertn@umich.edu { 694479Sbinkertn@umich.edu protected: 704479Sbinkertn@umich.edu Link *link; 714479Sbinkertn@umich.edu 724479Sbinkertn@umich.edu public: 734479Sbinkertn@umich.edu DoneEvent(EventQueue *q, Link *l) 744479Sbinkertn@umich.edu : Event(q), link(l) {} 754479Sbinkertn@umich.edu virtual void process() { link->txDone(); } 764479Sbinkertn@umich.edu virtual const char *description() 774479Sbinkertn@umich.edu { return "ethernet link completion"; } 784479Sbinkertn@umich.edu }; 794479Sbinkertn@umich.edu 804479Sbinkertn@umich.edu friend class DoneEvent; 814479Sbinkertn@umich.edu DoneEvent event; 824479Sbinkertn@umich.edu PacketPtr packet; 834479Sbinkertn@umich.edu 844479Sbinkertn@umich.edu void txDone(); 854479Sbinkertn@umich.edu 864479Sbinkertn@umich.edu public: 874479Sbinkertn@umich.edu Link(const std::string &name, double rate, EtherDump *dump); 884479Sbinkertn@umich.edu ~Link() {} 894479Sbinkertn@umich.edu 904479Sbinkertn@umich.edu bool busy() const { return (bool)packet; } 914479Sbinkertn@umich.edu bool transmit(PacketPtr packet); 924479Sbinkertn@umich.edu 934479Sbinkertn@umich.edu void setTxInt(Interface *i) { assert(!txint); txint = i; } 944479Sbinkertn@umich.edu void setRxInt(Interface *i) { assert(!rxint); rxint = i; } 954479Sbinkertn@umich.edu }; 964479Sbinkertn@umich.edu 974479Sbinkertn@umich.edu /* 984479Sbinkertn@umich.edu * Interface at each end of the link 994479Sbinkertn@umich.edu */ 1004479Sbinkertn@umich.edu class Interface : public EtherInt 1014479Sbinkertn@umich.edu { 1024479Sbinkertn@umich.edu private: 1034479Sbinkertn@umich.edu Link *txlink; 1044479Sbinkertn@umich.edu 1054479Sbinkertn@umich.edu public: 1064479Sbinkertn@umich.edu Interface(const std::string &name, Link *txlink, Link *rxlink); 1074479Sbinkertn@umich.edu bool recvPacket(PacketPtr packet) { return txlink->transmit(packet); } 1084479Sbinkertn@umich.edu void sendDone() { } 1094479Sbinkertn@umich.edu }; 1104479Sbinkertn@umich.edu 1114479Sbinkertn@umich.edu Link *link1; 1124479Sbinkertn@umich.edu Link *link2; 1134479Sbinkertn@umich.edu 1144479Sbinkertn@umich.edu EtherInt *int1; 1154479Sbinkertn@umich.edu EtherInt *int2; 1164479Sbinkertn@umich.edu 1174479Sbinkertn@umich.edu public: 1184479Sbinkertn@umich.edu EtherLink(const std::string &name, EtherInt *i1, EtherInt *i2, 1194479Sbinkertn@umich.edu Tick speed, EtherDump *dump); 1204479Sbinkertn@umich.edu virtual ~EtherLink(); 1214479Sbinkertn@umich.edu}; 1224479Sbinkertn@umich.edu 1234479Sbinkertn@umich.edu#endif // __ETHERLINK_HH__ 1244479Sbinkertn@umich.edu