Browse Source

Moved uIP and tcp.c from proto/ to net/

tags/v0.9.3
Michael Brown 18 years ago
parent
commit
592a5a99c8
8 changed files with 3512 additions and 3 deletions
  1. 1
    2
      src/Makefile
  2. 1
    1
      src/net/ipv4.c
  3. 164
    0
      src/net/tcp.c
  4. 1501
    0
      src/net/uip/uip.c
  5. 1060
    0
      src/net/uip/uip.h
  6. 83
    0
      src/net/uip/uip_arch.c
  7. 130
    0
      src/net/uip/uip_arch.h
  8. 572
    0
      src/net/uip/uipopt.h

+ 1
- 2
src/Makefile View File

132
 #
132
 #
133
 SRCDIRS		+= core
133
 SRCDIRS		+= core
134
 SRCDIRS		+= proto
134
 SRCDIRS		+= proto
135
-SRCDIRS		+= net
136
-SRCDIRS		+= proto/uip
135
+SRCDIRS		+= net net/uip
137
 #SRCDIRS		+= image
136
 #SRCDIRS		+= image
138
 SRCDIRS		+= drivers/bus
137
 SRCDIRS		+= drivers/bus
139
 SRCDIRS		+= drivers/net
138
 SRCDIRS		+= drivers/net

+ 1
- 1
src/net/ipv4.c View File

11
 #include <gpxe/if_ether.h>
11
 #include <gpxe/if_ether.h>
12
 #include <gpxe/pkbuff.h>
12
 #include <gpxe/pkbuff.h>
13
 #include <gpxe/netdevice.h>
13
 #include <gpxe/netdevice.h>
14
-#include "../proto/uip/uip.h"
14
+#include "uip/uip.h"
15
 
15
 
16
 /** @file
16
 /** @file
17
  *
17
  *

+ 164
- 0
src/net/tcp.c View File

1
+#include <string.h>
2
+#include <assert.h>
3
+#include <byteswap.h>
4
+#include <gpxe/tcp.h>
5
+#include "uip/uip.h"
6
+
7
+/** @file
8
+ *
9
+ * TCP protocol
10
+ *
11
+ * The gPXE TCP stack is currently implemented on top of the uIP
12
+ * protocol stack.  This file provides wrappers around uIP so that
13
+ * higher-level protocol implementations do not need to talk directly
14
+ * to uIP (which has a somewhat baroque API).
15
+ *
16
+ * Basic operation is to create a #tcp_connection structure, call
17
+ * tcp_connect() and then call run_tcpip() in a loop until the
18
+ * operation has completed.  The TCP stack will call the various
19
+ * methods defined in the #tcp_operations structure in order to send
20
+ * and receive data.
21
+ *
22
+ * See hello.c for a trivial example of a TCP protocol using this
23
+ * API.
24
+ *
25
+ */
26
+
27
+/**
28
+ * TCP transmit buffer
29
+ *
30
+ * When a tcp_operations::senddata() method is called, it is
31
+ * guaranteed to be able to use this buffer as temporary space for
32
+ * constructing the data to be sent.  For example, code such as
33
+ *
34
+ * @code
35
+ *
36
+ *     static void my_senddata ( struct tcp_connection *conn ) {
37
+ *         int len;
38
+ *
39
+ *         len = snprintf ( tcp_buffer, tcp_buflen, "FETCH %s\r\n", filename );
40
+ *         tcp_send ( conn, tcp_buffer + already_sent, len - already_sent );
41
+ *     }
42
+ *
43
+ * @endcode
44
+ *
45
+ * is allowed, and is probably the best way to deal with
46
+ * variably-sized data.
47
+ *
48
+ * Note that you cannot use this simple mechanism if you want to be
49
+ * able to construct single data blocks of more than #tcp_buflen
50
+ * bytes.
51
+ */
52
+void *tcp_buffer = uip_buf + ( 40 + UIP_LLH_LEN );
53
+
54
+/** Size of #tcp_buffer */
55
+size_t tcp_buflen = UIP_BUFSIZE - ( 40 + UIP_LLH_LEN );
56
+
57
+/**
58
+ * Open a TCP connection
59
+ *
60
+ * @v conn	TCP connection
61
+ * @ret 0	Success
62
+ * @ret <0	Failure
63
+ * 
64
+ * This sets up a new TCP connection to the remote host specified in
65
+ * tcp_connection::sin.  The actual SYN packet will not be sent out
66
+ * until run_tcpip() is called for the first time.
67
+ *
68
+ * @todo Use linked lists instead of a static buffer, and thereby
69
+ *       remove the only potential failure case, giving this function
70
+ *       a void return type.
71
+ */
72
+int tcp_connect ( struct tcp_connection *conn ) {
73
+	struct uip_conn *uip_conn;
74
+	u16_t ipaddr[2];
75
+
76
+	assert ( conn->sin.sin_addr.s_addr != 0 );
77
+	assert ( conn->sin.sin_port != 0 );
78
+	assert ( conn->tcp_op != NULL );
79
+	assert ( sizeof ( uip_conn->appstate ) == sizeof ( conn ) );
80
+
81
+	* ( ( uint32_t * ) ipaddr ) = conn->sin.sin_addr.s_addr;
82
+	uip_conn = uip_connect ( ipaddr, conn->sin.sin_port );
83
+	if ( ! uip_conn )
84
+		return -1;
85
+
86
+	*( ( void ** ) uip_conn->appstate ) = conn;
87
+	return 0;
88
+}
89
+
90
+/**
91
+ * Send data via a TCP connection
92
+ *
93
+ * @v conn	TCP connection
94
+ * @v data	Data to send
95
+ * @v len	Length of data
96
+ *
97
+ * Data will be automatically limited to the current TCP window size.
98
+ *
99
+ * If retransmission is required, the connection's
100
+ * tcp_operations::senddata() method will be called again in order to
101
+ * regenerate the data.
102
+ */
103
+void tcp_send ( struct tcp_connection *conn __unused,
104
+		const void *data, size_t len ) {
105
+
106
+	assert ( conn = *( ( void ** ) uip_conn->appstate ) );
107
+
108
+	if ( len > tcp_buflen )
109
+		len = tcp_buflen;
110
+	memmove ( tcp_buffer, data, len );
111
+
112
+	uip_send ( tcp_buffer, len );
113
+}
114
+
115
+/**
116
+ * Close a TCP connection
117
+ *
118
+ * @v conn	TCP connection
119
+ */
120
+void tcp_close ( struct tcp_connection *conn __unused ) {
121
+	assert ( conn = *( ( void ** ) uip_conn->appstate ) );
122
+	uip_close();
123
+}
124
+
125
+/**
126
+ * uIP TCP application call interface
127
+ *
128
+ * This is the entry point of gPXE from the point of view of the uIP
129
+ * protocol stack.  This function calls the appropriate methods from
130
+ * the connection's @tcp_operations table in order to process received
131
+ * data, transmit new data etc.
132
+ */
133
+void uip_tcp_appcall ( void ) {
134
+	struct tcp_connection *conn = *( ( void ** ) uip_conn->appstate );
135
+	struct tcp_operations *op = conn->tcp_op;
136
+
137
+	assert ( conn->tcp_op->closed != NULL );
138
+	assert ( conn->tcp_op->connected != NULL );
139
+	assert ( conn->tcp_op->acked != NULL );
140
+	assert ( conn->tcp_op->newdata != NULL );
141
+	assert ( conn->tcp_op->senddata != NULL );
142
+
143
+	if ( uip_aborted() && op->aborted ) /* optional method */
144
+		op->aborted ( conn );
145
+	if ( uip_timedout() && op->timedout ) /* optional method */
146
+		op->timedout ( conn );
147
+	if ( uip_closed() && op->closed ) /* optional method */
148
+		op->closed ( conn );
149
+	if ( uip_connected() )
150
+		op->connected ( conn );
151
+	if ( uip_acked() )
152
+		op->acked ( conn, uip_conn->len );
153
+	if ( uip_newdata() )
154
+		op->newdata ( conn, ( void * ) uip_appdata, uip_len );
155
+	if ( uip_rexmit() || uip_newdata() || uip_acked() ||
156
+	     uip_connected() || uip_poll() )
157
+		op->senddata ( conn );
158
+}
159
+
160
+/* Present here to allow everything to link.  Will go into separate
161
+ * udp.c file
162
+ */
163
+void uip_udp_appcall ( void ) {
164
+}

+ 1501
- 0
src/net/uip/uip.c
File diff suppressed because it is too large
View File


+ 1060
- 0
src/net/uip/uip.h
File diff suppressed because it is too large
View File


+ 83
- 0
src/net/uip/uip_arch.c View File

1
+#include <stdint.h>
2
+#include <byteswap.h>
3
+#include "uip_arch.h"
4
+#include "uip.h"
5
+
6
+volatile u8_t uip_acc32[4];
7
+
8
+void uip_add32 ( u8_t *op32, u16_t op16 ) {
9
+	* ( ( uint32_t * ) uip_acc32 ) =
10
+		htonl ( ntohl ( *( ( uint32_t * ) op32 ) )  + op16 );
11
+}
12
+
13
+#define BUF ((uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
14
+#define IP_PROTO_TCP    6
15
+
16
+u16_t uip_chksum(u16_t *sdata, u16_t len) {
17
+  u16_t acc;
18
+  
19
+  for(acc = 0; len > 1; len -= 2) {
20
+    acc += *sdata;
21
+    if(acc < *sdata) {
22
+      /* Overflow, so we add the carry to acc (i.e., increase by
23
+         one). */
24
+      ++acc;
25
+    }
26
+    ++sdata;
27
+  }
28
+
29
+  /* add up any odd byte */
30
+  if(len == 1) {
31
+    acc += htons(((u16_t)(*(u8_t *)sdata)) << 8);
32
+    if(acc < htons(((u16_t)(*(u8_t *)sdata)) << 8)) {
33
+      ++acc;
34
+    }
35
+  }
36
+
37
+  return acc;
38
+}
39
+
40
+u16_t uip_ipchksum(void) {
41
+  return uip_chksum((u16_t *)&uip_buf[UIP_LLH_LEN], 20);
42
+}
43
+
44
+u16_t uip_tcpchksum(void) {
45
+  u16_t hsum, sum;
46
+
47
+  
48
+  /* Compute the checksum of the TCP header. */
49
+  hsum = uip_chksum((u16_t *)&uip_buf[20 + UIP_LLH_LEN], 20);
50
+
51
+  /* Compute the checksum of the data in the TCP packet and add it to
52
+     the TCP header checksum. */
53
+  sum = uip_chksum((u16_t *)uip_appdata,
54
+		   (u16_t)(((((u16_t)(BUF->len[0]) << 8) + BUF->len[1]) - 40)));
55
+
56
+  if((sum += hsum) < hsum) {
57
+    ++sum;
58
+  }
59
+  
60
+  if((sum += BUF->srcipaddr[0]) < BUF->srcipaddr[0]) {
61
+    ++sum;
62
+  }
63
+  if((sum += BUF->srcipaddr[1]) < BUF->srcipaddr[1]) {
64
+    ++sum;
65
+  }
66
+  if((sum += BUF->destipaddr[0]) < BUF->destipaddr[0]) {
67
+    ++sum;
68
+  }
69
+  if((sum += BUF->destipaddr[1]) < BUF->destipaddr[1]) {
70
+    ++sum;
71
+  }
72
+  if((sum += (u16_t)htons((u16_t)IP_PROTO_TCP)) < (u16_t)htons((u16_t)IP_PROTO_TCP)) {
73
+    ++sum;
74
+  }
75
+
76
+  hsum = (u16_t)htons((((u16_t)(BUF->len[0]) << 8) + BUF->len[1]) - 20);
77
+  
78
+  if((sum += hsum) < hsum) {
79
+    ++sum;
80
+  }
81
+  
82
+  return sum;
83
+}

+ 130
- 0
src/net/uip/uip_arch.h View File

1
+/**
2
+ * \defgroup uiparch Architecture specific uIP functions
3
+ * @{
4
+ *
5
+ * The functions in the architecture specific module implement the IP
6
+ * check sum and 32-bit additions.
7
+ *
8
+ * The IP checksum calculation is the most computationally expensive
9
+ * operation in the TCP/IP stack and it therefore pays off to
10
+ * implement this in efficient assembler. The purpose of the uip-arch
11
+ * module is to let the checksum functions to be implemented in
12
+ * architecture specific assembler.
13
+ *
14
+ */
15
+
16
+/**
17
+ * \file
18
+ * Declarations of architecture specific functions.
19
+ * \author Adam Dunkels <adam@dunkels.com>
20
+ */
21
+
22
+/*
23
+ * Copyright (c) 2001, Adam Dunkels.
24
+ * All rights reserved. 
25
+ *
26
+ * Redistribution and use in source and binary forms, with or without 
27
+ * modification, are permitted provided that the following conditions 
28
+ * are met: 
29
+ * 1. Redistributions of source code must retain the above copyright 
30
+ *    notice, this list of conditions and the following disclaimer. 
31
+ * 2. Redistributions in binary form must reproduce the above copyright 
32
+ *    notice, this list of conditions and the following disclaimer in the 
33
+ *    documentation and/or other materials provided with the distribution. 
34
+ * 3. The name of the author may not be used to endorse or promote
35
+ *    products derived from this software without specific prior
36
+ *    written permission.  
37
+ *
38
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
39
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
40
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
41
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
42
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
43
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
44
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
45
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
46
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
47
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
48
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
49
+ *
50
+ * This file is part of the uIP TCP/IP stack.
51
+ *
52
+ * $Id$
53
+ *
54
+ */
55
+
56
+#ifndef __UIP_ARCH_H__
57
+#define __UIP_ARCH_H__
58
+
59
+#include "uip.h"
60
+
61
+/**
62
+ * Carry out a 32-bit addition.
63
+ *
64
+ * Because not all architectures for which uIP is intended has native
65
+ * 32-bit arithmetic, uIP uses an external C function for doing the
66
+ * required 32-bit additions in the TCP protocol processing. This
67
+ * function should add the two arguments and place the result in the
68
+ * global variable uip_acc32.
69
+ *
70
+ * \note The 32-bit integer pointed to by the op32 parameter and the
71
+ * result in the uip_acc32 variable are in network byte order (big
72
+ * endian).
73
+ *
74
+ * \param op32 A pointer to a 4-byte array representing a 32-bit
75
+ * integer in network byte order (big endian).
76
+ *
77
+ * \param op16 A 16-bit integer in host byte order.
78
+ */
79
+void uip_add32(u8_t *op32, u16_t op16);
80
+
81
+/**
82
+ * Calculate the Internet checksum over a buffer.
83
+ *
84
+ * The Internet checksum is the one's complement of the one's
85
+ * complement sum of all 16-bit words in the buffer.
86
+ *
87
+ * See RFC1071.
88
+ *
89
+ * \note This function is not called in the current version of uIP,
90
+ * but future versions might make use of it.
91
+ *
92
+ * \param buf A pointer to the buffer over which the checksum is to be
93
+ * computed.
94
+ *
95
+ * \param len The length of the buffer over which the checksum is to
96
+ * be computed.
97
+ *
98
+ * \return The Internet checksum of the buffer.
99
+ */
100
+u16_t uip_chksum(u16_t *buf, u16_t len);
101
+
102
+/**
103
+ * Calculate the IP header checksum of the packet header in uip_buf.
104
+ *
105
+ * The IP header checksum is the Internet checksum of the 20 bytes of
106
+ * the IP header.
107
+ *
108
+ * \return The IP header checksum of the IP header in the uip_buf
109
+ * buffer.
110
+ */
111
+u16_t uip_ipchksum(void);
112
+
113
+/**
114
+ * Calculate the TCP checksum of the packet in uip_buf and uip_appdata.
115
+ *
116
+ * The TCP checksum is the Internet checksum of data contents of the
117
+ * TCP segment, and a pseudo-header as defined in RFC793.
118
+ *
119
+ * \note The uip_appdata pointer that points to the packet data may
120
+ * point anywhere in memory, so it is not possible to simply calculate
121
+ * the Internet checksum of the contents of the uip_buf buffer.
122
+ *
123
+ * \return The TCP checksum of the TCP segment in uip_buf and pointed
124
+ * to by uip_appdata.
125
+ */
126
+u16_t uip_tcpchksum(void);
127
+
128
+/** @} */
129
+
130
+#endif /* __UIP_ARCH_H__ */

+ 572
- 0
src/net/uip/uipopt.h View File

1
+/**
2
+ * \defgroup uipopt Configuration options for uIP
3
+ * @{
4
+ *
5
+ * uIP is configured using the per-project configuration file
6
+ * "uipopt.h". This file contains all compile-time options for uIP and
7
+ * should be tweaked to match each specific project. The uIP
8
+ * distribution contains a documented example "uipopt.h" that can be
9
+ * copied and modified for each project.
10
+ */
11
+
12
+/**
13
+ * \file
14
+ * Configuration options for uIP.
15
+ * \author Adam Dunkels <adam@dunkels.com>
16
+ *
17
+ * This file is used for tweaking various configuration options for
18
+ * uIP. You should make a copy of this file into one of your project's
19
+ * directories instead of editing this example "uipopt.h" file that
20
+ * comes with the uIP distribution.
21
+ */
22
+
23
+/*
24
+ * Copyright (c) 2001-2003, Adam Dunkels.
25
+ * All rights reserved. 
26
+ *
27
+ * Redistribution and use in source and binary forms, with or without 
28
+ * modification, are permitted provided that the following conditions 
29
+ * are met: 
30
+ * 1. Redistributions of source code must retain the above copyright 
31
+ *    notice, this list of conditions and the following disclaimer. 
32
+ * 2. Redistributions in binary form must reproduce the above copyright 
33
+ *    notice, this list of conditions and the following disclaimer in the 
34
+ *    documentation and/or other materials provided with the distribution. 
35
+ * 3. The name of the author may not be used to endorse or promote
36
+ *    products derived from this software without specific prior
37
+ *    written permission.  
38
+ *
39
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
40
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
41
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
42
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
43
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
44
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
45
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
46
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
47
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
48
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
49
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
50
+ *
51
+ * This file is part of the uIP TCP/IP stack.
52
+ *
53
+ * $Id$
54
+ *
55
+ */
56
+
57
+#ifndef __UIPOPT_H__
58
+#define __UIPOPT_H__
59
+
60
+/*------------------------------------------------------------------------------*/
61
+/**
62
+ * \defgroup uipopttypedef uIP type definitions
63
+ * @{
64
+ */
65
+
66
+/**
67
+ * The 8-bit unsigned data type.
68
+ *
69
+ * This may have to be tweaked for your particular compiler. "unsigned
70
+ * char" works for most compilers.
71
+ */
72
+typedef unsigned char u8_t;
73
+
74
+/**
75
+ * The 16-bit unsigned data type.
76
+ *
77
+ * This may have to be tweaked for your particular compiler. "unsigned
78
+ * short" works for most compilers.
79
+ */
80
+typedef unsigned short u16_t;
81
+
82
+/**
83
+ * The statistics data type.
84
+ *
85
+ * This datatype determines how high the statistics counters are able
86
+ * to count.
87
+ */
88
+typedef unsigned short uip_stats_t;
89
+
90
+/** @} */
91
+
92
+/*------------------------------------------------------------------------------*/
93
+
94
+/**
95
+ * \defgroup uipoptstaticconf Static configuration options
96
+ * @{
97
+ *
98
+ * These configuration options can be used for setting the IP address
99
+ * settings statically, but only if UIP_FIXEDADDR is set to 1. The
100
+ * configuration options for a specific node includes IP address,
101
+ * netmask and default router as well as the Ethernet address. The
102
+ * netmask, default router and Ethernet address are appliciable only
103
+ * if uIP should be run over Ethernet.
104
+ *
105
+ * All of these should be changed to suit your project.
106
+*/
107
+
108
+/**
109
+ * Determines if uIP should use a fixed IP address or not.
110
+ *
111
+ * If uIP should use a fixed IP address, the settings are set in the
112
+ * uipopt.h file. If not, the macros uip_sethostaddr(),
113
+ * uip_setdraddr() and uip_setnetmask() should be used instead.
114
+ *
115
+ * \hideinitializer
116
+ */
117
+#define UIP_FIXEDADDR    0
118
+
119
+/**
120
+ * Ping IP address asignment.
121
+ *
122
+ * uIP uses a "ping" packets for setting its own IP address if this
123
+ * option is set. If so, uIP will start with an empty IP address and
124
+ * the destination IP address of the first incoming "ping" (ICMP echo)
125
+ * packet will be used for setting the hosts IP address.
126
+ *
127
+ * \note This works only if UIP_FIXEDADDR is 0.
128
+ *
129
+ * \hideinitializer
130
+ */
131
+#define UIP_PINGADDRCONF 0
132
+
133
+#define UIP_IPADDR0     0   /**< The first octet of the IP address of
134
+			       this uIP node, if UIP_FIXEDADDR is
135
+			       1. \hideinitializer */
136
+#define UIP_IPADDR1     0   /**< The second octet of the IP address of
137
+			       this uIP node, if UIP_FIXEDADDR is
138
+			       1. \hideinitializer */
139
+#define UIP_IPADDR2     0   /**< The third octet of the IP address of
140
+			       this uIP node, if UIP_FIXEDADDR is
141
+			       1. \hideinitializer */
142
+#define UIP_IPADDR3     0   /**< The fourth octet of the IP address of
143
+			       this uIP node, if UIP_FIXEDADDR is
144
+			       1. \hideinitializer */
145
+
146
+#define UIP_NETMASK0    0   /**< The first octet of the netmask of
147
+			       this uIP node, if UIP_FIXEDADDR is
148
+			       1. \hideinitializer */
149
+#define UIP_NETMASK1    0   /**< The second octet of the netmask of
150
+			       this uIP node, if UIP_FIXEDADDR is
151
+			       1. \hideinitializer */
152
+#define UIP_NETMASK2    0   /**< The third octet of the netmask of
153
+			       this uIP node, if UIP_FIXEDADDR is
154
+			       1. \hideinitializer */
155
+#define UIP_NETMASK3    0   /**< The fourth octet of the netmask of
156
+			       this uIP node, if UIP_FIXEDADDR is
157
+			       1. \hideinitializer */
158
+
159
+#define UIP_DRIPADDR0   0   /**< The first octet of the IP address of
160
+			       the default router, if UIP_FIXEDADDR is
161
+			       1. \hideinitializer */
162
+#define UIP_DRIPADDR1   0   /**< The second octet of the IP address of
163
+			       the default router, if UIP_FIXEDADDR is
164
+			       1. \hideinitializer */
165
+#define UIP_DRIPADDR2   0   /**< The third octet of the IP address of
166
+			       the default router, if UIP_FIXEDADDR is
167
+			       1. \hideinitializer */
168
+#define UIP_DRIPADDR3   0   /**< The fourth octet of the IP address of
169
+			       the default router, if UIP_FIXEDADDR is
170
+			       1. \hideinitializer */
171
+
172
+/**
173
+ * Specifies if the uIP ARP module should be compiled with a fixed
174
+ * Ethernet MAC address or not.
175
+ *
176
+ * If this configuration option is 0, the macro uip_setethaddr() can
177
+ * be used to specify the Ethernet address at run-time.
178
+ *
179
+ * \hideinitializer
180
+ */
181
+#define UIP_FIXEDETHADDR 0
182
+
183
+#define UIP_ETHADDR0    0x00  /**< The first octet of the Ethernet
184
+				 address if UIP_FIXEDETHADDR is
185
+				 1. \hideinitializer */
186
+#define UIP_ETHADDR1    0xbd  /**< The second octet of the Ethernet
187
+				 address if UIP_FIXEDETHADDR is
188
+				 1. \hideinitializer */
189
+#define UIP_ETHADDR2    0x3b  /**< The third octet of the Ethernet
190
+				 address if UIP_FIXEDETHADDR is
191
+				 1. \hideinitializer */
192
+#define UIP_ETHADDR3    0x33  /**< The fourth octet of the Ethernet
193
+				 address if UIP_FIXEDETHADDR is
194
+				 1. \hideinitializer */
195
+#define UIP_ETHADDR4    0x05  /**< The fifth octet of the Ethernet
196
+				 address if UIP_FIXEDETHADDR is
197
+				 1. \hideinitializer */
198
+#define UIP_ETHADDR5    0x71  /**< The sixth octet of the Ethernet
199
+				 address if UIP_FIXEDETHADDR is
200
+				 1. \hideinitializer */
201
+
202
+/** @} */
203
+/*------------------------------------------------------------------------------*/
204
+/**
205
+ * \defgroup uipoptip IP configuration options
206
+ * @{
207
+ *
208
+ */
209
+/**
210
+ * The IP TTL (time to live) of IP packets sent by uIP.
211
+ *
212
+ * This should normally not be changed.
213
+ */
214
+#define UIP_TTL         255
215
+
216
+/**
217
+ * Turn on support for IP packet reassembly.
218
+ *
219
+ * uIP supports reassembly of fragmented IP packets. This features
220
+ * requires an additonal amount of RAM to hold the reassembly buffer
221
+ * and the reassembly code size is approximately 700 bytes.  The
222
+ * reassembly buffer is of the same size as the uip_buf buffer
223
+ * (configured by UIP_BUFSIZE).
224
+ *
225
+ * \note IP packet reassembly is not heavily tested.
226
+ *
227
+ * \hideinitializer
228
+ */
229
+#define UIP_REASSEMBLY 0
230
+
231
+/**
232
+ * The maximum time an IP fragment should wait in the reassembly
233
+ * buffer before it is dropped.
234
+ *
235
+ */
236
+#define UIP_REASS_MAXAGE 40
237
+
238
+/** @} */
239
+
240
+/*------------------------------------------------------------------------------*/
241
+/**
242
+ * \defgroup uipoptudp UDP configuration options
243
+ * @{
244
+ *
245
+ * \note The UDP support in uIP is still not entirely complete; there
246
+ * is no support for sending or receiving broadcast or multicast
247
+ * packets, but it works well enough to support a number of vital
248
+ * applications such as DNS queries, though
249
+ */
250
+
251
+/**
252
+ * Toggles wether UDP support should be compiled in or not.
253
+ *
254
+ * \hideinitializer
255
+ */
256
+#define UIP_UDP           1
257
+
258
+/**
259
+ * Toggles if UDP checksums should be used or not.
260
+ *
261
+ * \note Support for UDP checksums is currently not included in uIP,
262
+ * so this option has no function.
263
+ *
264
+ * \hideinitializer
265
+ */
266
+#define UIP_UDP_CHECKSUMS 0
267
+
268
+/**
269
+ * The maximum amount of concurrent UDP connections.
270
+ *
271
+ * \hideinitializer
272
+ */
273
+#define UIP_UDP_CONNS    10
274
+
275
+/**
276
+ * The name of the function that should be called when UDP datagrams arrive.
277
+ *
278
+ * \hideinitializer
279
+ */
280
+extern void uip_udp_appcall ( void );
281
+#define UIP_UDP_APPCALL  uip_udp_appcall
282
+
283
+/** @} */
284
+/*------------------------------------------------------------------------------*/
285
+/**
286
+ * \defgroup uipopttcp TCP configuration options
287
+ * @{
288
+ */
289
+
290
+/**
291
+ * Determines if support for opening connections from uIP should be
292
+ * compiled in.
293
+ *
294
+ * If the applications that are running on top of uIP for this project
295
+ * do not need to open outgoing TCP connections, this configration
296
+ * option can be turned off to reduce the code size of uIP.
297
+ *
298
+ * \hideinitializer
299
+ */
300
+#define UIP_ACTIVE_OPEN 1
301
+
302
+/**
303
+ * The maximum number of simultaneously open TCP connections.
304
+ *
305
+ * Since the TCP connections are statically allocated, turning this
306
+ * configuration knob down results in less RAM used. Each TCP
307
+ * connection requires approximatly 30 bytes of memory.
308
+ *
309
+ * \hideinitializer
310
+ */
311
+#define UIP_CONNS       10
312
+
313
+/**
314
+ * The maximum number of simultaneously listening TCP ports.
315
+ *
316
+ * Each listening TCP port requires 2 bytes of memory.
317
+ *
318
+ * \hideinitializer
319
+ */
320
+#define UIP_LISTENPORTS 10
321
+
322
+/**
323
+ * The size of the advertised receiver's window.
324
+ *
325
+ * Should be set low (i.e., to the size of the uip_buf buffer) is the
326
+ * application is slow to process incoming data, or high (32768 bytes)
327
+ * if the application processes data quickly.
328
+ *
329
+ * \hideinitializer
330
+ */
331
+#define UIP_RECEIVE_WINDOW   32768
332
+
333
+/**
334
+ * Determines if support for TCP urgent data notification should be
335
+ * compiled in.
336
+ *
337
+ * Urgent data (out-of-band data) is a rarely used TCP feature that
338
+ * very seldom would be required.
339
+ *
340
+ * \hideinitializer
341
+ */
342
+#define UIP_URGDATA      1
343
+
344
+/**
345
+ * The initial retransmission timeout counted in timer pulses.
346
+ *
347
+ * This should not be changed.
348
+ */
349
+#define UIP_RTO         3
350
+
351
+/**
352
+ * The maximum number of times a segment should be retransmitted
353
+ * before the connection should be aborted.
354
+ *
355
+ * This should not be changed.
356
+ */
357
+#define UIP_MAXRTX      8
358
+
359
+/**
360
+ * The maximum number of times a SYN segment should be retransmitted
361
+ * before a connection request should be deemed to have been
362
+ * unsuccessful.
363
+ *
364
+ * This should not need to be changed.
365
+ */
366
+#define UIP_MAXSYNRTX      3
367
+
368
+/**
369
+ * The TCP maximum segment size.
370
+ *
371
+ * This is should not be to set to more than UIP_BUFSIZE - UIP_LLH_LEN - 40.
372
+ */
373
+#define UIP_TCP_MSS     (UIP_BUFSIZE - UIP_LLH_LEN - 40)
374
+
375
+/**
376
+ * How long a connection should stay in the TIME_WAIT state.
377
+ *
378
+ * This configiration option has no real implication, and it should be
379
+ * left untouched.
380
+ */ 
381
+#define UIP_TIME_WAIT_TIMEOUT 120
382
+
383
+
384
+/** @} */
385
+/*------------------------------------------------------------------------------*/
386
+/**
387
+ * \defgroup uipoptarp ARP configuration options
388
+ * @{
389
+ */
390
+
391
+/**
392
+ * The size of the ARP table.
393
+ *
394
+ * This option should be set to a larger value if this uIP node will
395
+ * have many connections from the local network.
396
+ *
397
+ * \hideinitializer
398
+ */
399
+#define UIP_ARPTAB_SIZE 8
400
+
401
+/**
402
+ * The maxium age of ARP table entries measured in 10ths of seconds.
403
+ *
404
+ * An UIP_ARP_MAXAGE of 120 corresponds to 20 minutes (BSD
405
+ * default).
406
+ */
407
+#define UIP_ARP_MAXAGE 120
408
+
409
+/** @} */
410
+
411
+/*------------------------------------------------------------------------------*/
412
+
413
+/**
414
+ * \defgroup uipoptgeneral General configuration options
415
+ * @{
416
+ */
417
+
418
+/**
419
+ * The size of the uIP packet buffer.
420
+ *
421
+ * The uIP packet buffer should not be smaller than 60 bytes, and does
422
+ * not need to be larger than 1500 bytes. Lower size results in lower
423
+ * TCP throughput, larger size results in higher TCP throughput.
424
+ *
425
+ * \hideinitializer
426
+ */
427
+#define UIP_BUFSIZE     1500
428
+
429
+
430
+/**
431
+ * Determines if statistics support should be compiled in.
432
+ *
433
+ * The statistics is useful for debugging and to show the user.
434
+ *
435
+ * \hideinitializer
436
+ */
437
+#define UIP_STATISTICS  0
438
+
439
+/**
440
+ * Determines if logging of certain events should be compiled in.
441
+ *
442
+ * This is useful mostly for debugging. The function uip_log()
443
+ * must be implemented to suit the architecture of the project, if
444
+ * logging is turned on.
445
+ *
446
+ * \hideinitializer
447
+ */
448
+#define UIP_LOGGING     0
449
+
450
+/**
451
+ * Print out a uIP log message.
452
+ *
453
+ * This function must be implemented by the module that uses uIP, and
454
+ * is called by uIP whenever a log message is generated.
455
+ */
456
+void uip_log(char *msg);
457
+
458
+/**
459
+ * The link level header length.
460
+ *
461
+ * This is the offset into the uip_buf where the IP header can be
462
+ * found. For Ethernet, this should be set to 14. For SLIP, this
463
+ * should be set to 0.
464
+ *
465
+ * \hideinitializer
466
+ */
467
+#define UIP_LLH_LEN     0
468
+
469
+
470
+/** @} */
471
+/*------------------------------------------------------------------------------*/
472
+/**
473
+ * \defgroup uipoptcpu CPU architecture configuration
474
+ * @{
475
+ *
476
+ * The CPU architecture configuration is where the endianess of the
477
+ * CPU on which uIP is to be run is specified. Most CPUs today are
478
+ * little endian, and the most notable exception are the Motorolas
479
+ * which are big endian. The BYTE_ORDER macro should be changed to
480
+ * reflect the CPU architecture on which uIP is to be run.
481
+ */
482
+#ifndef LITTLE_ENDIAN
483
+#define LITTLE_ENDIAN  3412
484
+#endif /* LITTLE_ENDIAN */
485
+#ifndef BIG_ENDIAN
486
+#define BIG_ENDIAN     1234
487
+#endif /* BIGE_ENDIAN */
488
+
489
+/**
490
+ * The byte order of the CPU architecture on which uIP is to be run.
491
+ *
492
+ * This option can be either BIG_ENDIAN (Motorola byte order) or
493
+ * LITTLE_ENDIAN (Intel byte order).
494
+ *
495
+ * \hideinitializer
496
+ */
497
+#ifndef BYTE_ORDER
498
+#define BYTE_ORDER     LITTLE_ENDIAN
499
+#endif /* BYTE_ORDER */
500
+
501
+/** @} */
502
+/*------------------------------------------------------------------------------*/
503
+
504
+/**
505
+ * \defgroup uipoptapp Appication specific configurations
506
+ * @{
507
+ *
508
+ * An uIP application is implemented using a single application
509
+ * function that is called by uIP whenever a TCP/IP event occurs. The
510
+ * name of this function must be registered with uIP at compile time
511
+ * using the UIP_APPCALL definition.
512
+ *
513
+ * uIP applications can store the application state within the
514
+ * uip_conn structure by specifying the size of the application
515
+ * structure with the UIP_APPSTATE_SIZE macro.
516
+ *
517
+ * The file containing the definitions must be included in the
518
+ * uipopt.h file.
519
+ *
520
+ * The following example illustrates how this can look.
521
+ \code
522
+
523
+void httpd_appcall(void);
524
+#define UIP_APPCALL     httpd_appcall
525
+
526
+struct httpd_state {
527
+  u8_t state; 
528
+  u16_t count;
529
+  char *dataptr;
530
+  char *script;
531
+};
532
+#define UIP_APPSTATE_SIZE (sizeof(struct httpd_state))
533
+ \endcode
534
+ */
535
+
536
+/**
537
+ * \var #define UIP_APPCALL
538
+ *
539
+ * The name of the application function that uIP should call in
540
+ * response to TCP/IP events.
541
+ *
542
+ */
543
+extern void uip_tcp_appcall ( void );
544
+#define UIP_APPCALL uip_tcp_appcall
545
+
546
+/**
547
+ * \var #define UIP_APPSTATE_SIZE
548
+ *
549
+ * The size of the application state that is to be stored in the
550
+ * uip_conn structure.
551
+ */
552
+#define UIP_APPSTATE_SIZE sizeof ( void * )
553
+/** @} */
554
+
555
+/* Include the header file for the application program that should be
556
+   used. If you don't use the example web server, you should change
557
+   this. */
558
+//#include "httpd.h"
559
+
560
+#warning "Remove this static IP address hack"
561
+#undef UIP_FIXEDADDR
562
+#undef UIP_IPADDR0
563
+#undef UIP_IPADDR1
564
+#undef UIP_IPADDR2
565
+#undef UIP_IPADDR3
566
+#define UIP_FIXEDADDR 1
567
+#define UIP_IPADDR0 10
568
+#define UIP_IPADDR1 254
569
+#define UIP_IPADDR2 254
570
+#define UIP_IPADDR3 1
571
+
572
+#endif /* __UIPOPT_H__ */

Loading…
Cancel
Save