+int cmd_submit_reqs(long loops, long concurrent_reqs, int op)
+{
+ if (loops < 0)
+ return help();
+
+ struct xseg_request *submitted = NULL, *received;
+ long nr_submitted = 0, nr_received = 0, nr_failed = 0, nr_mismatch = 0, nr_flying = 0;
+ int reported = 0, r;
+ uint64_t offset;
+ uint32_t targetlen = 10, chunksize = 4096;
+ struct timeval tv1, tv2;
+ xport p;
+ char *req_data, *req_target;
+
+ xseg_bind_port(xseg, srcport, NULL);
+
+ gettimeofday(&tv1, NULL);
+ for (;;) {
+ submitted = NULL;
+ xseg_prepare_wait(xseg, srcport);
+ if (nr_submitted < loops && nr_flying < concurrent_reqs &&
+ (submitted = xseg_get_request(xseg, srcport, dstport, X_ALLOC))) {
+ xseg_cancel_wait(xseg, srcport);
+ r = xseg_prep_request(xseg, submitted, targetlen, chunksize);
+ if (r < 0) {
+ fprintf(stderr, "Cannot prepare request! (%u, %u)\n",
+ targetlen, chunksize);
+ xseg_put_request(xseg, submitted, srcport);
+ return -1;
+ }
+
+ //FIXME
+ ++nr_flying;
+ nr_submitted += 1;
+ reported = 0;
+ offset = 0;//pick(size);
+
+ submitted->offset = offset;
+ submitted->size = chunksize;
+ req_target = xseg_get_target(xseg, submitted);
+ req_data = xseg_get_data(xseg, submitted);
+
+ if (op == 0)
+ submitted->op = X_INFO;
+ else if (op == 1)
+ submitted->op = X_READ;
+ else if (op == 2) {
+ submitted->op = X_WRITE;
+ mkchunk(req_data, submitted->datalen, req_target, submitted->targetlen, submitted->offset);
+ }
+
+ p = xseg_submit(xseg, submitted, srcport, X_ALLOC);
+ if ( p != NoPort){
+ if (xseg_signal(xseg, p) < 0)
+ perror("Cannot signal peer");
+ }
+ }
+ received = xseg_receive(xseg, srcport, 0);
+ if (received) {
+ xseg_cancel_wait(xseg, srcport);
+ --nr_flying;
+ if (nr_received == 0)
+ fprintf(stderr, "latency (time for the first req to complete): %llu usecs\n",
+ (unsigned long long)received->elapsed);
+ nr_received += 1;
+ if (!(received->state & XS_SERVED)) {
+ nr_failed += 1;
+ //report_request(received);
+ }
+
+ if (xseg_put_request(xseg, received, srcport))
+ fprintf(stderr, "Cannot put request at port %u\n", received->src_portno);
+ }
+
+ if (!submitted && !received)
+ xseg_wait_signal(xseg, 10000000L);
+
+ if (nr_received >= loops)
+ break;
+ }
+ gettimeofday(&tv2, NULL);
+
+ fprintf(stderr, "submitted %ld, received %ld, failed %ld, mismatched %ld\n",
+ nr_submitted, nr_received, nr_failed, nr_mismatch);
+ long t = (tv2.tv_sec - tv1.tv_sec)*1000000 + (tv2.tv_usec - tv1.tv_usec);
+ fprintf(stderr, "elpased time: %lf secs, throughput: %lf reqs/sec\n", (double) t / 1000000.0, (double) nr_submitted / (t / 1000000.0));
+
+ return 0;
+}
+
+int cmd_report(uint32_t portno)