Commit 2f308d01 authored by Antoine Kaufmann's avatar Antoine Kaufmann
Browse files

sims/net/wire: new API refactor

parent 7f1b94ae
...@@ -36,11 +36,8 @@ ...@@ -36,11 +36,8 @@
#include <sys/mman.h> #include <sys/mman.h>
#include <unistd.h> #include <unistd.h>
#include <simbricks/netif/netif.h> #include <simbricks/network/if.h>
#include <simbricks/proto/base.h>
static uint64_t sync_period = (500 * 1000ULL); // 500ns
static uint64_t eth_latency = (500 * 1000ULL); // 500ns
static uint64_t cur_ts; static uint64_t cur_ts;
static int exiting = 0; static int exiting = 0;
static pcap_dumper_t *dumpfile = NULL; static pcap_dumper_t *dumpfile = NULL;
...@@ -54,20 +51,20 @@ static void sigusr1_handler(int dummy) { ...@@ -54,20 +51,20 @@ static void sigusr1_handler(int dummy) {
} }
static void move_pkt(struct SimbricksNetIf *from, struct SimbricksNetIf *to) { static void move_pkt(struct SimbricksNetIf *from, struct SimbricksNetIf *to) {
volatile union SimbricksProtoNetD2N *msg_from = volatile union SimbricksProtoNetMsg *msg_from =
SimbricksNetIfD2NPoll(from, cur_ts); SimbricksNetIfInPoll(from, cur_ts);
volatile union SimbricksProtoNetN2D *msg_to; volatile union SimbricksProtoNetMsg *msg_to;
volatile struct SimbricksProtoNetD2NSend *tx; volatile struct SimbricksProtoNetMsgPacket *tx;
volatile struct SimbricksProtoNetN2DRecv *rx; volatile struct SimbricksProtoNetMsgPacket *rx;
struct pcap_pkthdr ph; struct pcap_pkthdr ph;
uint8_t type; uint8_t type;
if (msg_from == NULL) if (msg_from == NULL)
return; return;
type = msg_from->dummy.own_type & SIMBRICKS_PROTO_NET_D2N_MSG_MASK; type = SimbricksNetIfInType(from, msg_from);
if (type == SIMBRICKS_PROTO_NET_D2N_MSG_SEND) { if (type == SIMBRICKS_PROTO_NET_MSG_PACKET) {
tx = &msg_from->send; tx = &msg_from->packet;
// log to pcap file if initialized // log to pcap file if initialized
if (dumpfile) { if (dumpfile) {
...@@ -79,38 +76,38 @@ static void move_pkt(struct SimbricksNetIf *from, struct SimbricksNetIf *to) { ...@@ -79,38 +76,38 @@ static void move_pkt(struct SimbricksNetIf *from, struct SimbricksNetIf *to) {
pcap_dump((unsigned char *)dumpfile, &ph, (unsigned char *)tx->data); pcap_dump((unsigned char *)dumpfile, &ph, (unsigned char *)tx->data);
} }
msg_to = SimbricksNetIfN2DAlloc(to, cur_ts, eth_latency); msg_to = SimbricksNetIfOutAlloc(to, cur_ts);
if (msg_to != NULL) { if (msg_to != NULL) {
rx = &msg_to->recv; rx = &msg_to->packet;
rx->len = tx->len; rx->len = tx->len;
rx->port = 0; rx->port = 0;
memcpy((void *)rx->data, (void *)tx->data, tx->len); memcpy((void *)rx->data, (void *)tx->data, tx->len);
// WMB(); SimbricksNetIfOutSend(to, msg_to, SIMBRICKS_PROTO_NET_MSG_PACKET);
rx->own_type =
SIMBRICKS_PROTO_NET_N2D_MSG_RECV | SIMBRICKS_PROTO_NET_N2D_OWN_DEV;
} else { } else {
fprintf(stderr, "move_pkt: dropping packet\n"); fprintf(stderr, "move_pkt: dropping packet\n");
} }
} else if (type == SIMBRICKS_PROTO_NET_D2N_MSG_SYNC) { } else if (type == SIMBRICKS_PROTO_MSG_TYPE_SYNC) {
} else { } else {
fprintf(stderr, "move_pkt: unsupported type=%u\n", type); fprintf(stderr, "move_pkt: unsupported type=%u\n", type);
abort(); abort();
} }
SimbricksNetIfD2NDone(from, msg_from); SimbricksNetIfInDone(from, msg_from);
} }
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
struct SimbricksBaseIfParams params;
struct SimbricksNetIf nsif_a, nsif_b; struct SimbricksNetIf nsif_a, nsif_b;
uint64_t ts_a, ts_b; uint64_t ts_a, ts_b;
int sync_a, sync_b; int sync_a, sync_b;
pcap_t *pc = NULL; pcap_t *pc = NULL;
int sync_mode = SIMBRICKS_PROTO_SYNC_SIMBRICKS;
SimbricksNetIfDefaultParams(&params);
if (argc < 3 || argc > 7) { if (argc < 3 || argc > 7) {
fprintf(stderr, fprintf(stderr,
"Usage: net_wire SOCKET-A SOCKET-B [SYNC-MODE] " "Usage: net_wire SOCKET-A SOCKET-B [SYNC-MODE (ignored)] "
"[SYNC-PERIOD] [ETH-LATENCY] [PCAP-FILE]\n"); "[SYNC-PERIOD] [ETH-LATENCY] [PCAP-FILE]\n");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
...@@ -119,14 +116,12 @@ int main(int argc, char *argv[]) { ...@@ -119,14 +116,12 @@ int main(int argc, char *argv[]) {
signal(SIGTERM, sigint_handler); signal(SIGTERM, sigint_handler);
signal(SIGUSR1, sigusr1_handler); signal(SIGUSR1, sigusr1_handler);
if (argc >= 4)
sync_mode = strtol(argv[3], NULL, 0);
if (argc >= 5) if (argc >= 5)
sync_period = strtoull(argv[4], NULL, 0) * 1000ULL; params.sync_interval = strtoull(argv[4], NULL, 0) * 1000ULL;
if (argc >= 6) if (argc >= 6)
eth_latency = strtoull(argv[5], NULL, 0) * 1000ULL; params.link_latency = strtoull(argv[5], NULL, 0) * 1000ULL;
if (argc >= 7) { if (argc >= 7) {
pc = pcap_open_dead_with_tstamp_precision(DLT_EN10MB, 65535, pc = pcap_open_dead_with_tstamp_precision(DLT_EN10MB, 65535,
...@@ -139,46 +134,39 @@ int main(int argc, char *argv[]) { ...@@ -139,46 +134,39 @@ int main(int argc, char *argv[]) {
dumpfile = pcap_dump_open(pc, argv[6]); dumpfile = pcap_dump_open(pc, argv[6]);
} }
assert(sync_mode == SIMBRICKS_PROTO_SYNC_SIMBRICKS ||
sync_mode == SIMBRICKS_PROTO_SYNC_BARRIER);
sync_a = sync_b = 1; sync_a = sync_b = 1;
if (SimbricksNetIfInit(&nsif_a, argv[1], &sync_a) != 0) { if (SimbricksNetIfInit(&nsif_a, &params, argv[1], &sync_a) != 0) {
return -1; return -1;
} }
if (SimbricksNetIfInit(&nsif_b, argv[2], &sync_b) != 0) { if (SimbricksNetIfInit(&nsif_b, &params, argv[2], &sync_b) != 0) {
return -1; return -1;
} }
printf("start polling\n"); printf("start polling\n");
while (!exiting) { while (!exiting) {
if (SimbricksNetIfN2DSync(&nsif_a, cur_ts, eth_latency, sync_period, if (SimbricksNetIfOutSync(&nsif_a, cur_ts) != 0) {
sync_mode) != 0) { fprintf(stderr, "SimbricksNetIfOutSync(nsif_a) failed\n");
fprintf(stderr, "SimbricksNetIfN2DSync(nsif_a) failed\n");
abort(); abort();
} }
if (SimbricksNetIfN2DSync(&nsif_b, cur_ts, eth_latency, sync_period, if (SimbricksNetIfOutSync(&nsif_b, cur_ts) != 0) {
sync_mode) != 0) { fprintf(stderr, "SimbricksNetIfN2DSync(nsif_b) failed\n");
fprintf(stderr, "SimbricksNetIfN2DSync(nsif_a) failed\n");
abort(); abort();
} }
SimbricksNetIfAdvanceEpoch(cur_ts, sync_period, sync_mode);
do { do {
move_pkt(&nsif_a, &nsif_b); move_pkt(&nsif_a, &nsif_b);
move_pkt(&nsif_b, &nsif_a); move_pkt(&nsif_b, &nsif_a);
ts_a = SimbricksNetIfD2NTimestamp(&nsif_a); ts_a = SimbricksNetIfInTimestamp(&nsif_a);
ts_b = SimbricksNetIfD2NTimestamp(&nsif_b); ts_b = SimbricksNetIfInTimestamp(&nsif_b);
} while (!exiting && } while (!exiting &&
((sync_a && ts_a <= cur_ts) || (sync_b && ts_b <= cur_ts))); ((sync_a && ts_a <= cur_ts) || (sync_b && ts_b <= cur_ts)));
if (sync_a && sync_b) if (sync_a && sync_b)
cur_ts = SimbricksNetIfAdvanceTime(ts_a <= ts_b ? ts_a : ts_b, cur_ts = ts_a <= ts_b ? ts_a : ts_b;
sync_period, sync_mode);
else if (sync_a) else if (sync_a)
cur_ts = SimbricksNetIfAdvanceTime(ts_a, sync_period, sync_mode); cur_ts = ts_a;
else if (sync_b) else if (sync_b)
cur_ts = SimbricksNetIfAdvanceTime(ts_b, sync_period, sync_mode); cur_ts = ts_b;
} }
if (dumpfile) if (dumpfile)
......
...@@ -28,7 +28,7 @@ OBJS := $(d)net_wire.o ...@@ -28,7 +28,7 @@ OBJS := $(d)net_wire.o
$(OBJS): CPPFLAGS := $(CPPFLAGS) -I$(d)include/ $(OBJS): CPPFLAGS := $(CPPFLAGS) -I$(d)include/
$(bin_net_wire): $(OBJS) $(lib_netif) -lpcap $(bin_net_wire): $(OBJS) $(lib_netif) $(lib_base) -lpcap
CLEAN := $(bin_net_wire) $(OBJS) CLEAN := $(bin_net_wire) $(OBJS)
ALL := $(bin_net_wire) ALL := $(bin_net_wire)
......
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