Explorar o código

add uip

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1125 bbd45198-f89e-11dd-88c7-29a3b14d5316
itspy.wei %!s(int64=14) %!d(string=hai) anos
pai
achega
f438f02b0f
Modificáronse 100 ficheiros con 10609 adicións e 0 borrados
  1. 13 0
      components/net/uip/README
  2. 2 0
      components/net/uip/apps/README
  3. 1 0
      components/net/uip/apps/dhcpc/Makefile.dhcpc
  4. 356 0
      components/net/uip/apps/dhcpc/dhcpc.c
  5. 68 0
      components/net/uip/apps/dhcpc/dhcpc.h
  6. 1 0
      components/net/uip/apps/hello-world/Makefile.hello-world
  7. 115 0
      components/net/uip/apps/hello-world/hello-world.c
  8. 53 0
      components/net/uip/apps/hello-world/hello-world.h
  9. 1 0
      components/net/uip/apps/resolv/Makefile.resolv
  10. 464 0
      components/net/uip/apps/resolv/resolv.c
  11. 75 0
      components/net/uip/apps/resolv/resolv.h
  12. 1 0
      components/net/uip/apps/smtp/Makefile.smtp
  13. 40 0
      components/net/uip/apps/smtp/makestrings
  14. 11 0
      components/net/uip/apps/smtp/smtp-strings
  15. 70 0
      components/net/uip/apps/smtp/smtp-strings.c
  16. 46 0
      components/net/uip/apps/smtp/smtp-strings.h
  17. 262 0
      components/net/uip/apps/smtp/smtp.c
  18. 103 0
      components/net/uip/apps/smtp/smtp.h
  19. 1 0
      components/net/uip/apps/telnetd/Makefile.telnetd
  20. 350 0
      components/net/uip/apps/telnetd/telnetd.c
  21. 63 0
      components/net/uip/apps/telnetd/telnetd.h
  22. 123 0
      components/net/uip/apps/telnetd/uip_shell.c
  23. 104 0
      components/net/uip/apps/telnetd/uip_shell.h
  24. 1 0
      components/net/uip/apps/webclient/Makefile.webclient
  25. 40 0
      components/net/uip/apps/webclient/makestrings
  26. 31 0
      components/net/uip/apps/webclient/webclient-strings
  27. 93 0
      components/net/uip/apps/webclient/webclient-strings.c
  28. 31 0
      components/net/uip/apps/webclient/webclient-strings.h
  29. 439 0
      components/net/uip/apps/webclient/webclient.c
  30. 228 0
      components/net/uip/apps/webclient/webclient.h
  31. 1 0
      components/net/uip/apps/webserver/Makefile.webserver
  32. 35 0
      components/net/uip/apps/webserver/http-strings
  33. 102 0
      components/net/uip/apps/webserver/http-strings.c
  34. 34 0
      components/net/uip/apps/webserver/http-strings.h
  35. 203 0
      components/net/uip/apps/webserver/httpd-cgi.c
  36. 84 0
      components/net/uip/apps/webserver/httpd-cgi.h
  37. 132 0
      components/net/uip/apps/webserver/httpd-fs.c
  38. 57 0
      components/net/uip/apps/webserver/httpd-fs.h
  39. 8 0
      components/net/uip/apps/webserver/httpd-fs/404.html
  40. BIN=BIN
      components/net/uip/apps/webserver/httpd-fs/fade.png
  41. 35 0
      components/net/uip/apps/webserver/httpd-fs/files.shtml
  42. 2 0
      components/net/uip/apps/webserver/httpd-fs/footer.html
  43. 18 0
      components/net/uip/apps/webserver/httpd-fs/header.html
  44. 29 0
      components/net/uip/apps/webserver/httpd-fs/index.html
  45. 5 0
      components/net/uip/apps/webserver/httpd-fs/processes.shtml
  46. 31 0
      components/net/uip/apps/webserver/httpd-fs/stats.shtml
  47. 92 0
      components/net/uip/apps/webserver/httpd-fs/style.css
  48. 5 0
      components/net/uip/apps/webserver/httpd-fs/tcp.shtml
  49. 607 0
      components/net/uip/apps/webserver/httpd-fsdata.c
  50. 64 0
      components/net/uip/apps/webserver/httpd-fsdata.h
  51. 338 0
      components/net/uip/apps/webserver/httpd.c
  52. 62 0
      components/net/uip/apps/webserver/httpd.h
  53. 78 0
      components/net/uip/apps/webserver/makefsdata
  54. 40 0
      components/net/uip/apps/webserver/makestrings
  55. 49 0
      components/net/uip/apps/webserver/webserver.h
  56. 279 0
      components/net/uip/doc/Doxyfile
  57. 7 0
      components/net/uip/doc/Makefile
  58. 12 0
      components/net/uip/doc/README
  59. 62 0
      components/net/uip/doc/doxygen.sty
  60. 86 0
      components/net/uip/doc/example-mainloop-with-arp.c
  61. 62 0
      components/net/uip/doc/example-mainloop-without-arp.c
  62. 34 0
      components/net/uip/doc/examples.txt
  63. 53 0
      components/net/uip/doc/header.tex
  64. 120 0
      components/net/uip/doc/html/a00036.html
  65. 72 0
      components/net/uip/doc/html/a00037.html
  66. 282 0
      components/net/uip/doc/html/a00038.html
  67. 123 0
      components/net/uip/doc/html/a00039.html
  68. 459 0
      components/net/uip/doc/html/a00040.html
  69. 248 0
      components/net/uip/doc/html/a00041.html
  70. 106 0
      components/net/uip/doc/html/a00042.html
  71. 82 0
      components/net/uip/doc/html/a00043.html
  72. 370 0
      components/net/uip/doc/html/a00044.html
  73. 83 0
      components/net/uip/doc/html/a00045.html
  74. 484 0
      components/net/uip/doc/html/a00046.html
  75. 95 0
      components/net/uip/doc/html/a00047.html
  76. 376 0
      components/net/uip/doc/html/a00048.html
  77. 88 0
      components/net/uip/doc/html/a00049.html
  78. 177 0
      components/net/uip/doc/html/a00050.html
  79. 138 0
      components/net/uip/doc/html/a00051.html
  80. 78 0
      components/net/uip/doc/html/a00077.html
  81. 51 0
      components/net/uip/doc/html/a00078.html
  82. 45 0
      components/net/uip/doc/html/a00079.html
  83. 69 0
      components/net/uip/doc/html/a00080.html
  84. 51 0
      components/net/uip/doc/html/a00081.html
  85. 73 0
      components/net/uip/doc/html/a00082.html
  86. 45 0
      components/net/uip/doc/html/a00083.html
  87. 45 0
      components/net/uip/doc/html/a00084.html
  88. 69 0
      components/net/uip/doc/html/a00085.html
  89. 54 0
      components/net/uip/doc/html/a00086.html
  90. 52 0
      components/net/uip/doc/html/a00087.html
  91. 103 0
      components/net/uip/doc/html/a00088.html
  92. 44 0
      components/net/uip/doc/html/a00089.html
  93. 50 0
      components/net/uip/doc/html/a00090.html
  94. 84 0
      components/net/uip/doc/html/a00091.html
  95. 39 0
      components/net/uip/doc/html/a00092.html
  96. 143 0
      components/net/uip/doc/html/a00093.html
  97. 99 0
      components/net/uip/doc/html/a00094.html
  98. 64 0
      components/net/uip/doc/html/a00095.html
  99. 81 0
      components/net/uip/doc/html/a00096.html
  100. 75 0
      components/net/uip/doc/html/a00097.html

+ 13 - 0
components/net/uip/README

@@ -0,0 +1,13 @@
+uIP is a very small implementation of the TCP/IP stack that is written
+by Adam Dunkels <adam@sics.se>. More information can be obtained 
+at the uIP homepage at http://www.sics.se/~adam/uip/.
+
+This is version $Name: uip-1-0 $.
+
+The directory structure look as follows:
+
+apps/  - Example applications
+doc/   - Documentation
+lib/   - Library code used by some applications
+uip/   - uIP TCP/IP stack code
+unix/  - uIP as a user space process under FreeBSD or Linux

+ 2 - 0
components/net/uip/apps/README

@@ -0,0 +1,2 @@
+This directory contains a few example applications. They are not all
+heavily tested, however.

+ 1 - 0
components/net/uip/apps/dhcpc/Makefile.dhcpc

@@ -0,0 +1 @@
+APP_SOURCES += dhcpc.c timer.c

+ 356 - 0
components/net/uip/apps/dhcpc/dhcpc.c

@@ -0,0 +1,356 @@
+/*
+ * Copyright (c) 2005, Swedish Institute of Computer Science
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the Institute nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack
+ *
+ * @(#)$Id: dhcpc.c,v 1.2 2006/06/11 21:46:37 adam Exp $
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include "uip.h"
+#include "dhcpc.h"
+#include "timer.h"
+#include "pt.h"
+
+#define STATE_INITIAL         0
+#define STATE_SENDING         1
+#define STATE_OFFER_RECEIVED  2
+#define STATE_CONFIG_RECEIVED 3
+
+static struct dhcpc_state s;
+
+struct dhcp_msg {
+  u8_t op, htype, hlen, hops;
+  u8_t xid[4];
+  u16_t secs, flags;
+  u8_t ciaddr[4];
+  u8_t yiaddr[4];
+  u8_t siaddr[4];
+  u8_t giaddr[4];
+  u8_t chaddr[16];
+#ifndef UIP_CONF_DHCP_LIGHT
+  u8_t sname[64];
+  u8_t file[128];
+#endif
+  u8_t options[312];
+};
+
+#define BOOTP_BROADCAST 0x8000
+
+#define DHCP_REQUEST        1
+#define DHCP_REPLY          2
+#define DHCP_HTYPE_ETHERNET 1
+#define DHCP_HLEN_ETHERNET  6
+#define DHCP_MSG_LEN      236
+
+#define DHCPC_SERVER_PORT  67
+#define DHCPC_CLIENT_PORT  68
+
+#define DHCPDISCOVER  1
+#define DHCPOFFER     2
+#define DHCPREQUEST   3
+#define DHCPDECLINE   4
+#define DHCPACK       5
+#define DHCPNAK       6
+#define DHCPRELEASE   7
+
+#define DHCP_OPTION_SUBNET_MASK   1
+#define DHCP_OPTION_ROUTER        3
+#define DHCP_OPTION_DNS_SERVER    6
+#define DHCP_OPTION_REQ_IPADDR   50
+#define DHCP_OPTION_LEASE_TIME   51
+#define DHCP_OPTION_MSG_TYPE     53
+#define DHCP_OPTION_SERVER_ID    54
+#define DHCP_OPTION_REQ_LIST     55
+#define DHCP_OPTION_END         255
+
+static const u8_t xid[4] = {0xad, 0xde, 0x12, 0x23};
+static const u8_t magic_cookie[4] = {99, 130, 83, 99};
+/*---------------------------------------------------------------------------*/
+static u8_t *
+add_msg_type(u8_t *optptr, u8_t type)
+{
+  *optptr++ = DHCP_OPTION_MSG_TYPE;
+  *optptr++ = 1;
+  *optptr++ = type;
+  return optptr;
+}
+/*---------------------------------------------------------------------------*/
+static u8_t *
+add_server_id(u8_t *optptr)
+{
+  *optptr++ = DHCP_OPTION_SERVER_ID;
+  *optptr++ = 4;
+  memcpy(optptr, s.serverid, 4);
+  return optptr + 4;
+}
+/*---------------------------------------------------------------------------*/
+static u8_t *
+add_req_ipaddr(u8_t *optptr)
+{
+  *optptr++ = DHCP_OPTION_REQ_IPADDR;
+  *optptr++ = 4;
+  memcpy(optptr, s.ipaddr, 4);
+  return optptr + 4;
+}
+/*---------------------------------------------------------------------------*/
+static u8_t *
+add_req_options(u8_t *optptr)
+{
+  *optptr++ = DHCP_OPTION_REQ_LIST;
+  *optptr++ = 3;
+  *optptr++ = DHCP_OPTION_SUBNET_MASK;
+  *optptr++ = DHCP_OPTION_ROUTER;
+  *optptr++ = DHCP_OPTION_DNS_SERVER;
+  return optptr;
+}
+/*---------------------------------------------------------------------------*/
+static u8_t *
+add_end(u8_t *optptr)
+{
+  *optptr++ = DHCP_OPTION_END;
+  return optptr;
+}
+/*---------------------------------------------------------------------------*/
+static void
+create_msg(register struct dhcp_msg *m)
+{
+  m->op = DHCP_REQUEST;
+  m->htype = DHCP_HTYPE_ETHERNET;
+  m->hlen = s.mac_len;
+  m->hops = 0;
+  memcpy(m->xid, xid, sizeof(m->xid));
+  m->secs = 0;
+  m->flags = HTONS(BOOTP_BROADCAST); /*  Broadcast bit. */
+  /*  uip_ipaddr_copy(m->ciaddr, uip_hostaddr);*/
+  memcpy(m->ciaddr, uip_hostaddr, sizeof(m->ciaddr));
+  memset(m->yiaddr, 0, sizeof(m->yiaddr));
+  memset(m->siaddr, 0, sizeof(m->siaddr));
+  memset(m->giaddr, 0, sizeof(m->giaddr));
+  memcpy(m->chaddr, s.mac_addr, s.mac_len);
+  memset(&m->chaddr[s.mac_len], 0, sizeof(m->chaddr) - s.mac_len);
+#ifndef UIP_CONF_DHCP_LIGHT
+  memset(m->sname, 0, sizeof(m->sname));
+  memset(m->file, 0, sizeof(m->file));
+#endif
+
+  memcpy(m->options, magic_cookie, sizeof(magic_cookie));
+}
+/*---------------------------------------------------------------------------*/
+static void
+send_discover(void)
+{
+  u8_t *end;
+  struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata;
+
+  create_msg(m);
+
+  end = add_msg_type(&m->options[4], DHCPDISCOVER);
+  end = add_req_options(end);
+  end = add_end(end);
+
+  uip_send(uip_appdata, end - (u8_t *)uip_appdata);
+}
+/*---------------------------------------------------------------------------*/
+static void
+send_request(void)
+{
+  u8_t *end;
+  struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata;
+
+  create_msg(m);
+  
+  end = add_msg_type(&m->options[4], DHCPREQUEST);
+  end = add_server_id(end);
+  end = add_req_ipaddr(end);
+  end = add_end(end);
+  
+  uip_send(uip_appdata, end - (u8_t *)uip_appdata);
+}
+/*---------------------------------------------------------------------------*/
+static u8_t
+parse_options(u8_t *optptr, int len)
+{
+  u8_t *end = optptr + len;
+  u8_t type = 0;
+
+  while(optptr < end) {
+    switch(*optptr) {
+    case DHCP_OPTION_SUBNET_MASK:
+      memcpy(s.netmask, optptr + 2, 4);
+      break;
+    case DHCP_OPTION_ROUTER:
+      memcpy(s.default_router, optptr + 2, 4);
+      break;
+    case DHCP_OPTION_DNS_SERVER:
+      memcpy(s.dnsaddr, optptr + 2, 4);
+      break;
+    case DHCP_OPTION_MSG_TYPE:
+      type = *(optptr + 2);
+      break;
+    case DHCP_OPTION_SERVER_ID:
+      memcpy(s.serverid, optptr + 2, 4);
+      break;
+    case DHCP_OPTION_LEASE_TIME:
+      memcpy(s.lease_time, optptr + 2, 4);
+      break;
+    case DHCP_OPTION_END:
+      return type;
+    }
+
+    optptr += optptr[1] + 2;
+  }
+  return type;
+}
+/*---------------------------------------------------------------------------*/
+static u8_t
+parse_msg(void)
+{
+  struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata;
+  
+  if(m->op == DHCP_REPLY &&
+     memcmp(m->xid, xid, sizeof(xid)) == 0 &&
+     memcmp(m->chaddr, s.mac_addr, s.mac_len) == 0) {
+    memcpy(s.ipaddr, m->yiaddr, 4);
+    return parse_options(&m->options[4], uip_datalen());
+  }
+  return 0;
+}
+/*---------------------------------------------------------------------------*/
+static
+PT_THREAD(handle_dhcp(void))
+{
+  PT_BEGIN(&s.pt);
+  
+  /* try_again:*/
+  s.state = STATE_SENDING;
+  s.ticks = CLOCK_SECOND;
+
+  do {
+    send_discover();
+    timer_set(&s.timer, s.ticks);
+    PT_WAIT_UNTIL(&s.pt, uip_newdata() || timer_expired(&s.timer));
+
+    if(uip_newdata() && parse_msg() == DHCPOFFER) {
+      s.state = STATE_OFFER_RECEIVED;
+      break;
+    }
+
+    if(s.ticks < CLOCK_SECOND * 60) {
+      s.ticks *= 2;
+    }
+  } while(s.state != STATE_OFFER_RECEIVED);
+  
+  s.ticks = CLOCK_SECOND;
+
+  do {
+    send_request();
+    timer_set(&s.timer, s.ticks);
+    PT_WAIT_UNTIL(&s.pt, uip_newdata() || timer_expired(&s.timer));
+
+    if(uip_newdata() && parse_msg() == DHCPACK) {
+      s.state = STATE_CONFIG_RECEIVED;
+      break;
+    }
+
+    if(s.ticks <= CLOCK_SECOND * 10) {
+      s.ticks += CLOCK_SECOND;
+    } else {
+      PT_RESTART(&s.pt);
+    }
+  } while(s.state != STATE_CONFIG_RECEIVED);
+  
+#if 0
+  printf("Got IP address %d.%d.%d.%d\n",
+	 uip_ipaddr1(s.ipaddr), uip_ipaddr2(s.ipaddr),
+	 uip_ipaddr3(s.ipaddr), uip_ipaddr4(s.ipaddr));
+  printf("Got netmask %d.%d.%d.%d\n",
+	 uip_ipaddr1(s.netmask), uip_ipaddr2(s.netmask),
+	 uip_ipaddr3(s.netmask), uip_ipaddr4(s.netmask));
+  printf("Got DNS server %d.%d.%d.%d\n",
+	 uip_ipaddr1(s.dnsaddr), uip_ipaddr2(s.dnsaddr),
+	 uip_ipaddr3(s.dnsaddr), uip_ipaddr4(s.dnsaddr));
+  printf("Got default router %d.%d.%d.%d\n",
+	 uip_ipaddr1(s.default_router), uip_ipaddr2(s.default_router),
+	 uip_ipaddr3(s.default_router), uip_ipaddr4(s.default_router));
+  printf("Lease expires in %ld seconds\n",
+	 ntohs(s.lease_time[0])*65536ul + ntohs(s.lease_time[1]));
+#endif
+
+  dhcpc_configured(&s);
+  
+  /*  timer_stop(&s.timer);*/
+
+  /*
+   * PT_END restarts the thread so we do this instead. Eventually we
+   * should reacquire expired leases here.
+   */
+  while(1) {
+    PT_YIELD(&s.pt);
+  }
+
+  PT_END(&s.pt);
+}
+/*---------------------------------------------------------------------------*/
+void
+dhcpc_init(const void *mac_addr, int mac_len)
+{
+  uip_ipaddr_t addr;
+  
+  s.mac_addr = mac_addr;
+  s.mac_len  = mac_len;
+
+  s.state = STATE_INITIAL;
+  uip_ipaddr(addr, 255,255,255,255);
+  s.conn = uip_udp_new(&addr, HTONS(DHCPC_SERVER_PORT));
+  if(s.conn != NULL) {
+    uip_udp_bind(s.conn, HTONS(DHCPC_CLIENT_PORT));
+  }
+  PT_INIT(&s.pt);
+}
+/*---------------------------------------------------------------------------*/
+void
+dhcpc_appcall(void)
+{
+  handle_dhcp();
+}
+/*---------------------------------------------------------------------------*/
+void
+dhcpc_request(void)
+{
+  u16_t ipaddr[2];
+  
+  if(s.state == STATE_INITIAL) {
+    uip_ipaddr(ipaddr, 0,0,0,0);
+    uip_sethostaddr(ipaddr);
+    /*    handle_dhcp(PROCESS_EVENT_NONE, NULL);*/
+  }
+}
+/*---------------------------------------------------------------------------*/

+ 68 - 0
components/net/uip/apps/dhcpc/dhcpc.h

@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2005, Swedish Institute of Computer Science
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the Institute nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack
+ *
+ * @(#)$Id: dhcpc.h,v 1.3 2006/06/11 21:46:37 adam Exp $
+ */
+#ifndef __DHCPC_H__
+#define __DHCPC_H__
+
+#include "timer.h"
+#include "pt.h"
+
+struct dhcpc_state {
+  struct pt pt;
+  char state;
+  struct uip_udp_conn *conn;
+  struct timer timer;
+  u16_t ticks;
+  const void *mac_addr;
+  int mac_len;
+  
+  u8_t serverid[4];
+
+  u16_t lease_time[2];
+  u16_t ipaddr[2];
+  u16_t netmask[2];
+  u16_t dnsaddr[2];
+  u16_t default_router[2];
+};
+
+void dhcpc_init(const void *mac_addr, int mac_len);
+void dhcpc_request(void);
+
+void dhcpc_appcall(void);
+
+void dhcpc_configured(const struct dhcpc_state *s);
+
+typedef struct dhcpc_state uip_udp_appstate_t;
+#define UIP_UDP_APPCALL dhcpc_appcall
+
+
+#endif /* __DHCPC_H__ */

+ 1 - 0
components/net/uip/apps/hello-world/Makefile.hello-world

@@ -0,0 +1 @@
+APP_SOURCES += hello-world.c

+ 115 - 0
components/net/uip/apps/hello-world/hello-world.c

@@ -0,0 +1,115 @@
+/**
+ * \addtogroup helloworld
+ * @{
+ */
+
+/**
+ * \file
+ *         An example of how to write uIP applications
+ *         with protosockets.
+ * \author
+ *         Adam Dunkels <adam@sics.se>
+ */
+
+/*
+ * This is a short example of how to write uIP applications using
+ * protosockets.
+ */
+
+/*
+ * We define the application state (struct hello_world_state) in the
+ * hello-world.h file, so we need to include it here. We also include
+ * uip.h (since this cannot be included in hello-world.h) and
+ * <string.h>, since we use the memcpy() function in the code.
+ */
+#include "hello-world.h"
+#include "uip.h"
+#include <string.h>
+
+/*
+ * Declaration of the protosocket function that handles the connection
+ * (defined at the end of the code).
+ */
+static int handle_connection(struct hello_world_state *s);
+static int rt_show_info(struct hello_world_state *s);
+/*---------------------------------------------------------------------------*/
+/*
+ * The initialization function. We must explicitly call this function
+ * from the system initialization code, some time after uip_init() is
+ * called.
+ */
+void
+hello_world_init(void)
+{
+  /* We start to listen for connections on TCP port 1000. */
+  uip_listen(HTONS(1000));
+}
+/*---------------------------------------------------------------------------*/
+/*
+ * In hello-world.h we have defined the UIP_APPCALL macro to
+ * hello_world_appcall so that this funcion is uIP's application
+ * function. This function is called whenever an uIP event occurs
+ * (e.g. when a new connection is established, new data arrives, sent
+ * data is acknowledged, data needs to be retransmitted, etc.).
+ */
+void
+hello_world_appcall(void)
+{
+  /*
+   * The uip_conn structure has a field called "appstate" that holds
+   * the application state of the connection. We make a pointer to
+   * this to access it easier.
+   */
+  struct hello_world_state *s = &(uip_conn->appstate);
+
+  /*
+   * If a new connection was just established, we should initialize
+   * the protosocket in our applications' state structure.
+   */
+  if(uip_connected()) {
+    PSOCK_INIT(&s->p, s->inputbuffer, sizeof(s->inputbuffer));
+    rt_show_info(s);
+  }
+
+  /*
+   * Finally, we run the protosocket function that actually handles
+   * the communication. We pass it a pointer to the application state
+   * of the current connection.
+   */
+  handle_connection(s);
+}
+/*---------------------------------------------------------------------------*/
+/*
+ * This is the protosocket function that handles the communication. A
+ * protosocket function must always return an int, but must never
+ * explicitly return - all return statements are hidden in the PSOCK
+ * macros.
+ */
+static int rt_show_info(struct hello_world_state *s)
+{
+  PSOCK_BEGIN(&s->p);
+  PSOCK_SEND_STR(&s->p,"RT-Thread RTOS");
+  PSOCK_READTO(&s->p, '\n');
+  PSOCK_END(&s->p);
+  
+}
+static int
+handle_connection(struct hello_world_state *s)
+{
+  int i;
+  for (i=0;i<BUF_SIZE;i++) 
+  {
+      s->name[i] = 0;
+      s->inputbuffer[i] = 0;
+  }
+  PSOCK_BEGIN(&s->p);
+  //PSOCK_SEND_STR(&s->p, "Hello. What is your name?\n");
+  PSOCK_READTO(&s->p, '\n');
+  strncpy(s->name, s->inputbuffer, sizeof(s->name));
+  //PSOCK_SEND_STR(&s->p, "Hello ");
+  PSOCK_SEND_STR(&s->p, s->name);
+  //PSOCK_CLOSE(&s->p);
+  
+  PSOCK_END(&s->p);
+}
+/*---------------------------------------------------------------------------*/

+ 53 - 0
components/net/uip/apps/hello-world/hello-world.h

@@ -0,0 +1,53 @@
+/**
+ * \addtogroup apps
+ * @{
+ */
+
+/**
+ * \defgroup helloworld Hello, world
+ * @{
+ *
+ * A small example showing how to write applications with
+ * \ref psock "protosockets".
+ */
+
+/**
+ * \file
+ *         Header file for an example of how to write uIP applications
+ *         with protosockets.
+ * \author
+ *         Adam Dunkels <adam@sics.se>
+ */
+
+#ifndef __HELLO_WORLD_H__
+#define __HELLO_WORLD_H__
+
+/* Since this file will be included by uip.h, we cannot include uip.h
+   here. But we might need to include uipopt.h if we need the u8_t and
+   u16_t datatypes. */
+#include "uipopt.h"
+
+#include "psock.h"
+
+/* Next, we define the uip_tcp_appstate_t datatype. This is the state
+   of our application, and the memory required for this state is
+   allocated together with each TCP connection. One application state
+   for each TCP connection. */
+#define BUF_SIZE 200
+typedef struct hello_world_state {
+  struct psock p;
+  char inputbuffer[BUF_SIZE];
+  char name[BUF_SIZE];
+} uip_tcp_appstate_t;
+
+/* Finally we define the application function to be called by uIP. */
+void hello_world_appcall(void);
+#ifndef UIP_APPCALL
+#define UIP_APPCALL hello_world_appcall
+#endif /* UIP_APPCALL */
+
+void hello_world_init(void);
+
+#endif /* __HELLO_WORLD_H__ */
+/** @} */
+/** @} */

+ 1 - 0
components/net/uip/apps/resolv/Makefile.resolv

@@ -0,0 +1 @@
+APP_SOURCES += resolv.c

+ 464 - 0
components/net/uip/apps/resolv/resolv.c

@@ -0,0 +1,464 @@
+/**
+ * \addtogroup apps
+ * @{
+ */
+
+/**
+ * \defgroup resolv DNS resolver
+ * @{
+ *
+ * The uIP DNS resolver functions are used to lookup a hostname and
+ * map it to a numerical IP address. It maintains a list of resolved
+ * hostnames that can be queried with the resolv_lookup()
+ * function. New hostnames can be resolved using the resolv_query()
+ * function.
+ *
+ * When a hostname has been resolved (or found to be non-existant),
+ * the resolver code calls a callback function called resolv_found()
+ * that must be implemented by the module that uses the resolver.
+ */
+
+/**
+ * \file
+ * DNS host name to IP address resolver.
+ * \author Adam Dunkels <adam@dunkels.com>
+ *
+ * This file implements a DNS host name to IP address resolver.
+ */
+
+/*
+ * Copyright (c) 2002-2003, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack.
+ *
+ * $Id: resolv.c,v 1.5 2006/06/11 21:46:37 adam Exp $
+ *
+ */
+
+#include "resolv.h"
+#include "uip.h"
+
+#include <string.h>
+
+#ifndef NULL
+#define NULL (void *)0
+#endif /* NULL */
+
+/** \internal The maximum number of retries when asking for a name. */
+#define MAX_RETRIES 8
+
+/** \internal The DNS message header. */
+struct dns_hdr {
+  u16_t id;
+  u8_t flags1, flags2;
+#define DNS_FLAG1_RESPONSE        0x80
+#define DNS_FLAG1_OPCODE_STATUS   0x10
+#define DNS_FLAG1_OPCODE_INVERSE  0x08
+#define DNS_FLAG1_OPCODE_STANDARD 0x00
+#define DNS_FLAG1_AUTHORATIVE     0x04
+#define DNS_FLAG1_TRUNC           0x02
+#define DNS_FLAG1_RD              0x01
+#define DNS_FLAG2_RA              0x80
+#define DNS_FLAG2_ERR_MASK        0x0f
+#define DNS_FLAG2_ERR_NONE        0x00
+#define DNS_FLAG2_ERR_NAME        0x03
+  u16_t numquestions;
+  u16_t numanswers;
+  u16_t numauthrr;
+  u16_t numextrarr;
+};
+
+/** \internal The DNS answer message structure. */
+struct dns_answer {
+  /* DNS answer record starts with either a domain name or a pointer
+     to a name already present somewhere in the packet. */
+  u16_t type;
+  u16_t class;
+  u16_t ttl[2];
+  u16_t len;
+  uip_ipaddr_t ipaddr;
+};
+
+struct namemap {
+#define STATE_UNUSED 0
+#define STATE_NEW    1
+#define STATE_ASKING 2
+#define STATE_DONE   3
+#define STATE_ERROR  4
+  u8_t state;
+  u8_t tmr;
+  u8_t retries;
+  u8_t seqno;
+  u8_t err;
+  char name[32];
+  uip_ipaddr_t ipaddr;
+};
+
+#ifndef UIP_CONF_RESOLV_ENTRIES
+#define RESOLV_ENTRIES 4
+#else /* UIP_CONF_RESOLV_ENTRIES */
+#define RESOLV_ENTRIES UIP_CONF_RESOLV_ENTRIES
+#endif /* UIP_CONF_RESOLV_ENTRIES */
+
+
+static struct namemap names[RESOLV_ENTRIES];
+
+static u8_t seqno;
+
+static struct uip_udp_conn *resolv_conn = NULL;
+
+
+/*---------------------------------------------------------------------------*/
+/** \internal
+ * Walk through a compact encoded DNS name and return the end of it.
+ *
+ * \return The end of the name.
+ */
+/*---------------------------------------------------------------------------*/
+static unsigned char *
+parse_name(unsigned char *query)
+{
+  unsigned char n;
+
+  do {
+    n = *query++;
+    
+    while(n > 0) {
+      /*      printf("%c", *query);*/
+      ++query;
+      --n;
+    };
+    /*    printf(".");*/
+  } while(*query != 0);
+  /*  printf("\n");*/
+  return query + 1;
+}
+/*---------------------------------------------------------------------------*/
+/** \internal
+ * Runs through the list of names to see if there are any that have
+ * not yet been queried and, if so, sends out a query.
+ */
+/*---------------------------------------------------------------------------*/
+static void
+check_entries(void)
+{
+  register struct dns_hdr *hdr;
+  char *query, *nptr, *nameptr;
+  static u8_t i;
+  static u8_t n;
+  register struct namemap *namemapptr;
+  
+  for(i = 0; i < RESOLV_ENTRIES; ++i) {
+    namemapptr = &names[i];
+    if(namemapptr->state == STATE_NEW ||
+       namemapptr->state == STATE_ASKING) {
+      if(namemapptr->state == STATE_ASKING) {
+	if(--namemapptr->tmr == 0) {
+	  if(++namemapptr->retries == MAX_RETRIES) {
+	    namemapptr->state = STATE_ERROR;
+	    resolv_found(namemapptr->name, NULL);
+	    continue;
+	  }
+	  namemapptr->tmr = namemapptr->retries;
+	} else {
+	  /*	  printf("Timer %d\n", namemapptr->tmr);*/
+	  /* Its timer has not run out, so we move on to next
+	     entry. */
+	  continue;
+	}
+      } else {
+	namemapptr->state = STATE_ASKING;
+	namemapptr->tmr = 1;
+	namemapptr->retries = 0;
+      }
+      hdr = (struct dns_hdr *)uip_appdata;
+      memset(hdr, 0, sizeof(struct dns_hdr));
+      hdr->id = htons(i);
+      hdr->flags1 = DNS_FLAG1_RD;
+      hdr->numquestions = HTONS(1);
+      query = (char *)uip_appdata + 12;
+      nameptr = namemapptr->name;
+      --nameptr;
+      /* Convert hostname into suitable query format. */
+      do {
+	++nameptr;
+	nptr = query;
+	++query;
+	for(n = 0; *nameptr != '.' && *nameptr != 0; ++nameptr) {
+	  *query = *nameptr;
+	  ++query;
+	  ++n;
+	}
+	*nptr = n;
+      } while(*nameptr != 0);
+      {
+	static unsigned char endquery[] =
+	  {0,0,1,0,1};
+	memcpy(query, endquery, 5);
+      }
+      uip_udp_send((unsigned char)(query + 5 - (char *)uip_appdata));
+      break;
+    }
+  }
+}
+/*---------------------------------------------------------------------------*/
+/** \internal
+ * Called when new UDP data arrives.
+ */
+/*---------------------------------------------------------------------------*/
+static void
+newdata(void)
+{
+  char *nameptr;
+  struct dns_answer *ans;
+  struct dns_hdr *hdr;
+  static u8_t nquestions, nanswers;
+  static u8_t i;
+  register struct namemap *namemapptr;
+  
+  hdr = (struct dns_hdr *)uip_appdata;
+  /*  printf("ID %d\n", htons(hdr->id));
+      printf("Query %d\n", hdr->flags1 & DNS_FLAG1_RESPONSE);
+      printf("Error %d\n", hdr->flags2 & DNS_FLAG2_ERR_MASK);
+      printf("Num questions %d, answers %d, authrr %d, extrarr %d\n",
+      htons(hdr->numquestions),
+      htons(hdr->numanswers),
+      htons(hdr->numauthrr),
+      htons(hdr->numextrarr));
+  */
+
+  /* The ID in the DNS header should be our entry into the name
+     table. */
+  i = htons(hdr->id);
+  namemapptr = &names[i];
+  if(i < RESOLV_ENTRIES &&
+     namemapptr->state == STATE_ASKING) {
+
+    /* This entry is now finished. */
+    namemapptr->state = STATE_DONE;
+    namemapptr->err = hdr->flags2 & DNS_FLAG2_ERR_MASK;
+
+    /* Check for error. If so, call callback to inform. */
+    if(namemapptr->err != 0) {
+      namemapptr->state = STATE_ERROR;
+      resolv_found(namemapptr->name, NULL);
+      return;
+    }
+
+    /* We only care about the question(s) and the answers. The authrr
+       and the extrarr are simply discarded. */
+    nquestions = htons(hdr->numquestions);
+    nanswers = htons(hdr->numanswers);
+
+    /* Skip the name in the question. XXX: This should really be
+       checked agains the name in the question, to be sure that they
+       match. */
+    nameptr = parse_name((char *)uip_appdata + 12) + 4;
+
+    while(nanswers > 0) {
+      /* The first byte in the answer resource record determines if it
+	 is a compressed record or a normal one. */
+      if(*nameptr & 0xc0) {
+	/* Compressed name. */
+	nameptr +=2;
+	/*	printf("Compressed anwser\n");*/
+      } else {
+	/* Not compressed name. */
+	nameptr = parse_name((char *)nameptr);
+      }
+
+      ans = (struct dns_answer *)nameptr;
+      /*      printf("Answer: type %x, class %x, ttl %x, length %x\n",
+	     htons(ans->type), htons(ans->class), (htons(ans->ttl[0])
+	     << 16) | htons(ans->ttl[1]), htons(ans->len));*/
+
+      /* Check for IP address type and Internet class. Others are
+	 discarded. */
+      if(ans->type == HTONS(1) &&
+	 ans->class == HTONS(1) &&
+	 ans->len == HTONS(4)) {
+	/*	printf("IP address %d.%d.%d.%d\n",
+	       htons(ans->ipaddr[0]) >> 8,
+	       htons(ans->ipaddr[0]) & 0xff,
+	       htons(ans->ipaddr[1]) >> 8,
+	       htons(ans->ipaddr[1]) & 0xff);*/
+	/* XXX: we should really check that this IP address is the one
+	   we want. */
+	namemapptr->ipaddr[0] = ans->ipaddr[0];
+	namemapptr->ipaddr[1] = ans->ipaddr[1];
+	
+	resolv_found(namemapptr->name, namemapptr->ipaddr);
+	return;
+      } else {
+	nameptr = nameptr + 10 + htons(ans->len);
+      }
+      --nanswers;
+    }
+  }
+
+}
+/*---------------------------------------------------------------------------*/
+/** \internal
+ * The main UDP function.
+ */
+/*---------------------------------------------------------------------------*/
+void
+resolv_appcall(void)
+{
+  if(uip_udp_conn->rport == HTONS(53)) {
+    if(uip_poll()) {
+      check_entries();
+    }
+    if(uip_newdata()) {
+      newdata();
+    }
+  }
+}
+/*---------------------------------------------------------------------------*/
+/**
+ * Queues a name so that a question for the name will be sent out.
+ *
+ * \param name The hostname that is to be queried.
+ */
+/*---------------------------------------------------------------------------*/
+void
+resolv_query(char *name)
+{
+  static u8_t i;
+  static u8_t lseq, lseqi;
+  register struct namemap *nameptr;
+      
+  lseq = lseqi = 0;
+  
+  for(i = 0; i < RESOLV_ENTRIES; ++i) {
+    nameptr = &names[i];
+    if(nameptr->state == STATE_UNUSED) {
+      break;
+    }
+    if(seqno - nameptr->seqno > lseq) {
+      lseq = seqno - nameptr->seqno;
+      lseqi = i;
+    }
+  }
+
+  if(i == RESOLV_ENTRIES) {
+    i = lseqi;
+    nameptr = &names[i];
+  }
+
+  /*  printf("Using entry %d\n", i);*/
+
+  strcpy(nameptr->name, name);
+  nameptr->state = STATE_NEW;
+  nameptr->seqno = seqno;
+  ++seqno;
+}
+/*---------------------------------------------------------------------------*/
+/**
+ * Look up a hostname in the array of known hostnames.
+ *
+ * \note This function only looks in the internal array of known
+ * hostnames, it does not send out a query for the hostname if none
+ * was found. The function resolv_query() can be used to send a query
+ * for a hostname.
+ *
+ * \return A pointer to a 4-byte representation of the hostname's IP
+ * address, or NULL if the hostname was not found in the array of
+ * hostnames.
+ */
+/*---------------------------------------------------------------------------*/
+u16_t *
+resolv_lookup(char *name)
+{
+  static u8_t i;
+  struct namemap *nameptr;
+  
+  /* Walk through the list to see if the name is in there. If it is
+     not, we return NULL. */
+  for(i = 0; i < RESOLV_ENTRIES; ++i) {
+    nameptr = &names[i];
+    if(nameptr->state == STATE_DONE &&
+       strcmp(name, nameptr->name) == 0) {
+      return nameptr->ipaddr;
+    }
+  }
+  return NULL;
+}
+/*---------------------------------------------------------------------------*/
+/**
+ * Obtain the currently configured DNS server.
+ *
+ * \return A pointer to a 4-byte representation of the IP address of
+ * the currently configured DNS server or NULL if no DNS server has
+ * been configured.
+ */
+/*---------------------------------------------------------------------------*/
+u16_t *
+resolv_getserver(void)
+{
+  if(resolv_conn == NULL) {
+    return NULL;
+  }
+  return resolv_conn->ripaddr;
+}
+/*---------------------------------------------------------------------------*/
+/**
+ * Configure which DNS server to use for queries.
+ *
+ * \param dnsserver A pointer to a 4-byte representation of the IP
+ * address of the DNS server to be configured.
+ */
+/*---------------------------------------------------------------------------*/
+void
+resolv_conf(u16_t *dnsserver)
+{
+  if(resolv_conn != NULL) {
+    uip_udp_remove(resolv_conn);
+  }
+  
+  resolv_conn = uip_udp_new(dnsserver, HTONS(53));
+}
+/*---------------------------------------------------------------------------*/
+/**
+ * Initalize the resolver.
+ */
+/*---------------------------------------------------------------------------*/
+void
+resolv_init(void)
+{
+  static u8_t i;
+  
+  for(i = 0; i < RESOLV_ENTRIES; ++i) {
+    names[i].state = STATE_DONE;
+  }
+
+}
+/*---------------------------------------------------------------------------*/
+
+/** @} */
+/** @} */

+ 75 - 0
components/net/uip/apps/resolv/resolv.h

@@ -0,0 +1,75 @@
+/**
+ * \addtogroup resolv
+ * @{
+ */
+/**
+ * \file
+ * DNS resolver code header file.
+ * \author Adam Dunkels <adam@dunkels.com>
+ */
+
+/*
+ * Copyright (c) 2002-2003, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack.
+ *
+ * $Id: resolv.h,v 1.4 2006/06/11 21:46:37 adam Exp $
+ *
+ */
+#ifndef __RESOLV_H__
+#define __RESOLV_H__
+
+typedef int uip_udp_appstate_t;
+void resolv_appcall(void);
+#define UIP_UDP_APPCALL resolv_appcall
+
+#include "uipopt.h"
+
+/**
+ * Callback function which is called when a hostname is found.
+ *
+ * This function must be implemented by the module that uses the DNS
+ * resolver. It is called when a hostname is found, or when a hostname
+ * was not found.
+ *
+ * \param name A pointer to the name that was looked up.  \param
+ * ipaddr A pointer to a 4-byte array containing the IP address of the
+ * hostname, or NULL if the hostname could not be found.
+ */
+void resolv_found(char *name, u16_t *ipaddr);
+
+/* Functions. */
+void resolv_conf(u16_t *dnsserver);
+u16_t *resolv_getserver(void);
+void resolv_init(void);
+u16_t *resolv_lookup(char *name);
+void resolv_query(char *name);
+
+#endif /* __RESOLV_H__ */
+
+/** @} */

+ 1 - 0
components/net/uip/apps/smtp/Makefile.smtp

@@ -0,0 +1 @@
+APP_SOURCES += smtp.c smtp-strings.c memb.c

+ 40 - 0
components/net/uip/apps/smtp/makestrings

@@ -0,0 +1,40 @@
+#!/usr/bin/perl
+
+
+sub stringify {
+  my $name = shift(@_);
+  open(OUTPUTC, "> $name.c");
+  open(OUTPUTH, "> $name.h");
+  
+  open(FILE, "$name");
+  
+  while(<FILE>) {
+    if(/(.+) "(.+)"/) {
+      $var = $1;
+      $data = $2;
+      
+      $datan = $data;
+      $datan =~ s/\\r/\r/g;
+      $datan =~ s/\\n/\n/g;
+      $datan =~ s/\\01/\01/g;      
+      $datan =~ s/\\0/\0/g;
+      
+      printf(OUTPUTC "const char $var\[%d] = \n", length($datan) + 1);
+      printf(OUTPUTC "/* \"$data\" */\n");
+      printf(OUTPUTC "{");
+      for($j = 0; $j < length($datan); $j++) {
+	printf(OUTPUTC "%#02x, ", unpack("C", substr($datan, $j, 1)));
+      }
+      printf(OUTPUTC "};\n");
+      
+      printf(OUTPUTH "extern const char $var\[%d];\n", length($datan) + 1);
+      
+    }
+  }
+  close(OUTPUTC);
+  close(OUTPUTH);
+}
+stringify("smtp-strings");
+
+exit 0;
+

+ 11 - 0
components/net/uip/apps/smtp/smtp-strings

@@ -0,0 +1,11 @@
+smtp_220 "220"
+smtp_helo "HELO "
+smtp_mail_from "MAIL FROM: "
+smtp_rcpt_to "RCPT TO: "
+smtp_data "DATA\r\n"
+smtp_to "To: "
+smtp_from "From: "
+smtp_subject "Subject: "
+smtp_quit "QUIT\r\n"
+smtp_crnl "\r\n"
+smtp_crnlperiodcrnl "\r\n.\r\n"

+ 70 - 0
components/net/uip/apps/smtp/smtp-strings.c

@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2004, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the Institute nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack
+ *
+ * Author: Adam Dunkels <adam@sics.se>
+ *
+ * $Id: smtp-strings.c,v 1.3 2006/06/11 21:46:37 adam Exp $
+ */
+const char smtp_220[4] =
+/* "220" */
+{0x32, 0x32, 0x30, };
+const char smtp_helo[6] =
+/* "HELO " */
+{0x48, 0x45, 0x4c, 0x4f, 0x20, };
+const char smtp_mail_from[12] =
+/* "MAIL FROM: " */
+{0x4d, 0x41, 0x49, 0x4c, 0x20, 0x46, 0x52, 0x4f, 0x4d, 0x3a, 0x20, };
+const char smtp_rcpt_to[10] =
+/* "RCPT TO: " */
+{0x52, 0x43, 0x50, 0x54, 0x20, 0x54, 0x4f, 0x3a, 0x20, };
+const char smtp_data[7] =
+/* "DATA\r\n" */
+{0x44, 0x41, 0x54, 0x41, 0xd, 0xa, };
+const char smtp_to[5] =
+/* "To: " */
+{0x54, 0x6f, 0x3a, 0x20, };
+const char smtp_cc[5] =
+/* "Cc: " */
+{0x43, 0x63, 0x3a, 0x20, };
+const char smtp_from[7] =
+/* "From: " */
+{0x46, 0x72, 0x6f, 0x6d, 0x3a, 0x20, };
+const char smtp_subject[10] =
+/* "Subject: " */
+{0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3a, 0x20, };
+const char smtp_quit[7] =
+/* "QUIT\r\n" */
+{0x51, 0x55, 0x49, 0x54, 0xd, 0xa, };
+const char smtp_crnl[3] =
+/* "\r\n" */
+{0xd, 0xa, };
+const char smtp_crnlperiodcrnl[6] =
+/* "\r\n.\r\n" */
+{0xd, 0xa, 0x2e, 0xd, 0xa, };

+ 46 - 0
components/net/uip/apps/smtp/smtp-strings.h

@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2004, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the Institute nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack
+ *
+ * Author: Adam Dunkels <adam@sics.se>
+ *
+ * $Id: smtp-strings.h,v 1.3 2006/06/11 21:46:37 adam Exp $
+ */
+extern const char smtp_220[4];
+extern const char smtp_helo[6];
+extern const char smtp_mail_from[12];
+extern const char smtp_rcpt_to[10];
+extern const char smtp_data[7];
+extern const char smtp_to[5];
+extern const char smtp_cc[5];
+extern const char smtp_from[7];
+extern const char smtp_subject[10];
+extern const char smtp_quit[7];
+extern const char smtp_crnl[3];
+extern const char smtp_crnlperiodcrnl[6];

+ 262 - 0
components/net/uip/apps/smtp/smtp.c

@@ -0,0 +1,262 @@
+/**
+ * \addtogroup apps
+ * @{
+ */
+
+/**
+ * \defgroup smtp SMTP E-mail sender
+ * @{
+ *
+ * The Simple Mail Transfer Protocol (SMTP) as defined by RFC821 is
+ * the standard way of sending and transfering e-mail on the
+ * Internet. This simple example implementation is intended as an
+ * example of how to implement protocols in uIP, and is able to send
+ * out e-mail but has not been extensively tested.
+ */
+
+/**
+ * \file
+ * SMTP example implementation
+ * \author Adam Dunkels <adam@dunkels.com>
+ */
+
+/*
+ * Copyright (c) 2004, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the Institute nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack.
+ *
+ * Author: Adam Dunkels <adam@sics.se>
+ *
+ * $Id: smtp.c,v 1.4 2006/06/11 21:46:37 adam Exp $
+ */
+#include "smtp.h"
+
+#include "smtp-strings.h"
+#include "psock.h"
+#include "uip.h"
+
+#include <string.h>
+
+static struct smtp_state s;
+
+static char *localhostname;
+static uip_ipaddr_t smtpserver;
+
+#define ISO_nl 0x0a
+#define ISO_cr 0x0d
+
+#define ISO_period 0x2e
+
+#define ISO_2  0x32
+#define ISO_3  0x33
+#define ISO_4  0x34
+#define ISO_5  0x35
+
+
+/*---------------------------------------------------------------------------*/
+static
+PT_THREAD(smtp_thread(void))
+{
+  PSOCK_BEGIN(&s.psock);
+
+  PSOCK_READTO(&s.psock, ISO_nl);
+   
+  if(strncmp(s.inputbuffer, smtp_220, 3) != 0) {
+    PSOCK_CLOSE(&s.psock);
+    smtp_done(2);
+    PSOCK_EXIT(&s.psock);
+  }
+  
+  PSOCK_SEND_STR(&s.psock, (char *)smtp_helo);
+  PSOCK_SEND_STR(&s.psock, localhostname);
+  PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+
+  PSOCK_READTO(&s.psock, ISO_nl);
+  
+  if(s.inputbuffer[0] != ISO_2) {
+    PSOCK_CLOSE(&s.psock);
+    smtp_done(3);
+    PSOCK_EXIT(&s.psock);
+  }
+
+  PSOCK_SEND_STR(&s.psock, (char *)smtp_mail_from);
+  PSOCK_SEND_STR(&s.psock, s.from);
+  PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+
+  PSOCK_READTO(&s.psock, ISO_nl);
+  
+  if(s.inputbuffer[0] != ISO_2) {
+    PSOCK_CLOSE(&s.psock);
+    smtp_done(4);
+    PSOCK_EXIT(&s.psock);
+  }
+
+  PSOCK_SEND_STR(&s.psock, (char *)smtp_rcpt_to);
+  PSOCK_SEND_STR(&s.psock, s.to);
+  PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+
+  PSOCK_READTO(&s.psock, ISO_nl);
+  
+  if(s.inputbuffer[0] != ISO_2) {
+    PSOCK_CLOSE(&s.psock);
+    smtp_done(5);
+    PSOCK_EXIT(&s.psock);
+  }
+  
+  if(s.cc != 0) {
+    PSOCK_SEND_STR(&s.psock, (char *)smtp_rcpt_to);
+    PSOCK_SEND_STR(&s.psock, s.cc);
+    PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+
+    PSOCK_READTO(&s.psock, ISO_nl);
+  
+    if(s.inputbuffer[0] != ISO_2) {
+      PSOCK_CLOSE(&s.psock);
+      smtp_done(6);
+      PSOCK_EXIT(&s.psock);
+    }
+  }
+  
+  PSOCK_SEND_STR(&s.psock, (char *)smtp_data);
+  
+  PSOCK_READTO(&s.psock, ISO_nl);
+  
+  if(s.inputbuffer[0] != ISO_3) {
+    PSOCK_CLOSE(&s.psock);
+    smtp_done(7);
+    PSOCK_EXIT(&s.psock);
+  }
+
+  PSOCK_SEND_STR(&s.psock, (char *)smtp_to);
+  PSOCK_SEND_STR(&s.psock, s.to);
+  PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+  
+  if(s.cc != 0) {
+    PSOCK_SEND_STR(&s.psock, (char *)smtp_cc);
+    PSOCK_SEND_STR(&s.psock, s.cc);
+    PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+  }
+  
+  PSOCK_SEND_STR(&s.psock, (char *)smtp_from);
+  PSOCK_SEND_STR(&s.psock, s.from);
+  PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+  
+  PSOCK_SEND_STR(&s.psock, (char *)smtp_subject);
+  PSOCK_SEND_STR(&s.psock, s.subject);
+  PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+
+  PSOCK_SEND(&s.psock, s.msg, s.msglen);
+  
+  PSOCK_SEND_STR(&s.psock, (char *)smtp_crnlperiodcrnl);
+
+  PSOCK_READTO(&s.psock, ISO_nl);
+  if(s.inputbuffer[0] != ISO_2) {
+    PSOCK_CLOSE(&s.psock);
+    smtp_done(8);
+    PSOCK_EXIT(&s.psock);
+  }
+
+  PSOCK_SEND_STR(&s.psock, (char *)smtp_quit);
+  smtp_done(SMTP_ERR_OK);
+  PSOCK_END(&s.psock);
+}
+/*---------------------------------------------------------------------------*/
+void
+smtp_appcall(void)
+{
+  if(uip_closed()) {
+    s.connected = 0;
+    return;
+  }
+  if(uip_aborted() || uip_timedout()) {
+    s.connected = 0;
+    smtp_done(1);
+    return;
+  }
+  smtp_thread();
+}
+/*---------------------------------------------------------------------------*/
+/**
+ * Specificy an SMTP server and hostname.
+ *
+ * This function is used to configure the SMTP module with an SMTP
+ * server and the hostname of the host.
+ *
+ * \param lhostname The hostname of the uIP host.
+ *
+ * \param server A pointer to a 4-byte array representing the IP
+ * address of the SMTP server to be configured.
+ */
+void
+smtp_configure(char *lhostname, void *server)
+{
+  localhostname = lhostname;
+  uip_ipaddr_copy(smtpserver, server);
+}
+/*---------------------------------------------------------------------------*/
+/**
+ * Send an e-mail.
+ *
+ * \param to The e-mail address of the receiver of the e-mail.
+ * \param cc The e-mail address of the CC: receivers of the e-mail.
+ * \param from The e-mail address of the sender of the e-mail.
+ * \param subject The subject of the e-mail.
+ * \param msg The actual e-mail message.
+ * \param msglen The length of the e-mail message.
+ */
+unsigned char
+smtp_send(char *to, char *cc, char *from,
+	  char *subject, char *msg, u16_t msglen)
+{
+  struct uip_conn *conn;
+
+  conn = uip_connect(smtpserver, HTONS(25));
+  if(conn == NULL) {
+    return 0;
+  }
+  s.connected = 1;
+  s.to = to;
+  s.cc = cc;
+  s.from = from;
+  s.subject = subject;
+  s.msg = msg;
+  s.msglen = msglen;
+
+  PSOCK_INIT(&s.psock, s.inputbuffer, sizeof(s.inputbuffer));
+  
+  return 1;
+}
+/*---------------------------------------------------------------------------*/
+void
+smtp_init(void)
+{
+  s.connected = 0;
+}
+/*---------------------------------------------------------------------------*/
+/** @} */
+/** @} */

+ 103 - 0
components/net/uip/apps/smtp/smtp.h

@@ -0,0 +1,103 @@
+
+/**
+ * \addtogroup smtp
+ * @{
+ */
+
+
+/**
+ * \file
+ * SMTP header file
+ * \author Adam Dunkels <adam@dunkels.com>
+ */
+
+/*
+ * Copyright (c) 2002, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack.
+ *
+ * $Id: smtp.h,v 1.4 2006/06/11 21:46:37 adam Exp $
+ *
+ */
+#ifndef __SMTP_H__
+#define __SMTP_H__
+
+#include "uipopt.h"
+
+/**
+ * Error number that signifies a non-error condition.
+ */
+#define SMTP_ERR_OK 0
+
+/**
+ * Callback function that is called when an e-mail transmission is
+ * done.
+ *
+ * This function must be implemented by the module that uses the SMTP
+ * module.
+ *
+ * \param error The number of the error if an error occured, or
+ * SMTP_ERR_OK.
+ */
+void smtp_done(unsigned char error);
+
+void smtp_init(void);
+
+/* Functions. */
+void smtp_configure(char *localhostname, u16_t *smtpserver);
+unsigned char smtp_send(char *to, char *from,
+			char *subject, char *msg,
+			u16_t msglen);
+#define SMTP_SEND(to, cc, from, subject, msg) \
+        smtp_send(to, cc, from, subject, msg, strlen(msg))
+
+void smtp_appcall(void);
+
+struct smtp_state {
+  u8_t state;
+  char *to;
+  char *from;
+  char *subject;
+  char *msg;
+  u16_t msglen;
+  
+  u16_t sentlen, textlen;
+  u16_t sendptr;
+
+};
+
+
+#ifndef UIP_APPCALL
+#define UIP_APPCALL     smtp_appcall
+#endif
+typedef struct smtp_state uip_tcp_appstate_t;
+
+
+#endif /* __SMTP_H__ */
+
+/** @} */

+ 1 - 0
components/net/uip/apps/telnetd/Makefile.telnetd

@@ -0,0 +1 @@
+APP_SOURCES += telnetd.c shell.c memb.c

+ 350 - 0
components/net/uip/apps/telnetd/telnetd.c

@@ -0,0 +1,350 @@
+/*
+ * Copyright (c) 2003, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack
+ *
+ * $Id: telnetd.c,v 1.2 2006/06/07 09:43:54 adam Exp $
+ *
+ */
+
+#include "uip.h"
+#include "telnetd.h"
+#include "memb.h"
+#include "shell.h"
+
+#include <string.h>
+
+#define ISO_nl       0x0a
+#define ISO_cr       0x0d
+
+struct telnetd_line {
+  char line[TELNETD_CONF_LINELEN];
+};
+MEMB(linemem, struct telnetd_line, TELNETD_CONF_NUMLINES);
+
+#define STATE_NORMAL 0
+#define STATE_IAC    1
+#define STATE_WILL   2
+#define STATE_WONT   3
+#define STATE_DO     4
+#define STATE_DONT   5
+#define STATE_CLOSE  6
+
+static struct telnetd_state s;
+
+#define TELNET_IAC   255
+#define TELNET_WILL  251
+#define TELNET_WONT  252
+#define TELNET_DO    253
+#define TELNET_DONT  254
+/*---------------------------------------------------------------------------*/
+static char *
+alloc_line(void)
+{
+  return memb_alloc(&linemem);
+}
+/*---------------------------------------------------------------------------*/
+static void
+dealloc_line(char *line)
+{
+  memb_free(&linemem, line);
+}
+/*---------------------------------------------------------------------------*/
+void
+shell_quit(char *str)
+{
+  s.state = STATE_CLOSE;
+}
+/*---------------------------------------------------------------------------*/
+static void
+sendline(char *line)
+{
+  static unsigned int i;
+  
+  for(i = 0; i < TELNETD_CONF_NUMLINES; ++i) {
+    if(s.lines[i] == NULL) {
+      s.lines[i] = line;
+      break;
+    }
+  }
+  if(i == TELNETD_CONF_NUMLINES) {
+    dealloc_line(line);
+  }
+}
+/*---------------------------------------------------------------------------*/
+void
+shell_prompt(char *str)
+{
+  char *line;
+  line = alloc_line();
+  if(line != NULL) {
+    strncpy(line, str, TELNETD_CONF_LINELEN);
+    /*    petsciiconv_toascii(line, TELNETD_CONF_LINELEN);*/
+    sendline(line);
+  }
+}
+/*---------------------------------------------------------------------------*/
+void
+shell_output(char *str1, char *str2)
+{
+  static unsigned len;
+  char *line;
+
+  line = alloc_line();
+  if(line != NULL) {
+    len = strlen(str1);
+    strncpy(line, str1, TELNETD_CONF_LINELEN);
+    if(len < TELNETD_CONF_LINELEN) {
+      strncpy(line + len, str2, TELNETD_CONF_LINELEN - len);
+    }
+    len = strlen(line);
+    if(len < TELNETD_CONF_LINELEN - 2) {
+      line[len] = ISO_cr;
+      line[len+1] = ISO_nl;
+      line[len+2] = 0;
+    }
+    /*    petsciiconv_toascii(line, TELNETD_CONF_LINELEN);*/
+    sendline(line);
+  }
+}
+/*---------------------------------------------------------------------------*/
+void
+telnetd_init(void)
+{
+  uip_listen(HTONS(23));
+  memb_init(&linemem);
+  shell_init();
+}
+/*---------------------------------------------------------------------------*/
+static void
+acked(void)
+{
+  static unsigned int i;
+  
+  while(s.numsent > 0) {
+    dealloc_line(s.lines[0]);
+    for(i = 1; i < TELNETD_CONF_NUMLINES; ++i) {
+      s.lines[i - 1] = s.lines[i];
+    }
+    s.lines[TELNETD_CONF_NUMLINES - 1] = NULL;
+    --s.numsent;
+  }
+}
+/*---------------------------------------------------------------------------*/
+static void
+senddata(void)
+{
+  static char *bufptr, *lineptr;
+  static int buflen, linelen;
+  
+  bufptr = uip_appdata;
+  buflen = 0;
+  for(s.numsent = 0; s.numsent < TELNETD_CONF_NUMLINES &&
+	s.lines[s.numsent] != NULL ; ++s.numsent) {
+    lineptr = s.lines[s.numsent];
+    linelen = strlen(lineptr);
+    if(linelen > TELNETD_CONF_LINELEN) {
+      linelen = TELNETD_CONF_LINELEN;
+    }
+    if(buflen + linelen < uip_mss()) {
+      memcpy(bufptr, lineptr, linelen);
+      bufptr += linelen;
+      buflen += linelen;
+    } else {
+      break;
+    }
+  }
+  uip_send(uip_appdata, buflen);
+}
+/*---------------------------------------------------------------------------*/
+static void
+closed(void)
+{
+  static unsigned int i;
+  
+  for(i = 0; i < TELNETD_CONF_NUMLINES; ++i) {
+    if(s.lines[i] != NULL) {
+      dealloc_line(s.lines[i]);
+    }
+  }
+}
+/*---------------------------------------------------------------------------*/
+static void
+get_char(u8_t c)
+{
+  if(c == ISO_cr) {
+    return;
+  }
+  
+  s.buf[(int)s.bufptr] = c;
+  if(s.buf[(int)s.bufptr] == ISO_nl ||
+     s.bufptr == sizeof(s.buf) - 1) {
+    if(s.bufptr > 0) {
+      s.buf[(int)s.bufptr] = 0;
+      /*      petsciiconv_topetscii(s.buf, TELNETD_CONF_LINELEN);*/
+    }
+    shell_input(s.buf);
+    s.bufptr = 0;
+  } else {
+    ++s.bufptr;
+  }
+}
+/*---------------------------------------------------------------------------*/
+static void
+sendopt(u8_t option, u8_t value)
+{
+  char *line;
+  line = alloc_line();
+  if(line != NULL) {
+    line[0] = TELNET_IAC;
+    line[1] = option;
+    line[2] = value;
+    line[3] = 0;
+    sendline(line);
+  }
+}
+/*---------------------------------------------------------------------------*/
+static void
+newdata(void)
+{
+  u16_t len;
+  u8_t c;
+  char *dataptr;
+    
+  
+  len = uip_datalen();
+  dataptr = (char *)uip_appdata;
+  
+  while(len > 0 && s.bufptr < sizeof(s.buf)) {
+    c = *dataptr;
+    ++dataptr;
+    --len;
+    switch(s.state) {
+    case STATE_IAC:
+      if(c == TELNET_IAC) {
+	get_char(c);
+	s.state = STATE_NORMAL;
+      } else {
+	switch(c) {
+	case TELNET_WILL:
+	  s.state = STATE_WILL;
+	  break;
+	case TELNET_WONT:
+	  s.state = STATE_WONT;
+	  break;
+	case TELNET_DO:
+	  s.state = STATE_DO;
+	  break;
+	case TELNET_DONT:
+	  s.state = STATE_DONT;
+	  break;
+	default:
+	  s.state = STATE_NORMAL;
+	  break;
+	}
+      }
+      break;
+    case STATE_WILL:
+      /* Reply with a DONT */
+      sendopt(TELNET_DONT, c);
+      s.state = STATE_NORMAL;
+      break;
+      
+    case STATE_WONT:
+      /* Reply with a DONT */
+      sendopt(TELNET_DONT, c);
+      s.state = STATE_NORMAL;
+      break;
+    case STATE_DO:
+      /* Reply with a WONT */
+      sendopt(TELNET_WONT, c);
+      s.state = STATE_NORMAL;
+      break;
+    case STATE_DONT:
+      /* Reply with a WONT */
+      sendopt(TELNET_WONT, c);
+      s.state = STATE_NORMAL;
+      break;
+    case STATE_NORMAL:
+      if(c == TELNET_IAC) {
+	s.state = STATE_IAC;
+      } else {
+	get_char(c);
+      }
+      break;
+    }
+
+    
+  }
+  
+}
+/*---------------------------------------------------------------------------*/
+void
+telnetd_appcall(void)
+{
+  static unsigned int i;
+  if(uip_connected()) {
+    /*    tcp_markconn(uip_conn, &s);*/
+    for(i = 0; i < TELNETD_CONF_NUMLINES; ++i) {
+      s.lines[i] = NULL;
+    }
+    s.bufptr = 0;
+    s.state = STATE_NORMAL;
+
+    shell_start();
+  }
+
+  if(s.state == STATE_CLOSE) {
+    s.state = STATE_NORMAL;
+    uip_close();
+    return;
+  }
+  
+  if(uip_closed() ||
+     uip_aborted() ||
+     uip_timedout()) {
+    closed();
+  }
+  
+  if(uip_acked()) {
+    acked();
+  }
+  
+  if(uip_newdata()) {
+    newdata();
+  }
+  
+  if(uip_rexmit() ||
+     uip_newdata() ||
+     uip_acked() ||
+     uip_connected() ||
+     uip_poll()) {
+    senddata();
+  }
+}
+/*---------------------------------------------------------------------------*/

+ 63 - 0
components/net/uip/apps/telnetd/telnetd.h

@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2003, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer in the documentation and/or other materials provided
+ *    with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack
+ *
+ * $Id: telnetd.h,v 1.2 2006/06/07 09:43:54 adam Exp $
+ *
+ */
+#ifndef __TELNETD_H__
+#define __TELNETD_H__
+
+#include "uipopt.h"
+
+void telnetd_appcall(void);
+
+#ifndef TELNETD_CONF_LINELEN
+#define TELNETD_CONF_LINELEN 40
+#endif
+#ifndef TELNETD_CONF_NUMLINES
+#define TELNETD_CONF_NUMLINES 16
+#endif
+
+struct telnetd_state {
+  char *lines[TELNETD_CONF_NUMLINES];
+  char buf[TELNETD_CONF_LINELEN];
+  char bufptr;
+  u8_t numsent;
+  u8_t state;
+};
+
+typedef struct telnetd_state uip_tcp_appstate_t;
+
+#ifndef UIP_APPCALL
+#define UIP_APPCALL     telnetd_appcall
+#endif
+
+#endif /* __TELNETD_H__ */

+ 123 - 0
components/net/uip/apps/telnetd/uip_shell.c

@@ -0,0 +1,123 @@
+ /*
+ * Copyright (c) 2003, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack.
+ *
+ * $Id: shell.c,v 1.1 2006/06/07 09:43:54 adam Exp $
+ *
+ */
+
+#include "uip_shell.h"
+
+#include <string.h>
+
+struct ptentry {
+  char *commandstr;
+  void (* pfunc)(char *str);
+};
+
+#define SHELL_PROMPT "uIP 1.0> "
+
+/*---------------------------------------------------------------------------*/
+static void
+parse(register char *str, struct ptentry *t)
+{
+  struct ptentry *p;
+  for(p = t; p->commandstr != NULL; ++p) {
+    if(strncmp(p->commandstr, str, strlen(p->commandstr)) == 0) {
+      break;
+    }
+  }
+
+  p->pfunc(str);
+}
+/*---------------------------------------------------------------------------*/
+static void
+inttostr(register char *str, unsigned int i)
+{
+  str[0] = '0' + i / 100;
+  if(str[0] == '0') {
+    str[0] = ' ';
+  }
+  str[1] = '0' + (i / 10) % 10;
+  if(str[0] == ' ' && str[1] == '0') {
+    str[1] = ' ';
+  }
+  str[2] = '0' + i % 10;
+  str[3] = ' ';
+  str[4] = 0;
+}
+/*---------------------------------------------------------------------------*/
+static void
+help(char *str)
+{
+  shell_output("Available commands:", "");
+  shell_output("stats   - show network statistics", "");
+  shell_output("conn    - show TCP connections", "");
+  shell_output("help, ? - show help", "");
+  shell_output("exit    - exit shell", "");
+}
+/*---------------------------------------------------------------------------*/
+static void
+unknown(char *str)
+{
+  if(strlen(str) > 0) {
+    shell_output("Unknown command: ", str);
+  }
+}
+/*---------------------------------------------------------------------------*/
+static struct ptentry parsetab[] =
+  {{"stats", help},
+   {"conn", help},
+   {"help", help},
+   {"exit", shell_quit},
+   {"?", help},
+
+   /* Default action */
+   {NULL, unknown}};
+/*---------------------------------------------------------------------------*/
+void
+shell_init(void)
+{
+}
+/*---------------------------------------------------------------------------*/
+void
+shell_start(void)
+{
+  shell_output("uIP command shell", "");
+  shell_output("Type '?' and return for help", "");
+  shell_prompt(SHELL_PROMPT);
+}
+/*---------------------------------------------------------------------------*/
+void
+shell_input(char *cmd)
+{
+  parse(cmd, parsetab);
+  shell_prompt(SHELL_PROMPT);
+}
+/*---------------------------------------------------------------------------*/

+ 104 - 0
components/net/uip/apps/telnetd/uip_shell.h

@@ -0,0 +1,104 @@
+/**
+ * \file
+ * Interface for the Contiki shell.
+ * \author Adam Dunkels <adam@dunkels.com>
+ *
+ * Some of the functions declared in this file must be implemented as
+ * a shell back-end in the architecture specific files of a Contiki
+ * port.
+ */
+
+
+/*
+ * Copyright (c) 2003, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This file is part of the Contiki desktop OS.
+ *
+ * $Id: shell.h,v 1.1 2006/06/07 09:43:54 adam Exp $
+ *
+ */
+#ifndef __SHELL_H__
+#define __SHELL_H__
+
+/**
+ * Initialize the shell.
+ *
+ * Called when the shell front-end process starts. This function may
+ * be used to start listening for signals.
+ */
+void shell_init(void);
+
+/**
+ * Start the shell back-end.
+ *
+ * Called by the front-end when a new shell is started.
+ */
+void shell_start(void);
+
+/**
+ * Process a shell command.
+ *
+ * This function will be called by the shell GUI / telnet server whan
+ * a command has been entered that should be processed by the shell
+ * back-end.
+ *
+ * \param command The command to be processed.
+ */
+void shell_input(char *command);
+
+/**
+ * Quit the shell.
+ *
+ */
+void shell_quit(char *);
+
+
+/**
+ * Print a string to the shell window.
+ *
+ * This function is implemented by the shell GUI / telnet server and
+ * can be called by the shell back-end to output a string in the
+ * shell window. The string is automatically appended with a linebreak.
+ *
+ * \param str1 The first half of the string to be output.
+ * \param str2 The second half of the string to be output.
+ */
+void shell_output(char *str1, char *str2);
+
+/**
+ * Print a prompt to the shell window.
+ *
+ * This function can be used by the shell back-end to print out a
+ * prompt to the shell window.
+ *
+ * \param prompt The prompt to be printed.
+ *
+ */
+void shell_prompt(char *prompt);
+
+#endif /* __SHELL_H__ */

+ 1 - 0
components/net/uip/apps/webclient/Makefile.webclient

@@ -0,0 +1 @@
+APP_SOURCES += webclient-strings.c webclient.c

+ 40 - 0
components/net/uip/apps/webclient/makestrings

@@ -0,0 +1,40 @@
+#!/usr/bin/perl
+
+
+sub stringify {
+  my $name = shift(@_);
+  open(OUTPUTC, "> $name.c");
+  open(OUTPUTH, "> $name.h");
+  
+  open(FILE, "$name");
+  
+  while(<FILE>) {
+    if(/(.+) "(.+)"/) {
+      $var = $1;
+      $data = $2;
+      
+      $datan = $data;
+      $datan =~ s/\\r/\r/g;
+      $datan =~ s/\\n/\n/g;
+      $datan =~ s/\\01/\01/g;      
+      $datan =~ s/\\0/\0/g;
+      
+      printf(OUTPUTC "const char $var\[%d] = \n", length($datan) + 1);
+      printf(OUTPUTC "/* \"$data\" */\n");
+      printf(OUTPUTC "{");
+      for($j = 0; $j < length($datan); $j++) {
+	printf(OUTPUTC "%#02x, ", unpack("C", substr($datan, $j, 1)));
+      }
+      printf(OUTPUTC "0 };\n");
+      
+      printf(OUTPUTH "extern const char $var\[%d];\n", length($datan) + 1);
+      
+    }
+  }
+  close(OUTPUTC);
+  close(OUTPUTH);
+}
+stringify("webclient-strings");
+
+exit 0;
+

+ 31 - 0
components/net/uip/apps/webclient/webclient-strings

@@ -0,0 +1,31 @@
+http_http "http://"
+http_200 "200 "
+http_301 "301 "
+http_302 "302 "
+http_get "GET "
+http_10 "HTTP/1.0"
+http_11 "HTTP/1.1"
+http_content_type "content-type: "
+http_texthtml "text/html"
+http_location "location: "
+http_host "host: "
+http_crnl "\r\n"
+http_index_html "/index.html"
+http_404_html "/404.html"
+http_content_type_html "Content-type: text/html\r\n\r\n"
+http_content_type_css  "Content-type: text/css\r\n\r\n"
+http_content_type_text "Content-type: text/text\r\n\r\n"
+http_content_type_png  "Content-type: image/png\r\n\r\n"
+http_content_type_gif  "Content-type: image/gif\r\n\r\n"
+http_content_type_jpg  "Content-type: image/jpeg\r\n\r\n"
+http_content_type_binary "Content-type: application/octet-stream\r\n\r\n"
+http_html ".html"
+http_shtml ".shtml"
+http_htm ".htm"
+http_css ".css"
+http_png ".png"
+http_gif ".gif"
+http_jpg ".jpg"
+http_text ".text"
+http_txt ".txt"
+http_user_agent_fields "Connection: close\r\nUser-Agent: uIP/1.0 (; http://www.sics.se/~adam/uip/)\r\n\r\n"

+ 93 - 0
components/net/uip/apps/webclient/webclient-strings.c

@@ -0,0 +1,93 @@
+const char http_http[8] = 
+/* "http://" */
+{0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0 };
+const char http_200[5] = 
+/* "200 " */
+{0x32, 0x30, 0x30, 0x20, 0 };
+const char http_301[5] = 
+/* "301 " */
+{0x33, 0x30, 0x31, 0x20, 0 };
+const char http_302[5] = 
+/* "302 " */
+{0x33, 0x30, 0x32, 0x20, 0 };
+const char http_get[5] = 
+/* "GET " */
+{0x47, 0x45, 0x54, 0x20, 0 };
+const char http_10[9] = 
+/* "HTTP/1.0" */
+{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0 };
+const char http_11[9] = 
+/* "HTTP/1.1" */
+{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, 0 };
+const char http_content_type[15] = 
+/* "content-type: " */
+{0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0 };
+const char http_texthtml[10] = 
+/* "text/html" */
+{0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0 };
+const char http_location[11] = 
+/* "location: " */
+{0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0 };
+const char http_host[7] = 
+/* "host: " */
+{0x68, 0x6f, 0x73, 0x74, 0x3a, 0x20, 0 };
+const char http_crnl[3] = 
+/* "\r\n" */
+{0xd, 0xa, 0 };
+const char http_index_html[12] = 
+/* "/index.html" */
+{0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0 };
+const char http_404_html[10] = 
+/* "/404.html" */
+{0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0 };
+const char http_content_type_html[28] = 
+/* "Content-type: text/html\r\n\r\n" */
+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa, 0xd, 0xa, 0 };
+const char http_content_type_css [27] = 
+/* "Content-type: text/css\r\n\r\n" */
+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0xd, 0xa, 0xd, 0xa, 0 };
+const char http_content_type_text[28] = 
+/* "Content-type: text/text\r\n\r\n" */
+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x74, 0x65, 0x78, 0x74, 0xd, 0xa, 0xd, 0xa, 0 };
+const char http_content_type_png [28] = 
+/* "Content-type: image/png\r\n\r\n" */
+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0xd, 0xa, 0xd, 0xa, 0 };
+const char http_content_type_gif [28] = 
+/* "Content-type: image/gif\r\n\r\n" */
+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0xd, 0xa, 0xd, 0xa, 0 };
+const char http_content_type_jpg [29] = 
+/* "Content-type: image/jpeg\r\n\r\n" */
+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x70, 0x65, 0x67, 0xd, 0xa, 0xd, 0xa, 0 };
+const char http_content_type_binary[43] = 
+/* "Content-type: application/octet-stream\r\n\r\n" */
+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xd, 0xa, 0xd, 0xa, 0 };
+const char http_html[6] = 
+/* ".html" */
+{0x2e, 0x68, 0x74, 0x6d, 0x6c, 0 };
+const char http_shtml[7] = 
+/* ".shtml" */
+{0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0 };
+const char http_htm[5] = 
+/* ".htm" */
+{0x2e, 0x68, 0x74, 0x6d, 0 };
+const char http_css[5] = 
+/* ".css" */
+{0x2e, 0x63, 0x73, 0x73, 0 };
+const char http_png[5] = 
+/* ".png" */
+{0x2e, 0x70, 0x6e, 0x67, 0 };
+const char http_gif[5] = 
+/* ".gif" */
+{0x2e, 0x67, 0x69, 0x66, 0 };
+const char http_jpg[5] = 
+/* ".jpg" */
+{0x2e, 0x6a, 0x70, 0x67, 0 };
+const char http_text[6] = 
+/* ".text" */
+{0x2e, 0x74, 0x65, 0x78, 0x74, 0 };
+const char http_txt[5] = 
+/* ".txt" */
+{0x2e, 0x74, 0x78, 0x74, 0 };
+const char http_user_agent_fields[77] = 
+/* "Connection: close\r\nUser-Agent: uIP/1.0 (; http://www.sics.se/~adam/uip/)\r\n\r\n" */
+{0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, 0x55, 0x73, 0x65, 0x72, 0x2d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x28, 0x3b, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0x29, 0xd, 0xa, 0xd, 0xa, 0 };

+ 31 - 0
components/net/uip/apps/webclient/webclient-strings.h

@@ -0,0 +1,31 @@
+extern const char http_http[8];
+extern const char http_200[5];
+extern const char http_301[5];
+extern const char http_302[5];
+extern const char http_get[5];
+extern const char http_10[9];
+extern const char http_11[9];
+extern const char http_content_type[15];
+extern const char http_texthtml[10];
+extern const char http_location[11];
+extern const char http_host[7];
+extern const char http_crnl[3];
+extern const char http_index_html[12];
+extern const char http_404_html[10];
+extern const char http_content_type_html[28];
+extern const char http_content_type_css [27];
+extern const char http_content_type_text[28];
+extern const char http_content_type_png [28];
+extern const char http_content_type_gif [28];
+extern const char http_content_type_jpg [29];
+extern const char http_content_type_binary[43];
+extern const char http_html[6];
+extern const char http_shtml[7];
+extern const char http_htm[5];
+extern const char http_css[5];
+extern const char http_png[5];
+extern const char http_gif[5];
+extern const char http_jpg[5];
+extern const char http_text[6];
+extern const char http_txt[5];
+extern const char http_user_agent_fields[77];

+ 439 - 0
components/net/uip/apps/webclient/webclient.c

@@ -0,0 +1,439 @@
+/**
+ * \addtogroup apps
+ * @{
+ */
+
+/**
+ * \defgroup webclient Web client
+ * @{
+ *
+ * This example shows a HTTP client that is able to download web pages
+ * and files from web servers. It requires a number of callback
+ * functions to be implemented by the module that utilizes the code:
+ * webclient_datahandler(), webclient_connected(),
+ * webclient_timedout(), webclient_aborted(), webclient_closed().
+ */
+
+/**
+ * \file
+ * Implementation of the HTTP client.
+ * \author Adam Dunkels <adam@dunkels.com>
+ */
+
+/*
+ * Copyright (c) 2002, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer in the documentation and/or other materials provided
+ *    with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack.
+ *
+ * $Id: webclient.c,v 1.2 2006/06/11 21:46:37 adam Exp $
+ *
+ */
+
+#include "uip.h"
+#include "uiplib.h"
+#include "webclient.h"
+#include "resolv.h"
+
+#include <string.h>
+
+#define WEBCLIENT_TIMEOUT 100
+
+#define WEBCLIENT_STATE_STATUSLINE 0
+#define WEBCLIENT_STATE_HEADERS    1
+#define WEBCLIENT_STATE_DATA       2
+#define WEBCLIENT_STATE_CLOSE      3
+
+#define HTTPFLAG_NONE   0
+#define HTTPFLAG_OK     1
+#define HTTPFLAG_MOVED  2
+#define HTTPFLAG_ERROR  3
+
+
+#define ISO_nl       0x0a
+#define ISO_cr       0x0d
+#define ISO_space    0x20
+
+
+static struct webclient_state s;
+
+/*-----------------------------------------------------------------------------------*/
+char *
+webclient_mimetype(void)
+{
+  return s.mimetype;
+}
+/*-----------------------------------------------------------------------------------*/
+char *
+webclient_filename(void)
+{
+  return s.file;
+}
+/*-----------------------------------------------------------------------------------*/
+char *
+webclient_hostname(void)
+{
+  return s.host;
+}
+/*-----------------------------------------------------------------------------------*/
+unsigned short
+webclient_port(void)
+{
+  return s.port;
+}
+/*-----------------------------------------------------------------------------------*/
+void
+webclient_init(void)
+{
+
+}
+/*-----------------------------------------------------------------------------------*/
+static void
+init_connection(void)
+{
+  s.state = WEBCLIENT_STATE_STATUSLINE;
+
+  s.getrequestleft = sizeof(http_get) - 1 + 1 +
+    sizeof(http_10) - 1 +
+    sizeof(http_crnl) - 1 +
+    sizeof(http_host) - 1 +
+    sizeof(http_crnl) - 1 +
+    strlen(http_user_agent_fields) +
+    strlen(s.file) + strlen(s.host);
+  s.getrequestptr = 0;
+
+  s.httpheaderlineptr = 0;
+}
+/*-----------------------------------------------------------------------------------*/
+void
+webclient_close(void)
+{
+  s.state = WEBCLIENT_STATE_CLOSE;
+}
+/*-----------------------------------------------------------------------------------*/
+unsigned char
+webclient_get(char *host, u16_t port, char *file)
+{
+  struct uip_conn *conn;
+  uip_ipaddr_t *ipaddr;
+  static uip_ipaddr_t addr;
+  
+  /* First check if the host is an IP address. */
+  ipaddr = &addr;
+  if(uiplib_ipaddrconv(host, (unsigned char *)addr) == 0) {
+    ipaddr = (uip_ipaddr_t *)resolv_lookup(host);
+    
+    if(ipaddr == NULL) {
+      return 0;
+    }
+  }
+  
+  conn = uip_connect(ipaddr, htons(port));
+  
+  if(conn == NULL) {
+    return 0;
+  }
+  
+  s.port = port;
+  strncpy(s.file, file, sizeof(s.file));
+  strncpy(s.host, host, sizeof(s.host));
+  
+  init_connection();
+  return 1;
+}
+/*-----------------------------------------------------------------------------------*/
+static unsigned char *
+copy_string(unsigned char *dest,
+	    const unsigned char *src, unsigned char len)
+{
+  strncpy(dest, src, len);
+  return dest + len;
+}
+/*-----------------------------------------------------------------------------------*/
+static void
+senddata(void)
+{
+  u16_t len;
+  char *getrequest;
+  char *cptr;
+  
+  if(s.getrequestleft > 0) {
+    cptr = getrequest = (char *)uip_appdata;
+
+    cptr = copy_string(cptr, http_get, sizeof(http_get) - 1);
+    cptr = copy_string(cptr, s.file, strlen(s.file));
+    *cptr++ = ISO_space;
+    cptr = copy_string(cptr, http_10, sizeof(http_10) - 1);
+
+    cptr = copy_string(cptr, http_crnl, sizeof(http_crnl) - 1);
+    
+    cptr = copy_string(cptr, http_host, sizeof(http_host) - 1);
+    cptr = copy_string(cptr, s.host, strlen(s.host));
+    cptr = copy_string(cptr, http_crnl, sizeof(http_crnl) - 1);
+
+    cptr = copy_string(cptr, http_user_agent_fields,
+		       strlen(http_user_agent_fields));
+    
+    len = s.getrequestleft > uip_mss()?
+      uip_mss():
+      s.getrequestleft;
+    uip_send(&(getrequest[s.getrequestptr]), len);
+  }
+}
+/*-----------------------------------------------------------------------------------*/
+static void
+acked(void)
+{
+  u16_t len;
+  
+  if(s.getrequestleft > 0) {
+    len = s.getrequestleft > uip_mss()?
+      uip_mss():
+      s.getrequestleft;
+    s.getrequestleft -= len;
+    s.getrequestptr += len;
+  }
+}
+/*-----------------------------------------------------------------------------------*/
+static u16_t
+parse_statusline(u16_t len)
+{
+  char *cptr;
+  
+  while(len > 0 && s.httpheaderlineptr < sizeof(s.httpheaderline)) {
+    s.httpheaderline[s.httpheaderlineptr] = *(char *)uip_appdata;
+    ++((char *)uip_appdata);
+    --len;
+    if(s.httpheaderline[s.httpheaderlineptr] == ISO_nl) {
+
+      if((strncmp(s.httpheaderline, http_10,
+		  sizeof(http_10) - 1) == 0) ||
+	 (strncmp(s.httpheaderline, http_11,
+		  sizeof(http_11) - 1) == 0)) {
+	cptr = &(s.httpheaderline[9]);
+	s.httpflag = HTTPFLAG_NONE;
+	if(strncmp(cptr, http_200, sizeof(http_200) - 1) == 0) {
+	  /* 200 OK */
+	  s.httpflag = HTTPFLAG_OK;
+	} else if(strncmp(cptr, http_301, sizeof(http_301) - 1) == 0 ||
+		  strncmp(cptr, http_302, sizeof(http_302) - 1) == 0) {
+	  /* 301 Moved permanently or 302 Found. Location: header line
+	     will contain thw new location. */
+	  s.httpflag = HTTPFLAG_MOVED;
+	} else {
+	  s.httpheaderline[s.httpheaderlineptr - 1] = 0;
+	}
+      } else {
+	uip_abort();
+	webclient_aborted();
+	return 0;
+      }
+      
+      /* We're done parsing the status line, so we reset the pointer
+	 and start parsing the HTTP headers.*/
+      s.httpheaderlineptr = 0;
+      s.state = WEBCLIENT_STATE_HEADERS;
+      break;
+    } else {
+      ++s.httpheaderlineptr;
+    }
+  }
+  return len;
+}
+/*-----------------------------------------------------------------------------------*/
+static char
+casecmp(char *str1, const char *str2, char len)
+{
+  static char c;
+  
+  while(len > 0) {
+    c = *str1;
+    /* Force lower-case characters. */
+    if(c & 0x40) {
+      c |= 0x20;
+    }
+    if(*str2 != c) {
+      return 1;
+    }
+    ++str1;
+    ++str2;
+    --len;
+  }
+  return 0;
+}
+/*-----------------------------------------------------------------------------------*/
+static u16_t
+parse_headers(u16_t len)
+{
+  char *cptr;
+  static unsigned char i;
+  
+  while(len > 0 && s.httpheaderlineptr < sizeof(s.httpheaderline)) {
+    s.httpheaderline[s.httpheaderlineptr] = *(char *)uip_appdata;
+    ++((char *)uip_appdata);
+    --len;
+    if(s.httpheaderline[s.httpheaderlineptr] == ISO_nl) {
+      /* We have an entire HTTP header line in s.httpheaderline, so
+	 we parse it. */
+      if(s.httpheaderline[0] == ISO_cr) {
+	/* This was the last header line (i.e., and empty "\r\n"), so
+	   we are done with the headers and proceed with the actual
+	   data. */
+	s.state = WEBCLIENT_STATE_DATA;
+	return len;
+      }
+
+      s.httpheaderline[s.httpheaderlineptr - 1] = 0;
+      /* Check for specific HTTP header fields. */
+      if(casecmp(s.httpheaderline, http_content_type,
+		     sizeof(http_content_type) - 1) == 0) {
+	/* Found Content-type field. */
+	cptr = strchr(s.httpheaderline, ';');
+	if(cptr != NULL) {
+	  *cptr = 0;
+	}
+	strncpy(s.mimetype, s.httpheaderline +
+		sizeof(http_content_type) - 1, sizeof(s.mimetype));
+      } else if(casecmp(s.httpheaderline, http_location,
+			    sizeof(http_location) - 1) == 0) {
+	cptr = s.httpheaderline +
+	  sizeof(http_location) - 1;
+	
+	if(strncmp(cptr, http_http, 7) == 0) {
+	  cptr += 7;
+	  for(i = 0; i < s.httpheaderlineptr - 7; ++i) {
+	    if(*cptr == 0 ||
+	       *cptr == '/' ||
+	       *cptr == ' ' ||
+	       *cptr == ':') {
+	      s.host[i] = 0;
+	      break;
+	    }
+	    s.host[i] = *cptr;
+	    ++cptr;
+	  }
+	}
+	strncpy(s.file, cptr, sizeof(s.file));
+	/*	s.file[s.httpheaderlineptr - i] = 0;*/
+      }
+
+
+      /* We're done parsing, so we reset the pointer and start the
+	 next line. */
+      s.httpheaderlineptr = 0;
+    } else {
+      ++s.httpheaderlineptr;
+    }
+  }
+  return len;
+}
+/*-----------------------------------------------------------------------------------*/
+static void
+newdata(void)
+{
+  u16_t len;
+
+  len = uip_datalen();
+
+  if(s.state == WEBCLIENT_STATE_STATUSLINE) {
+    len = parse_statusline(len);
+  }
+  
+  if(s.state == WEBCLIENT_STATE_HEADERS && len > 0) {
+    len = parse_headers(len);
+  }
+
+  if(len > 0 && s.state == WEBCLIENT_STATE_DATA &&
+     s.httpflag != HTTPFLAG_MOVED) {
+    webclient_datahandler((char *)uip_appdata, len);
+  }
+}
+/*-----------------------------------------------------------------------------------*/
+void
+webclient_appcall(void)
+{
+  if(uip_connected()) {
+    s.timer = 0;
+    s.state = WEBCLIENT_STATE_STATUSLINE;
+    senddata();
+    webclient_connected();
+    return;
+  }
+
+  if(s.state == WEBCLIENT_STATE_CLOSE) {
+    webclient_closed();
+    uip_abort();
+    return;
+  }
+
+  if(uip_aborted()) {
+    webclient_aborted();
+  }
+  if(uip_timedout()) {
+    webclient_timedout();
+  }
+
+  
+  if(uip_acked()) {
+    s.timer = 0;
+    acked();
+  }
+  if(uip_newdata()) {
+    s.timer = 0;
+    newdata();
+  }
+  if(uip_rexmit() ||
+     uip_newdata() ||
+     uip_acked()) {
+    senddata();
+  } else if(uip_poll()) {
+    ++s.timer;
+    if(s.timer == WEBCLIENT_TIMEOUT) {
+      webclient_timedout();
+      uip_abort();
+      return;
+    }
+        /*    senddata();*/
+  }
+
+  if(uip_closed()) {
+    if(s.httpflag != HTTPFLAG_MOVED) {
+      /* Send NULL data to signal EOF. */
+      webclient_datahandler(NULL, 0);
+    } else {
+      if(resolv_lookup(s.host) == NULL) {
+	resolv_query(s.host);
+      }
+      webclient_get(s.host, s.port, s.file);
+    }
+  }
+}
+/*-----------------------------------------------------------------------------------*/
+
+/** @} */
+/** @} */

+ 228 - 0
components/net/uip/apps/webclient/webclient.h

@@ -0,0 +1,228 @@
+/**
+ * \addtogroup webclient
+ * @{
+ */
+
+/**
+ * \file
+ * Header file for the HTTP client.
+ * \author Adam Dunkels <adam@dunkels.com>
+ */
+
+/*
+ * Copyright (c) 2002, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer in the documentation and/or other materials provided
+ *    with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack.
+ *
+ * $Id: webclient.h,v 1.2 2006/06/11 21:46:37 adam Exp $
+ *
+ */
+#ifndef __WEBCLIENT_H__
+#define __WEBCLIENT_H__
+
+
+#include "webclient-strings.h"
+#include "uipopt.h"
+
+#define WEBCLIENT_CONF_MAX_URLLEN 100
+
+struct webclient_state {
+  u8_t timer;
+  u8_t state;
+  u8_t httpflag;
+
+  u16_t port;
+  char host[40];
+  char file[WEBCLIENT_CONF_MAX_URLLEN];
+  u16_t getrequestptr;
+  u16_t getrequestleft;
+  
+  char httpheaderline[200];
+  u16_t httpheaderlineptr;
+
+  char mimetype[32];
+};
+
+typedef struct webclient_state uip_tcp_appstate_t;
+#define UIP_APPCALL webclient_appcall
+
+/**
+ * Callback function that is called from the webclient code when HTTP
+ * data has been received.
+ *
+ * This function must be implemented by the module that uses the
+ * webclient code. The function is called from the webclient module
+ * when HTTP data has been received. The function is not called when
+ * HTTP headers are received, only for the actual data.
+ *
+ * \note This function is called many times, repetedly, when data is
+ * being received, and not once when all data has been received.
+ *
+ * \param data A pointer to the data that has been received.
+ * \param len The length of the data that has been received.
+ */
+void webclient_datahandler(char *data, u16_t len);
+
+/**
+ * Callback function that is called from the webclient code when the
+ * HTTP connection has been connected to the web server.
+ *
+ * This function must be implemented by the module that uses the
+ * webclient code.
+ */
+void webclient_connected(void);
+
+/**
+ * Callback function that is called from the webclient code if the
+ * HTTP connection to the web server has timed out.
+ *
+ * This function must be implemented by the module that uses the
+ * webclient code.
+ */
+void webclient_timedout(void);
+
+/**
+ * Callback function that is called from the webclient code if the
+ * HTTP connection to the web server has been aborted by the web
+ * server.
+ *
+ * This function must be implemented by the module that uses the
+ * webclient code.
+ */
+void webclient_aborted(void);
+
+/**
+ * Callback function that is called from the webclient code when the
+ * HTTP connection to the web server has been closed.
+ *
+ * This function must be implemented by the module that uses the
+ * webclient code.
+ */
+void webclient_closed(void);
+
+
+
+/**
+ * Initialize the webclient module.
+ */
+void webclient_init(void);
+
+/**
+ * Open an HTTP connection to a web server and ask for a file using
+ * the GET method.
+ *
+ * This function opens an HTTP connection to the specified web server
+ * and requests the specified file using the GET method. When the HTTP
+ * connection has been connected, the webclient_connected() callback
+ * function is called and when the HTTP data arrives the
+ * webclient_datahandler() callback function is called.
+ *
+ * The callback function webclient_timedout() is called if the web
+ * server could not be contacted, and the webclient_aborted() callback
+ * function is called if the HTTP connection is aborted by the web
+ * server.
+ *
+ * When the HTTP request has been completed and the HTTP connection is
+ * closed, the webclient_closed() callback function will be called.
+ *
+ * \note If the function is passed a host name, it must already be in
+ * the resolver cache in order for the function to connect to the web
+ * server. It is therefore up to the calling module to implement the
+ * resolver calls and the signal handler used for reporting a resolv
+ * query answer.
+ *
+ * \param host A pointer to a string containing either a host name or
+ * a numerical IP address in dotted decimal notation (e.g., 192.168.23.1).
+ *
+ * \param port The port number to which to connect, in host byte order.
+ *
+ * \param file A pointer to the name of the file to get.
+ *
+ * \retval 0 if the host name could not be found in the cache, or
+ * if a TCP connection could not be created.
+ *
+ * \retval 1 if the connection was initiated.
+ */
+unsigned char webclient_get(char *host, u16_t port, char *file);
+
+/**
+ * Close the currently open HTTP connection.
+ */
+void webclient_close(void);
+void webclient_appcall(void);
+
+/**
+ * Obtain the MIME type of the current HTTP data stream.
+ *
+ * \return A pointer to a string contaning the MIME type. The string
+ * may be empty if no MIME type was reported by the web server.
+ */
+char *webclient_mimetype(void);
+
+/**
+ * Obtain the filename of the current HTTP data stream.
+ *
+ * The filename of an HTTP request may be changed by the web server,
+ * and may therefore not be the same as when the original GET request
+ * was made with webclient_get(). This function is used for obtaining
+ * the current filename.
+ *
+ * \return A pointer to the current filename.
+ */
+char *webclient_filename(void);
+
+/**
+ * Obtain the hostname of the current HTTP data stream.
+ *
+ * The hostname of the web server of an HTTP request may be changed
+ * by the web server, and may therefore not be the same as when the
+ * original GET request was made with webclient_get(). This function
+ * is used for obtaining the current hostname.
+ *
+ * \return A pointer to the current hostname.
+ */
+char *webclient_hostname(void);
+
+/**
+ * Obtain the port number of the current HTTP data stream.
+ *
+ * The port number of an HTTP request may be changed by the web
+ * server, and may therefore not be the same as when the original GET
+ * request was made with webclient_get(). This function is used for
+ * obtaining the current port number.
+ *
+ * \return The port number of the current HTTP data stream, in host byte order.
+ */
+unsigned short webclient_port(void);
+
+
+
+#endif /* __WEBCLIENT_H__ */
+
+/** @} */

+ 1 - 0
components/net/uip/apps/webserver/Makefile.webserver

@@ -0,0 +1 @@
+APP_SOURCES += httpd.c http-strings.c httpd-fs.c httpd-cgi.c

+ 35 - 0
components/net/uip/apps/webserver/http-strings

@@ -0,0 +1,35 @@
+http_http "http://"
+http_200 "200 "
+http_301 "301 "
+http_302 "302 "
+http_get "GET "
+http_10 "HTTP/1.0"
+http_11 "HTTP/1.1"
+http_content_type "content-type: "
+http_texthtml "text/html"
+http_location "location: "
+http_host "host: "
+http_crnl "\r\n"
+http_index_html "/index.html"
+http_404_html "/404.html"
+http_referer "Referer:"
+http_header_200 "HTTP/1.0 200 OK\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n"
+http_header_404 "HTTP/1.0 404 Not found\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n"
+http_content_type_plain "Content-type: text/plain\r\n\r\n"
+http_content_type_html "Content-type: text/html\r\n\r\n"
+http_content_type_css  "Content-type: text/css\r\n\r\n"
+http_content_type_text "Content-type: text/text\r\n\r\n"
+http_content_type_png  "Content-type: image/png\r\n\r\n"
+http_content_type_gif  "Content-type: image/gif\r\n\r\n"
+http_content_type_jpg  "Content-type: image/jpeg\r\n\r\n"
+http_content_type_binary "Content-type: application/octet-stream\r\n\r\n"
+http_html ".html"
+http_shtml ".shtml"
+http_htm ".htm"
+http_css ".css"
+http_png ".png"
+http_gif ".gif"
+http_jpg ".jpg"
+http_text ".txt"
+http_txt ".txt"
+

+ 102 - 0
components/net/uip/apps/webserver/http-strings.c

@@ -0,0 +1,102 @@
+const char http_http[8] = 
+/* "http://" */
+{0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, };
+const char http_200[5] = 
+/* "200 " */
+{0x32, 0x30, 0x30, 0x20, };
+const char http_301[5] = 
+/* "301 " */
+{0x33, 0x30, 0x31, 0x20, };
+const char http_302[5] = 
+/* "302 " */
+{0x33, 0x30, 0x32, 0x20, };
+const char http_get[5] = 
+/* "GET " */
+{0x47, 0x45, 0x54, 0x20, };
+const char http_10[9] = 
+/* "HTTP/1.0" */
+{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, };
+const char http_11[9] = 
+/* "HTTP/1.1" */
+{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, };
+const char http_content_type[15] = 
+/* "content-type: " */
+{0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, };
+const char http_texthtml[10] = 
+/* "text/html" */
+{0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, };
+const char http_location[11] = 
+/* "location: " */
+{0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, };
+const char http_host[7] = 
+/* "host: " */
+{0x68, 0x6f, 0x73, 0x74, 0x3a, 0x20, };
+const char http_crnl[3] = 
+/* "\r\n" */
+{0xd, 0xa, };
+const char http_index_html[12] = 
+/* "/index.html" */
+{0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, };
+const char http_404_html[10] = 
+/* "/404.html" */
+{0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, };
+const char http_referer[9] = 
+/* "Referer:" */
+{0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72, 0x3a, };
+const char http_header_200[84] = 
+/* "HTTP/1.0 200 OK\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */
+{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, };
+const char http_header_404[91] = 
+/* "HTTP/1.0 404 Not found\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */
+{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x34, 0x30, 0x34, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, };
+const char http_content_type_plain[29] = 
+/* "Content-type: text/plain\r\n\r\n" */
+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0xd, 0xa, 0xd, 0xa, };
+const char http_content_type_html[28] = 
+/* "Content-type: text/html\r\n\r\n" */
+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa, 0xd, 0xa, };
+const char http_content_type_css [27] = 
+/* "Content-type: text/css\r\n\r\n" */
+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0xd, 0xa, 0xd, 0xa, };
+const char http_content_type_text[28] = 
+/* "Content-type: text/text\r\n\r\n" */
+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x74, 0x65, 0x78, 0x74, 0xd, 0xa, 0xd, 0xa, };
+const char http_content_type_png [28] = 
+/* "Content-type: image/png\r\n\r\n" */
+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0xd, 0xa, 0xd, 0xa, };
+const char http_content_type_gif [28] = 
+/* "Content-type: image/gif\r\n\r\n" */
+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0xd, 0xa, 0xd, 0xa, };
+const char http_content_type_jpg [29] = 
+/* "Content-type: image/jpeg\r\n\r\n" */
+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x70, 0x65, 0x67, 0xd, 0xa, 0xd, 0xa, };
+const char http_content_type_binary[43] = 
+/* "Content-type: application/octet-stream\r\n\r\n" */
+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xd, 0xa, 0xd, 0xa, };
+const char http_html[6] = 
+/* ".html" */
+{0x2e, 0x68, 0x74, 0x6d, 0x6c, };
+const char http_shtml[7] = 
+/* ".shtml" */
+{0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, };
+const char http_htm[5] = 
+/* ".htm" */
+{0x2e, 0x68, 0x74, 0x6d, };
+const char http_css[5] = 
+/* ".css" */
+{0x2e, 0x63, 0x73, 0x73, };
+const char http_png[5] = 
+/* ".png" */
+{0x2e, 0x70, 0x6e, 0x67, };
+const char http_gif[5] = 
+/* ".gif" */
+{0x2e, 0x67, 0x69, 0x66, };
+const char http_jpg[5] = 
+/* ".jpg" */
+{0x2e, 0x6a, 0x70, 0x67, };
+const char http_text[5] = 
+/* ".txt" */
+{0x2e, 0x74, 0x78, 0x74, };
+const char http_txt[5] = 
+/* ".txt" */
+{0x2e, 0x74, 0x78, 0x74, };

+ 34 - 0
components/net/uip/apps/webserver/http-strings.h

@@ -0,0 +1,34 @@
+extern const char http_http[8];
+extern const char http_200[5];
+extern const char http_301[5];
+extern const char http_302[5];
+extern const char http_get[5];
+extern const char http_10[9];
+extern const char http_11[9];
+extern const char http_content_type[15];
+extern const char http_texthtml[10];
+extern const char http_location[11];
+extern const char http_host[7];
+extern const char http_crnl[3];
+extern const char http_index_html[12];
+extern const char http_404_html[10];
+extern const char http_referer[9];
+extern const char http_header_200[84];
+extern const char http_header_404[91];
+extern const char http_content_type_plain[29];
+extern const char http_content_type_html[28];
+extern const char http_content_type_css [27];
+extern const char http_content_type_text[28];
+extern const char http_content_type_png [28];
+extern const char http_content_type_gif [28];
+extern const char http_content_type_jpg [29];
+extern const char http_content_type_binary[43];
+extern const char http_html[6];
+extern const char http_shtml[7];
+extern const char http_htm[5];
+extern const char http_css[5];
+extern const char http_png[5];
+extern const char http_gif[5];
+extern const char http_jpg[5];
+extern const char http_text[5];
+extern const char http_txt[5];

+ 203 - 0
components/net/uip/apps/webserver/httpd-cgi.c

@@ -0,0 +1,203 @@
+/**
+ * \addtogroup httpd
+ * @{
+ */
+
+/**
+ * \file
+ *         Web server script interface
+ * \author
+ *         Adam Dunkels <adam@sics.se>
+ *
+ */
+
+/*
+ * Copyright (c) 2001-2006, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack.
+ *
+ * $Id: httpd-cgi.c,v 1.2 2006/06/11 21:46:37 adam Exp $
+ *
+ */
+
+#include "uip.h"
+#include "psock.h"
+#include "httpd.h"
+#include "httpd-cgi.h"
+#include "httpd-fs.h"
+
+#include <stdio.h>
+#include <string.h>
+
+HTTPD_CGI_CALL(file, "file-stats", file_stats);
+HTTPD_CGI_CALL(tcp, "tcp-connections", tcp_stats);
+HTTPD_CGI_CALL(net, "net-stats", net_stats);
+
+static const struct httpd_cgi_call *calls[] = { &file, &tcp, &net, NULL };
+
+/*---------------------------------------------------------------------------*/
+static
+PT_THREAD(nullfunction(struct httpd_state *s, char *ptr))
+{
+  PSOCK_BEGIN(&s->sout);
+  PSOCK_END(&s->sout);
+}
+/*---------------------------------------------------------------------------*/
+httpd_cgifunction
+httpd_cgi(char *name)
+{
+  const struct httpd_cgi_call **f;
+
+  /* Find the matching name in the table, return the function. */
+  for(f = calls; *f != NULL; ++f) {
+    if(strncmp((*f)->name, name, strlen((*f)->name)) == 0) {
+      return (*f)->function;
+    }
+  }
+  return nullfunction;
+}
+/*---------------------------------------------------------------------------*/
+static unsigned short
+generate_file_stats(void *arg)
+{
+  char *f = (char *)arg;
+  return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, "%5u", httpd_fs_count(f));
+}
+/*---------------------------------------------------------------------------*/
+static
+PT_THREAD(file_stats(struct httpd_state *s, char *ptr))
+{
+  PSOCK_BEGIN(&s->sout);
+
+  PSOCK_GENERATOR_SEND(&s->sout, generate_file_stats, strchr(ptr, ' ') + 1);
+  
+  PSOCK_END(&s->sout);
+}
+/*---------------------------------------------------------------------------*/
+static const char closed[] =   /*  "CLOSED",*/
+{0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0};
+static const char syn_rcvd[] = /*  "SYN-RCVD",*/
+{0x53, 0x59, 0x4e, 0x2d, 0x52, 0x43, 0x56,
+ 0x44,  0};
+static const char syn_sent[] = /*  "SYN-SENT",*/
+{0x53, 0x59, 0x4e, 0x2d, 0x53, 0x45, 0x4e,
+ 0x54,  0};
+static const char established[] = /*  "ESTABLISHED",*/
+{0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48,
+ 0x45, 0x44, 0};
+static const char fin_wait_1[] = /*  "FIN-WAIT-1",*/
+{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49,
+ 0x54, 0x2d, 0x31, 0};
+static const char fin_wait_2[] = /*  "FIN-WAIT-2",*/
+{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49,
+ 0x54, 0x2d, 0x32, 0};
+static const char closing[] = /*  "CLOSING",*/
+{0x43, 0x4c, 0x4f, 0x53, 0x49,
+ 0x4e, 0x47, 0};
+static const char time_wait[] = /*  "TIME-WAIT,"*/
+{0x54, 0x49, 0x4d, 0x45, 0x2d, 0x57, 0x41,
+ 0x49, 0x54, 0};
+static const char last_ack[] = /*  "LAST-ACK"*/
+{0x4c, 0x41, 0x53, 0x54, 0x2d, 0x41, 0x43,
+ 0x4b, 0};
+
+static const char *states[] = {
+  closed,
+  syn_rcvd,
+  syn_sent,
+  established,
+  fin_wait_1,
+  fin_wait_2,
+  closing,
+  time_wait,
+  last_ack};
+  
+
+static unsigned short
+generate_tcp_stats(void *arg)
+{
+  struct uip_conn *conn;
+  struct httpd_state *s = (struct httpd_state *)arg;
+    
+  conn = &uip_conns[s->count];
+  return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE,
+		 "<tr><td>%d</td><td>%u.%u.%u.%u:%u</td><td>%s</td><td>%u</td><td>%u</td><td>%c %c</td></tr>\r\n",
+		 htons(conn->lport),
+		 htons(conn->ripaddr[0]) >> 8,
+		 htons(conn->ripaddr[0]) & 0xff,
+		 htons(conn->ripaddr[1]) >> 8,
+		 htons(conn->ripaddr[1]) & 0xff,
+		 htons(conn->rport),
+		 states[conn->tcpstateflags & UIP_TS_MASK],
+		 conn->nrtx,
+		 conn->timer,
+		 (uip_outstanding(conn))? '*':' ',
+		 (uip_stopped(conn))? '!':' ');
+}
+/*---------------------------------------------------------------------------*/
+static
+PT_THREAD(tcp_stats(struct httpd_state *s, char *ptr))
+{
+  
+  PSOCK_BEGIN(&s->sout);
+
+  for(s->count = 0; s->count < UIP_CONNS; ++s->count) {
+    if((uip_conns[s->count].tcpstateflags & UIP_TS_MASK) != UIP_CLOSED) {
+      PSOCK_GENERATOR_SEND(&s->sout, generate_tcp_stats, s);
+    }
+  }
+
+  PSOCK_END(&s->sout);
+}
+/*---------------------------------------------------------------------------*/
+static unsigned short
+generate_net_stats(void *arg)
+{
+  struct httpd_state *s = (struct httpd_state *)arg;
+  return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE,
+		  "%5u\n", ((uip_stats_t *)&uip_stat)[s->count]);
+}
+
+static
+PT_THREAD(net_stats(struct httpd_state *s, char *ptr))
+{
+  PSOCK_BEGIN(&s->sout);
+
+#if UIP_STATISTICS
+
+  for(s->count = 0; s->count < sizeof(uip_stat) / sizeof(uip_stats_t);
+      ++s->count) {
+    PSOCK_GENERATOR_SEND(&s->sout, generate_net_stats, s);
+  }
+  
+#endif /* UIP_STATISTICS */
+  
+  PSOCK_END(&s->sout);
+}
+/*---------------------------------------------------------------------------*/
+/** @} */

+ 84 - 0
components/net/uip/apps/webserver/httpd-cgi.h

@@ -0,0 +1,84 @@
+/**
+ * \addtogroup httpd
+ * @{
+ */
+
+/**
+ * \file
+ *         Web server script interface header file
+ * \author
+ *         Adam Dunkels <adam@sics.se>
+ *
+ */
+
+
+
+/*
+ * Copyright (c) 2001, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack.
+ *
+ * $Id: httpd-cgi.h,v 1.2 2006/06/11 21:46:38 adam Exp $
+ *
+ */
+
+#ifndef __HTTPD_CGI_H__
+#define __HTTPD_CGI_H__
+
+#include "psock.h"
+#include "httpd.h"
+
+typedef PT_THREAD((* httpd_cgifunction)(struct httpd_state *, char *));
+
+httpd_cgifunction httpd_cgi(char *name);
+
+struct httpd_cgi_call {
+  const char *name;
+  const httpd_cgifunction function;
+};
+
+/**
+ * \brief      HTTPD CGI function declaration
+ * \param name The C variable name of the function
+ * \param str  The string name of the function, used in the script file
+ * \param function A pointer to the function that implements it
+ *
+ *             This macro is used for declaring a HTTPD CGI
+ *             function. This function is then added to the list of
+ *             HTTPD CGI functions with the httpd_cgi_add() function.
+ *
+ * \hideinitializer
+ */
+#define HTTPD_CGI_CALL(name, str, function) \
+static PT_THREAD(function(struct httpd_state *, char *)); \
+static const struct httpd_cgi_call name = {str, function}
+
+void httpd_cgi_init(void);
+#endif /* __HTTPD_CGI_H__ */
+
+/** @} */

+ 132 - 0
components/net/uip/apps/webserver/httpd-fs.c

@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2001, Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the Institute nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Adam Dunkels <adam@sics.se>
+ *
+ * $Id: httpd-fs.c,v 1.1 2006/06/07 09:13:08 adam Exp $
+ */
+
+#include "httpd.h"
+#include "httpd-fs.h"
+#include "httpd-fsdata.h"
+
+#ifndef NULL
+#define NULL 0
+#endif /* NULL */
+
+#include "httpd-fsdata.c"
+
+#if HTTPD_FS_STATISTICS
+static u16_t count[HTTPD_FS_NUMFILES];
+#endif /* HTTPD_FS_STATISTICS */
+
+/*-----------------------------------------------------------------------------------*/
+static u8_t
+httpd_fs_strcmp(const char *str1, const char *str2)
+{
+  u8_t i;
+  i = 0;
+ loop:
+
+  if(str2[i] == 0 ||
+     str1[i] == '\r' ||
+     str1[i] == '\n') {
+    return 0;
+  }
+
+  if(str1[i] != str2[i]) {
+    return 1;
+  }
+
+
+  ++i;
+  goto loop;
+}
+/*-----------------------------------------------------------------------------------*/
+int
+httpd_fs_open(const char *name, struct httpd_fs_file *file)
+{
+#if HTTPD_FS_STATISTICS
+  u16_t i = 0;
+#endif /* HTTPD_FS_STATISTICS */
+  struct httpd_fsdata_file_noconst *f;
+
+  for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT;
+      f != NULL;
+      f = (struct httpd_fsdata_file_noconst *)f->next) {
+
+    if(httpd_fs_strcmp(name, f->name) == 0) {
+      file->data = f->data;
+      file->len = f->len;
+#if HTTPD_FS_STATISTICS
+      ++count[i];
+#endif /* HTTPD_FS_STATISTICS */
+      return 1;
+    }
+#if HTTPD_FS_STATISTICS
+    ++i;
+#endif /* HTTPD_FS_STATISTICS */
+
+  }
+  return 0;
+}
+/*-----------------------------------------------------------------------------------*/
+void
+httpd_fs_init(void)
+{
+#if HTTPD_FS_STATISTICS
+  u16_t i;
+  for(i = 0; i < HTTPD_FS_NUMFILES; i++) {
+    count[i] = 0;
+  }
+#endif /* HTTPD_FS_STATISTICS */
+}
+/*-----------------------------------------------------------------------------------*/
+#if HTTPD_FS_STATISTICS
+u16_t httpd_fs_count
+(char *name)
+{
+  struct httpd_fsdata_file_noconst *f;
+  u16_t i;
+
+  i = 0;
+  for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT;
+      f != NULL;
+      f = (struct httpd_fsdata_file_noconst *)f->next) {
+
+    if(httpd_fs_strcmp(name, f->name) == 0) {
+      return count[i];
+    }
+    ++i;
+  }
+  return 0;
+}
+#endif /* HTTPD_FS_STATISTICS */
+/*-----------------------------------------------------------------------------------*/

+ 57 - 0
components/net/uip/apps/webserver/httpd-fs.h

@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2001, Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the Institute nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Adam Dunkels <adam@sics.se>
+ *
+ * $Id: httpd-fs.h,v 1.1 2006/06/07 09:13:08 adam Exp $
+ */
+#ifndef __HTTPD_FS_H__
+#define __HTTPD_FS_H__
+
+#define HTTPD_FS_STATISTICS 1
+
+struct httpd_fs_file {
+  char *data;
+  int len;
+};
+
+/* file must be allocated by caller and will be filled in
+   by the function. */
+int httpd_fs_open(const char *name, struct httpd_fs_file *file);
+
+#ifdef HTTPD_FS_STATISTICS
+#if HTTPD_FS_STATISTICS == 1
+u16_t httpd_fs_count(char *name);
+#endif /* HTTPD_FS_STATISTICS */
+#endif /* HTTPD_FS_STATISTICS */
+
+void httpd_fs_init(void);
+
+#endif /* __HTTPD_FS_H__ */

+ 8 - 0
components/net/uip/apps/webserver/httpd-fs/404.html

@@ -0,0 +1,8 @@
+<html>
+  <body bgcolor="white">
+    <center>
+      <h1>404 - file not found</h1>
+      <h3>Go <a href="/">here</a> instead.</h3>
+    </center>
+  </body>
+</html>

BIN=BIN
components/net/uip/apps/webserver/httpd-fs/fade.png


+ 35 - 0
components/net/uip/apps/webserver/httpd-fs/files.shtml

@@ -0,0 +1,35 @@
+%!: /header.html
+<h1>File statistics</h1>
+<center>
+<table width="300">
+<tr><td><a href="/index.html">/index.html</a></td>
+<td>%! file-stats /index.html
+</td><td><img src="/fade.png" height=10 width=%! file-stats /index.html
+> </td></tr>
+<tr><td><a href="/files.shtml">/files.shtml</a></td>
+<td>%! file-stats /files.shtml
+</td><td><img src="/fade.png" height=10 width=%! file-stats /files.shtml
+> </td></tr>
+<tr><td><a href="/tcp.shtml">/tcp.shtml</a></td>
+<td>%! file-stats /tcp.shtml
+</td><td><img src="/fade.png" height=10 width=%! file-stats /tcp.shtml
+> </td></tr>
+<tr><td><a href="/stats.shtml">/stats.shtml</a></td>
+<td>%! file-stats /stats.shtml
+</td><td><img src="/fade.png" height=10 width=%! file-stats /stats.shtml
+> </td></tr>
+<tr><td><a href="/style.css">/style.css</a></td>
+<td>%! file-stats /style.css
+</td><td><img src="/fade.png" height=10 width=%! file-stats /style.css
+> </td></tr>
+<tr><td><a href="/404.html">/404.html</a></td>
+<td>%! file-stats /404.html
+</td><td><img src="/fade.png" height=10 width=%! file-stats /404.html
+> </td></tr>
+<tr><td><a href="/fade.png">/fade.png</a></td>
+<td>%! file-stats /fade.png
+</td><td><img src="/fade.png" height=10 width=%! file-stats /fade.png
+> </td></tr>
+</table>
+</center>
+%!: /footer.html

+ 2 - 0
components/net/uip/apps/webserver/httpd-fs/footer.html

@@ -0,0 +1,2 @@
+  </body>
+</html>

+ 18 - 0
components/net/uip/apps/webserver/httpd-fs/header.html

@@ -0,0 +1,18 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+  <head>
+    <title>Welcome to the uIP web server!</title>
+    <link rel="stylesheet" type="text/css" href="style.css">  
+  </head>
+  <body bgcolor="#fffeec" text="black">
+
+  <div class="menu">
+  <div class="menubox"><a href="/">Front page</a></div>
+  <div class="menubox"><a href="files.shtml">File statistics</a></div>
+  <div class="menubox"><a href="stats.shtml">Network statistics</a></div>
+  <div class="menubox"><a href="tcp.shtml">Network
+  connections</a></div>
+  <br>
+  </div>
+  
+  <div class="contentblock">

+ 29 - 0
components/net/uip/apps/webserver/httpd-fs/index.html

@@ -0,0 +1,29 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+  <head>
+    <title>Welcome to the uIP web server!</title>
+    <link rel="stylesheet" type="text/css" href="style.css">  
+  </head>
+  <body bgcolor="#fffeec" text="black">
+
+  <div class="menu">
+  <div class="menubox"><a href="/">Front page</a></div>
+  <div class="menubox"><a href="files.shtml">File statistics</a></div>
+  <div class="menubox"><a href="stats.shtml">Network statistics</a></div>
+  <div class="menubox"><a href="tcp.shtml">Network
+  connections</a></div>
+  <br>
+  </div>
+
+  <div class="contentblock">
+  <p>
+  These web pages are served by a small web server running on top of
+  the <a href="http://www.sics.se/~adam/uip/">uIP embedded TCP/IP
+  stack</a>.
+  </p>
+  <p>
+  Click on the links above for web server statistics.
+  </p>
+
+  </body>
+</html>

+ 5 - 0
components/net/uip/apps/webserver/httpd-fs/processes.shtml

@@ -0,0 +1,5 @@
+%!: /header.html
+<h1>System processes</h1><br><table width="100%">
+<tr><th>ID</th><th>Name</th><th>Priority</th><th>Poll handler</th><th>Event handler</th><th>Procstate</th></tr>
+%! processes
+%!: /footer.html

+ 31 - 0
components/net/uip/apps/webserver/httpd-fs/stats.shtml

@@ -0,0 +1,31 @@
+%!: /header.html
+<h1>Network statistics</h1>
+<center>
+<table width="300" border="0">
+<tr><td><pre>
+IP           Packets received
+             Packets sent
+	     Packets dropped
+IP errors    IP version/header length
+             IP length, high byte
+             IP length, low byte
+             IP fragments
+             Header checksum
+             Wrong protocol
+ICMP	     Packets received
+             Packets sent
+             Packets dropped
+             Type errors
+TCP          Packets received
+             Packets sent
+             Packets dropped
+             Checksum errors
+             Data packets without ACKs
+             Resets
+             Retransmissions
+	     No connection avaliable
+	     Connection attempts to closed ports
+</pre></td><td><pre>%! net-stats
+</pre></table>
+</center>
+%!: /footer.html

+ 92 - 0
components/net/uip/apps/webserver/httpd-fs/style.css

@@ -0,0 +1,92 @@
+h1 
+{
+  text-align: center;
+  font-size:14pt;
+  font-family:arial,helvetica;
+  font-weight:bold;
+  padding:10px; 
+}
+
+body
+{
+
+  background-color: #fffeec;
+  color:black;
+
+  font-size:8pt;
+  font-family:arial,helvetica;
+}
+
+.menu
+{
+  margin: 4px;
+  width:60%;
+
+  padding:2px;
+	
+  border: solid 1px;
+  background-color: #fffcd2;
+  text-align:left;
+  
+  font-size:9pt;
+  font-family:arial,helvetica;  
+}
+
+div.menubox
+{
+  width: 25%;
+  border: 0;
+  float: left;
+text-align: center;
+}
+
+.contentblock
+{  
+  margin: 4px;
+  width:60%;
+
+  padding:2px;
+
+  border: 1px dotted;
+  background-color: white;
+
+  font-size:8pt;
+  font-family:arial,helvetica;  
+
+}
+
+p.intro
+{
+  margin-left:20px;
+  margin-right:20px;
+
+  font-size:10pt;
+/*  font-weight:bold; */
+  font-family:arial,helvetica;  
+}
+
+p.clink
+{
+  font-size:12pt;
+  font-family:courier,monospace;  
+  text-align:center;
+}
+
+p.clink9
+{
+  font-size:9pt;
+  font-family:courier,monospace;  
+  text-align:center;
+}
+
+
+p
+{
+  padding-left:10px;
+}
+
+p.right
+{
+  text-align:right; 
+}
+

+ 5 - 0
components/net/uip/apps/webserver/httpd-fs/tcp.shtml

@@ -0,0 +1,5 @@
+%!: /header.html
+<h1>Current connections</h1><br><table width="100%">
+<tr><th>Local</th><th>Remote</th><th>State</th><th>Retransmissions</th><th>Timer</th><th>Flags</th></tr>
+%! tcp-connections
+%!: /footer.html

+ 607 - 0
components/net/uip/apps/webserver/httpd-fsdata.c

@@ -0,0 +1,607 @@
+static const unsigned char data_processes_shtml[] = {
+	/* /processes.shtml */
+	0x2f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0,
+	0x25, 0x21, 0x3a, 0x20, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 
+	0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0xa, 0x3c, 0x68, 0x31, 
+	0x3e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x70, 0x72, 
+	0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x3c, 0x2f, 0x68, 
+	0x31, 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x74, 0x61, 0x62, 
+	0x6c, 0x65, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 
+	0x31, 0x30, 0x30, 0x25, 0x22, 0x3e, 0xa, 0x3c, 0x74, 0x72, 
+	0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x49, 0x44, 0x3c, 0x2f, 0x74, 
+	0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x4e, 0x61, 0x6d, 0x65, 
+	0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x50, 
+	0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74, 
+	0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x50, 0x6f, 0x6c, 0x6c, 
+	0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x3c, 0x2f, 
+	0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x45, 0x76, 0x65, 
+	0x6e, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 
+	0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x50, 
+	0x72, 0x6f, 0x63, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3c, 0x2f, 
+	0x74, 0x68, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xa, 0x25, 
+	0x21, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 
+	0x73, 0xa, 0x25, 0x21, 0x3a, 0x20, 0x2f, 0x66, 0x6f, 0x6f, 
+	0x74, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0};
+
+static const unsigned char data_404_html[] = {
+	/* /404.html */
+	0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0,
+	0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, 0x20, 0x20, 0x3c, 
+	0x62, 0x6f, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 
+	0x6f, 0x72, 0x3d, 0x22, 0x77, 0x68, 0x69, 0x74, 0x65, 0x22, 
+	0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x63, 0x65, 0x6e, 
+	0x74, 0x65, 0x72, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x3c, 0x68, 0x31, 0x3e, 0x34, 0x30, 0x34, 0x20, 0x2d, 
+	0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 
+	0x66, 0x6f, 0x75, 0x6e, 0x64, 0x3c, 0x2f, 0x68, 0x31, 0x3e, 
+	0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x68, 0x33, 
+	0x3e, 0x47, 0x6f, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 
+	0x66, 0x3d, 0x22, 0x2f, 0x22, 0x3e, 0x68, 0x65, 0x72, 0x65, 
+	0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 
+	0x61, 0x64, 0x2e, 0x3c, 0x2f, 0x68, 0x33, 0x3e, 0xa, 0x20, 
+	0x20, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x65, 0x6e, 0x74, 0x65, 
+	0x72, 0x3e, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 
+	0x79, 0x3e, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 
+0};
+
+static const unsigned char data_files_shtml[] = {
+	/* /files.shtml */
+	0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0,
+	0x25, 0x21, 0x3a, 0x20, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 
+	0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0xa, 0x3c, 0x68, 0x31, 
+	0x3e, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 
+	0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x68, 0x31, 
+	0x3e, 0xa, 0x3c, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 
+	0xa, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 
+	0x64, 0x74, 0x68, 0x3d, 0x22, 0x33, 0x30, 0x30, 0x22, 0x3e, 
+	0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 
+	0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x69, 
+	0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x22, 
+	0x3e, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 
+	0x6d, 0x6c, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 
+	0x3e, 0xa, 0x3c, 0x74, 0x64, 0x3e, 0x25, 0x21, 0x20, 0x66, 
+	0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 
+	0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 
+	0x6c, 0xa, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 
+	0x3e, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, 
+	0x22, 0x2f, 0x66, 0x61, 0x64, 0x65, 0x2e, 0x70, 0x6e, 0x67, 
+	0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x31, 
+	0x30, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x25, 0x21, 
+	0x20, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x61, 0x74, 
+	0x73, 0x20, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 
+	0x74, 0x6d, 0x6c, 0xa, 0x3e, 0x20, 0x3c, 0x2f, 0x74, 0x64, 
+	0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xa, 0x3c, 0x74, 0x72, 
+	0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 
+	0x65, 0x66, 0x3d, 0x22, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 
+	0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x2f, 0x66, 
+	0x69, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 
+	0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0xa, 
+	0x3c, 0x74, 0x64, 0x3e, 0x25, 0x21, 0x20, 0x66, 0x69, 0x6c, 
+	0x65, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x2f, 0x66, 
+	0x69, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 
+	0xa, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 
+	0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 
+	0x2f, 0x66, 0x61, 0x64, 0x65, 0x2e, 0x70, 0x6e, 0x67, 0x22, 
+	0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x31, 0x30, 
+	0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x25, 0x21, 0x20, 
+	0x66, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x73, 
+	0x20, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x68, 
+	0x74, 0x6d, 0x6c, 0xa, 0x3e, 0x20, 0x3c, 0x2f, 0x74, 0x64, 
+	0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xa, 0x3c, 0x74, 0x72, 
+	0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 
+	0x65, 0x66, 0x3d, 0x22, 0x2f, 0x74, 0x63, 0x70, 0x2e, 0x73, 
+	0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x2f, 0x74, 0x63, 0x70, 
+	0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x3c, 0x2f, 0x61, 0x3e, 
+	0x3c, 0x2f, 0x74, 0x64, 0x3e, 0xa, 0x3c, 0x74, 0x64, 0x3e, 
+	0x25, 0x21, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 
+	0x61, 0x74, 0x73, 0x20, 0x2f, 0x74, 0x63, 0x70, 0x2e, 0x73, 
+	0x68, 0x74, 0x6d, 0x6c, 0xa, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 
+	0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 
+	0x72, 0x63, 0x3d, 0x22, 0x2f, 0x66, 0x61, 0x64, 0x65, 0x2e, 
+	0x70, 0x6e, 0x67, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 
+	0x74, 0x3d, 0x31, 0x30, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 
+	0x3d, 0x25, 0x21, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x73, 
+	0x74, 0x61, 0x74, 0x73, 0x20, 0x2f, 0x74, 0x63, 0x70, 0x2e, 
+	0x73, 0x68, 0x74, 0x6d, 0x6c, 0xa, 0x3e, 0x20, 0x3c, 0x2f, 
+	0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xa, 0x3c, 
+	0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x61, 0x20, 
+	0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x73, 0x74, 0x61, 
+	0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 
+	0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 
+	0x6d, 0x6c, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 
+	0x3e, 0xa, 0x3c, 0x74, 0x64, 0x3e, 0x25, 0x21, 0x20, 0x66, 
+	0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 
+	0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 
+	0x6d, 0x6c, 0xa, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 
+	0x64, 0x3e, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, 
+	0x3d, 0x22, 0x2f, 0x66, 0x61, 0x64, 0x65, 0x2e, 0x70, 0x6e, 
+	0x67, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 
+	0x31, 0x30, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x25, 
+	0x21, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x61, 
+	0x74, 0x73, 0x20, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 
+	0x73, 0x68, 0x74, 0x6d, 0x6c, 0xa, 0x3e, 0x20, 0x3c, 0x2f, 
+	0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xa, 0x3c, 
+	0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x61, 0x20, 
+	0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x73, 0x74, 0x79, 
+	0x6c, 0x65, 0x2e, 0x63, 0x73, 0x73, 0x22, 0x3e, 0x2f, 0x73, 
+	0x74, 0x79, 0x6c, 0x65, 0x2e, 0x63, 0x73, 0x73, 0x3c, 0x2f, 
+	0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0xa, 0x3c, 0x74, 
+	0x64, 0x3e, 0x25, 0x21, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2d, 
+	0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x2f, 0x73, 0x74, 0x79, 
+	0x6c, 0x65, 0x2e, 0x63, 0x73, 0x73, 0xa, 0x3c, 0x2f, 0x74, 
+	0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x69, 0x6d, 0x67, 
+	0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x2f, 0x66, 0x61, 0x64, 
+	0x65, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x20, 0x68, 0x65, 0x69, 
+	0x67, 0x68, 0x74, 0x3d, 0x31, 0x30, 0x20, 0x77, 0x69, 0x64, 
+	0x74, 0x68, 0x3d, 0x25, 0x21, 0x20, 0x66, 0x69, 0x6c, 0x65, 
+	0x2d, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x2f, 0x73, 0x74, 
+	0x79, 0x6c, 0x65, 0x2e, 0x63, 0x73, 0x73, 0xa, 0x3e, 0x20, 
+	0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 
+	0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 
+	0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x34, 
+	0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x2f, 
+	0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3c, 0x2f, 
+	0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0xa, 0x3c, 0x74, 
+	0x64, 0x3e, 0x25, 0x21, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2d, 
+	0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x2f, 0x34, 0x30, 0x34, 
+	0x2e, 0x68, 0x74, 0x6d, 0x6c, 0xa, 0x3c, 0x2f, 0x74, 0x64, 
+	0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x69, 0x6d, 0x67, 0x20, 
+	0x73, 0x72, 0x63, 0x3d, 0x22, 0x2f, 0x66, 0x61, 0x64, 0x65, 
+	0x2e, 0x70, 0x6e, 0x67, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 
+	0x68, 0x74, 0x3d, 0x31, 0x30, 0x20, 0x77, 0x69, 0x64, 0x74, 
+	0x68, 0x3d, 0x25, 0x21, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2d, 
+	0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x2f, 0x34, 0x30, 0x34, 
+	0x2e, 0x68, 0x74, 0x6d, 0x6c, 0xa, 0x3e, 0x20, 0x3c, 0x2f, 
+	0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xa, 0x3c, 
+	0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x61, 0x20, 
+	0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x66, 0x61, 0x64, 
+	0x65, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x3e, 0x2f, 0x66, 0x61, 
+	0x64, 0x65, 0x2e, 0x70, 0x6e, 0x67, 0x3c, 0x2f, 0x61, 0x3e, 
+	0x3c, 0x2f, 0x74, 0x64, 0x3e, 0xa, 0x3c, 0x74, 0x64, 0x3e, 
+	0x25, 0x21, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 
+	0x61, 0x74, 0x73, 0x20, 0x2f, 0x66, 0x61, 0x64, 0x65, 0x2e, 
+	0x70, 0x6e, 0x67, 0xa, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 
+	0x74, 0x64, 0x3e, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 
+	0x63, 0x3d, 0x22, 0x2f, 0x66, 0x61, 0x64, 0x65, 0x2e, 0x70, 
+	0x6e, 0x67, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 
+	0x3d, 0x31, 0x30, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 
+	0x25, 0x21, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 
+	0x61, 0x74, 0x73, 0x20, 0x2f, 0x66, 0x61, 0x64, 0x65, 0x2e, 
+	0x70, 0x6e, 0x67, 0xa, 0x3e, 0x20, 0x3c, 0x2f, 0x74, 0x64, 
+	0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xa, 0x3c, 0x2f, 0x74, 
+	0x61, 0x62, 0x6c, 0x65, 0x3e, 0xa, 0x3c, 0x2f, 0x63, 0x65, 
+	0x6e, 0x74, 0x65, 0x72, 0x3e, 0xa, 0x25, 0x21, 0x3a, 0x20, 
+	0x2f, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2e, 0x68, 0x74, 
+	0x6d, 0x6c, 0xa, 0};
+
+static const unsigned char data_footer_html[] = {
+	/* /footer.html */
+	0x2f, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0,
+	0x20, 0x20, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 
+	0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0};
+
+static const unsigned char data_header_html[] = {
+	/* /header.html */
+	0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0,
+	0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 
+	0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 
+	0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, 
+	0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, 
+	0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 
+	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, 
+	0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 
+	0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 
+	0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, 
+	0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, 
+	0x22, 0x3e, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, 
+	0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xa, 0x20, 
+	0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 
+	0x57, 0x65, 0x6c, 0x63, 0x6f, 0x6d, 0x65, 0x20, 0x74, 0x6f, 
+	0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x49, 0x50, 0x20, 0x77, 
+	0x65, 0x62, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x21, 
+	0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0xa, 0x20, 
+	0x20, 0x20, 0x20, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 
+	0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 
+	0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 
+	0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 
+	0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x74, 
+	0x79, 0x6c, 0x65, 0x2e, 0x63, 0x73, 0x73, 0x22, 0x3e, 0x20, 
+	0x20, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 
+	0x3e, 0xa, 0x20, 0x20, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 
+	0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x23, 
+	0x66, 0x66, 0x66, 0x65, 0x65, 0x63, 0x22, 0x20, 0x74, 0x65, 
+	0x78, 0x74, 0x3d, 0x22, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x22, 
+	0x3e, 0xa, 0xa, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 
+	0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, 0x6e, 
+	0x75, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 
+	0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, 
+	0x6e, 0x75, 0x62, 0x6f, 0x78, 0x22, 0x3e, 0x3c, 0x61, 0x20, 
+	0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x22, 0x3e, 0x46, 
+	0x72, 0x6f, 0x6e, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x3c, 
+	0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 
+	0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 
+	0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, 0x6e, 0x75, 0x62, 0x6f, 
+	0x78, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 
+	0x3d, 0x22, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x68, 
+	0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x46, 0x69, 0x6c, 0x65, 0x20, 
+	0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 
+	0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 
+	0xa, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 
+	0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, 0x6e, 0x75, 0x62, 
+	0x6f, 0x78, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 
+	0x66, 0x3d, 0x22, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 
+	0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x4e, 0x65, 0x74, 0x77, 
+	0x6f, 0x72, 0x6b, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 
+	0x74, 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 
+	0x64, 0x69, 0x76, 0x3e, 0xa, 0x20, 0x20, 0x3c, 0x64, 0x69, 
+	0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 
+	0x65, 0x6e, 0x75, 0x62, 0x6f, 0x78, 0x22, 0x3e, 0x3c, 0x61, 
+	0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 
+	0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x4e, 0x65, 
+	0x74, 0x77, 0x6f, 0x72, 0x6b, 0xa, 0x20, 0x20, 0x63, 0x6f, 
+	0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 
+	0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 
+	0x20, 0x20, 0x3c, 0x62, 0x72, 0x3e, 0xa, 0x20, 0x20, 0x3c, 
+	0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x20, 0x20, 0xa, 0x20, 
+	0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 
+	0x73, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 
+	0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x3e, 0xa, 0};
+
+static const unsigned char data_index_html[] = {
+	/* /index.html */
+	0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0,
+	0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 
+	0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 
+	0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, 
+	0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, 
+	0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 
+	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, 
+	0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 
+	0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 
+	0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, 
+	0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, 
+	0x22, 0x3e, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, 
+	0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xa, 0x20, 
+	0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 
+	0x57, 0x65, 0x6c, 0x63, 0x6f, 0x6d, 0x65, 0x20, 0x74, 0x6f, 
+	0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x49, 0x50, 0x20, 0x77, 
+	0x65, 0x62, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x21, 
+	0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0xa, 0x20, 
+	0x20, 0x20, 0x20, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 
+	0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 
+	0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 
+	0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 
+	0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x74, 
+	0x79, 0x6c, 0x65, 0x2e, 0x63, 0x73, 0x73, 0x22, 0x3e, 0x20, 
+	0x20, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 
+	0x3e, 0xa, 0x20, 0x20, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 
+	0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x23, 
+	0x66, 0x66, 0x66, 0x65, 0x65, 0x63, 0x22, 0x20, 0x74, 0x65, 
+	0x78, 0x74, 0x3d, 0x22, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x22, 
+	0x3e, 0xa, 0xa, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 
+	0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, 0x6e, 
+	0x75, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 
+	0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, 
+	0x6e, 0x75, 0x62, 0x6f, 0x78, 0x22, 0x3e, 0x3c, 0x61, 0x20, 
+	0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x22, 0x3e, 0x46, 
+	0x72, 0x6f, 0x6e, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x3c, 
+	0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 
+	0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 
+	0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, 0x6e, 0x75, 0x62, 0x6f, 
+	0x78, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 
+	0x3d, 0x22, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x68, 
+	0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x46, 0x69, 0x6c, 0x65, 0x20, 
+	0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 
+	0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 
+	0xa, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 
+	0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, 0x6e, 0x75, 0x62, 
+	0x6f, 0x78, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 
+	0x66, 0x3d, 0x22, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 
+	0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x4e, 0x65, 0x74, 0x77, 
+	0x6f, 0x72, 0x6b, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 
+	0x74, 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 
+	0x64, 0x69, 0x76, 0x3e, 0xa, 0x20, 0x20, 0x3c, 0x64, 0x69, 
+	0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 
+	0x65, 0x6e, 0x75, 0x62, 0x6f, 0x78, 0x22, 0x3e, 0x3c, 0x61, 
+	0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 
+	0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x4e, 0x65, 
+	0x74, 0x77, 0x6f, 0x72, 0x6b, 0xa, 0x20, 0x20, 0x63, 0x6f, 
+	0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 
+	0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 
+	0x20, 0x20, 0x3c, 0x62, 0x72, 0x3e, 0xa, 0x20, 0x20, 0x3c, 
+	0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0xa, 0x20, 0x20, 0x3c, 
+	0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 
+	0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x62, 0x6c, 
+	0x6f, 0x63, 0x6b, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x3c, 0x70, 
+	0x3e, 0xa, 0x20, 0x20, 0x54, 0x68, 0x65, 0x73, 0x65, 0x20, 
+	0x77, 0x65, 0x62, 0x20, 0x70, 0x61, 0x67, 0x65, 0x73, 0x20, 
+	0x61, 0x72, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 
+	0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x73, 0x6d, 0x61, 0x6c, 
+	0x6c, 0x20, 0x77, 0x65, 0x62, 0x20, 0x73, 0x65, 0x72, 0x76, 
+	0x65, 0x72, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 
+	0x20, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x70, 0x20, 0x6f, 0x66, 
+	0xa, 0x20, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x61, 0x20, 
+	0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 
+	0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 
+	0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 
+	0x2f, 0x75, 0x69, 0x70, 0x2f, 0x22, 0x3e, 0x75, 0x49, 0x50, 
+	0x20, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 
+	0x54, 0x43, 0x50, 0x2f, 0x49, 0x50, 0xa, 0x20, 0x20, 0x73, 
+	0x74, 0x61, 0x63, 0x6b, 0x3c, 0x2f, 0x61, 0x3e, 0x2e, 0xa, 
+	0x20, 0x20, 0x3c, 0x2f, 0x70, 0x3e, 0xa, 0x20, 0x20, 0x3c, 
+	0x70, 0x3e, 0xa, 0x20, 0x20, 0x43, 0x6c, 0x69, 0x63, 0x6b, 
+	0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 
+	0x6e, 0x6b, 0x73, 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, 
+	0x66, 0x6f, 0x72, 0x20, 0x77, 0x65, 0x62, 0x20, 0x73, 0x65, 
+	0x72, 0x76, 0x65, 0x72, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 
+	0x73, 0x74, 0x69, 0x63, 0x73, 0x2e, 0xa, 0x20, 0x20, 0x3c, 
+	0x2f, 0x70, 0x3e, 0xa, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x62, 
+	0x6f, 0x64, 0x79, 0x3e, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 
+	0x6c, 0x3e, 0xa, 0};
+
+static const unsigned char data_style_css[] = {
+	/* /style.css */
+	0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2e, 0x63, 0x73, 0x73, 0,
+	0x68, 0x31, 0x20, 0xa, 0x7b, 0xa, 0x20, 0x20, 0x74, 0x65, 
+	0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, 
+	0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0xa, 0x20, 0x20, 
+	0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 
+	0x31, 0x34, 0x70, 0x74, 0x3b, 0xa, 0x20, 0x20, 0x66, 0x6f, 
+	0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 
+	0x61, 0x72, 0x69, 0x61, 0x6c, 0x2c, 0x68, 0x65, 0x6c, 0x76, 
+	0x65, 0x74, 0x69, 0x63, 0x61, 0x3b, 0xa, 0x20, 0x20, 0x66, 
+	0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 
+	0x3a, 0x62, 0x6f, 0x6c, 0x64, 0x3b, 0xa, 0x20, 0x20, 0x70, 
+	0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x31, 0x30, 0x70, 
+	0x78, 0x3b, 0x20, 0xa, 0x7d, 0xa, 0xa, 0x62, 0x6f, 0x64, 
+	0x79, 0xa, 0x7b, 0xa, 0xa, 0x20, 0x20, 0x62, 0x61, 0x63, 
+	0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 
+	0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x66, 0x66, 0x66, 0x65, 
+	0x65, 0x63, 0x3b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 
+	0x72, 0x3a, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x3b, 0xa, 0xa, 
+	0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 
+	0x65, 0x3a, 0x38, 0x70, 0x74, 0x3b, 0xa, 0x20, 0x20, 0x66, 
+	0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 
+	0x3a, 0x61, 0x72, 0x69, 0x61, 0x6c, 0x2c, 0x68, 0x65, 0x6c, 
+	0x76, 0x65, 0x74, 0x69, 0x63, 0x61, 0x3b, 0xa, 0x7d, 0xa, 
+	0xa, 0x2e, 0x6d, 0x65, 0x6e, 0x75, 0xa, 0x7b, 0xa, 0x20, 
+	0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x34, 
+	0x70, 0x78, 0x3b, 0xa, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 
+	0x68, 0x3a, 0x36, 0x30, 0x25, 0x3b, 0xa, 0xa, 0x20, 0x20, 
+	0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x32, 0x70, 
+	0x78, 0x3b, 0xa, 0x9, 0xa, 0x20, 0x20, 0x62, 0x6f, 0x72, 
+	0x64, 0x65, 0x72, 0x3a, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 
+	0x20, 0x31, 0x70, 0x78, 0x3b, 0xa, 0x20, 0x20, 0x62, 0x61, 
+	0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 
+	0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x66, 0x66, 0x66, 
+	0x63, 0x64, 0x32, 0x3b, 0xa, 0x20, 0x20, 0x74, 0x65, 0x78, 
+	0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x6c, 0x65, 
+	0x66, 0x74, 0x3b, 0xa, 0x20, 0x20, 0xa, 0x20, 0x20, 0x66, 
+	0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x39, 
+	0x70, 0x74, 0x3b, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 
+	0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x61, 0x72, 
+	0x69, 0x61, 0x6c, 0x2c, 0x68, 0x65, 0x6c, 0x76, 0x65, 0x74, 
+	0x69, 0x63, 0x61, 0x3b, 0x20, 0x20, 0xa, 0x7d, 0xa, 0xa, 
+	0x64, 0x69, 0x76, 0x2e, 0x6d, 0x65, 0x6e, 0x75, 0x62, 0x6f, 
+	0x78, 0xa, 0x7b, 0xa, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 
+	0x68, 0x3a, 0x20, 0x32, 0x35, 0x25, 0x3b, 0xa, 0x20, 0x20, 
+	0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x30, 0x3b, 
+	0xa, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x20, 
+	0x6c, 0x65, 0x66, 0x74, 0x3b, 0xa, 0x74, 0x65, 0x78, 0x74, 
+	0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x63, 0x65, 
+	0x6e, 0x74, 0x65, 0x72, 0x3b, 0xa, 0x7d, 0xa, 0xa, 0x2e, 
+	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x62, 0x6c, 0x6f, 
+	0x63, 0x6b, 0xa, 0x7b, 0x20, 0x20, 0xa, 0x20, 0x20, 0x6d, 
+	0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x34, 0x70, 0x78, 
+	0x3b, 0xa, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 
+	0x36, 0x30, 0x25, 0x3b, 0xa, 0xa, 0x20, 0x20, 0x70, 0x61, 
+	0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x32, 0x70, 0x78, 0x3b, 
+	0xa, 0xa, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 
+	0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x64, 0x6f, 0x74, 0x74, 
+	0x65, 0x64, 0x3b, 0xa, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 
+	0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 
+	0x6f, 0x72, 0x3a, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x3b, 
+	0xa, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 
+	0x69, 0x7a, 0x65, 0x3a, 0x38, 0x70, 0x74, 0x3b, 0xa, 0x20, 
+	0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 
+	0x6c, 0x79, 0x3a, 0x61, 0x72, 0x69, 0x61, 0x6c, 0x2c, 0x68, 
+	0x65, 0x6c, 0x76, 0x65, 0x74, 0x69, 0x63, 0x61, 0x3b, 0x20, 
+	0x20, 0xa, 0xa, 0x7d, 0xa, 0xa, 0x70, 0x2e, 0x69, 0x6e, 
+	0x74, 0x72, 0x6f, 0xa, 0x7b, 0xa, 0x20, 0x20, 0x6d, 0x61, 
+	0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 
+	0x32, 0x30, 0x70, 0x78, 0x3b, 0xa, 0x20, 0x20, 0x6d, 0x61, 
+	0x72, 0x67, 0x69, 0x6e, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 
+	0x3a, 0x32, 0x30, 0x70, 0x78, 0x3b, 0xa, 0xa, 0x20, 0x20, 
+	0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 
+	0x31, 0x30, 0x70, 0x74, 0x3b, 0xa, 0x2f, 0x2a, 0x20, 0x20, 
+	0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 
+	0x74, 0x3a, 0x62, 0x6f, 0x6c, 0x64, 0x3b, 0x20, 0x2a, 0x2f, 
+	0xa, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 
+	0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x61, 0x72, 0x69, 0x61, 0x6c, 
+	0x2c, 0x68, 0x65, 0x6c, 0x76, 0x65, 0x74, 0x69, 0x63, 0x61, 
+	0x3b, 0x20, 0x20, 0xa, 0x7d, 0xa, 0xa, 0x70, 0x2e, 0x63, 
+	0x6c, 0x69, 0x6e, 0x6b, 0xa, 0x7b, 0xa, 0x20, 0x20, 0x66, 
+	0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 
+	0x32, 0x70, 0x74, 0x3b, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x6e, 
+	0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x63, 
+	0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x2c, 0x6d, 0x6f, 0x6e, 
+	0x6f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3b, 0x20, 0x20, 0xa, 
+	0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 
+	0x67, 0x6e, 0x3a, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 
+	0xa, 0x7d, 0xa, 0xa, 0x70, 0x2e, 0x63, 0x6c, 0x69, 0x6e, 
+	0x6b, 0x39, 0xa, 0x7b, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x6e, 
+	0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x39, 0x70, 0x74, 
+	0x3b, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 
+	0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x63, 0x6f, 0x75, 0x72, 
+	0x69, 0x65, 0x72, 0x2c, 0x6d, 0x6f, 0x6e, 0x6f, 0x73, 0x70, 
+	0x61, 0x63, 0x65, 0x3b, 0x20, 0x20, 0xa, 0x20, 0x20, 0x74, 
+	0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 
+	0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0xa, 0x7d, 0xa, 
+	0xa, 0xa, 0x70, 0xa, 0x7b, 0xa, 0x20, 0x20, 0x70, 0x61, 
+	0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x6c, 0x65, 0x66, 0x74, 
+	0x3a, 0x31, 0x30, 0x70, 0x78, 0x3b, 0xa, 0x7d, 0xa, 0xa, 
+	0x70, 0x2e, 0x72, 0x69, 0x67, 0x68, 0x74, 0xa, 0x7b, 0xa, 
+	0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 
+	0x67, 0x6e, 0x3a, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x20, 
+	0xa, 0x7d, 0xa, 0xa, 0};
+
+static const unsigned char data_tcp_shtml[] = {
+	/* /tcp.shtml */
+	0x2f, 0x74, 0x63, 0x70, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0,
+	0x25, 0x21, 0x3a, 0x20, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 
+	0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0xa, 0x3c, 0x68, 0x31, 
+	0x3e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x63, 
+	0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 
+	0x3c, 0x2f, 0x68, 0x31, 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 
+	0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x64, 0x74, 
+	0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x25, 0x22, 0x3e, 0xa, 
+	0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x4c, 0x6f, 
+	0x63, 0x61, 0x6c, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 
+	0x68, 0x3e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x3c, 0x2f, 
+	0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x53, 0x74, 0x61, 
+	0x74, 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 
+	0x3e, 0x52, 0x65, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 
+	0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x74, 0x68, 
+	0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x54, 0x69, 0x6d, 0x65, 0x72, 
+	0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x46, 
+	0x6c, 0x61, 0x67, 0x73, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 
+	0x2f, 0x74, 0x72, 0x3e, 0xa, 0x25, 0x21, 0x20, 0x74, 0x63, 
+	0x70, 0x2d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 
+	0x6f, 0x6e, 0x73, 0xa, 0x25, 0x21, 0x3a, 0x20, 0x2f, 0x66, 
+	0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 
+0};
+
+static const unsigned char data_fade_png[] = {
+	/* /fade.png */
+	0x2f, 0x66, 0x61, 0x64, 0x65, 0x2e, 0x70, 0x6e, 0x67, 0,
+	0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 00, 00, 
+	00, 0xd, 0x49, 0x48, 0x44, 0x52, 00, 00, 00, 0x4, 
+	00, 00, 00, 0xa, 0x8, 0x2, 00, 00, 00, 0x1c, 
+	0x99, 0x68, 0x59, 00, 00, 00, 0x9, 0x70, 0x48, 0x59, 
+	0x73, 00, 00, 0xb, 0x13, 00, 00, 0xb, 0x13, 0x1, 
+	00, 0x9a, 0x9c, 0x18, 00, 00, 00, 0x7, 0x74, 0x49, 
+	0x4d, 0x45, 0x7, 0xd6, 0x6, 0x8, 0x14, 0x1b, 0x39, 0xaf, 
+	0x5b, 0xc0, 0xe3, 00, 00, 00, 0x1d, 0x74, 0x45, 0x58, 
+	0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 00, 0x43, 
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 
+	0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, 
+	0xef, 0x64, 0x25, 0x6e, 00, 00, 00, 0x3a, 0x49, 0x44, 
+	0x41, 0x54, 0x8, 0xd7, 0x75, 0x8c, 0x31, 0x12, 00, 0x10, 
+	0x10, 0xc4, 0x2e, 0x37, 0x9e, 0x40, 0x65, 0xfd, 0xff, 0x83, 
+	0xf4, 0xa, 0x1c, 0x8d, 0x54, 0x9b, 0xc9, 0xcc, 0x9a, 0x3d, 
+	0x90, 0x73, 0x71, 0x67, 0x91, 0xd4, 0x74, 0x36, 0xa9, 0x55, 
+	0x1, 0xf8, 0x29, 0x58, 0xc8, 0xbf, 0x48, 0xc4, 0x81, 0x74, 
+	0xb, 0xa3, 0xf, 0x7c, 0xdb, 0x4, 0xe8, 0x40, 0x5, 0xdf, 
+	0xa1, 0xf3, 0xfc, 0x73, 00, 00, 00, 00, 0x49, 0x45, 
+	0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0};
+
+static const unsigned char data_stats_shtml[] = {
+	/* /stats.shtml */
+	0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0,
+	0x25, 0x21, 0x3a, 0x20, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 
+	0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0xa, 0x3c, 0x68, 0x31, 
+	0x3e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x73, 
+	0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x3c, 
+	0x2f, 0x68, 0x31, 0x3e, 0xa, 0x3c, 0x63, 0x65, 0x6e, 0x74, 
+	0x65, 0x72, 0x3e, 0xa, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 
+	0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x33, 0x30, 
+	0x30, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 
+	0x22, 0x30, 0x22, 0x3e, 0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 
+	0x74, 0x64, 0x3e, 0x3c, 0x70, 0x72, 0x65, 0x3e, 0xa, 0x49, 
+	0x50, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 
+	0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0xa, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 
+	0x73, 0x65, 0x6e, 0x74, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x64, 
+	0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0xa, 0x49, 0x50, 0x20, 
+	0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x20, 0x20, 0x20, 0x20, 
+	0x49, 0x50, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 
+	0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x6c, 0x65, 
+	0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x50, 
+	0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x68, 
+	0x69, 0x67, 0x68, 0x20, 0x62, 0x79, 0x74, 0x65, 0xa, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x49, 0x50, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 
+	0x68, 0x2c, 0x20, 0x6c, 0x6f, 0x77, 0x20, 0x62, 0x79, 0x74, 
+	0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x50, 0x20, 0x66, 0x72, 
+	0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0xa, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x63, 0x68, 
+	0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0xa, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x57, 0x72, 0x6f, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f, 0x74, 
+	0x6f, 0x63, 0x6f, 0x6c, 0xa, 0x49, 0x43, 0x4d, 0x50, 0x9, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 
+	0x74, 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 
+	0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 
+	0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xa, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x64, 
+	0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0xa, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x54, 0x79, 0x70, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 
+	0x73, 0xa, 0x54, 0x43, 0x50, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 
+	0x74, 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 
+	0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 
+	0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xa, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x64, 
+	0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0xa, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x20, 0x65, 
+	0x72, 0x72, 0x6f, 0x72, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x44, 
+	0x61, 0x74, 0x61, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 
+	0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 
+	0x41, 0x43, 0x4b, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 
+	0x73, 0x65, 0x74, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 
+	0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 
+	0x6f, 0x6e, 0x73, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x4e, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 
+	0x69, 0x6f, 0x6e, 0x20, 0x61, 0x76, 0x61, 0x6c, 0x69, 0x61, 
+	0x62, 0x6c, 0x65, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 
+	0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x20, 
+	0x74, 0x6f, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x20, 
+	0x70, 0x6f, 0x72, 0x74, 0x73, 0xa, 0x3c, 0x2f, 0x70, 0x72, 
+	0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 
+	0x3e, 0x3c, 0x70, 0x72, 0x65, 0x3e, 0x25, 0x21, 0x20, 0x6e, 
+	0x65, 0x74, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x73, 0xa, 0x3c, 
+	0x2f, 0x70, 0x72, 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, 
+	0x6c, 0x65, 0x3e, 0xa, 0x3c, 0x2f, 0x63, 0x65, 0x6e, 0x74, 
+	0x65, 0x72, 0x3e, 0xa, 0x25, 0x21, 0x3a, 0x20, 0x2f, 0x66, 
+	0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 
+	0xa, 0};
+
+const struct httpd_fsdata_file file_processes_shtml[] = {{NULL, data_processes_shtml, data_processes_shtml + 17, sizeof(data_processes_shtml) - 17}};
+
+const struct httpd_fsdata_file file_404_html[] = {{file_processes_shtml, data_404_html, data_404_html + 10, sizeof(data_404_html) - 10}};
+
+const struct httpd_fsdata_file file_files_shtml[] = {{file_404_html, data_files_shtml, data_files_shtml + 13, sizeof(data_files_shtml) - 13}};
+
+const struct httpd_fsdata_file file_footer_html[] = {{file_files_shtml, data_footer_html, data_footer_html + 13, sizeof(data_footer_html) - 13}};
+
+const struct httpd_fsdata_file file_header_html[] = {{file_footer_html, data_header_html, data_header_html + 13, sizeof(data_header_html) - 13}};
+
+const struct httpd_fsdata_file file_index_html[] = {{file_header_html, data_index_html, data_index_html + 12, sizeof(data_index_html) - 12}};
+
+const struct httpd_fsdata_file file_style_css[] = {{file_index_html, data_style_css, data_style_css + 11, sizeof(data_style_css) - 11}};
+
+const struct httpd_fsdata_file file_tcp_shtml[] = {{file_style_css, data_tcp_shtml, data_tcp_shtml + 11, sizeof(data_tcp_shtml) - 11}};
+
+const struct httpd_fsdata_file file_fade_png[] = {{file_tcp_shtml, data_fade_png, data_fade_png + 10, sizeof(data_fade_png) - 10}};
+
+const struct httpd_fsdata_file file_stats_shtml[] = {{file_fade_png, data_stats_shtml, data_stats_shtml + 13, sizeof(data_stats_shtml) - 13}};
+
+#define HTTPD_FS_ROOT file_stats_shtml
+
+#define HTTPD_FS_NUMFILES 10

+ 64 - 0
components/net/uip/apps/webserver/httpd-fsdata.h

@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2001, Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the Institute nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Adam Dunkels <adam@sics.se>
+ *
+ * $Id: httpd-fsdata.h,v 1.1 2006/06/07 09:13:08 adam Exp $
+ */
+#ifndef __HTTPD_FSDATA_H__
+#define __HTTPD_FSDATA_H__
+
+#include "uip.h"
+
+struct httpd_fsdata_file {
+  const struct httpd_fsdata_file *next;
+  const char *name;
+  const char *data;
+  const int len;
+#ifdef HTTPD_FS_STATISTICS
+#if HTTPD_FS_STATISTICS == 1
+  u16_t count;
+#endif /* HTTPD_FS_STATISTICS */
+#endif /* HTTPD_FS_STATISTICS */
+};
+
+struct httpd_fsdata_file_noconst {
+  struct httpd_fsdata_file *next;
+  char *name;
+  char *data;
+  int len;
+#ifdef HTTPD_FS_STATISTICS
+#if HTTPD_FS_STATISTICS == 1
+  u16_t count;
+#endif /* HTTPD_FS_STATISTICS */
+#endif /* HTTPD_FS_STATISTICS */
+};
+
+#endif /* __HTTPD_FSDATA_H__ */

+ 338 - 0
components/net/uip/apps/webserver/httpd.c

@@ -0,0 +1,338 @@
+/**
+ * \addtogroup apps
+ * @{
+ */
+
+/**
+ * \defgroup httpd Web server
+ * @{
+ * The uIP web server is a very simplistic implementation of an HTTP
+ * server. It can serve web pages and files from a read-only ROM
+ * filesystem, and provides a very small scripting language.
+
+ */
+
+/**
+ * \file
+ *         Web server
+ * \author
+ *         Adam Dunkels <adam@sics.se>
+ */
+
+
+/*
+ * Copyright (c) 2004, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the Institute nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack.
+ *
+ * Author: Adam Dunkels <adam@sics.se>
+ *
+ * $Id: httpd.c,v 1.2 2006/06/11 21:46:38 adam Exp $
+ */
+
+#include "uip.h"
+#include "httpd.h"
+#include "httpd-fs.h"
+#include "httpd-cgi.h"
+#include "http-strings.h"
+
+#include <string.h>
+
+#define STATE_WAITING 0
+#define STATE_OUTPUT  1
+
+#define ISO_nl      0x0a
+#define ISO_space   0x20
+#define ISO_bang    0x21
+#define ISO_percent 0x25
+#define ISO_period  0x2e
+#define ISO_slash   0x2f
+#define ISO_colon   0x3a
+
+
+/*---------------------------------------------------------------------------*/
+static unsigned short
+generate_part_of_file(void *state)
+{
+  struct httpd_state *s = (struct httpd_state *)state;
+
+  if(s->file.len > uip_mss()) {
+    s->len = uip_mss();
+  } else {
+    s->len = s->file.len;
+  }
+  memcpy(uip_appdata, s->file.data, s->len);
+  
+  return s->len;
+}
+/*---------------------------------------------------------------------------*/
+static
+PT_THREAD(send_file(struct httpd_state *s))
+{
+  PSOCK_BEGIN(&s->sout);
+  
+  do {
+    PSOCK_GENERATOR_SEND(&s->sout, generate_part_of_file, s);
+    s->file.len -= s->len;
+    s->file.data += s->len;
+  } while(s->file.len > 0);
+      
+  PSOCK_END(&s->sout);
+}
+/*---------------------------------------------------------------------------*/
+static
+PT_THREAD(send_part_of_file(struct httpd_state *s))
+{
+  PSOCK_BEGIN(&s->sout);
+
+  PSOCK_SEND(&s->sout, s->file.data, s->len);
+  
+  PSOCK_END(&s->sout);
+}
+/*---------------------------------------------------------------------------*/
+static void
+next_scriptstate(struct httpd_state *s)
+{
+  char *p;
+  p = strchr(s->scriptptr, ISO_nl) + 1;
+  s->scriptlen -= (unsigned short)(p - s->scriptptr);
+  s->scriptptr = p;
+}
+/*---------------------------------------------------------------------------*/
+static
+PT_THREAD(handle_script(struct httpd_state *s))
+{
+  char *ptr;
+  
+  PT_BEGIN(&s->scriptpt);
+
+
+  while(s->file.len > 0) {
+
+    /* Check if we should start executing a script. */
+    if(*s->file.data == ISO_percent &&
+       *(s->file.data + 1) == ISO_bang) {
+      s->scriptptr = s->file.data + 3;
+      s->scriptlen = s->file.len - 3;
+      if(*(s->scriptptr - 1) == ISO_colon) {
+	httpd_fs_open(s->scriptptr + 1, &s->file);
+	PT_WAIT_THREAD(&s->scriptpt, send_file(s));
+      } else {
+	PT_WAIT_THREAD(&s->scriptpt,
+		       httpd_cgi(s->scriptptr)(s, s->scriptptr));
+      }
+      next_scriptstate(s);
+      
+      /* The script is over, so we reset the pointers and continue
+	 sending the rest of the file. */
+      s->file.data = s->scriptptr;
+      s->file.len = s->scriptlen;
+    } else {
+      /* See if we find the start of script marker in the block of HTML
+	 to be sent. */
+
+      if(s->file.len > uip_mss()) {
+	s->len = uip_mss();
+      } else {
+	s->len = s->file.len;
+      }
+
+      if(*s->file.data == ISO_percent) {
+	ptr = strchr(s->file.data + 1, ISO_percent);
+      } else {
+	ptr = strchr(s->file.data, ISO_percent);
+      }
+      if(ptr != NULL &&
+	 ptr != s->file.data) {
+	s->len = (int)(ptr - s->file.data);
+	if(s->len >= uip_mss()) {
+	  s->len = uip_mss();
+	}
+      }
+      PT_WAIT_THREAD(&s->scriptpt, send_part_of_file(s));
+      s->file.data += s->len;
+      s->file.len -= s->len;
+      
+    }
+  }
+  
+  PT_END(&s->scriptpt);
+}
+/*---------------------------------------------------------------------------*/
+static
+PT_THREAD(send_headers(struct httpd_state *s, const char *statushdr))
+{
+  char *ptr;
+
+  PSOCK_BEGIN(&s->sout);
+
+  PSOCK_SEND_STR(&s->sout, statushdr);
+
+  ptr = strrchr(s->filename, ISO_period);
+  if(ptr == NULL) {
+    PSOCK_SEND_STR(&s->sout, http_content_type_binary);
+  } else if(strncmp(http_html, ptr, 5) == 0 ||
+	    strncmp(http_shtml, ptr, 6) == 0) {
+    PSOCK_SEND_STR(&s->sout, http_content_type_html);
+  } else if(strncmp(http_css, ptr, 4) == 0) {
+    PSOCK_SEND_STR(&s->sout, http_content_type_css);
+  } else if(strncmp(http_png, ptr, 4) == 0) {
+    PSOCK_SEND_STR(&s->sout, http_content_type_png);
+  } else if(strncmp(http_gif, ptr, 4) == 0) {
+    PSOCK_SEND_STR(&s->sout, http_content_type_gif);
+  } else if(strncmp(http_jpg, ptr, 4) == 0) {
+    PSOCK_SEND_STR(&s->sout, http_content_type_jpg);
+  } else {
+    PSOCK_SEND_STR(&s->sout, http_content_type_plain);
+  }
+  PSOCK_END(&s->sout);
+}
+/*---------------------------------------------------------------------------*/
+static
+PT_THREAD(handle_output(struct httpd_state *s))
+{
+  char *ptr;
+  
+  PT_BEGIN(&s->outputpt);
+ 
+  if(!httpd_fs_open(s->filename, &s->file)) {
+    httpd_fs_open(http_404_html, &s->file);
+    strcpy(s->filename, http_404_html);
+    PT_WAIT_THREAD(&s->outputpt,
+		   send_headers(s,
+		   http_header_404));
+    PT_WAIT_THREAD(&s->outputpt,
+		   send_file(s));
+  } else {
+    PT_WAIT_THREAD(&s->outputpt,
+		   send_headers(s,
+		   http_header_200));
+    ptr = strchr(s->filename, ISO_period);
+    if(ptr != NULL && strncmp(ptr, http_shtml, 6) == 0) {
+      PT_INIT(&s->scriptpt);
+      PT_WAIT_THREAD(&s->outputpt, handle_script(s));
+    } else {
+      PT_WAIT_THREAD(&s->outputpt,
+		     send_file(s));
+    }
+  }
+  PSOCK_CLOSE(&s->sout);
+  PT_END(&s->outputpt);
+}
+/*---------------------------------------------------------------------------*/
+static
+PT_THREAD(handle_input(struct httpd_state *s))
+{
+  PSOCK_BEGIN(&s->sin);
+
+  PSOCK_READTO(&s->sin, ISO_space);
+
+  
+  if(strncmp(s->inputbuf, http_get, 4) != 0) {
+    PSOCK_CLOSE_EXIT(&s->sin);
+  }
+  PSOCK_READTO(&s->sin, ISO_space);
+
+  if(s->inputbuf[0] != ISO_slash) {
+    PSOCK_CLOSE_EXIT(&s->sin);
+  }
+
+  if(s->inputbuf[1] == ISO_space) {
+    strncpy(s->filename, http_index_html, sizeof(s->filename));
+  } else {
+    s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0;
+    strncpy(s->filename, &s->inputbuf[0], sizeof(s->filename));
+  }
+
+  /*  httpd_log_file(uip_conn->ripaddr, s->filename);*/
+  
+  s->state = STATE_OUTPUT;
+
+  while(1) {
+    PSOCK_READTO(&s->sin, ISO_nl);
+
+    if(strncmp(s->inputbuf, http_referer, 8) == 0) {
+      s->inputbuf[PSOCK_DATALEN(&s->sin) - 2] = 0;
+      /*      httpd_log(&s->inputbuf[9]);*/
+    }
+  }
+  
+  PSOCK_END(&s->sin);
+}
+/*---------------------------------------------------------------------------*/
+static void
+handle_connection(struct httpd_state *s)
+{
+  handle_input(s);
+  if(s->state == STATE_OUTPUT) {
+    handle_output(s);
+  }
+}
+/*---------------------------------------------------------------------------*/
+void
+httpd_appcall(void)
+{
+  struct httpd_state *s = (struct httpd_state *)&(uip_conn->appstate);
+
+  if(uip_closed() || uip_aborted() || uip_timedout()) {
+  } else if(uip_connected()) {
+    PSOCK_INIT(&s->sin, s->inputbuf, sizeof(s->inputbuf) - 1);
+    PSOCK_INIT(&s->sout, s->inputbuf, sizeof(s->inputbuf) - 1);
+    PT_INIT(&s->outputpt);
+    s->state = STATE_WAITING;
+    /*    timer_set(&s->timer, CLOCK_SECOND * 100);*/
+    s->timer = 0;
+    handle_connection(s);
+  } else if(s != NULL) {
+    if(uip_poll()) {
+      ++s->timer;
+      if(s->timer >= 20) {
+	uip_abort();
+      }
+    } else {
+      s->timer = 0;
+    }
+    handle_connection(s);
+  } else {
+    uip_abort();
+  }
+}
+/*---------------------------------------------------------------------------*/
+/**
+ * \brief      Initialize the web server
+ *
+ *             This function initializes the web server and should be
+ *             called at system boot-up.
+ */
+void
+httpd_init(void)
+{
+  uip_listen(HTONS(80));
+}
+/*---------------------------------------------------------------------------*/
+/** @} */

+ 62 - 0
components/net/uip/apps/webserver/httpd.h

@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2001-2005, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack.
+ *
+ * $Id: httpd.h,v 1.2 2006/06/11 21:46:38 adam Exp $
+ *
+ */
+
+#ifndef __HTTPD_H__
+#define __HTTPD_H__
+
+#include "psock.h"
+#include "httpd-fs.h"
+
+struct httpd_state {
+  unsigned char timer;
+  struct psock sin, sout;
+  struct pt outputpt, scriptpt;
+  char inputbuf[50];
+  char filename[20];
+  char state;
+  struct httpd_fs_file file;
+  int len;
+  char *scriptptr;
+  int scriptlen;
+  
+  unsigned short count;
+};
+
+void httpd_init(void);
+void httpd_appcall(void);
+
+void httpd_log(char *msg);
+void httpd_log_file(u16_t *requester, char *file);
+
+#endif /* __HTTPD_H__ */

+ 78 - 0
components/net/uip/apps/webserver/makefsdata

@@ -0,0 +1,78 @@
+#!/usr/bin/perl
+
+open(OUTPUT, "> httpd-fsdata.c");
+
+chdir("httpd-fs");
+
+opendir(DIR, ".");
+@files =  grep { !/^\./ && !/(CVS|~)/ } readdir(DIR);
+closedir(DIR);
+
+foreach $file (@files) {  
+   
+    if(-d $file && $file !~ /^\./) {
+	print "Processing directory $file\n";
+	opendir(DIR, $file);
+	@newfiles =  grep { !/^\./ && !/(CVS|~)/ } readdir(DIR);
+	closedir(DIR);
+	printf "Adding files @newfiles\n";
+	@files = (@files, map { $_ = "$file/$_" } @newfiles);
+	next;
+    }
+}
+
+foreach $file (@files) {
+    if(-f $file) {
+	
+	print "Adding file $file\n";
+	
+	open(FILE, $file) || die "Could not open file $file\n";
+
+	$file =~ s-^-/-;
+	$fvar = $file;
+	$fvar =~ s-/-_-g;
+	$fvar =~ s-\.-_-g;
+	# for AVR, add PROGMEM here
+	print(OUTPUT "static const unsigned char data".$fvar."[] = {\n");
+	print(OUTPUT "\t/* $file */\n\t");
+	for($j = 0; $j < length($file); $j++) {
+	    printf(OUTPUT "%#02x, ", unpack("C", substr($file, $j, 1)));
+	}
+	printf(OUTPUT "0,\n");
+	
+	
+	$i = 0;        
+	while(read(FILE, $data, 1)) {
+	    if($i == 0) {
+		print(OUTPUT "\t");
+	    }
+	    printf(OUTPUT "%#02x, ", unpack("C", $data));
+	    $i++;
+	    if($i == 10) {
+		print(OUTPUT "\n");
+		$i = 0;
+	    }
+	}
+	print(OUTPUT "0};\n\n");
+	close(FILE);
+	push(@fvars, $fvar);
+	push(@pfiles, $file);
+    }
+}
+
+for($i = 0; $i < @fvars; $i++) {
+    $file = $pfiles[$i];
+    $fvar = $fvars[$i];
+
+    if($i == 0) {
+        $prevfile = "NULL";
+    } else {
+        $prevfile = "file" . $fvars[$i - 1];
+    }
+    print(OUTPUT "const struct httpd_fsdata_file file".$fvar."[] = {{$prevfile, data$fvar, ");
+    print(OUTPUT "data$fvar + ". (length($file) + 1) .", ");
+    print(OUTPUT "sizeof(data$fvar) - ". (length($file) + 1) ."}};\n\n");
+}
+
+print(OUTPUT "#define HTTPD_FS_ROOT file$fvars[$i - 1]\n\n");
+print(OUTPUT "#define HTTPD_FS_NUMFILES $i\n");

+ 40 - 0
components/net/uip/apps/webserver/makestrings

@@ -0,0 +1,40 @@
+#!/usr/bin/perl
+
+
+sub stringify {
+  my $name = shift(@_);
+  open(OUTPUTC, "> $name.c");
+  open(OUTPUTH, "> $name.h");
+  
+  open(FILE, "$name");
+  
+  while(<FILE>) {
+    if(/(.+) "(.+)"/) {
+      $var = $1;
+      $data = $2;
+      
+      $datan = $data;
+      $datan =~ s/\\r/\r/g;
+      $datan =~ s/\\n/\n/g;
+      $datan =~ s/\\01/\01/g;      
+      $datan =~ s/\\0/\0/g;
+      
+      printf(OUTPUTC "const char $var\[%d] = \n", length($datan) + 1);
+      printf(OUTPUTC "/* \"$data\" */\n");
+      printf(OUTPUTC "{");
+      for($j = 0; $j < length($datan); $j++) {
+	printf(OUTPUTC "%#02x, ", unpack("C", substr($datan, $j, 1)));
+      }
+      printf(OUTPUTC "};\n");
+      
+      printf(OUTPUTH "extern const char $var\[%d];\n", length($datan) + 1);
+      
+    }
+  }
+  close(OUTPUTC);
+  close(OUTPUTH);
+}
+stringify("http-strings");
+
+exit 0;
+

+ 49 - 0
components/net/uip/apps/webserver/webserver.h

@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2002, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer in the documentation and/or other materials provided
+ *    with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack
+ *
+ * $Id: webserver.h,v 1.2 2006/06/11 21:46:38 adam Exp $
+ *
+ */
+#ifndef __WEBSERVER_H__
+#define __WEBSERVER_H__
+
+#include "httpd.h"
+
+typedef struct httpd_state uip_tcp_appstate_t;
+/* UIP_APPCALL: the name of the application function. This function
+   must return void and take no arguments (i.e., C type "void
+   appfunc(void)"). */
+#ifndef UIP_APPCALL
+#define UIP_APPCALL     httpd_appcall
+#endif
+
+
+#endif /* __WEBSERVER_H__ */

+ 279 - 0
components/net/uip/doc/Doxyfile

@@ -0,0 +1,279 @@
+# Doxyfile 1.4.6
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME           = "uIP 1.0"
+PROJECT_NUMBER         = 
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+USE_WINDOWS_ENCODING   = NO
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = YES
+STRIP_FROM_PATH        = ../ \
+                         ../../
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = YES
+JAVADOC_AUTOBRIEF      = YES
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP         = YES
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = YES
+OPTIMIZE_OUTPUT_JAVA   = NO
+BUILTIN_STL_SUPPORT    = NO
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = NO
+EXTRACT_LOCAL_METHODS  = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = YES
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = NO
+GENERATE_DEPRECATEDLIST= NO
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 30
+SHOW_USED_FILES        = NO
+SHOW_DIRECTORIES       = NO
+FILE_VERSION_FILTER    = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = uip-doc.txt \
+                         pt-doc.txt \
+                         examples.txt \
+                         uip-code-style.txt \
+                         ../uip/uip.h \
+                         ../uip/uip.c \
+                         ../uip/uip_arch.h \
+                         ../uip/uip_arp.h \
+                         ../uip/uip_arp.c \
+                         ../unix/uip-conf.h \
+                         ../uip/uipopt.h \
+                         ../uip/uip-split.h \
+                         ../uip/uip-split.c \
+                         ../uip/uip-neighbor.h \
+                         ../uip/uip-neighbor.c \
+                         ../uip/pt.h \
+                         ../uip/lc.h \
+                         ../uip/lc-switch.h \
+                         ../uip/lc-addrlabels.h \
+                         ../uip/timer.h \
+                         ../uip/timer.c \
+                         ../uip/clock.h \
+                         ../uip/psock.h \
+                         ../uip/psock.c \
+                         ../lib/memb.c \
+                         ../lib/memb.h \
+                         ../apps/resolv/resolv.h \
+                         ../apps/resolv/resolv.c \
+                         ../apps/dhcpc/dhcpc.h \
+                         ../apps/dhcpc/dhcpc.c \
+                         ../apps/smtp/smtp.h \
+                         ../apps/smtp/smtp.c \
+                         ../apps/telnetd/telnetd.h \
+                         ../apps/telnetd/telnetd.c \
+                         ../apps/telnetd/shell.h \
+                         ../apps/telnetd/shell.c \
+                         ../apps/hello-world/hello-world.h \
+                         ../apps/hello-world/hello-world.c \
+                         ../apps/webclient/webclient.h \
+                         ../apps/webclient/webclient.c \
+                         ../apps/webserver/httpd.h \
+                         ../apps/webserver/httpd-cgi.h \
+                         ../apps/webserver/httpd-cgi.c \
+                         ../apps/webserver/httpd.c
+FILE_PATTERNS          = 
+RECURSIVE              = NO
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXAMPLE_PATH           = . ../apps/hello-world ../apps/smtp \
+                         ../apps/telnetd ../apps/resolv ../apps/webclient \
+			 ../apps/webserver ../unix ../apps/dhcpc
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = YES
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = YES
+CHM_FILE               = 
+HHC_LOCATION           = 
+GENERATE_CHI           = YES
+BINARY_TOC             = YES
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = 
+LATEX_HEADER           = header.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = NO
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = NO
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = UIP_UDP
+EXPAND_AS_DEFINED      = 
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+HIDE_UNDOC_RELATIONS   = NO
+HAVE_DOT               = NO
+CLASS_GRAPH            = NO
+COLLABORATION_GRAPH    = NO
+GROUP_GRAPHS           = NO
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+INCLUDE_GRAPH          = NO
+INCLUDED_BY_GRAPH      = NO
+CALL_GRAPH             = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+MAX_DOT_GRAPH_WIDTH    = 1024
+MAX_DOT_GRAPH_HEIGHT   = 1024
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO

+ 7 - 0
components/net/uip/doc/Makefile

@@ -0,0 +1,7 @@
+all: htmldoc pdfdoc
+
+htmldoc:
+	doxygen Doxyfile
+
+pdfdoc: htmldoc
+	cd latex; make refman.pdf && mv refman.pdf ../uip-refman.pdf

+ 12 - 0
components/net/uip/doc/README

@@ -0,0 +1,12 @@
+The files in this directory comprise the uIP documentation. The files
+are:
+
+html/                The uIP reference manual in HTML format.
+
+uip-refman.pdf       The uIP reference manual in a printable PDF version.
+
+mobisys2003.pdf      Conference paper about uIP from the First
+                     International Conference on Mobile Systems,
+                     Applications and Services (MobiSys), San
+                     Francisco, May 2003.
+

+ 62 - 0
components/net/uip/doc/doxygen.sty

@@ -0,0 +1,62 @@
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{doxygen}
+\RequirePackage{calc}
+\RequirePackage{array}
+\pagestyle{fancyplain}
+\newcommand{\clearemptydoublepage}{\newpage{\pagestyle{empty}\cleardoublepage}}
+\renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}}
+\lhead[\fancyplain{}{\bfseries\thepage}]
+        {\fancyplain{}{\bfseries\rightmark}}
+\rhead[\fancyplain{}{\bfseries\leftmark}]
+        {\fancyplain{}{\bfseries\thepage}}
+\rfoot[\fancyplain{}{\bfseries\scriptsize Generated on Wed Jun 7 11:37:14 2006 for uIP 1.0-rc0 by doxygen\lfoot[]{\fancyplain{}{\bfseries\scriptsize Generated on Wed Jun 7 11:37:14 2006 for uIP 1.0-rc0 by doxygen}}
+\cfoot{}
+\newenvironment{CompactList}
+{\begin{list}{}{
+  \setlength{\leftmargin}{0.5cm}
+  \setlength{\itemsep}{0pt}
+  \setlength{\parsep}{0pt}
+  \setlength{\topsep}{0pt}
+  \renewcommand{\makelabel}{}}}
+{\end{list}}
+\newenvironment{CompactItemize}
+{
+  \begin{itemize}
+  \setlength{\itemsep}{-3pt}
+  \setlength{\parsep}{0pt}
+  \setlength{\topsep}{0pt}
+  \setlength{\partopsep}{0pt}
+}
+{\end{itemize}}
+\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}
+\newlength{\tmplength}
+\newenvironment{TabularC}[1]
+{
+\setlength{\tmplength}
+     {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)}
+      \par\begin{tabular*}{\linewidth}
+             {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|}
+}
+{\end{tabular*}\par}
+\newcommand{\entrylabel}[1]{
+   {\parbox[b]{\labelwidth-4pt}{\makebox[0pt][l]{\textbf{#1}}\\}}}
+\newenvironment{Desc}
+{\begin{list}{}
+  {
+    \settowidth{\labelwidth}{40pt}
+    \setlength{\leftmargin}{\labelwidth}
+    \setlength{\parsep}{0pt}
+    \setlength{\itemsep}{-4pt}
+    \renewcommand{\makelabel}{\entrylabel}
+  }
+}
+{\end{list}}
+\newenvironment{Indent}
+  {\begin{list}{}{\setlength{\leftmargin}{0.5cm}}
+      \item[]\ignorespaces}
+  {\unskip\end{list}}
+\setlength{\parindent}{0cm}
+\setlength{\parskip}{0.2cm}
+\addtocounter{secnumdepth}{1}
+\sloppy
+\usepackage[T1]{fontenc}

+ 86 - 0
components/net/uip/doc/example-mainloop-with-arp.c

@@ -0,0 +1,86 @@
+#include "uip.h"
+#include "uip_arp.h"
+#include "network-device.h"
+#include "httpd.h"
+#include "timer.h"
+
+#define BUF ((struct uip_eth_hdr *)&uip_buf[0])
+
+/*---------------------------------------------------------------------------*/
+int
+main(void)
+{
+  int i;
+  uip_ipaddr_t ipaddr;
+  struct timer periodic_timer, arp_timer;
+  
+  timer_set(&periodic_timer, CLOCK_SECOND / 2);
+  timer_set(&arp_timer, CLOCK_SECOND * 10);
+  
+  network_device_init();
+  uip_init();
+
+  uip_ipaddr(ipaddr, 192,168,0,2);
+  uip_sethostaddr(ipaddr);
+
+  httpd_init();
+  
+  while(1) {
+    uip_len = network_device_read();
+    if(uip_len > 0) {
+      if(BUF->type == htons(UIP_ETHTYPE_IP)) {
+	uip_arp_ipin();
+	uip_input();
+	/* If the above function invocation resulted in data that
+	   should be sent out on the network, the global variable
+	   uip_len is set to a value > 0. */
+	if(uip_len > 0) {
+	  uip_arp_out();
+	  network_device_send();
+	}
+      } else if(BUF->type == htons(UIP_ETHTYPE_ARP)) {
+	uip_arp_arpin();
+	/* If the above function invocation resulted in data that
+	   should be sent out on the network, the global variable
+	   uip_len is set to a value > 0. */
+	if(uip_len > 0) {
+	  network_device_send();
+	}
+      }
+
+    } else if(timer_expired(&periodic_timer)) {
+      timer_reset(&periodic_timer);
+      for(i = 0; i < UIP_CONNS; i++) {
+	uip_periodic(i);
+	/* If the above function invocation resulted in data that
+	   should be sent out on the network, the global variable
+	   uip_len is set to a value > 0. */
+	if(uip_len > 0) {
+	  uip_arp_out();
+	  network_device_send();
+	}
+      }
+
+#if UIP_UDP
+      for(i = 0; i < UIP_UDP_CONNS; i++) {
+	uip_udp_periodic(i);
+	/* If the above function invocation resulted in data that
+	   should be sent out on the network, the global variable
+	   uip_len is set to a value > 0. */
+	if(uip_len > 0) {
+	  uip_arp_out();
+	  network_device_send();
+	}
+      }
+#endif /* UIP_UDP */
+      
+      /* Call the ARP timer function every 10 seconds. */
+      if(timer_expired(&arp_timer)) {
+	timer_reset(&arp_timer);
+	uip_arp_timer();
+      }
+    }
+  }
+  return 0;
+}
+/*---------------------------------------------------------------------------*/

+ 62 - 0
components/net/uip/doc/example-mainloop-without-arp.c

@@ -0,0 +1,62 @@
+#include "uip.h"
+#include "uip_arp.h"
+#include "network-device.h"
+#include "httpd.h"
+#include "timer.h"
+
+/*---------------------------------------------------------------------------*/
+int
+main(void)
+{
+  int i;
+  uip_ipaddr_t ipaddr;
+  struct timer periodic_timer;
+  
+  timer_set(&periodic_timer, CLOCK_SECOND / 2);
+  
+  network_device_init();
+  uip_init();
+
+  uip_ipaddr(ipaddr, 192,168,0,2);
+  uip_sethostaddr(ipaddr);
+
+  httpd_init();
+  
+  while(1) {
+    uip_len = network_device_read();
+    if(uip_len > 0) {
+      uip_input();
+      /* If the above function invocation resulted in data that
+	 should be sent out on the network, the global variable
+	 uip_len is set to a value > 0. */
+      if(uip_len > 0) {
+	network_device_send();
+      }
+    } else if(timer_expired(&periodic_timer)) {
+      timer_reset(&periodic_timer);
+      for(i = 0; i < UIP_CONNS; i++) {
+	uip_periodic(i);
+	/* If the above function invocation resulted in data that
+	   should be sent out on the network, the global variable
+	   uip_len is set to a value > 0. */
+	if(uip_len > 0) {
+	  network_device_send();
+	}
+      }
+
+#if UIP_UDP
+      for(i = 0; i < UIP_UDP_CONNS; i++) {
+	uip_udp_periodic(i);
+	/* If the above function invocation resulted in data that
+	   should be sent out on the network, the global variable
+	   uip_len is set to a value > 0. */
+	if(uip_len > 0) {
+	  network_device_send();
+	}
+      }
+#endif /* UIP_UDP */
+    }
+  }
+  return 0;
+}
+/*---------------------------------------------------------------------------*/

+ 34 - 0
components/net/uip/doc/examples.txt

@@ -0,0 +1,34 @@
+/**
+\defgroup apps Applications
+@{
+
+The uIP distribution contains a number of example applications that
+can be either used directory or studied when learning to develop
+applications for uIP.
+
+*/
+
+/** \example hello-world.c */
+/** \example hello-world.h */
+
+/** \example smtp.c */
+/** \example smtp.h */
+
+/** \example webclient.c */
+/** \example webclient.h */
+
+/** \example example-mainloop-with-arp.c */
+/** \example example-mainloop-without-arp.c */
+
+/** \example telnetd.c */
+/** \example telnetd.h */
+
+/** \example resolv.c */
+/** \example resolv.h */
+
+/** \example dhcpc.c */
+/** \example dhcpc.h */
+
+/** \example uip-conf.h */
+
+/** @} */

+ 53 - 0
components/net/uip/doc/header.tex

@@ -0,0 +1,53 @@
+\documentclass[a4paper]{book}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{times}
+\ifx\pdfoutput\undefined
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue
+           ]{hyperref}
+\usepackage{pspicture}
+\else
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue
+           ]{hyperref}
+\fi
+\usepackage{doxygen}
+\makeindex
+\setcounter{tocdepth}{1}
+\renewcommand{\footrulewidth}{0.4pt}
+\begin{document}
+\begin{titlepage}
+\vspace*{5cm}
+\begin{center}
+{\Huge The uIP Embedded TCP/IP Stack}\\
+\vspace*{1cm}
+{\LARGE The uIP 1.0 Reference Manual}\\
+\vspace*{3cm}
+{\Large June 2006}\\
+\vspace*{2cm}
+\includegraphics[width=6cm]{../sicslogo.pdf}\\
+\vspace*{1cm}
+{\Large Adam Dunkels}\\
+{\Large \texttt{adam@sics.se}}\\
+\vspace*{1cm}
+{\LARGE Swedish Institute of Computer Science}\\
+\vspace*{0.5cm}
+
+\end{center}
+\end{titlepage}
+\clearemptydoublepage
+\pagenumbering{roman}
+\tableofcontents
+\clearemptydoublepage
+\pagenumbering{arabic}

+ 120 - 0
components/net/uip/doc/html/a00036.html

@@ -0,0 +1,120 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: hello-world.c</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<h1>hello-world.c</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/**</span>
+<a name="l00002"></a>00002 <span class="comment"> * \addtogroup helloworld</span>
+<a name="l00003"></a>00003 <span class="comment"> * @{</span>
+<a name="l00004"></a>00004 <span class="comment"> */</span>
+<a name="l00005"></a>00005 <span class="comment"></span>
+<a name="l00006"></a>00006 <span class="comment">/**</span>
+<a name="l00007"></a>00007 <span class="comment"> * \file</span>
+<a name="l00008"></a>00008 <span class="comment"> *         An example of how to write uIP applications</span>
+<a name="l00009"></a>00009 <span class="comment"> *         with protosockets.</span>
+<a name="l00010"></a>00010 <span class="comment"> * \author</span>
+<a name="l00011"></a>00011 <span class="comment"> *         Adam Dunkels &lt;adam@sics.se&gt;</span>
+<a name="l00012"></a>00012 <span class="comment"> */</span>
+<a name="l00013"></a>00013 
+<a name="l00014"></a>00014 <span class="comment">/*</span>
+<a name="l00015"></a>00015 <span class="comment"> * This is a short example of how to write uIP applications using</span>
+<a name="l00016"></a>00016 <span class="comment"> * protosockets.</span>
+<a name="l00017"></a>00017 <span class="comment"> */</span>
+<a name="l00018"></a>00018 
+<a name="l00019"></a>00019 <span class="comment">/*</span>
+<a name="l00020"></a>00020 <span class="comment"> * We define the application state (struct hello_world_state) in the</span>
+<a name="l00021"></a>00021 <span class="comment"> * hello-world.h file, so we need to include it here. We also include</span>
+<a name="l00022"></a>00022 <span class="comment"> * uip.h (since this cannot be included in hello-world.h) and</span>
+<a name="l00023"></a>00023 <span class="comment"> * &lt;string.h&gt;, since we use the memcpy() function in the code.</span>
+<a name="l00024"></a>00024 <span class="comment"> */</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "<a class="code" href="a00101.html">hello-world.h</a>"</span>
+<a name="l00026"></a>00026 <span class="preprocessor">#include "<a class="code" href="a00136.html">uip.h</a>"</span>
+<a name="l00027"></a>00027 <span class="preprocessor">#include &lt;string.h&gt;</span>
+<a name="l00028"></a>00028 
+<a name="l00029"></a>00029 <span class="comment">/*</span>
+<a name="l00030"></a>00030 <span class="comment"> * Declaration of the protosocket function that handles the connection</span>
+<a name="l00031"></a>00031 <span class="comment"> * (defined at the end of the code).</span>
+<a name="l00032"></a>00032 <span class="comment"> */</span>
+<a name="l00033"></a>00033 <span class="keyword">static</span> <span class="keywordtype">int</span> handle_connection(<span class="keyword">struct</span> <a name="_a100"></a><a class="code" href="a00078.html">hello_world_state</a> *s);
+<a name="l00034"></a>00034 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00035"></a>00035 <span class="comment">/*</span>
+<a name="l00036"></a>00036 <span class="comment"> * The initialization function. We must explicitly call this function</span>
+<a name="l00037"></a>00037 <span class="comment"> * from the system initialization code, some time after uip_init() is</span>
+<a name="l00038"></a>00038 <span class="comment"> * called.</span>
+<a name="l00039"></a>00039 <span class="comment"> */</span>
+<a name="l00040"></a>00040 <span class="keywordtype">void</span>
+<a name="l00041"></a>00041 <a name="a101"></a><a class="code" href="a00162.html#gb97849f0d3ea858eee790b69591e6427">hello_world_init</a>(<span class="keywordtype">void</span>)
+<a name="l00042"></a>00042 {
+<a name="l00043"></a>00043   <span class="comment">/* We start to listen for connections on TCP port 1000. */</span>
+<a name="l00044"></a>00044   <a name="a102"></a><a class="code" href="a00147.html#gdd1ab3704ecd4900eec61a6897d32dc8">uip_listen</a>(<a name="a103"></a><a class="code" href="a00148.html#g69a7a4951ff21b302267532c21ee78fc">HTONS</a>(1000));
+<a name="l00045"></a>00045 }
+<a name="l00046"></a>00046 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00047"></a>00047 <span class="comment">/*</span>
+<a name="l00048"></a>00048 <span class="comment"> * In hello-world.h we have defined the UIP_APPCALL macro to</span>
+<a name="l00049"></a>00049 <span class="comment"> * hello_world_appcall so that this funcion is uIP's application</span>
+<a name="l00050"></a>00050 <span class="comment"> * function. This function is called whenever an uIP event occurs</span>
+<a name="l00051"></a>00051 <span class="comment"> * (e.g. when a new connection is established, new data arrives, sent</span>
+<a name="l00052"></a>00052 <span class="comment"> * data is acknowledged, data needs to be retransmitted, etc.).</span>
+<a name="l00053"></a>00053 <span class="comment"> */</span>
+<a name="l00054"></a>00054 <span class="keywordtype">void</span>
+<a name="l00055"></a>00055 <a name="a104"></a><a class="code" href="a00162.html#g03070adbf8faab0f34f87c1270964306">hello_world_appcall</a>(<span class="keywordtype">void</span>)
+<a name="l00056"></a>00056 {
+<a name="l00057"></a>00057   <span class="comment">/*</span>
+<a name="l00058"></a>00058 <span class="comment">   * The uip_conn structure has a field called "appstate" that holds</span>
+<a name="l00059"></a>00059 <span class="comment">   * the application state of the connection. We make a pointer to</span>
+<a name="l00060"></a>00060 <span class="comment">   * this to access it easier.</span>
+<a name="l00061"></a>00061 <span class="comment">   */</span>
+<a name="l00062"></a>00062   <span class="keyword">struct </span><a class="code" href="a00078.html">hello_world_state</a> *s = &amp;(<a name="a105"></a><a class="code" href="a00150.html#g788ffac72342f6172343d7f8099cbe1a">uip_conn</a>-&gt;<a name="a106"></a><a class="code" href="a00088.html#97f9e1fda815bfb8b1f4577c355ade20">appstate</a>);
+<a name="l00063"></a>00063 
+<a name="l00064"></a>00064   <span class="comment">/*</span>
+<a name="l00065"></a>00065 <span class="comment">   * If a new connection was just established, we should initialize</span>
+<a name="l00066"></a>00066 <span class="comment">   * the protosocket in our applications' state structure.</span>
+<a name="l00067"></a>00067 <span class="comment">   */</span>
+<a name="l00068"></a>00068   <span class="keywordflow">if</span>(<a name="a107"></a><a class="code" href="a00147.html#gdb971fb1525d0c5002f52125b05f3218">uip_connected</a>()) {
+<a name="l00069"></a>00069     <a name="a108"></a><a class="code" href="a00158.html#g26ae707402e494f3895a9f012a93ea29">PSOCK_INIT</a>(&amp;s-&gt;<a name="a109"></a><a class="code" href="a00078.html#a9825b5977b2d4dec66e6bd09e6ae6ea">p</a>, s-&gt;<a name="a110"></a><a class="code" href="a00078.html#4b1b1436b50ed7638aece35f41421196">inputbuffer</a>, <span class="keyword">sizeof</span>(s-&gt;<a class="code" href="a00078.html#4b1b1436b50ed7638aece35f41421196">inputbuffer</a>));
+<a name="l00070"></a>00070   }
+<a name="l00071"></a>00071 
+<a name="l00072"></a>00072   <span class="comment">/*</span>
+<a name="l00073"></a>00073 <span class="comment">   * Finally, we run the protosocket function that actually handles</span>
+<a name="l00074"></a>00074 <span class="comment">   * the communication. We pass it a pointer to the application state</span>
+<a name="l00075"></a>00075 <span class="comment">   * of the current connection.</span>
+<a name="l00076"></a>00076 <span class="comment">   */</span>
+<a name="l00077"></a>00077   handle_connection(s);
+<a name="l00078"></a>00078 }
+<a name="l00079"></a>00079 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00080"></a>00080 <span class="comment">/*</span>
+<a name="l00081"></a>00081 <span class="comment"> * This is the protosocket function that handles the communication. A</span>
+<a name="l00082"></a>00082 <span class="comment"> * protosocket function must always return an int, but must never</span>
+<a name="l00083"></a>00083 <span class="comment"> * explicitly return - all return statements are hidden in the PSOCK</span>
+<a name="l00084"></a>00084 <span class="comment"> * macros.</span>
+<a name="l00085"></a>00085 <span class="comment"> */</span>
+<a name="l00086"></a>00086 <span class="keyword">static</span> <span class="keywordtype">int</span>
+<a name="l00087"></a>00087 handle_connection(<span class="keyword">struct</span> <a class="code" href="a00078.html">hello_world_state</a> *s)
+<a name="l00088"></a>00088 {
+<a name="l00089"></a>00089   <a name="a111"></a><a class="code" href="a00158.html#g84901a5aa60040e96d272a69977edd22">PSOCK_BEGIN</a>(&amp;s-&gt;<a class="code" href="a00078.html#a9825b5977b2d4dec66e6bd09e6ae6ea">p</a>);
+<a name="l00090"></a>00090 
+<a name="l00091"></a>00091   <a name="a112"></a><a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s-&gt;<a class="code" href="a00078.html#a9825b5977b2d4dec66e6bd09e6ae6ea">p</a>, <span class="stringliteral">"Hello. What is your name?\n"</span>);
+<a name="l00092"></a>00092   <a name="a113"></a><a class="code" href="a00158.html#gb5d9c0becf7cb32d0aaef466839dd92e">PSOCK_READTO</a>(&amp;s-&gt;<a class="code" href="a00078.html#a9825b5977b2d4dec66e6bd09e6ae6ea">p</a>, <span class="charliteral">'\n'</span>);
+<a name="l00093"></a>00093   strncpy(s-&gt;<a name="a114"></a><a class="code" href="a00078.html#4da86e9feb5e5835eb15163c2cb61116">name</a>, s-&gt;<a class="code" href="a00078.html#4b1b1436b50ed7638aece35f41421196">inputbuffer</a>, <span class="keyword">sizeof</span>(s-&gt;<a class="code" href="a00078.html#4da86e9feb5e5835eb15163c2cb61116">name</a>));
+<a name="l00094"></a>00094   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s-&gt;<a class="code" href="a00078.html#a9825b5977b2d4dec66e6bd09e6ae6ea">p</a>, <span class="stringliteral">"Hello "</span>);
+<a name="l00095"></a>00095   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s-&gt;<a class="code" href="a00078.html#a9825b5977b2d4dec66e6bd09e6ae6ea">p</a>, s-&gt;<a class="code" href="a00078.html#4da86e9feb5e5835eb15163c2cb61116">name</a>);
+<a name="l00096"></a>00096   <a name="a115"></a><a class="code" href="a00158.html#g5d56800f82bfc7bbf53bb4a659589812">PSOCK_CLOSE</a>(&amp;s-&gt;<a class="code" href="a00078.html#a9825b5977b2d4dec66e6bd09e6ae6ea">p</a>);
+<a name="l00097"></a>00097   
+<a name="l00098"></a>00098   <a name="a116"></a><a class="code" href="a00158.html#g4a264bb64ae706d53f572b1d9e4037a2">PSOCK_END</a>(&amp;s-&gt;<a class="code" href="a00078.html#a9825b5977b2d4dec66e6bd09e6ae6ea">p</a>);
+<a name="l00099"></a>00099 }
+<a name="l00100"></a>00100 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 72 - 0
components/net/uip/doc/html/a00037.html

@@ -0,0 +1,72 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: hello-world.h</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<h1>hello-world.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/**</span>
+<a name="l00002"></a>00002 <span class="comment"> * \addtogroup apps</span>
+<a name="l00003"></a>00003 <span class="comment"> * @{</span>
+<a name="l00004"></a>00004 <span class="comment"> */</span>
+<a name="l00005"></a>00005 <span class="comment"></span>
+<a name="l00006"></a>00006 <span class="comment">/**</span>
+<a name="l00007"></a>00007 <span class="comment"> * \defgroup helloworld Hello, world</span>
+<a name="l00008"></a>00008 <span class="comment"> * @{</span>
+<a name="l00009"></a>00009 <span class="comment"> *</span>
+<a name="l00010"></a>00010 <span class="comment"> * A small example showing how to write applications with</span>
+<a name="l00011"></a>00011 <span class="comment"> * \ref psock "protosockets".</span>
+<a name="l00012"></a>00012 <span class="comment"> */</span>
+<a name="l00013"></a>00013 <span class="comment"></span>
+<a name="l00014"></a>00014 <span class="comment">/**</span>
+<a name="l00015"></a>00015 <span class="comment"> * \file</span>
+<a name="l00016"></a>00016 <span class="comment"> *         Header file for an example of how to write uIP applications</span>
+<a name="l00017"></a>00017 <span class="comment"> *         with protosockets.</span>
+<a name="l00018"></a>00018 <span class="comment"> * \author</span>
+<a name="l00019"></a>00019 <span class="comment"> *         Adam Dunkels &lt;adam@sics.se&gt;</span>
+<a name="l00020"></a>00020 <span class="comment"> */</span>
+<a name="l00021"></a>00021 
+<a name="l00022"></a>00022 <span class="preprocessor">#ifndef __HELLO_WORLD_H__</span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span><span class="preprocessor">#define __HELLO_WORLD_H__</span>
+<a name="l00024"></a>00024 <span class="preprocessor"></span>
+<a name="l00025"></a>00025 <span class="comment">/* Since this file will be included by uip.h, we cannot include uip.h</span>
+<a name="l00026"></a>00026 <span class="comment">   here. But we might need to include uipopt.h if we need the u8_t and</span>
+<a name="l00027"></a>00027 <span class="comment">   u16_t datatypes. */</span>
+<a name="l00028"></a>00028 <span class="preprocessor">#include "<a class="code" href="a00140.html">uipopt.h</a>"</span>
+<a name="l00029"></a>00029 
+<a name="l00030"></a>00030 <span class="preprocessor">#include "<a class="code" href="a00127.html">psock.h</a>"</span>
+<a name="l00031"></a>00031 
+<a name="l00032"></a>00032 <span class="comment">/* Next, we define the uip_tcp_appstate_t datatype. This is the state</span>
+<a name="l00033"></a>00033 <span class="comment">   of our application, and the memory required for this state is</span>
+<a name="l00034"></a>00034 <span class="comment">   allocated together with each TCP connection. One application state</span>
+<a name="l00035"></a>00035 <span class="comment">   for each TCP connection. */</span>
+<a name="l00036"></a>00036 <span class="keyword">typedef</span> <span class="keyword">struct </span><a name="_a117"></a><a class="code" href="a00078.html">hello_world_state</a> {
+<a name="l00037"></a>00037   <span class="keyword">struct </span><a name="_a118"></a><a class="code" href="a00082.html">psock</a> <a name="a119"></a><a class="code" href="a00078.html#a9825b5977b2d4dec66e6bd09e6ae6ea">p</a>;
+<a name="l00038"></a>00038   <span class="keywordtype">char</span> <a name="a120"></a><a class="code" href="a00078.html#4b1b1436b50ed7638aece35f41421196">inputbuffer</a>[10];
+<a name="l00039"></a>00039   <span class="keywordtype">char</span> <a name="a121"></a><a class="code" href="a00078.html#4da86e9feb5e5835eb15163c2cb61116">name</a>[40];
+<a name="l00040"></a>00040 } <a name="_a122"></a><a class="code" href="a00085.html">uip_tcp_appstate_t</a>;
+<a name="l00041"></a>00041 
+<a name="l00042"></a>00042 <span class="comment">/* Finally we define the application function to be called by uIP. */</span>
+<a name="l00043"></a>00043 <span class="keywordtype">void</span> <a name="a123"></a><a class="code" href="a00162.html#g03070adbf8faab0f34f87c1270964306">hello_world_appcall</a>(<span class="keywordtype">void</span>);
+<a name="l00044"></a>00044 <span class="preprocessor">#ifndef UIP_APPCALL</span>
+<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#define UIP_APPCALL hello_world_appcall</span>
+<a name="l00046"></a>00046 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* UIP_APPCALL */</span>
+<a name="l00047"></a>00047 
+<a name="l00048"></a>00048 <span class="keywordtype">void</span> <a name="a124"></a><a class="code" href="a00162.html#gb97849f0d3ea858eee790b69591e6427">hello_world_init</a>(<span class="keywordtype">void</span>);
+<a name="l00049"></a>00049 
+<a name="l00050"></a>00050 <span class="preprocessor">#endif </span><span class="comment">/* __HELLO_WORLD_H__ */</span>
+<a name="l00051"></a>00051 <span class="comment">/** @} */</span><span class="comment"></span>
+<a name="l00052"></a>00052 <span class="comment">/** @} */</span>
+</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 282 - 0
components/net/uip/doc/html/a00038.html

@@ -0,0 +1,282 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: smtp.c</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<h1>smtp.c</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/**</span>
+<a name="l00002"></a>00002 <span class="comment"> * \addtogroup apps</span>
+<a name="l00003"></a>00003 <span class="comment"> * @{</span>
+<a name="l00004"></a>00004 <span class="comment"> */</span>
+<a name="l00005"></a>00005 <span class="comment"></span>
+<a name="l00006"></a>00006 <span class="comment">/**</span>
+<a name="l00007"></a>00007 <span class="comment"> * \defgroup smtp SMTP E-mail sender</span>
+<a name="l00008"></a>00008 <span class="comment"> * @{</span>
+<a name="l00009"></a>00009 <span class="comment"> *</span>
+<a name="l00010"></a>00010 <span class="comment"> * The Simple Mail Transfer Protocol (SMTP) as defined by RFC821 is</span>
+<a name="l00011"></a>00011 <span class="comment"> * the standard way of sending and transfering e-mail on the</span>
+<a name="l00012"></a>00012 <span class="comment"> * Internet. This simple example implementation is intended as an</span>
+<a name="l00013"></a>00013 <span class="comment"> * example of how to implement protocols in uIP, and is able to send</span>
+<a name="l00014"></a>00014 <span class="comment"> * out e-mail but has not been extensively tested.</span>
+<a name="l00015"></a>00015 <span class="comment"> */</span>
+<a name="l00016"></a>00016 <span class="comment"></span>
+<a name="l00017"></a>00017 <span class="comment">/**</span>
+<a name="l00018"></a>00018 <span class="comment"> * \file</span>
+<a name="l00019"></a>00019 <span class="comment"> * SMTP example implementation</span>
+<a name="l00020"></a>00020 <span class="comment"> * \author Adam Dunkels &lt;adam@dunkels.com&gt;</span>
+<a name="l00021"></a>00021 <span class="comment"> */</span>
+<a name="l00022"></a>00022 
+<a name="l00023"></a>00023 <span class="comment">/*</span>
+<a name="l00024"></a>00024 <span class="comment"> * Copyright (c) 2004, Adam Dunkels.</span>
+<a name="l00025"></a>00025 <span class="comment"> * All rights reserved.</span>
+<a name="l00026"></a>00026 <span class="comment"> *</span>
+<a name="l00027"></a>00027 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00028"></a>00028 <span class="comment"> * modification, are permitted provided that the following conditions</span>
+<a name="l00029"></a>00029 <span class="comment"> * are met:</span>
+<a name="l00030"></a>00030 <span class="comment"> * 1. Redistributions of source code must retain the above copyright</span>
+<a name="l00031"></a>00031 <span class="comment"> *    notice, this list of conditions and the following disclaimer.</span>
+<a name="l00032"></a>00032 <span class="comment"> * 2. Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00033"></a>00033 <span class="comment"> *    notice, this list of conditions and the following disclaimer in the</span>
+<a name="l00034"></a>00034 <span class="comment"> *    documentation and/or other materials provided with the distribution.</span>
+<a name="l00035"></a>00035 <span class="comment"> * 3. Neither the name of the Institute nor the names of its contributors</span>
+<a name="l00036"></a>00036 <span class="comment"> *    may be used to endorse or promote products derived from this software</span>
+<a name="l00037"></a>00037 <span class="comment"> *    without specific prior written permission.</span>
+<a name="l00038"></a>00038 <span class="comment"> *</span>
+<a name="l00039"></a>00039 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND</span>
+<a name="l00040"></a>00040 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span>
+<a name="l00041"></a>00041 <span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span>
+<a name="l00042"></a>00042 <span class="comment"> * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE</span>
+<a name="l00043"></a>00043 <span class="comment"> * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</span>
+<a name="l00044"></a>00044 <span class="comment"> * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS</span>
+<a name="l00045"></a>00045 <span class="comment"> * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</span>
+<a name="l00046"></a>00046 <span class="comment"> * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT</span>
+<a name="l00047"></a>00047 <span class="comment"> * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY</span>
+<a name="l00048"></a>00048 <span class="comment"> * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</span>
+<a name="l00049"></a>00049 <span class="comment"> * SUCH DAMAGE.</span>
+<a name="l00050"></a>00050 <span class="comment"> *</span>
+<a name="l00051"></a>00051 <span class="comment"> * This file is part of the uIP TCP/IP stack.</span>
+<a name="l00052"></a>00052 <span class="comment"> *</span>
+<a name="l00053"></a>00053 <span class="comment"> * Author: Adam Dunkels &lt;adam@sics.se&gt;</span>
+<a name="l00054"></a>00054 <span class="comment"> *</span>
+<a name="l00055"></a>00055 <span class="comment"> * $Id: smtp.c,v 1.4 2006/06/11 21:46:37 adam Exp $</span>
+<a name="l00056"></a>00056 <span class="comment"> */</span>
+<a name="l00057"></a>00057 <span class="preprocessor">#include "<a class="code" href="a00105.html">smtp.h</a>"</span>
+<a name="l00058"></a>00058 
+<a name="l00059"></a>00059 <span class="preprocessor">#include "smtp-strings.h"</span>
+<a name="l00060"></a>00060 <span class="preprocessor">#include "<a class="code" href="a00127.html">psock.h</a>"</span>
+<a name="l00061"></a>00061 <span class="preprocessor">#include "<a class="code" href="a00136.html">uip.h</a>"</span>
+<a name="l00062"></a>00062 
+<a name="l00063"></a>00063 <span class="preprocessor">#include &lt;string.h&gt;</span>
+<a name="l00064"></a>00064 
+<a name="l00065"></a>00065 <span class="keyword">static</span> <span class="keyword">struct </span><a name="_a163"></a><a class="code" href="a00085.html">smtp_state</a> s;
+<a name="l00066"></a>00066 
+<a name="l00067"></a>00067 <span class="keyword">static</span> <span class="keywordtype">char</span> *localhostname;
+<a name="l00068"></a>00068 <span class="keyword">static</span> <a name="a164"></a><a class="code" href="a00150.html#g1ef35301f43a5bbb9f89f07b5a36b9a0">uip_ipaddr_t</a> smtpserver;
+<a name="l00069"></a>00069 
+<a name="l00070"></a>00070 <span class="preprocessor">#define ISO_nl 0x0a</span>
+<a name="l00071"></a>00071 <span class="preprocessor"></span><span class="preprocessor">#define ISO_cr 0x0d</span>
+<a name="l00072"></a>00072 <span class="preprocessor"></span>
+<a name="l00073"></a>00073 <span class="preprocessor">#define ISO_period 0x2e</span>
+<a name="l00074"></a>00074 <span class="preprocessor"></span>
+<a name="l00075"></a>00075 <span class="preprocessor">#define ISO_2  0x32</span>
+<a name="l00076"></a>00076 <span class="preprocessor"></span><span class="preprocessor">#define ISO_3  0x33</span>
+<a name="l00077"></a>00077 <span class="preprocessor"></span><span class="preprocessor">#define ISO_4  0x34</span>
+<a name="l00078"></a>00078 <span class="preprocessor"></span><span class="preprocessor">#define ISO_5  0x35</span>
+<a name="l00079"></a>00079 <span class="preprocessor"></span>
+<a name="l00080"></a>00080 
+<a name="l00081"></a>00081 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00082"></a>00082 <span class="keyword">static</span>
+<a name="l00083"></a>00083 <a name="a165"></a><a class="code" href="a00142.html#g3d4c8bd4aada659eb34f5d2ffd3e7901">PT_THREAD</a>(smtp_thread(<span class="keywordtype">void</span>))
+<a name="l00084"></a>00084 {
+<a name="l00085"></a>00085   <a name="a166"></a><a class="code" href="a00158.html#g84901a5aa60040e96d272a69977edd22">PSOCK_BEGIN</a>(&amp;s.psock);
+<a name="l00086"></a>00086 
+<a name="l00087"></a>00087   <a name="a167"></a><a class="code" href="a00158.html#gb5d9c0becf7cb32d0aaef466839dd92e">PSOCK_READTO</a>(&amp;s.psock, <a name="a168"></a><a class="code" href="a00161.html#g3212e70c55244608ac16316888c354f0">ISO_nl</a>);
+<a name="l00088"></a>00088    
+<a name="l00089"></a>00089   <span class="keywordflow">if</span>(strncmp(s.inputbuffer, smtp_220, 3) != 0) {
+<a name="l00090"></a>00090     <a name="a169"></a><a class="code" href="a00158.html#g5d56800f82bfc7bbf53bb4a659589812">PSOCK_CLOSE</a>(&amp;s.psock);
+<a name="l00091"></a>00091     <a name="a170"></a><a class="code" href="a00161.html#gb1fc692a2700b7a51517724364683f67">smtp_done</a>(2);
+<a name="l00092"></a>00092     <a name="a171"></a><a class="code" href="a00158.html#gfa11b2a1faf395ae2a6626e01c482d5d">PSOCK_EXIT</a>(&amp;s.psock);
+<a name="l00093"></a>00093   }
+<a name="l00094"></a>00094   
+<a name="l00095"></a>00095   <a name="a172"></a><a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, (<span class="keywordtype">char</span> *)smtp_helo);
+<a name="l00096"></a>00096   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, localhostname);
+<a name="l00097"></a>00097   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, (<span class="keywordtype">char</span> *)smtp_crnl);
+<a name="l00098"></a>00098 
+<a name="l00099"></a>00099   <a class="code" href="a00158.html#gb5d9c0becf7cb32d0aaef466839dd92e">PSOCK_READTO</a>(&amp;s.psock, <a class="code" href="a00161.html#g3212e70c55244608ac16316888c354f0">ISO_nl</a>);
+<a name="l00100"></a>00100   
+<a name="l00101"></a>00101   <span class="keywordflow">if</span>(s.inputbuffer[0] != <a name="a173"></a><a class="code" href="a00161.html#g34b924954ba5707d536df28d71a80d39">ISO_2</a>) {
+<a name="l00102"></a>00102     <a class="code" href="a00158.html#g5d56800f82bfc7bbf53bb4a659589812">PSOCK_CLOSE</a>(&amp;s.psock);
+<a name="l00103"></a>00103     <a class="code" href="a00161.html#gb1fc692a2700b7a51517724364683f67">smtp_done</a>(3);
+<a name="l00104"></a>00104     <a class="code" href="a00158.html#gfa11b2a1faf395ae2a6626e01c482d5d">PSOCK_EXIT</a>(&amp;s.psock);
+<a name="l00105"></a>00105   }
+<a name="l00106"></a>00106 
+<a name="l00107"></a>00107   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, (<span class="keywordtype">char</span> *)smtp_mail_from);
+<a name="l00108"></a>00108   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, s.<a name="a174"></a><a class="code" href="a00085.html#668cab7d54ff0a2fc2a2179ca06b0798">from</a>);
+<a name="l00109"></a>00109   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, (<span class="keywordtype">char</span> *)smtp_crnl);
+<a name="l00110"></a>00110 
+<a name="l00111"></a>00111   <a class="code" href="a00158.html#gb5d9c0becf7cb32d0aaef466839dd92e">PSOCK_READTO</a>(&amp;s.psock, <a class="code" href="a00161.html#g3212e70c55244608ac16316888c354f0">ISO_nl</a>);
+<a name="l00112"></a>00112   
+<a name="l00113"></a>00113   <span class="keywordflow">if</span>(s.inputbuffer[0] != <a class="code" href="a00161.html#g34b924954ba5707d536df28d71a80d39">ISO_2</a>) {
+<a name="l00114"></a>00114     <a class="code" href="a00158.html#g5d56800f82bfc7bbf53bb4a659589812">PSOCK_CLOSE</a>(&amp;s.psock);
+<a name="l00115"></a>00115     <a class="code" href="a00161.html#gb1fc692a2700b7a51517724364683f67">smtp_done</a>(4);
+<a name="l00116"></a>00116     <a class="code" href="a00158.html#gfa11b2a1faf395ae2a6626e01c482d5d">PSOCK_EXIT</a>(&amp;s.psock);
+<a name="l00117"></a>00117   }
+<a name="l00118"></a>00118 
+<a name="l00119"></a>00119   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, (<span class="keywordtype">char</span> *)smtp_rcpt_to);
+<a name="l00120"></a>00120   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, s.<a name="a175"></a><a class="code" href="a00085.html#3592a1f5ae100db2ed9c0810b41c7bc7">to</a>);
+<a name="l00121"></a>00121   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, (<span class="keywordtype">char</span> *)smtp_crnl);
+<a name="l00122"></a>00122 
+<a name="l00123"></a>00123   <a class="code" href="a00158.html#gb5d9c0becf7cb32d0aaef466839dd92e">PSOCK_READTO</a>(&amp;s.psock, <a class="code" href="a00161.html#g3212e70c55244608ac16316888c354f0">ISO_nl</a>);
+<a name="l00124"></a>00124   
+<a name="l00125"></a>00125   <span class="keywordflow">if</span>(s.inputbuffer[0] != <a class="code" href="a00161.html#g34b924954ba5707d536df28d71a80d39">ISO_2</a>) {
+<a name="l00126"></a>00126     <a class="code" href="a00158.html#g5d56800f82bfc7bbf53bb4a659589812">PSOCK_CLOSE</a>(&amp;s.psock);
+<a name="l00127"></a>00127     <a class="code" href="a00161.html#gb1fc692a2700b7a51517724364683f67">smtp_done</a>(5);
+<a name="l00128"></a>00128     <a class="code" href="a00158.html#gfa11b2a1faf395ae2a6626e01c482d5d">PSOCK_EXIT</a>(&amp;s.psock);
+<a name="l00129"></a>00129   }
+<a name="l00130"></a>00130   
+<a name="l00131"></a>00131   <span class="keywordflow">if</span>(s.cc != 0) {
+<a name="l00132"></a>00132     <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, (<span class="keywordtype">char</span> *)smtp_rcpt_to);
+<a name="l00133"></a>00133     <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, s.cc);
+<a name="l00134"></a>00134     <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, (<span class="keywordtype">char</span> *)smtp_crnl);
+<a name="l00135"></a>00135 
+<a name="l00136"></a>00136     <a class="code" href="a00158.html#gb5d9c0becf7cb32d0aaef466839dd92e">PSOCK_READTO</a>(&amp;s.psock, <a class="code" href="a00161.html#g3212e70c55244608ac16316888c354f0">ISO_nl</a>);
+<a name="l00137"></a>00137   
+<a name="l00138"></a>00138     <span class="keywordflow">if</span>(s.inputbuffer[0] != <a class="code" href="a00161.html#g34b924954ba5707d536df28d71a80d39">ISO_2</a>) {
+<a name="l00139"></a>00139       <a class="code" href="a00158.html#g5d56800f82bfc7bbf53bb4a659589812">PSOCK_CLOSE</a>(&amp;s.psock);
+<a name="l00140"></a>00140       <a class="code" href="a00161.html#gb1fc692a2700b7a51517724364683f67">smtp_done</a>(6);
+<a name="l00141"></a>00141       <a class="code" href="a00158.html#gfa11b2a1faf395ae2a6626e01c482d5d">PSOCK_EXIT</a>(&amp;s.psock);
+<a name="l00142"></a>00142     }
+<a name="l00143"></a>00143   }
+<a name="l00144"></a>00144   
+<a name="l00145"></a>00145   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, (<span class="keywordtype">char</span> *)smtp_data);
+<a name="l00146"></a>00146   
+<a name="l00147"></a>00147   <a class="code" href="a00158.html#gb5d9c0becf7cb32d0aaef466839dd92e">PSOCK_READTO</a>(&amp;s.psock, <a class="code" href="a00161.html#g3212e70c55244608ac16316888c354f0">ISO_nl</a>);
+<a name="l00148"></a>00148   
+<a name="l00149"></a>00149   <span class="keywordflow">if</span>(s.inputbuffer[0] != <a name="a176"></a><a class="code" href="a00161.html#g9e97c58fe35f750ad192774be9408ac8">ISO_3</a>) {
+<a name="l00150"></a>00150     <a class="code" href="a00158.html#g5d56800f82bfc7bbf53bb4a659589812">PSOCK_CLOSE</a>(&amp;s.psock);
+<a name="l00151"></a>00151     <a class="code" href="a00161.html#gb1fc692a2700b7a51517724364683f67">smtp_done</a>(7);
+<a name="l00152"></a>00152     <a class="code" href="a00158.html#gfa11b2a1faf395ae2a6626e01c482d5d">PSOCK_EXIT</a>(&amp;s.psock);
+<a name="l00153"></a>00153   }
+<a name="l00154"></a>00154 
+<a name="l00155"></a>00155   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, (<span class="keywordtype">char</span> *)smtp_to);
+<a name="l00156"></a>00156   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, s.<a class="code" href="a00085.html#3592a1f5ae100db2ed9c0810b41c7bc7">to</a>);
+<a name="l00157"></a>00157   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, (<span class="keywordtype">char</span> *)smtp_crnl);
+<a name="l00158"></a>00158   
+<a name="l00159"></a>00159   <span class="keywordflow">if</span>(s.cc != 0) {
+<a name="l00160"></a>00160     <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, (<span class="keywordtype">char</span> *)smtp_cc);
+<a name="l00161"></a>00161     <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, s.cc);
+<a name="l00162"></a>00162     <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, (<span class="keywordtype">char</span> *)smtp_crnl);
+<a name="l00163"></a>00163   }
+<a name="l00164"></a>00164   
+<a name="l00165"></a>00165   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, (<span class="keywordtype">char</span> *)smtp_from);
+<a name="l00166"></a>00166   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, s.<a class="code" href="a00085.html#668cab7d54ff0a2fc2a2179ca06b0798">from</a>);
+<a name="l00167"></a>00167   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, (<span class="keywordtype">char</span> *)smtp_crnl);
+<a name="l00168"></a>00168   
+<a name="l00169"></a>00169   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, (<span class="keywordtype">char</span> *)smtp_subject);
+<a name="l00170"></a>00170   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, s.<a name="a177"></a><a class="code" href="a00085.html#503c2994a4e52300516e2b820f0fc65b">subject</a>);
+<a name="l00171"></a>00171   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, (<span class="keywordtype">char</span> *)smtp_crnl);
+<a name="l00172"></a>00172 
+<a name="l00173"></a>00173   <a name="a178"></a><a class="code" href="a00158.html#g70d236d1cf34b4e21836edda60247b70">PSOCK_SEND</a>(&amp;s.psock, s.<a name="a179"></a><a class="code" href="a00085.html#04833004cec509a41c502429df308e35">msg</a>, s.<a name="a180"></a><a class="code" href="a00085.html#a312da7b5f6441140721ec7e55f345a8">msglen</a>);
+<a name="l00174"></a>00174   
+<a name="l00175"></a>00175   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, (<span class="keywordtype">char</span> *)smtp_crnlperiodcrnl);
+<a name="l00176"></a>00176 
+<a name="l00177"></a>00177   <a class="code" href="a00158.html#gb5d9c0becf7cb32d0aaef466839dd92e">PSOCK_READTO</a>(&amp;s.psock, <a class="code" href="a00161.html#g3212e70c55244608ac16316888c354f0">ISO_nl</a>);
+<a name="l00178"></a>00178   <span class="keywordflow">if</span>(s.inputbuffer[0] != <a class="code" href="a00161.html#g34b924954ba5707d536df28d71a80d39">ISO_2</a>) {
+<a name="l00179"></a>00179     <a class="code" href="a00158.html#g5d56800f82bfc7bbf53bb4a659589812">PSOCK_CLOSE</a>(&amp;s.psock);
+<a name="l00180"></a>00180     <a class="code" href="a00161.html#gb1fc692a2700b7a51517724364683f67">smtp_done</a>(8);
+<a name="l00181"></a>00181     <a class="code" href="a00158.html#gfa11b2a1faf395ae2a6626e01c482d5d">PSOCK_EXIT</a>(&amp;s.psock);
+<a name="l00182"></a>00182   }
+<a name="l00183"></a>00183 
+<a name="l00184"></a>00184   <a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">PSOCK_SEND_STR</a>(&amp;s.psock, (<span class="keywordtype">char</span> *)smtp_quit);
+<a name="l00185"></a>00185   <a class="code" href="a00161.html#gb1fc692a2700b7a51517724364683f67">smtp_done</a>(<a name="a181"></a><a class="code" href="a00161.html#g029256bc17a12e1e86781887e11c0c7d">SMTP_ERR_OK</a>);
+<a name="l00186"></a>00186   <a name="a182"></a><a class="code" href="a00158.html#g4a264bb64ae706d53f572b1d9e4037a2">PSOCK_END</a>(&amp;s.psock);
+<a name="l00187"></a>00187 }
+<a name="l00188"></a>00188 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00189"></a>00189 <span class="keywordtype">void</span>
+<a name="l00190"></a>00190 <a name="a183"></a><a class="code" href="a00161.html#gbc331f73107958428bf1c392ba19b6f4">smtp_appcall</a>(<span class="keywordtype">void</span>)
+<a name="l00191"></a>00191 {
+<a name="l00192"></a>00192   <span class="keywordflow">if</span>(<a name="a184"></a><a class="code" href="a00147.html#gef6c4140c632b6a406779342cf3b6eb6">uip_closed</a>()) {
+<a name="l00193"></a>00193     s.connected = 0;
+<a name="l00194"></a>00194     <span class="keywordflow">return</span>;
+<a name="l00195"></a>00195   }
+<a name="l00196"></a>00196   <span class="keywordflow">if</span>(<a name="a185"></a><a class="code" href="a00147.html#gfbd5fc486dfdf6bf6fc9db52b1f418c4">uip_aborted</a>() || <a name="a186"></a><a class="code" href="a00147.html#g7b2ac4b18bd2ac3912fe67b3b17158c3">uip_timedout</a>()) {
+<a name="l00197"></a>00197     s.connected = 0;
+<a name="l00198"></a>00198     <a class="code" href="a00161.html#gb1fc692a2700b7a51517724364683f67">smtp_done</a>(1);
+<a name="l00199"></a>00199     <span class="keywordflow">return</span>;
+<a name="l00200"></a>00200   }
+<a name="l00201"></a>00201   smtp_thread();
+<a name="l00202"></a>00202 }
+<a name="l00203"></a>00203 <span class="comment">/*---------------------------------------------------------------------------*/</span><span class="comment"></span>
+<a name="l00204"></a>00204 <span class="comment">/**</span>
+<a name="l00205"></a>00205 <span class="comment"> * Specificy an SMTP server and hostname.</span>
+<a name="l00206"></a>00206 <span class="comment"> *</span>
+<a name="l00207"></a>00207 <span class="comment"> * This function is used to configure the SMTP module with an SMTP</span>
+<a name="l00208"></a>00208 <span class="comment"> * server and the hostname of the host.</span>
+<a name="l00209"></a>00209 <span class="comment"> *</span>
+<a name="l00210"></a>00210 <span class="comment"> * \param lhostname The hostname of the uIP host.</span>
+<a name="l00211"></a>00211 <span class="comment"> *</span>
+<a name="l00212"></a>00212 <span class="comment"> * \param server A pointer to a 4-byte array representing the IP</span>
+<a name="l00213"></a>00213 <span class="comment"> * address of the SMTP server to be configured.</span>
+<a name="l00214"></a>00214 <span class="comment"> */</span>
+<a name="l00215"></a>00215 <span class="keywordtype">void</span>
+<a name="l00216"></a>00216 smtp_configure(<span class="keywordtype">char</span> *lhostname, <span class="keywordtype">void</span> *server)
+<a name="l00217"></a>00217 {
+<a name="l00218"></a>00218   localhostname = lhostname;
+<a name="l00219"></a>00219   <a name="a187"></a><a class="code" href="a00148.html#g769512993b7b27271909d6daa4748b60">uip_ipaddr_copy</a>(smtpserver, server);
+<a name="l00220"></a>00220 }
+<a name="l00221"></a>00221 <span class="comment">/*---------------------------------------------------------------------------*/</span><span class="comment"></span>
+<a name="l00222"></a>00222 <span class="comment">/**</span>
+<a name="l00223"></a>00223 <span class="comment"> * Send an e-mail.</span>
+<a name="l00224"></a>00224 <span class="comment"> *</span>
+<a name="l00225"></a>00225 <span class="comment"> * \param to The e-mail address of the receiver of the e-mail.</span>
+<a name="l00226"></a>00226 <span class="comment"> * \param cc The e-mail address of the CC: receivers of the e-mail.</span>
+<a name="l00227"></a>00227 <span class="comment"> * \param from The e-mail address of the sender of the e-mail.</span>
+<a name="l00228"></a>00228 <span class="comment"> * \param subject The subject of the e-mail.</span>
+<a name="l00229"></a>00229 <span class="comment"> * \param msg The actual e-mail message.</span>
+<a name="l00230"></a>00230 <span class="comment"> * \param msglen The length of the e-mail message.</span>
+<a name="l00231"></a>00231 <span class="comment"> */</span>
+<a name="l00232"></a>00232 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>
+<a name="l00233"></a>00233 smtp_send(<span class="keywordtype">char</span> *<a class="code" href="a00085.html#3592a1f5ae100db2ed9c0810b41c7bc7">to</a>, <span class="keywordtype">char</span> *cc, <span class="keywordtype">char</span> *<a class="code" href="a00085.html#668cab7d54ff0a2fc2a2179ca06b0798">from</a>,
+<a name="l00234"></a>00234           <span class="keywordtype">char</span> *<a class="code" href="a00085.html#503c2994a4e52300516e2b820f0fc65b">subject</a>, <span class="keywordtype">char</span> *<a class="code" href="a00085.html#04833004cec509a41c502429df308e35">msg</a>, <a name="a188"></a><a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> <a class="code" href="a00085.html#a312da7b5f6441140721ec7e55f345a8">msglen</a>)
+<a name="l00235"></a>00235 {
+<a name="l00236"></a>00236   <span class="keyword">struct </span><a name="a189"></a><a class="code" href="a00150.html#g788ffac72342f6172343d7f8099cbe1a">uip_conn</a> *conn;
+<a name="l00237"></a>00237 
+<a name="l00238"></a>00238   conn = <a name="a190"></a><a class="code" href="a00147.html#g8096b0c4b543dc408f4dd031ddae7240">uip_connect</a>(smtpserver, <a name="a191"></a><a class="code" href="a00148.html#g69a7a4951ff21b302267532c21ee78fc">HTONS</a>(25));
+<a name="l00239"></a>00239   <span class="keywordflow">if</span>(conn == <a name="a192"></a><a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) {
+<a name="l00240"></a>00240     <span class="keywordflow">return</span> 0;
+<a name="l00241"></a>00241   }
+<a name="l00242"></a>00242   s.connected = 1;
+<a name="l00243"></a>00243   s.<a class="code" href="a00085.html#3592a1f5ae100db2ed9c0810b41c7bc7">to</a> = to;
+<a name="l00244"></a>00244   s.cc = cc;
+<a name="l00245"></a>00245   s.<a class="code" href="a00085.html#668cab7d54ff0a2fc2a2179ca06b0798">from</a> = from;
+<a name="l00246"></a>00246   s.<a class="code" href="a00085.html#503c2994a4e52300516e2b820f0fc65b">subject</a> = subject;
+<a name="l00247"></a>00247   s.<a class="code" href="a00085.html#04833004cec509a41c502429df308e35">msg</a> = msg;
+<a name="l00248"></a>00248   s.<a class="code" href="a00085.html#a312da7b5f6441140721ec7e55f345a8">msglen</a> = msglen;
+<a name="l00249"></a>00249 
+<a name="l00250"></a>00250   <a name="a193"></a><a class="code" href="a00158.html#g26ae707402e494f3895a9f012a93ea29">PSOCK_INIT</a>(&amp;s.psock, s.inputbuffer, <span class="keyword">sizeof</span>(s.inputbuffer));
+<a name="l00251"></a>00251   
+<a name="l00252"></a>00252   <span class="keywordflow">return</span> 1;
+<a name="l00253"></a>00253 }
+<a name="l00254"></a>00254 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00255"></a>00255 <span class="keywordtype">void</span>
+<a name="l00256"></a>00256 <a name="a194"></a><a class="code" href="a00161.html#g64807ba7c221ddf735572d05021539f2">smtp_init</a>(<span class="keywordtype">void</span>)
+<a name="l00257"></a>00257 {
+<a name="l00258"></a>00258   s.connected = 0;
+<a name="l00259"></a>00259 }
+<a name="l00260"></a>00260 <span class="comment">/*---------------------------------------------------------------------------*/</span><span class="comment"></span>
+<a name="l00261"></a>00261 <span class="comment">/** @} */</span><span class="comment"></span>
+<a name="l00262"></a>00262 <span class="comment">/** @} */</span>
+</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 123 - 0
components/net/uip/doc/html/a00039.html

@@ -0,0 +1,123 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: smtp.h</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<h1>smtp.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment"></span>
+<a name="l00002"></a>00002 <span class="comment">/**</span>
+<a name="l00003"></a>00003 <span class="comment"> * \addtogroup smtp</span>
+<a name="l00004"></a>00004 <span class="comment"> * @{</span>
+<a name="l00005"></a>00005 <span class="comment"> */</span>
+<a name="l00006"></a>00006 
+<a name="l00007"></a>00007 <span class="comment"></span>
+<a name="l00008"></a>00008 <span class="comment">/**</span>
+<a name="l00009"></a>00009 <span class="comment"> * \file</span>
+<a name="l00010"></a>00010 <span class="comment"> * SMTP header file</span>
+<a name="l00011"></a>00011 <span class="comment"> * \author Adam Dunkels &lt;adam@dunkels.com&gt;</span>
+<a name="l00012"></a>00012 <span class="comment"> */</span>
+<a name="l00013"></a>00013 
+<a name="l00014"></a>00014 <span class="comment">/*</span>
+<a name="l00015"></a>00015 <span class="comment"> * Copyright (c) 2002, Adam Dunkels.</span>
+<a name="l00016"></a>00016 <span class="comment"> * All rights reserved.</span>
+<a name="l00017"></a>00017 <span class="comment"> *</span>
+<a name="l00018"></a>00018 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00019"></a>00019 <span class="comment"> * modification, are permitted provided that the following conditions</span>
+<a name="l00020"></a>00020 <span class="comment"> * are met:</span>
+<a name="l00021"></a>00021 <span class="comment"> * 1. Redistributions of source code must retain the above copyright</span>
+<a name="l00022"></a>00022 <span class="comment"> *    notice, this list of conditions and the following disclaimer.</span>
+<a name="l00023"></a>00023 <span class="comment"> * 2. Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00024"></a>00024 <span class="comment"> *    notice, this list of conditions and the following disclaimer in the</span>
+<a name="l00025"></a>00025 <span class="comment"> *    documentation and/or other materials provided with the distribution.</span>
+<a name="l00026"></a>00026 <span class="comment"> * 3. The name of the author may not be used to endorse or promote</span>
+<a name="l00027"></a>00027 <span class="comment"> *    products derived from this software without specific prior</span>
+<a name="l00028"></a>00028 <span class="comment"> *    written permission.</span>
+<a name="l00029"></a>00029 <span class="comment"> *</span>
+<a name="l00030"></a>00030 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS</span>
+<a name="l00031"></a>00031 <span class="comment"> * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00032"></a>00032 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span>
+<a name="l00033"></a>00033 <span class="comment"> * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY</span>
+<a name="l00034"></a>00034 <span class="comment"> * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</span>
+<a name="l00035"></a>00035 <span class="comment"> * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE</span>
+<a name="l00036"></a>00036 <span class="comment"> * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span>
+<a name="l00037"></a>00037 <span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,</span>
+<a name="l00038"></a>00038 <span class="comment"> * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING</span>
+<a name="l00039"></a>00039 <span class="comment"> * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00040"></a>00040 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00041"></a>00041 <span class="comment"> *</span>
+<a name="l00042"></a>00042 <span class="comment"> * This file is part of the uIP TCP/IP stack.</span>
+<a name="l00043"></a>00043 <span class="comment"> *</span>
+<a name="l00044"></a>00044 <span class="comment"> * $Id: smtp.h,v 1.4 2006/06/11 21:46:37 adam Exp $</span>
+<a name="l00045"></a>00045 <span class="comment"> *</span>
+<a name="l00046"></a>00046 <span class="comment"> */</span>
+<a name="l00047"></a>00047 <span class="preprocessor">#ifndef __SMTP_H__</span>
+<a name="l00048"></a>00048 <span class="preprocessor"></span><span class="preprocessor">#define __SMTP_H__</span>
+<a name="l00049"></a>00049 <span class="preprocessor"></span>
+<a name="l00050"></a>00050 <span class="preprocessor">#include "<a class="code" href="a00140.html">uipopt.h</a>"</span>
+<a name="l00051"></a>00051 <span class="comment"></span>
+<a name="l00052"></a>00052 <span class="comment">/**</span>
+<a name="l00053"></a>00053 <span class="comment"> * Error number that signifies a non-error condition.</span>
+<a name="l00054"></a>00054 <span class="comment"> */</span>
+<a name="l00055"></a>00055 <span class="preprocessor">#define SMTP_ERR_OK 0</span>
+<a name="l00056"></a>00056 <span class="preprocessor"></span><span class="comment"></span>
+<a name="l00057"></a>00057 <span class="comment">/**</span>
+<a name="l00058"></a>00058 <span class="comment"> * Callback function that is called when an e-mail transmission is</span>
+<a name="l00059"></a>00059 <span class="comment"> * done.</span>
+<a name="l00060"></a>00060 <span class="comment"> *</span>
+<a name="l00061"></a>00061 <span class="comment"> * This function must be implemented by the module that uses the SMTP</span>
+<a name="l00062"></a>00062 <span class="comment"> * module.</span>
+<a name="l00063"></a>00063 <span class="comment"> *</span>
+<a name="l00064"></a>00064 <span class="comment"> * \param error The number of the error if an error occured, or</span>
+<a name="l00065"></a>00065 <span class="comment"> * SMTP_ERR_OK.</span>
+<a name="l00066"></a>00066 <span class="comment"> */</span>
+<a name="l00067"></a>00067 <span class="keywordtype">void</span> <a name="a195"></a><a class="code" href="a00161.html#gb1fc692a2700b7a51517724364683f67">smtp_done</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> error);
+<a name="l00068"></a>00068 
+<a name="l00069"></a>00069 <span class="keywordtype">void</span> <a name="a196"></a><a class="code" href="a00161.html#g64807ba7c221ddf735572d05021539f2">smtp_init</a>(<span class="keywordtype">void</span>);
+<a name="l00070"></a>00070 
+<a name="l00071"></a>00071 <span class="comment">/* Functions. */</span>
+<a name="l00072"></a>00072 <span class="keywordtype">void</span> smtp_configure(<span class="keywordtype">char</span> *localhostname, <a name="a197"></a><a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> *smtpserver);
+<a name="l00073"></a>00073 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> smtp_send(<span class="keywordtype">char</span> *to, <span class="keywordtype">char</span> *from,
+<a name="l00074"></a>00074                         <span class="keywordtype">char</span> *subject, <span class="keywordtype">char</span> *msg,
+<a name="l00075"></a>00075                         <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> msglen);
+<a name="l00076"></a>00076 <span class="preprocessor">#define SMTP_SEND(to, cc, from, subject, msg) \</span>
+<a name="l00077"></a>00077 <span class="preprocessor">        smtp_send(to, cc, from, subject, msg, strlen(msg))</span>
+<a name="l00078"></a>00078 <span class="preprocessor"></span>
+<a name="l00079"></a>00079 <span class="keywordtype">void</span> <a name="a198"></a><a class="code" href="a00161.html#gbc331f73107958428bf1c392ba19b6f4">smtp_appcall</a>(<span class="keywordtype">void</span>);
+<a name="l00080"></a>00080 
+<a name="l00081"></a>00081 <span class="keyword">struct </span><a name="_a199"></a><a class="code" href="a00085.html">smtp_state</a> {
+<a name="l00082"></a>00082   <a name="a200"></a><a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> <a name="a201"></a><a class="code" href="a00085.html#0bb4f34164e7207c2db26b77f23ccfff">state</a>;
+<a name="l00083"></a>00083   <span class="keywordtype">char</span> *to;
+<a name="l00084"></a>00084   <span class="keywordtype">char</span> *from;
+<a name="l00085"></a>00085   <span class="keywordtype">char</span> *subject;
+<a name="l00086"></a>00086   <span class="keywordtype">char</span> *msg;
+<a name="l00087"></a>00087   <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> msglen;
+<a name="l00088"></a>00088   
+<a name="l00089"></a>00089   <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> <a name="a202"></a><a class="code" href="a00085.html#68204df6bde3e3c27271ebde10579a57">sentlen</a>, <a name="a203"></a><a class="code" href="a00085.html#0560495c60c68d62617ff1f3d0c424a4">textlen</a>;
+<a name="l00090"></a>00090   <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> <a name="a204"></a><a class="code" href="a00085.html#5ed2615cec9e633d90ac5968771976eb">sendptr</a>;
+<a name="l00091"></a>00091 
+<a name="l00092"></a>00092 };
+<a name="l00093"></a>00093 
+<a name="l00094"></a>00094 
+<a name="l00095"></a>00095 <span class="preprocessor">#ifndef UIP_APPCALL</span>
+<a name="l00096"></a>00096 <span class="preprocessor"></span><span class="preprocessor">#define UIP_APPCALL     smtp_appcall</span>
+<a name="l00097"></a>00097 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00098"></a>00098 <span class="preprocessor"></span><span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="a00085.html">smtp_state</a> <a name="a205"></a><a class="code" href="a00153.html#g69646a81a922033c5281445a71f8ffed">uip_tcp_appstate_t</a>;
+<a name="l00099"></a>00099 
+<a name="l00100"></a>00100 
+<a name="l00101"></a>00101 <span class="preprocessor">#endif </span><span class="comment">/* __SMTP_H__ */</span>
+<a name="l00102"></a>00102 <span class="comment"></span>
+<a name="l00103"></a>00103 <span class="comment">/** @} */</span>
+</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 459 - 0
components/net/uip/doc/html/a00040.html

@@ -0,0 +1,459 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: webclient.c</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<h1>webclient.c</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/**</span>
+<a name="l00002"></a>00002 <span class="comment"> * \addtogroup apps</span>
+<a name="l00003"></a>00003 <span class="comment"> * @{</span>
+<a name="l00004"></a>00004 <span class="comment"> */</span>
+<a name="l00005"></a>00005 <span class="comment"></span>
+<a name="l00006"></a>00006 <span class="comment">/**</span>
+<a name="l00007"></a>00007 <span class="comment"> * \defgroup webclient Web client</span>
+<a name="l00008"></a>00008 <span class="comment"> * @{</span>
+<a name="l00009"></a>00009 <span class="comment"> *</span>
+<a name="l00010"></a>00010 <span class="comment"> * This example shows a HTTP client that is able to download web pages</span>
+<a name="l00011"></a>00011 <span class="comment"> * and files from web servers. It requires a number of callback</span>
+<a name="l00012"></a>00012 <span class="comment"> * functions to be implemented by the module that utilizes the code:</span>
+<a name="l00013"></a>00013 <span class="comment"> * webclient_datahandler(), webclient_connected(),</span>
+<a name="l00014"></a>00014 <span class="comment"> * webclient_timedout(), webclient_aborted(), webclient_closed().</span>
+<a name="l00015"></a>00015 <span class="comment"> */</span>
+<a name="l00016"></a>00016 <span class="comment"></span>
+<a name="l00017"></a>00017 <span class="comment">/**</span>
+<a name="l00018"></a>00018 <span class="comment"> * \file</span>
+<a name="l00019"></a>00019 <span class="comment"> * Implementation of the HTTP client.</span>
+<a name="l00020"></a>00020 <span class="comment"> * \author Adam Dunkels &lt;adam@dunkels.com&gt;</span>
+<a name="l00021"></a>00021 <span class="comment"> */</span>
+<a name="l00022"></a>00022 
+<a name="l00023"></a>00023 <span class="comment">/*</span>
+<a name="l00024"></a>00024 <span class="comment"> * Copyright (c) 2002, Adam Dunkels.</span>
+<a name="l00025"></a>00025 <span class="comment"> * All rights reserved.</span>
+<a name="l00026"></a>00026 <span class="comment"> *</span>
+<a name="l00027"></a>00027 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00028"></a>00028 <span class="comment"> * modification, are permitted provided that the following conditions</span>
+<a name="l00029"></a>00029 <span class="comment"> * are met:</span>
+<a name="l00030"></a>00030 <span class="comment"> * 1. Redistributions of source code must retain the above copyright</span>
+<a name="l00031"></a>00031 <span class="comment"> *    notice, this list of conditions and the following disclaimer.</span>
+<a name="l00032"></a>00032 <span class="comment"> * 2. Redistributions in binary form must reproduce the above</span>
+<a name="l00033"></a>00033 <span class="comment"> *    copyright notice, this list of conditions and the following</span>
+<a name="l00034"></a>00034 <span class="comment"> *    disclaimer in the documentation and/or other materials provided</span>
+<a name="l00035"></a>00035 <span class="comment"> *    with the distribution.</span>
+<a name="l00036"></a>00036 <span class="comment"> * 3. The name of the author may not be used to endorse or promote</span>
+<a name="l00037"></a>00037 <span class="comment"> *    products derived from this software without specific prior</span>
+<a name="l00038"></a>00038 <span class="comment"> *    written permission.</span>
+<a name="l00039"></a>00039 <span class="comment"> *</span>
+<a name="l00040"></a>00040 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS</span>
+<a name="l00041"></a>00041 <span class="comment"> * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00042"></a>00042 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span>
+<a name="l00043"></a>00043 <span class="comment"> * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY</span>
+<a name="l00044"></a>00044 <span class="comment"> * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</span>
+<a name="l00045"></a>00045 <span class="comment"> * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE</span>
+<a name="l00046"></a>00046 <span class="comment"> * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span>
+<a name="l00047"></a>00047 <span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,</span>
+<a name="l00048"></a>00048 <span class="comment"> * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING</span>
+<a name="l00049"></a>00049 <span class="comment"> * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00050"></a>00050 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00051"></a>00051 <span class="comment"> *</span>
+<a name="l00052"></a>00052 <span class="comment"> * This file is part of the uIP TCP/IP stack.</span>
+<a name="l00053"></a>00053 <span class="comment"> *</span>
+<a name="l00054"></a>00054 <span class="comment"> * $Id: webclient.c,v 1.2 2006/06/11 21:46:37 adam Exp $</span>
+<a name="l00055"></a>00055 <span class="comment"> *</span>
+<a name="l00056"></a>00056 <span class="comment"> */</span>
+<a name="l00057"></a>00057 
+<a name="l00058"></a>00058 <span class="preprocessor">#include "<a class="code" href="a00136.html">uip.h</a>"</span>
+<a name="l00059"></a>00059 <span class="preprocessor">#include "uiplib.h"</span>
+<a name="l00060"></a>00060 <span class="preprocessor">#include "<a class="code" href="a00111.html">webclient.h</a>"</span>
+<a name="l00061"></a>00061 <span class="preprocessor">#include "<a class="code" href="a00103.html">resolv.h</a>"</span>
+<a name="l00062"></a>00062 
+<a name="l00063"></a>00063 <span class="preprocessor">#include &lt;string.h&gt;</span>
+<a name="l00064"></a>00064 
+<a name="l00065"></a>00065 <span class="preprocessor">#define WEBCLIENT_TIMEOUT 100</span>
+<a name="l00066"></a>00066 <span class="preprocessor"></span>
+<a name="l00067"></a>00067 <span class="preprocessor">#define WEBCLIENT_STATE_STATUSLINE 0</span>
+<a name="l00068"></a>00068 <span class="preprocessor"></span><span class="preprocessor">#define WEBCLIENT_STATE_HEADERS    1</span>
+<a name="l00069"></a>00069 <span class="preprocessor"></span><span class="preprocessor">#define WEBCLIENT_STATE_DATA       2</span>
+<a name="l00070"></a>00070 <span class="preprocessor"></span><span class="preprocessor">#define WEBCLIENT_STATE_CLOSE      3</span>
+<a name="l00071"></a>00071 <span class="preprocessor"></span>
+<a name="l00072"></a>00072 <span class="preprocessor">#define HTTPFLAG_NONE   0</span>
+<a name="l00073"></a>00073 <span class="preprocessor"></span><span class="preprocessor">#define HTTPFLAG_OK     1</span>
+<a name="l00074"></a>00074 <span class="preprocessor"></span><span class="preprocessor">#define HTTPFLAG_MOVED  2</span>
+<a name="l00075"></a>00075 <span class="preprocessor"></span><span class="preprocessor">#define HTTPFLAG_ERROR  3</span>
+<a name="l00076"></a>00076 <span class="preprocessor"></span>
+<a name="l00077"></a>00077 
+<a name="l00078"></a>00078 <span class="preprocessor">#define ISO_nl       0x0a</span>
+<a name="l00079"></a>00079 <span class="preprocessor"></span><span class="preprocessor">#define ISO_cr       0x0d</span>
+<a name="l00080"></a>00080 <span class="preprocessor"></span><span class="preprocessor">#define ISO_space    0x20</span>
+<a name="l00081"></a>00081 <span class="preprocessor"></span>
+<a name="l00082"></a>00082 
+<a name="l00083"></a>00083 <span class="keyword">static</span> <span class="keyword">struct </span><a name="_a251"></a><a class="code" href="a00097.html">webclient_state</a> s;
+<a name="l00084"></a>00084 
+<a name="l00085"></a>00085 <span class="comment">/*-----------------------------------------------------------------------------------*/</span>
+<a name="l00086"></a>00086 <span class="keywordtype">char</span> *
+<a name="l00087"></a>00087 <a name="a252"></a><a class="code" href="a00163.html#g4433d3af16ea083a81576d0f18ba57c9">webclient_mimetype</a>(<span class="keywordtype">void</span>)
+<a name="l00088"></a>00088 {
+<a name="l00089"></a>00089   <span class="keywordflow">return</span> s.<a name="a253"></a><a class="code" href="a00097.html#fb60f42593d305ea36d9b4303722696e">mimetype</a>;
+<a name="l00090"></a>00090 }
+<a name="l00091"></a>00091 <span class="comment">/*-----------------------------------------------------------------------------------*/</span>
+<a name="l00092"></a>00092 <span class="keywordtype">char</span> *
+<a name="l00093"></a>00093 <a name="a254"></a><a class="code" href="a00163.html#g41e616d3fcc17e0aabfe8ab45ef0d30f">webclient_filename</a>(<span class="keywordtype">void</span>)
+<a name="l00094"></a>00094 {
+<a name="l00095"></a>00095   <span class="keywordflow">return</span> s.<a name="a255"></a><a class="code" href="a00097.html#e87913860c6b05c6e6b060639b950098">file</a>;
+<a name="l00096"></a>00096 }
+<a name="l00097"></a>00097 <span class="comment">/*-----------------------------------------------------------------------------------*/</span>
+<a name="l00098"></a>00098 <span class="keywordtype">char</span> *
+<a name="l00099"></a>00099 <a name="a256"></a><a class="code" href="a00163.html#g0e0ea5f24b77f124ba33bcbc7ede5bfb">webclient_hostname</a>(<span class="keywordtype">void</span>)
+<a name="l00100"></a>00100 {
+<a name="l00101"></a>00101   <span class="keywordflow">return</span> s.<a name="a257"></a><a class="code" href="a00097.html#a6487b9c1c773b32656065d0e19bf142">host</a>;
+<a name="l00102"></a>00102 }
+<a name="l00103"></a>00103 <span class="comment">/*-----------------------------------------------------------------------------------*/</span>
+<a name="l00104"></a>00104 <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span>
+<a name="l00105"></a>00105 <a name="a258"></a><a class="code" href="a00163.html#g2a939aa4fcffabbce1dc1f784a7e0ad3">webclient_port</a>(<span class="keywordtype">void</span>)
+<a name="l00106"></a>00106 {
+<a name="l00107"></a>00107   <span class="keywordflow">return</span> s.<a name="a259"></a><a class="code" href="a00097.html#7092781c50dcad50f473888585c85b83">port</a>;
+<a name="l00108"></a>00108 }
+<a name="l00109"></a>00109 <span class="comment">/*-----------------------------------------------------------------------------------*/</span>
+<a name="l00110"></a>00110 <span class="keywordtype">void</span>
+<a name="l00111"></a>00111 <a name="a260"></a><a class="code" href="a00163.html#g3caacabb2fe1c71921e1a471719ccbd2">webclient_init</a>(<span class="keywordtype">void</span>)
+<a name="l00112"></a>00112 {
+<a name="l00113"></a>00113 
+<a name="l00114"></a>00114 }
+<a name="l00115"></a>00115 <span class="comment">/*-----------------------------------------------------------------------------------*/</span>
+<a name="l00116"></a>00116 <span class="keyword">static</span> <span class="keywordtype">void</span>
+<a name="l00117"></a>00117 init_connection(<span class="keywordtype">void</span>)
+<a name="l00118"></a>00118 {
+<a name="l00119"></a>00119   s.<a name="a261"></a><a class="code" href="a00097.html#8ae6395641b7752dce47881e20cee970">state</a> = <a name="a262"></a><a class="code" href="a00163.html#g8714af98a550f10dc814db92b08d1b0d">WEBCLIENT_STATE_STATUSLINE</a>;
+<a name="l00120"></a>00120 
+<a name="l00121"></a>00121   s.<a name="a263"></a><a class="code" href="a00097.html#5a3116623c6a7da7c82db6c301ae0da3">getrequestleft</a> = <span class="keyword">sizeof</span>(http_get) - 1 + 1 +
+<a name="l00122"></a>00122     <span class="keyword">sizeof</span>(http_10) - 1 +
+<a name="l00123"></a>00123     <span class="keyword">sizeof</span>(http_crnl) - 1 +
+<a name="l00124"></a>00124     <span class="keyword">sizeof</span>(http_host) - 1 +
+<a name="l00125"></a>00125     <span class="keyword">sizeof</span>(http_crnl) - 1 +
+<a name="l00126"></a>00126     strlen(http_user_agent_fields) +
+<a name="l00127"></a>00127     strlen(s.<a class="code" href="a00097.html#e87913860c6b05c6e6b060639b950098">file</a>) + strlen(s.<a class="code" href="a00097.html#a6487b9c1c773b32656065d0e19bf142">host</a>);
+<a name="l00128"></a>00128   s.<a name="a264"></a><a class="code" href="a00097.html#134ec55c3d5abaebfed4ff8edfedf1ea">getrequestptr</a> = 0;
+<a name="l00129"></a>00129 
+<a name="l00130"></a>00130   s.<a name="a265"></a><a class="code" href="a00097.html#2fca02673894f222b01ad2d3a4d7dd79">httpheaderlineptr</a> = 0;
+<a name="l00131"></a>00131 }
+<a name="l00132"></a>00132 <span class="comment">/*-----------------------------------------------------------------------------------*/</span>
+<a name="l00133"></a>00133 <span class="keywordtype">void</span>
+<a name="l00134"></a>00134 <a name="a266"></a><a class="code" href="a00163.html#g1d34be506a61db90dd7829117efdf8cf">webclient_close</a>(<span class="keywordtype">void</span>)
+<a name="l00135"></a>00135 {
+<a name="l00136"></a>00136   s.<a class="code" href="a00097.html#8ae6395641b7752dce47881e20cee970">state</a> = <a name="a267"></a><a class="code" href="a00163.html#g863c94b0ed4a76997e53a3ccd5d0b6c3">WEBCLIENT_STATE_CLOSE</a>;
+<a name="l00137"></a>00137 }
+<a name="l00138"></a>00138 <span class="comment">/*-----------------------------------------------------------------------------------*/</span>
+<a name="l00139"></a>00139 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>
+<a name="l00140"></a>00140 <a name="a268"></a><a class="code" href="a00163.html#gf9385ef9ecc74c7d53ff2f15e62bfde3">webclient_get</a>(<span class="keywordtype">char</span> *<a class="code" href="a00097.html#a6487b9c1c773b32656065d0e19bf142">host</a>, u16_t <a class="code" href="a00097.html#7092781c50dcad50f473888585c85b83">port</a>, <span class="keywordtype">char</span> *<a class="code" href="a00097.html#e87913860c6b05c6e6b060639b950098">file</a>)
+<a name="l00141"></a>00141 {
+<a name="l00142"></a>00142   <span class="keyword">struct </span><a name="a269"></a><a class="code" href="a00150.html#g788ffac72342f6172343d7f8099cbe1a">uip_conn</a> *conn;
+<a name="l00143"></a>00143   <a name="a270"></a><a class="code" href="a00150.html#g1ef35301f43a5bbb9f89f07b5a36b9a0">uip_ipaddr_t</a> *ipaddr;
+<a name="l00144"></a>00144   <span class="keyword">static</span> <a class="code" href="a00150.html#g1ef35301f43a5bbb9f89f07b5a36b9a0">uip_ipaddr_t</a> addr;
+<a name="l00145"></a>00145   
+<a name="l00146"></a>00146   <span class="comment">/* First check if the host is an IP address. */</span>
+<a name="l00147"></a>00147   ipaddr = &amp;addr;
+<a name="l00148"></a>00148   <span class="keywordflow">if</span>(uiplib_ipaddrconv(host, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *)addr) == 0) {
+<a name="l00149"></a>00149     ipaddr = (<a class="code" href="a00150.html#g1ef35301f43a5bbb9f89f07b5a36b9a0">uip_ipaddr_t</a> *)<a name="a271"></a><a class="code" href="a00160.html#g66d19181ad5fe8b8f7c84d1f1d46a2ec">resolv_lookup</a>(host);
+<a name="l00150"></a>00150     
+<a name="l00151"></a>00151     <span class="keywordflow">if</span>(ipaddr == <a name="a272"></a><a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) {
+<a name="l00152"></a>00152       <span class="keywordflow">return</span> 0;
+<a name="l00153"></a>00153     }
+<a name="l00154"></a>00154   }
+<a name="l00155"></a>00155   
+<a name="l00156"></a>00156   conn = <a name="a273"></a><a class="code" href="a00147.html#g8096b0c4b543dc408f4dd031ddae7240">uip_connect</a>(ipaddr, <a name="a274"></a><a class="code" href="a00148.html#ga22b04cac8cf283ca12f028578bebc06">htons</a>(port));
+<a name="l00157"></a>00157   
+<a name="l00158"></a>00158   <span class="keywordflow">if</span>(conn == <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) {
+<a name="l00159"></a>00159     <span class="keywordflow">return</span> 0;
+<a name="l00160"></a>00160   }
+<a name="l00161"></a>00161   
+<a name="l00162"></a>00162   s.<a class="code" href="a00097.html#7092781c50dcad50f473888585c85b83">port</a> = port;
+<a name="l00163"></a>00163   strncpy(s.<a class="code" href="a00097.html#e87913860c6b05c6e6b060639b950098">file</a>, file, <span class="keyword">sizeof</span>(s.<a class="code" href="a00097.html#e87913860c6b05c6e6b060639b950098">file</a>));
+<a name="l00164"></a>00164   strncpy(s.<a class="code" href="a00097.html#a6487b9c1c773b32656065d0e19bf142">host</a>, host, <span class="keyword">sizeof</span>(s.<a class="code" href="a00097.html#a6487b9c1c773b32656065d0e19bf142">host</a>));
+<a name="l00165"></a>00165   
+<a name="l00166"></a>00166   init_connection();
+<a name="l00167"></a>00167   <span class="keywordflow">return</span> 1;
+<a name="l00168"></a>00168 }
+<a name="l00169"></a>00169 <span class="comment">/*-----------------------------------------------------------------------------------*/</span>
+<a name="l00170"></a>00170 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *
+<a name="l00171"></a>00171 copy_string(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *dest,
+<a name="l00172"></a>00172             <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *src, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> len)
+<a name="l00173"></a>00173 {
+<a name="l00174"></a>00174   strncpy(dest, src, len);
+<a name="l00175"></a>00175   <span class="keywordflow">return</span> dest + len;
+<a name="l00176"></a>00176 }
+<a name="l00177"></a>00177 <span class="comment">/*-----------------------------------------------------------------------------------*/</span>
+<a name="l00178"></a>00178 <span class="keyword">static</span> <span class="keywordtype">void</span>
+<a name="l00179"></a>00179 senddata(<span class="keywordtype">void</span>)
+<a name="l00180"></a>00180 {
+<a name="l00181"></a>00181   u16_t len;
+<a name="l00182"></a>00182   <span class="keywordtype">char</span> *getrequest;
+<a name="l00183"></a>00183   <span class="keywordtype">char</span> *cptr;
+<a name="l00184"></a>00184   
+<a name="l00185"></a>00185   <span class="keywordflow">if</span>(s.<a class="code" href="a00097.html#5a3116623c6a7da7c82db6c301ae0da3">getrequestleft</a> &gt; 0) {
+<a name="l00186"></a>00186     cptr = getrequest = (<span class="keywordtype">char</span> *)<a name="a275"></a><a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>;
+<a name="l00187"></a>00187 
+<a name="l00188"></a>00188     cptr = copy_string(cptr, http_get, <span class="keyword">sizeof</span>(http_get) - 1);
+<a name="l00189"></a>00189     cptr = copy_string(cptr, s.<a class="code" href="a00097.html#e87913860c6b05c6e6b060639b950098">file</a>, strlen(s.<a class="code" href="a00097.html#e87913860c6b05c6e6b060639b950098">file</a>));
+<a name="l00190"></a>00190     *cptr++ = <a name="a276"></a><a class="code" href="a00163.html#g71e1b022f7b7fa3a154f19372b239935">ISO_space</a>;
+<a name="l00191"></a>00191     cptr = copy_string(cptr, http_10, <span class="keyword">sizeof</span>(http_10) - 1);
+<a name="l00192"></a>00192 
+<a name="l00193"></a>00193     cptr = copy_string(cptr, http_crnl, <span class="keyword">sizeof</span>(http_crnl) - 1);
+<a name="l00194"></a>00194     
+<a name="l00195"></a>00195     cptr = copy_string(cptr, http_host, <span class="keyword">sizeof</span>(http_host) - 1);
+<a name="l00196"></a>00196     cptr = copy_string(cptr, s.<a class="code" href="a00097.html#a6487b9c1c773b32656065d0e19bf142">host</a>, strlen(s.<a class="code" href="a00097.html#a6487b9c1c773b32656065d0e19bf142">host</a>));
+<a name="l00197"></a>00197     cptr = copy_string(cptr, http_crnl, <span class="keyword">sizeof</span>(http_crnl) - 1);
+<a name="l00198"></a>00198 
+<a name="l00199"></a>00199     cptr = copy_string(cptr, http_user_agent_fields,
+<a name="l00200"></a>00200                        strlen(http_user_agent_fields));
+<a name="l00201"></a>00201     
+<a name="l00202"></a>00202     len = s.<a class="code" href="a00097.html#5a3116623c6a7da7c82db6c301ae0da3">getrequestleft</a> &gt; <a name="a277"></a><a class="code" href="a00147.html#gb5fecbc62edd128012cea0f47b57ab9f">uip_mss</a>()?
+<a name="l00203"></a>00203       <a class="code" href="a00147.html#gb5fecbc62edd128012cea0f47b57ab9f">uip_mss</a>():
+<a name="l00204"></a>00204       s.getrequestleft;
+<a name="l00205"></a>00205     <a name="a278"></a><a class="code" href="a00147.html#g04b053a623aac7cd4195157d470661b3">uip_send</a>(&amp;(getrequest[s.<a class="code" href="a00097.html#134ec55c3d5abaebfed4ff8edfedf1ea">getrequestptr</a>]), len);
+<a name="l00206"></a>00206   }
+<a name="l00207"></a>00207 }
+<a name="l00208"></a>00208 <span class="comment">/*-----------------------------------------------------------------------------------*/</span>
+<a name="l00209"></a>00209 <span class="keyword">static</span> <span class="keywordtype">void</span>
+<a name="l00210"></a>00210 acked(<span class="keywordtype">void</span>)
+<a name="l00211"></a>00211 {
+<a name="l00212"></a>00212   u16_t len;
+<a name="l00213"></a>00213   
+<a name="l00214"></a>00214   <span class="keywordflow">if</span>(s.<a class="code" href="a00097.html#5a3116623c6a7da7c82db6c301ae0da3">getrequestleft</a> &gt; 0) {
+<a name="l00215"></a>00215     len = s.<a class="code" href="a00097.html#5a3116623c6a7da7c82db6c301ae0da3">getrequestleft</a> &gt; <a class="code" href="a00147.html#gb5fecbc62edd128012cea0f47b57ab9f">uip_mss</a>()?
+<a name="l00216"></a>00216       <a class="code" href="a00147.html#gb5fecbc62edd128012cea0f47b57ab9f">uip_mss</a>():
+<a name="l00217"></a>00217       s.getrequestleft;
+<a name="l00218"></a>00218     s.<a class="code" href="a00097.html#5a3116623c6a7da7c82db6c301ae0da3">getrequestleft</a> -= len;
+<a name="l00219"></a>00219     s.<a class="code" href="a00097.html#134ec55c3d5abaebfed4ff8edfedf1ea">getrequestptr</a> += len;
+<a name="l00220"></a>00220   }
+<a name="l00221"></a>00221 }
+<a name="l00222"></a>00222 <span class="comment">/*-----------------------------------------------------------------------------------*/</span>
+<a name="l00223"></a>00223 <span class="keyword">static</span> u16_t
+<a name="l00224"></a>00224 parse_statusline(u16_t len)
+<a name="l00225"></a>00225 {
+<a name="l00226"></a>00226   <span class="keywordtype">char</span> *cptr;
+<a name="l00227"></a>00227   
+<a name="l00228"></a>00228   <span class="keywordflow">while</span>(len &gt; 0 &amp;&amp; s.<a class="code" href="a00097.html#2fca02673894f222b01ad2d3a4d7dd79">httpheaderlineptr</a> &lt; <span class="keyword">sizeof</span>(s.<a name="a279"></a><a class="code" href="a00097.html#606d2729bf411ade69044828403a72af">httpheaderline</a>)) {
+<a name="l00229"></a>00229     s.<a class="code" href="a00097.html#606d2729bf411ade69044828403a72af">httpheaderline</a>[s.<a class="code" href="a00097.html#2fca02673894f222b01ad2d3a4d7dd79">httpheaderlineptr</a>] = *(<span class="keywordtype">char</span> *)<a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>;
+<a name="l00230"></a>00230     ++((<span class="keywordtype">char</span> *)<a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>);
+<a name="l00231"></a>00231     --len;
+<a name="l00232"></a>00232     <span class="keywordflow">if</span>(s.<a class="code" href="a00097.html#606d2729bf411ade69044828403a72af">httpheaderline</a>[s.<a class="code" href="a00097.html#2fca02673894f222b01ad2d3a4d7dd79">httpheaderlineptr</a>] == <a name="a280"></a><a class="code" href="a00161.html#g3212e70c55244608ac16316888c354f0">ISO_nl</a>) {
+<a name="l00233"></a>00233 
+<a name="l00234"></a>00234       <span class="keywordflow">if</span>((strncmp(s.<a class="code" href="a00097.html#606d2729bf411ade69044828403a72af">httpheaderline</a>, http_10,
+<a name="l00235"></a>00235                   <span class="keyword">sizeof</span>(http_10) - 1) == 0) ||
+<a name="l00236"></a>00236          (strncmp(s.<a class="code" href="a00097.html#606d2729bf411ade69044828403a72af">httpheaderline</a>, http_11,
+<a name="l00237"></a>00237                   <span class="keyword">sizeof</span>(http_11) - 1) == 0)) {
+<a name="l00238"></a>00238         cptr = &amp;(s.<a class="code" href="a00097.html#606d2729bf411ade69044828403a72af">httpheaderline</a>[9]);
+<a name="l00239"></a>00239         s.<a name="a281"></a><a class="code" href="a00097.html#6925d46b2819adb474a5f0036f02dd7d">httpflag</a> = <a name="a282"></a><a class="code" href="a00163.html#g40fb1fb2d990ce04ae9bbee275627c03">HTTPFLAG_NONE</a>;
+<a name="l00240"></a>00240         <span class="keywordflow">if</span>(strncmp(cptr, http_200, <span class="keyword">sizeof</span>(http_200) - 1) == 0) {
+<a name="l00241"></a>00241           <span class="comment">/* 200 OK */</span>
+<a name="l00242"></a>00242           s.<a class="code" href="a00097.html#6925d46b2819adb474a5f0036f02dd7d">httpflag</a> = <a name="a283"></a><a class="code" href="a00163.html#gda99954e0f6905091885934e86c278cc">HTTPFLAG_OK</a>;
+<a name="l00243"></a>00243         } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(strncmp(cptr, http_301, <span class="keyword">sizeof</span>(http_301) - 1) == 0 ||
+<a name="l00244"></a>00244                   strncmp(cptr, http_302, <span class="keyword">sizeof</span>(http_302) - 1) == 0) {
+<a name="l00245"></a>00245           <span class="comment">/* 301 Moved permanently or 302 Found. Location: header line</span>
+<a name="l00246"></a>00246 <span class="comment">             will contain thw new location. */</span>
+<a name="l00247"></a>00247           s.<a class="code" href="a00097.html#6925d46b2819adb474a5f0036f02dd7d">httpflag</a> = <a name="a284"></a><a class="code" href="a00163.html#gd895686859ae7d178d31be04eb0a1a97">HTTPFLAG_MOVED</a>;
+<a name="l00248"></a>00248         } <span class="keywordflow">else</span> {
+<a name="l00249"></a>00249           s.<a class="code" href="a00097.html#606d2729bf411ade69044828403a72af">httpheaderline</a>[s.<a class="code" href="a00097.html#2fca02673894f222b01ad2d3a4d7dd79">httpheaderlineptr</a> - 1] = 0;
+<a name="l00250"></a>00250         }
+<a name="l00251"></a>00251       } <span class="keywordflow">else</span> {
+<a name="l00252"></a>00252         <a name="a285"></a><a class="code" href="a00147.html#g88d2ccf7cd821f89d9a8df7e3948b56c">uip_abort</a>();
+<a name="l00253"></a>00253         <a name="a286"></a><a class="code" href="a00163.html#gf11d9915ec12a8cdd9fdcbb5e8fcd5c7">webclient_aborted</a>();
+<a name="l00254"></a>00254         <span class="keywordflow">return</span> 0;
+<a name="l00255"></a>00255       }
+<a name="l00256"></a>00256       
+<a name="l00257"></a>00257       <span class="comment">/* We're done parsing the status line, so we reset the pointer</span>
+<a name="l00258"></a>00258 <span class="comment">         and start parsing the HTTP headers.*/</span>
+<a name="l00259"></a>00259       s.<a class="code" href="a00097.html#2fca02673894f222b01ad2d3a4d7dd79">httpheaderlineptr</a> = 0;
+<a name="l00260"></a>00260       s.<a class="code" href="a00097.html#8ae6395641b7752dce47881e20cee970">state</a> = <a name="a287"></a><a class="code" href="a00163.html#gc4357cec23abca29d2bb885803625a6a">WEBCLIENT_STATE_HEADERS</a>;
+<a name="l00261"></a>00261       <span class="keywordflow">break</span>;
+<a name="l00262"></a>00262     } <span class="keywordflow">else</span> {
+<a name="l00263"></a>00263       ++s.<a class="code" href="a00097.html#2fca02673894f222b01ad2d3a4d7dd79">httpheaderlineptr</a>;
+<a name="l00264"></a>00264     }
+<a name="l00265"></a>00265   }
+<a name="l00266"></a>00266   <span class="keywordflow">return</span> len;
+<a name="l00267"></a>00267 }
+<a name="l00268"></a>00268 <span class="comment">/*-----------------------------------------------------------------------------------*/</span>
+<a name="l00269"></a>00269 <span class="keyword">static</span> <span class="keywordtype">char</span>
+<a name="l00270"></a>00270 casecmp(<span class="keywordtype">char</span> *str1, <span class="keyword">const</span> <span class="keywordtype">char</span> *str2, <span class="keywordtype">char</span> len)
+<a name="l00271"></a>00271 {
+<a name="l00272"></a>00272   <span class="keyword">static</span> <span class="keywordtype">char</span> c;
+<a name="l00273"></a>00273   
+<a name="l00274"></a>00274   <span class="keywordflow">while</span>(len &gt; 0) {
+<a name="l00275"></a>00275     c = *str1;
+<a name="l00276"></a>00276     <span class="comment">/* Force lower-case characters. */</span>
+<a name="l00277"></a>00277     <span class="keywordflow">if</span>(c &amp; 0x40) {
+<a name="l00278"></a>00278       c |= 0x20;
+<a name="l00279"></a>00279     }
+<a name="l00280"></a>00280     <span class="keywordflow">if</span>(*str2 != c) {
+<a name="l00281"></a>00281       <span class="keywordflow">return</span> 1;
+<a name="l00282"></a>00282     }
+<a name="l00283"></a>00283     ++str1;
+<a name="l00284"></a>00284     ++str2;
+<a name="l00285"></a>00285     --len;
+<a name="l00286"></a>00286   }
+<a name="l00287"></a>00287   <span class="keywordflow">return</span> 0;
+<a name="l00288"></a>00288 }
+<a name="l00289"></a>00289 <span class="comment">/*-----------------------------------------------------------------------------------*/</span>
+<a name="l00290"></a>00290 <span class="keyword">static</span> u16_t
+<a name="l00291"></a>00291 parse_headers(u16_t len)
+<a name="l00292"></a>00292 {
+<a name="l00293"></a>00293   <span class="keywordtype">char</span> *cptr;
+<a name="l00294"></a>00294   <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> i;
+<a name="l00295"></a>00295   
+<a name="l00296"></a>00296   <span class="keywordflow">while</span>(len &gt; 0 &amp;&amp; s.<a class="code" href="a00097.html#2fca02673894f222b01ad2d3a4d7dd79">httpheaderlineptr</a> &lt; <span class="keyword">sizeof</span>(s.<a class="code" href="a00097.html#606d2729bf411ade69044828403a72af">httpheaderline</a>)) {
+<a name="l00297"></a>00297     s.<a class="code" href="a00097.html#606d2729bf411ade69044828403a72af">httpheaderline</a>[s.<a class="code" href="a00097.html#2fca02673894f222b01ad2d3a4d7dd79">httpheaderlineptr</a>] = *(<span class="keywordtype">char</span> *)uip_appdata;
+<a name="l00298"></a>00298     ++((<span class="keywordtype">char</span> *)uip_appdata);
+<a name="l00299"></a>00299     --len;
+<a name="l00300"></a>00300     <span class="keywordflow">if</span>(s.<a class="code" href="a00097.html#606d2729bf411ade69044828403a72af">httpheaderline</a>[s.<a class="code" href="a00097.html#2fca02673894f222b01ad2d3a4d7dd79">httpheaderlineptr</a>] == <a class="code" href="a00161.html#g3212e70c55244608ac16316888c354f0">ISO_nl</a>) {
+<a name="l00301"></a>00301       <span class="comment">/* We have an entire HTTP header line in s.httpheaderline, so</span>
+<a name="l00302"></a>00302 <span class="comment">         we parse it. */</span>
+<a name="l00303"></a>00303       <span class="keywordflow">if</span>(s.<a class="code" href="a00097.html#606d2729bf411ade69044828403a72af">httpheaderline</a>[0] == <a name="a288"></a><a class="code" href="a00161.html#g6cda47c85ce1b58b501b44ac9cccc50e">ISO_cr</a>) {
+<a name="l00304"></a>00304         <span class="comment">/* This was the last header line (i.e., and empty "\r\n"), so</span>
+<a name="l00305"></a>00305 <span class="comment">           we are done with the headers and proceed with the actual</span>
+<a name="l00306"></a>00306 <span class="comment">           data. */</span>
+<a name="l00307"></a>00307         s.<a class="code" href="a00097.html#8ae6395641b7752dce47881e20cee970">state</a> = <a name="a289"></a><a class="code" href="a00163.html#g4d457c50e6f2cef57167c3804ce8bf7c">WEBCLIENT_STATE_DATA</a>;
+<a name="l00308"></a>00308         <span class="keywordflow">return</span> len;
+<a name="l00309"></a>00309       }
+<a name="l00310"></a>00310 
+<a name="l00311"></a>00311       s.<a class="code" href="a00097.html#606d2729bf411ade69044828403a72af">httpheaderline</a>[s.<a class="code" href="a00097.html#2fca02673894f222b01ad2d3a4d7dd79">httpheaderlineptr</a> - 1] = 0;
+<a name="l00312"></a>00312       <span class="comment">/* Check for specific HTTP header fields. */</span>
+<a name="l00313"></a>00313       <span class="keywordflow">if</span>(casecmp(s.<a class="code" href="a00097.html#606d2729bf411ade69044828403a72af">httpheaderline</a>, http_content_type,
+<a name="l00314"></a>00314                      <span class="keyword">sizeof</span>(http_content_type) - 1) == 0) {
+<a name="l00315"></a>00315         <span class="comment">/* Found Content-type field. */</span>
+<a name="l00316"></a>00316         cptr = strchr(s.<a class="code" href="a00097.html#606d2729bf411ade69044828403a72af">httpheaderline</a>, <span class="charliteral">';'</span>);
+<a name="l00317"></a>00317         <span class="keywordflow">if</span>(cptr != <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) {
+<a name="l00318"></a>00318           *cptr = 0;
+<a name="l00319"></a>00319         }
+<a name="l00320"></a>00320         strncpy(s.<a class="code" href="a00097.html#fb60f42593d305ea36d9b4303722696e">mimetype</a>, s.<a class="code" href="a00097.html#606d2729bf411ade69044828403a72af">httpheaderline</a> +
+<a name="l00321"></a>00321                 <span class="keyword">sizeof</span>(http_content_type) - 1, <span class="keyword">sizeof</span>(s.<a class="code" href="a00097.html#fb60f42593d305ea36d9b4303722696e">mimetype</a>));
+<a name="l00322"></a>00322       } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(casecmp(s.<a class="code" href="a00097.html#606d2729bf411ade69044828403a72af">httpheaderline</a>, http_location,
+<a name="l00323"></a>00323                             <span class="keyword">sizeof</span>(http_location) - 1) == 0) {
+<a name="l00324"></a>00324         cptr = s.<a class="code" href="a00097.html#606d2729bf411ade69044828403a72af">httpheaderline</a> +
+<a name="l00325"></a>00325           <span class="keyword">sizeof</span>(http_location) - 1;
+<a name="l00326"></a>00326         
+<a name="l00327"></a>00327         <span class="keywordflow">if</span>(strncmp(cptr, http_http, 7) == 0) {
+<a name="l00328"></a>00328           cptr += 7;
+<a name="l00329"></a>00329           <span class="keywordflow">for</span>(i = 0; i &lt; s.<a class="code" href="a00097.html#2fca02673894f222b01ad2d3a4d7dd79">httpheaderlineptr</a> - 7; ++i) {
+<a name="l00330"></a>00330             <span class="keywordflow">if</span>(*cptr == 0 ||
+<a name="l00331"></a>00331                *cptr == <span class="charliteral">'/'</span> ||
+<a name="l00332"></a>00332                *cptr == <span class="charliteral">' '</span> ||
+<a name="l00333"></a>00333                *cptr == <span class="charliteral">':'</span>) {
+<a name="l00334"></a>00334               s.<a class="code" href="a00097.html#a6487b9c1c773b32656065d0e19bf142">host</a>[i] = 0;
+<a name="l00335"></a>00335               <span class="keywordflow">break</span>;
+<a name="l00336"></a>00336             }
+<a name="l00337"></a>00337             s.<a class="code" href="a00097.html#a6487b9c1c773b32656065d0e19bf142">host</a>[i] = *cptr;
+<a name="l00338"></a>00338             ++cptr;
+<a name="l00339"></a>00339           }
+<a name="l00340"></a>00340         }
+<a name="l00341"></a>00341         strncpy(s.<a class="code" href="a00097.html#e87913860c6b05c6e6b060639b950098">file</a>, cptr, <span class="keyword">sizeof</span>(s.<a class="code" href="a00097.html#e87913860c6b05c6e6b060639b950098">file</a>));
+<a name="l00342"></a>00342         <span class="comment">/*      s.file[s.httpheaderlineptr - i] = 0;*/</span>
+<a name="l00343"></a>00343       }
+<a name="l00344"></a>00344 
+<a name="l00345"></a>00345 
+<a name="l00346"></a>00346       <span class="comment">/* We're done parsing, so we reset the pointer and start the</span>
+<a name="l00347"></a>00347 <span class="comment">         next line. */</span>
+<a name="l00348"></a>00348       s.<a class="code" href="a00097.html#2fca02673894f222b01ad2d3a4d7dd79">httpheaderlineptr</a> = 0;
+<a name="l00349"></a>00349     } <span class="keywordflow">else</span> {
+<a name="l00350"></a>00350       ++s.<a class="code" href="a00097.html#2fca02673894f222b01ad2d3a4d7dd79">httpheaderlineptr</a>;
+<a name="l00351"></a>00351     }
+<a name="l00352"></a>00352   }
+<a name="l00353"></a>00353   <span class="keywordflow">return</span> len;
+<a name="l00354"></a>00354 }
+<a name="l00355"></a>00355 <span class="comment">/*-----------------------------------------------------------------------------------*/</span>
+<a name="l00356"></a>00356 <span class="keyword">static</span> <span class="keywordtype">void</span>
+<a name="l00357"></a>00357 newdata(<span class="keywordtype">void</span>)
+<a name="l00358"></a>00358 {
+<a name="l00359"></a>00359   u16_t len;
+<a name="l00360"></a>00360 
+<a name="l00361"></a>00361   len = <a name="a290"></a><a class="code" href="a00147.html#g1a1bc437c09ddef238abab41d77c3177">uip_datalen</a>();
+<a name="l00362"></a>00362 
+<a name="l00363"></a>00363   <span class="keywordflow">if</span>(s.<a class="code" href="a00097.html#8ae6395641b7752dce47881e20cee970">state</a> == <a class="code" href="a00163.html#g8714af98a550f10dc814db92b08d1b0d">WEBCLIENT_STATE_STATUSLINE</a>) {
+<a name="l00364"></a>00364     len = parse_statusline(len);
+<a name="l00365"></a>00365   }
+<a name="l00366"></a>00366   
+<a name="l00367"></a>00367   <span class="keywordflow">if</span>(s.<a class="code" href="a00097.html#8ae6395641b7752dce47881e20cee970">state</a> == <a class="code" href="a00163.html#gc4357cec23abca29d2bb885803625a6a">WEBCLIENT_STATE_HEADERS</a> &amp;&amp; len &gt; 0) {
+<a name="l00368"></a>00368     len = parse_headers(len);
+<a name="l00369"></a>00369   }
+<a name="l00370"></a>00370 
+<a name="l00371"></a>00371   <span class="keywordflow">if</span>(len &gt; 0 &amp;&amp; s.<a class="code" href="a00097.html#8ae6395641b7752dce47881e20cee970">state</a> == <a class="code" href="a00163.html#g4d457c50e6f2cef57167c3804ce8bf7c">WEBCLIENT_STATE_DATA</a> &amp;&amp;
+<a name="l00372"></a>00372      s.<a class="code" href="a00097.html#6925d46b2819adb474a5f0036f02dd7d">httpflag</a> != <a class="code" href="a00163.html#gd895686859ae7d178d31be04eb0a1a97">HTTPFLAG_MOVED</a>) {
+<a name="l00373"></a>00373     <a name="a291"></a><a class="code" href="a00163.html#gc4b119801e50cc1824498a1cdf9adc37">webclient_datahandler</a>((<span class="keywordtype">char</span> *)uip_appdata, len);
+<a name="l00374"></a>00374   }
+<a name="l00375"></a>00375 }
+<a name="l00376"></a>00376 <span class="comment">/*-----------------------------------------------------------------------------------*/</span>
+<a name="l00377"></a>00377 <span class="keywordtype">void</span>
+<a name="l00378"></a>00378 <a name="a292"></a><a class="code" href="a00163.html#g9e6d2864f390a4ba1ac60dc65e2b9815">webclient_appcall</a>(<span class="keywordtype">void</span>)
+<a name="l00379"></a>00379 {
+<a name="l00380"></a>00380   <span class="keywordflow">if</span>(<a name="a293"></a><a class="code" href="a00147.html#gdb971fb1525d0c5002f52125b05f3218">uip_connected</a>()) {
+<a name="l00381"></a>00381     s.<a name="a294"></a><a class="code" href="a00097.html#5960d82e7aca2986b8509a0d87d6cbc8">timer</a> = 0;
+<a name="l00382"></a>00382     s.<a class="code" href="a00097.html#8ae6395641b7752dce47881e20cee970">state</a> = <a class="code" href="a00163.html#g8714af98a550f10dc814db92b08d1b0d">WEBCLIENT_STATE_STATUSLINE</a>;
+<a name="l00383"></a>00383     senddata();
+<a name="l00384"></a>00384     <a name="a295"></a><a class="code" href="a00163.html#g6b942c1ef22f8cd1a726ef3364c9fbea">webclient_connected</a>();
+<a name="l00385"></a>00385     <span class="keywordflow">return</span>;
+<a name="l00386"></a>00386   }
+<a name="l00387"></a>00387 
+<a name="l00388"></a>00388   <span class="keywordflow">if</span>(s.<a class="code" href="a00097.html#8ae6395641b7752dce47881e20cee970">state</a> == <a class="code" href="a00163.html#g863c94b0ed4a76997e53a3ccd5d0b6c3">WEBCLIENT_STATE_CLOSE</a>) {
+<a name="l00389"></a>00389     <a name="a296"></a><a class="code" href="a00163.html#gf8f12c820cc08da32aa62898bfc02db3">webclient_closed</a>();
+<a name="l00390"></a>00390     <a class="code" href="a00147.html#g88d2ccf7cd821f89d9a8df7e3948b56c">uip_abort</a>();
+<a name="l00391"></a>00391     <span class="keywordflow">return</span>;
+<a name="l00392"></a>00392   }
+<a name="l00393"></a>00393 
+<a name="l00394"></a>00394   <span class="keywordflow">if</span>(<a name="a297"></a><a class="code" href="a00147.html#gfbd5fc486dfdf6bf6fc9db52b1f418c4">uip_aborted</a>()) {
+<a name="l00395"></a>00395     <a class="code" href="a00163.html#gf11d9915ec12a8cdd9fdcbb5e8fcd5c7">webclient_aborted</a>();
+<a name="l00396"></a>00396   }
+<a name="l00397"></a>00397   <span class="keywordflow">if</span>(<a name="a298"></a><a class="code" href="a00147.html#g7b2ac4b18bd2ac3912fe67b3b17158c3">uip_timedout</a>()) {
+<a name="l00398"></a>00398     <a name="a299"></a><a class="code" href="a00163.html#g23705efb9077187881f094fc9be13bde">webclient_timedout</a>();
+<a name="l00399"></a>00399   }
+<a name="l00400"></a>00400 
+<a name="l00401"></a>00401   
+<a name="l00402"></a>00402   <span class="keywordflow">if</span>(<a name="a300"></a><a class="code" href="a00147.html#gde6634974418e3240c212b9b16864368">uip_acked</a>()) {
+<a name="l00403"></a>00403     s.<a class="code" href="a00097.html#5960d82e7aca2986b8509a0d87d6cbc8">timer</a> = 0;
+<a name="l00404"></a>00404     acked();
+<a name="l00405"></a>00405   }
+<a name="l00406"></a>00406   <span class="keywordflow">if</span>(<a name="a301"></a><a class="code" href="a00147.html#g26a14b8dae3f861830af9e7cf1e03725">uip_newdata</a>()) {
+<a name="l00407"></a>00407     s.<a class="code" href="a00097.html#5960d82e7aca2986b8509a0d87d6cbc8">timer</a> = 0;
+<a name="l00408"></a>00408     newdata();
+<a name="l00409"></a>00409   }
+<a name="l00410"></a>00410   <span class="keywordflow">if</span>(<a name="a302"></a><a class="code" href="a00147.html#ga8933ad15a2e2947dae4a5cff50e6007">uip_rexmit</a>() ||
+<a name="l00411"></a>00411      <a class="code" href="a00147.html#g26a14b8dae3f861830af9e7cf1e03725">uip_newdata</a>() ||
+<a name="l00412"></a>00412      <a class="code" href="a00147.html#gde6634974418e3240c212b9b16864368">uip_acked</a>()) {
+<a name="l00413"></a>00413     senddata();
+<a name="l00414"></a>00414   } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a name="a303"></a><a class="code" href="a00147.html#g58bb90796c1cdad3aac2ecf44d87b20e">uip_poll</a>()) {
+<a name="l00415"></a>00415     ++s.<a class="code" href="a00097.html#5960d82e7aca2986b8509a0d87d6cbc8">timer</a>;
+<a name="l00416"></a>00416     <span class="keywordflow">if</span>(s.<a class="code" href="a00097.html#5960d82e7aca2986b8509a0d87d6cbc8">timer</a> == <a name="a304"></a><a class="code" href="a00163.html#g31be289fd8ec3fe09b0088165d13976d">WEBCLIENT_TIMEOUT</a>) {
+<a name="l00417"></a>00417       <a class="code" href="a00163.html#g23705efb9077187881f094fc9be13bde">webclient_timedout</a>();
+<a name="l00418"></a>00418       <a class="code" href="a00147.html#g88d2ccf7cd821f89d9a8df7e3948b56c">uip_abort</a>();
+<a name="l00419"></a>00419       <span class="keywordflow">return</span>;
+<a name="l00420"></a>00420     }
+<a name="l00421"></a>00421         <span class="comment">/*    senddata();*/</span>
+<a name="l00422"></a>00422   }
+<a name="l00423"></a>00423 
+<a name="l00424"></a>00424   <span class="keywordflow">if</span>(<a name="a305"></a><a class="code" href="a00147.html#gef6c4140c632b6a406779342cf3b6eb6">uip_closed</a>()) {
+<a name="l00425"></a>00425     <span class="keywordflow">if</span>(s.<a class="code" href="a00097.html#6925d46b2819adb474a5f0036f02dd7d">httpflag</a> != <a class="code" href="a00163.html#gd895686859ae7d178d31be04eb0a1a97">HTTPFLAG_MOVED</a>) {
+<a name="l00426"></a>00426       <span class="comment">/* Send NULL data to signal EOF. */</span>
+<a name="l00427"></a>00427       <a class="code" href="a00163.html#gc4b119801e50cc1824498a1cdf9adc37">webclient_datahandler</a>(<a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>, 0);
+<a name="l00428"></a>00428     } <span class="keywordflow">else</span> {
+<a name="l00429"></a>00429       <span class="keywordflow">if</span>(<a class="code" href="a00160.html#g66d19181ad5fe8b8f7c84d1f1d46a2ec">resolv_lookup</a>(s.<a class="code" href="a00097.html#a6487b9c1c773b32656065d0e19bf142">host</a>) == <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) {
+<a name="l00430"></a>00430         <a name="a306"></a><a class="code" href="a00160.html#ge4dcbbe6c641d2e3b8537b479df5fc99">resolv_query</a>(s.<a class="code" href="a00097.html#a6487b9c1c773b32656065d0e19bf142">host</a>);
+<a name="l00431"></a>00431       }
+<a name="l00432"></a>00432       <a class="code" href="a00163.html#gf9385ef9ecc74c7d53ff2f15e62bfde3">webclient_get</a>(s.<a class="code" href="a00097.html#a6487b9c1c773b32656065d0e19bf142">host</a>, s.<a class="code" href="a00097.html#7092781c50dcad50f473888585c85b83">port</a>, s.<a class="code" href="a00097.html#e87913860c6b05c6e6b060639b950098">file</a>);
+<a name="l00433"></a>00433     }
+<a name="l00434"></a>00434   }
+<a name="l00435"></a>00435 }
+<a name="l00436"></a>00436 <span class="comment">/*-----------------------------------------------------------------------------------*/</span>
+<a name="l00437"></a>00437 <span class="comment"></span>
+<a name="l00438"></a>00438 <span class="comment">/** @} */</span><span class="comment"></span>
+<a name="l00439"></a>00439 <span class="comment">/** @} */</span>
+</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 248 - 0
components/net/uip/doc/html/a00041.html

@@ -0,0 +1,248 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: webclient.h</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<h1>webclient.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/**</span>
+<a name="l00002"></a>00002 <span class="comment"> * \addtogroup webclient</span>
+<a name="l00003"></a>00003 <span class="comment"> * @{</span>
+<a name="l00004"></a>00004 <span class="comment"> */</span>
+<a name="l00005"></a>00005 <span class="comment"></span>
+<a name="l00006"></a>00006 <span class="comment">/**</span>
+<a name="l00007"></a>00007 <span class="comment"> * \file</span>
+<a name="l00008"></a>00008 <span class="comment"> * Header file for the HTTP client.</span>
+<a name="l00009"></a>00009 <span class="comment"> * \author Adam Dunkels &lt;adam@dunkels.com&gt;</span>
+<a name="l00010"></a>00010 <span class="comment"> */</span>
+<a name="l00011"></a>00011 
+<a name="l00012"></a>00012 <span class="comment">/*</span>
+<a name="l00013"></a>00013 <span class="comment"> * Copyright (c) 2002, Adam Dunkels.</span>
+<a name="l00014"></a>00014 <span class="comment"> * All rights reserved.</span>
+<a name="l00015"></a>00015 <span class="comment"> *</span>
+<a name="l00016"></a>00016 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00017"></a>00017 <span class="comment"> * modification, are permitted provided that the following conditions</span>
+<a name="l00018"></a>00018 <span class="comment"> * are met:</span>
+<a name="l00019"></a>00019 <span class="comment"> * 1. Redistributions of source code must retain the above copyright</span>
+<a name="l00020"></a>00020 <span class="comment"> *    notice, this list of conditions and the following disclaimer.</span>
+<a name="l00021"></a>00021 <span class="comment"> * 2. Redistributions in binary form must reproduce the above</span>
+<a name="l00022"></a>00022 <span class="comment"> *    copyright notice, this list of conditions and the following</span>
+<a name="l00023"></a>00023 <span class="comment"> *    disclaimer in the documentation and/or other materials provided</span>
+<a name="l00024"></a>00024 <span class="comment"> *    with the distribution.</span>
+<a name="l00025"></a>00025 <span class="comment"> * 3. The name of the author may not be used to endorse or promote</span>
+<a name="l00026"></a>00026 <span class="comment"> *    products derived from this software without specific prior</span>
+<a name="l00027"></a>00027 <span class="comment"> *    written permission.</span>
+<a name="l00028"></a>00028 <span class="comment"> *</span>
+<a name="l00029"></a>00029 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS</span>
+<a name="l00030"></a>00030 <span class="comment"> * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00031"></a>00031 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span>
+<a name="l00032"></a>00032 <span class="comment"> * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY</span>
+<a name="l00033"></a>00033 <span class="comment"> * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</span>
+<a name="l00034"></a>00034 <span class="comment"> * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE</span>
+<a name="l00035"></a>00035 <span class="comment"> * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span>
+<a name="l00036"></a>00036 <span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,</span>
+<a name="l00037"></a>00037 <span class="comment"> * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING</span>
+<a name="l00038"></a>00038 <span class="comment"> * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00039"></a>00039 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00040"></a>00040 <span class="comment"> *</span>
+<a name="l00041"></a>00041 <span class="comment"> * This file is part of the uIP TCP/IP stack.</span>
+<a name="l00042"></a>00042 <span class="comment"> *</span>
+<a name="l00043"></a>00043 <span class="comment"> * $Id: webclient.h,v 1.2 2006/06/11 21:46:37 adam Exp $</span>
+<a name="l00044"></a>00044 <span class="comment"> *</span>
+<a name="l00045"></a>00045 <span class="comment"> */</span>
+<a name="l00046"></a>00046 <span class="preprocessor">#ifndef __WEBCLIENT_H__</span>
+<a name="l00047"></a>00047 <span class="preprocessor"></span><span class="preprocessor">#define __WEBCLIENT_H__</span>
+<a name="l00048"></a>00048 <span class="preprocessor"></span>
+<a name="l00049"></a>00049 
+<a name="l00050"></a>00050 <span class="preprocessor">#include "webclient-strings.h"</span>
+<a name="l00051"></a>00051 <span class="preprocessor">#include "<a class="code" href="a00140.html">uipopt.h</a>"</span>
+<a name="l00052"></a>00052 
+<a name="l00053"></a>00053 <span class="preprocessor">#define WEBCLIENT_CONF_MAX_URLLEN 100</span>
+<a name="l00054"></a>00054 <span class="preprocessor"></span>
+<a name="l00055"></a>00055 <span class="keyword">struct </span><a name="_a307"></a><a class="code" href="a00097.html">webclient_state</a> {
+<a name="l00056"></a>00056   u8_t <a name="_a308"></a><a class="code" href="a00087.html">timer</a>;
+<a name="l00057"></a>00057   u8_t <a name="a309"></a><a class="code" href="a00097.html#8ae6395641b7752dce47881e20cee970">state</a>;
+<a name="l00058"></a>00058   u8_t <a name="a310"></a><a class="code" href="a00097.html#6925d46b2819adb474a5f0036f02dd7d">httpflag</a>;
+<a name="l00059"></a>00059 
+<a name="l00060"></a>00060   u16_t port;
+<a name="l00061"></a>00061   <span class="keywordtype">char</span> host[40];
+<a name="l00062"></a>00062   <span class="keywordtype">char</span> file[<a name="a311"></a><a class="code" href="a00163.html#g5a5bfd7e9060903893481db90645187b">WEBCLIENT_CONF_MAX_URLLEN</a>];
+<a name="l00063"></a>00063   u16_t <a name="a312"></a><a class="code" href="a00097.html#134ec55c3d5abaebfed4ff8edfedf1ea">getrequestptr</a>;
+<a name="l00064"></a>00064   u16_t <a name="a313"></a><a class="code" href="a00097.html#5a3116623c6a7da7c82db6c301ae0da3">getrequestleft</a>;
+<a name="l00065"></a>00065   
+<a name="l00066"></a>00066   <span class="keywordtype">char</span> <a name="a314"></a><a class="code" href="a00097.html#606d2729bf411ade69044828403a72af">httpheaderline</a>[200];
+<a name="l00067"></a>00067   u16_t <a name="a315"></a><a class="code" href="a00097.html#2fca02673894f222b01ad2d3a4d7dd79">httpheaderlineptr</a>;
+<a name="l00068"></a>00068 
+<a name="l00069"></a>00069   <span class="keywordtype">char</span> <a name="a316"></a><a class="code" href="a00097.html#fb60f42593d305ea36d9b4303722696e">mimetype</a>[32];
+<a name="l00070"></a>00070 };
+<a name="l00071"></a>00071 
+<a name="l00072"></a>00072 <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="a00097.html">webclient_state</a> <a name="a317"></a><a class="code" href="a00153.html#g69646a81a922033c5281445a71f8ffed">uip_tcp_appstate_t</a>;
+<a name="l00073"></a>00073 <span class="preprocessor">#define UIP_APPCALL webclient_appcall</span>
+<a name="l00074"></a>00074 <span class="preprocessor"></span><span class="comment"></span>
+<a name="l00075"></a>00075 <span class="comment">/**</span>
+<a name="l00076"></a>00076 <span class="comment"> * Callback function that is called from the webclient code when HTTP</span>
+<a name="l00077"></a>00077 <span class="comment"> * data has been received.</span>
+<a name="l00078"></a>00078 <span class="comment"> *</span>
+<a name="l00079"></a>00079 <span class="comment"> * This function must be implemented by the module that uses the</span>
+<a name="l00080"></a>00080 <span class="comment"> * webclient code. The function is called from the webclient module</span>
+<a name="l00081"></a>00081 <span class="comment"> * when HTTP data has been received. The function is not called when</span>
+<a name="l00082"></a>00082 <span class="comment"> * HTTP headers are received, only for the actual data.</span>
+<a name="l00083"></a>00083 <span class="comment"> *</span>
+<a name="l00084"></a>00084 <span class="comment"> * \note This function is called many times, repetedly, when data is</span>
+<a name="l00085"></a>00085 <span class="comment"> * being received, and not once when all data has been received.</span>
+<a name="l00086"></a>00086 <span class="comment"> *</span>
+<a name="l00087"></a>00087 <span class="comment"> * \param data A pointer to the data that has been received.</span>
+<a name="l00088"></a>00088 <span class="comment"> * \param len The length of the data that has been received.</span>
+<a name="l00089"></a>00089 <span class="comment"> */</span>
+<a name="l00090"></a>00090 <span class="keywordtype">void</span> <a name="a318"></a><a class="code" href="a00163.html#gc4b119801e50cc1824498a1cdf9adc37">webclient_datahandler</a>(<span class="keywordtype">char</span> *data, u16_t len);
+<a name="l00091"></a>00091 <span class="comment"></span>
+<a name="l00092"></a>00092 <span class="comment">/**</span>
+<a name="l00093"></a>00093 <span class="comment"> * Callback function that is called from the webclient code when the</span>
+<a name="l00094"></a>00094 <span class="comment"> * HTTP connection has been connected to the web server.</span>
+<a name="l00095"></a>00095 <span class="comment"> *</span>
+<a name="l00096"></a>00096 <span class="comment"> * This function must be implemented by the module that uses the</span>
+<a name="l00097"></a>00097 <span class="comment"> * webclient code.</span>
+<a name="l00098"></a>00098 <span class="comment"> */</span>
+<a name="l00099"></a>00099 <span class="keywordtype">void</span> <a name="a319"></a><a class="code" href="a00163.html#g6b942c1ef22f8cd1a726ef3364c9fbea">webclient_connected</a>(<span class="keywordtype">void</span>);
+<a name="l00100"></a>00100 <span class="comment"></span>
+<a name="l00101"></a>00101 <span class="comment">/**</span>
+<a name="l00102"></a>00102 <span class="comment"> * Callback function that is called from the webclient code if the</span>
+<a name="l00103"></a>00103 <span class="comment"> * HTTP connection to the web server has timed out.</span>
+<a name="l00104"></a>00104 <span class="comment"> *</span>
+<a name="l00105"></a>00105 <span class="comment"> * This function must be implemented by the module that uses the</span>
+<a name="l00106"></a>00106 <span class="comment"> * webclient code.</span>
+<a name="l00107"></a>00107 <span class="comment"> */</span>
+<a name="l00108"></a>00108 <span class="keywordtype">void</span> <a name="a320"></a><a class="code" href="a00163.html#g23705efb9077187881f094fc9be13bde">webclient_timedout</a>(<span class="keywordtype">void</span>);
+<a name="l00109"></a>00109 <span class="comment"></span>
+<a name="l00110"></a>00110 <span class="comment">/**</span>
+<a name="l00111"></a>00111 <span class="comment"> * Callback function that is called from the webclient code if the</span>
+<a name="l00112"></a>00112 <span class="comment"> * HTTP connection to the web server has been aborted by the web</span>
+<a name="l00113"></a>00113 <span class="comment"> * server.</span>
+<a name="l00114"></a>00114 <span class="comment"> *</span>
+<a name="l00115"></a>00115 <span class="comment"> * This function must be implemented by the module that uses the</span>
+<a name="l00116"></a>00116 <span class="comment"> * webclient code.</span>
+<a name="l00117"></a>00117 <span class="comment"> */</span>
+<a name="l00118"></a>00118 <span class="keywordtype">void</span> <a name="a321"></a><a class="code" href="a00163.html#gf11d9915ec12a8cdd9fdcbb5e8fcd5c7">webclient_aborted</a>(<span class="keywordtype">void</span>);
+<a name="l00119"></a>00119 <span class="comment"></span>
+<a name="l00120"></a>00120 <span class="comment">/**</span>
+<a name="l00121"></a>00121 <span class="comment"> * Callback function that is called from the webclient code when the</span>
+<a name="l00122"></a>00122 <span class="comment"> * HTTP connection to the web server has been closed.</span>
+<a name="l00123"></a>00123 <span class="comment"> *</span>
+<a name="l00124"></a>00124 <span class="comment"> * This function must be implemented by the module that uses the</span>
+<a name="l00125"></a>00125 <span class="comment"> * webclient code.</span>
+<a name="l00126"></a>00126 <span class="comment"> */</span>
+<a name="l00127"></a>00127 <span class="keywordtype">void</span> <a name="a322"></a><a class="code" href="a00163.html#gf8f12c820cc08da32aa62898bfc02db3">webclient_closed</a>(<span class="keywordtype">void</span>);
+<a name="l00128"></a>00128 
+<a name="l00129"></a>00129 
+<a name="l00130"></a>00130 <span class="comment"></span>
+<a name="l00131"></a>00131 <span class="comment">/**</span>
+<a name="l00132"></a>00132 <span class="comment"> * Initialize the webclient module.</span>
+<a name="l00133"></a>00133 <span class="comment"> */</span>
+<a name="l00134"></a>00134 <span class="keywordtype">void</span> <a name="a323"></a><a class="code" href="a00163.html#g3caacabb2fe1c71921e1a471719ccbd2">webclient_init</a>(<span class="keywordtype">void</span>);
+<a name="l00135"></a>00135 <span class="comment"></span>
+<a name="l00136"></a>00136 <span class="comment">/**</span>
+<a name="l00137"></a>00137 <span class="comment"> * Open an HTTP connection to a web server and ask for a file using</span>
+<a name="l00138"></a>00138 <span class="comment"> * the GET method.</span>
+<a name="l00139"></a>00139 <span class="comment"> *</span>
+<a name="l00140"></a>00140 <span class="comment"> * This function opens an HTTP connection to the specified web server</span>
+<a name="l00141"></a>00141 <span class="comment"> * and requests the specified file using the GET method. When the HTTP</span>
+<a name="l00142"></a>00142 <span class="comment"> * connection has been connected, the webclient_connected() callback</span>
+<a name="l00143"></a>00143 <span class="comment"> * function is called and when the HTTP data arrives the</span>
+<a name="l00144"></a>00144 <span class="comment"> * webclient_datahandler() callback function is called.</span>
+<a name="l00145"></a>00145 <span class="comment"> *</span>
+<a name="l00146"></a>00146 <span class="comment"> * The callback function webclient_timedout() is called if the web</span>
+<a name="l00147"></a>00147 <span class="comment"> * server could not be contacted, and the webclient_aborted() callback</span>
+<a name="l00148"></a>00148 <span class="comment"> * function is called if the HTTP connection is aborted by the web</span>
+<a name="l00149"></a>00149 <span class="comment"> * server.</span>
+<a name="l00150"></a>00150 <span class="comment"> *</span>
+<a name="l00151"></a>00151 <span class="comment"> * When the HTTP request has been completed and the HTTP connection is</span>
+<a name="l00152"></a>00152 <span class="comment"> * closed, the webclient_closed() callback function will be called.</span>
+<a name="l00153"></a>00153 <span class="comment"> *</span>
+<a name="l00154"></a>00154 <span class="comment"> * \note If the function is passed a host name, it must already be in</span>
+<a name="l00155"></a>00155 <span class="comment"> * the resolver cache in order for the function to connect to the web</span>
+<a name="l00156"></a>00156 <span class="comment"> * server. It is therefore up to the calling module to implement the</span>
+<a name="l00157"></a>00157 <span class="comment"> * resolver calls and the signal handler used for reporting a resolv</span>
+<a name="l00158"></a>00158 <span class="comment"> * query answer.</span>
+<a name="l00159"></a>00159 <span class="comment"> *</span>
+<a name="l00160"></a>00160 <span class="comment"> * \param host A pointer to a string containing either a host name or</span>
+<a name="l00161"></a>00161 <span class="comment"> * a numerical IP address in dotted decimal notation (e.g., 192.168.23.1).</span>
+<a name="l00162"></a>00162 <span class="comment"> *</span>
+<a name="l00163"></a>00163 <span class="comment"> * \param port The port number to which to connect, in host byte order.</span>
+<a name="l00164"></a>00164 <span class="comment"> *</span>
+<a name="l00165"></a>00165 <span class="comment"> * \param file A pointer to the name of the file to get.</span>
+<a name="l00166"></a>00166 <span class="comment"> *</span>
+<a name="l00167"></a>00167 <span class="comment"> * \retval 0 if the host name could not be found in the cache, or</span>
+<a name="l00168"></a>00168 <span class="comment"> * if a TCP connection could not be created.</span>
+<a name="l00169"></a>00169 <span class="comment"> *</span>
+<a name="l00170"></a>00170 <span class="comment"> * \retval 1 if the connection was initiated.</span>
+<a name="l00171"></a>00171 <span class="comment"> */</span>
+<a name="l00172"></a>00172 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a name="a324"></a><a class="code" href="a00163.html#gf9385ef9ecc74c7d53ff2f15e62bfde3">webclient_get</a>(<span class="keywordtype">char</span> *host, u16_t port, <span class="keywordtype">char</span> *file);
+<a name="l00173"></a>00173 <span class="comment"></span>
+<a name="l00174"></a>00174 <span class="comment">/**</span>
+<a name="l00175"></a>00175 <span class="comment"> * Close the currently open HTTP connection.</span>
+<a name="l00176"></a>00176 <span class="comment"> */</span>
+<a name="l00177"></a>00177 <span class="keywordtype">void</span> <a name="a325"></a><a class="code" href="a00163.html#g1d34be506a61db90dd7829117efdf8cf">webclient_close</a>(<span class="keywordtype">void</span>);
+<a name="l00178"></a>00178 <span class="keywordtype">void</span> <a name="a326"></a><a class="code" href="a00163.html#g9e6d2864f390a4ba1ac60dc65e2b9815">webclient_appcall</a>(<span class="keywordtype">void</span>);
+<a name="l00179"></a>00179 <span class="comment"></span>
+<a name="l00180"></a>00180 <span class="comment">/**</span>
+<a name="l00181"></a>00181 <span class="comment"> * Obtain the MIME type of the current HTTP data stream.</span>
+<a name="l00182"></a>00182 <span class="comment"> *</span>
+<a name="l00183"></a>00183 <span class="comment"> * \return A pointer to a string contaning the MIME type. The string</span>
+<a name="l00184"></a>00184 <span class="comment"> * may be empty if no MIME type was reported by the web server.</span>
+<a name="l00185"></a>00185 <span class="comment"> */</span>
+<a name="l00186"></a>00186 <span class="keywordtype">char</span> *<a name="a327"></a><a class="code" href="a00163.html#g4433d3af16ea083a81576d0f18ba57c9">webclient_mimetype</a>(<span class="keywordtype">void</span>);
+<a name="l00187"></a>00187 <span class="comment"></span>
+<a name="l00188"></a>00188 <span class="comment">/**</span>
+<a name="l00189"></a>00189 <span class="comment"> * Obtain the filename of the current HTTP data stream.</span>
+<a name="l00190"></a>00190 <span class="comment"> *</span>
+<a name="l00191"></a>00191 <span class="comment"> * The filename of an HTTP request may be changed by the web server,</span>
+<a name="l00192"></a>00192 <span class="comment"> * and may therefore not be the same as when the original GET request</span>
+<a name="l00193"></a>00193 <span class="comment"> * was made with webclient_get(). This function is used for obtaining</span>
+<a name="l00194"></a>00194 <span class="comment"> * the current filename.</span>
+<a name="l00195"></a>00195 <span class="comment"> *</span>
+<a name="l00196"></a>00196 <span class="comment"> * \return A pointer to the current filename.</span>
+<a name="l00197"></a>00197 <span class="comment"> */</span>
+<a name="l00198"></a>00198 <span class="keywordtype">char</span> *<a name="a328"></a><a class="code" href="a00163.html#g41e616d3fcc17e0aabfe8ab45ef0d30f">webclient_filename</a>(<span class="keywordtype">void</span>);
+<a name="l00199"></a>00199 <span class="comment"></span>
+<a name="l00200"></a>00200 <span class="comment">/**</span>
+<a name="l00201"></a>00201 <span class="comment"> * Obtain the hostname of the current HTTP data stream.</span>
+<a name="l00202"></a>00202 <span class="comment"> *</span>
+<a name="l00203"></a>00203 <span class="comment"> * The hostname of the web server of an HTTP request may be changed</span>
+<a name="l00204"></a>00204 <span class="comment"> * by the web server, and may therefore not be the same as when the</span>
+<a name="l00205"></a>00205 <span class="comment"> * original GET request was made with webclient_get(). This function</span>
+<a name="l00206"></a>00206 <span class="comment"> * is used for obtaining the current hostname.</span>
+<a name="l00207"></a>00207 <span class="comment"> *</span>
+<a name="l00208"></a>00208 <span class="comment"> * \return A pointer to the current hostname.</span>
+<a name="l00209"></a>00209 <span class="comment"> */</span>
+<a name="l00210"></a>00210 <span class="keywordtype">char</span> *<a name="a329"></a><a class="code" href="a00163.html#g0e0ea5f24b77f124ba33bcbc7ede5bfb">webclient_hostname</a>(<span class="keywordtype">void</span>);
+<a name="l00211"></a>00211 <span class="comment"></span>
+<a name="l00212"></a>00212 <span class="comment">/**</span>
+<a name="l00213"></a>00213 <span class="comment"> * Obtain the port number of the current HTTP data stream.</span>
+<a name="l00214"></a>00214 <span class="comment"> *</span>
+<a name="l00215"></a>00215 <span class="comment"> * The port number of an HTTP request may be changed by the web</span>
+<a name="l00216"></a>00216 <span class="comment"> * server, and may therefore not be the same as when the original GET</span>
+<a name="l00217"></a>00217 <span class="comment"> * request was made with webclient_get(). This function is used for</span>
+<a name="l00218"></a>00218 <span class="comment"> * obtaining the current port number.</span>
+<a name="l00219"></a>00219 <span class="comment"> *</span>
+<a name="l00220"></a>00220 <span class="comment"> * \return The port number of the current HTTP data stream, in host byte order.</span>
+<a name="l00221"></a>00221 <span class="comment"> */</span>
+<a name="l00222"></a>00222 <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a name="a330"></a><a class="code" href="a00163.html#g2a939aa4fcffabbce1dc1f784a7e0ad3">webclient_port</a>(<span class="keywordtype">void</span>);
+<a name="l00223"></a>00223 
+<a name="l00224"></a>00224 
+<a name="l00225"></a>00225 
+<a name="l00226"></a>00226 <span class="preprocessor">#endif </span><span class="comment">/* __WEBCLIENT_H__ */</span>
+<a name="l00227"></a>00227 <span class="comment"></span>
+<a name="l00228"></a>00228 <span class="comment">/** @} */</span>
+</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 106 - 0
components/net/uip/doc/html/a00042.html

@@ -0,0 +1,106 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: example-mainloop-with-arp.c</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<h1>example-mainloop-with-arp.c</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#include "<a class="code" href="a00136.html">uip.h</a>"</span>
+<a name="l00002"></a>00002 <span class="preprocessor">#include "<a class="code" href="a00139.html">uip_arp.h</a>"</span>
+<a name="l00003"></a>00003 <span class="preprocessor">#include "network-device.h"</span>
+<a name="l00004"></a>00004 <span class="preprocessor">#include "httpd.h"</span>
+<a name="l00005"></a>00005 <span class="preprocessor">#include "<a class="code" href="a00130.html">timer.h</a>"</span>
+<a name="l00006"></a>00006 
+<a name="l00007"></a>00007 <span class="preprocessor">#define BUF ((struct uip_eth_hdr *)&amp;uip_buf[0])</span>
+<a name="l00008"></a>00008 <span class="preprocessor"></span>
+<a name="l00009"></a>00009 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00010"></a>00010 <span class="keywordtype">int</span>
+<a name="l00011"></a>00011 main(<span class="keywordtype">void</span>)
+<a name="l00012"></a>00012 {
+<a name="l00013"></a>00013   <span class="keywordtype">int</span> i;
+<a name="l00014"></a>00014   <a name="a60"></a><a class="code" href="a00150.html#g1ef35301f43a5bbb9f89f07b5a36b9a0">uip_ipaddr_t</a> ipaddr;
+<a name="l00015"></a>00015   <span class="keyword">struct </span><a name="_a61"></a><a class="code" href="a00087.html">timer</a> periodic_timer, arp_timer;
+<a name="l00016"></a>00016   
+<a name="l00017"></a>00017   <a name="a62"></a><a class="code" href="a00156.html#g6614d96fdfcd95c95ec6e6f63071ff51">timer_set</a>(&amp;periodic_timer, <a name="a63"></a><a class="code" href="a00157.html#ge3ced0551b26c9b99cb45a86f34d100a">CLOCK_SECOND</a> / 2);
+<a name="l00018"></a>00018   <a class="code" href="a00156.html#g6614d96fdfcd95c95ec6e6f63071ff51">timer_set</a>(&amp;arp_timer, <a class="code" href="a00157.html#ge3ced0551b26c9b99cb45a86f34d100a">CLOCK_SECOND</a> * 10);
+<a name="l00019"></a>00019   
+<a name="l00020"></a>00020   network_device_init();
+<a name="l00021"></a>00021   <a name="a64"></a><a class="code" href="a00145.html#gc48ed5f0d27721ef62a3ed02a5ad8d2e">uip_init</a>();
+<a name="l00022"></a>00022 
+<a name="l00023"></a>00023   <a name="a65"></a><a class="code" href="a00148.html#g87f0b54ade0d159fba495089128a4932">uip_ipaddr</a>(ipaddr, 192,168,0,2);
+<a name="l00024"></a>00024   <a name="a66"></a><a class="code" href="a00144.html#g12b467f314489259dd718228d0827a51">uip_sethostaddr</a>(ipaddr);
+<a name="l00025"></a>00025 
+<a name="l00026"></a>00026   <a name="a67"></a><a class="code" href="a00164.html#gc364305cee969a0be43c071722b136e6">httpd_init</a>();
+<a name="l00027"></a>00027   
+<a name="l00028"></a>00028   <span class="keywordflow">while</span>(1) {
+<a name="l00029"></a>00029     <a name="a68"></a><a class="code" href="a00149.html#g12a33f0c09711167bdf3dd7d7cf8c5a1">uip_len</a> = network_device_read();
+<a name="l00030"></a>00030     <span class="keywordflow">if</span>(<a class="code" href="a00149.html#g12a33f0c09711167bdf3dd7d7cf8c5a1">uip_len</a> &gt; 0) {
+<a name="l00031"></a>00031       <span class="keywordflow">if</span>(<a name="a69"></a><a class="code" href="a00150.html#g24f52ac52d6e714cb04a5aa01be3bdd0">BUF</a>-&gt;type == <a name="a70"></a><a class="code" href="a00148.html#ga22b04cac8cf283ca12f028578bebc06">htons</a>(<a name="a71"></a><a class="code" href="a00152.html#g03d140db75de3d3cdfbbab1c4fed8d8d">UIP_ETHTYPE_IP</a>)) {
+<a name="l00032"></a>00032         <a name="a72"></a><a class="code" href="a00152.html#g737337d6a51e31b236c8233d024138a8">uip_arp_ipin</a>();
+<a name="l00033"></a>00033         <a name="a73"></a><a class="code" href="a00146.html#ga4360412ee9350fba725f98a137169fe">uip_input</a>();
+<a name="l00034"></a>00034         <span class="comment">/* If the above function invocation resulted in data that</span>
+<a name="l00035"></a>00035 <span class="comment">           should be sent out on the network, the global variable</span>
+<a name="l00036"></a>00036 <span class="comment">           uip_len is set to a value &gt; 0. */</span>
+<a name="l00037"></a>00037         <span class="keywordflow">if</span>(<a class="code" href="a00149.html#g12a33f0c09711167bdf3dd7d7cf8c5a1">uip_len</a> &gt; 0) {
+<a name="l00038"></a>00038           <a name="a74"></a><a class="code" href="a00152.html#g54b27e45df15e10a0eb1a3e3a91417d2">uip_arp_out</a>();
+<a name="l00039"></a>00039           network_device_send();
+<a name="l00040"></a>00040         }
+<a name="l00041"></a>00041       } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="a00150.html#g24f52ac52d6e714cb04a5aa01be3bdd0">BUF</a>-&gt;type == <a class="code" href="a00148.html#ga22b04cac8cf283ca12f028578bebc06">htons</a>(<a name="a75"></a><a class="code" href="a00152.html#g3e1562e8a6de32268e5df92a52152f91">UIP_ETHTYPE_ARP</a>)) {
+<a name="l00042"></a>00042         <a name="a76"></a><a class="code" href="a00152.html#g902c4a360134096224bc2655f623aa5f">uip_arp_arpin</a>();
+<a name="l00043"></a>00043         <span class="comment">/* If the above function invocation resulted in data that</span>
+<a name="l00044"></a>00044 <span class="comment">           should be sent out on the network, the global variable</span>
+<a name="l00045"></a>00045 <span class="comment">           uip_len is set to a value &gt; 0. */</span>
+<a name="l00046"></a>00046         <span class="keywordflow">if</span>(<a class="code" href="a00149.html#g12a33f0c09711167bdf3dd7d7cf8c5a1">uip_len</a> &gt; 0) {
+<a name="l00047"></a>00047           network_device_send();
+<a name="l00048"></a>00048         }
+<a name="l00049"></a>00049       }
+<a name="l00050"></a>00050 
+<a name="l00051"></a>00051     } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a name="a77"></a><a class="code" href="a00156.html#g6d71dececfce707c668e6257aad5906e">timer_expired</a>(&amp;periodic_timer)) {
+<a name="l00052"></a>00052       <a name="a78"></a><a class="code" href="a00156.html#gedaf3e48c2b04229b85455fb948468d6">timer_reset</a>(&amp;periodic_timer);
+<a name="l00053"></a>00053       <span class="keywordflow">for</span>(i = 0; i &lt; <a name="a79"></a><a class="code" href="a00153.html#gf5fe83be78b78b9e7d9e7f1e34ab1cc5">UIP_CONNS</a>; i++) {
+<a name="l00054"></a>00054         <a name="a80"></a><a class="code" href="a00146.html#g1024f8a5fa65e82bf848b2e6590d9628">uip_periodic</a>(i);
+<a name="l00055"></a>00055         <span class="comment">/* If the above function invocation resulted in data that</span>
+<a name="l00056"></a>00056 <span class="comment">           should be sent out on the network, the global variable</span>
+<a name="l00057"></a>00057 <span class="comment">           uip_len is set to a value &gt; 0. */</span>
+<a name="l00058"></a>00058         <span class="keywordflow">if</span>(<a class="code" href="a00149.html#g12a33f0c09711167bdf3dd7d7cf8c5a1">uip_len</a> &gt; 0) {
+<a name="l00059"></a>00059           <a class="code" href="a00152.html#g54b27e45df15e10a0eb1a3e3a91417d2">uip_arp_out</a>();
+<a name="l00060"></a>00060           network_device_send();
+<a name="l00061"></a>00061         }
+<a name="l00062"></a>00062       }
+<a name="l00063"></a>00063 
+<a name="l00064"></a>00064 <span class="preprocessor">#if UIP_UDP</span>
+<a name="l00065"></a>00065 <span class="preprocessor"></span>      <span class="keywordflow">for</span>(i = 0; i &lt; <a name="a81"></a><a class="code" href="a00153.html#g196379ceb1219a99f4495e41ccc9bbfb">UIP_UDP_CONNS</a>; i++) {
+<a name="l00066"></a>00066         <a name="a82"></a><a class="code" href="a00146.html#g2c64c8c36bc84f9336f6a2184ea51883">uip_udp_periodic</a>(i);
+<a name="l00067"></a>00067         <span class="comment">/* If the above function invocation resulted in data that</span>
+<a name="l00068"></a>00068 <span class="comment">           should be sent out on the network, the global variable</span>
+<a name="l00069"></a>00069 <span class="comment">           uip_len is set to a value &gt; 0. */</span>
+<a name="l00070"></a>00070         <span class="keywordflow">if</span>(<a class="code" href="a00149.html#g12a33f0c09711167bdf3dd7d7cf8c5a1">uip_len</a> &gt; 0) {
+<a name="l00071"></a>00071           <a class="code" href="a00152.html#g54b27e45df15e10a0eb1a3e3a91417d2">uip_arp_out</a>();
+<a name="l00072"></a>00072           network_device_send();
+<a name="l00073"></a>00073         }
+<a name="l00074"></a>00074       }
+<a name="l00075"></a>00075 <span class="preprocessor">#endif </span><span class="comment">/* UIP_UDP */</span>
+<a name="l00076"></a>00076       
+<a name="l00077"></a>00077       <span class="comment">/* Call the ARP timer function every 10 seconds. */</span>
+<a name="l00078"></a>00078       <span class="keywordflow">if</span>(<a class="code" href="a00156.html#g6d71dececfce707c668e6257aad5906e">timer_expired</a>(&amp;arp_timer)) {
+<a name="l00079"></a>00079         <a class="code" href="a00156.html#gedaf3e48c2b04229b85455fb948468d6">timer_reset</a>(&amp;arp_timer);
+<a name="l00080"></a>00080         <a name="a83"></a><a class="code" href="a00152.html#g058a8e6025f67b021862281f1911fcef">uip_arp_timer</a>();
+<a name="l00081"></a>00081       }
+<a name="l00082"></a>00082     }
+<a name="l00083"></a>00083   }
+<a name="l00084"></a>00084   <span class="keywordflow">return</span> 0;
+<a name="l00085"></a>00085 }
+<a name="l00086"></a>00086 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 82 - 0
components/net/uip/doc/html/a00043.html

@@ -0,0 +1,82 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: example-mainloop-without-arp.c</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<h1>example-mainloop-without-arp.c</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#include "<a class="code" href="a00136.html">uip.h</a>"</span>
+<a name="l00002"></a>00002 <span class="preprocessor">#include "<a class="code" href="a00139.html">uip_arp.h</a>"</span>
+<a name="l00003"></a>00003 <span class="preprocessor">#include "network-device.h"</span>
+<a name="l00004"></a>00004 <span class="preprocessor">#include "httpd.h"</span>
+<a name="l00005"></a>00005 <span class="preprocessor">#include "<a class="code" href="a00130.html">timer.h</a>"</span>
+<a name="l00006"></a>00006 
+<a name="l00007"></a>00007 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00008"></a>00008 <span class="keywordtype">int</span>
+<a name="l00009"></a>00009 main(<span class="keywordtype">void</span>)
+<a name="l00010"></a>00010 {
+<a name="l00011"></a>00011   <span class="keywordtype">int</span> i;
+<a name="l00012"></a>00012   <a name="a84"></a><a class="code" href="a00150.html#g1ef35301f43a5bbb9f89f07b5a36b9a0">uip_ipaddr_t</a> ipaddr;
+<a name="l00013"></a>00013   <span class="keyword">struct </span><a name="_a85"></a><a class="code" href="a00087.html">timer</a> periodic_timer;
+<a name="l00014"></a>00014   
+<a name="l00015"></a>00015   <a name="a86"></a><a class="code" href="a00156.html#g6614d96fdfcd95c95ec6e6f63071ff51">timer_set</a>(&amp;periodic_timer, <a name="a87"></a><a class="code" href="a00157.html#ge3ced0551b26c9b99cb45a86f34d100a">CLOCK_SECOND</a> / 2);
+<a name="l00016"></a>00016   
+<a name="l00017"></a>00017   network_device_init();
+<a name="l00018"></a>00018   <a name="a88"></a><a class="code" href="a00145.html#gc48ed5f0d27721ef62a3ed02a5ad8d2e">uip_init</a>();
+<a name="l00019"></a>00019 
+<a name="l00020"></a>00020   <a name="a89"></a><a class="code" href="a00148.html#g87f0b54ade0d159fba495089128a4932">uip_ipaddr</a>(ipaddr, 192,168,0,2);
+<a name="l00021"></a>00021   <a name="a90"></a><a class="code" href="a00144.html#g12b467f314489259dd718228d0827a51">uip_sethostaddr</a>(ipaddr);
+<a name="l00022"></a>00022 
+<a name="l00023"></a>00023   <a name="a91"></a><a class="code" href="a00164.html#gc364305cee969a0be43c071722b136e6">httpd_init</a>();
+<a name="l00024"></a>00024   
+<a name="l00025"></a>00025   <span class="keywordflow">while</span>(1) {
+<a name="l00026"></a>00026     <a name="a92"></a><a class="code" href="a00149.html#g12a33f0c09711167bdf3dd7d7cf8c5a1">uip_len</a> = network_device_read();
+<a name="l00027"></a>00027     <span class="keywordflow">if</span>(<a class="code" href="a00149.html#g12a33f0c09711167bdf3dd7d7cf8c5a1">uip_len</a> &gt; 0) {
+<a name="l00028"></a>00028       <a name="a93"></a><a class="code" href="a00146.html#ga4360412ee9350fba725f98a137169fe">uip_input</a>();
+<a name="l00029"></a>00029       <span class="comment">/* If the above function invocation resulted in data that</span>
+<a name="l00030"></a>00030 <span class="comment">         should be sent out on the network, the global variable</span>
+<a name="l00031"></a>00031 <span class="comment">         uip_len is set to a value &gt; 0. */</span>
+<a name="l00032"></a>00032       <span class="keywordflow">if</span>(<a class="code" href="a00149.html#g12a33f0c09711167bdf3dd7d7cf8c5a1">uip_len</a> &gt; 0) {
+<a name="l00033"></a>00033         network_device_send();
+<a name="l00034"></a>00034       }
+<a name="l00035"></a>00035     } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a name="a94"></a><a class="code" href="a00156.html#g6d71dececfce707c668e6257aad5906e">timer_expired</a>(&amp;periodic_timer)) {
+<a name="l00036"></a>00036       <a name="a95"></a><a class="code" href="a00156.html#gedaf3e48c2b04229b85455fb948468d6">timer_reset</a>(&amp;periodic_timer);
+<a name="l00037"></a>00037       <span class="keywordflow">for</span>(i = 0; i &lt; <a name="a96"></a><a class="code" href="a00153.html#gf5fe83be78b78b9e7d9e7f1e34ab1cc5">UIP_CONNS</a>; i++) {
+<a name="l00038"></a>00038         <a name="a97"></a><a class="code" href="a00146.html#g1024f8a5fa65e82bf848b2e6590d9628">uip_periodic</a>(i);
+<a name="l00039"></a>00039         <span class="comment">/* If the above function invocation resulted in data that</span>
+<a name="l00040"></a>00040 <span class="comment">           should be sent out on the network, the global variable</span>
+<a name="l00041"></a>00041 <span class="comment">           uip_len is set to a value &gt; 0. */</span>
+<a name="l00042"></a>00042         <span class="keywordflow">if</span>(<a class="code" href="a00149.html#g12a33f0c09711167bdf3dd7d7cf8c5a1">uip_len</a> &gt; 0) {
+<a name="l00043"></a>00043           network_device_send();
+<a name="l00044"></a>00044         }
+<a name="l00045"></a>00045       }
+<a name="l00046"></a>00046 
+<a name="l00047"></a>00047 <span class="preprocessor">#if UIP_UDP</span>
+<a name="l00048"></a>00048 <span class="preprocessor"></span>      <span class="keywordflow">for</span>(i = 0; i &lt; <a name="a98"></a><a class="code" href="a00153.html#g196379ceb1219a99f4495e41ccc9bbfb">UIP_UDP_CONNS</a>; i++) {
+<a name="l00049"></a>00049         <a name="a99"></a><a class="code" href="a00146.html#g2c64c8c36bc84f9336f6a2184ea51883">uip_udp_periodic</a>(i);
+<a name="l00050"></a>00050         <span class="comment">/* If the above function invocation resulted in data that</span>
+<a name="l00051"></a>00051 <span class="comment">           should be sent out on the network, the global variable</span>
+<a name="l00052"></a>00052 <span class="comment">           uip_len is set to a value &gt; 0. */</span>
+<a name="l00053"></a>00053         <span class="keywordflow">if</span>(<a class="code" href="a00149.html#g12a33f0c09711167bdf3dd7d7cf8c5a1">uip_len</a> &gt; 0) {
+<a name="l00054"></a>00054           network_device_send();
+<a name="l00055"></a>00055         }
+<a name="l00056"></a>00056       }
+<a name="l00057"></a>00057 <span class="preprocessor">#endif </span><span class="comment">/* UIP_UDP */</span>
+<a name="l00058"></a>00058     }
+<a name="l00059"></a>00059   }
+<a name="l00060"></a>00060   <span class="keywordflow">return</span> 0;
+<a name="l00061"></a>00061 }
+<a name="l00062"></a>00062 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 370 - 0
components/net/uip/doc/html/a00044.html

@@ -0,0 +1,370 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: telnetd.c</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<h1>telnetd.c</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment"> * Copyright (c) 2003, Adam Dunkels.</span>
+<a name="l00003"></a>00003 <span class="comment"> * All rights reserved.</span>
+<a name="l00004"></a>00004 <span class="comment"> *</span>
+<a name="l00005"></a>00005 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00006"></a>00006 <span class="comment"> * modification, are permitted provided that the following conditions</span>
+<a name="l00007"></a>00007 <span class="comment"> * are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> * 1. Redistributions of source code must retain the above copyright</span>
+<a name="l00009"></a>00009 <span class="comment"> *    notice, this list of conditions and the following disclaimer.</span>
+<a name="l00010"></a>00010 <span class="comment"> * 2. Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00011"></a>00011 <span class="comment"> *    notice, this list of conditions and the following disclaimer in the</span>
+<a name="l00012"></a>00012 <span class="comment"> *    documentation and/or other materials provided with the distribution.</span>
+<a name="l00013"></a>00013 <span class="comment"> * 3. The name of the author may not be used to endorse or promote</span>
+<a name="l00014"></a>00014 <span class="comment"> *    products derived from this software without specific prior</span>
+<a name="l00015"></a>00015 <span class="comment"> *    written permission.</span>
+<a name="l00016"></a>00016 <span class="comment"> *</span>
+<a name="l00017"></a>00017 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS</span>
+<a name="l00018"></a>00018 <span class="comment"> * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00019"></a>00019 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span>
+<a name="l00020"></a>00020 <span class="comment"> * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY</span>
+<a name="l00021"></a>00021 <span class="comment"> * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</span>
+<a name="l00022"></a>00022 <span class="comment"> * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE</span>
+<a name="l00023"></a>00023 <span class="comment"> * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span>
+<a name="l00024"></a>00024 <span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,</span>
+<a name="l00025"></a>00025 <span class="comment"> * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING</span>
+<a name="l00026"></a>00026 <span class="comment"> * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00027"></a>00027 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00028"></a>00028 <span class="comment"> *</span>
+<a name="l00029"></a>00029 <span class="comment"> * This file is part of the uIP TCP/IP stack</span>
+<a name="l00030"></a>00030 <span class="comment"> *</span>
+<a name="l00031"></a>00031 <span class="comment"> * $Id: telnetd.c,v 1.2 2006/06/07 09:43:54 adam Exp $</span>
+<a name="l00032"></a>00032 <span class="comment"> *</span>
+<a name="l00033"></a>00033 <span class="comment"> */</span>
+<a name="l00034"></a>00034 
+<a name="l00035"></a>00035 <span class="preprocessor">#include "<a class="code" href="a00136.html">uip.h</a>"</span>
+<a name="l00036"></a>00036 <span class="preprocessor">#include "telnetd.h"</span>
+<a name="l00037"></a>00037 <span class="preprocessor">#include "<a class="code" href="a00121.html">memb.h</a>"</span>
+<a name="l00038"></a>00038 <span class="preprocessor">#include "<a class="code" href="a00107.html">shell.h</a>"</span>
+<a name="l00039"></a>00039 
+<a name="l00040"></a>00040 <span class="preprocessor">#include &lt;string.h&gt;</span>
+<a name="l00041"></a>00041 
+<a name="l00042"></a>00042 <span class="preprocessor">#define ISO_nl       0x0a</span>
+<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#define ISO_cr       0x0d</span>
+<a name="l00044"></a>00044 <span class="preprocessor"></span>
+<a name="l00045"></a>00045 <span class="keyword">struct </span>telnetd_line {
+<a name="l00046"></a>00046   <span class="keywordtype">char</span> line[TELNETD_CONF_LINELEN];
+<a name="l00047"></a>00047 };
+<a name="l00048"></a>00048 <a name="a206"></a><a class="code" href="a00159.html#gf31774d02a69fd3f1c2b282454438cba">MEMB</a>(linemem, <span class="keyword">struct</span> telnetd_line, TELNETD_CONF_NUMLINES);
+<a name="l00049"></a>00049 
+<a name="l00050"></a>00050 <span class="preprocessor">#define STATE_NORMAL 0</span>
+<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor">#define STATE_IAC    1</span>
+<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#define STATE_WILL   2</span>
+<a name="l00053"></a>00053 <span class="preprocessor"></span><span class="preprocessor">#define STATE_WONT   3</span>
+<a name="l00054"></a>00054 <span class="preprocessor"></span><span class="preprocessor">#define STATE_DO     4</span>
+<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#define STATE_DONT   5</span>
+<a name="l00056"></a>00056 <span class="preprocessor"></span><span class="preprocessor">#define STATE_CLOSE  6</span>
+<a name="l00057"></a>00057 <span class="preprocessor"></span>
+<a name="l00058"></a>00058 <span class="keyword">static</span> <span class="keyword">struct </span><a name="_a207"></a><a class="code" href="a00086.html">telnetd_state</a> s;
+<a name="l00059"></a>00059 
+<a name="l00060"></a>00060 <span class="preprocessor">#define TELNET_IAC   255</span>
+<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor">#define TELNET_WILL  251</span>
+<a name="l00062"></a>00062 <span class="preprocessor"></span><span class="preprocessor">#define TELNET_WONT  252</span>
+<a name="l00063"></a>00063 <span class="preprocessor"></span><span class="preprocessor">#define TELNET_DO    253</span>
+<a name="l00064"></a>00064 <span class="preprocessor"></span><span class="preprocessor">#define TELNET_DONT  254</span>
+<a name="l00065"></a>00065 <span class="preprocessor"></span><span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00066"></a>00066 <span class="keyword">static</span> <span class="keywordtype">char</span> *
+<a name="l00067"></a>00067 alloc_line(<span class="keywordtype">void</span>)
+<a name="l00068"></a>00068 {
+<a name="l00069"></a>00069   <span class="keywordflow">return</span> <a name="a208"></a><a class="code" href="a00159.html#gfe5e93119035e14cc485760a176249ba">memb_alloc</a>(&amp;linemem);
+<a name="l00070"></a>00070 }
+<a name="l00071"></a>00071 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00072"></a>00072 <span class="keyword">static</span> <span class="keywordtype">void</span>
+<a name="l00073"></a>00073 dealloc_line(<span class="keywordtype">char</span> *line)
+<a name="l00074"></a>00074 {
+<a name="l00075"></a>00075   <a name="a209"></a><a class="code" href="a00159.html#gceb952d27de8125d5146ac0bee325b8f">memb_free</a>(&amp;linemem, line);
+<a name="l00076"></a>00076 }
+<a name="l00077"></a>00077 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00078"></a>00078 <span class="keywordtype">void</span>
+<a name="l00079"></a>00079 <a name="a210"></a>shell_quit(<span class="keywordtype">char</span> *str)
+<a name="l00080"></a>00080 {
+<a name="l00081"></a>00081   s.<a name="a211"></a><a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_CLOSE;
+<a name="l00082"></a>00082 }
+<a name="l00083"></a>00083 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00084"></a>00084 <span class="keyword">static</span> <span class="keywordtype">void</span>
+<a name="l00085"></a>00085 sendline(<span class="keywordtype">char</span> *line)
+<a name="l00086"></a>00086 {
+<a name="l00087"></a>00087   <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;
+<a name="l00088"></a>00088   
+<a name="l00089"></a>00089   <span class="keywordflow">for</span>(i = 0; i &lt; TELNETD_CONF_NUMLINES; ++i) {
+<a name="l00090"></a>00090     <span class="keywordflow">if</span>(s.<a name="a212"></a><a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[i] == <a name="a213"></a><a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) {
+<a name="l00091"></a>00091       s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[i] = line;
+<a name="l00092"></a>00092       <span class="keywordflow">break</span>;
+<a name="l00093"></a>00093     }
+<a name="l00094"></a>00094   }
+<a name="l00095"></a>00095   <span class="keywordflow">if</span>(i == TELNETD_CONF_NUMLINES) {
+<a name="l00096"></a>00096     dealloc_line(line);
+<a name="l00097"></a>00097   }
+<a name="l00098"></a>00098 }
+<a name="l00099"></a>00099 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00100"></a>00100 <span class="keywordtype">void</span>
+<a name="l00101"></a>00101 <a name="a214"></a>shell_prompt(<span class="keywordtype">char</span> *str)
+<a name="l00102"></a>00102 {
+<a name="l00103"></a>00103   <span class="keywordtype">char</span> *line;
+<a name="l00104"></a>00104   line = alloc_line();
+<a name="l00105"></a>00105   <span class="keywordflow">if</span>(line != <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) {
+<a name="l00106"></a>00106     strncpy(line, str, TELNETD_CONF_LINELEN);
+<a name="l00107"></a>00107     <span class="comment">/*    petsciiconv_toascii(line, TELNETD_CONF_LINELEN);*/</span>
+<a name="l00108"></a>00108     sendline(line);
+<a name="l00109"></a>00109   }
+<a name="l00110"></a>00110 }
+<a name="l00111"></a>00111 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00112"></a>00112 <span class="keywordtype">void</span>
+<a name="l00113"></a>00113 <a name="a215"></a>shell_output(<span class="keywordtype">char</span> *str1, <span class="keywordtype">char</span> *str2)
+<a name="l00114"></a>00114 {
+<a name="l00115"></a>00115   <span class="keyword">static</span> <span class="keywordtype">unsigned</span> len;
+<a name="l00116"></a>00116   <span class="keywordtype">char</span> *line;
+<a name="l00117"></a>00117 
+<a name="l00118"></a>00118   line = alloc_line();
+<a name="l00119"></a>00119   <span class="keywordflow">if</span>(line != <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) {
+<a name="l00120"></a>00120     len = strlen(str1);
+<a name="l00121"></a>00121     strncpy(line, str1, TELNETD_CONF_LINELEN);
+<a name="l00122"></a>00122     <span class="keywordflow">if</span>(len &lt; TELNETD_CONF_LINELEN) {
+<a name="l00123"></a>00123       strncpy(line + len, str2, TELNETD_CONF_LINELEN - len);
+<a name="l00124"></a>00124     }
+<a name="l00125"></a>00125     len = strlen(line);
+<a name="l00126"></a>00126     <span class="keywordflow">if</span>(len &lt; TELNETD_CONF_LINELEN - 2) {
+<a name="l00127"></a>00127       line[len] = <a name="a216"></a><a class="code" href="a00161.html#g6cda47c85ce1b58b501b44ac9cccc50e">ISO_cr</a>;
+<a name="l00128"></a>00128       line[len+1] = <a name="a217"></a><a class="code" href="a00161.html#g3212e70c55244608ac16316888c354f0">ISO_nl</a>;
+<a name="l00129"></a>00129       line[len+2] = 0;
+<a name="l00130"></a>00130     }
+<a name="l00131"></a>00131     <span class="comment">/*    petsciiconv_toascii(line, TELNETD_CONF_LINELEN);*/</span>
+<a name="l00132"></a>00132     sendline(line);
+<a name="l00133"></a>00133   }
+<a name="l00134"></a>00134 }
+<a name="l00135"></a>00135 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00136"></a>00136 <span class="keywordtype">void</span>
+<a name="l00137"></a>00137 telnetd_init(<span class="keywordtype">void</span>)
+<a name="l00138"></a>00138 {
+<a name="l00139"></a>00139   <a name="a218"></a><a class="code" href="a00147.html#gdd1ab3704ecd4900eec61a6897d32dc8">uip_listen</a>(<a name="a219"></a><a class="code" href="a00148.html#g69a7a4951ff21b302267532c21ee78fc">HTONS</a>(23));
+<a name="l00140"></a>00140   <a name="a220"></a><a class="code" href="a00159.html#gd58a6c7e62ae59bf7a016ded12ca2910">memb_init</a>(&amp;linemem);
+<a name="l00141"></a>00141   <a name="a221"></a><a class="code" href="a00107.html#69b075ef7e4d7bcf5a903d3d75baac02">shell_init</a>();
+<a name="l00142"></a>00142 }
+<a name="l00143"></a>00143 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00144"></a>00144 <span class="keyword">static</span> <span class="keywordtype">void</span>
+<a name="l00145"></a>00145 acked(<span class="keywordtype">void</span>)
+<a name="l00146"></a>00146 {
+<a name="l00147"></a>00147   <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;
+<a name="l00148"></a>00148   
+<a name="l00149"></a>00149   <span class="keywordflow">while</span>(s.<a name="a222"></a><a class="code" href="a00086.html#d85fc90c30d1fc37c63c4844be5fe09d">numsent</a> &gt; 0) {
+<a name="l00150"></a>00150     dealloc_line(s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[0]);
+<a name="l00151"></a>00151     <span class="keywordflow">for</span>(i = 1; i &lt; TELNETD_CONF_NUMLINES; ++i) {
+<a name="l00152"></a>00152       s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[i - 1] = s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[i];
+<a name="l00153"></a>00153     }
+<a name="l00154"></a>00154     s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[TELNETD_CONF_NUMLINES - 1] = <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
+<a name="l00155"></a>00155     --s.<a class="code" href="a00086.html#d85fc90c30d1fc37c63c4844be5fe09d">numsent</a>;
+<a name="l00156"></a>00156   }
+<a name="l00157"></a>00157 }
+<a name="l00158"></a>00158 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00159"></a>00159 <span class="keyword">static</span> <span class="keywordtype">void</span>
+<a name="l00160"></a>00160 senddata(<span class="keywordtype">void</span>)
+<a name="l00161"></a>00161 {
+<a name="l00162"></a>00162   <span class="keyword">static</span> <span class="keywordtype">char</span> *<a name="a223"></a><a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a>, *lineptr;
+<a name="l00163"></a>00163   <span class="keyword">static</span> <span class="keywordtype">int</span> buflen, linelen;
+<a name="l00164"></a>00164   
+<a name="l00165"></a>00165   bufptr = <a name="a224"></a><a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>;
+<a name="l00166"></a>00166   buflen = 0;
+<a name="l00167"></a>00167   <span class="keywordflow">for</span>(s.<a class="code" href="a00086.html#d85fc90c30d1fc37c63c4844be5fe09d">numsent</a> = 0; s.<a class="code" href="a00086.html#d85fc90c30d1fc37c63c4844be5fe09d">numsent</a> &lt; TELNETD_CONF_NUMLINES &amp;&amp;
+<a name="l00168"></a>00168         s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[s.<a class="code" href="a00086.html#d85fc90c30d1fc37c63c4844be5fe09d">numsent</a>] != <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a> ; ++s.<a class="code" href="a00086.html#d85fc90c30d1fc37c63c4844be5fe09d">numsent</a>) {
+<a name="l00169"></a>00169     lineptr = s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[s.<a class="code" href="a00086.html#d85fc90c30d1fc37c63c4844be5fe09d">numsent</a>];
+<a name="l00170"></a>00170     linelen = strlen(lineptr);
+<a name="l00171"></a>00171     <span class="keywordflow">if</span>(linelen &gt; TELNETD_CONF_LINELEN) {
+<a name="l00172"></a>00172       linelen = TELNETD_CONF_LINELEN;
+<a name="l00173"></a>00173     }
+<a name="l00174"></a>00174     <span class="keywordflow">if</span>(buflen + linelen &lt; <a name="a225"></a><a class="code" href="a00147.html#gb5fecbc62edd128012cea0f47b57ab9f">uip_mss</a>()) {
+<a name="l00175"></a>00175       memcpy(bufptr, lineptr, linelen);
+<a name="l00176"></a>00176       bufptr += linelen;
+<a name="l00177"></a>00177       buflen += linelen;
+<a name="l00178"></a>00178     } <span class="keywordflow">else</span> {
+<a name="l00179"></a>00179       <span class="keywordflow">break</span>;
+<a name="l00180"></a>00180     }
+<a name="l00181"></a>00181   }
+<a name="l00182"></a>00182   <a name="a226"></a><a class="code" href="a00147.html#g04b053a623aac7cd4195157d470661b3">uip_send</a>(<a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>, buflen);
+<a name="l00183"></a>00183 }
+<a name="l00184"></a>00184 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00185"></a>00185 <span class="keyword">static</span> <span class="keywordtype">void</span>
+<a name="l00186"></a>00186 closed(<span class="keywordtype">void</span>)
+<a name="l00187"></a>00187 {
+<a name="l00188"></a>00188   <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;
+<a name="l00189"></a>00189   
+<a name="l00190"></a>00190   <span class="keywordflow">for</span>(i = 0; i &lt; TELNETD_CONF_NUMLINES; ++i) {
+<a name="l00191"></a>00191     <span class="keywordflow">if</span>(s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[i] != <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) {
+<a name="l00192"></a>00192       dealloc_line(s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[i]);
+<a name="l00193"></a>00193     }
+<a name="l00194"></a>00194   }
+<a name="l00195"></a>00195 }
+<a name="l00196"></a>00196 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00197"></a>00197 <span class="keyword">static</span> <span class="keywordtype">void</span>
+<a name="l00198"></a>00198 get_char(<a name="a227"></a><a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> c)
+<a name="l00199"></a>00199 {
+<a name="l00200"></a>00200   <span class="keywordflow">if</span>(c == <a class="code" href="a00161.html#g6cda47c85ce1b58b501b44ac9cccc50e">ISO_cr</a>) {
+<a name="l00201"></a>00201     <span class="keywordflow">return</span>;
+<a name="l00202"></a>00202   }
+<a name="l00203"></a>00203   
+<a name="l00204"></a>00204   s.<a name="a228"></a><a class="code" href="a00086.html#54a466311575a727830a92a6c3621cb2">buf</a>[(int)s.<a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a>] = c;
+<a name="l00205"></a>00205   <span class="keywordflow">if</span>(s.<a class="code" href="a00086.html#54a466311575a727830a92a6c3621cb2">buf</a>[(<span class="keywordtype">int</span>)s.<a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a>] == <a class="code" href="a00161.html#g3212e70c55244608ac16316888c354f0">ISO_nl</a> ||
+<a name="l00206"></a>00206      s.<a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a> == <span class="keyword">sizeof</span>(s.<a class="code" href="a00086.html#54a466311575a727830a92a6c3621cb2">buf</a>) - 1) {
+<a name="l00207"></a>00207     <span class="keywordflow">if</span>(s.<a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a> &gt; 0) {
+<a name="l00208"></a>00208       s.<a class="code" href="a00086.html#54a466311575a727830a92a6c3621cb2">buf</a>[(int)s.<a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a>] = 0;
+<a name="l00209"></a>00209       <span class="comment">/*      petsciiconv_topetscii(s.buf, TELNETD_CONF_LINELEN);*/</span>
+<a name="l00210"></a>00210     }
+<a name="l00211"></a>00211     <a name="a229"></a><a class="code" href="a00107.html#86beee1f69d05b16022dfb430470e9ce">shell_input</a>(s.<a class="code" href="a00086.html#54a466311575a727830a92a6c3621cb2">buf</a>);
+<a name="l00212"></a>00212     s.<a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a> = 0;
+<a name="l00213"></a>00213   } <span class="keywordflow">else</span> {
+<a name="l00214"></a>00214     ++s.<a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a>;
+<a name="l00215"></a>00215   }
+<a name="l00216"></a>00216 }
+<a name="l00217"></a>00217 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00218"></a>00218 <span class="keyword">static</span> <span class="keywordtype">void</span>
+<a name="l00219"></a>00219 sendopt(<a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> option, <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> value)
+<a name="l00220"></a>00220 {
+<a name="l00221"></a>00221   <span class="keywordtype">char</span> *line;
+<a name="l00222"></a>00222   line = alloc_line();
+<a name="l00223"></a>00223   <span class="keywordflow">if</span>(line != <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) {
+<a name="l00224"></a>00224     line[0] = TELNET_IAC;
+<a name="l00225"></a>00225     line[1] = option;
+<a name="l00226"></a>00226     line[2] = value;
+<a name="l00227"></a>00227     line[3] = 0;
+<a name="l00228"></a>00228     sendline(line);
+<a name="l00229"></a>00229   }
+<a name="l00230"></a>00230 }
+<a name="l00231"></a>00231 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00232"></a>00232 <span class="keyword">static</span> <span class="keywordtype">void</span>
+<a name="l00233"></a>00233 newdata(<span class="keywordtype">void</span>)
+<a name="l00234"></a>00234 {
+<a name="l00235"></a>00235   <a name="a230"></a><a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> len;
+<a name="l00236"></a>00236   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> c;
+<a name="l00237"></a>00237   <span class="keywordtype">char</span> *dataptr;
+<a name="l00238"></a>00238     
+<a name="l00239"></a>00239   
+<a name="l00240"></a>00240   len = <a name="a231"></a><a class="code" href="a00147.html#g1a1bc437c09ddef238abab41d77c3177">uip_datalen</a>();
+<a name="l00241"></a>00241   dataptr = (<span class="keywordtype">char</span> *)<a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>;
+<a name="l00242"></a>00242   
+<a name="l00243"></a>00243   <span class="keywordflow">while</span>(len &gt; 0 &amp;&amp; s.<a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a> &lt; <span class="keyword">sizeof</span>(s.<a class="code" href="a00086.html#54a466311575a727830a92a6c3621cb2">buf</a>)) {
+<a name="l00244"></a>00244     c = *dataptr;
+<a name="l00245"></a>00245     ++dataptr;
+<a name="l00246"></a>00246     --len;
+<a name="l00247"></a>00247     <span class="keywordflow">switch</span>(s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a>) {
+<a name="l00248"></a>00248     <span class="keywordflow">case</span> STATE_IAC:
+<a name="l00249"></a>00249       <span class="keywordflow">if</span>(c == TELNET_IAC) {
+<a name="l00250"></a>00250         get_char(c);
+<a name="l00251"></a>00251         s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_NORMAL;
+<a name="l00252"></a>00252       } <span class="keywordflow">else</span> {
+<a name="l00253"></a>00253         <span class="keywordflow">switch</span>(c) {
+<a name="l00254"></a>00254         <span class="keywordflow">case</span> TELNET_WILL:
+<a name="l00255"></a>00255           s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_WILL;
+<a name="l00256"></a>00256           <span class="keywordflow">break</span>;
+<a name="l00257"></a>00257         <span class="keywordflow">case</span> TELNET_WONT:
+<a name="l00258"></a>00258           s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_WONT;
+<a name="l00259"></a>00259           <span class="keywordflow">break</span>;
+<a name="l00260"></a>00260         <span class="keywordflow">case</span> TELNET_DO:
+<a name="l00261"></a>00261           s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_DO;
+<a name="l00262"></a>00262           <span class="keywordflow">break</span>;
+<a name="l00263"></a>00263         <span class="keywordflow">case</span> TELNET_DONT:
+<a name="l00264"></a>00264           s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_DONT;
+<a name="l00265"></a>00265           <span class="keywordflow">break</span>;
+<a name="l00266"></a>00266         <span class="keywordflow">default</span>:
+<a name="l00267"></a>00267           s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_NORMAL;
+<a name="l00268"></a>00268           <span class="keywordflow">break</span>;
+<a name="l00269"></a>00269         }
+<a name="l00270"></a>00270       }
+<a name="l00271"></a>00271       <span class="keywordflow">break</span>;
+<a name="l00272"></a>00272     <span class="keywordflow">case</span> STATE_WILL:
+<a name="l00273"></a>00273       <span class="comment">/* Reply with a DONT */</span>
+<a name="l00274"></a>00274       sendopt(TELNET_DONT, c);
+<a name="l00275"></a>00275       s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_NORMAL;
+<a name="l00276"></a>00276       <span class="keywordflow">break</span>;
+<a name="l00277"></a>00277       
+<a name="l00278"></a>00278     <span class="keywordflow">case</span> STATE_WONT:
+<a name="l00279"></a>00279       <span class="comment">/* Reply with a DONT */</span>
+<a name="l00280"></a>00280       sendopt(TELNET_DONT, c);
+<a name="l00281"></a>00281       s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_NORMAL;
+<a name="l00282"></a>00282       <span class="keywordflow">break</span>;
+<a name="l00283"></a>00283     <span class="keywordflow">case</span> STATE_DO:
+<a name="l00284"></a>00284       <span class="comment">/* Reply with a WONT */</span>
+<a name="l00285"></a>00285       sendopt(TELNET_WONT, c);
+<a name="l00286"></a>00286       s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_NORMAL;
+<a name="l00287"></a>00287       <span class="keywordflow">break</span>;
+<a name="l00288"></a>00288     <span class="keywordflow">case</span> STATE_DONT:
+<a name="l00289"></a>00289       <span class="comment">/* Reply with a WONT */</span>
+<a name="l00290"></a>00290       sendopt(TELNET_WONT, c);
+<a name="l00291"></a>00291       s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_NORMAL;
+<a name="l00292"></a>00292       <span class="keywordflow">break</span>;
+<a name="l00293"></a>00293     <span class="keywordflow">case</span> STATE_NORMAL:
+<a name="l00294"></a>00294       <span class="keywordflow">if</span>(c == TELNET_IAC) {
+<a name="l00295"></a>00295         s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_IAC;
+<a name="l00296"></a>00296       } <span class="keywordflow">else</span> {
+<a name="l00297"></a>00297         get_char(c);
+<a name="l00298"></a>00298       }
+<a name="l00299"></a>00299       <span class="keywordflow">break</span>;
+<a name="l00300"></a>00300     }
+<a name="l00301"></a>00301 
+<a name="l00302"></a>00302     
+<a name="l00303"></a>00303   }
+<a name="l00304"></a>00304   
+<a name="l00305"></a>00305 }
+<a name="l00306"></a>00306 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00307"></a>00307 <span class="keywordtype">void</span>
+<a name="l00308"></a>00308 telnetd_appcall(<span class="keywordtype">void</span>)
+<a name="l00309"></a>00309 {
+<a name="l00310"></a>00310   <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;
+<a name="l00311"></a>00311   <span class="keywordflow">if</span>(<a name="a232"></a><a class="code" href="a00147.html#gdb971fb1525d0c5002f52125b05f3218">uip_connected</a>()) {
+<a name="l00312"></a>00312     <span class="comment">/*    tcp_markconn(uip_conn, &amp;s);*/</span>
+<a name="l00313"></a>00313     <span class="keywordflow">for</span>(i = 0; i &lt; TELNETD_CONF_NUMLINES; ++i) {
+<a name="l00314"></a>00314       s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[i] = <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
+<a name="l00315"></a>00315     }
+<a name="l00316"></a>00316     s.<a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a> = 0;
+<a name="l00317"></a>00317     s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_NORMAL;
+<a name="l00318"></a>00318 
+<a name="l00319"></a>00319     <a name="a233"></a><a class="code" href="a00107.html#d1f18f739da7703628c3663209463a0d">shell_start</a>();
+<a name="l00320"></a>00320   }
+<a name="l00321"></a>00321 
+<a name="l00322"></a>00322   <span class="keywordflow">if</span>(s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> == STATE_CLOSE) {
+<a name="l00323"></a>00323     s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_NORMAL;
+<a name="l00324"></a>00324     <a name="a234"></a><a class="code" href="a00147.html#g61db1dcb7c760e4dd5d60bf4e5576dca">uip_close</a>();
+<a name="l00325"></a>00325     <span class="keywordflow">return</span>;
+<a name="l00326"></a>00326   }
+<a name="l00327"></a>00327   
+<a name="l00328"></a>00328   <span class="keywordflow">if</span>(<a name="a235"></a><a class="code" href="a00147.html#gef6c4140c632b6a406779342cf3b6eb6">uip_closed</a>() ||
+<a name="l00329"></a>00329      <a name="a236"></a><a class="code" href="a00147.html#gfbd5fc486dfdf6bf6fc9db52b1f418c4">uip_aborted</a>() ||
+<a name="l00330"></a>00330      <a name="a237"></a><a class="code" href="a00147.html#g7b2ac4b18bd2ac3912fe67b3b17158c3">uip_timedout</a>()) {
+<a name="l00331"></a>00331     closed();
+<a name="l00332"></a>00332   }
+<a name="l00333"></a>00333   
+<a name="l00334"></a>00334   <span class="keywordflow">if</span>(<a name="a238"></a><a class="code" href="a00147.html#gde6634974418e3240c212b9b16864368">uip_acked</a>()) {
+<a name="l00335"></a>00335     acked();
+<a name="l00336"></a>00336   }
+<a name="l00337"></a>00337   
+<a name="l00338"></a>00338   <span class="keywordflow">if</span>(<a name="a239"></a><a class="code" href="a00147.html#g26a14b8dae3f861830af9e7cf1e03725">uip_newdata</a>()) {
+<a name="l00339"></a>00339     newdata();
+<a name="l00340"></a>00340   }
+<a name="l00341"></a>00341   
+<a name="l00342"></a>00342   <span class="keywordflow">if</span>(<a name="a240"></a><a class="code" href="a00147.html#ga8933ad15a2e2947dae4a5cff50e6007">uip_rexmit</a>() ||
+<a name="l00343"></a>00343      <a class="code" href="a00147.html#g26a14b8dae3f861830af9e7cf1e03725">uip_newdata</a>() ||
+<a name="l00344"></a>00344      <a class="code" href="a00147.html#gde6634974418e3240c212b9b16864368">uip_acked</a>() ||
+<a name="l00345"></a>00345      <a class="code" href="a00147.html#gdb971fb1525d0c5002f52125b05f3218">uip_connected</a>() ||
+<a name="l00346"></a>00346      <a name="a241"></a><a class="code" href="a00147.html#g58bb90796c1cdad3aac2ecf44d87b20e">uip_poll</a>()) {
+<a name="l00347"></a>00347     senddata();
+<a name="l00348"></a>00348   }
+<a name="l00349"></a>00349 }
+<a name="l00350"></a>00350 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 83 - 0
components/net/uip/doc/html/a00045.html

@@ -0,0 +1,83 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: telnetd.h</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<h1>telnetd.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment"> * Copyright (c) 2003, Adam Dunkels.</span>
+<a name="l00003"></a>00003 <span class="comment"> * All rights reserved.</span>
+<a name="l00004"></a>00004 <span class="comment"> *</span>
+<a name="l00005"></a>00005 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00006"></a>00006 <span class="comment"> * modification, are permitted provided that the following conditions</span>
+<a name="l00007"></a>00007 <span class="comment"> * are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> * 1. Redistributions of source code must retain the above copyright</span>
+<a name="l00009"></a>00009 <span class="comment"> *    notice, this list of conditions and the following disclaimer.</span>
+<a name="l00010"></a>00010 <span class="comment"> * 2. Redistributions in binary form must reproduce the above</span>
+<a name="l00011"></a>00011 <span class="comment"> *    copyright notice, this list of conditions and the following</span>
+<a name="l00012"></a>00012 <span class="comment"> *    disclaimer in the documentation and/or other materials provided</span>
+<a name="l00013"></a>00013 <span class="comment"> *    with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> * 3. The name of the author may not be used to endorse or promote</span>
+<a name="l00015"></a>00015 <span class="comment"> *    products derived from this software without specific prior</span>
+<a name="l00016"></a>00016 <span class="comment"> *    written permission.</span>
+<a name="l00017"></a>00017 <span class="comment"> *</span>
+<a name="l00018"></a>00018 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS</span>
+<a name="l00019"></a>00019 <span class="comment"> * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00020"></a>00020 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span>
+<a name="l00021"></a>00021 <span class="comment"> * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY</span>
+<a name="l00022"></a>00022 <span class="comment"> * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</span>
+<a name="l00023"></a>00023 <span class="comment"> * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE</span>
+<a name="l00024"></a>00024 <span class="comment"> * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span>
+<a name="l00025"></a>00025 <span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,</span>
+<a name="l00026"></a>00026 <span class="comment"> * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING</span>
+<a name="l00027"></a>00027 <span class="comment"> * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> *</span>
+<a name="l00030"></a>00030 <span class="comment"> * This file is part of the uIP TCP/IP stack</span>
+<a name="l00031"></a>00031 <span class="comment"> *</span>
+<a name="l00032"></a>00032 <span class="comment"> * $Id: telnetd.h,v 1.2 2006/06/07 09:43:54 adam Exp $</span>
+<a name="l00033"></a>00033 <span class="comment"> *</span>
+<a name="l00034"></a>00034 <span class="comment"> */</span>
+<a name="l00035"></a>00035 <span class="preprocessor">#ifndef __TELNETD_H__</span>
+<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#define __TELNETD_H__</span>
+<a name="l00037"></a>00037 <span class="preprocessor"></span>
+<a name="l00038"></a>00038 <span class="preprocessor">#include "<a class="code" href="a00140.html">uipopt.h</a>"</span>
+<a name="l00039"></a>00039 
+<a name="l00040"></a>00040 <span class="keywordtype">void</span> telnetd_appcall(<span class="keywordtype">void</span>);
+<a name="l00041"></a>00041 
+<a name="l00042"></a>00042 <span class="preprocessor">#ifndef TELNETD_CONF_LINELEN</span>
+<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#define TELNETD_CONF_LINELEN 40</span>
+<a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#ifndef TELNETD_CONF_NUMLINES</span>
+<a name="l00046"></a>00046 <span class="preprocessor"></span><span class="preprocessor">#define TELNETD_CONF_NUMLINES 16</span>
+<a name="l00047"></a>00047 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00048"></a>00048 <span class="preprocessor"></span>
+<a name="l00049"></a>00049 <span class="keyword">struct </span><a name="_a242"></a><a class="code" href="a00086.html">telnetd_state</a> {
+<a name="l00050"></a>00050   <span class="keywordtype">char</span> *<a name="a243"></a><a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[TELNETD_CONF_NUMLINES];
+<a name="l00051"></a>00051   <span class="keywordtype">char</span> <a name="a244"></a><a class="code" href="a00086.html#54a466311575a727830a92a6c3621cb2">buf</a>[TELNETD_CONF_LINELEN];
+<a name="l00052"></a>00052   <span class="keywordtype">char</span> bufptr;
+<a name="l00053"></a>00053   <a name="a245"></a><a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> <a name="a246"></a><a class="code" href="a00086.html#d85fc90c30d1fc37c63c4844be5fe09d">numsent</a>;
+<a name="l00054"></a>00054   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> <a name="a247"></a><a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a>;
+<a name="l00055"></a>00055 };
+<a name="l00056"></a>00056 
+<a name="l00057"></a>00057 <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="a00086.html">telnetd_state</a> <a name="a248"></a><a class="code" href="a00153.html#g69646a81a922033c5281445a71f8ffed">uip_tcp_appstate_t</a>;
+<a name="l00058"></a>00058 
+<a name="l00059"></a>00059 <span class="preprocessor">#ifndef UIP_APPCALL</span>
+<a name="l00060"></a>00060 <span class="preprocessor"></span><span class="preprocessor">#define UIP_APPCALL     telnetd_appcall</span>
+<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00062"></a>00062 <span class="preprocessor"></span>
+<a name="l00063"></a>00063 <span class="preprocessor">#endif </span><span class="comment">/* __TELNETD_H__ */</span>
+</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 484 - 0
components/net/uip/doc/html/a00046.html

@@ -0,0 +1,484 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: resolv.c</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<h1>resolv.c</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/**</span>
+<a name="l00002"></a>00002 <span class="comment"> * \addtogroup apps</span>
+<a name="l00003"></a>00003 <span class="comment"> * @{</span>
+<a name="l00004"></a>00004 <span class="comment"> */</span>
+<a name="l00005"></a>00005 <span class="comment"></span>
+<a name="l00006"></a>00006 <span class="comment">/**</span>
+<a name="l00007"></a>00007 <span class="comment"> * \defgroup resolv DNS resolver</span>
+<a name="l00008"></a>00008 <span class="comment"> * @{</span>
+<a name="l00009"></a>00009 <span class="comment"> *</span>
+<a name="l00010"></a>00010 <span class="comment"> * The uIP DNS resolver functions are used to lookup a hostname and</span>
+<a name="l00011"></a>00011 <span class="comment"> * map it to a numerical IP address. It maintains a list of resolved</span>
+<a name="l00012"></a>00012 <span class="comment"> * hostnames that can be queried with the resolv_lookup()</span>
+<a name="l00013"></a>00013 <span class="comment"> * function. New hostnames can be resolved using the resolv_query()</span>
+<a name="l00014"></a>00014 <span class="comment"> * function.</span>
+<a name="l00015"></a>00015 <span class="comment"> *</span>
+<a name="l00016"></a>00016 <span class="comment"> * When a hostname has been resolved (or found to be non-existant),</span>
+<a name="l00017"></a>00017 <span class="comment"> * the resolver code calls a callback function called resolv_found()</span>
+<a name="l00018"></a>00018 <span class="comment"> * that must be implemented by the module that uses the resolver.</span>
+<a name="l00019"></a>00019 <span class="comment"> */</span>
+<a name="l00020"></a>00020 <span class="comment"></span>
+<a name="l00021"></a>00021 <span class="comment">/**</span>
+<a name="l00022"></a>00022 <span class="comment"> * \file</span>
+<a name="l00023"></a>00023 <span class="comment"> * DNS host name to IP address resolver.</span>
+<a name="l00024"></a>00024 <span class="comment"> * \author Adam Dunkels &lt;adam@dunkels.com&gt;</span>
+<a name="l00025"></a>00025 <span class="comment"> *</span>
+<a name="l00026"></a>00026 <span class="comment"> * This file implements a DNS host name to IP address resolver.</span>
+<a name="l00027"></a>00027 <span class="comment"> */</span>
+<a name="l00028"></a>00028 
+<a name="l00029"></a>00029 <span class="comment">/*</span>
+<a name="l00030"></a>00030 <span class="comment"> * Copyright (c) 2002-2003, Adam Dunkels.</span>
+<a name="l00031"></a>00031 <span class="comment"> * All rights reserved.</span>
+<a name="l00032"></a>00032 <span class="comment"> *</span>
+<a name="l00033"></a>00033 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00034"></a>00034 <span class="comment"> * modification, are permitted provided that the following conditions</span>
+<a name="l00035"></a>00035 <span class="comment"> * are met:</span>
+<a name="l00036"></a>00036 <span class="comment"> * 1. Redistributions of source code must retain the above copyright</span>
+<a name="l00037"></a>00037 <span class="comment"> *    notice, this list of conditions and the following disclaimer.</span>
+<a name="l00038"></a>00038 <span class="comment"> * 2. Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00039"></a>00039 <span class="comment"> *    notice, this list of conditions and the following disclaimer in the</span>
+<a name="l00040"></a>00040 <span class="comment"> *    documentation and/or other materials provided with the distribution.</span>
+<a name="l00041"></a>00041 <span class="comment"> * 3. The name of the author may not be used to endorse or promote</span>
+<a name="l00042"></a>00042 <span class="comment"> *    products derived from this software without specific prior</span>
+<a name="l00043"></a>00043 <span class="comment"> *    written permission.</span>
+<a name="l00044"></a>00044 <span class="comment"> *</span>
+<a name="l00045"></a>00045 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS</span>
+<a name="l00046"></a>00046 <span class="comment"> * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00047"></a>00047 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span>
+<a name="l00048"></a>00048 <span class="comment"> * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY</span>
+<a name="l00049"></a>00049 <span class="comment"> * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</span>
+<a name="l00050"></a>00050 <span class="comment"> * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE</span>
+<a name="l00051"></a>00051 <span class="comment"> * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span>
+<a name="l00052"></a>00052 <span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,</span>
+<a name="l00053"></a>00053 <span class="comment"> * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING</span>
+<a name="l00054"></a>00054 <span class="comment"> * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00055"></a>00055 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00056"></a>00056 <span class="comment"> *</span>
+<a name="l00057"></a>00057 <span class="comment"> * This file is part of the uIP TCP/IP stack.</span>
+<a name="l00058"></a>00058 <span class="comment"> *</span>
+<a name="l00059"></a>00059 <span class="comment"> * $Id: resolv.c,v 1.5 2006/06/11 21:46:37 adam Exp $</span>
+<a name="l00060"></a>00060 <span class="comment"> *</span>
+<a name="l00061"></a>00061 <span class="comment"> */</span>
+<a name="l00062"></a>00062 
+<a name="l00063"></a>00063 <span class="preprocessor">#include "<a class="code" href="a00103.html">resolv.h</a>"</span>
+<a name="l00064"></a>00064 <span class="preprocessor">#include "<a class="code" href="a00136.html">uip.h</a>"</span>
+<a name="l00065"></a>00065 
+<a name="l00066"></a>00066 <span class="preprocessor">#include &lt;string.h&gt;</span>
+<a name="l00067"></a>00067 
+<a name="l00068"></a>00068 <span class="preprocessor">#ifndef NULL</span>
+<a name="l00069"></a>00069 <span class="preprocessor"></span><span class="preprocessor">#define NULL (void *)0</span>
+<a name="l00070"></a>00070 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* NULL */</span>
+<a name="l00071"></a>00071 <span class="comment"></span>
+<a name="l00072"></a>00072 <span class="comment">/** \internal The maximum number of retries when asking for a name. */</span>
+<a name="l00073"></a>00073 <span class="preprocessor">#define MAX_RETRIES 8</span>
+<a name="l00074"></a>00074 <span class="preprocessor"></span><span class="comment"></span>
+<a name="l00075"></a>00075 <span class="comment">/** \internal The DNS message header. */</span>
+<a name="l00076"></a>00076 <span class="keyword">struct </span>dns_hdr {
+<a name="l00077"></a>00077   <a name="a125"></a><a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> id;
+<a name="l00078"></a>00078   <a name="a126"></a><a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> flags1, flags2;
+<a name="l00079"></a>00079 <span class="preprocessor">#define DNS_FLAG1_RESPONSE        0x80</span>
+<a name="l00080"></a>00080 <span class="preprocessor"></span><span class="preprocessor">#define DNS_FLAG1_OPCODE_STATUS   0x10</span>
+<a name="l00081"></a>00081 <span class="preprocessor"></span><span class="preprocessor">#define DNS_FLAG1_OPCODE_INVERSE  0x08</span>
+<a name="l00082"></a>00082 <span class="preprocessor"></span><span class="preprocessor">#define DNS_FLAG1_OPCODE_STANDARD 0x00</span>
+<a name="l00083"></a>00083 <span class="preprocessor"></span><span class="preprocessor">#define DNS_FLAG1_AUTHORATIVE     0x04</span>
+<a name="l00084"></a>00084 <span class="preprocessor"></span><span class="preprocessor">#define DNS_FLAG1_TRUNC           0x02</span>
+<a name="l00085"></a>00085 <span class="preprocessor"></span><span class="preprocessor">#define DNS_FLAG1_RD              0x01</span>
+<a name="l00086"></a>00086 <span class="preprocessor"></span><span class="preprocessor">#define DNS_FLAG2_RA              0x80</span>
+<a name="l00087"></a>00087 <span class="preprocessor"></span><span class="preprocessor">#define DNS_FLAG2_ERR_MASK        0x0f</span>
+<a name="l00088"></a>00088 <span class="preprocessor"></span><span class="preprocessor">#define DNS_FLAG2_ERR_NONE        0x00</span>
+<a name="l00089"></a>00089 <span class="preprocessor"></span><span class="preprocessor">#define DNS_FLAG2_ERR_NAME        0x03</span>
+<a name="l00090"></a>00090 <span class="preprocessor"></span>  <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> numquestions;
+<a name="l00091"></a>00091   <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> numanswers;
+<a name="l00092"></a>00092   <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> numauthrr;
+<a name="l00093"></a>00093   <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> numextrarr;
+<a name="l00094"></a>00094 };
+<a name="l00095"></a>00095 <span class="comment"></span>
+<a name="l00096"></a>00096 <span class="comment">/** \internal The DNS answer message structure. */</span>
+<a name="l00097"></a>00097 <span class="keyword">struct </span>dns_answer {
+<a name="l00098"></a>00098   <span class="comment">/* DNS answer record starts with either a domain name or a pointer</span>
+<a name="l00099"></a>00099 <span class="comment">     to a name already present somewhere in the packet. */</span>
+<a name="l00100"></a>00100   <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> type;
+<a name="l00101"></a>00101   <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> <span class="keyword">class</span>;
+<a name="l00102"></a>00102   <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> ttl[2];
+<a name="l00103"></a>00103   <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> len;
+<a name="l00104"></a>00104   <a name="a127"></a><a class="code" href="a00150.html#g1ef35301f43a5bbb9f89f07b5a36b9a0">uip_ipaddr_t</a> ipaddr;
+<a name="l00105"></a>00105 };
+<a name="l00106"></a>00106 
+<a name="l00107"></a>00107 <span class="keyword">struct </span>namemap {
+<a name="l00108"></a>00108 <span class="preprocessor">#define STATE_UNUSED 0</span>
+<a name="l00109"></a>00109 <span class="preprocessor"></span><span class="preprocessor">#define STATE_NEW    1</span>
+<a name="l00110"></a>00110 <span class="preprocessor"></span><span class="preprocessor">#define STATE_ASKING 2</span>
+<a name="l00111"></a>00111 <span class="preprocessor"></span><span class="preprocessor">#define STATE_DONE   3</span>
+<a name="l00112"></a>00112 <span class="preprocessor"></span><span class="preprocessor">#define STATE_ERROR  4</span>
+<a name="l00113"></a>00113 <span class="preprocessor"></span>  <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> state;
+<a name="l00114"></a>00114   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> tmr;
+<a name="l00115"></a>00115   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> retries;
+<a name="l00116"></a>00116   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> seqno;
+<a name="l00117"></a>00117   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> err;
+<a name="l00118"></a>00118   <span class="keywordtype">char</span> name[32];
+<a name="l00119"></a>00119   <a class="code" href="a00150.html#g1ef35301f43a5bbb9f89f07b5a36b9a0">uip_ipaddr_t</a> ipaddr;
+<a name="l00120"></a>00120 };
+<a name="l00121"></a>00121 
+<a name="l00122"></a>00122 <span class="preprocessor">#ifndef UIP_CONF_RESOLV_ENTRIES</span>
+<a name="l00123"></a>00123 <span class="preprocessor"></span><span class="preprocessor">#define RESOLV_ENTRIES 4</span>
+<a name="l00124"></a>00124 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* UIP_CONF_RESOLV_ENTRIES */</span>
+<a name="l00125"></a>00125 <span class="preprocessor">#define RESOLV_ENTRIES UIP_CONF_RESOLV_ENTRIES</span>
+<a name="l00126"></a>00126 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* UIP_CONF_RESOLV_ENTRIES */</span>
+<a name="l00127"></a>00127 
+<a name="l00128"></a>00128 
+<a name="l00129"></a>00129 <span class="keyword">static</span> <span class="keyword">struct </span>namemap names[<a name="a128"></a><a class="code" href="a00160.html#g221d37ccde7e3fd0dd2c2eb0a6b15493">RESOLV_ENTRIES</a>];
+<a name="l00130"></a>00130 
+<a name="l00131"></a>00131 <span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> seqno;
+<a name="l00132"></a>00132 
+<a name="l00133"></a>00133 <span class="keyword">static</span> <span class="keyword">struct </span><a name="_a129"></a><a class="code" href="a00095.html">uip_udp_conn</a> *resolv_conn = <a name="a130"></a><a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
+<a name="l00134"></a>00134 
+<a name="l00135"></a>00135 
+<a name="l00136"></a>00136 <span class="comment">/*---------------------------------------------------------------------------*/</span><span class="comment"></span>
+<a name="l00137"></a>00137 <span class="comment">/** \internal</span>
+<a name="l00138"></a>00138 <span class="comment"> * Walk through a compact encoded DNS name and return the end of it.</span>
+<a name="l00139"></a>00139 <span class="comment"> *</span>
+<a name="l00140"></a>00140 <span class="comment"> * \return The end of the name.</span>
+<a name="l00141"></a>00141 <span class="comment"> */</span>
+<a name="l00142"></a>00142 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00143"></a>00143 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *
+<a name="l00144"></a>00144 parse_name(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *query)
+<a name="l00145"></a>00145 {
+<a name="l00146"></a>00146   <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> n;
+<a name="l00147"></a>00147 
+<a name="l00148"></a>00148   <span class="keywordflow">do</span> {
+<a name="l00149"></a>00149     n = *query++;
+<a name="l00150"></a>00150     
+<a name="l00151"></a>00151     <span class="keywordflow">while</span>(n &gt; 0) {
+<a name="l00152"></a>00152       <span class="comment">/*      printf("%c", *query);*/</span>
+<a name="l00153"></a>00153       ++query;
+<a name="l00154"></a>00154       --n;
+<a name="l00155"></a>00155     };
+<a name="l00156"></a>00156     <span class="comment">/*    printf(".");*/</span>
+<a name="l00157"></a>00157   } <span class="keywordflow">while</span>(*query != 0);
+<a name="l00158"></a>00158   <span class="comment">/*  printf("\n");*/</span>
+<a name="l00159"></a>00159   <span class="keywordflow">return</span> query + 1;
+<a name="l00160"></a>00160 }
+<a name="l00161"></a>00161 <span class="comment">/*---------------------------------------------------------------------------*/</span><span class="comment"></span>
+<a name="l00162"></a>00162 <span class="comment">/** \internal</span>
+<a name="l00163"></a>00163 <span class="comment"> * Runs through the list of names to see if there are any that have</span>
+<a name="l00164"></a>00164 <span class="comment"> * not yet been queried and, if so, sends out a query.</span>
+<a name="l00165"></a>00165 <span class="comment"> */</span>
+<a name="l00166"></a>00166 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00167"></a>00167 <span class="keyword">static</span> <span class="keywordtype">void</span>
+<a name="l00168"></a>00168 check_entries(<span class="keywordtype">void</span>)
+<a name="l00169"></a>00169 {
+<a name="l00170"></a>00170   <span class="keyword">register</span> <span class="keyword">struct </span>dns_hdr *hdr;
+<a name="l00171"></a>00171   <span class="keywordtype">char</span> *query, *nptr, *nameptr;
+<a name="l00172"></a>00172   <span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> i;
+<a name="l00173"></a>00173   <span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> n;
+<a name="l00174"></a>00174   <span class="keyword">register</span> <span class="keyword">struct </span>namemap *namemapptr;
+<a name="l00175"></a>00175   
+<a name="l00176"></a>00176   <span class="keywordflow">for</span>(i = 0; i &lt; <a class="code" href="a00160.html#g221d37ccde7e3fd0dd2c2eb0a6b15493">RESOLV_ENTRIES</a>; ++i) {
+<a name="l00177"></a>00177     namemapptr = &amp;names[i];
+<a name="l00178"></a>00178     <span class="keywordflow">if</span>(namemapptr-&gt;state == <a name="a131"></a><a class="code" href="a00102.html#bf4401501f1389872141a78b63f325a3">STATE_NEW</a> ||
+<a name="l00179"></a>00179        namemapptr-&gt;state == <a name="a132"></a><a class="code" href="a00102.html#55735650f879293d9b7b5fda6753d147">STATE_ASKING</a>) {
+<a name="l00180"></a>00180       <span class="keywordflow">if</span>(namemapptr-&gt;state == <a class="code" href="a00102.html#55735650f879293d9b7b5fda6753d147">STATE_ASKING</a>) {
+<a name="l00181"></a>00181         <span class="keywordflow">if</span>(--namemapptr-&gt;tmr == 0) {
+<a name="l00182"></a>00182           <span class="keywordflow">if</span>(++namemapptr-&gt;retries == <a name="a133"></a><a class="code" href="a00160.html#gecf13b8dc783db2202ca5c34fe117fc3">MAX_RETRIES</a>) {
+<a name="l00183"></a>00183             namemapptr-&gt;state = <a name="a134"></a><a class="code" href="a00102.html#7bf0c086c7c41c12cc63324327932d91">STATE_ERROR</a>;
+<a name="l00184"></a>00184             <a name="a135"></a><a class="code" href="a00160.html#g6d9751d534453425c7a5a215d1d4414c">resolv_found</a>(namemapptr-&gt;name, <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>);
+<a name="l00185"></a>00185             <span class="keywordflow">continue</span>;
+<a name="l00186"></a>00186           }
+<a name="l00187"></a>00187           namemapptr-&gt;tmr = namemapptr-&gt;retries;
+<a name="l00188"></a>00188         } <span class="keywordflow">else</span> {
+<a name="l00189"></a>00189           <span class="comment">/*      printf("Timer %d\n", namemapptr-&gt;tmr);*/</span>
+<a name="l00190"></a>00190           <span class="comment">/* Its timer has not run out, so we move on to next</span>
+<a name="l00191"></a>00191 <span class="comment">             entry. */</span>
+<a name="l00192"></a>00192           <span class="keywordflow">continue</span>;
+<a name="l00193"></a>00193         }
+<a name="l00194"></a>00194       } <span class="keywordflow">else</span> {
+<a name="l00195"></a>00195         namemapptr-&gt;state = <a class="code" href="a00102.html#55735650f879293d9b7b5fda6753d147">STATE_ASKING</a>;
+<a name="l00196"></a>00196         namemapptr-&gt;tmr = 1;
+<a name="l00197"></a>00197         namemapptr-&gt;retries = 0;
+<a name="l00198"></a>00198       }
+<a name="l00199"></a>00199       hdr = (<span class="keyword">struct </span>dns_hdr *)<a name="a136"></a><a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>;
+<a name="l00200"></a>00200       memset(hdr, 0, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> dns_hdr));
+<a name="l00201"></a>00201       hdr-&gt;id = <a name="a137"></a><a class="code" href="a00148.html#ga22b04cac8cf283ca12f028578bebc06">htons</a>(i);
+<a name="l00202"></a>00202       hdr-&gt;flags1 = <a name="a138"></a><a class="code" href="a00102.html#72d99b1623afa14bd58c667b748c2ddc">DNS_FLAG1_RD</a>;
+<a name="l00203"></a>00203       hdr-&gt;numquestions = <a name="a139"></a><a class="code" href="a00148.html#g69a7a4951ff21b302267532c21ee78fc">HTONS</a>(1);
+<a name="l00204"></a>00204       query = (<span class="keywordtype">char</span> *)<a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a> + 12;
+<a name="l00205"></a>00205       nameptr = namemapptr-&gt;name;
+<a name="l00206"></a>00206       --nameptr;
+<a name="l00207"></a>00207       <span class="comment">/* Convert hostname into suitable query format. */</span>
+<a name="l00208"></a>00208       <span class="keywordflow">do</span> {
+<a name="l00209"></a>00209         ++nameptr;
+<a name="l00210"></a>00210         nptr = query;
+<a name="l00211"></a>00211         ++query;
+<a name="l00212"></a>00212         <span class="keywordflow">for</span>(n = 0; *nameptr != <span class="charliteral">'.'</span> &amp;&amp; *nameptr != 0; ++nameptr) {
+<a name="l00213"></a>00213           *query = *nameptr;
+<a name="l00214"></a>00214           ++query;
+<a name="l00215"></a>00215           ++n;
+<a name="l00216"></a>00216         }
+<a name="l00217"></a>00217         *nptr = n;
+<a name="l00218"></a>00218       } <span class="keywordflow">while</span>(*nameptr != 0);
+<a name="l00219"></a>00219       {
+<a name="l00220"></a>00220         <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> endquery[] =
+<a name="l00221"></a>00221           {0,0,1,0,1};
+<a name="l00222"></a>00222         memcpy(query, endquery, 5);
+<a name="l00223"></a>00223       }
+<a name="l00224"></a>00224       <a name="a140"></a><a class="code" href="a00147.html#ge5ab69d40013e6cf86ef1763c95d920e">uip_udp_send</a>((<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)(query + 5 - (<span class="keywordtype">char</span> *)<a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>));
+<a name="l00225"></a>00225       <span class="keywordflow">break</span>;
+<a name="l00226"></a>00226     }
+<a name="l00227"></a>00227   }
+<a name="l00228"></a>00228 }
+<a name="l00229"></a>00229 <span class="comment">/*---------------------------------------------------------------------------*/</span><span class="comment"></span>
+<a name="l00230"></a>00230 <span class="comment">/** \internal</span>
+<a name="l00231"></a>00231 <span class="comment"> * Called when new UDP data arrives.</span>
+<a name="l00232"></a>00232 <span class="comment"> */</span>
+<a name="l00233"></a>00233 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00234"></a>00234 <span class="keyword">static</span> <span class="keywordtype">void</span>
+<a name="l00235"></a>00235 newdata(<span class="keywordtype">void</span>)
+<a name="l00236"></a>00236 {
+<a name="l00237"></a>00237   <span class="keywordtype">char</span> *nameptr;
+<a name="l00238"></a>00238   <span class="keyword">struct </span>dns_answer *ans;
+<a name="l00239"></a>00239   <span class="keyword">struct </span>dns_hdr *hdr;
+<a name="l00240"></a>00240   <span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> nquestions, nanswers;
+<a name="l00241"></a>00241   <span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> i;
+<a name="l00242"></a>00242   <span class="keyword">register</span> <span class="keyword">struct </span>namemap *namemapptr;
+<a name="l00243"></a>00243   
+<a name="l00244"></a>00244   hdr = (<span class="keyword">struct </span>dns_hdr *)<a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>;
+<a name="l00245"></a>00245   <span class="comment">/*  printf("ID %d\n", htons(hdr-&gt;id));</span>
+<a name="l00246"></a>00246 <span class="comment">      printf("Query %d\n", hdr-&gt;flags1 &amp; DNS_FLAG1_RESPONSE);</span>
+<a name="l00247"></a>00247 <span class="comment">      printf("Error %d\n", hdr-&gt;flags2 &amp; DNS_FLAG2_ERR_MASK);</span>
+<a name="l00248"></a>00248 <span class="comment">      printf("Num questions %d, answers %d, authrr %d, extrarr %d\n",</span>
+<a name="l00249"></a>00249 <span class="comment">      htons(hdr-&gt;numquestions),</span>
+<a name="l00250"></a>00250 <span class="comment">      htons(hdr-&gt;numanswers),</span>
+<a name="l00251"></a>00251 <span class="comment">      htons(hdr-&gt;numauthrr),</span>
+<a name="l00252"></a>00252 <span class="comment">      htons(hdr-&gt;numextrarr));</span>
+<a name="l00253"></a>00253 <span class="comment">  */</span>
+<a name="l00254"></a>00254 
+<a name="l00255"></a>00255   <span class="comment">/* The ID in the DNS header should be our entry into the name</span>
+<a name="l00256"></a>00256 <span class="comment">     table. */</span>
+<a name="l00257"></a>00257   i = <a class="code" href="a00148.html#ga22b04cac8cf283ca12f028578bebc06">htons</a>(hdr-&gt;id);
+<a name="l00258"></a>00258   namemapptr = &amp;names[i];
+<a name="l00259"></a>00259   <span class="keywordflow">if</span>(i &lt; <a class="code" href="a00160.html#g221d37ccde7e3fd0dd2c2eb0a6b15493">RESOLV_ENTRIES</a> &amp;&amp;
+<a name="l00260"></a>00260      namemapptr-&gt;state == <a class="code" href="a00102.html#55735650f879293d9b7b5fda6753d147">STATE_ASKING</a>) {
+<a name="l00261"></a>00261 
+<a name="l00262"></a>00262     <span class="comment">/* This entry is now finished. */</span>
+<a name="l00263"></a>00263     namemapptr-&gt;state = <a name="a141"></a><a class="code" href="a00102.html#876c82c946543cd70c141e41417138e0">STATE_DONE</a>;
+<a name="l00264"></a>00264     namemapptr-&gt;err = hdr-&gt;flags2 &amp; <a name="a142"></a><a class="code" href="a00102.html#9f6c329c04baba17fe0f5b2a6597d713">DNS_FLAG2_ERR_MASK</a>;
+<a name="l00265"></a>00265 
+<a name="l00266"></a>00266     <span class="comment">/* Check for error. If so, call callback to inform. */</span>
+<a name="l00267"></a>00267     <span class="keywordflow">if</span>(namemapptr-&gt;err != 0) {
+<a name="l00268"></a>00268       namemapptr-&gt;state = <a class="code" href="a00102.html#7bf0c086c7c41c12cc63324327932d91">STATE_ERROR</a>;
+<a name="l00269"></a>00269       <a class="code" href="a00160.html#g6d9751d534453425c7a5a215d1d4414c">resolv_found</a>(namemapptr-&gt;name, <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>);
+<a name="l00270"></a>00270       <span class="keywordflow">return</span>;
+<a name="l00271"></a>00271     }
+<a name="l00272"></a>00272 
+<a name="l00273"></a>00273     <span class="comment">/* We only care about the question(s) and the answers. The authrr</span>
+<a name="l00274"></a>00274 <span class="comment">       and the extrarr are simply discarded. */</span>
+<a name="l00275"></a>00275     nquestions = <a class="code" href="a00148.html#ga22b04cac8cf283ca12f028578bebc06">htons</a>(hdr-&gt;numquestions);
+<a name="l00276"></a>00276     nanswers = <a class="code" href="a00148.html#ga22b04cac8cf283ca12f028578bebc06">htons</a>(hdr-&gt;numanswers);
+<a name="l00277"></a>00277 
+<a name="l00278"></a>00278     <span class="comment">/* Skip the name in the question. XXX: This should really be</span>
+<a name="l00279"></a>00279 <span class="comment">       checked agains the name in the question, to be sure that they</span>
+<a name="l00280"></a>00280 <span class="comment">       match. */</span>
+<a name="l00281"></a>00281     nameptr = parse_name((<span class="keywordtype">char</span> *)<a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a> + 12) + 4;
+<a name="l00282"></a>00282 
+<a name="l00283"></a>00283     <span class="keywordflow">while</span>(nanswers &gt; 0) {
+<a name="l00284"></a>00284       <span class="comment">/* The first byte in the answer resource record determines if it</span>
+<a name="l00285"></a>00285 <span class="comment">         is a compressed record or a normal one. */</span>
+<a name="l00286"></a>00286       <span class="keywordflow">if</span>(*nameptr &amp; 0xc0) {
+<a name="l00287"></a>00287         <span class="comment">/* Compressed name. */</span>
+<a name="l00288"></a>00288         nameptr +=2;
+<a name="l00289"></a>00289         <span class="comment">/*      printf("Compressed anwser\n");*/</span>
+<a name="l00290"></a>00290       } <span class="keywordflow">else</span> {
+<a name="l00291"></a>00291         <span class="comment">/* Not compressed name. */</span>
+<a name="l00292"></a>00292         nameptr = parse_name((<span class="keywordtype">char</span> *)nameptr);
+<a name="l00293"></a>00293       }
+<a name="l00294"></a>00294 
+<a name="l00295"></a>00295       ans = (<span class="keyword">struct </span>dns_answer *)nameptr;
+<a name="l00296"></a>00296       <span class="comment">/*      printf("Answer: type %x, class %x, ttl %x, length %x\n",</span>
+<a name="l00297"></a>00297 <span class="comment">             htons(ans-&gt;type), htons(ans-&gt;class), (htons(ans-&gt;ttl[0])</span>
+<a name="l00298"></a>00298 <span class="comment">             &lt;&lt; 16) | htons(ans-&gt;ttl[1]), htons(ans-&gt;len));*/</span>
+<a name="l00299"></a>00299 
+<a name="l00300"></a>00300       <span class="comment">/* Check for IP address type and Internet class. Others are</span>
+<a name="l00301"></a>00301 <span class="comment">         discarded. */</span>
+<a name="l00302"></a>00302       <span class="keywordflow">if</span>(ans-&gt;type == <a class="code" href="a00148.html#g69a7a4951ff21b302267532c21ee78fc">HTONS</a>(1) &amp;&amp;
+<a name="l00303"></a>00303          ans-&gt;class == <a class="code" href="a00148.html#g69a7a4951ff21b302267532c21ee78fc">HTONS</a>(1) &amp;&amp;
+<a name="l00304"></a>00304          ans-&gt;len == <a class="code" href="a00148.html#g69a7a4951ff21b302267532c21ee78fc">HTONS</a>(4)) {
+<a name="l00305"></a>00305         <span class="comment">/*      printf("IP address %d.%d.%d.%d\n",</span>
+<a name="l00306"></a>00306 <span class="comment">               htons(ans-&gt;ipaddr[0]) &gt;&gt; 8,</span>
+<a name="l00307"></a>00307 <span class="comment">               htons(ans-&gt;ipaddr[0]) &amp; 0xff,</span>
+<a name="l00308"></a>00308 <span class="comment">               htons(ans-&gt;ipaddr[1]) &gt;&gt; 8,</span>
+<a name="l00309"></a>00309 <span class="comment">               htons(ans-&gt;ipaddr[1]) &amp; 0xff);*/</span>
+<a name="l00310"></a>00310         <span class="comment">/* XXX: we should really check that this IP address is the one</span>
+<a name="l00311"></a>00311 <span class="comment">           we want. */</span>
+<a name="l00312"></a>00312         namemapptr-&gt;ipaddr[0] = ans-&gt;ipaddr[0];
+<a name="l00313"></a>00313         namemapptr-&gt;ipaddr[1] = ans-&gt;ipaddr[1];
+<a name="l00314"></a>00314         
+<a name="l00315"></a>00315         <a class="code" href="a00160.html#g6d9751d534453425c7a5a215d1d4414c">resolv_found</a>(namemapptr-&gt;name, namemapptr-&gt;ipaddr);
+<a name="l00316"></a>00316         <span class="keywordflow">return</span>;
+<a name="l00317"></a>00317       } <span class="keywordflow">else</span> {
+<a name="l00318"></a>00318         nameptr = nameptr + 10 + <a class="code" href="a00148.html#ga22b04cac8cf283ca12f028578bebc06">htons</a>(ans-&gt;len);
+<a name="l00319"></a>00319       }
+<a name="l00320"></a>00320       --nanswers;
+<a name="l00321"></a>00321     }
+<a name="l00322"></a>00322   }
+<a name="l00323"></a>00323 
+<a name="l00324"></a>00324 }
+<a name="l00325"></a>00325 <span class="comment">/*---------------------------------------------------------------------------*/</span><span class="comment"></span>
+<a name="l00326"></a>00326 <span class="comment">/** \internal</span>
+<a name="l00327"></a>00327 <span class="comment"> * The main UDP function.</span>
+<a name="l00328"></a>00328 <span class="comment"> */</span>
+<a name="l00329"></a>00329 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00330"></a>00330 <span class="keywordtype">void</span>
+<a name="l00331"></a>00331 <a name="a143"></a><a class="code" href="a00160.html#g7c5359305008e9183b18d6ab75f568bf">resolv_appcall</a>(<span class="keywordtype">void</span>)
+<a name="l00332"></a>00332 {
+<a name="l00333"></a>00333   <span class="keywordflow">if</span>(<a class="code" href="a00095.html">uip_udp_conn</a>-&gt;rport == <a class="code" href="a00148.html#g69a7a4951ff21b302267532c21ee78fc">HTONS</a>(53)) {
+<a name="l00334"></a>00334     <span class="keywordflow">if</span>(<a name="a144"></a><a class="code" href="a00147.html#g58bb90796c1cdad3aac2ecf44d87b20e">uip_poll</a>()) {
+<a name="l00335"></a>00335       check_entries();
+<a name="l00336"></a>00336     }
+<a name="l00337"></a>00337     <span class="keywordflow">if</span>(<a name="a145"></a><a class="code" href="a00147.html#g26a14b8dae3f861830af9e7cf1e03725">uip_newdata</a>()) {
+<a name="l00338"></a>00338       newdata();
+<a name="l00339"></a>00339     }
+<a name="l00340"></a>00340   }
+<a name="l00341"></a>00341 }
+<a name="l00342"></a>00342 <span class="comment">/*---------------------------------------------------------------------------*/</span><span class="comment"></span>
+<a name="l00343"></a>00343 <span class="comment">/**</span>
+<a name="l00344"></a>00344 <span class="comment"> * Queues a name so that a question for the name will be sent out.</span>
+<a name="l00345"></a>00345 <span class="comment"> *</span>
+<a name="l00346"></a>00346 <span class="comment"> * \param name The hostname that is to be queried.</span>
+<a name="l00347"></a>00347 <span class="comment"> */</span>
+<a name="l00348"></a>00348 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00349"></a>00349 <span class="keywordtype">void</span>
+<a name="l00350"></a>00350 <a name="a146"></a><a class="code" href="a00160.html#ge4dcbbe6c641d2e3b8537b479df5fc99">resolv_query</a>(<span class="keywordtype">char</span> *name)
+<a name="l00351"></a>00351 {
+<a name="l00352"></a>00352   <span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> i;
+<a name="l00353"></a>00353   <span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> lseq, lseqi;
+<a name="l00354"></a>00354   <span class="keyword">register</span> <span class="keyword">struct </span>namemap *nameptr;
+<a name="l00355"></a>00355       
+<a name="l00356"></a>00356   lseq = lseqi = 0;
+<a name="l00357"></a>00357   
+<a name="l00358"></a>00358   <span class="keywordflow">for</span>(i = 0; i &lt; <a class="code" href="a00160.html#g221d37ccde7e3fd0dd2c2eb0a6b15493">RESOLV_ENTRIES</a>; ++i) {
+<a name="l00359"></a>00359     nameptr = &amp;names[i];
+<a name="l00360"></a>00360     <span class="keywordflow">if</span>(nameptr-&gt;state == <a name="a147"></a><a class="code" href="a00102.html#ee60b8757bacab269b0ccd7c240bf01d">STATE_UNUSED</a>) {
+<a name="l00361"></a>00361       <span class="keywordflow">break</span>;
+<a name="l00362"></a>00362     }
+<a name="l00363"></a>00363     <span class="keywordflow">if</span>(seqno - nameptr-&gt;seqno &gt; lseq) {
+<a name="l00364"></a>00364       lseq = seqno - nameptr-&gt;seqno;
+<a name="l00365"></a>00365       lseqi = i;
+<a name="l00366"></a>00366     }
+<a name="l00367"></a>00367   }
+<a name="l00368"></a>00368 
+<a name="l00369"></a>00369   <span class="keywordflow">if</span>(i == <a class="code" href="a00160.html#g221d37ccde7e3fd0dd2c2eb0a6b15493">RESOLV_ENTRIES</a>) {
+<a name="l00370"></a>00370     i = lseqi;
+<a name="l00371"></a>00371     nameptr = &amp;names[i];
+<a name="l00372"></a>00372   }
+<a name="l00373"></a>00373 
+<a name="l00374"></a>00374   <span class="comment">/*  printf("Using entry %d\n", i);*/</span>
+<a name="l00375"></a>00375 
+<a name="l00376"></a>00376   strcpy(nameptr-&gt;name, name);
+<a name="l00377"></a>00377   nameptr-&gt;state = <a class="code" href="a00102.html#bf4401501f1389872141a78b63f325a3">STATE_NEW</a>;
+<a name="l00378"></a>00378   nameptr-&gt;seqno = seqno;
+<a name="l00379"></a>00379   ++seqno;
+<a name="l00380"></a>00380 }
+<a name="l00381"></a>00381 <span class="comment">/*---------------------------------------------------------------------------*/</span><span class="comment"></span>
+<a name="l00382"></a>00382 <span class="comment">/**</span>
+<a name="l00383"></a>00383 <span class="comment"> * Look up a hostname in the array of known hostnames.</span>
+<a name="l00384"></a>00384 <span class="comment"> *</span>
+<a name="l00385"></a>00385 <span class="comment"> * \note This function only looks in the internal array of known</span>
+<a name="l00386"></a>00386 <span class="comment"> * hostnames, it does not send out a query for the hostname if none</span>
+<a name="l00387"></a>00387 <span class="comment"> * was found. The function resolv_query() can be used to send a query</span>
+<a name="l00388"></a>00388 <span class="comment"> * for a hostname.</span>
+<a name="l00389"></a>00389 <span class="comment"> *</span>
+<a name="l00390"></a>00390 <span class="comment"> * \return A pointer to a 4-byte representation of the hostname's IP</span>
+<a name="l00391"></a>00391 <span class="comment"> * address, or NULL if the hostname was not found in the array of</span>
+<a name="l00392"></a>00392 <span class="comment"> * hostnames.</span>
+<a name="l00393"></a>00393 <span class="comment"> */</span>
+<a name="l00394"></a>00394 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00395"></a>00395 <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> *
+<a name="l00396"></a>00396 <a name="a148"></a><a class="code" href="a00160.html#g66d19181ad5fe8b8f7c84d1f1d46a2ec">resolv_lookup</a>(<span class="keywordtype">char</span> *name)
+<a name="l00397"></a>00397 {
+<a name="l00398"></a>00398   <span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> i;
+<a name="l00399"></a>00399   <span class="keyword">struct </span>namemap *nameptr;
+<a name="l00400"></a>00400   
+<a name="l00401"></a>00401   <span class="comment">/* Walk through the list to see if the name is in there. If it is</span>
+<a name="l00402"></a>00402 <span class="comment">     not, we return NULL. */</span>
+<a name="l00403"></a>00403   <span class="keywordflow">for</span>(i = 0; i &lt; <a class="code" href="a00160.html#g221d37ccde7e3fd0dd2c2eb0a6b15493">RESOLV_ENTRIES</a>; ++i) {
+<a name="l00404"></a>00404     nameptr = &amp;names[i];
+<a name="l00405"></a>00405     <span class="keywordflow">if</span>(nameptr-&gt;state == <a class="code" href="a00102.html#876c82c946543cd70c141e41417138e0">STATE_DONE</a> &amp;&amp;
+<a name="l00406"></a>00406        strcmp(name, nameptr-&gt;name) == 0) {
+<a name="l00407"></a>00407       <span class="keywordflow">return</span> nameptr-&gt;ipaddr;
+<a name="l00408"></a>00408     }
+<a name="l00409"></a>00409   }
+<a name="l00410"></a>00410   <span class="keywordflow">return</span> <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
+<a name="l00411"></a>00411 }
+<a name="l00412"></a>00412 <span class="comment">/*---------------------------------------------------------------------------*/</span><span class="comment"></span>
+<a name="l00413"></a>00413 <span class="comment">/**</span>
+<a name="l00414"></a>00414 <span class="comment"> * Obtain the currently configured DNS server.</span>
+<a name="l00415"></a>00415 <span class="comment"> *</span>
+<a name="l00416"></a>00416 <span class="comment"> * \return A pointer to a 4-byte representation of the IP address of</span>
+<a name="l00417"></a>00417 <span class="comment"> * the currently configured DNS server or NULL if no DNS server has</span>
+<a name="l00418"></a>00418 <span class="comment"> * been configured.</span>
+<a name="l00419"></a>00419 <span class="comment"> */</span>
+<a name="l00420"></a>00420 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00421"></a>00421 <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> *
+<a name="l00422"></a>00422 <a name="a149"></a><a class="code" href="a00160.html#g3191066cf8f76bd00b6843b77c37068f">resolv_getserver</a>(<span class="keywordtype">void</span>)
+<a name="l00423"></a>00423 {
+<a name="l00424"></a>00424   <span class="keywordflow">if</span>(resolv_conn == <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) {
+<a name="l00425"></a>00425     <span class="keywordflow">return</span> <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
+<a name="l00426"></a>00426   }
+<a name="l00427"></a>00427   <span class="keywordflow">return</span> resolv_conn-&gt;<a name="a150"></a><a class="code" href="a00095.html#8a661a2d544100b82d0d14a1985083d5">ripaddr</a>;
+<a name="l00428"></a>00428 }
+<a name="l00429"></a>00429 <span class="comment">/*---------------------------------------------------------------------------*/</span><span class="comment"></span>
+<a name="l00430"></a>00430 <span class="comment">/**</span>
+<a name="l00431"></a>00431 <span class="comment"> * Configure which DNS server to use for queries.</span>
+<a name="l00432"></a>00432 <span class="comment"> *</span>
+<a name="l00433"></a>00433 <span class="comment"> * \param dnsserver A pointer to a 4-byte representation of the IP</span>
+<a name="l00434"></a>00434 <span class="comment"> * address of the DNS server to be configured.</span>
+<a name="l00435"></a>00435 <span class="comment"> */</span>
+<a name="l00436"></a>00436 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00437"></a>00437 <span class="keywordtype">void</span>
+<a name="l00438"></a>00438 <a name="a151"></a><a class="code" href="a00160.html#gdf916e0c752f5cda70d0bddb2be422ba">resolv_conf</a>(<a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> *dnsserver)
+<a name="l00439"></a>00439 {
+<a name="l00440"></a>00440   <span class="keywordflow">if</span>(resolv_conn != <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) {
+<a name="l00441"></a>00441     <a name="a152"></a><a class="code" href="a00147.html#gf2dbaceb10c67783a115075b5b6d66df">uip_udp_remove</a>(resolv_conn);
+<a name="l00442"></a>00442   }
+<a name="l00443"></a>00443   
+<a name="l00444"></a>00444   resolv_conn = <a name="a153"></a><a class="code" href="a00147.html#g79c4110211247df3fb30b8cf1c4c02af">uip_udp_new</a>(dnsserver, <a class="code" href="a00148.html#g69a7a4951ff21b302267532c21ee78fc">HTONS</a>(53));
+<a name="l00445"></a>00445 }
+<a name="l00446"></a>00446 <span class="comment">/*---------------------------------------------------------------------------*/</span><span class="comment"></span>
+<a name="l00447"></a>00447 <span class="comment">/**</span>
+<a name="l00448"></a>00448 <span class="comment"> * Initalize the resolver.</span>
+<a name="l00449"></a>00449 <span class="comment"> */</span>
+<a name="l00450"></a>00450 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00451"></a>00451 <span class="keywordtype">void</span>
+<a name="l00452"></a>00452 <a name="a154"></a><a class="code" href="a00160.html#gb50f78bbf36d912d69f6c1685d0b40e3">resolv_init</a>(<span class="keywordtype">void</span>)
+<a name="l00453"></a>00453 {
+<a name="l00454"></a>00454   <span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> i;
+<a name="l00455"></a>00455   
+<a name="l00456"></a>00456   <span class="keywordflow">for</span>(i = 0; i &lt; <a class="code" href="a00160.html#g221d37ccde7e3fd0dd2c2eb0a6b15493">RESOLV_ENTRIES</a>; ++i) {
+<a name="l00457"></a>00457     names[i].state = <a class="code" href="a00102.html#876c82c946543cd70c141e41417138e0">STATE_DONE</a>;
+<a name="l00458"></a>00458   }
+<a name="l00459"></a>00459 
+<a name="l00460"></a>00460 }
+<a name="l00461"></a>00461 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00462"></a>00462 <span class="comment"></span>
+<a name="l00463"></a>00463 <span class="comment">/** @} */</span><span class="comment"></span>
+<a name="l00464"></a>00464 <span class="comment">/** @} */</span>
+</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 95 - 0
components/net/uip/doc/html/a00047.html

@@ -0,0 +1,95 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: resolv.h</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<h1>resolv.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/**</span>
+<a name="l00002"></a>00002 <span class="comment"> * \addtogroup resolv</span>
+<a name="l00003"></a>00003 <span class="comment"> * @{</span>
+<a name="l00004"></a>00004 <span class="comment"> */</span><span class="comment"></span>
+<a name="l00005"></a>00005 <span class="comment">/**</span>
+<a name="l00006"></a>00006 <span class="comment"> * \file</span>
+<a name="l00007"></a>00007 <span class="comment"> * DNS resolver code header file.</span>
+<a name="l00008"></a>00008 <span class="comment"> * \author Adam Dunkels &lt;adam@dunkels.com&gt;</span>
+<a name="l00009"></a>00009 <span class="comment"> */</span>
+<a name="l00010"></a>00010 
+<a name="l00011"></a>00011 <span class="comment">/*</span>
+<a name="l00012"></a>00012 <span class="comment"> * Copyright (c) 2002-2003, Adam Dunkels.</span>
+<a name="l00013"></a>00013 <span class="comment"> * All rights reserved.</span>
+<a name="l00014"></a>00014 <span class="comment"> *</span>
+<a name="l00015"></a>00015 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00016"></a>00016 <span class="comment"> * modification, are permitted provided that the following conditions</span>
+<a name="l00017"></a>00017 <span class="comment"> * are met:</span>
+<a name="l00018"></a>00018 <span class="comment"> * 1. Redistributions of source code must retain the above copyright</span>
+<a name="l00019"></a>00019 <span class="comment"> *    notice, this list of conditions and the following disclaimer.</span>
+<a name="l00020"></a>00020 <span class="comment"> * 2. Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00021"></a>00021 <span class="comment"> *    notice, this list of conditions and the following disclaimer in the</span>
+<a name="l00022"></a>00022 <span class="comment"> *    documentation and/or other materials provided with the distribution.</span>
+<a name="l00023"></a>00023 <span class="comment"> * 3. The name of the author may not be used to endorse or promote</span>
+<a name="l00024"></a>00024 <span class="comment"> *    products derived from this software without specific prior</span>
+<a name="l00025"></a>00025 <span class="comment"> *    written permission.</span>
+<a name="l00026"></a>00026 <span class="comment"> *</span>
+<a name="l00027"></a>00027 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS</span>
+<a name="l00028"></a>00028 <span class="comment"> * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00029"></a>00029 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span>
+<a name="l00030"></a>00030 <span class="comment"> * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY</span>
+<a name="l00031"></a>00031 <span class="comment"> * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</span>
+<a name="l00032"></a>00032 <span class="comment"> * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE</span>
+<a name="l00033"></a>00033 <span class="comment"> * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span>
+<a name="l00034"></a>00034 <span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,</span>
+<a name="l00035"></a>00035 <span class="comment"> * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING</span>
+<a name="l00036"></a>00036 <span class="comment"> * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00037"></a>00037 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00038"></a>00038 <span class="comment"> *</span>
+<a name="l00039"></a>00039 <span class="comment"> * This file is part of the uIP TCP/IP stack.</span>
+<a name="l00040"></a>00040 <span class="comment"> *</span>
+<a name="l00041"></a>00041 <span class="comment"> * $Id: resolv.h,v 1.4 2006/06/11 21:46:37 adam Exp $</span>
+<a name="l00042"></a>00042 <span class="comment"> *</span>
+<a name="l00043"></a>00043 <span class="comment"> */</span>
+<a name="l00044"></a>00044 <span class="preprocessor">#ifndef __RESOLV_H__</span>
+<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#define __RESOLV_H__</span>
+<a name="l00046"></a>00046 <span class="preprocessor"></span>
+<a name="l00047"></a>00047 <span class="keyword">typedef</span> <span class="keywordtype">int</span> <a class="code" href="a00153.html#ga92afb113e122f860392bfbd385f842e">uip_udp_appstate_t</a>;
+<a name="l00048"></a>00048 <span class="keywordtype">void</span> <a name="a155"></a><a class="code" href="a00160.html#g7c5359305008e9183b18d6ab75f568bf">resolv_appcall</a>(<span class="keywordtype">void</span>);
+<a name="l00049"></a>00049 <span class="preprocessor">#define UIP_UDP_APPCALL resolv_appcall</span>
+<a name="l00050"></a>00050 <span class="preprocessor"></span>
+<a name="l00051"></a>00051 <span class="preprocessor">#include "<a class="code" href="a00140.html">uipopt.h</a>"</span>
+<a name="l00052"></a>00052 <span class="comment"></span>
+<a name="l00053"></a>00053 <span class="comment">/**</span>
+<a name="l00054"></a>00054 <span class="comment"> * Callback function which is called when a hostname is found.</span>
+<a name="l00055"></a>00055 <span class="comment"> *</span>
+<a name="l00056"></a>00056 <span class="comment"> * This function must be implemented by the module that uses the DNS</span>
+<a name="l00057"></a>00057 <span class="comment"> * resolver. It is called when a hostname is found, or when a hostname</span>
+<a name="l00058"></a>00058 <span class="comment"> * was not found.</span>
+<a name="l00059"></a>00059 <span class="comment"> *</span>
+<a name="l00060"></a>00060 <span class="comment"> * \param name A pointer to the name that was looked up.  \param</span>
+<a name="l00061"></a>00061 <span class="comment"> * ipaddr A pointer to a 4-byte array containing the IP address of the</span>
+<a name="l00062"></a>00062 <span class="comment"> * hostname, or NULL if the hostname could not be found.</span>
+<a name="l00063"></a>00063 <span class="comment"> */</span>
+<a name="l00064"></a>00064 <span class="keywordtype">void</span> <a name="a156"></a><a class="code" href="a00160.html#g6d9751d534453425c7a5a215d1d4414c">resolv_found</a>(<span class="keywordtype">char</span> *name, <a name="a157"></a><a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> *ipaddr);
+<a name="l00065"></a>00065 
+<a name="l00066"></a>00066 <span class="comment">/* Functions. */</span>
+<a name="l00067"></a>00067 <span class="keywordtype">void</span> <a name="a158"></a><a class="code" href="a00160.html#gdf916e0c752f5cda70d0bddb2be422ba">resolv_conf</a>(<a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> *dnsserver);
+<a name="l00068"></a>00068 <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> *<a name="a159"></a><a class="code" href="a00160.html#g3191066cf8f76bd00b6843b77c37068f">resolv_getserver</a>(<span class="keywordtype">void</span>);
+<a name="l00069"></a>00069 <span class="keywordtype">void</span> <a name="a160"></a><a class="code" href="a00160.html#gb50f78bbf36d912d69f6c1685d0b40e3">resolv_init</a>(<span class="keywordtype">void</span>);
+<a name="l00070"></a>00070 <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> *<a name="a161"></a><a class="code" href="a00160.html#g66d19181ad5fe8b8f7c84d1f1d46a2ec">resolv_lookup</a>(<span class="keywordtype">char</span> *name);
+<a name="l00071"></a>00071 <span class="keywordtype">void</span> <a name="a162"></a><a class="code" href="a00160.html#ge4dcbbe6c641d2e3b8537b479df5fc99">resolv_query</a>(<span class="keywordtype">char</span> *name);
+<a name="l00072"></a>00072 
+<a name="l00073"></a>00073 <span class="preprocessor">#endif </span><span class="comment">/* __RESOLV_H__ */</span>
+<a name="l00074"></a>00074 <span class="comment"></span>
+<a name="l00075"></a>00075 <span class="comment">/** @} */</span>
+</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 376 - 0
components/net/uip/doc/html/a00048.html

@@ -0,0 +1,376 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: dhcpc.c</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<h1>dhcpc.c</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment"> * Copyright (c) 2005, Swedish Institute of Computer Science</span>
+<a name="l00003"></a>00003 <span class="comment"> * All rights reserved.</span>
+<a name="l00004"></a>00004 <span class="comment"> *</span>
+<a name="l00005"></a>00005 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00006"></a>00006 <span class="comment"> * modification, are permitted provided that the following conditions</span>
+<a name="l00007"></a>00007 <span class="comment"> * are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> * 1. Redistributions of source code must retain the above copyright</span>
+<a name="l00009"></a>00009 <span class="comment"> *    notice, this list of conditions and the following disclaimer.</span>
+<a name="l00010"></a>00010 <span class="comment"> * 2. Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00011"></a>00011 <span class="comment"> *    notice, this list of conditions and the following disclaimer in the</span>
+<a name="l00012"></a>00012 <span class="comment"> *    documentation and/or other materials provided with the distribution.</span>
+<a name="l00013"></a>00013 <span class="comment"> * 3. Neither the name of the Institute nor the names of its contributors</span>
+<a name="l00014"></a>00014 <span class="comment"> *    may be used to endorse or promote products derived from this software</span>
+<a name="l00015"></a>00015 <span class="comment"> *    without specific prior written permission.</span>
+<a name="l00016"></a>00016 <span class="comment"> *</span>
+<a name="l00017"></a>00017 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND</span>
+<a name="l00018"></a>00018 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span>
+<a name="l00019"></a>00019 <span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span>
+<a name="l00020"></a>00020 <span class="comment"> * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE</span>
+<a name="l00021"></a>00021 <span class="comment"> * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</span>
+<a name="l00022"></a>00022 <span class="comment"> * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS</span>
+<a name="l00023"></a>00023 <span class="comment"> * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</span>
+<a name="l00024"></a>00024 <span class="comment"> * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT</span>
+<a name="l00025"></a>00025 <span class="comment"> * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY</span>
+<a name="l00026"></a>00026 <span class="comment"> * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</span>
+<a name="l00027"></a>00027 <span class="comment"> * SUCH DAMAGE.</span>
+<a name="l00028"></a>00028 <span class="comment"> *</span>
+<a name="l00029"></a>00029 <span class="comment"> * This file is part of the uIP TCP/IP stack</span>
+<a name="l00030"></a>00030 <span class="comment"> *</span>
+<a name="l00031"></a>00031 <span class="comment"> * @(#)$Id: dhcpc.c,v 1.2 2006/06/11 21:46:37 adam Exp $</span>
+<a name="l00032"></a>00032 <span class="comment"> */</span>
+<a name="l00033"></a>00033 
+<a name="l00034"></a>00034 <span class="preprocessor">#include &lt;stdio.h&gt;</span>
+<a name="l00035"></a>00035 <span class="preprocessor">#include &lt;string.h&gt;</span>
+<a name="l00036"></a>00036 
+<a name="l00037"></a>00037 <span class="preprocessor">#include "<a class="code" href="a00136.html">uip.h</a>"</span>
+<a name="l00038"></a>00038 <span class="preprocessor">#include "dhcpc.h"</span>
+<a name="l00039"></a>00039 <span class="preprocessor">#include "<a class="code" href="a00130.html">timer.h</a>"</span>
+<a name="l00040"></a>00040 <span class="preprocessor">#include "<a class="code" href="a00128.html">pt.h</a>"</span>
+<a name="l00041"></a>00041 
+<a name="l00042"></a>00042 <span class="preprocessor">#define STATE_INITIAL         0</span>
+<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#define STATE_SENDING         1</span>
+<a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor">#define STATE_OFFER_RECEIVED  2</span>
+<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#define STATE_CONFIG_RECEIVED 3</span>
+<a name="l00046"></a>00046 <span class="preprocessor"></span>
+<a name="l00047"></a>00047 <span class="keyword">static</span> <span class="keyword">struct </span><a name="_a0"></a><a class="code" href="a00077.html">dhcpc_state</a> s;
+<a name="l00048"></a>00048 
+<a name="l00049"></a>00049 <span class="keyword">struct </span>dhcp_msg {
+<a name="l00050"></a>00050   <a name="a1"></a><a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> op, htype, hlen, hops;
+<a name="l00051"></a>00051   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> xid[4];
+<a name="l00052"></a>00052   <a name="a2"></a><a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> secs, flags;
+<a name="l00053"></a>00053   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> ciaddr[4];
+<a name="l00054"></a>00054   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> yiaddr[4];
+<a name="l00055"></a>00055   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> siaddr[4];
+<a name="l00056"></a>00056   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> giaddr[4];
+<a name="l00057"></a>00057   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> chaddr[16];
+<a name="l00058"></a>00058 <span class="preprocessor">#ifndef UIP_CONF_DHCP_LIGHT</span>
+<a name="l00059"></a>00059 <span class="preprocessor"></span>  <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> sname[64];
+<a name="l00060"></a>00060   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> file[128];
+<a name="l00061"></a>00061 <span class="preprocessor">#endif</span>
+<a name="l00062"></a>00062 <span class="preprocessor"></span>  <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> options[312];
+<a name="l00063"></a>00063 };
+<a name="l00064"></a>00064 
+<a name="l00065"></a>00065 <span class="preprocessor">#define BOOTP_BROADCAST 0x8000</span>
+<a name="l00066"></a>00066 <span class="preprocessor"></span>
+<a name="l00067"></a>00067 <span class="preprocessor">#define DHCP_REQUEST        1</span>
+<a name="l00068"></a>00068 <span class="preprocessor"></span><span class="preprocessor">#define DHCP_REPLY          2</span>
+<a name="l00069"></a>00069 <span class="preprocessor"></span><span class="preprocessor">#define DHCP_HTYPE_ETHERNET 1</span>
+<a name="l00070"></a>00070 <span class="preprocessor"></span><span class="preprocessor">#define DHCP_HLEN_ETHERNET  6</span>
+<a name="l00071"></a>00071 <span class="preprocessor"></span><span class="preprocessor">#define DHCP_MSG_LEN      236</span>
+<a name="l00072"></a>00072 <span class="preprocessor"></span>
+<a name="l00073"></a>00073 <span class="preprocessor">#define DHCPC_SERVER_PORT  67</span>
+<a name="l00074"></a>00074 <span class="preprocessor"></span><span class="preprocessor">#define DHCPC_CLIENT_PORT  68</span>
+<a name="l00075"></a>00075 <span class="preprocessor"></span>
+<a name="l00076"></a>00076 <span class="preprocessor">#define DHCPDISCOVER  1</span>
+<a name="l00077"></a>00077 <span class="preprocessor"></span><span class="preprocessor">#define DHCPOFFER     2</span>
+<a name="l00078"></a>00078 <span class="preprocessor"></span><span class="preprocessor">#define DHCPREQUEST   3</span>
+<a name="l00079"></a>00079 <span class="preprocessor"></span><span class="preprocessor">#define DHCPDECLINE   4</span>
+<a name="l00080"></a>00080 <span class="preprocessor"></span><span class="preprocessor">#define DHCPACK       5</span>
+<a name="l00081"></a>00081 <span class="preprocessor"></span><span class="preprocessor">#define DHCPNAK       6</span>
+<a name="l00082"></a>00082 <span class="preprocessor"></span><span class="preprocessor">#define DHCPRELEASE   7</span>
+<a name="l00083"></a>00083 <span class="preprocessor"></span>
+<a name="l00084"></a>00084 <span class="preprocessor">#define DHCP_OPTION_SUBNET_MASK   1</span>
+<a name="l00085"></a>00085 <span class="preprocessor"></span><span class="preprocessor">#define DHCP_OPTION_ROUTER        3</span>
+<a name="l00086"></a>00086 <span class="preprocessor"></span><span class="preprocessor">#define DHCP_OPTION_DNS_SERVER    6</span>
+<a name="l00087"></a>00087 <span class="preprocessor"></span><span class="preprocessor">#define DHCP_OPTION_REQ_IPADDR   50</span>
+<a name="l00088"></a>00088 <span class="preprocessor"></span><span class="preprocessor">#define DHCP_OPTION_LEASE_TIME   51</span>
+<a name="l00089"></a>00089 <span class="preprocessor"></span><span class="preprocessor">#define DHCP_OPTION_MSG_TYPE     53</span>
+<a name="l00090"></a>00090 <span class="preprocessor"></span><span class="preprocessor">#define DHCP_OPTION_SERVER_ID    54</span>
+<a name="l00091"></a>00091 <span class="preprocessor"></span><span class="preprocessor">#define DHCP_OPTION_REQ_LIST     55</span>
+<a name="l00092"></a>00092 <span class="preprocessor"></span><span class="preprocessor">#define DHCP_OPTION_END         255</span>
+<a name="l00093"></a>00093 <span class="preprocessor"></span>
+<a name="l00094"></a>00094 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> xid[4] = {0xad, 0xde, 0x12, 0x23};
+<a name="l00095"></a>00095 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> magic_cookie[4] = {99, 130, 83, 99};
+<a name="l00096"></a>00096 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00097"></a>00097 <span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *
+<a name="l00098"></a>00098 add_msg_type(<a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *optptr, <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> type)
+<a name="l00099"></a>00099 {
+<a name="l00100"></a>00100   *optptr++ = DHCP_OPTION_MSG_TYPE;
+<a name="l00101"></a>00101   *optptr++ = 1;
+<a name="l00102"></a>00102   *optptr++ = type;
+<a name="l00103"></a>00103   <span class="keywordflow">return</span> optptr;
+<a name="l00104"></a>00104 }
+<a name="l00105"></a>00105 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00106"></a>00106 <span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *
+<a name="l00107"></a>00107 add_server_id(<a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *optptr)
+<a name="l00108"></a>00108 {
+<a name="l00109"></a>00109   *optptr++ = DHCP_OPTION_SERVER_ID;
+<a name="l00110"></a>00110   *optptr++ = 4;
+<a name="l00111"></a>00111   memcpy(optptr, s.<a name="a3"></a><a class="code" href="a00077.html#564bab93ef6a268a5de2fab885c1d32a">serverid</a>, 4);
+<a name="l00112"></a>00112   <span class="keywordflow">return</span> optptr + 4;
+<a name="l00113"></a>00113 }
+<a name="l00114"></a>00114 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00115"></a>00115 <span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *
+<a name="l00116"></a>00116 add_req_ipaddr(<a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *optptr)
+<a name="l00117"></a>00117 {
+<a name="l00118"></a>00118   *optptr++ = DHCP_OPTION_REQ_IPADDR;
+<a name="l00119"></a>00119   *optptr++ = 4;
+<a name="l00120"></a>00120   memcpy(optptr, s.<a name="a4"></a><a class="code" href="a00077.html#1d2f2751b0865045486c9aa59d0d0971">ipaddr</a>, 4);
+<a name="l00121"></a>00121   <span class="keywordflow">return</span> optptr + 4;
+<a name="l00122"></a>00122 }
+<a name="l00123"></a>00123 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00124"></a>00124 <span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *
+<a name="l00125"></a>00125 add_req_options(<a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *optptr)
+<a name="l00126"></a>00126 {
+<a name="l00127"></a>00127   *optptr++ = DHCP_OPTION_REQ_LIST;
+<a name="l00128"></a>00128   *optptr++ = 3;
+<a name="l00129"></a>00129   *optptr++ = DHCP_OPTION_SUBNET_MASK;
+<a name="l00130"></a>00130   *optptr++ = DHCP_OPTION_ROUTER;
+<a name="l00131"></a>00131   *optptr++ = DHCP_OPTION_DNS_SERVER;
+<a name="l00132"></a>00132   <span class="keywordflow">return</span> optptr;
+<a name="l00133"></a>00133 }
+<a name="l00134"></a>00134 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00135"></a>00135 <span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *
+<a name="l00136"></a>00136 add_end(<a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *optptr)
+<a name="l00137"></a>00137 {
+<a name="l00138"></a>00138   *optptr++ = DHCP_OPTION_END;
+<a name="l00139"></a>00139   <span class="keywordflow">return</span> optptr;
+<a name="l00140"></a>00140 }
+<a name="l00141"></a>00141 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00142"></a>00142 <span class="keyword">static</span> <span class="keywordtype">void</span>
+<a name="l00143"></a>00143 create_msg(<span class="keyword">register</span> <span class="keyword">struct</span> dhcp_msg *m)
+<a name="l00144"></a>00144 {
+<a name="l00145"></a>00145   m-&gt;op = DHCP_REQUEST;
+<a name="l00146"></a>00146   m-&gt;htype = DHCP_HTYPE_ETHERNET;
+<a name="l00147"></a>00147   m-&gt;hlen = s.<a name="a5"></a><a class="code" href="a00077.html#5361ef75bfbdb469b5cc31f0060a2670">mac_len</a>;
+<a name="l00148"></a>00148   m-&gt;hops = 0;
+<a name="l00149"></a>00149   memcpy(m-&gt;xid, xid, <span class="keyword">sizeof</span>(m-&gt;xid));
+<a name="l00150"></a>00150   m-&gt;secs = 0;
+<a name="l00151"></a>00151   m-&gt;flags = <a name="a6"></a><a class="code" href="a00148.html#g69a7a4951ff21b302267532c21ee78fc">HTONS</a>(BOOTP_BROADCAST); <span class="comment">/*  Broadcast bit. */</span>
+<a name="l00152"></a>00152   <span class="comment">/*  uip_ipaddr_copy(m-&gt;ciaddr, uip_hostaddr);*/</span>
+<a name="l00153"></a>00153   memcpy(m-&gt;ciaddr, <a name="a7"></a><a class="code" href="a00150.html#g7d3673f52f5846b6961d23b150decd54">uip_hostaddr</a>, <span class="keyword">sizeof</span>(m-&gt;ciaddr));
+<a name="l00154"></a>00154   memset(m-&gt;yiaddr, 0, <span class="keyword">sizeof</span>(m-&gt;yiaddr));
+<a name="l00155"></a>00155   memset(m-&gt;siaddr, 0, <span class="keyword">sizeof</span>(m-&gt;siaddr));
+<a name="l00156"></a>00156   memset(m-&gt;giaddr, 0, <span class="keyword">sizeof</span>(m-&gt;giaddr));
+<a name="l00157"></a>00157   memcpy(m-&gt;chaddr, s.<a name="a8"></a><a class="code" href="a00077.html#2391bb18db5f620e0e9fb848ae5ba5e9">mac_addr</a>, s.<a class="code" href="a00077.html#5361ef75bfbdb469b5cc31f0060a2670">mac_len</a>);
+<a name="l00158"></a>00158   memset(&amp;m-&gt;chaddr[s.<a class="code" href="a00077.html#5361ef75bfbdb469b5cc31f0060a2670">mac_len</a>], 0, <span class="keyword">sizeof</span>(m-&gt;chaddr) - s.<a class="code" href="a00077.html#5361ef75bfbdb469b5cc31f0060a2670">mac_len</a>);
+<a name="l00159"></a>00159 <span class="preprocessor">#ifndef UIP_CONF_DHCP_LIGHT</span>
+<a name="l00160"></a>00160 <span class="preprocessor"></span>  memset(m-&gt;sname, 0, <span class="keyword">sizeof</span>(m-&gt;sname));
+<a name="l00161"></a>00161   memset(m-&gt;file, 0, <span class="keyword">sizeof</span>(m-&gt;file));
+<a name="l00162"></a>00162 <span class="preprocessor">#endif</span>
+<a name="l00163"></a>00163 <span class="preprocessor"></span>
+<a name="l00164"></a>00164   memcpy(m-&gt;options, magic_cookie, <span class="keyword">sizeof</span>(magic_cookie));
+<a name="l00165"></a>00165 }
+<a name="l00166"></a>00166 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00167"></a>00167 <span class="keyword">static</span> <span class="keywordtype">void</span>
+<a name="l00168"></a>00168 send_discover(<span class="keywordtype">void</span>)
+<a name="l00169"></a>00169 {
+<a name="l00170"></a>00170   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *end;
+<a name="l00171"></a>00171   <span class="keyword">struct </span>dhcp_msg *m = (<span class="keyword">struct </span>dhcp_msg *)<a name="a9"></a><a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>;
+<a name="l00172"></a>00172 
+<a name="l00173"></a>00173   create_msg(m);
+<a name="l00174"></a>00174 
+<a name="l00175"></a>00175   end = add_msg_type(&amp;m-&gt;options[4], DHCPDISCOVER);
+<a name="l00176"></a>00176   end = add_req_options(end);
+<a name="l00177"></a>00177   end = add_end(end);
+<a name="l00178"></a>00178 
+<a name="l00179"></a>00179   <a name="a10"></a><a class="code" href="a00147.html#g04b053a623aac7cd4195157d470661b3">uip_send</a>(<a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>, end - (<a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *)<a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>);
+<a name="l00180"></a>00180 }
+<a name="l00181"></a>00181 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00182"></a>00182 <span class="keyword">static</span> <span class="keywordtype">void</span>
+<a name="l00183"></a>00183 send_request(<span class="keywordtype">void</span>)
+<a name="l00184"></a>00184 {
+<a name="l00185"></a>00185   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *end;
+<a name="l00186"></a>00186   <span class="keyword">struct </span>dhcp_msg *m = (<span class="keyword">struct </span>dhcp_msg *)<a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>;
+<a name="l00187"></a>00187 
+<a name="l00188"></a>00188   create_msg(m);
+<a name="l00189"></a>00189   
+<a name="l00190"></a>00190   end = add_msg_type(&amp;m-&gt;options[4], DHCPREQUEST);
+<a name="l00191"></a>00191   end = add_server_id(end);
+<a name="l00192"></a>00192   end = add_req_ipaddr(end);
+<a name="l00193"></a>00193   end = add_end(end);
+<a name="l00194"></a>00194   
+<a name="l00195"></a>00195   <a class="code" href="a00147.html#g04b053a623aac7cd4195157d470661b3">uip_send</a>(<a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>, end - (<a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *)<a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>);
+<a name="l00196"></a>00196 }
+<a name="l00197"></a>00197 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00198"></a>00198 <span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>
+<a name="l00199"></a>00199 parse_options(<a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *optptr, <span class="keywordtype">int</span> len)
+<a name="l00200"></a>00200 {
+<a name="l00201"></a>00201   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *end = optptr + len;
+<a name="l00202"></a>00202   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> type = 0;
+<a name="l00203"></a>00203 
+<a name="l00204"></a>00204   <span class="keywordflow">while</span>(optptr &lt; end) {
+<a name="l00205"></a>00205     <span class="keywordflow">switch</span>(*optptr) {
+<a name="l00206"></a>00206     <span class="keywordflow">case</span> DHCP_OPTION_SUBNET_MASK:
+<a name="l00207"></a>00207       memcpy(s.<a name="a11"></a><a class="code" href="a00077.html#20541305548441e5dcb2e1e7e6f300eb">netmask</a>, optptr + 2, 4);
+<a name="l00208"></a>00208       <span class="keywordflow">break</span>;
+<a name="l00209"></a>00209     <span class="keywordflow">case</span> DHCP_OPTION_ROUTER:
+<a name="l00210"></a>00210       memcpy(s.<a name="a12"></a><a class="code" href="a00077.html#5e16ca335dfd7394527f602da879fca2">default_router</a>, optptr + 2, 4);
+<a name="l00211"></a>00211       <span class="keywordflow">break</span>;
+<a name="l00212"></a>00212     <span class="keywordflow">case</span> DHCP_OPTION_DNS_SERVER:
+<a name="l00213"></a>00213       memcpy(s.<a name="a13"></a><a class="code" href="a00077.html#27df2817055bc099821d96eb60a40b34">dnsaddr</a>, optptr + 2, 4);
+<a name="l00214"></a>00214       <span class="keywordflow">break</span>;
+<a name="l00215"></a>00215     <span class="keywordflow">case</span> DHCP_OPTION_MSG_TYPE:
+<a name="l00216"></a>00216       type = *(optptr + 2);
+<a name="l00217"></a>00217       <span class="keywordflow">break</span>;
+<a name="l00218"></a>00218     <span class="keywordflow">case</span> DHCP_OPTION_SERVER_ID:
+<a name="l00219"></a>00219       memcpy(s.<a class="code" href="a00077.html#564bab93ef6a268a5de2fab885c1d32a">serverid</a>, optptr + 2, 4);
+<a name="l00220"></a>00220       <span class="keywordflow">break</span>;
+<a name="l00221"></a>00221     <span class="keywordflow">case</span> DHCP_OPTION_LEASE_TIME:
+<a name="l00222"></a>00222       memcpy(s.<a name="a14"></a><a class="code" href="a00077.html#7a520a57d7d0541524f34a7685635597">lease_time</a>, optptr + 2, 4);
+<a name="l00223"></a>00223       <span class="keywordflow">break</span>;
+<a name="l00224"></a>00224     <span class="keywordflow">case</span> DHCP_OPTION_END:
+<a name="l00225"></a>00225       <span class="keywordflow">return</span> type;
+<a name="l00226"></a>00226     }
+<a name="l00227"></a>00227 
+<a name="l00228"></a>00228     optptr += optptr[1] + 2;
+<a name="l00229"></a>00229   }
+<a name="l00230"></a>00230   <span class="keywordflow">return</span> type;
+<a name="l00231"></a>00231 }
+<a name="l00232"></a>00232 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00233"></a>00233 <span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>
+<a name="l00234"></a>00234 parse_msg(<span class="keywordtype">void</span>)
+<a name="l00235"></a>00235 {
+<a name="l00236"></a>00236   <span class="keyword">struct </span>dhcp_msg *m = (<span class="keyword">struct </span>dhcp_msg *)<a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>;
+<a name="l00237"></a>00237   
+<a name="l00238"></a>00238   <span class="keywordflow">if</span>(m-&gt;op == DHCP_REPLY &amp;&amp;
+<a name="l00239"></a>00239      memcmp(m-&gt;xid, xid, <span class="keyword">sizeof</span>(xid)) == 0 &amp;&amp;
+<a name="l00240"></a>00240      memcmp(m-&gt;chaddr, s.<a class="code" href="a00077.html#2391bb18db5f620e0e9fb848ae5ba5e9">mac_addr</a>, s.<a class="code" href="a00077.html#5361ef75bfbdb469b5cc31f0060a2670">mac_len</a>) == 0) {
+<a name="l00241"></a>00241     memcpy(s.<a class="code" href="a00077.html#1d2f2751b0865045486c9aa59d0d0971">ipaddr</a>, m-&gt;yiaddr, 4);
+<a name="l00242"></a>00242     <span class="keywordflow">return</span> parse_options(&amp;m-&gt;options[4], <a name="a15"></a><a class="code" href="a00147.html#g1a1bc437c09ddef238abab41d77c3177">uip_datalen</a>());
+<a name="l00243"></a>00243   }
+<a name="l00244"></a>00244   <span class="keywordflow">return</span> 0;
+<a name="l00245"></a>00245 }
+<a name="l00246"></a>00246 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00247"></a>00247 <span class="keyword">static</span>
+<a name="l00248"></a>00248 <a name="a16"></a><a class="code" href="a00142.html#g3d4c8bd4aada659eb34f5d2ffd3e7901">PT_THREAD</a>(handle_dhcp(<span class="keywordtype">void</span>))
+<a name="l00249"></a>00249 {
+<a name="l00250"></a>00250   <a name="a17"></a><a class="code" href="a00142.html#g2ffbb9e554e08a343ae2f9de4bedfdfc">PT_BEGIN</a>(&amp;s.<a name="a18"></a><a class="code" href="a00077.html#31471b5e27bda51832d0fa49bd6d9b54">pt</a>);
+<a name="l00251"></a>00251   
+<a name="l00252"></a>00252   <span class="comment">/* try_again:*/</span>
+<a name="l00253"></a>00253   s.<a name="a19"></a><a class="code" href="a00077.html#e0b137a3875ad12a99e5e3e0e177fd12">state</a> = STATE_SENDING;
+<a name="l00254"></a>00254   s.<a name="a20"></a><a class="code" href="a00077.html#e707c39412e09d3a47f0b3c5dad33725">ticks</a> = <a name="a21"></a><a class="code" href="a00157.html#ge3ced0551b26c9b99cb45a86f34d100a">CLOCK_SECOND</a>;
+<a name="l00255"></a>00255 
+<a name="l00256"></a>00256   <span class="keywordflow">do</span> {
+<a name="l00257"></a>00257     send_discover();
+<a name="l00258"></a>00258     <a name="a22"></a><a class="code" href="a00156.html#g6614d96fdfcd95c95ec6e6f63071ff51">timer_set</a>(&amp;s.<a name="a23"></a><a class="code" href="a00077.html#e80af46ceef63eab3c786525370ae720">timer</a>, s.<a class="code" href="a00077.html#e707c39412e09d3a47f0b3c5dad33725">ticks</a>);
+<a name="l00259"></a>00259     <a name="a24"></a><a class="code" href="a00142.html#g99e43010ec61327164466aa2d902de45">PT_WAIT_UNTIL</a>(&amp;s.<a class="code" href="a00077.html#31471b5e27bda51832d0fa49bd6d9b54">pt</a>, <a name="a25"></a><a class="code" href="a00147.html#g26a14b8dae3f861830af9e7cf1e03725">uip_newdata</a>() || <a name="a26"></a><a class="code" href="a00156.html#g6d71dececfce707c668e6257aad5906e">timer_expired</a>(&amp;s.<a class="code" href="a00077.html#e80af46ceef63eab3c786525370ae720">timer</a>));
+<a name="l00260"></a>00260 
+<a name="l00261"></a>00261     <span class="keywordflow">if</span>(<a class="code" href="a00147.html#g26a14b8dae3f861830af9e7cf1e03725">uip_newdata</a>() &amp;&amp; parse_msg() == DHCPOFFER) {
+<a name="l00262"></a>00262       s.<a class="code" href="a00077.html#e0b137a3875ad12a99e5e3e0e177fd12">state</a> = STATE_OFFER_RECEIVED;
+<a name="l00263"></a>00263       <span class="keywordflow">break</span>;
+<a name="l00264"></a>00264     }
+<a name="l00265"></a>00265 
+<a name="l00266"></a>00266     <span class="keywordflow">if</span>(s.<a class="code" href="a00077.html#e707c39412e09d3a47f0b3c5dad33725">ticks</a> &lt; <a class="code" href="a00157.html#ge3ced0551b26c9b99cb45a86f34d100a">CLOCK_SECOND</a> * 60) {
+<a name="l00267"></a>00267       s.<a class="code" href="a00077.html#e707c39412e09d3a47f0b3c5dad33725">ticks</a> *= 2;
+<a name="l00268"></a>00268     }
+<a name="l00269"></a>00269   } <span class="keywordflow">while</span>(s.<a class="code" href="a00077.html#e0b137a3875ad12a99e5e3e0e177fd12">state</a> != STATE_OFFER_RECEIVED);
+<a name="l00270"></a>00270   
+<a name="l00271"></a>00271   s.<a class="code" href="a00077.html#e707c39412e09d3a47f0b3c5dad33725">ticks</a> = <a class="code" href="a00157.html#ge3ced0551b26c9b99cb45a86f34d100a">CLOCK_SECOND</a>;
+<a name="l00272"></a>00272 
+<a name="l00273"></a>00273   <span class="keywordflow">do</span> {
+<a name="l00274"></a>00274     send_request();
+<a name="l00275"></a>00275     <a class="code" href="a00156.html#g6614d96fdfcd95c95ec6e6f63071ff51">timer_set</a>(&amp;s.<a class="code" href="a00077.html#e80af46ceef63eab3c786525370ae720">timer</a>, s.<a class="code" href="a00077.html#e707c39412e09d3a47f0b3c5dad33725">ticks</a>);
+<a name="l00276"></a>00276     <a class="code" href="a00142.html#g99e43010ec61327164466aa2d902de45">PT_WAIT_UNTIL</a>(&amp;s.<a class="code" href="a00077.html#31471b5e27bda51832d0fa49bd6d9b54">pt</a>, <a class="code" href="a00147.html#g26a14b8dae3f861830af9e7cf1e03725">uip_newdata</a>() || <a class="code" href="a00156.html#g6d71dececfce707c668e6257aad5906e">timer_expired</a>(&amp;s.<a class="code" href="a00077.html#e80af46ceef63eab3c786525370ae720">timer</a>));
+<a name="l00277"></a>00277 
+<a name="l00278"></a>00278     <span class="keywordflow">if</span>(<a class="code" href="a00147.html#g26a14b8dae3f861830af9e7cf1e03725">uip_newdata</a>() &amp;&amp; parse_msg() == DHCPACK) {
+<a name="l00279"></a>00279       s.<a class="code" href="a00077.html#e0b137a3875ad12a99e5e3e0e177fd12">state</a> = STATE_CONFIG_RECEIVED;
+<a name="l00280"></a>00280       <span class="keywordflow">break</span>;
+<a name="l00281"></a>00281     }
+<a name="l00282"></a>00282 
+<a name="l00283"></a>00283     <span class="keywordflow">if</span>(s.<a class="code" href="a00077.html#e707c39412e09d3a47f0b3c5dad33725">ticks</a> &lt;= <a class="code" href="a00157.html#ge3ced0551b26c9b99cb45a86f34d100a">CLOCK_SECOND</a> * 10) {
+<a name="l00284"></a>00284       s.<a class="code" href="a00077.html#e707c39412e09d3a47f0b3c5dad33725">ticks</a> += <a class="code" href="a00157.html#ge3ced0551b26c9b99cb45a86f34d100a">CLOCK_SECOND</a>;
+<a name="l00285"></a>00285     } <span class="keywordflow">else</span> {
+<a name="l00286"></a>00286       <a name="a27"></a><a class="code" href="a00142.html#gcd3ac045f0a4ae63412e3b3d8780e8ab">PT_RESTART</a>(&amp;s.<a class="code" href="a00077.html#31471b5e27bda51832d0fa49bd6d9b54">pt</a>);
+<a name="l00287"></a>00287     }
+<a name="l00288"></a>00288   } <span class="keywordflow">while</span>(s.<a class="code" href="a00077.html#e0b137a3875ad12a99e5e3e0e177fd12">state</a> != STATE_CONFIG_RECEIVED);
+<a name="l00289"></a>00289   
+<a name="l00290"></a>00290 <span class="preprocessor">#if 0</span>
+<a name="l00291"></a>00291 <span class="preprocessor"></span>  printf(<span class="stringliteral">"Got IP address %d.%d.%d.%d\n"</span>,
+<a name="l00292"></a>00292          <a name="a28"></a><a class="code" href="a00148.html#g22fa0681cd463191d7a01fe85d86996f">uip_ipaddr1</a>(s.<a class="code" href="a00077.html#1d2f2751b0865045486c9aa59d0d0971">ipaddr</a>), <a name="a29"></a><a class="code" href="a00148.html#gffcd2fbe181e2aaefbf970551c302af5">uip_ipaddr2</a>(s.<a class="code" href="a00077.html#1d2f2751b0865045486c9aa59d0d0971">ipaddr</a>),
+<a name="l00293"></a>00293          <a name="a30"></a><a class="code" href="a00148.html#ge23534479ead15af8ff08ace26a47fb5">uip_ipaddr3</a>(s.<a class="code" href="a00077.html#1d2f2751b0865045486c9aa59d0d0971">ipaddr</a>), <a name="a31"></a><a class="code" href="a00148.html#g165b603ec150e26efec7be199c9c2901">uip_ipaddr4</a>(s.<a class="code" href="a00077.html#1d2f2751b0865045486c9aa59d0d0971">ipaddr</a>));
+<a name="l00294"></a>00294   printf(<span class="stringliteral">"Got netmask %d.%d.%d.%d\n"</span>,
+<a name="l00295"></a>00295          <a class="code" href="a00148.html#g22fa0681cd463191d7a01fe85d86996f">uip_ipaddr1</a>(s.<a class="code" href="a00077.html#20541305548441e5dcb2e1e7e6f300eb">netmask</a>), <a class="code" href="a00148.html#gffcd2fbe181e2aaefbf970551c302af5">uip_ipaddr2</a>(s.<a class="code" href="a00077.html#20541305548441e5dcb2e1e7e6f300eb">netmask</a>),
+<a name="l00296"></a>00296          <a class="code" href="a00148.html#ge23534479ead15af8ff08ace26a47fb5">uip_ipaddr3</a>(s.<a class="code" href="a00077.html#20541305548441e5dcb2e1e7e6f300eb">netmask</a>), <a class="code" href="a00148.html#g165b603ec150e26efec7be199c9c2901">uip_ipaddr4</a>(s.<a class="code" href="a00077.html#20541305548441e5dcb2e1e7e6f300eb">netmask</a>));
+<a name="l00297"></a>00297   printf(<span class="stringliteral">"Got DNS server %d.%d.%d.%d\n"</span>,
+<a name="l00298"></a>00298          <a class="code" href="a00148.html#g22fa0681cd463191d7a01fe85d86996f">uip_ipaddr1</a>(s.<a class="code" href="a00077.html#27df2817055bc099821d96eb60a40b34">dnsaddr</a>), <a class="code" href="a00148.html#gffcd2fbe181e2aaefbf970551c302af5">uip_ipaddr2</a>(s.<a class="code" href="a00077.html#27df2817055bc099821d96eb60a40b34">dnsaddr</a>),
+<a name="l00299"></a>00299          <a class="code" href="a00148.html#ge23534479ead15af8ff08ace26a47fb5">uip_ipaddr3</a>(s.<a class="code" href="a00077.html#27df2817055bc099821d96eb60a40b34">dnsaddr</a>), <a class="code" href="a00148.html#g165b603ec150e26efec7be199c9c2901">uip_ipaddr4</a>(s.<a class="code" href="a00077.html#27df2817055bc099821d96eb60a40b34">dnsaddr</a>));
+<a name="l00300"></a>00300   printf(<span class="stringliteral">"Got default router %d.%d.%d.%d\n"</span>,
+<a name="l00301"></a>00301          <a class="code" href="a00148.html#g22fa0681cd463191d7a01fe85d86996f">uip_ipaddr1</a>(s.<a class="code" href="a00077.html#5e16ca335dfd7394527f602da879fca2">default_router</a>), <a class="code" href="a00148.html#gffcd2fbe181e2aaefbf970551c302af5">uip_ipaddr2</a>(s.<a class="code" href="a00077.html#5e16ca335dfd7394527f602da879fca2">default_router</a>),
+<a name="l00302"></a>00302          <a class="code" href="a00148.html#ge23534479ead15af8ff08ace26a47fb5">uip_ipaddr3</a>(s.<a class="code" href="a00077.html#5e16ca335dfd7394527f602da879fca2">default_router</a>), <a class="code" href="a00148.html#g165b603ec150e26efec7be199c9c2901">uip_ipaddr4</a>(s.<a class="code" href="a00077.html#5e16ca335dfd7394527f602da879fca2">default_router</a>));
+<a name="l00303"></a>00303   printf(<span class="stringliteral">"Lease expires in %ld seconds\n"</span>,
+<a name="l00304"></a>00304          <a name="a32"></a><a class="code" href="a00148.html#g118e9d76568ab81ad97f138d4ea1ddd2">ntohs</a>(s.<a class="code" href="a00077.html#7a520a57d7d0541524f34a7685635597">lease_time</a>[0])*65536ul + <a class="code" href="a00148.html#g118e9d76568ab81ad97f138d4ea1ddd2">ntohs</a>(s.<a class="code" href="a00077.html#7a520a57d7d0541524f34a7685635597">lease_time</a>[1]));
+<a name="l00305"></a>00305 <span class="preprocessor">#endif</span>
+<a name="l00306"></a>00306 <span class="preprocessor"></span>
+<a name="l00307"></a>00307   dhcpc_configured(&amp;s);
+<a name="l00308"></a>00308   
+<a name="l00309"></a>00309   <span class="comment">/*  timer_stop(&amp;s.timer);*/</span>
+<a name="l00310"></a>00310 
+<a name="l00311"></a>00311   <span class="comment">/*</span>
+<a name="l00312"></a>00312 <span class="comment">   * PT_END restarts the thread so we do this instead. Eventually we</span>
+<a name="l00313"></a>00313 <span class="comment">   * should reacquire expired leases here.</span>
+<a name="l00314"></a>00314 <span class="comment">   */</span>
+<a name="l00315"></a>00315   <span class="keywordflow">while</span>(1) {
+<a name="l00316"></a>00316     <a name="a33"></a><a class="code" href="a00142.html#g155cba6121323726d02c00284428fed6">PT_YIELD</a>(&amp;s.<a class="code" href="a00077.html#31471b5e27bda51832d0fa49bd6d9b54">pt</a>);
+<a name="l00317"></a>00317   }
+<a name="l00318"></a>00318 
+<a name="l00319"></a>00319   <a name="a34"></a><a class="code" href="a00142.html#g7b04a0035bef29d905496c23bae066d2">PT_END</a>(&amp;s.<a class="code" href="a00077.html#31471b5e27bda51832d0fa49bd6d9b54">pt</a>);
+<a name="l00320"></a>00320 }
+<a name="l00321"></a>00321 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00322"></a>00322 <span class="keywordtype">void</span>
+<a name="l00323"></a>00323 dhcpc_init(<span class="keyword">const</span> <span class="keywordtype">void</span> *mac_addr, <span class="keywordtype">int</span> mac_len)
+<a name="l00324"></a>00324 {
+<a name="l00325"></a>00325   <a name="a35"></a><a class="code" href="a00150.html#g1ef35301f43a5bbb9f89f07b5a36b9a0">uip_ipaddr_t</a> addr;
+<a name="l00326"></a>00326   
+<a name="l00327"></a>00327   s.<a class="code" href="a00077.html#2391bb18db5f620e0e9fb848ae5ba5e9">mac_addr</a> = mac_addr;
+<a name="l00328"></a>00328   s.<a class="code" href="a00077.html#5361ef75bfbdb469b5cc31f0060a2670">mac_len</a>  = mac_len;
+<a name="l00329"></a>00329 
+<a name="l00330"></a>00330   s.<a class="code" href="a00077.html#e0b137a3875ad12a99e5e3e0e177fd12">state</a> = STATE_INITIAL;
+<a name="l00331"></a>00331   <a name="a36"></a><a class="code" href="a00148.html#g87f0b54ade0d159fba495089128a4932">uip_ipaddr</a>(addr, 255,255,255,255);
+<a name="l00332"></a>00332   s.<a name="a37"></a><a class="code" href="a00077.html#cfd36e02c7498d766ff802575e981612">conn</a> = <a name="a38"></a><a class="code" href="a00147.html#g79c4110211247df3fb30b8cf1c4c02af">uip_udp_new</a>(&amp;addr, <a class="code" href="a00148.html#g69a7a4951ff21b302267532c21ee78fc">HTONS</a>(DHCPC_SERVER_PORT));
+<a name="l00333"></a>00333   <span class="keywordflow">if</span>(s.<a class="code" href="a00077.html#cfd36e02c7498d766ff802575e981612">conn</a> != <a name="a39"></a><a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) {
+<a name="l00334"></a>00334     <a name="a40"></a><a class="code" href="a00147.html#ga20812098a4663c8a9fc4ce8e95391b6">uip_udp_bind</a>(s.<a class="code" href="a00077.html#cfd36e02c7498d766ff802575e981612">conn</a>, <a class="code" href="a00148.html#g69a7a4951ff21b302267532c21ee78fc">HTONS</a>(DHCPC_CLIENT_PORT));
+<a name="l00335"></a>00335   }
+<a name="l00336"></a>00336   <a name="a41"></a><a class="code" href="a00142.html#ge6bae7dc0225468c8a5ac269df549892">PT_INIT</a>(&amp;s.<a class="code" href="a00077.html#31471b5e27bda51832d0fa49bd6d9b54">pt</a>);
+<a name="l00337"></a>00337 }
+<a name="l00338"></a>00338 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00339"></a>00339 <span class="keywordtype">void</span>
+<a name="l00340"></a>00340 dhcpc_appcall(<span class="keywordtype">void</span>)
+<a name="l00341"></a>00341 {
+<a name="l00342"></a>00342   handle_dhcp();
+<a name="l00343"></a>00343 }
+<a name="l00344"></a>00344 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00345"></a>00345 <span class="keywordtype">void</span>
+<a name="l00346"></a>00346 dhcpc_request(<span class="keywordtype">void</span>)
+<a name="l00347"></a>00347 {
+<a name="l00348"></a>00348   <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> ipaddr[2];
+<a name="l00349"></a>00349   
+<a name="l00350"></a>00350   <span class="keywordflow">if</span>(s.<a class="code" href="a00077.html#e0b137a3875ad12a99e5e3e0e177fd12">state</a> == STATE_INITIAL) {
+<a name="l00351"></a>00351     <a class="code" href="a00148.html#g87f0b54ade0d159fba495089128a4932">uip_ipaddr</a>(ipaddr, 0,0,0,0);
+<a name="l00352"></a>00352     <a name="a42"></a><a class="code" href="a00144.html#g12b467f314489259dd718228d0827a51">uip_sethostaddr</a>(ipaddr);
+<a name="l00353"></a>00353     <span class="comment">/*    handle_dhcp(PROCESS_EVENT_NONE, NULL);*/</span>
+<a name="l00354"></a>00354   }
+<a name="l00355"></a>00355 }
+<a name="l00356"></a>00356 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 88 - 0
components/net/uip/doc/html/a00049.html

@@ -0,0 +1,88 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: dhcpc.h</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<h1>dhcpc.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment"> * Copyright (c) 2005, Swedish Institute of Computer Science</span>
+<a name="l00003"></a>00003 <span class="comment"> * All rights reserved.</span>
+<a name="l00004"></a>00004 <span class="comment"> *</span>
+<a name="l00005"></a>00005 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00006"></a>00006 <span class="comment"> * modification, are permitted provided that the following conditions</span>
+<a name="l00007"></a>00007 <span class="comment"> * are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> * 1. Redistributions of source code must retain the above copyright</span>
+<a name="l00009"></a>00009 <span class="comment"> *    notice, this list of conditions and the following disclaimer.</span>
+<a name="l00010"></a>00010 <span class="comment"> * 2. Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00011"></a>00011 <span class="comment"> *    notice, this list of conditions and the following disclaimer in the</span>
+<a name="l00012"></a>00012 <span class="comment"> *    documentation and/or other materials provided with the distribution.</span>
+<a name="l00013"></a>00013 <span class="comment"> * 3. Neither the name of the Institute nor the names of its contributors</span>
+<a name="l00014"></a>00014 <span class="comment"> *    may be used to endorse or promote products derived from this software</span>
+<a name="l00015"></a>00015 <span class="comment"> *    without specific prior written permission.</span>
+<a name="l00016"></a>00016 <span class="comment"> *</span>
+<a name="l00017"></a>00017 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND</span>
+<a name="l00018"></a>00018 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span>
+<a name="l00019"></a>00019 <span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span>
+<a name="l00020"></a>00020 <span class="comment"> * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE</span>
+<a name="l00021"></a>00021 <span class="comment"> * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</span>
+<a name="l00022"></a>00022 <span class="comment"> * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS</span>
+<a name="l00023"></a>00023 <span class="comment"> * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</span>
+<a name="l00024"></a>00024 <span class="comment"> * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT</span>
+<a name="l00025"></a>00025 <span class="comment"> * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY</span>
+<a name="l00026"></a>00026 <span class="comment"> * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</span>
+<a name="l00027"></a>00027 <span class="comment"> * SUCH DAMAGE.</span>
+<a name="l00028"></a>00028 <span class="comment"> *</span>
+<a name="l00029"></a>00029 <span class="comment"> * This file is part of the uIP TCP/IP stack</span>
+<a name="l00030"></a>00030 <span class="comment"> *</span>
+<a name="l00031"></a>00031 <span class="comment"> * @(#)$Id: dhcpc.h,v 1.3 2006/06/11 21:46:37 adam Exp $</span>
+<a name="l00032"></a>00032 <span class="comment"> */</span>
+<a name="l00033"></a>00033 <span class="preprocessor">#ifndef __DHCPC_H__</span>
+<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#define __DHCPC_H__</span>
+<a name="l00035"></a>00035 <span class="preprocessor"></span>
+<a name="l00036"></a>00036 <span class="preprocessor">#include "<a class="code" href="a00130.html">timer.h</a>"</span>
+<a name="l00037"></a>00037 <span class="preprocessor">#include "<a class="code" href="a00128.html">pt.h</a>"</span>
+<a name="l00038"></a>00038 
+<a name="l00039"></a>00039 <span class="keyword">struct </span><a name="_a43"></a><a class="code" href="a00077.html">dhcpc_state</a> {
+<a name="l00040"></a>00040   <span class="keyword">struct </span><a name="_a44"></a><a class="code" href="a00084.html">pt</a> <a name="a45"></a><a class="code" href="a00077.html#31471b5e27bda51832d0fa49bd6d9b54">pt</a>;
+<a name="l00041"></a>00041   <span class="keywordtype">char</span> <a name="a46"></a><a class="code" href="a00077.html#e0b137a3875ad12a99e5e3e0e177fd12">state</a>;
+<a name="l00042"></a>00042   <span class="keyword">struct </span><a name="_a47"></a><a class="code" href="a00095.html">uip_udp_conn</a> *<a name="a48"></a><a class="code" href="a00077.html#cfd36e02c7498d766ff802575e981612">conn</a>;
+<a name="l00043"></a>00043   <span class="keyword">struct </span><a name="_a49"></a><a class="code" href="a00087.html">timer</a> <a name="a50"></a><a class="code" href="a00077.html#e80af46ceef63eab3c786525370ae720">timer</a>;
+<a name="l00044"></a>00044   <a name="a51"></a><a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> <a name="a52"></a><a class="code" href="a00077.html#e707c39412e09d3a47f0b3c5dad33725">ticks</a>;
+<a name="l00045"></a>00045   <span class="keyword">const</span> <span class="keywordtype">void</span> *mac_addr;
+<a name="l00046"></a>00046   <span class="keywordtype">int</span> mac_len;
+<a name="l00047"></a>00047   
+<a name="l00048"></a>00048   <a name="a53"></a><a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> <a name="a54"></a><a class="code" href="a00077.html#564bab93ef6a268a5de2fab885c1d32a">serverid</a>[4];
+<a name="l00049"></a>00049 
+<a name="l00050"></a>00050   <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> <a name="a55"></a><a class="code" href="a00077.html#7a520a57d7d0541524f34a7685635597">lease_time</a>[2];
+<a name="l00051"></a>00051   <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> ipaddr[2];
+<a name="l00052"></a>00052   <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> <a name="a56"></a><a class="code" href="a00077.html#20541305548441e5dcb2e1e7e6f300eb">netmask</a>[2];
+<a name="l00053"></a>00053   <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> <a name="a57"></a><a class="code" href="a00077.html#27df2817055bc099821d96eb60a40b34">dnsaddr</a>[2];
+<a name="l00054"></a>00054   <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> <a name="a58"></a><a class="code" href="a00077.html#5e16ca335dfd7394527f602da879fca2">default_router</a>[2];
+<a name="l00055"></a>00055 };
+<a name="l00056"></a>00056 
+<a name="l00057"></a>00057 <span class="keywordtype">void</span> dhcpc_init(<span class="keyword">const</span> <span class="keywordtype">void</span> *mac_addr, <span class="keywordtype">int</span> mac_len);
+<a name="l00058"></a>00058 <span class="keywordtype">void</span> dhcpc_request(<span class="keywordtype">void</span>);
+<a name="l00059"></a>00059 
+<a name="l00060"></a>00060 <span class="keywordtype">void</span> dhcpc_appcall(<span class="keywordtype">void</span>);
+<a name="l00061"></a>00061 
+<a name="l00062"></a>00062 <span class="keywordtype">void</span> dhcpc_configured(<span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="a00077.html">dhcpc_state</a> *s);
+<a name="l00063"></a>00063 
+<a name="l00064"></a>00064 <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="a00077.html">dhcpc_state</a> <a name="a59"></a><a class="code" href="a00153.html#ga92afb113e122f860392bfbd385f842e">uip_udp_appstate_t</a>;
+<a name="l00065"></a>00065 <span class="preprocessor">#define UIP_UDP_APPCALL dhcpc_appcall</span>
+<a name="l00066"></a>00066 <span class="preprocessor"></span>
+<a name="l00067"></a>00067 
+<a name="l00068"></a>00068 <span class="preprocessor">#endif </span><span class="comment">/* __DHCPC_H__ */</span>
+</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 177 - 0
components/net/uip/doc/html/a00050.html

@@ -0,0 +1,177 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: uip-conf.h</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<h1>uip-conf.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/**</span>
+<a name="l00002"></a>00002 <span class="comment"> * \addtogroup uipopt</span>
+<a name="l00003"></a>00003 <span class="comment"> * @{</span>
+<a name="l00004"></a>00004 <span class="comment"> */</span>
+<a name="l00005"></a>00005 <span class="comment"></span>
+<a name="l00006"></a>00006 <span class="comment">/**</span>
+<a name="l00007"></a>00007 <span class="comment"> * \name Project-specific configuration options</span>
+<a name="l00008"></a>00008 <span class="comment"> * @{</span>
+<a name="l00009"></a>00009 <span class="comment"> *</span>
+<a name="l00010"></a>00010 <span class="comment"> * uIP has a number of configuration options that can be overridden</span>
+<a name="l00011"></a>00011 <span class="comment"> * for each project. These are kept in a project-specific uip-conf.h</span>
+<a name="l00012"></a>00012 <span class="comment"> * file and all configuration names have the prefix UIP_CONF.</span>
+<a name="l00013"></a>00013 <span class="comment"> */</span>
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="comment">/*</span>
+<a name="l00016"></a>00016 <span class="comment"> * Copyright (c) 2006, Swedish Institute of Computer Science.</span>
+<a name="l00017"></a>00017 <span class="comment"> * All rights reserved.</span>
+<a name="l00018"></a>00018 <span class="comment"> *</span>
+<a name="l00019"></a>00019 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00020"></a>00020 <span class="comment"> * modification, are permitted provided that the following conditions</span>
+<a name="l00021"></a>00021 <span class="comment"> * are met:</span>
+<a name="l00022"></a>00022 <span class="comment"> * 1. Redistributions of source code must retain the above copyright</span>
+<a name="l00023"></a>00023 <span class="comment"> *    notice, this list of conditions and the following disclaimer.</span>
+<a name="l00024"></a>00024 <span class="comment"> * 2. Redistributions in binary form must reproduce the above copyright</span>
+<a name="l00025"></a>00025 <span class="comment"> *    notice, this list of conditions and the following disclaimer in the</span>
+<a name="l00026"></a>00026 <span class="comment"> *    documentation and/or other materials provided with the distribution.</span>
+<a name="l00027"></a>00027 <span class="comment"> * 3. Neither the name of the Institute nor the names of its contributors</span>
+<a name="l00028"></a>00028 <span class="comment"> *    may be used to endorse or promote products derived from this software</span>
+<a name="l00029"></a>00029 <span class="comment"> *    without specific prior written permission.</span>
+<a name="l00030"></a>00030 <span class="comment"> *</span>
+<a name="l00031"></a>00031 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND</span>
+<a name="l00032"></a>00032 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span>
+<a name="l00033"></a>00033 <span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span>
+<a name="l00034"></a>00034 <span class="comment"> * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE</span>
+<a name="l00035"></a>00035 <span class="comment"> * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</span>
+<a name="l00036"></a>00036 <span class="comment"> * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS</span>
+<a name="l00037"></a>00037 <span class="comment"> * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</span>
+<a name="l00038"></a>00038 <span class="comment"> * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT</span>
+<a name="l00039"></a>00039 <span class="comment"> * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY</span>
+<a name="l00040"></a>00040 <span class="comment"> * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</span>
+<a name="l00041"></a>00041 <span class="comment"> * SUCH DAMAGE.</span>
+<a name="l00042"></a>00042 <span class="comment"> *</span>
+<a name="l00043"></a>00043 <span class="comment"> * This file is part of the uIP TCP/IP stack</span>
+<a name="l00044"></a>00044 <span class="comment"> *</span>
+<a name="l00045"></a>00045 <span class="comment"> * $Id: uip-conf.h,v 1.6 2006/06/12 08:00:31 adam Exp $</span>
+<a name="l00046"></a>00046 <span class="comment"> */</span>
+<a name="l00047"></a>00047 <span class="comment"></span>
+<a name="l00048"></a>00048 <span class="comment">/**</span>
+<a name="l00049"></a>00049 <span class="comment"> * \file</span>
+<a name="l00050"></a>00050 <span class="comment"> *         An example uIP configuration file</span>
+<a name="l00051"></a>00051 <span class="comment"> * \author</span>
+<a name="l00052"></a>00052 <span class="comment"> *         Adam Dunkels &lt;adam@sics.se&gt;</span>
+<a name="l00053"></a>00053 <span class="comment"> */</span>
+<a name="l00054"></a>00054 
+<a name="l00055"></a>00055 <span class="preprocessor">#ifndef __UIP_CONF_H__</span>
+<a name="l00056"></a>00056 <span class="preprocessor"></span><span class="preprocessor">#define __UIP_CONF_H__</span>
+<a name="l00057"></a>00057 <span class="preprocessor"></span>
+<a name="l00058"></a>00058 <span class="preprocessor">#include &lt;inttypes.h&gt;</span>
+<a name="l00059"></a>00059 <span class="comment"></span>
+<a name="l00060"></a>00060 <span class="comment">/**</span>
+<a name="l00061"></a>00061 <span class="comment"> * 8 bit datatype</span>
+<a name="l00062"></a>00062 <span class="comment"> *</span>
+<a name="l00063"></a>00063 <span class="comment"> * This typedef defines the 8-bit type used throughout uIP.</span>
+<a name="l00064"></a>00064 <span class="comment"> *</span>
+<a name="l00065"></a>00065 <span class="comment"> * \hideinitializer</span>
+<a name="l00066"></a>00066 <span class="comment"> */</span>
+<a name="l00067"></a>00067 <span class="keyword">typedef</span> uint8_t <a name="a249"></a><a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>;
+<a name="l00068"></a>00068 <span class="comment"></span>
+<a name="l00069"></a>00069 <span class="comment">/**</span>
+<a name="l00070"></a>00070 <span class="comment"> * 16 bit datatype</span>
+<a name="l00071"></a>00071 <span class="comment"> *</span>
+<a name="l00072"></a>00072 <span class="comment"> * This typedef defines the 16-bit type used throughout uIP.</span>
+<a name="l00073"></a>00073 <span class="comment"> *</span>
+<a name="l00074"></a>00074 <span class="comment"> * \hideinitializer</span>
+<a name="l00075"></a>00075 <span class="comment"> */</span>
+<a name="l00076"></a>00076 <span class="keyword">typedef</span> uint16_t <a name="a250"></a><a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>;
+<a name="l00077"></a>00077 <span class="comment"></span>
+<a name="l00078"></a>00078 <span class="comment">/**</span>
+<a name="l00079"></a>00079 <span class="comment"> * Statistics datatype</span>
+<a name="l00080"></a>00080 <span class="comment"> *</span>
+<a name="l00081"></a>00081 <span class="comment"> * This typedef defines the dataype used for keeping statistics in</span>
+<a name="l00082"></a>00082 <span class="comment"> * uIP.</span>
+<a name="l00083"></a>00083 <span class="comment"> *</span>
+<a name="l00084"></a>00084 <span class="comment"> * \hideinitializer</span>
+<a name="l00085"></a>00085 <span class="comment"> */</span>
+<a name="l00086"></a>00086 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>;
+<a name="l00087"></a>00087 <span class="comment"></span>
+<a name="l00088"></a>00088 <span class="comment">/**</span>
+<a name="l00089"></a>00089 <span class="comment"> * Maximum number of TCP connections.</span>
+<a name="l00090"></a>00090 <span class="comment"> *</span>
+<a name="l00091"></a>00091 <span class="comment"> * \hideinitializer</span>
+<a name="l00092"></a>00092 <span class="comment"> */</span>
+<a name="l00093"></a>00093 <span class="preprocessor">#define UIP_CONF_MAX_CONNECTIONS 40</span>
+<a name="l00094"></a>00094 <span class="preprocessor"></span><span class="comment"></span>
+<a name="l00095"></a>00095 <span class="comment">/**</span>
+<a name="l00096"></a>00096 <span class="comment"> * Maximum number of listening TCP ports.</span>
+<a name="l00097"></a>00097 <span class="comment"> *</span>
+<a name="l00098"></a>00098 <span class="comment"> * \hideinitializer</span>
+<a name="l00099"></a>00099 <span class="comment"> */</span>
+<a name="l00100"></a>00100 <span class="preprocessor">#define UIP_CONF_MAX_LISTENPORTS 40</span>
+<a name="l00101"></a>00101 <span class="preprocessor"></span><span class="comment"></span>
+<a name="l00102"></a>00102 <span class="comment">/**</span>
+<a name="l00103"></a>00103 <span class="comment"> * uIP buffer size.</span>
+<a name="l00104"></a>00104 <span class="comment"> *</span>
+<a name="l00105"></a>00105 <span class="comment"> * \hideinitializer</span>
+<a name="l00106"></a>00106 <span class="comment"> */</span>
+<a name="l00107"></a>00107 <span class="preprocessor">#define UIP_CONF_BUFFER_SIZE     420</span>
+<a name="l00108"></a>00108 <span class="preprocessor"></span><span class="comment"></span>
+<a name="l00109"></a>00109 <span class="comment">/**</span>
+<a name="l00110"></a>00110 <span class="comment"> * CPU byte order.</span>
+<a name="l00111"></a>00111 <span class="comment"> *</span>
+<a name="l00112"></a>00112 <span class="comment"> * \hideinitializer</span>
+<a name="l00113"></a>00113 <span class="comment"> */</span>
+<a name="l00114"></a>00114 <span class="preprocessor">#define UIP_CONF_BYTE_ORDER      LITTLE_ENDIAN</span>
+<a name="l00115"></a>00115 <span class="preprocessor"></span><span class="comment"></span>
+<a name="l00116"></a>00116 <span class="comment">/**</span>
+<a name="l00117"></a>00117 <span class="comment"> * Logging on or off</span>
+<a name="l00118"></a>00118 <span class="comment"> *</span>
+<a name="l00119"></a>00119 <span class="comment"> * \hideinitializer</span>
+<a name="l00120"></a>00120 <span class="comment"> */</span>
+<a name="l00121"></a>00121 <span class="preprocessor">#define UIP_CONF_LOGGING         1</span>
+<a name="l00122"></a>00122 <span class="preprocessor"></span><span class="comment"></span>
+<a name="l00123"></a>00123 <span class="comment">/**</span>
+<a name="l00124"></a>00124 <span class="comment"> * UDP support on or off</span>
+<a name="l00125"></a>00125 <span class="comment"> *</span>
+<a name="l00126"></a>00126 <span class="comment"> * \hideinitializer</span>
+<a name="l00127"></a>00127 <span class="comment"> */</span>
+<a name="l00128"></a>00128 <span class="preprocessor">#define UIP_CONF_UDP             0</span>
+<a name="l00129"></a>00129 <span class="preprocessor"></span><span class="comment"></span>
+<a name="l00130"></a>00130 <span class="comment">/**</span>
+<a name="l00131"></a>00131 <span class="comment"> * UDP checksums on or off</span>
+<a name="l00132"></a>00132 <span class="comment"> *</span>
+<a name="l00133"></a>00133 <span class="comment"> * \hideinitializer</span>
+<a name="l00134"></a>00134 <span class="comment"> */</span>
+<a name="l00135"></a>00135 <span class="preprocessor">#define UIP_CONF_UDP_CHECKSUMS   1</span>
+<a name="l00136"></a>00136 <span class="preprocessor"></span><span class="comment"></span>
+<a name="l00137"></a>00137 <span class="comment">/**</span>
+<a name="l00138"></a>00138 <span class="comment"> * uIP statistics on or off</span>
+<a name="l00139"></a>00139 <span class="comment"> *</span>
+<a name="l00140"></a>00140 <span class="comment"> * \hideinitializer</span>
+<a name="l00141"></a>00141 <span class="comment"> */</span>
+<a name="l00142"></a>00142 <span class="preprocessor">#define UIP_CONF_STATISTICS      1</span>
+<a name="l00143"></a>00143 <span class="preprocessor"></span>
+<a name="l00144"></a>00144 <span class="comment">/* Here we include the header file for the application(s) we use in</span>
+<a name="l00145"></a>00145 <span class="comment">   our project. */</span>
+<a name="l00146"></a>00146 <span class="comment">/*#include "smtp.h"*/</span>
+<a name="l00147"></a>00147 <span class="comment">/*#include "hello-world.h"*/</span>
+<a name="l00148"></a>00148 <span class="comment">/*#include "telnetd.h"*/</span>
+<a name="l00149"></a>00149 <span class="preprocessor">#include "webserver.h"</span>
+<a name="l00150"></a>00150 <span class="comment">/*#include "dhcpc.h"*/</span>
+<a name="l00151"></a>00151 <span class="comment">/*#include "resolv.h"*/</span>
+<a name="l00152"></a>00152 <span class="comment">/*#include "webclient.h"*/</span>
+<a name="l00153"></a>00153 
+<a name="l00154"></a>00154 <span class="preprocessor">#endif </span><span class="comment">/* __UIP_CONF_H__ */</span>
+<a name="l00155"></a>00155 <span class="comment"></span>
+<a name="l00156"></a>00156 <span class="comment">/** @} */</span><span class="comment"></span>
+<a name="l00157"></a>00157 <span class="comment">/** @} */</span>
+</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 138 - 0
components/net/uip/doc/html/a00051.html

@@ -0,0 +1,138 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: uip-code-style.c</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<h1>uip-code-style.c</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/* This is the official code style of uIP. */</span>
+<a name="l00002"></a>00002 <span class="comment"></span>
+<a name="l00003"></a>00003 <span class="comment">/**</span>
+<a name="l00004"></a>00004 <span class="comment"> * \defgroup codestyle Coding style</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * This is how a Doxygen module is documented - start with a \defgroup</span>
+<a name="l00007"></a>00007 <span class="comment"> * Doxygen keyword at the beginning of the file to define a module,</span>
+<a name="l00008"></a>00008 <span class="comment"> * and use the \addtogroup Doxygen keyword in all other files that</span>
+<a name="l00009"></a>00009 <span class="comment"> * belong to the same module. Typically, the \defgroup is placed in</span>
+<a name="l00010"></a>00010 <span class="comment"> * the .h file and \addtogroup in the .c file.</span>
+<a name="l00011"></a>00011 <span class="comment"> *</span>
+<a name="l00012"></a>00012 <span class="comment"> * @{</span>
+<a name="l00013"></a>00013 <span class="comment"> */</span>
+<a name="l00014"></a>00014 <span class="comment"></span>
+<a name="l00015"></a>00015 <span class="comment">/**</span>
+<a name="l00016"></a>00016 <span class="comment"> * \file</span>
+<a name="l00017"></a>00017 <span class="comment"> *         A brief description of what this file is.</span>
+<a name="l00018"></a>00018 <span class="comment"> * \author</span>
+<a name="l00019"></a>00019 <span class="comment"> *         Adam Dunkels &lt;adam@sics.se&gt;</span>
+<a name="l00020"></a>00020 <span class="comment"> *</span>
+<a name="l00021"></a>00021 <span class="comment"> *         Every file that is part of a documented module has to have</span>
+<a name="l00022"></a>00022 <span class="comment"> *         a \file block, else it will not show up in the Doxygen</span>
+<a name="l00023"></a>00023 <span class="comment"> *         "Modules" * section.</span>
+<a name="l00024"></a>00024 <span class="comment"> */</span>
+<a name="l00025"></a>00025 
+<a name="l00026"></a>00026 <span class="comment">/* Single line comments look like this. */</span>
+<a name="l00027"></a>00027 
+<a name="l00028"></a>00028 <span class="comment">/*</span>
+<a name="l00029"></a>00029 <span class="comment"> * Multi-line comments look like this. Comments should prefferably be</span>
+<a name="l00030"></a>00030 <span class="comment"> * full sentences, filled to look like real paragraphs.</span>
+<a name="l00031"></a>00031 <span class="comment"> */</span>
+<a name="l00032"></a>00032 
+<a name="l00033"></a>00033 <span class="preprocessor">#include "<a class="code" href="a00136.html">uip.h</a>"</span>
+<a name="l00034"></a>00034 
+<a name="l00035"></a>00035 <span class="comment">/*</span>
+<a name="l00036"></a>00036 <span class="comment"> * Make sure that non-global variables are all maked with the static</span>
+<a name="l00037"></a>00037 <span class="comment"> * keyword. This keeps the size of the symbol table down.</span>
+<a name="l00038"></a>00038 <span class="comment"> */</span>
+<a name="l00039"></a>00039 <span class="keyword">static</span> <span class="keywordtype">int</span> flag;
+<a name="l00040"></a>00040 
+<a name="l00041"></a>00041 <span class="comment">/*</span>
+<a name="l00042"></a>00042 <span class="comment"> * All variables and functions that are visible outside of the file</span>
+<a name="l00043"></a>00043 <span class="comment"> * should have the module name prepended to them. This makes it easy</span>
+<a name="l00044"></a>00044 <span class="comment"> * to know where to look for function and variable definitions.</span>
+<a name="l00045"></a>00045 <span class="comment"> *</span>
+<a name="l00046"></a>00046 <span class="comment"> * Put dividers (a single-line comment consisting only of dashes)</span>
+<a name="l00047"></a>00047 <span class="comment"> * between functions.</span>
+<a name="l00048"></a>00048 <span class="comment"> */</span>
+<a name="l00049"></a>00049 <span class="comment">/*---------------------------------------------------------------------------*/</span><span class="comment"></span>
+<a name="l00050"></a>00050 <span class="comment">/**</span>
+<a name="l00051"></a>00051 <span class="comment"> * \brief      Use Doxygen documentation for functions.</span>
+<a name="l00052"></a>00052 <span class="comment"> * \param c    Briefly describe all parameters.</span>
+<a name="l00053"></a>00053 <span class="comment"> * \return     Briefly describe the return value.</span>
+<a name="l00054"></a>00054 <span class="comment"> * \retval 0   Functions that return a few specified values</span>
+<a name="l00055"></a>00055 <span class="comment"> * \retval 1   can use the \retval keyword instead of \return.</span>
+<a name="l00056"></a>00056 <span class="comment"> *</span>
+<a name="l00057"></a>00057 <span class="comment"> *             Put a longer description of what the function does</span>
+<a name="l00058"></a>00058 <span class="comment"> *             after the preamble of Doxygen keywords.</span>
+<a name="l00059"></a>00059 <span class="comment"> *</span>
+<a name="l00060"></a>00060 <span class="comment"> *             This template should always be used to document</span>
+<a name="l00061"></a>00061 <span class="comment"> *             functions. The text following the introduction is used</span>
+<a name="l00062"></a>00062 <span class="comment"> *             as the function's documentation.</span>
+<a name="l00063"></a>00063 <span class="comment"> *</span>
+<a name="l00064"></a>00064 <span class="comment"> *             Function prototypes have the return type on one line,</span>
+<a name="l00065"></a>00065 <span class="comment"> *             the name and arguments on one line (with no space</span>
+<a name="l00066"></a>00066 <span class="comment"> *             between the name and the first parenthesis), followed</span>
+<a name="l00067"></a>00067 <span class="comment"> *             by a single curly bracket on its own line.</span>
+<a name="l00068"></a>00068 <span class="comment"> */</span>
+<a name="l00069"></a>00069 <span class="keywordtype">void</span>
+<a name="l00070"></a>00070 code_style_example_function(<span class="keywordtype">void</span>)
+<a name="l00071"></a>00071 {
+<a name="l00072"></a>00072   <span class="comment">/*</span>
+<a name="l00073"></a>00073 <span class="comment">   * Local variables should always be declared at the start of the</span>
+<a name="l00074"></a>00074 <span class="comment">   * function.</span>
+<a name="l00075"></a>00075 <span class="comment">   */</span>
+<a name="l00076"></a>00076   <span class="keywordtype">int</span> i;                   <span class="comment">/* Use short variable names for loop</span>
+<a name="l00077"></a>00077 <span class="comment">                              counters. */</span>
+<a name="l00078"></a>00078 
+<a name="l00079"></a>00079   <span class="comment">/*</span>
+<a name="l00080"></a>00080 <span class="comment">   * There should be no space between keywords and the first</span>
+<a name="l00081"></a>00081 <span class="comment">   * parenthesis. There should be spaces around binary operators, no</span>
+<a name="l00082"></a>00082 <span class="comment">   * spaces between a unary operator and its operand.</span>
+<a name="l00083"></a>00083 <span class="comment">   *</span>
+<a name="l00084"></a>00084 <span class="comment">   * Curly brackets following for(), if(), do, and case() statements</span>
+<a name="l00085"></a>00085 <span class="comment">   * should follow the statement on the same line.</span>
+<a name="l00086"></a>00086 <span class="comment">   */</span>
+<a name="l00087"></a>00087   <span class="keywordflow">for</span>(i = 0; i &lt; 10; ++i) {
+<a name="l00088"></a>00088     <span class="comment">/*</span>
+<a name="l00089"></a>00089 <span class="comment">     * Always use full blocks (curly brackets) after if(), for(), and</span>
+<a name="l00090"></a>00090 <span class="comment">     * while() statements, even though the statement is a single line</span>
+<a name="l00091"></a>00091 <span class="comment">     * of code. This makes the code easier to read and modifications</span>
+<a name="l00092"></a>00092 <span class="comment">     * are less error prone.</span>
+<a name="l00093"></a>00093 <span class="comment">     */</span>
+<a name="l00094"></a>00094     <span class="keywordflow">if</span>(i == c) {
+<a name="l00095"></a>00095       <span class="keywordflow">return</span> c;           <span class="comment">/* No parentesis around return values. */</span>
+<a name="l00096"></a>00096     } <span class="keywordflow">else</span> {              <span class="comment">/* The else keyword is placed inbetween</span>
+<a name="l00097"></a>00097 <span class="comment">                             curly brackers, always on its own line. */</span>
+<a name="l00098"></a>00098       c++;
+<a name="l00099"></a>00099     }
+<a name="l00100"></a>00100   }
+<a name="l00101"></a>00101 }
+<a name="l00102"></a>00102 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00103"></a>00103 <span class="comment">/*</span>
+<a name="l00104"></a>00104 <span class="comment"> * Static (non-global) functions do not need Doxygen comments. The</span>
+<a name="l00105"></a>00105 <span class="comment"> * name should not be prepended with the module name - doing so would</span>
+<a name="l00106"></a>00106 <span class="comment"> * create confusion.</span>
+<a name="l00107"></a>00107 <span class="comment"> */</span>
+<a name="l00108"></a>00108 <span class="keyword">static</span> <span class="keywordtype">void</span>
+<a name="l00109"></a>00109 an_example_function(<span class="keywordtype">void</span>)
+<a name="l00110"></a>00110 {
+<a name="l00111"></a>00111   
+<a name="l00112"></a>00112 }
+<a name="l00113"></a>00113 <span class="comment">/*---------------------------------------------------------------------------*/</span>
+<a name="l00114"></a>00114 
+<a name="l00115"></a>00115 <span class="comment">/* The following stuff ends the \defgroup block at the beginning of</span>
+<a name="l00116"></a>00116 <span class="comment">   the file: */</span>
+<a name="l00117"></a>00117 <span class="comment"></span>
+<a name="l00118"></a>00118 <span class="comment">/** @} */</span>
+</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 78 - 0
components/net/uip/doc/html/a00077.html

@@ -0,0 +1,78 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: dhcpc_state Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>dhcpc_state Struct Reference</h1><!-- doxytag: class="dhcpc_state" --><hr><a name="_details"></a><h2>Detailed Description</h2>
+<dl compact><dt><b>Examples: </b></dt><dd>
+
+<p>
+<a class="el" href="a00048.html#_a0">dhcpc.c</a>, and <a class="el" href="a00049.html#_a43">dhcpc.h</a>.</dl>
+<p>
+
+<p>
+Definition at line <a class="el" href="a00169.html#l00039">39</a> of file <a class="el" href="a00169.html">dhcpc.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="31471b5e27bda51832d0fa49bd6d9b54"></a><!-- doxytag: member="dhcpc_state::pt" ref="31471b5e27bda51832d0fa49bd6d9b54" args="" -->
+<a class="el" href="a00084.html">pt</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00077.html#31471b5e27bda51832d0fa49bd6d9b54">pt</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e0b137a3875ad12a99e5e3e0e177fd12"></a><!-- doxytag: member="dhcpc_state::state" ref="e0b137a3875ad12a99e5e3e0e177fd12" args="" -->
+char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00077.html#e0b137a3875ad12a99e5e3e0e177fd12">state</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cfd36e02c7498d766ff802575e981612"></a><!-- doxytag: member="dhcpc_state::conn" ref="cfd36e02c7498d766ff802575e981612" args="" -->
+<a class="el" href="a00095.html">uip_udp_conn</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00077.html#cfd36e02c7498d766ff802575e981612">conn</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e80af46ceef63eab3c786525370ae720"></a><!-- doxytag: member="dhcpc_state::timer" ref="e80af46ceef63eab3c786525370ae720" args="" -->
+<a class="el" href="a00087.html">timer</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00077.html#e80af46ceef63eab3c786525370ae720">timer</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e707c39412e09d3a47f0b3c5dad33725"></a><!-- doxytag: member="dhcpc_state::ticks" ref="e707c39412e09d3a47f0b3c5dad33725" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00077.html#e707c39412e09d3a47f0b3c5dad33725">ticks</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2391bb18db5f620e0e9fb848ae5ba5e9"></a><!-- doxytag: member="dhcpc_state::mac_addr" ref="2391bb18db5f620e0e9fb848ae5ba5e9" args="" -->
+const void *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00077.html#2391bb18db5f620e0e9fb848ae5ba5e9">mac_addr</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5361ef75bfbdb469b5cc31f0060a2670"></a><!-- doxytag: member="dhcpc_state::mac_len" ref="5361ef75bfbdb469b5cc31f0060a2670" args="" -->
+int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00077.html#5361ef75bfbdb469b5cc31f0060a2670">mac_len</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="564bab93ef6a268a5de2fab885c1d32a"></a><!-- doxytag: member="dhcpc_state::serverid" ref="564bab93ef6a268a5de2fab885c1d32a" args="[4]" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00077.html#564bab93ef6a268a5de2fab885c1d32a">serverid</a> [4]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7a520a57d7d0541524f34a7685635597"></a><!-- doxytag: member="dhcpc_state::lease_time" ref="7a520a57d7d0541524f34a7685635597" args="[2]" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00077.html#7a520a57d7d0541524f34a7685635597">lease_time</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1d2f2751b0865045486c9aa59d0d0971"></a><!-- doxytag: member="dhcpc_state::ipaddr" ref="1d2f2751b0865045486c9aa59d0d0971" args="[2]" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00077.html#1d2f2751b0865045486c9aa59d0d0971">ipaddr</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="20541305548441e5dcb2e1e7e6f300eb"></a><!-- doxytag: member="dhcpc_state::netmask" ref="20541305548441e5dcb2e1e7e6f300eb" args="[2]" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00077.html#20541305548441e5dcb2e1e7e6f300eb">netmask</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27df2817055bc099821d96eb60a40b34"></a><!-- doxytag: member="dhcpc_state::dnsaddr" ref="27df2817055bc099821d96eb60a40b34" args="[2]" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00077.html#27df2817055bc099821d96eb60a40b34">dnsaddr</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5e16ca335dfd7394527f602da879fca2"></a><!-- doxytag: member="dhcpc_state::default_router" ref="5e16ca335dfd7394527f602da879fca2" args="[2]" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00077.html#5e16ca335dfd7394527f602da879fca2">default_router</a> [2]</td></tr>
+
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 51 - 0
components/net/uip/doc/html/a00078.html

@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: hello_world_state Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>hello_world_state Struct Reference<br>
+<small>
+[<a class="el" href="a00162.html">Hello, world</a>]</small>
+</h1><!-- doxytag: class="hello_world_state" --><hr><a name="_details"></a><h2>Detailed Description</h2>
+<dl compact><dt><b>Examples: </b></dt><dd>
+
+<p>
+<a class="el" href="a00036.html#_a100">hello-world.c</a>, and <a class="el" href="a00037.html#_a117">hello-world.h</a>.</dl>
+<p>
+
+<p>
+Definition at line <a class="el" href="a00171.html#l00036">36</a> of file <a class="el" href="a00171.html">hello-world.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a9825b5977b2d4dec66e6bd09e6ae6ea"></a><!-- doxytag: member="hello_world_state::p" ref="a9825b5977b2d4dec66e6bd09e6ae6ea" args="" -->
+<a class="el" href="a00082.html">psock</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00078.html#a9825b5977b2d4dec66e6bd09e6ae6ea">p</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b1b1436b50ed7638aece35f41421196"></a><!-- doxytag: member="hello_world_state::inputbuffer" ref="4b1b1436b50ed7638aece35f41421196" args="[10]" -->
+char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00078.html#4b1b1436b50ed7638aece35f41421196">inputbuffer</a> [10]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4da86e9feb5e5835eb15163c2cb61116"></a><!-- doxytag: member="hello_world_state::name" ref="4da86e9feb5e5835eb15163c2cb61116" args="[40]" -->
+char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00078.html#4da86e9feb5e5835eb15163c2cb61116">name</a> [40]</td></tr>
+
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 45 - 0
components/net/uip/doc/html/a00079.html

@@ -0,0 +1,45 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: httpd_cgi_call Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>httpd_cgi_call Struct Reference<br>
+<small>
+[<a class="el" href="a00164.html">Web server</a>]</small>
+</h1><!-- doxytag: class="httpd_cgi_call" --><hr><a name="_details"></a><h2>Detailed Description</h2>
+
+<p>
+
+<p>
+Definition at line <a class="el" href="a00183.html#l00060">60</a> of file <a class="el" href="a00183.html">httpd-cgi.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9a84c69ec5a4705ccb1ca99fcd120add"></a><!-- doxytag: member="httpd_cgi_call::name" ref="9a84c69ec5a4705ccb1ca99fcd120add" args="" -->
+const char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00079.html#9a84c69ec5a4705ccb1ca99fcd120add">name</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1513a9e88921750d2a611b518f6fc207"></a><!-- doxytag: member="httpd_cgi_call::function" ref="1513a9e88921750d2a611b518f6fc207" args="" -->
+const httpd_cgifunction&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00079.html#1513a9e88921750d2a611b518f6fc207">function</a></td></tr>
+
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 69 - 0
components/net/uip/doc/html/a00080.html

@@ -0,0 +1,69 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: httpd_state Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>httpd_state Struct Reference</h1><!-- doxytag: class="httpd_state" --><hr><a name="_details"></a><h2>Detailed Description</h2>
+
+<p>
+
+<p>
+Definition at line <a class="el" href="a00185.html#l00041">41</a> of file <a class="el" href="a00185.html">httpd.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c39694ece9526b84012f90f2bb00af9f"></a><!-- doxytag: member="httpd_state::timer" ref="c39694ece9526b84012f90f2bb00af9f" args="" -->
+unsigned char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00080.html#c39694ece9526b84012f90f2bb00af9f">timer</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9dd8edeece221c853a4c4516bf1b01c2"></a><!-- doxytag: member="httpd_state::sout" ref="9dd8edeece221c853a4c4516bf1b01c2" args="" -->
+<a class="el" href="a00082.html">psock</a> sin&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00080.html#9dd8edeece221c853a4c4516bf1b01c2">sout</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e261f08e1556287d241764fb2e99fc26"></a><!-- doxytag: member="httpd_state::scriptpt" ref="e261f08e1556287d241764fb2e99fc26" args="" -->
+<a class="el" href="a00084.html">pt</a> outputpt&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00080.html#e261f08e1556287d241764fb2e99fc26">scriptpt</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4c6f843219271d25766ee5969e435d1a"></a><!-- doxytag: member="httpd_state::inputbuf" ref="4c6f843219271d25766ee5969e435d1a" args="[50]" -->
+char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00080.html#4c6f843219271d25766ee5969e435d1a">inputbuf</a> [50]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="447eb700ea7a185e0f155934995d49e5"></a><!-- doxytag: member="httpd_state::filename" ref="447eb700ea7a185e0f155934995d49e5" args="[20]" -->
+char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00080.html#447eb700ea7a185e0f155934995d49e5">filename</a> [20]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="94fcc9f5c47f419040d849ce58beae35"></a><!-- doxytag: member="httpd_state::state" ref="94fcc9f5c47f419040d849ce58beae35" args="" -->
+char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00080.html#94fcc9f5c47f419040d849ce58beae35">state</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5e274a8f8b5fb2b3999c54fe27c76e46"></a><!-- doxytag: member="httpd_state::file" ref="5e274a8f8b5fb2b3999c54fe27c76e46" args="" -->
+httpd_fs_file&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00080.html#5e274a8f8b5fb2b3999c54fe27c76e46">file</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="468c04fff28e784f93ebc3f0849211dd"></a><!-- doxytag: member="httpd_state::len" ref="468c04fff28e784f93ebc3f0849211dd" args="" -->
+int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00080.html#468c04fff28e784f93ebc3f0849211dd">len</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="78f82878f3fd0e7401c7d7d3b3fefbef"></a><!-- doxytag: member="httpd_state::scriptptr" ref="78f82878f3fd0e7401c7d7d3b3fefbef" args="" -->
+char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00080.html#78f82878f3fd0e7401c7d7d3b3fefbef">scriptptr</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="16a3a3056f44b7245ce085b937a269dd"></a><!-- doxytag: member="httpd_state::scriptlen" ref="16a3a3056f44b7245ce085b937a269dd" args="" -->
+int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00080.html#16a3a3056f44b7245ce085b937a269dd">scriptlen</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6df929b448ea98bc44d41f5e96237bda"></a><!-- doxytag: member="httpd_state::count" ref="6df929b448ea98bc44d41f5e96237bda" args="" -->
+unsigned short&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00080.html#6df929b448ea98bc44d41f5e96237bda">count</a></td></tr>
+
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 51 - 0
components/net/uip/doc/html/a00081.html

@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: memb_blocks Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>memb_blocks Struct Reference<br>
+<small>
+[<a class="el" href="a00159.html">Memory block management functions</a>]</small>
+</h1><!-- doxytag: class="memb_blocks" --><hr><a name="_details"></a><h2>Detailed Description</h2>
+
+<p>
+
+<p>
+Definition at line <a class="el" href="a00187.html#l00105">105</a> of file <a class="el" href="a00187.html">memb.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b42c7af6114fde5d21206a2e18a7d3ee"></a><!-- doxytag: member="memb_blocks::size" ref="b42c7af6114fde5d21206a2e18a7d3ee" args="" -->
+unsigned short&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00081.html#b42c7af6114fde5d21206a2e18a7d3ee">size</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="164124d48fe85bc98d9a300382a5245d"></a><!-- doxytag: member="memb_blocks::num" ref="164124d48fe85bc98d9a300382a5245d" args="" -->
+unsigned short&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00081.html#164124d48fe85bc98d9a300382a5245d">num</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5595902fd42d874e35a70206fad8f6d0"></a><!-- doxytag: member="memb_blocks::count" ref="5595902fd42d874e35a70206fad8f6d0" args="" -->
+char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00081.html#5595902fd42d874e35a70206fad8f6d0">count</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b5801722740492e69bcc73687476009f"></a><!-- doxytag: member="memb_blocks::mem" ref="b5801722740492e69bcc73687476009f" args="" -->
+void *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00081.html#b5801722740492e69bcc73687476009f">mem</a></td></tr>
+
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 73 - 0
components/net/uip/doc/html/a00082.html

@@ -0,0 +1,73 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: psock Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>psock Struct Reference<br>
+<small>
+[<a class="el" href="a00158.html">Protosockets library</a>]</small>
+</h1><!-- doxytag: class="psock" --><code>#include &lt;<a class="el" href="a00193.html">psock.h</a>&gt;</code>
+<p>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+The representation of a protosocket. 
+<p>
+The protosocket structrure is an opaque structure with no user-visible elements. <dl compact><dt><b>Examples: </b></dt><dd>
+
+<p>
+<a class="el" href="a00037.html#_a118">hello-world.h</a>.</dl>
+<p>
+
+<p>
+Definition at line <a class="el" href="a00193.html#l00106">106</a> of file <a class="el" href="a00193.html">psock.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="17aacf7c5e2046c1f3ab50faa1b2f7eb"></a><!-- doxytag: member="psock::psockpt" ref="17aacf7c5e2046c1f3ab50faa1b2f7eb" args="" -->
+<a class="el" href="a00084.html">pt</a> <a class="el" href="a00084.html">pt</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00082.html#17aacf7c5e2046c1f3ab50faa1b2f7eb">psockpt</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="31f25efccba9fd043047133d0d0ba5ab"></a><!-- doxytag: member="psock::sendptr" ref="31f25efccba9fd043047133d0d0ba5ab" args="" -->
+const <a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00082.html#31f25efccba9fd043047133d0d0ba5ab">sendptr</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b973f2e16c2883a8a0164d716cce5a31"></a><!-- doxytag: member="psock::readptr" ref="b973f2e16c2883a8a0164d716cce5a31" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00082.html#b973f2e16c2883a8a0164d716cce5a31">readptr</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c3d1bfbb1abde31973c015de97ce2f84"></a><!-- doxytag: member="psock::bufptr" ref="c3d1bfbb1abde31973c015de97ce2f84" args="" -->
+char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00082.html#c3d1bfbb1abde31973c015de97ce2f84">bufptr</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="19b82696bd84a803250cbf9812f2f125"></a><!-- doxytag: member="psock::sendlen" ref="19b82696bd84a803250cbf9812f2f125" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00082.html#19b82696bd84a803250cbf9812f2f125">sendlen</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a408ca8630154ebd039f37a828399f7b"></a><!-- doxytag: member="psock::readlen" ref="a408ca8630154ebd039f37a828399f7b" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00082.html#a408ca8630154ebd039f37a828399f7b">readlen</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d6bd03239291629676e4c0286ebb650f"></a><!-- doxytag: member="psock::buf" ref="d6bd03239291629676e4c0286ebb650f" args="" -->
+<a class="el" href="a00083.html">psock_buf</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00082.html#d6bd03239291629676e4c0286ebb650f">buf</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a6bfaf327ce839ba70accd71014398d0"></a><!-- doxytag: member="psock::bufsize" ref="a6bfaf327ce839ba70accd71014398d0" args="" -->
+unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00082.html#a6bfaf327ce839ba70accd71014398d0">bufsize</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fda184638130452f3570966acc5b97f9"></a><!-- doxytag: member="psock::state" ref="fda184638130452f3570966acc5b97f9" args="" -->
+unsigned char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00082.html#fda184638130452f3570966acc5b97f9">state</a></td></tr>
+
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 45 - 0
components/net/uip/doc/html/a00083.html

@@ -0,0 +1,45 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: psock_buf Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>psock_buf Struct Reference<br>
+<small>
+[<a class="el" href="a00158.html">Protosockets library</a>]</small>
+</h1><!-- doxytag: class="psock_buf" --><hr><a name="_details"></a><h2>Detailed Description</h2>
+
+<p>
+
+<p>
+Definition at line <a class="el" href="a00193.html#l00095">95</a> of file <a class="el" href="a00193.html">psock.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5e8637b1514d03eb3eb12dc9a502e27e"></a><!-- doxytag: member="psock_buf::ptr" ref="5e8637b1514d03eb3eb12dc9a502e27e" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00083.html#5e8637b1514d03eb3eb12dc9a502e27e">ptr</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="20fae11b540a561c622a0d74cb4b9f97"></a><!-- doxytag: member="psock_buf::left" ref="20fae11b540a561c622a0d74cb4b9f97" args="" -->
+unsigned short&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00083.html#20fae11b540a561c622a0d74cb4b9f97">left</a></td></tr>
+
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 45 - 0
components/net/uip/doc/html/a00084.html

@@ -0,0 +1,45 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: pt Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>pt Struct Reference<br>
+<small>
+[<a class="el" href="a00142.html">Protothreads</a>]</small>
+</h1><!-- doxytag: class="pt" --><hr><a name="_details"></a><h2>Detailed Description</h2>
+<dl compact><dt><b>Examples: </b></dt><dd>
+
+<p>
+<a class="el" href="a00049.html#_a44">dhcpc.h</a>.</dl>
+<p>
+
+<p>
+Definition at line <a class="el" href="a00194.html#l00054">54</a> of file <a class="el" href="a00194.html">pt.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c3fa0fa86689e3e7c039a16c16861dbe"></a><!-- doxytag: member="pt::lc" ref="c3fa0fa86689e3e7c039a16c16861dbe" args="" -->
+<a class="el" href="a00155.html#g3983e0c026396d5c4506779d770007ba">lc_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00084.html#c3fa0fa86689e3e7c039a16c16861dbe">lc</a></td></tr>
+
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 69 - 0
components/net/uip/doc/html/a00085.html

@@ -0,0 +1,69 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: smtp_state Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>smtp_state Struct Reference<br>
+<small>
+[<a class="el" href="a00161.html">SMTP E-mail sender</a>]</small>
+</h1><!-- doxytag: class="smtp_state" --><hr><a name="_details"></a><h2>Detailed Description</h2>
+<dl compact><dt><b>Examples: </b></dt><dd>
+
+<p>
+<a class="el" href="a00037.html#_a122">hello-world.h</a>, <a class="el" href="a00038.html#_a163">smtp.c</a>, and <a class="el" href="a00039.html#_a199">smtp.h</a>.</dl>
+<p>
+
+<p>
+Definition at line <a class="el" href="a00175.html#l00081">81</a> of file <a class="el" href="a00175.html">smtp.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0bb4f34164e7207c2db26b77f23ccfff"></a><!-- doxytag: member="smtp_state::state" ref="0bb4f34164e7207c2db26b77f23ccfff" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00085.html#0bb4f34164e7207c2db26b77f23ccfff">state</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3592a1f5ae100db2ed9c0810b41c7bc7"></a><!-- doxytag: member="smtp_state::to" ref="3592a1f5ae100db2ed9c0810b41c7bc7" args="" -->
+char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00085.html#3592a1f5ae100db2ed9c0810b41c7bc7">to</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="668cab7d54ff0a2fc2a2179ca06b0798"></a><!-- doxytag: member="smtp_state::from" ref="668cab7d54ff0a2fc2a2179ca06b0798" args="" -->
+char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00085.html#668cab7d54ff0a2fc2a2179ca06b0798">from</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="503c2994a4e52300516e2b820f0fc65b"></a><!-- doxytag: member="smtp_state::subject" ref="503c2994a4e52300516e2b820f0fc65b" args="" -->
+char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00085.html#503c2994a4e52300516e2b820f0fc65b">subject</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="04833004cec509a41c502429df308e35"></a><!-- doxytag: member="smtp_state::msg" ref="04833004cec509a41c502429df308e35" args="" -->
+char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00085.html#04833004cec509a41c502429df308e35">msg</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a312da7b5f6441140721ec7e55f345a8"></a><!-- doxytag: member="smtp_state::msglen" ref="a312da7b5f6441140721ec7e55f345a8" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00085.html#a312da7b5f6441140721ec7e55f345a8">msglen</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="68204df6bde3e3c27271ebde10579a57"></a><!-- doxytag: member="smtp_state::sentlen" ref="68204df6bde3e3c27271ebde10579a57" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00085.html#68204df6bde3e3c27271ebde10579a57">sentlen</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0560495c60c68d62617ff1f3d0c424a4"></a><!-- doxytag: member="smtp_state::textlen" ref="0560495c60c68d62617ff1f3d0c424a4" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00085.html#0560495c60c68d62617ff1f3d0c424a4">textlen</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5ed2615cec9e633d90ac5968771976eb"></a><!-- doxytag: member="smtp_state::sendptr" ref="5ed2615cec9e633d90ac5968771976eb" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00085.html#5ed2615cec9e633d90ac5968771976eb">sendptr</a></td></tr>
+
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 54 - 0
components/net/uip/doc/html/a00086.html

@@ -0,0 +1,54 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: telnetd_state Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>telnetd_state Struct Reference</h1><!-- doxytag: class="telnetd_state" --><hr><a name="_details"></a><h2>Detailed Description</h2>
+<dl compact><dt><b>Examples: </b></dt><dd>
+
+<p>
+<a class="el" href="a00044.html#_a207">telnetd.c</a>, and <a class="el" href="a00045.html#_a242">telnetd.h</a>.</dl>
+<p>
+
+<p>
+Definition at line <a class="el" href="a00179.html#l00049">49</a> of file <a class="el" href="a00179.html">telnetd.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cca775e46d4405b7775b328f7694f7e7"></a><!-- doxytag: member="telnetd_state::lines" ref="cca775e46d4405b7775b328f7694f7e7" args="[TELNETD_CONF_NUMLINES]" -->
+char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a> [TELNETD_CONF_NUMLINES]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="54a466311575a727830a92a6c3621cb2"></a><!-- doxytag: member="telnetd_state::buf" ref="54a466311575a727830a92a6c3621cb2" args="[TELNETD_CONF_LINELEN]" -->
+char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00086.html#54a466311575a727830a92a6c3621cb2">buf</a> [TELNETD_CONF_LINELEN]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5eced097547fd3fac4ba2a255493d921"></a><!-- doxytag: member="telnetd_state::bufptr" ref="5eced097547fd3fac4ba2a255493d921" args="" -->
+char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d85fc90c30d1fc37c63c4844be5fe09d"></a><!-- doxytag: member="telnetd_state::numsent" ref="d85fc90c30d1fc37c63c4844be5fe09d" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00086.html#d85fc90c30d1fc37c63c4844be5fe09d">numsent</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="41bf109b6a45328d5744c0a76563fb6c"></a><!-- doxytag: member="telnetd_state::state" ref="41bf109b6a45328d5744c0a76563fb6c" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a></td></tr>
+
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 52 - 0
components/net/uip/doc/html/a00087.html

@@ -0,0 +1,52 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: timer Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>timer Struct Reference<br>
+<small>
+[<a class="el" href="a00156.html">Timer library</a>]</small>
+</h1><!-- doxytag: class="timer" --><code>#include &lt;<a class="el" href="a00196.html">timer.h</a>&gt;</code>
+<p>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+A timer. 
+<p>
+This structure is used for declaring a timer. The timer must be set with <a class="el" href="a00156.html#g6614d96fdfcd95c95ec6e6f63071ff51">timer_set()</a> before it can be used. <dl compact><dt><b>Examples: </b></dt><dd>
+
+<p>
+<a class="el" href="a00049.html#_a49">dhcpc.h</a>, <a class="el" href="a00042.html#_a61">example-mainloop-with-arp.c</a>, <a class="el" href="a00043.html#_a85">example-mainloop-without-arp.c</a>, and <a class="el" href="a00041.html#_a308">webclient.h</a>.</dl>
+<p>
+
+<p>
+Definition at line <a class="el" href="a00196.html#l00074">74</a> of file <a class="el" href="a00196.html">timer.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8eb428c05bc1dee022246a3063d277c"></a><!-- doxytag: member="timer::start" ref="e8eb428c05bc1dee022246a3063d277c" args="" -->
+clock_time_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00087.html#e8eb428c05bc1dee022246a3063d277c">start</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fe557d333c06cf65f52023f45f5b0a3a"></a><!-- doxytag: member="timer::interval" ref="fe557d333c06cf65f52023f45f5b0a3a" args="" -->
+clock_time_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00087.html#fe557d333c06cf65f52023f45f5b0a3a">interval</a></td></tr>
+
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 103 - 0
components/net/uip/doc/html/a00088.html

@@ -0,0 +1,103 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: uip_conn Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>uip_conn Struct Reference<br>
+<small>
+[<a class="el" href="a00150.html">The uIP TCP/IP stack</a>]</small>
+</h1><!-- doxytag: class="uip_conn" --><code>#include &lt;<a class="el" href="a00202.html">uip.h</a>&gt;</code>
+<p>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+Representation of a uIP TCP connection. 
+<p>
+The <a class="el" href="a00088.html">uip_conn</a> structure is used for identifying a connection. All but one field in the structure are to be considered read-only by an application. The only exception is the appstate field whos purpose is to let the application store application-specific state (e.g., file pointers) for the connection. The type of this field is configured in the "uipopt.h" header file. 
+<p>
+
+<p>
+Definition at line <a class="el" href="a00202.html#l01153">1153</a> of file <a class="el" href="a00202.html">uip.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="79510aa86d3fa0a0fc6cfc49b1da7279"></a><!-- doxytag: member="uip_conn::ripaddr" ref="79510aa86d3fa0a0fc6cfc49b1da7279" args="" -->
+<a class="el" href="a00150.html#g1ef35301f43a5bbb9f89f07b5a36b9a0">uip_ipaddr_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00088.html#79510aa86d3fa0a0fc6cfc49b1da7279">ripaddr</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The IP address of the remote host. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0cd09beee671e7e9efb0b4aced10249e"></a><!-- doxytag: member="uip_conn::lport" ref="0cd09beee671e7e9efb0b4aced10249e" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00088.html#0cd09beee671e7e9efb0b4aced10249e">lport</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The local TCP port, in network byte order. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1df6aa054ef2fa634ac4c6f418228285"></a><!-- doxytag: member="uip_conn::rport" ref="1df6aa054ef2fa634ac4c6f418228285" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00088.html#1df6aa054ef2fa634ac4c6f418228285">rport</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The local remote TCP port, in network byte order. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="70297b3e6d4eaae7bd828cb50bd1efe3"></a><!-- doxytag: member="uip_conn::rcv_nxt" ref="70297b3e6d4eaae7bd828cb50bd1efe3" args="[4]" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00088.html#70297b3e6d4eaae7bd828cb50bd1efe3">rcv_nxt</a> [4]</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The sequence number that we expect to receive next. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f6b08a5ba2a8d75ca7279e2056aa8c6"></a><!-- doxytag: member="uip_conn::snd_nxt" ref="8f6b08a5ba2a8d75ca7279e2056aa8c6" args="[4]" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00088.html#8f6b08a5ba2a8d75ca7279e2056aa8c6">snd_nxt</a> [4]</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The sequence number that was last sent by us. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ef3ae2764714bf90620075c374c262e"></a><!-- doxytag: member="uip_conn::len" ref="0ef3ae2764714bf90620075c374c262e" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00088.html#0ef3ae2764714bf90620075c374c262e">len</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Length of the data that was previously sent. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3347ef1b6e8581402445d1a0280c7a14"></a><!-- doxytag: member="uip_conn::mss" ref="3347ef1b6e8581402445d1a0280c7a14" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00088.html#3347ef1b6e8581402445d1a0280c7a14">mss</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Current maximum segment size for the connection. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db7a3fadb68df5fdd37e8b91a2c751ea"></a><!-- doxytag: member="uip_conn::initialmss" ref="db7a3fadb68df5fdd37e8b91a2c751ea" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00088.html#db7a3fadb68df5fdd37e8b91a2c751ea">initialmss</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Initial maximum segment size for the connection. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ef661afb3aa82f0437d2ed8d3c20be76"></a><!-- doxytag: member="uip_conn::sa" ref="ef661afb3aa82f0437d2ed8d3c20be76" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00088.html#ef661afb3aa82f0437d2ed8d3c20be76">sa</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Retransmission time-out calculation state variable. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eb9fcbd3c9b0a795dcd63f33c323d65c"></a><!-- doxytag: member="uip_conn::sv" ref="eb9fcbd3c9b0a795dcd63f33c323d65c" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00088.html#eb9fcbd3c9b0a795dcd63f33c323d65c">sv</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Retransmission time-out calculation state variable. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e3aa9cc25e45b663e6aabc54c013019e"></a><!-- doxytag: member="uip_conn::rto" ref="e3aa9cc25e45b663e6aabc54c013019e" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00088.html#e3aa9cc25e45b663e6aabc54c013019e">rto</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Retransmission time-out. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a5f58074435cdc180f17de69651beebd"></a><!-- doxytag: member="uip_conn::tcpstateflags" ref="a5f58074435cdc180f17de69651beebd" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00088.html#a5f58074435cdc180f17de69651beebd">tcpstateflags</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">TCP state and flags. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2d9732cf5752d30bd11cb25dc7d0c8d3"></a><!-- doxytag: member="uip_conn::timer" ref="2d9732cf5752d30bd11cb25dc7d0c8d3" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00088.html#2d9732cf5752d30bd11cb25dc7d0c8d3">timer</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The retransmission timer. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4289c59840b128f2f6526e9da2711d47"></a><!-- doxytag: member="uip_conn::nrtx" ref="4289c59840b128f2f6526e9da2711d47" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00088.html#4289c59840b128f2f6526e9da2711d47">nrtx</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The number of retransmissions for the last segment sent. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="97f9e1fda815bfb8b1f4577c355ade20"></a><!-- doxytag: member="uip_conn::appstate" ref="97f9e1fda815bfb8b1f4577c355ade20" args="" -->
+<a class="el" href="a00085.html">uip_tcp_appstate_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00088.html#97f9e1fda815bfb8b1f4577c355ade20">appstate</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The application state. <br></td></tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 44 - 0
components/net/uip/doc/html/a00089.html

@@ -0,0 +1,44 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: uip_eth_addr Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>uip_eth_addr Struct Reference<br>
+<small>
+[<a class="el" href="a00150.html">The uIP TCP/IP stack</a>]</small>
+</h1><!-- doxytag: class="uip_eth_addr" --><code>#include &lt;<a class="el" href="a00202.html">uip.h</a>&gt;</code>
+<p>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+Representation of a 48-bit Ethernet address. 
+<p>
+
+<p>
+Definition at line <a class="el" href="a00202.html#l01542">1542</a> of file <a class="el" href="a00202.html">uip.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aacd5fa1806e0f0dd0bc96dd36507ad8"></a><!-- doxytag: member="uip_eth_addr::addr" ref="aacd5fa1806e0f0dd0bc96dd36507ad8" args="[6]" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00089.html#aacd5fa1806e0f0dd0bc96dd36507ad8">addr</a> [6]</td></tr>
+
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 50 - 0
components/net/uip/doc/html/a00090.html

@@ -0,0 +1,50 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: uip_eth_hdr Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>uip_eth_hdr Struct Reference<br>
+<small>
+[<a class="el" href="a00152.html">uIP Address Resolution Protocol</a>]</small>
+</h1><!-- doxytag: class="uip_eth_hdr" --><code>#include &lt;<a class="el" href="a00205.html">uip_arp.h</a>&gt;</code>
+<p>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+The Ethernet header. 
+<p>
+
+<p>
+Definition at line <a class="el" href="a00205.html#l00063">63</a> of file <a class="el" href="a00205.html">uip_arp.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b684c17bf48c8e3b3fcf97b06b4c6ee1"></a><!-- doxytag: member="uip_eth_hdr::dest" ref="b684c17bf48c8e3b3fcf97b06b4c6ee1" args="" -->
+<a class="el" href="a00089.html">uip_eth_addr</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00090.html#b684c17bf48c8e3b3fcf97b06b4c6ee1">dest</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1abbbe7bc5d7d033c727691528b85b8d"></a><!-- doxytag: member="uip_eth_hdr::src" ref="1abbbe7bc5d7d033c727691528b85b8d" args="" -->
+<a class="el" href="a00089.html">uip_eth_addr</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00090.html#1abbbe7bc5d7d033c727691528b85b8d">src</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c9273cc1fcdaeeddc523ca9f34977e06"></a><!-- doxytag: member="uip_eth_hdr::type" ref="c9273cc1fcdaeeddc523ca9f34977e06" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00090.html#c9273cc1fcdaeeddc523ca9f34977e06">type</a></td></tr>
+
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 84 - 0
components/net/uip/doc/html/a00091.html

@@ -0,0 +1,84 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: uip_icmpip_hdr Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>uip_icmpip_hdr Struct Reference<br>
+<small>
+[<a class="el" href="a00150.html">The uIP TCP/IP stack</a>]</small>
+</h1><!-- doxytag: class="uip_icmpip_hdr" --><hr><a name="_details"></a><h2>Detailed Description</h2>
+
+<p>
+
+<p>
+Definition at line <a class="el" href="a00202.html#l01423">1423</a> of file <a class="el" href="a00202.html">uip.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7d472d8b3c41618d39c93c4ca92fb3f4"></a><!-- doxytag: member="uip_icmpip_hdr::vhl" ref="7d472d8b3c41618d39c93c4ca92fb3f4" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00091.html#7d472d8b3c41618d39c93c4ca92fb3f4">vhl</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a3f2d9cb20290019b2743e8df31a2f8b"></a><!-- doxytag: member="uip_icmpip_hdr::tos" ref="a3f2d9cb20290019b2743e8df31a2f8b" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00091.html#a3f2d9cb20290019b2743e8df31a2f8b">tos</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b15853725b233d526b291db0347d4ecd"></a><!-- doxytag: member="uip_icmpip_hdr::len" ref="b15853725b233d526b291db0347d4ecd" args="[2]" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00091.html#b15853725b233d526b291db0347d4ecd">len</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="308463cc7b3d45d2dbcdcedd4cde9bb9"></a><!-- doxytag: member="uip_icmpip_hdr::ipid" ref="308463cc7b3d45d2dbcdcedd4cde9bb9" args="[2]" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00091.html#308463cc7b3d45d2dbcdcedd4cde9bb9">ipid</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4619e69ec86a47f6abe945b39ec7f63a"></a><!-- doxytag: member="uip_icmpip_hdr::ipoffset" ref="4619e69ec86a47f6abe945b39ec7f63a" args="[2]" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00091.html#4619e69ec86a47f6abe945b39ec7f63a">ipoffset</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="55be3d5413ce49c5c4f5576def12d7ec"></a><!-- doxytag: member="uip_icmpip_hdr::ttl" ref="55be3d5413ce49c5c4f5576def12d7ec" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00091.html#55be3d5413ce49c5c4f5576def12d7ec">ttl</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="55e7764a9f6ed05aaa98076b9f6770a5"></a><!-- doxytag: member="uip_icmpip_hdr::proto" ref="55e7764a9f6ed05aaa98076b9f6770a5" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00091.html#55e7764a9f6ed05aaa98076b9f6770a5">proto</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="babb9c2be394477af97f79507bcb4c86"></a><!-- doxytag: member="uip_icmpip_hdr::ipchksum" ref="babb9c2be394477af97f79507bcb4c86" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00091.html#babb9c2be394477af97f79507bcb4c86">ipchksum</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ec6a6cbcbfd191d393738c16d54e5e1"></a><!-- doxytag: member="uip_icmpip_hdr::srcipaddr" ref="0ec6a6cbcbfd191d393738c16d54e5e1" args="[2]" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00091.html#0ec6a6cbcbfd191d393738c16d54e5e1">srcipaddr</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e27f4949613fe3c1de5a839af01d99dd"></a><!-- doxytag: member="uip_icmpip_hdr::destipaddr" ref="e27f4949613fe3c1de5a839af01d99dd" args="[2]" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00091.html#e27f4949613fe3c1de5a839af01d99dd">destipaddr</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa0fe6ca88f692d22af70ff007411252"></a><!-- doxytag: member="uip_icmpip_hdr::type" ref="fa0fe6ca88f692d22af70ff007411252" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00091.html#fa0fe6ca88f692d22af70ff007411252">type</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="266ea23d75c83f15b915ce54100e51c5"></a><!-- doxytag: member="uip_icmpip_hdr::icode" ref="266ea23d75c83f15b915ce54100e51c5" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00091.html#266ea23d75c83f15b915ce54100e51c5">icode</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="805f8fd5533a6d4b6793e0645005da4c"></a><!-- doxytag: member="uip_icmpip_hdr::icmpchksum" ref="805f8fd5533a6d4b6793e0645005da4c" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00091.html#805f8fd5533a6d4b6793e0645005da4c">icmpchksum</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a6d51f3fa5da9b7f9cd37ae69600c04a"></a><!-- doxytag: member="uip_icmpip_hdr::id" ref="a6d51f3fa5da9b7f9cd37ae69600c04a" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00091.html#a6d51f3fa5da9b7f9cd37ae69600c04a">id</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="967def494c68cfc8a08d5a6c4dbbc25d"></a><!-- doxytag: member="uip_icmpip_hdr::seqno" ref="967def494c68cfc8a08d5a6c4dbbc25d" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00091.html#967def494c68cfc8a08d5a6c4dbbc25d">seqno</a></td></tr>
+
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 39 - 0
components/net/uip/doc/html/a00092.html

@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: uip_neighbor_addr Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>uip_neighbor_addr Struct Reference</h1><!-- doxytag: class="uip_neighbor_addr" --><hr><a name="_details"></a><h2>Detailed Description</h2>
+
+<p>
+
+<p>
+Definition at line <a class="el" href="a00198.html#l00047">47</a> of file <a class="el" href="a00198.html">uip-neighbor.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4dc3294d67d705f7248ef57e4259424f"></a><!-- doxytag: member="uip_neighbor_addr::addr" ref="4dc3294d67d705f7248ef57e4259424f" args="" -->
+<a class="el" href="a00089.html">uip_eth_addr</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00092.html#4dc3294d67d705f7248ef57e4259424f">addr</a></td></tr>
+
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 143 - 0
components/net/uip/doc/html/a00093.html

@@ -0,0 +1,143 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: uip_stats Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>uip_stats Struct Reference<br>
+<small>
+[<a class="el" href="a00150.html">The uIP TCP/IP stack</a>]</small>
+</h1><!-- doxytag: class="uip_stats" --><code>#include &lt;<a class="el" href="a00202.html">uip.h</a>&gt;</code>
+<p>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+The structure holding the TCP/IP statistics that are gathered if UIP_STATISTICS is set to 1. 
+<p>
+
+<p>
+Definition at line <a class="el" href="a00202.html#l01232">1232</a> of file <a class="el" href="a00202.html">uip.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap><a class="anchor" name="1deb2899508216804823498a69378118"></a><!-- doxytag: member="uip_stats::ip" ref="1deb2899508216804823498a69378118" args="" -->
+struct {</td></tr>
+
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#5d8996950cdf3d8130cc3ad340eb9dff">drop</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of dropped packets at the IP layer. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#7f7bb2145afba5df00c6e10ddefa8ae1">recv</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of received packets at the IP layer. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#dc69abadd5aa07c7d74f9292db2cd93c">sent</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of sent packets at the IP layer. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#b93e351c3abba0c700b26b7b07e9527d">vhlerr</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of packets dropped due to wrong IP version or header length. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#0c816f34c0187f2154c91a18d3ad87c8">hblenerr</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of packets dropped due to wrong IP length, high byte. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#6157452bdc9921f44b2e22e4b5969258">lblenerr</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of packets dropped due to wrong IP length, low byte. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#8082509468b2ac80ed7746aa1a5bc4f7">fragerr</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of packets dropped since they were IP fragments. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#7675e6b9adbddbd545d3aac8ca092fbb">chkerr</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of packets dropped due to IP checksum errors. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#b4622e2599ff3a592db09219b2641682">protoerr</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of packets dropped since they were neither ICMP, UDP nor TCP. <br></td></tr>
+<tr><td class="memItemLeft" nowrap valign="top">}&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00093.html#1deb2899508216804823498a69378118">ip</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">IP statistics. <br></td></tr>
+<tr><td class="memItemLeft" nowrap><a class="anchor" name="3983b45977630418d3038231aa8b68ed"></a><!-- doxytag: member="uip_stats::icmp" ref="3983b45977630418d3038231aa8b68ed" args="" -->
+struct {</td></tr>
+
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#5d8996950cdf3d8130cc3ad340eb9dff">drop</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of dropped ICMP packets. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#7f7bb2145afba5df00c6e10ddefa8ae1">recv</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of received ICMP packets. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#dc69abadd5aa07c7d74f9292db2cd93c">sent</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of sent ICMP packets. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#8da121d6e50992ec55778f9b2141552d">typeerr</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of ICMP packets with a wrong type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap valign="top">}&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00093.html#3983b45977630418d3038231aa8b68ed">icmp</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">ICMP statistics. <br></td></tr>
+<tr><td class="memItemLeft" nowrap><a class="anchor" name="e292b8977f6b81265bf14e1676face3e"></a><!-- doxytag: member="uip_stats::tcp" ref="e292b8977f6b81265bf14e1676face3e" args="" -->
+struct {</td></tr>
+
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#5d8996950cdf3d8130cc3ad340eb9dff">drop</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of dropped TCP segments. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#7f7bb2145afba5df00c6e10ddefa8ae1">recv</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of recived TCP segments. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#dc69abadd5aa07c7d74f9292db2cd93c">sent</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of sent TCP segments. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#7675e6b9adbddbd545d3aac8ca092fbb">chkerr</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of TCP segments with a bad checksum. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#7a58d95f7f7827789ff52500e3d16c34">ackerr</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of TCP segments with a bad ACK number. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#b6e9a75167bdddd561373bc5b6ef501c">rst</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of recevied TCP RST (reset) segments. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#3ad48284f7a91f78bb24096aad89056e">rexmit</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of retransmitted TCP segments. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#494ea6767a8a8fab7abe96b799d6c3b3">syndrop</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of dropped SYNs due to too few connections was avaliable. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#e9205a565ea3c911a785fc4e87c91a58">synrst</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of SYNs for closed ports, triggering a RST. <br></td></tr>
+<tr><td class="memItemLeft" nowrap valign="top">}&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00093.html#e292b8977f6b81265bf14e1676face3e">tcp</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">TCP statistics. <br></td></tr>
+<tr><td class="memItemLeft" nowrap><a class="anchor" name="4f39f0fe6a820d260fe6cddf9ccaa832"></a><!-- doxytag: member="uip_stats::udp" ref="4f39f0fe6a820d260fe6cddf9ccaa832" args="" -->
+struct {</td></tr>
+
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#5d8996950cdf3d8130cc3ad340eb9dff">drop</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of dropped UDP segments. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#7f7bb2145afba5df00c6e10ddefa8ae1">recv</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of recived UDP segments. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#dc69abadd5aa07c7d74f9292db2cd93c">sent</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of sent UDP segments. <br></td></tr>
+<tr><td class="memItemLeft" nowrap>&nbsp;&nbsp;&nbsp;<a class="el" href="a00153.html#g727459e5c4f777543c81ffffa3df3f0c">uip_stats_t</a>&nbsp;&nbsp;&nbsp;<a class="el" href="a00093.html#7675e6b9adbddbd545d3aac8ca092fbb">chkerr</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of UDP segments with a bad checksum. <br></td></tr>
+<tr><td class="memItemLeft" nowrap valign="top">}&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00093.html#4f39f0fe6a820d260fe6cddf9ccaa832">udp</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">UDP statistics. <br></td></tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 99 - 0
components/net/uip/doc/html/a00094.html

@@ -0,0 +1,99 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: uip_tcpip_hdr Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>uip_tcpip_hdr Struct Reference<br>
+<small>
+[<a class="el" href="a00150.html">The uIP TCP/IP stack</a>]</small>
+</h1><!-- doxytag: class="uip_tcpip_hdr" --><hr><a name="_details"></a><h2>Detailed Description</h2>
+
+<p>
+
+<p>
+Definition at line <a class="el" href="a00202.html#l01386">1386</a> of file <a class="el" href="a00202.html">uip.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e1e60d56ea87dfa09230e25ca5ecf2fc"></a><!-- doxytag: member="uip_tcpip_hdr::vhl" ref="e1e60d56ea87dfa09230e25ca5ecf2fc" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#e1e60d56ea87dfa09230e25ca5ecf2fc">vhl</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8cf0ca17b115ff2e3071b3fabcc43b53"></a><!-- doxytag: member="uip_tcpip_hdr::tos" ref="8cf0ca17b115ff2e3071b3fabcc43b53" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#8cf0ca17b115ff2e3071b3fabcc43b53">tos</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e57281f5bef284bc9545834ef8ed4a96"></a><!-- doxytag: member="uip_tcpip_hdr::len" ref="e57281f5bef284bc9545834ef8ed4a96" args="[2]" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#e57281f5bef284bc9545834ef8ed4a96">len</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7a59f0dad059786238d8ab604630e7f3"></a><!-- doxytag: member="uip_tcpip_hdr::ipid" ref="7a59f0dad059786238d8ab604630e7f3" args="[2]" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#7a59f0dad059786238d8ab604630e7f3">ipid</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="85d7f35662f7be20cd84e789a290dd4b"></a><!-- doxytag: member="uip_tcpip_hdr::ipoffset" ref="85d7f35662f7be20cd84e789a290dd4b" args="[2]" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#85d7f35662f7be20cd84e789a290dd4b">ipoffset</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0f27e16ddcf7199d514968204966f559"></a><!-- doxytag: member="uip_tcpip_hdr::ttl" ref="0f27e16ddcf7199d514968204966f559" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#0f27e16ddcf7199d514968204966f559">ttl</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e45b31a0a277dd5325ad2a332358b21b"></a><!-- doxytag: member="uip_tcpip_hdr::proto" ref="e45b31a0a277dd5325ad2a332358b21b" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#e45b31a0a277dd5325ad2a332358b21b">proto</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="af7a8a5310ad945de38f5b3ac755ae7d"></a><!-- doxytag: member="uip_tcpip_hdr::ipchksum" ref="af7a8a5310ad945de38f5b3ac755ae7d" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#af7a8a5310ad945de38f5b3ac755ae7d">ipchksum</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c8f124419a231f38bb6cdf5041757a27"></a><!-- doxytag: member="uip_tcpip_hdr::srcipaddr" ref="c8f124419a231f38bb6cdf5041757a27" args="[2]" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#c8f124419a231f38bb6cdf5041757a27">srcipaddr</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8d4e08d051b35b1c710c3be5b8bbfa05"></a><!-- doxytag: member="uip_tcpip_hdr::destipaddr" ref="8d4e08d051b35b1c710c3be5b8bbfa05" args="[2]" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#8d4e08d051b35b1c710c3be5b8bbfa05">destipaddr</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a81fff4836049cb3c018304d77337554"></a><!-- doxytag: member="uip_tcpip_hdr::srcport" ref="a81fff4836049cb3c018304d77337554" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#a81fff4836049cb3c018304d77337554">srcport</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="025ffa46b799fa6952719c499a3ae17c"></a><!-- doxytag: member="uip_tcpip_hdr::destport" ref="025ffa46b799fa6952719c499a3ae17c" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#025ffa46b799fa6952719c499a3ae17c">destport</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2541fae506eb111ff1be2372e0919839"></a><!-- doxytag: member="uip_tcpip_hdr::seqno" ref="2541fae506eb111ff1be2372e0919839" args="[4]" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#2541fae506eb111ff1be2372e0919839">seqno</a> [4]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="71721395f1c7c42b8bcc111b339bea7c"></a><!-- doxytag: member="uip_tcpip_hdr::ackno" ref="71721395f1c7c42b8bcc111b339bea7c" args="[4]" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#71721395f1c7c42b8bcc111b339bea7c">ackno</a> [4]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6af8a59d0ab8967aacea749d6e59ac90"></a><!-- doxytag: member="uip_tcpip_hdr::tcpoffset" ref="6af8a59d0ab8967aacea749d6e59ac90" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#6af8a59d0ab8967aacea749d6e59ac90">tcpoffset</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="619d9755a5d4aaabdb2e5e6ea4c1e0bf"></a><!-- doxytag: member="uip_tcpip_hdr::flags" ref="619d9755a5d4aaabdb2e5e6ea4c1e0bf" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#619d9755a5d4aaabdb2e5e6ea4c1e0bf">flags</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7f0ab3fe3bcf1e3ed9f5950cb4474ec1"></a><!-- doxytag: member="uip_tcpip_hdr::wnd" ref="7f0ab3fe3bcf1e3ed9f5950cb4474ec1" args="[2]" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#7f0ab3fe3bcf1e3ed9f5950cb4474ec1">wnd</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f4a1d8cfbe270393a2de02b0c743e474"></a><!-- doxytag: member="uip_tcpip_hdr::tcpchksum" ref="f4a1d8cfbe270393a2de02b0c743e474" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#f4a1d8cfbe270393a2de02b0c743e474">tcpchksum</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dc7001682017599549f57771f4cd1b9a"></a><!-- doxytag: member="uip_tcpip_hdr::urgp" ref="dc7001682017599549f57771f4cd1b9a" args="[2]" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#dc7001682017599549f57771f4cd1b9a">urgp</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dde3cf9a57445814d01b3c67da08afdb"></a><!-- doxytag: member="uip_tcpip_hdr::optdata" ref="dde3cf9a57445814d01b3c67da08afdb" args="[4]" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00094.html#dde3cf9a57445814d01b3c67da08afdb">optdata</a> [4]</td></tr>
+
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 64 - 0
components/net/uip/doc/html/a00095.html

@@ -0,0 +1,64 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: uip_udp_conn Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>uip_udp_conn Struct Reference<br>
+<small>
+[<a class="el" href="a00150.html">The uIP TCP/IP stack</a>]</small>
+</h1><!-- doxytag: class="uip_udp_conn" --><code>#include &lt;<a class="el" href="a00202.html">uip.h</a>&gt;</code>
+<p>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+Representation of a uIP UDP connection. <dl compact><dt><b>Examples: </b></dt><dd>
+
+<p>
+<a class="el" href="a00049.html#_a47">dhcpc.h</a>, and <a class="el" href="a00046.html#_a129">resolv.c</a>.</dl>
+<p>
+
+<p>
+Definition at line <a class="el" href="a00202.html#l01210">1210</a> of file <a class="el" href="a00202.html">uip.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8a661a2d544100b82d0d14a1985083d5"></a><!-- doxytag: member="uip_udp_conn::ripaddr" ref="8a661a2d544100b82d0d14a1985083d5" args="" -->
+<a class="el" href="a00150.html#g1ef35301f43a5bbb9f89f07b5a36b9a0">uip_ipaddr_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00095.html#8a661a2d544100b82d0d14a1985083d5">ripaddr</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The IP address of the remote peer. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="981392e295db4d024eea95805c51c371"></a><!-- doxytag: member="uip_udp_conn::lport" ref="981392e295db4d024eea95805c51c371" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00095.html#981392e295db4d024eea95805c51c371">lport</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The local port number in network byte order. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="280a0c2a93544e597f92bbacf36ee1dc"></a><!-- doxytag: member="uip_udp_conn::rport" ref="280a0c2a93544e597f92bbacf36ee1dc" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00095.html#280a0c2a93544e597f92bbacf36ee1dc">rport</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The remote port number in network byte order. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4da1d7815516cd2b5bda3a66fdf05198"></a><!-- doxytag: member="uip_udp_conn::ttl" ref="4da1d7815516cd2b5bda3a66fdf05198" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00095.html#4da1d7815516cd2b5bda3a66fdf05198">ttl</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Default time-to-live. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c8afa29e0aa5e789d6929b366d98ba56"></a><!-- doxytag: member="uip_udp_conn::appstate" ref="c8afa29e0aa5e789d6929b366d98ba56" args="" -->
+<a class="el" href="a00153.html#ga92afb113e122f860392bfbd385f842e">uip_udp_appstate_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00095.html#c8afa29e0aa5e789d6929b366d98ba56">appstate</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The application state. <br></td></tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 81 - 0
components/net/uip/doc/html/a00096.html

@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: uip_udpip_hdr Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>uip_udpip_hdr Struct Reference<br>
+<small>
+[<a class="el" href="a00150.html">The uIP TCP/IP stack</a>]</small>
+</h1><!-- doxytag: class="uip_udpip_hdr" --><hr><a name="_details"></a><h2>Detailed Description</h2>
+
+<p>
+
+<p>
+Definition at line <a class="el" href="a00202.html#l01460">1460</a> of file <a class="el" href="a00202.html">uip.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f1684ad96b8acf54154688df3883b801"></a><!-- doxytag: member="uip_udpip_hdr::vhl" ref="f1684ad96b8acf54154688df3883b801" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00096.html#f1684ad96b8acf54154688df3883b801">vhl</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ed119a030ebd3bf7c30a12071c27d441"></a><!-- doxytag: member="uip_udpip_hdr::tos" ref="ed119a030ebd3bf7c30a12071c27d441" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00096.html#ed119a030ebd3bf7c30a12071c27d441">tos</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="47140aa52cb9e6a2de38fdfc5da08df1"></a><!-- doxytag: member="uip_udpip_hdr::len" ref="47140aa52cb9e6a2de38fdfc5da08df1" args="[2]" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00096.html#47140aa52cb9e6a2de38fdfc5da08df1">len</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="569382bc53aa64c227e57efe88fe13ac"></a><!-- doxytag: member="uip_udpip_hdr::ipid" ref="569382bc53aa64c227e57efe88fe13ac" args="[2]" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00096.html#569382bc53aa64c227e57efe88fe13ac">ipid</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8587178a29882482be20c2822b402b96"></a><!-- doxytag: member="uip_udpip_hdr::ipoffset" ref="8587178a29882482be20c2822b402b96" args="[2]" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00096.html#8587178a29882482be20c2822b402b96">ipoffset</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f8c65cfc8242197bcc3cb5b4735b16f"></a><!-- doxytag: member="uip_udpip_hdr::ttl" ref="6f8c65cfc8242197bcc3cb5b4735b16f" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00096.html#6f8c65cfc8242197bcc3cb5b4735b16f">ttl</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="51bbbe3099c10ef26119ddc2aa51e35e"></a><!-- doxytag: member="uip_udpip_hdr::proto" ref="51bbbe3099c10ef26119ddc2aa51e35e" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00096.html#51bbbe3099c10ef26119ddc2aa51e35e">proto</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f20186ef441ef5b600e8544a0f2d8d81"></a><!-- doxytag: member="uip_udpip_hdr::ipchksum" ref="f20186ef441ef5b600e8544a0f2d8d81" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00096.html#f20186ef441ef5b600e8544a0f2d8d81">ipchksum</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a80e8d0fc768525fa3bfb3d4e4cf260d"></a><!-- doxytag: member="uip_udpip_hdr::srcipaddr" ref="a80e8d0fc768525fa3bfb3d4e4cf260d" args="[2]" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00096.html#a80e8d0fc768525fa3bfb3d4e4cf260d">srcipaddr</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="be2c98748e180c1747823cd2fb8ecf0e"></a><!-- doxytag: member="uip_udpip_hdr::destipaddr" ref="be2c98748e180c1747823cd2fb8ecf0e" args="[2]" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00096.html#be2c98748e180c1747823cd2fb8ecf0e">destipaddr</a> [2]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b20096ae4953caaa42f6bb2373c4494c"></a><!-- doxytag: member="uip_udpip_hdr::srcport" ref="b20096ae4953caaa42f6bb2373c4494c" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00096.html#b20096ae4953caaa42f6bb2373c4494c">srcport</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e82f68cb91d8688a619d55d2a8572979"></a><!-- doxytag: member="uip_udpip_hdr::destport" ref="e82f68cb91d8688a619d55d2a8572979" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00096.html#e82f68cb91d8688a619d55d2a8572979">destport</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c92d2f194f096e84791f95d7e8f0ba92"></a><!-- doxytag: member="uip_udpip_hdr::udplen" ref="c92d2f194f096e84791f95d7e8f0ba92" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00096.html#c92d2f194f096e84791f95d7e8f0ba92">udplen</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="858f970feb7462871c814953697a8ad7"></a><!-- doxytag: member="uip_udpip_hdr::udpchksum" ref="858f970feb7462871c814953697a8ad7" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00096.html#858f970feb7462871c814953697a8ad7">udpchksum</a></td></tr>
+
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

+ 75 - 0
components/net/uip/doc/html/a00097.html

@@ -0,0 +1,75 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>uIP 1.0: webclient_state Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6 -->
+<div class="tabs">
+  <ul>
+    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li id="current"><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="examples.html"><span>Examples</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="classes.html"><span>Alphabetical&nbsp;List</span></a></li>
+    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
+    <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Data&nbsp;Fields</span></a></li>
+  </ul></div>
+<h1>webclient_state Struct Reference<br>
+<small>
+[<a class="el" href="a00163.html">Web client</a>]</small>
+</h1><!-- doxytag: class="webclient_state" --><hr><a name="_details"></a><h2>Detailed Description</h2>
+<dl compact><dt><b>Examples: </b></dt><dd>
+
+<p>
+<a class="el" href="a00040.html#_a251">webclient.c</a>, and <a class="el" href="a00041.html#_a307">webclient.h</a>.</dl>
+<p>
+
+<p>
+Definition at line <a class="el" href="a00181.html#l00055">55</a> of file <a class="el" href="a00181.html">webclient.h</a>.<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Data Fields</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5960d82e7aca2986b8509a0d87d6cbc8"></a><!-- doxytag: member="webclient_state::timer" ref="5960d82e7aca2986b8509a0d87d6cbc8" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00097.html#5960d82e7aca2986b8509a0d87d6cbc8">timer</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8ae6395641b7752dce47881e20cee970"></a><!-- doxytag: member="webclient_state::state" ref="8ae6395641b7752dce47881e20cee970" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00097.html#8ae6395641b7752dce47881e20cee970">state</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6925d46b2819adb474a5f0036f02dd7d"></a><!-- doxytag: member="webclient_state::httpflag" ref="6925d46b2819adb474a5f0036f02dd7d" args="" -->
+<a class="el" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00097.html#6925d46b2819adb474a5f0036f02dd7d">httpflag</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7092781c50dcad50f473888585c85b83"></a><!-- doxytag: member="webclient_state::port" ref="7092781c50dcad50f473888585c85b83" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00097.html#7092781c50dcad50f473888585c85b83">port</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a6487b9c1c773b32656065d0e19bf142"></a><!-- doxytag: member="webclient_state::host" ref="a6487b9c1c773b32656065d0e19bf142" args="[40]" -->
+char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00097.html#a6487b9c1c773b32656065d0e19bf142">host</a> [40]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e87913860c6b05c6e6b060639b950098"></a><!-- doxytag: member="webclient_state::file" ref="e87913860c6b05c6e6b060639b950098" args="[WEBCLIENT_CONF_MAX_URLLEN]" -->
+char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00097.html#e87913860c6b05c6e6b060639b950098">file</a> [WEBCLIENT_CONF_MAX_URLLEN]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="134ec55c3d5abaebfed4ff8edfedf1ea"></a><!-- doxytag: member="webclient_state::getrequestptr" ref="134ec55c3d5abaebfed4ff8edfedf1ea" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00097.html#134ec55c3d5abaebfed4ff8edfedf1ea">getrequestptr</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a3116623c6a7da7c82db6c301ae0da3"></a><!-- doxytag: member="webclient_state::getrequestleft" ref="5a3116623c6a7da7c82db6c301ae0da3" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00097.html#5a3116623c6a7da7c82db6c301ae0da3">getrequestleft</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="606d2729bf411ade69044828403a72af"></a><!-- doxytag: member="webclient_state::httpheaderline" ref="606d2729bf411ade69044828403a72af" args="[200]" -->
+char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00097.html#606d2729bf411ade69044828403a72af">httpheaderline</a> [200]</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2fca02673894f222b01ad2d3a4d7dd79"></a><!-- doxytag: member="webclient_state::httpheaderlineptr" ref="2fca02673894f222b01ad2d3a4d7dd79" args="" -->
+<a class="el" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00097.html#2fca02673894f222b01ad2d3a4d7dd79">httpheaderlineptr</a></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fb60f42593d305ea36d9b4303722696e"></a><!-- doxytag: member="webclient_state::mimetype" ref="fb60f42593d305ea36d9b4303722696e" args="[32]" -->
+char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00097.html#fb60f42593d305ea36d9b4303722696e">mimetype</a> [32]</td></tr>
+
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
+</body>
+</html>

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio