etherbus.hh revision 56
112853Sgabeblack@google.com/*
212853Sgabeblack@google.com * Copyright (c) 2003 The Regents of The University of Michigan
312853Sgabeblack@google.com * All rights reserved.
412853Sgabeblack@google.com *
512853Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without
612853Sgabeblack@google.com * modification, are permitted provided that the following conditions are
712853Sgabeblack@google.com * met: redistributions of source code must retain the above copyright
812853Sgabeblack@google.com * notice, this list of conditions and the following disclaimer;
912853Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright
1012853Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the
1112853Sgabeblack@google.com * documentation and/or other materials provided with the distribution;
1212853Sgabeblack@google.com * neither the name of the copyright holders nor the names of its
1312853Sgabeblack@google.com * contributors may be used to endorse or promote products derived from
1412853Sgabeblack@google.com * this software without specific prior written permission.
1512853Sgabeblack@google.com *
1612853Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1712853Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1812853Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1912853Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2012853Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2112853Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2212853Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2312853Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2412853Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2512853Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2612853Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2712853Sgabeblack@google.com */
2812853Sgabeblack@google.com
2912853Sgabeblack@google.com/* @file
3012853Sgabeblack@google.com * Device module for modelling an ethernet hub
3112853Sgabeblack@google.com */
3212853Sgabeblack@google.com
3312853Sgabeblack@google.com#ifndef __ETHERBUS_H__
3412853Sgabeblack@google.com#define __ETHERBUS_H__
3512853Sgabeblack@google.com
3612853Sgabeblack@google.com#include "sim/eventq.hh"
3712853Sgabeblack@google.com#include "dev/etherpkt.hh"
3812853Sgabeblack@google.com#include "sim/sim_object.hh"
3912853Sgabeblack@google.com
4012853Sgabeblack@google.comclass EtherDump;
4112853Sgabeblack@google.comclass EtherInt;
4212853Sgabeblack@google.comclass EtherBus : public SimObject
4312853Sgabeblack@google.com{
4412853Sgabeblack@google.com  protected:
4512853Sgabeblack@google.com    typedef std::list<EtherInt *> devlist_t;
4612853Sgabeblack@google.com    devlist_t devlist;
4712853Sgabeblack@google.com    double ticks_per_byte;
4812853Sgabeblack@google.com    bool loopback;
4912853Sgabeblack@google.com
5012853Sgabeblack@google.com  protected:
5112853Sgabeblack@google.com    class DoneEvent : public Event
5212853Sgabeblack@google.com    {
5312853Sgabeblack@google.com      protected:
5412853Sgabeblack@google.com        EtherBus *bus;
5512853Sgabeblack@google.com
5612853Sgabeblack@google.com      public:
5712853Sgabeblack@google.com        DoneEvent(EventQueue *q, EtherBus *b)
5812853Sgabeblack@google.com            : Event(q), bus(b) {}
5912853Sgabeblack@google.com        virtual void process() { bus->txDone(); }
6012853Sgabeblack@google.com        virtual const char *description() { return "ethernet bus completion"; }
6112853Sgabeblack@google.com    };
6212853Sgabeblack@google.com
6312853Sgabeblack@google.com    DoneEvent event;
6412853Sgabeblack@google.com    PacketPtr packet;
6512853Sgabeblack@google.com    EtherInt *sender;
6612853Sgabeblack@google.com    EtherDump *dump;
6712853Sgabeblack@google.com
6812853Sgabeblack@google.com  public:
6912853Sgabeblack@google.com    EtherBus(const std::string &name, double ticks_per_byte, bool loopback,
7012853Sgabeblack@google.com             EtherDump *dump);
7112853Sgabeblack@google.com    virtual ~EtherBus() {}
7212853Sgabeblack@google.com
7312853Sgabeblack@google.com    void txDone();
7412853Sgabeblack@google.com    void reg(EtherInt *dev);
7512853Sgabeblack@google.com    bool busy() const { return (bool)packet; }
7612853Sgabeblack@google.com    bool send(EtherInt *sender, PacketPtr packet);
7712853Sgabeblack@google.com};
7812853Sgabeblack@google.com
7912853Sgabeblack@google.com#endif // __ETHERBUS_H__
8012853Sgabeblack@google.com