Commit 793050f3 authored by Antoine Kaufmann's avatar Antoine Kaufmann
Browse files

lib/nicbm: add mac address as an optional command line parameter

Also splits out arg parsing from running so code can use the mac address in
initializationg before calling run.
parent 765d83d6
......@@ -37,16 +37,13 @@ void MultiNicRunner::CompRunner::YieldPoll() {
boost::this_fiber::yield();
}
int MultiNicRunner::CompRunner::NicIfInit(
const char *shmPath,
struct SimbricksBaseIfParams *netParams,
struct SimbricksBaseIfParams *pcieParams) {
int MultiNicRunner::CompRunner::NicIfInit() {
volatile bool ready = false;
volatile int result = 0;
// NicIfInit will block, so run it in a separate thread and then wait for it
std::thread t([this, &ready, &shmPath, &netParams, &pcieParams, &result](){
result = Runner::NicIfInit(shmPath, netParams, pcieParams);
std::thread t([this, &ready, &result](){
result = Runner::NicIfInit();
ready = true;
});
......@@ -73,9 +70,11 @@ int MultiNicRunner::RunMain(int argc, char *argv[]) {
argv[start] = argv[0];
CompRunner *r = new CompRunner(factory_.create());
if (r->ParseArgs(end - start, argv + start))
return -1;
auto *f = new boost::fibers::fiber(
boost::bind(&CompRunner::RunMain, boost::ref(*r),
end - start, argv + start));
boost::bind(&CompRunner::RunMain, boost::ref(*r)));
runners.push_back(r);
fibers.push_back(f);
start = end;
......
......@@ -40,9 +40,7 @@ class MultiNicRunner {
class CompRunner : public Runner {
protected:
virtual void YieldPoll() override;
virtual int NicIfInit(const char *shmPath,
struct SimbricksBaseIfParams *netParams,
struct SimbricksBaseIfParams *pcieParams) override;
virtual int NicIfInit() override;
public:
explicit CompRunner(Device &dev_);
......
......@@ -485,10 +485,9 @@ void Runner::EventTrigger() {
void Runner::YieldPoll() {
}
int Runner::NicIfInit(const char *shmPath,
struct SimbricksBaseIfParams *netParams,
struct SimbricksBaseIfParams *pcieParams) {
return SimbricksNicIfInit(&nicif_, shmPath, netParams, pcieParams, &dintro_);
int Runner::NicIfInit() {
return SimbricksNicIfInit(&nicif_, shmPath_, &netParams_, &pcieParams_,
&dintro_);
}
Runner::Runner(Device &dev) : main_time_(0), dev_(dev), events_(EventCmp()) {
......@@ -508,37 +507,39 @@ Runner::Runner(Device &dev) : main_time_(0), dev_(dev), events_(EventCmp()) {
close(rfd);
mac_addr_ &= ~3ULL;
std::cerr << std::hex << mac_addr_ << std::endl;
SimbricksNetIfDefaultParams(&netParams_);
SimbricksPcieIfDefaultParams(&pcieParams_);
}
int Runner::RunMain(int argc, char *argv[]) {
uint64_t next_ts;
uint64_t max_step = 10000;
struct SimbricksBaseIfParams pcieParams;
struct SimbricksBaseIfParams netParams;
SimbricksNetIfDefaultParams(&netParams);
SimbricksPcieIfDefaultParams(&pcieParams);
if (argc < 4 || argc > 9) {
int Runner::ParseArgs(int argc, char *argv[]) {
if (argc < 4 || argc > 10) {
fprintf(stderr,
"Usage: corundum_bm PCI-SOCKET ETH-SOCKET "
"SHM [SYNC-MODE] [START-TICK] [SYNC-PERIOD] [PCI-LATENCY] "
"[ETH-LATENCY]\n");
return EXIT_FAILURE;
"[ETH-LATENCY] [MAC-ADDR]\n");
return -1;
}
if (argc >= 6)
main_time_ = strtoull(argv[5], NULL, 0);
if (argc >= 7)
netParams.sync_interval = pcieParams.sync_interval =
netParams_.sync_interval = pcieParams_.sync_interval =
strtoull(argv[6], NULL, 0) * 1000ULL;
if (argc >= 8)
pcieParams.link_latency = strtoull(argv[7], NULL, 0) * 1000ULL;
pcieParams_.link_latency = strtoull(argv[7], NULL, 0) * 1000ULL;
if (argc >= 9)
netParams.link_latency = strtoull(argv[8], NULL, 0) * 1000ULL;
netParams_.link_latency = strtoull(argv[8], NULL, 0) * 1000ULL;
if (argc >= 10)
mac_addr_ = strtoull(argv[9], NULL, 16);
pcieParams.sock_path = argv[1];
netParams.sock_path = argv[2];
pcieParams_.sock_path = argv[1];
netParams_.sock_path = argv[2];
shmPath_ = argv[3];
return 0;
}
int Runner::RunMain() {
uint64_t next_ts;
uint64_t max_step = 10000;
signal(SIGINT, sigint_handler);
signal(SIGUSR1, sigusr1_handler);
......@@ -549,12 +550,13 @@ int Runner::RunMain(int argc, char *argv[]) {
memset(&dintro_, 0, sizeof(dintro_));
dev_.SetupIntro(dintro_);
if (NicIfInit(argv[3], &netParams, &pcieParams)) {
if (NicIfInit()) {
return EXIT_FAILURE;
}
bool sync_pcie = SimbricksBaseIfSyncEnabled(&nicif_.pcie.base);
bool sync_net = SimbricksBaseIfSyncEnabled(&nicif_.net.base);
fprintf(stderr, "mac_addr=%lx\n", mac_addr_);
fprintf(stderr, "sync_pci=%d sync_eth=%d\n", sync_pcie, sync_net);
bool is_sync = sync_pcie || sync_net;
......
......@@ -127,6 +127,9 @@ class Runner {
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_;
......@@ -150,15 +153,16 @@ class Runner {
void DmaTrigger();
virtual void YieldPoll();
virtual int NicIfInit(const char *shmPath,
struct SimbricksBaseIfParams *netParams,
struct SimbricksBaseIfParams *pcieParams);
virtual int NicIfInit();
public:
explicit Runner(Device &dev_);
/** Parse command line arguments. */
int ParseArgs(int argc, char *argv[]);
/** Run the simulation */
int RunMain(int argc, char *argv[]);
int RunMain();
/* these three are for `Runner::Device`. */
void IssueDma(DMAOp &op);
......
......@@ -745,5 +745,7 @@ void Corundum::EthRx(uint8_t port, const void *data, size_t len) {
int main(int argc, char *argv[]) {
corundum::Corundum dev;
runner = new nicbm::Runner(dev);
return runner->RunMain(argc, argv);
if (runner->ParseArgs(argc, argv))
return -1;
return runner->RunMain();
}
......@@ -209,6 +209,9 @@ int main(int argc, char *argv[])
IGbE *dev = new IGbE(&params);
nicbm::Runner *runner = new nicbm::Runner(*dev);
if (runner->ParseArgs(argc, argv))
return EXIT_FAILURE;
dev->init();
return runner->RunMain(argc, argv);
return runner->RunMain();
}
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment