etherswitch.hh revision 11341
111317Sm.alian1369@gmail.com/* 211317Sm.alian1369@gmail.com * Copyright (c) 2014 The Regents of The University of Michigan 311317Sm.alian1369@gmail.com * All rights reserved. 411317Sm.alian1369@gmail.com * 511317Sm.alian1369@gmail.com * Redistribution and use in source and binary forms, with or without 611317Sm.alian1369@gmail.com * modification, are permitted provided that the following conditions are 711317Sm.alian1369@gmail.com * met: redistributions of source code must retain the above copyright 811317Sm.alian1369@gmail.com * notice, this list of conditions and the following disclaimer; 911317Sm.alian1369@gmail.com * redistributions in binary form must reproduce the above copyright 1011317Sm.alian1369@gmail.com * notice, this list of conditions and the following disclaimer in the 1111317Sm.alian1369@gmail.com * documentation and/or other materials provided with the distribution; 1211317Sm.alian1369@gmail.com * neither the name of the copyright holders nor the names of its 1311317Sm.alian1369@gmail.com * contributors may be used to endorse or promote products derived from 1411317Sm.alian1369@gmail.com * this software without specific prior written permission. 1511317Sm.alian1369@gmail.com * 1611317Sm.alian1369@gmail.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1711317Sm.alian1369@gmail.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1811317Sm.alian1369@gmail.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1911317Sm.alian1369@gmail.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011317Sm.alian1369@gmail.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2111317Sm.alian1369@gmail.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211317Sm.alian1369@gmail.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311317Sm.alian1369@gmail.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411317Sm.alian1369@gmail.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511317Sm.alian1369@gmail.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2611317Sm.alian1369@gmail.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711317Sm.alian1369@gmail.com * 2811317Sm.alian1369@gmail.com * Authors: Anthony Gutierrez 2911317Sm.alian1369@gmail.com * Mohammad Alian 3011317Sm.alian1369@gmail.com */ 3111317Sm.alian1369@gmail.com 3211317Sm.alian1369@gmail.com/* @file 3311317Sm.alian1369@gmail.com * Device model for an ethernet switch 3411317Sm.alian1369@gmail.com */ 3511317Sm.alian1369@gmail.com 3611317Sm.alian1369@gmail.com#ifndef __DEV_ETHERSWITCH_HH__ 3711317Sm.alian1369@gmail.com#define __DEV_ETHERSWITCH_HH__ 3811317Sm.alian1369@gmail.com 3911317Sm.alian1369@gmail.com#include <unordered_map> 4011317Sm.alian1369@gmail.com 4111317Sm.alian1369@gmail.com#include "base/inet.hh" 4211317Sm.alian1369@gmail.com#include "dev/net/etherint.hh" 4311317Sm.alian1369@gmail.com#include "dev/net/etherlink.hh" 4411317Sm.alian1369@gmail.com#include "dev/net/etherobject.hh" 4511317Sm.alian1369@gmail.com#include "dev/net/etherpkt.hh" 4611317Sm.alian1369@gmail.com#include "dev/net/pktfifo.hh" 4711317Sm.alian1369@gmail.com#include "params/EtherSwitch.hh" 4811317Sm.alian1369@gmail.com#include "sim/eventq.hh" 4911317Sm.alian1369@gmail.com 5011317Sm.alian1369@gmail.comclass EtherSwitch : public EtherObject 5111317Sm.alian1369@gmail.com{ 5211317Sm.alian1369@gmail.com public: 5311317Sm.alian1369@gmail.com typedef EtherSwitchParams Params; 5411317Sm.alian1369@gmail.com 5511317Sm.alian1369@gmail.com EtherSwitch(const Params *p); 5611317Sm.alian1369@gmail.com ~EtherSwitch(); 5711317Sm.alian1369@gmail.com 5811317Sm.alian1369@gmail.com const Params * params() const 5911317Sm.alian1369@gmail.com { 6011317Sm.alian1369@gmail.com return dynamic_cast<const Params*>(_params); 6111317Sm.alian1369@gmail.com } 6211317Sm.alian1369@gmail.com 6311341Sandreas.hansson@arm.com EtherInt *getEthPort(const std::string &if_name, int idx) override; 6411317Sm.alian1369@gmail.com 6511317Sm.alian1369@gmail.com protected: 6611317Sm.alian1369@gmail.com /** 6711317Sm.alian1369@gmail.com * Model for an Ethernet switch port 6811317Sm.alian1369@gmail.com */ 6911317Sm.alian1369@gmail.com class Interface : public EtherInt 7011317Sm.alian1369@gmail.com { 7111317Sm.alian1369@gmail.com public: 7211317Sm.alian1369@gmail.com Interface(const std::string &name, EtherSwitch *_etherSwitch, 7311317Sm.alian1369@gmail.com uint64_t outputBufferSize, Tick delay, Tick delay_var, 7411317Sm.alian1369@gmail.com double rate); 7511317Sm.alian1369@gmail.com /** 7611317Sm.alian1369@gmail.com * When a packet is received from a device, route it 7711317Sm.alian1369@gmail.com * through an (several) output queue(s) 7811317Sm.alian1369@gmail.com */ 7911317Sm.alian1369@gmail.com bool recvPacket(EthPacketPtr packet); 8011317Sm.alian1369@gmail.com /** 8111317Sm.alian1369@gmail.com * enqueue packet to the outputFifo 8211317Sm.alian1369@gmail.com */ 8311317Sm.alian1369@gmail.com void enqueue(EthPacketPtr packet); 8411317Sm.alian1369@gmail.com void sendDone() {} 8511317Sm.alian1369@gmail.com Tick switchingDelay(); 8611317Sm.alian1369@gmail.com 8711317Sm.alian1369@gmail.com Interface* lookupDestPort(Net::EthAddr destAddr); 8811317Sm.alian1369@gmail.com void learnSenderAddr(Net::EthAddr srcMacAddr, Interface *sender); 8911317Sm.alian1369@gmail.com 9011317Sm.alian1369@gmail.com void serialize(const std::string &base, CheckpointOut &cp) const; 9111317Sm.alian1369@gmail.com void unserialize(const std::string &base, CheckpointIn &cp); 9211317Sm.alian1369@gmail.com 9311317Sm.alian1369@gmail.com private: 9411317Sm.alian1369@gmail.com const double ticksPerByte; 9511317Sm.alian1369@gmail.com const Tick switchDelay; 9611317Sm.alian1369@gmail.com const Tick delayVar; 9711317Sm.alian1369@gmail.com EtherSwitch *parent; 9811317Sm.alian1369@gmail.com /** 9911317Sm.alian1369@gmail.com * output fifo at each interface 10011317Sm.alian1369@gmail.com */ 10111317Sm.alian1369@gmail.com PacketFifo outputFifo; 10211317Sm.alian1369@gmail.com void transmit(); 10311317Sm.alian1369@gmail.com EventWrapper<Interface, &Interface::transmit> txEvent; 10411317Sm.alian1369@gmail.com }; 10511317Sm.alian1369@gmail.com 10611317Sm.alian1369@gmail.com struct SwitchTableEntry { 10711317Sm.alian1369@gmail.com Interface *interface; 10811317Sm.alian1369@gmail.com Tick lastUseTime; 10911317Sm.alian1369@gmail.com }; 11011317Sm.alian1369@gmail.com 11111317Sm.alian1369@gmail.com private: 11211317Sm.alian1369@gmail.com // time to live for MAC address mappings 11311317Sm.alian1369@gmail.com const double ttl; 11411317Sm.alian1369@gmail.com // all interfaces of the switch 11511317Sm.alian1369@gmail.com std::vector<Interface*> interfaces; 11611317Sm.alian1369@gmail.com // table that maps MAC address to interfaces 11711317Sm.alian1369@gmail.com std::map<uint64_t, SwitchTableEntry> forwardingTable; 11811317Sm.alian1369@gmail.com 11911317Sm.alian1369@gmail.com void serialize(CheckpointOut &cp) const override; 12011317Sm.alian1369@gmail.com void unserialize(CheckpointIn &cp) override; 12111317Sm.alian1369@gmail.com}; 12211317Sm.alian1369@gmail.com 12311317Sm.alian1369@gmail.com#endif // __DEV_ETHERSWITCH_HH__ 124