summaryrefslogtreecommitdiff
path: root/src/dev/net/etherswitch.hh
diff options
context:
space:
mode:
authorMohammad Alian <m.alian1369@gmail.com>2016-02-06 13:33:34 -0500
committerMohammad Alian <m.alian1369@gmail.com>2016-02-06 13:33:34 -0500
commit24da47cf96e0914cac550d66534860266a2a3280 (patch)
tree69eab014876100a191cd6d78ba408a821f4cc769 /src/dev/net/etherswitch.hh
parentce35c06c6e0f957ce4d6b8f122e9a37532210a0d (diff)
downloadgem5-24da47cf96e0914cac550d66534860266a2a3280.tar.xz
dist, dev: add an ethernet switch model
Diffstat (limited to 'src/dev/net/etherswitch.hh')
-rw-r--r--src/dev/net/etherswitch.hh123
1 files changed, 123 insertions, 0 deletions
diff --git a/src/dev/net/etherswitch.hh b/src/dev/net/etherswitch.hh
new file mode 100644
index 000000000..69a3f40fd
--- /dev/null
+++ b/src/dev/net/etherswitch.hh
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2014 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Anthony Gutierrez
+ * Mohammad Alian
+ */
+
+/* @file
+ * Device model for an ethernet switch
+ */
+
+#ifndef __DEV_ETHERSWITCH_HH__
+#define __DEV_ETHERSWITCH_HH__
+
+#include <unordered_map>
+
+#include "base/inet.hh"
+#include "dev/net/etherint.hh"
+#include "dev/net/etherlink.hh"
+#include "dev/net/etherobject.hh"
+#include "dev/net/etherpkt.hh"
+#include "dev/net/pktfifo.hh"
+#include "params/EtherSwitch.hh"
+#include "sim/eventq.hh"
+
+class EtherSwitch : public EtherObject
+{
+ public:
+ typedef EtherSwitchParams Params;
+
+ EtherSwitch(const Params *p);
+ ~EtherSwitch();
+
+ const Params * params() const
+ {
+ return dynamic_cast<const Params*>(_params);
+ }
+
+ EtherInt *getEthPort(const std::string &if_name, int idx);
+
+ protected:
+ /**
+ * Model for an Ethernet switch port
+ */
+ class Interface : public EtherInt
+ {
+ public:
+ Interface(const std::string &name, EtherSwitch *_etherSwitch,
+ uint64_t outputBufferSize, Tick delay, Tick delay_var,
+ double rate);
+ /**
+ * When a packet is received from a device, route it
+ * through an (several) output queue(s)
+ */
+ bool recvPacket(EthPacketPtr packet);
+ /**
+ * enqueue packet to the outputFifo
+ */
+ void enqueue(EthPacketPtr packet);
+ void sendDone() {}
+ Tick switchingDelay();
+
+ Interface* lookupDestPort(Net::EthAddr destAddr);
+ void learnSenderAddr(Net::EthAddr srcMacAddr, Interface *sender);
+
+ void serialize(const std::string &base, CheckpointOut &cp) const;
+ void unserialize(const std::string &base, CheckpointIn &cp);
+
+ private:
+ const double ticksPerByte;
+ const Tick switchDelay;
+ const Tick delayVar;
+ EtherSwitch *parent;
+ /**
+ * output fifo at each interface
+ */
+ PacketFifo outputFifo;
+ void transmit();
+ EventWrapper<Interface, &Interface::transmit> txEvent;
+ };
+
+ struct SwitchTableEntry {
+ Interface *interface;
+ Tick lastUseTime;
+ };
+
+ private:
+ // time to live for MAC address mappings
+ const double ttl;
+ // all interfaces of the switch
+ std::vector<Interface*> interfaces;
+ // table that maps MAC address to interfaces
+ std::map<uint64_t, SwitchTableEntry> forwardingTable;
+
+ void serialize(CheckpointOut &cp) const override;
+ void unserialize(CheckpointIn &cp) override;
+};
+
+#endif // __DEV_ETHERSWITCH_HH__