aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2009-09-17 17:32:21 -0700
committerH. Peter Anvin <hpa@zytor.com>2009-09-17 17:32:21 -0700
commitf5ec9e7d346cc8c1ff19f4c751d2adb92584418f (patch)
treecd6b69eca6d5109513ce96b2133e0d32c48f66b8
parent15f7490b3f0bf98d305a6bc221d0ca5bc2ffa3c6 (diff)
downloadlwip-f5ec9e7d346cc8c1ff19f4c751d2adb92584418f.tar.gz
lwip-f5ec9e7d346cc8c1ff19f4c751d2adb92584418f.tar.xz
lwip-f5ec9e7d346cc8c1ff19f4c751d2adb92584418f.zip
lwip: better speed test
Better speed test, to make tuning easier. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
-rw-r--r--core/fs/pxe/pxe.c123
1 files changed, 66 insertions, 57 deletions
diff --git a/core/fs/pxe/pxe.c b/core/fs/pxe/pxe.c
index e397ca11..a134480c 100644
--- a/core/fs/pxe/pxe.c
+++ b/core/fs/pxe/pxe.c
@@ -1431,8 +1431,10 @@ static void lwip_test(void)
struct netbuf *buf;
jiffies_t t0, t1;
size_t bytes, x_bytes;
+ size_t ms, kbits_per_sec;
bool found_eoh;
int found_nl;
+ int i;
/* Test the lwIP stack by trying to open a HTTP connection... */
printf("Starting lwIP test...\n");
@@ -1444,67 +1446,74 @@ static void lwip_test(void)
((uint8_t *)&ip)[3],
err);
- conn = netconn_new(NETCONN_TCP);
- printf("netconn_new returned %p\n", conn);
-
- err = netconn_connect(conn, &ip, 80);
- printf("netconn_connect error %d\n", err);
-
- header_len = snprintf(header_buf, sizeof header_buf,
- "GET /pub/linux/kernel/v2.6/linux-2.6.31.tar.gz HTTP/1.0\r\n"
- "Host: %s\r\n"
- "\r\n",
- host_str);
-
- err = netconn_write(conn, header_buf, header_len, NETCONN_NOCOPY);
- printf("netconn_write error %d\n", err);
- bytes = x_bytes = 0;
- found_nl = 0;
- found_eoh = false;
-
- t0 = jiffies();
- for (;;) {
- void *data;
- char *p;
- u16_t len;
-
- buf = netconn_recv(conn);
- if (!buf)
- break;
-
- do {
- netbuf_data(buf, &data, &len);
- p = data;
- while (__unlikely(!found_eoh && len)) {
- putchar(*p);
- switch (*p) {
- case '\r':
- break;
- case '\n':
- if (++found_nl == 2)
- found_eoh = true;
- break;
- default:
- found_nl = 0;
- break;
+ for (i = 1; i < 20; i++) {
+ conn = netconn_new(NETCONN_TCP);
+ err = netconn_connect(conn, &ip, 80);
+ if (err) {
+ printf("netconn_connect error %d\n", err);
+ continue;
+ }
+
+ header_len = snprintf(header_buf, sizeof header_buf,
+ "GET /pub/linux/kernel/v2.6/linux-2.6.31.tar.gz HTTP/1.0\r\n"
+ "Host: %s\r\n"
+ "\r\n",
+ host_str);
+
+ err = netconn_write(conn, header_buf, header_len, NETCONN_NOCOPY);
+ if (err)
+ printf("netconn_write error %d\n", err);
+ bytes = x_bytes = 0;
+ found_nl = 0;
+ found_eoh = false;
+
+ t0 = jiffies();
+ for (;;) {
+ void *data;
+ char *p;
+ u16_t len;
+
+ buf = netconn_recv(conn);
+ if (!buf)
+ break;
+
+ do {
+ netbuf_data(buf, &data, &len);
+ p = data;
+ while (__unlikely(!found_eoh && len)) {
+ switch (*p) {
+ case '\r':
+ break;
+ case '\n':
+ if (++found_nl == 2)
+ found_eoh = true;
+ break;
+ default:
+ found_nl = 0;
+ break;
+ }
+ p++;
+ len--;
}
- p++;
- len--;
- }
- bytes += len;
- if ((bytes^x_bytes) >> 20) {
- printf("%dM\r", bytes >> 20);
- x_bytes = bytes;
- }
- } while (netbuf_next(buf) >= 0);
+ bytes += len;
+ if ((bytes^x_bytes) >> 20) {
+ printf("%dM\r", bytes >> 20);
+ x_bytes = bytes;
+ }
+ } while (netbuf_next(buf) >= 0);
+
+ netbuf_delete(buf);
+ }
+ t1 = jiffies();
+ ms = (t1-t0) * MS_PER_JIFFY;
- netbuf_delete(buf);
- }
- t1 = jiffies();
+ kbits_per_sec = (bytes << 3) / ms;
- printf("Done: %zu bytes in %u ms\n", bytes, (t1-t0)*MS_PER_JIFFY);
+ printf("Done: %zu bytes in %u ms (%u.%03u Mbps)\n",
+ bytes, ms, kbits_per_sec/1000, kbits_per_sec%1000);
- netconn_disconnect(conn);
+ netconn_disconnect(conn);
+ }
for(;;)
asm volatile("hlt");