4.6.6. Behavioral NIC Model Helper (nicbm)#

4.6.6.1. NIC Behavioral Model#

namespace nicbm#

Variables

static const size_t kMaxDmaLen = 2048#
class DMAOp#

Public Functions

virtual ~DMAOp() = default#

Public Members

bool write_#
uint64_t dma_addr_#
size_t len_#
void *data_#
class Runner#
#include <nicbm.h>

The Runner drives the main simulation loop. It’s initialized with a reference to a device it should manage, and then once runMain is called, it will start interacting with the PCI and Ethernet queue and forwarding calls to the device as needed.

Subclassed by nicbm::MultiNicRunner::CompRunner

Public Functions

explicit Runner(Device &dev_)#
virtual ~Runner()#
int ParseArgs(int argc, char *argv[])#

Parse command line arguments.

int RunMain()#

Run the simulation

void IssueDma(DMAOp &op)#
void MsiIssue(uint8_t vec)#
void MsiXIssue(uint8_t vec)#
void IntXIssue(bool level)#
void EthSend(const void *data, size_t len)#
void EventSchedule(TimedEvent &evt)#
void EventCancel(TimedEvent &evt)#
uint64_t TimePs() const#
uint64_t GetMacAddr() const#
void PrintBaseIfInfo(void)#

Print baseif info

Protected Functions

volatile union SimbricksProtoPcieD2H *D2HAlloc()#
volatile union SimbricksProtoNetMsg *D2NAlloc()#
void H2DRead(volatile struct SimbricksProtoPcieH2DRead *read)#
void H2DWrite(volatile struct SimbricksProtoPcieH2DWrite *write, bool posted)#
void H2DReadcomp(volatile struct SimbricksProtoPcieH2DReadcomp *rc)#
void H2DWritecomp(volatile struct SimbricksProtoPcieH2DWritecomp *wc)#
void H2DDevctrl(volatile struct SimbricksProtoPcieH2DDevctrl *dc)#
void PollH2D()#
void EthRecv(volatile struct SimbricksProtoNetMsgPacket *packetl)#
void PollN2D()#
bool EventNext(uint64_t &retval)#
void EventTrigger()#
void DmaDo(DMAOp &op)#
void DmaTrigger()#
virtual void YieldPoll()#
virtual int NicIfInit()#

Protected Attributes

uint64_t main_time_#
Device &dev_#
std::multiset<TimedEvent*, EventCmp> events_#
std::deque<DMAOp*> dma_queue_#
size_t dma_pending_#
uint64_t mac_addr_#
struct SimbricksBaseIfParams pcieParams_#
struct SimbricksBaseIfParams netParams_#
const char *shmPath_#
struct SimbricksNicIf nicif_#
struct SimbricksProtoPcieDevIntro dintro_#
struct SimbricksAdapterParams *pcieAdapterParams_#
struct SimbricksAdapterParams *netAdapterParams_#
sim_log::LogPtT log_ = sim_log::Log::createLog()#
class Device#

Subclassed by nicbm::SimpleDevice< TReg >

Public Functions

virtual void SetupIntro(struct SimbricksProtoPcieDevIntro &di) = 0#

Initialize device specific parameters (pci dev/vendor id, BARs etc. in intro struct.

virtual void RegRead(uint8_t bar, uint64_t addr, void *dest, size_t len) = 0#

execute a register read from bar:addr of length len. Should store result in dest.

virtual void RegWrite(uint8_t bar, uint64_t addr, const void *src, size_t len) = 0#

execute a register write to bar:addr of length len, with the data in src.

virtual void DmaComplete(DMAOp &op) = 0#

the previously issued DMA operation op completed.

virtual void EthRx(uint8_t port, const void *data, size_t len) = 0#

A packet has arrived on the wire, of length len with payload data.

virtual void Timed(TimedEvent &te)#

A timed event is due.

virtual void DevctrlUpdate(struct SimbricksProtoPcieH2DDevctrl &devctrl)#

Device control update

Public Members

Runner *runner_#

Protected Attributes

bool int_intx_en_#
bool int_msi_en_#
bool int_msix_en_#
struct EventCmp#

Public Functions

inline bool operator()(TimedEvent *a, TimedEvent *b) const#
template<class TReg = uint32_t>
class SimpleDevice : public nicbm::Runner::Device#
#include <nicbm.h>

Very simple device that just has one register size.

Public Functions

virtual TReg RegRead(uint8_t bar, uint64_t addr) = 0#
virtual void RegWrite(uint8_t bar, uint64_t addr, TReg val) = 0#
inline virtual void RegRead(uint8_t bar, uint64_t addr, void *dest, size_t len) override#

execute a register read from bar:addr of length len. Should store result in dest.

inline virtual void RegWrite(uint8_t bar, uint64_t addr, const void *src, size_t len) override#

execute a register write to bar:addr of length len, with the data in src.

class TimedEvent#

Public Functions

inline TimedEvent()#
virtual ~TimedEvent() = default#

Public Members

uint64_t time_#
int priority_#

4.6.6.2. Multi-NIC Support#

namespace nicbm
class MultiNicRunner#

Public Functions

explicit MultiNicRunner(DeviceFactory &factory)#
int RunMain(int argc, char *argv[])#

Run the simulation

Protected Attributes

DeviceFactory &factory_#
class DeviceFactory#

Public Functions

virtual Runner::Device &create() = 0#
class CompRunner : public nicbm::Runner#

Public Functions

explicit CompRunner(Device &dev_)#

Protected Functions

virtual void YieldPoll() override#
virtual int NicIfInit() override#