in util/netconsblaster.c [406:457]
int main(int argc, char **argv)
{
int i, nr_threads, srcaddr_per_thread;
uint64_t tmp, count, start, finish;
struct blaster_state *threadstates, *cur;
struct sigaction stopper = {
.sa_handler = stop_signal,
};
parse_arguments(argc, argv, ¶ms);
nr_threads = 1 << params.thread_order;
srcaddr_per_thread = params.srcaddr_order - params.thread_order;
if (srcaddr_per_thread <= 0)
fatal("More thread bits than srcaddr bits\n");
threadstates = calloc(nr_threads, sizeof(*threadstates));
if (!threadstates)
fatal("ENOMEM allocating state for threads\n");
sigaction(SIGINT, &stopper, NULL);
for (i = 0; i < nr_threads; i++) {
cur = &threadstates[i];
memcpy(&cur->src, ¶ms.src, sizeof(cur->src));
memcpy(&cur->dst, ¶ms.dst, sizeof(cur->dst));
cur->blastcount = params.blastcount;
cur->stopptr = ¶ms.stop_blasting;
cur->bits = srcaddr_per_thread;
cur->src.s6_addr[15] = (unsigned char)i;
cur->nr = i;
if (pthread_create(&cur->id, NULL, blaster_thread, cur))
fatal("Thread %d/%d failed: %m\n", i, nr_threads);
}
count = 0;
start = now_epoch_ms();
for (i = 0; i < nr_threads; i++) {
pthread_join(threadstates[i].id, (void**)&tmp);
count += tmp;
}
finish = now_epoch_ms();
printf("Wrote %lu packets (%lu pkts/sec)\n", count,
count / (finish - start) * 1000UL);
return 0;
}