net: converting lwip types to bsd types
[barrelfish] / usr / tests / net_tests / nfs_throughput / nfs_cat.c
1 /**
2  * \file
3  * \brief throughput testing program
4  */
5
6 /*
7  * Copyright (c) 2007, 2008, 2009, 2010, 2011 ETH Zurich.
8  * All rights reserved.
9  *
10  * This file is distributed under the terms in the attached LICENSE file.
11  * If you do not find this file, copies can be found by writing to:
12  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
13  */
14
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <assert.h>
18 #include <string.h>
19 #include <unistd.h>
20 #include <errno.h>
21
22 // Specific for barrelfish
23 #include <barrelfish/barrelfish.h>
24 #include <vfs/vfs.h>
25 #include <lwip/init.h>
26 #include <barrelfish/nameservice_client.h>
27 #include <barrelfish/waitset.h>
28 #include <netbench/netbench.h>
29
30 #define MOUNT_DIR   "/nfs"
31
32 // reads the file over nfs
33 static int cat(char *path)
34 {
35     size_t size;
36     vfs_handle_t vh;
37     errval_t err;
38     uint64_t filesize = 0;
39
40     err = vfs_open(path, &vh);
41     if (err_is_fail(err)) {
42         printf("%s: file not found\n", path);
43         return 0;
44     }
45
46     struct vfs_fileinfo info;
47     err = vfs_stat(vh, &info);
48     if(err_is_fail(err)){
49         printf("Could not stat file %s\n", path);
50     }
51     printf("Reading %d bytes from %s.\n", (int)info.size, path);
52     void *buf = malloc(10485760);
53     assert(buf);
54
55     uint64_t start = rdtsc();
56     lwip_benchmark_control(1, BMS_START_REQUEST, 0, 0);
57
58     for (; filesize != info.size;) {
59         err = vfs_read(vh, buf, 10485760, &size);
60         if (err_is_fail(err)) {
61                 // XXX: Close any files that might be open
62                 DEBUG_ERR(err, "error reading file");
63                 return 0;
64         }
65         debug_printf("%s: %ld:%ld\n", __func__, filesize, info.size);
66         filesize += size;
67     }
68     assert(info.size == filesize);
69
70     // record stop time
71     uint64_t stop = rdtsc();
72     printf("Everything done\n");
73     lwip_print_interesting_stats();
74     double speed = ((filesize/in_seconds(stop - start))/(1024 * 1024));
75     if (speed < 50) {
76         printf("Warning: NFS throughput too low!! [%f]\n", speed);
77     }
78     printf("## Data size = %f MB,  Processing time [%"PU"], speed [%f] MB/s\n",
79            filesize/(double)(1024 * 1024), in_seconds(stop - start),
80            speed);
81
82     err = vfs_close(vh);
83     if (err_is_fail(err)) {
84             DEBUG_ERR(err, "in vfs_close");
85     }
86     free(buf);
87     return filesize;
88 }
89
90 int main(int argc, char**argv)
91 {
92     errval_t err;
93     vfs_init();
94
95     if(argc < 3) {
96         printf("Usage: %s mount-URL filepath\n", argv[0]);
97         printf("Example: %s nfs://10.110.4.41/shared  /nfs/pravin/601.avi\n",
98                 argv[0]);
99         exit(EXIT_FAILURE);
100     }
101
102 //    err = vfs_mkdir(MOUNT_DIR);
103 //    if (err_is_fail(err)) {
104 //        DEBUG_ERR(err, "vfs_mount");
105 //    }
106
107     err = vfs_mount(MOUNT_DIR, argv[1]);
108     if(err_is_fail(err)) {
109         DEBUG_ERR(err, "vfs_mount");
110     }
111     assert(err_is_ok(err));
112     printf("mount done\n");
113
114     printf("reading file 1. time [%s]\n", argv[2]);
115     cat(argv[2]);
116     printf("receive 1 done.\n");
117
118     /*
119     printf("reading file 2. time [%s]\n", argv[2]);
120         cat(argv[2]);
121         printf("receive 2 done.\n"); */
122         printf("All done.\n");
123
124     struct waitset *ws = get_default_waitset();
125     while (1) {
126         err = event_dispatch(ws);
127         if (err_is_fail(err)) {
128             DEBUG_ERR(err, "in event_dispatch");
129             break;
130         }
131     }
132
133 }