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