etherbus.cc revision 2665
15643Sgblack@eecs.umich.edu/* 25643Sgblack@eecs.umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan 35643Sgblack@eecs.umich.edu * All rights reserved. 45643Sgblack@eecs.umich.edu * 55643Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 65643Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 75643Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 85643Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 95643Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 105643Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 115643Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 125643Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 135643Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 145643Sgblack@eecs.umich.edu * this software without specific prior written permission. 155643Sgblack@eecs.umich.edu * 165643Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175643Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185643Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195643Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205643Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215643Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225643Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235643Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245643Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255643Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265643Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275643Sgblack@eecs.umich.edu * 285643Sgblack@eecs.umich.edu * Authors: Nathan Binkert 295643Sgblack@eecs.umich.edu */ 305643Sgblack@eecs.umich.edu 316138Sgblack@eecs.umich.edu/* @file 325651Sgblack@eecs.umich.edu * Device module for modelling an ethernet hub 335643Sgblack@eecs.umich.edu */ 345657Sgblack@eecs.umich.edu 355643Sgblack@eecs.umich.edu#include <cmath> 365643Sgblack@eecs.umich.edu#include <deque> 375643Sgblack@eecs.umich.edu#include <string> 385643Sgblack@eecs.umich.edu#include <vector> 396803Sgblack@eecs.umich.edu 406803Sgblack@eecs.umich.edu#include "base/trace.hh" 415827Sgblack@eecs.umich.edu#include "dev/etherbus.hh" 426139Sgblack@eecs.umich.edu#include "dev/etherdump.hh" 435643Sgblack@eecs.umich.edu#include "dev/etherint.hh" 445643Sgblack@eecs.umich.edu#include "dev/etherpkt.hh" 456136Sgblack@eecs.umich.edu#include "sim/builder.hh" 465643Sgblack@eecs.umich.edu#include "sim/root.hh" 475643Sgblack@eecs.umich.edu 485643Sgblack@eecs.umich.eduusing namespace std; 495653Sgblack@eecs.umich.edu 505653Sgblack@eecs.umich.eduEtherBus::EtherBus(const string &name, double speed, bool loop, 515653Sgblack@eecs.umich.edu EtherDump *packet_dump) 525653Sgblack@eecs.umich.edu : SimObject(name), ticksPerByte(speed), loopback(loop), 535827Sgblack@eecs.umich.edu event(&mainEventQueue, this), sender(0), dump(packet_dump) 545653Sgblack@eecs.umich.edu{ 555643Sgblack@eecs.umich.edu} 565643Sgblack@eecs.umich.edu 575643Sgblack@eecs.umich.eduvoid 585643Sgblack@eecs.umich.eduEtherBus::txDone() 595643Sgblack@eecs.umich.edu{ 605643Sgblack@eecs.umich.edu devlist_t::iterator i = devlist.begin(); 615643Sgblack@eecs.umich.edu devlist_t::iterator end = devlist.end(); 625643Sgblack@eecs.umich.edu 635643Sgblack@eecs.umich.edu DPRINTF(Ethernet, "ethernet packet received: length=%d\n", packet->length); 645643Sgblack@eecs.umich.edu DDUMP(EthernetData, packet->data, packet->length); 655643Sgblack@eecs.umich.edu 665643Sgblack@eecs.umich.edu while (i != end) { 675643Sgblack@eecs.umich.edu if (loopback || *i != sender) 685643Sgblack@eecs.umich.edu (*i)->sendPacket(packet); 695643Sgblack@eecs.umich.edu ++i; 705643Sgblack@eecs.umich.edu } 715643Sgblack@eecs.umich.edu 725898Sgblack@eecs.umich.edu sender->sendDone(); 735643Sgblack@eecs.umich.edu 745643Sgblack@eecs.umich.edu if (dump) 755643Sgblack@eecs.umich.edu dump->dump(packet); 765643Sgblack@eecs.umich.edu 775643Sgblack@eecs.umich.edu sender = 0; 785643Sgblack@eecs.umich.edu packet = 0; 795643Sgblack@eecs.umich.edu} 805643Sgblack@eecs.umich.edu 815643Sgblack@eecs.umich.eduvoid 825643Sgblack@eecs.umich.eduEtherBus::reg(EtherInt *dev) 835643Sgblack@eecs.umich.edu{ devlist.push_back(dev); } 845643Sgblack@eecs.umich.edu 855643Sgblack@eecs.umich.edubool 865643Sgblack@eecs.umich.eduEtherBus::send(EtherInt *sndr, EthPacketPtr &pkt) 875643Sgblack@eecs.umich.edu{ 885643Sgblack@eecs.umich.edu if (busy()) { 895643Sgblack@eecs.umich.edu DPRINTF(Ethernet, "ethernet packet not sent, bus busy\n", curTick); 905643Sgblack@eecs.umich.edu return false; 915898Sgblack@eecs.umich.edu } 925643Sgblack@eecs.umich.edu 935643Sgblack@eecs.umich.edu DPRINTF(Ethernet, "ethernet packet sent: length=%d\n", pkt->length); 945643Sgblack@eecs.umich.edu DDUMP(EthernetData, pkt->data, pkt->length); 955643Sgblack@eecs.umich.edu 965643Sgblack@eecs.umich.edu packet = pkt; 975643Sgblack@eecs.umich.edu sender = sndr; 985643Sgblack@eecs.umich.edu int delay = (int)ceil(((double)pkt->length * ticksPerByte) + 1.0); 995643Sgblack@eecs.umich.edu DPRINTF(Ethernet, "scheduling packet: delay=%d, (rate=%f)\n", 1005643Sgblack@eecs.umich.edu delay, ticksPerByte); 1015643Sgblack@eecs.umich.edu event.schedule(curTick + delay); 1025643Sgblack@eecs.umich.edu 1035643Sgblack@eecs.umich.edu return true; 1045643Sgblack@eecs.umich.edu} 1055643Sgblack@eecs.umich.edu 1065643Sgblack@eecs.umich.eduBEGIN_DECLARE_SIM_OBJECT_PARAMS(EtherBus) 1075643Sgblack@eecs.umich.edu 1085643Sgblack@eecs.umich.edu Param<bool> loopback; 1095643Sgblack@eecs.umich.edu Param<double> speed; 1105643Sgblack@eecs.umich.edu SimObjectParam<EtherDump *> packet_dump; 1115643Sgblack@eecs.umich.edu 1125643Sgblack@eecs.umich.eduEND_DECLARE_SIM_OBJECT_PARAMS(EtherBus) 1135643Sgblack@eecs.umich.edu 1145643Sgblack@eecs.umich.eduBEGIN_INIT_SIM_OBJECT_PARAMS(EtherBus) 1155643Sgblack@eecs.umich.edu 1165643Sgblack@eecs.umich.edu INIT_PARAM(loopback, "send the packet back to the sending interface"), 1175643Sgblack@eecs.umich.edu INIT_PARAM(speed, "bus speed in ticks per byte"), 1185643Sgblack@eecs.umich.edu INIT_PARAM(packet_dump, "object to dump network packets to") 1195643Sgblack@eecs.umich.edu 1205643Sgblack@eecs.umich.eduEND_INIT_SIM_OBJECT_PARAMS(EtherBus) 1215643Sgblack@eecs.umich.edu 1225643Sgblack@eecs.umich.eduCREATE_SIM_OBJECT(EtherBus) 1235643Sgblack@eecs.umich.edu{ 1245643Sgblack@eecs.umich.edu return new EtherBus(getInstanceName(), speed, loopback, packet_dump); 1255643Sgblack@eecs.umich.edu} 1265643Sgblack@eecs.umich.edu 1275643Sgblack@eecs.umich.eduREGISTER_SIM_OBJECT("EtherBus", EtherBus) 1285643Sgblack@eecs.umich.edu