blob: 8316f9b4fac3a88ed378de074a6e97b57b2c92ff [file] [log] [blame]
adamdunkels1e45c6d2003-09-02 21:47:27 +00001/**
adamdunkels0170b082003-10-01 11:25:37 +00002 * \addtogroup uip
3 * @{
4 */
5
6/**
adamdunkels1e45c6d2003-09-02 21:47:27 +00007 * \file
8 * Header file for the uIP TCP/IP stack.
9 * \author Adam Dunkels <adam@dunkels.com>
10 *
11 * The uIP TCP/IP stack header file contains definitions for a number
12 * of C macros that are used by uIP programs as well as internal uIP
13 * structures, TCP/IP header structures and function declarations.
14 *
15 */
16
adamdunkels0170b082003-10-01 11:25:37 +000017
adamdunkelsca9ddcb2003-03-19 14:13:31 +000018/*
adamdunkels1e45c6d2003-09-02 21:47:27 +000019 * Copyright (c) 2001-2003, Adam Dunkels.
adamdunkelsca9ddcb2003-03-19 14:13:31 +000020 * All rights reserved.
21 *
22 * Redistribution and use in source and binary forms, with or without
23 * modification, are permitted provided that the following conditions
24 * are met:
25 * 1. Redistributions of source code must retain the above copyright
26 * notice, this list of conditions and the following disclaimer.
27 * 2. Redistributions in binary form must reproduce the above copyright
28 * notice, this list of conditions and the following disclaimer in the
29 * documentation and/or other materials provided with the distribution.
adamdunkels1e45c6d2003-09-02 21:47:27 +000030 * 3. The name of the author may not be used to endorse or promote
adamdunkelsca9ddcb2003-03-19 14:13:31 +000031 * products derived from this software without specific prior
32 * written permission.
33 *
34 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
35 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
36 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
37 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
38 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
39 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
40 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
41 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
42 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
43 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
44 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45 *
46 * This file is part of the uIP TCP/IP stack.
47 *
adamdunkels72a83032005-02-22 22:32:40 +000048 * $Id: uip.h,v 1.15 2005/02/22 22:32:40 adamdunkels Exp $
adamdunkelsca9ddcb2003-03-19 14:13:31 +000049 *
50 */
51
52#ifndef __UIP_H__
53#define __UIP_H__
54
55#include "uipopt.h"
56
adamdunkelsca9ddcb2003-03-19 14:13:31 +000057/*-----------------------------------------------------------------------------------*/
58/* First, the functions that should be called from the
59 * system. Initialization, the periodic timer and incoming packets are
60 * handled by the following three functions.
61 */
62
adamdunkels1e45c6d2003-09-02 21:47:27 +000063/**
adamdunkels0170b082003-10-01 11:25:37 +000064 * \defgroup uipconffunc uIP configuration functions
65 * @{
66 *
67 * The uIP configuration functions are used for setting run-time
68 * parameters in uIP such as IP addresses.
69 */
70
71/**
adamdunkels1e45c6d2003-09-02 21:47:27 +000072 * Set the IP address of this host.
adamdunkelsca9ddcb2003-03-19 14:13:31 +000073 *
adamdunkels1e45c6d2003-09-02 21:47:27 +000074 * The IP address is represented as a 4-byte array where the first
75 * octet of the IP address is put in the first member of the 4-byte
76 * array.
adamdunkelsca9ddcb2003-03-19 14:13:31 +000077 *
adamdunkels1e45c6d2003-09-02 21:47:27 +000078 * \param addr A pointer to a 4-byte representation of the IP address.
adamdunkelsb489e7a2003-10-14 11:12:50 +000079 *
80 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +000081 */
adamdunkels18076c62004-06-06 06:16:03 +000082#define uip_sethostaddr(addr) do { uip_hostaddr[0] = ((u16_t *)(addr))[0]; \
83 uip_hostaddr[1] = ((u16_t *)(addr))[1]; } while(0)
adamdunkelsca9ddcb2003-03-19 14:13:31 +000084
adamdunkels1e45c6d2003-09-02 21:47:27 +000085/**
86 * Get the IP address of this host.
adamdunkels66c6af62003-04-16 18:28:16 +000087 *
adamdunkels1e45c6d2003-09-02 21:47:27 +000088 * The IP address is represented as a 4-byte array where the first
89 * octet of the IP address is put in the first member of the 4-byte
90 * array.
91 *
92 * \param addr A pointer to a 4-byte array that will be filled in with
93 * the currently configured IP address.
adamdunkelsb489e7a2003-10-14 11:12:50 +000094 *
95 * \hideinitializer
adamdunkels66c6af62003-04-16 18:28:16 +000096 */
adamdunkels18076c62004-06-06 06:16:03 +000097#define uip_gethostaddr(addr) do { ((u16_t *)(addr))[0] = uip_hostaddr[0]; \
98 ((u16_t *)(addr))[1] = uip_hostaddr[1]; } while(0)
99
100/**
101 * Set the default router's IP address.
102 *
103 * \param addr A pointer to a 4-byte array containing the IP address
104 * of the default router.
105 *
106 * \hideinitializer
107 */
108#define uip_setdraddr(addr) do { uip_draddr[0] = ((u16_t *)(addr))[0]; \
109 uip_draddr[1] = ((u16_t *)(addr))[1]; } while(0)
110
111/**
112 * Set the netmask.
113 *
114 * \param addr A pointer to a 4-byte array containing the IP address
115 * of the netmask.
116 *
117 * \hideinitializer
118 */
119#define uip_setnetmask(addr) do { uip_netmask[0] = ((u16_t *)(addr))[0]; \
120 uip_netmask[1] = ((u16_t *)(addr))[1]; } while(0)
121
122
123/**
124 * Get the default router's IP address.
125 *
126 * \param addr A pointer to a 4-byte array that will be filled in with
127 * the IP address of the default router.
128 *
129 * \hideinitializer
130 */
131#define uip_getdraddr(addr) do { ((u16_t *)(addr))[0] = uip_draddr[0]; \
132 ((u16_t *)(addr))[1] = uip_draddr[1]; } while(0)
133
134/**
135 * Get the netmask.
136 *
137 * \param addr A pointer to a 4-byte array that will be filled in with
138 * the value of the netmask.
139 *
140 * \hideinitializer
141 */
142#define uip_getnetmask(addr) do { ((u16_t *)(addr))[0] = uip_netmask[0]; \
143 ((u16_t *)(addr))[1] = uip_netmask[1]; } while(0)
adamdunkels66c6af62003-04-16 18:28:16 +0000144
adamdunkels0170b082003-10-01 11:25:37 +0000145/** @} */
146
adamdunkelsb489e7a2003-10-14 11:12:50 +0000147/**
148 * \defgroup uipinit uIP initialization functions
149 * @{
150 *
151 * The uIP initialization functions are used for booting uIP.
152 */
adamdunkels0170b082003-10-01 11:25:37 +0000153
154/**
155 * uIP initialization function.
156 *
157 * This function should be called at boot up to initilize the uIP
158 * TCP/IP stack.
159 */
160void uip_init(void);
161
adamdunkelsb489e7a2003-10-14 11:12:50 +0000162/** @} */
163
adamdunkels0170b082003-10-01 11:25:37 +0000164/**
165 * \defgroup uipdevfunc uIP device driver functions
166 * @{
167 *
168 * These functions are used by a network device driver for interacting
169 * with uIP.
170 */
171
adamdunkels1e45c6d2003-09-02 21:47:27 +0000172/**
173 * Process an incoming packet.
174 *
175 * This function should be called when the device driver has received
176 * a packet from the network. The packet from the device driver must
177 * be present in the uip_buf buffer, and the length of the packet
178 * should be placed in the uip_len variable.
179 *
180 * When the function returns, there may be an outbound packet placed
181 * in the uip_buf packet buffer. If so, the uip_len variable is set to
182 * the length of the packet. If no packet is to be sent out, the
183 * uip_len variable is set to 0.
184 *
185 * The usual way of calling the function is presented by the source
186 * code below.
187 \code
188 uip_len = devicedriver_poll();
189 if(uip_len > 0) {
190 uip_input();
191 if(uip_len > 0) {
192 devicedriver_send();
193 }
194 }
195 \endcode
196 *
197 * \note If you are writing a uIP device driver that needs ARP
198 * (Address Resolution Protocol), e.g., when running uIP over
199 * Ethernet, you will need to call the uIP ARP code before calling
200 * this function:
201 \code
202 #define BUF ((struct uip_eth_hdr *)&uip_buf[0])
203 uip_len = ethernet_devicedrver_poll();
204 if(uip_len > 0) {
205 if(BUF->type == HTONS(UIP_ETHTYPE_IP)) {
206 uip_arp_ipin();
adamdunkels1e45c6d2003-09-02 21:47:27 +0000207 uip_input();
208 if(uip_len > 0) {
209 uip_arp_out();
210 ethernet_devicedriver_send();
211 }
212 } else if(BUF->type == HTONS(UIP_ETHTYPE_ARP)) {
213 uip_arp_arpin();
214 if(uip_len > 0) {
215 ethernet_devicedriver_send();
216 }
217 }
218 \endcode
adamdunkelsb489e7a2003-10-14 11:12:50 +0000219 *
220 * \hideinitializer
adamdunkels1e45c6d2003-09-02 21:47:27 +0000221 */
222#define uip_input() uip_process(UIP_DATA)
223
224/**
adamdunkels1e45c6d2003-09-02 21:47:27 +0000225 * Periodic processing for a connection identified by its number.
226 *
227 * This function does the necessary periodic processing (timers,
228 * polling) for a uIP TCP conneciton, and should be called when the
229 * periodic uIP timer goes off. It should be called for every
230 * connection, regardless of whether they are open of closed.
231 *
232 * When the function returns, it may have an outbound packet waiting
233 * for service in the uIP packet buffer, and if so the uip_len
234 * variable is set to a value larger than zero. The device driver
235 * should be called to send out the packet.
236 *
237 * The ususal way of calling the function is through a for() loop like
238 * this:
239 \code
240 for(i = 0; i < UIP_CONNS; ++i) {
241 uip_periodic(i);
242 if(uip_len > 0) {
243 devicedriver_send();
244 }
245 }
246 \endcode
247 *
248 * \note If you are writing a uIP device driver that needs ARP
249 * (Address Resolution Protocol), e.g., when running uIP over
250 * Ethernet, you will need to call the uip_arp_out() function before
251 * calling the device driver:
252 \code
253 for(i = 0; i < UIP_CONNS; ++i) {
254 uip_periodic(i);
255 if(uip_len > 0) {
256 uip_arp_out();
257 ethernet_devicedriver_send();
258 }
259 }
260 \endcode
261 *
262 * \param conn The number of the connection which is to be periodically polled.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000263 *
264 * \hideinitializer
adamdunkels1e45c6d2003-09-02 21:47:27 +0000265 */
266#define uip_periodic(conn) do { uip_conn = &uip_conns[conn]; \
267 uip_process(UIP_TIMER); } while (0)
268
269/**
270 * Periodic processing for a connection identified by a pointer to its structure.
271 *
272 * Same as uip_periodic() but takes a pointer to the actual uip_conn
273 * struct instead of an integer as its argument. This function can be
274 * used to force periodic processing of a specific connection.
275 *
276 * \param conn A pointer to the uip_conn struct for the connection to
277 * be processed.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000278 *
279 * \hideinitializer
adamdunkels1e45c6d2003-09-02 21:47:27 +0000280 */
281#define uip_periodic_conn(conn) do { uip_conn = conn; \
282 uip_process(UIP_TIMER); } while (0)
283
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000284#if UIP_UDP
adamdunkels1e45c6d2003-09-02 21:47:27 +0000285/**
286 * Periodic processing for a UDP connection identified by its number.
287 *
adamdunkels7461bcb2005-02-07 07:00:54 +0000288 * This function is essentially the same as uip_periodic(), but for
adamdunkels1e45c6d2003-09-02 21:47:27 +0000289 * UDP connections. It is called in a similar fashion as the
290 * uip_periodic() function:
291 \code
292 for(i = 0; i < UIP_UDP_CONNS; i++) {
293 uip_udp_periodic(i);
294 if(uip_len > 0) {
295 devicedriver_send();
296 }
297 }
298 \endcode
299 *
300 * \note As for the uip_periodic() function, special care has to be
301 * taken when using uIP together with ARP and Ethernet:
302 \code
303 for(i = 0; i < UIP_UDP_CONNS; i++) {
304 uip_udp_periodic(i);
305 if(uip_len > 0) {
306 uip_arp_out();
307 ethernet_devicedriver_send();
308 }
309 }
310 \endcode
311 *
312 * \param conn The number of the UDP connection to be processed.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000313 *
314 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000315 */
316#define uip_udp_periodic(conn) do { uip_udp_conn = &uip_udp_conns[conn]; \
317 uip_process(UIP_UDP_TIMER); } while (0)
adamdunkelseb91d5f2003-08-20 20:58:08 +0000318
adamdunkels1e45c6d2003-09-02 21:47:27 +0000319/**
320 * Periodic processing for a UDP connection identified by a pointer to
321 * its structure.
322 *
323 * Same as uip_udp_periodic() but takes a pointer to the actual
324 * uip_conn struct instead of an integer as its argument. This
325 * function can be used to force periodic processing of a specific
326 * connection.
327 *
328 * \param conn A pointer to the uip_udp_conn struct for the connection
329 * to be processed.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000330 *
331 * \hideinitializer
adamdunkelseb91d5f2003-08-20 20:58:08 +0000332 */
333#define uip_udp_periodic_conn(conn) do { uip_udp_conn = conn; \
334 uip_process(UIP_UDP_TIMER); } while (0)
adamdunkelsb489e7a2003-10-14 11:12:50 +0000335
336
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000337#endif /* UIP_UDP */
adamdunkels0170b082003-10-01 11:25:37 +0000338
339/**
340 * The uIP packet buffer.
341 *
342 * The uip_buf array is used to hold incoming and outgoing
343 * packets. The device driver should place incoming data into this
344 * buffer. When sending data, the device driver should read the link
345 * level headers and the TCP/IP headers from this buffer. The size of
346 * the link level headers is configured by the UIP_LLH_LEN define.
347 *
348 * \note The application data need not be placed in this buffer, so
349 * the device driver must read it from the place pointed to by the
350 * uip_appdata pointer as illustrated by the following example:
351 \code
352 void
353 devicedriver_send(void)
354 {
adamdunkels7461bcb2005-02-07 07:00:54 +0000355 hwsend(&uip_buf[0], UIP_LLH_LEN);
356 if(uip_len <= UIP_LLH_LEN + 40) {
357 hwsend(&uip_buf[UIP_LLH_LEN], uip_len - UIP_LLH_LEN);
358 } else {
359 hwsend(&uip_buf[UIP_LLH_LEN], 40);
360 hwsend(uip_appdata, uip_len - 40 - UIP_LLH_LEN);
361 }
adamdunkels0170b082003-10-01 11:25:37 +0000362 }
363 \endcode
364 */
365extern u8_t uip_buf[UIP_BUFSIZE+2];
366
367/** @} */
368
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000369/*-----------------------------------------------------------------------------------*/
370/* Functions that are used by the uIP application program. Opening and
371 * closing connections, sending and receiving data, etc. is all
372 * handled by the functions below.
373*/
adamdunkels0170b082003-10-01 11:25:37 +0000374/**
375 * \defgroup uipappfunc uIP application functions
376 * @{
377 *
378 * Functions used by an application running of top of uIP.
379 */
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000380
adamdunkels1e45c6d2003-09-02 21:47:27 +0000381/**
382 * Start listening to the specified port.
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000383 *
adamdunkels1e45c6d2003-09-02 21:47:27 +0000384 * \note Since this function expects the port number in network byte
385 * order, a conversion using HTONS() or htons() is necessary.
386 *
387 \code
388 uip_listen(HTONS(80));
389 \endcode
390 *
391 * \param port A 16-bit port number in network byte order.
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000392 */
393void uip_listen(u16_t port);
394
adamdunkels1e45c6d2003-09-02 21:47:27 +0000395/**
396 * Stop listening to the specified port.
adamdunkelscd8c3a22003-08-13 22:52:48 +0000397 *
adamdunkels1e45c6d2003-09-02 21:47:27 +0000398 * \note Since this function expects the port number in network byte
399 * order, a conversion using HTONS() or htons() is necessary.
400 *
401 \code
402 uip_unlisten(HTONS(80));
403 \endcode
404 *
405 * \param port A 16-bit port number in network byte order.
adamdunkelscd8c3a22003-08-13 22:52:48 +0000406 */
407void uip_unlisten(u16_t port);
408
adamdunkels1e45c6d2003-09-02 21:47:27 +0000409/**
410 * Connect to a remote host using TCP.
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000411 *
adamdunkels1e45c6d2003-09-02 21:47:27 +0000412 * This function is used to start a new connection to the specified
413 * port on the specied host. It allocates a new connection identifier,
414 * sets the connection to the SYN_SENT state and sets the
415 * retransmission timer to 0. This will cause a TCP SYN segment to be
416 * sent out the next time this connection is periodically processed,
417 * which usually is done within 0.5 seconds after the call to
418 * uip_connect().
419 *
420 * \note This function is avaliable only if support for active open
421 * has been configured by defining UIP_ACTIVE_OPEN to 1 in uipopt.h.
422 *
423 * \note Since this function requires the port number to be in network
adamdunkels7461bcb2005-02-07 07:00:54 +0000424 * byte order, a conversion using HTONS() or htons() is necessary.
adamdunkels1e45c6d2003-09-02 21:47:27 +0000425 *
426 \code
427 u16_t ipaddr[2];
428
429 uip_ipaddr(ipaddr, 192,168,1,2);
430 uip_connect(ipaddr, HTONS(80));
431 \endcode
432 *
433 * \param ripaddr A pointer to a 4-byte array representing the IP
434 * address of the remote hot.
435 *
436 * \param port A 16-bit port number in network byte order.
437 *
438 * \return A pointer to the uIP connection identifier for the new connection,
439 * or NULL if no connection could be allocated.
440 *
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000441 */
442struct uip_conn *uip_connect(u16_t *ripaddr, u16_t port);
443
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000444
445
adamdunkels0170b082003-10-01 11:25:37 +0000446/**
adamdunkelsb489e7a2003-10-14 11:12:50 +0000447 * \internal
448 *
adamdunkels0170b082003-10-01 11:25:37 +0000449 * Check if a connection has outstanding (i.e., unacknowledged) data.
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000450 *
adamdunkels0170b082003-10-01 11:25:37 +0000451 * \param conn A pointer to the uip_conn structure for the connection.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000452 *
453 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000454 */
455#define uip_outstanding(conn) ((conn)->len)
456
adamdunkels0170b082003-10-01 11:25:37 +0000457/**
458 * Send data on the current connection.
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000459 *
adamdunkels0170b082003-10-01 11:25:37 +0000460 * This function is used to send out a single segment of TCP
461 * data. Only applications that have been invoked by uIP for event
462 * processing can send data.
463 *
adamdunkelsb489e7a2003-10-14 11:12:50 +0000464 * The amount of data that actually is sent out after a call to this
465 * funcion is determined by the maximum amount of data TCP allows. uIP
466 * will automatically crop the data so that only the appropriate
467 * amount of data is sent. The function uip_mss() can be used to query
468 * uIP for the amount of data that actually will be sent.
469 *
adamdunkels0170b082003-10-01 11:25:37 +0000470 * \note This function does not guarantee that the sent data will
471 * arrive at the destination. If the data is lost in the network, the
472 * application will be invoked with the uip_rexmit() event being
473 * set. The application will then have to resend the data using this
474 * function.
475 *
476 * \param data A pointer to the data which is to be sent.
477 *
adamdunkelsb489e7a2003-10-14 11:12:50 +0000478 * \param len The maximum amount of data bytes to be sent.
479 *
480 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000481 */
adamdunkels18076c62004-06-06 06:16:03 +0000482#define uip_send(data, len) do { uip_sappdata = (void *)(data); uip_slen = (len);} while(0)
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000483
adamdunkels0170b082003-10-01 11:25:37 +0000484/**
485 * The length of any incoming data that is currently avaliable (if avaliable)
486 * in the uip_appdata buffer.
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000487 *
adamdunkels0170b082003-10-01 11:25:37 +0000488 * The test function uip_data() must first be used to check if there
489 * is any data available at all.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000490 *
491 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000492 */
493#define uip_datalen() uip_len
494
adamdunkels0170b082003-10-01 11:25:37 +0000495/**
496 * The length of any out-of-band data (urgent data) that has arrived
497 * on the connection.
498 *
499 * \note The configuration parameter UIP_URGDATA must be set for this
500 * function to be enabled.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000501 *
502 * \hideinitializer
adamdunkels0170b082003-10-01 11:25:37 +0000503 */
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000504#define uip_urgdatalen() uip_urglen
505
adamdunkels0170b082003-10-01 11:25:37 +0000506/**
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000507 * Close the current connection.
adamdunkels0170b082003-10-01 11:25:37 +0000508 *
509 * This function will close the current connection in a nice way.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000510 *
511 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000512 */
513#define uip_close() (uip_flags = UIP_CLOSE)
514
adamdunkels0170b082003-10-01 11:25:37 +0000515/**
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000516 * Abort the current connection.
adamdunkels0170b082003-10-01 11:25:37 +0000517 *
518 * This function will abort (reset) the current connection, and is
519 * usually used when an error has occured that prevents using the
520 * uip_close() function.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000521 *
522 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000523 */
524#define uip_abort() (uip_flags = UIP_ABORT)
525
adamdunkels0170b082003-10-01 11:25:37 +0000526/**
527 * Tell the sending host to stop sending data.
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000528 *
adamdunkels0170b082003-10-01 11:25:37 +0000529 * This function will close our receiver's window so that we stop
530 * receiving data for the current connection.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000531 *
532 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000533 */
534#define uip_stop() (uip_conn->tcpstateflags |= UIP_STOPPED)
535
adamdunkels0170b082003-10-01 11:25:37 +0000536/**
537 * Find out if the current connection has been previously stopped with
538 * uip_stop().
adamdunkelsb489e7a2003-10-14 11:12:50 +0000539 *
540 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000541 */
542#define uip_stopped(conn) ((conn)->tcpstateflags & UIP_STOPPED)
543
adamdunkels0170b082003-10-01 11:25:37 +0000544/**
545 * Restart the current connection, if is has previously been stopped
546 * with uip_stop().
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000547 *
adamdunkels0170b082003-10-01 11:25:37 +0000548 * This function will open the receiver's window again so that we
549 * start receiving data for the current connection.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000550 *
551 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000552 */
553#define uip_restart() do { uip_flags |= UIP_NEWDATA; \
554 uip_conn->tcpstateflags &= ~UIP_STOPPED; \
555 } while(0)
556
557
558/* uIP tests that can be made to determine in what state the current
559 connection is, and what the application function should do. */
560
adamdunkels0170b082003-10-01 11:25:37 +0000561/**
adamdunkels18076c62004-06-06 06:16:03 +0000562 * Is the current connection a UDP connection?
563 *
564 * This function checks whether the current connection is a UDP connection.
565 *
566 * \hideinitializer
567 *
568 */
569#define uip_udpconnection() (uip_conn == NULL)
570
571/**
adamdunkels0170b082003-10-01 11:25:37 +0000572 * Is new incoming data available?
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000573 *
574 * Will reduce to non-zero if there is new data for the application
575 * present at the uip_appdata pointer. The size of the data is
576 * avaliable through the uip_len variable.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000577 *
578 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000579 */
580#define uip_newdata() (uip_flags & UIP_NEWDATA)
581
adamdunkels0170b082003-10-01 11:25:37 +0000582/**
583 * Has previously sent data been acknowledged?
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000584 *
585 * Will reduce to non-zero if the previously sent data has been
586 * acknowledged by the remote host. This means that the application
adamdunkels0170b082003-10-01 11:25:37 +0000587 * can send new data.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000588 *
589 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000590 */
591#define uip_acked() (uip_flags & UIP_ACKDATA)
adamdunkels0170b082003-10-01 11:25:37 +0000592
593/**
adamdunkels0170b082003-10-01 11:25:37 +0000594 * Has the connection just been connected?
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000595 *
596 * Reduces to non-zero if the current connection has been connected to
597 * a remote host. This will happen both if the connection has been
598 * actively opened (with uip_connect()) or passively opened (with
599 * uip_listen()).
adamdunkelsb489e7a2003-10-14 11:12:50 +0000600 *
601 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000602 */
603#define uip_connected() (uip_flags & UIP_CONNECTED)
604
adamdunkels0170b082003-10-01 11:25:37 +0000605/**
606 * Has the connection been closed by the other end?
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000607 *
608 * Is non-zero if the connection has been closed by the remote
adamdunkels0170b082003-10-01 11:25:37 +0000609 * host. The application may then do the necessary clean-ups.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000610 *
611 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000612 */
613#define uip_closed() (uip_flags & UIP_CLOSE)
614
adamdunkels0170b082003-10-01 11:25:37 +0000615/**
616 * Has the connection been aborted by the other end?
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000617 *
618 * Non-zero if the current connection has been aborted (reset) by the
619 * remote host.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000620 *
621 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000622 */
623#define uip_aborted() (uip_flags & UIP_ABORT)
624
adamdunkels0170b082003-10-01 11:25:37 +0000625/**
626 * Has the connection timed out?
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000627 *
628 * Non-zero if the current connection has been aborted due to too many
629 * retransmissions.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000630 *
631 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000632 */
adamdunkels399a0782004-02-16 20:52:07 +0000633#define uip_timedout() (uip_flags & UIP_TIMEDOUT)
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000634
adamdunkels0170b082003-10-01 11:25:37 +0000635/**
636 * Do we need to retransmit previously data?
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000637 *
638 * Reduces to non-zero if the previously sent data has been lost in
639 * the network, and the application should retransmit it. The
adamdunkels0170b082003-10-01 11:25:37 +0000640 * application should send the exact same data as it did the last
641 * time, using the uip_send() function.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000642 *
643 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000644 */
645#define uip_rexmit() (uip_flags & UIP_REXMIT)
646
adamdunkels0170b082003-10-01 11:25:37 +0000647/**
648 * Is the connection being polled by uIP?
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000649 *
650 * Is non-zero if the reason the application is invoked is that the
651 * current connection has been idle for a while and should be
652 * polled.
adamdunkels0170b082003-10-01 11:25:37 +0000653 *
654 * The polling event can be used for sending data without having to
655 * wait for the remote host to send data.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000656 *
657 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000658 */
659#define uip_poll() (uip_flags & UIP_POLL)
660
adamdunkels0170b082003-10-01 11:25:37 +0000661/**
662 * Get the initial maxium segment size (MSS) of the current
663 * connection.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000664 *
665 * \hideinitializer
adamdunkels0170b082003-10-01 11:25:37 +0000666 */
667#define uip_initialmss() (uip_conn->initialmss)
668
669/**
adamdunkelsb489e7a2003-10-14 11:12:50 +0000670 * Get the current maxium segment size that can be sent on the current
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000671 * connection.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000672 *
673 * The current maxiumum segment size that can be sent on the
674 * connection is computed from the receiver's window and the MSS of
675 * the connection (which also is available by calling
676 * uip_initialmss()).
677 *
678 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000679 */
680#define uip_mss() (uip_conn->mss)
681
adamdunkelsb489e7a2003-10-14 11:12:50 +0000682/**
683 * Set up a new UDP connection.
684 *
685 * \param ripaddr A pointer to a 4-byte structure representing the IP
686 * address of the remote host.
687 *
688 * \param rport The remote port number in network byte order.
689 *
690 * \return The uip_udp_conn structure for the new connection or NULL
691 * if no connection could be allocated.
692 */
693struct uip_udp_conn *uip_udp_new(u16_t *ripaddr, u16_t rport);
694
695/**
696 * Removed a UDP connection.
697 *
698 * \param conn A pointer to the uip_udp_conn structure for the connection.
699 *
700 * \hideinitializer
701 */
702#define uip_udp_remove(conn) (conn)->lport = 0
703
704/**
adamdunkels37f0b8d2004-07-04 17:00:50 +0000705 * Bind a UDP connection to a local port.
706 *
707 * \param conn A pointer to the uip_udp_conn structure for the
708 * connection.
709 *
710 * \param port The local port number, in network byte order.
711 *
712 * \hideinitializer
713 */
714#define uip_udp_bind(conn, port) (conn)->lport = port
715
716/**
adamdunkelsb489e7a2003-10-14 11:12:50 +0000717 * Send a UDP datagram of length len on the current connection.
718 *
719 * This function can only be called in response to a UDP event (poll
720 * or newdata). The data must be present in the uip_buf buffer, at the
721 * place pointed to by the uip_appdata pointer.
722 *
723 * \param len The length of the data in the uip_buf buffer.
724 *
725 * \hideinitializer
726 */
727#define uip_udp_send(len) uip_slen = (len)
728
adamdunkels0170b082003-10-01 11:25:37 +0000729/** @} */
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000730
731/* uIP convenience and converting functions. */
732
adamdunkels0170b082003-10-01 11:25:37 +0000733/**
734 * \defgroup uipconvfunc uIP conversion functions
735 * @{
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000736 *
adamdunkels0170b082003-10-01 11:25:37 +0000737 * These functions can be used for converting between different data
738 * formats used by uIP.
739 */
740
741/**
742 * Pack an IP address into a 4-byte array which is used by uIP to
743 * represent IP addresses.
744 *
745 * Example:
746 \code
747 u16_t ipaddr[2];
748
749 uip_ipaddr(&ipaddr, 192,168,1,2);
750 \endcode
751 *
752 * \param addr A pointer to a 4-byte array that will be filled in with
753 * the IP addres.
754 * \param addr0 The first octet of the IP address.
755 * \param addr1 The second octet of the IP address.
756 * \param addr2 The third octet of the IP address.
757 * \param addr3 The forth octet of the IP address.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000758 *
759 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000760 */
761#define uip_ipaddr(addr, addr0,addr1,addr2,addr3) do { \
adamdunkels18076c62004-06-06 06:16:03 +0000762 ((u16_t *)(addr))[0] = HTONS(((addr0) << 8) | (addr1)); \
763 ((u16_t *)(addr))[1] = HTONS(((addr2) << 8) | (addr3)); \
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000764 } while(0)
765
adamdunkels0170b082003-10-01 11:25:37 +0000766/**
adamdunkels18076c62004-06-06 06:16:03 +0000767 * Copy an IP address to another IP address.
768 *
769 * Copies an IP address from one place to another.
770 *
771 * Example:
772 \code
773 u16_t ipaddr1[2], ipaddr2[2];
774
775 uip_ipaddr(ipaddr1, 192,16,1,2);
776 uip_ipaddr_copy(ipaddr2, ipaddr1);
777 \endcode
778 *
779 * \param dest The destination for the copy.
780 * \param src The source from where to copy.
781 *
782 * \hideinitializer
783 */
784#define uip_ipaddr_copy(dest, src) do { \
785 ((u16_t *)dest)[0] = ((u16_t *)src)[0]; \
786 ((u16_t *)dest)[1] = ((u16_t *)src)[1]; \
787 } while(0)
788/**
789 * Compare two IP addresses
790 *
791 * Compares two IP addresses.
792 *
793 * Example:
794 \code
795 u16_t ipaddr1[2], ipaddr2[2];
796
797 uip_ipaddr(ipaddr1, 192,16,1,2);
798 if(uip_ipaddr_cmp(ipaddr2, ipaddr1)) {
799 printf("They are the same");
800 }
801 \endcode
802 *
803 * \param addr1 The first IP address.
804 * \param addr2 The second IP address.
805 *
806 * \hideinitializer
807 */
808#define uip_ipaddr_cmp(addr1, addr2) (((u16_t *)addr1)[0] == ((u16_t *)addr2)[0] && \
809 ((u16_t *)addr1)[1] == ((u16_t *)addr2)[1])
810
811/**
812 * Compare two IP addresses with netmasks
813 *
814 * Compares two IP addresses with netmasks. The masks are used to mask
815 * out the bits that are to be compared.
816 *
817 * Example:
818 \code
819 u16_t ipaddr1[2], ipaddr2[2], mask[2];
820
821 uip_ipaddr(mask, 255,255,255,0);
822 uip_ipaddr(ipaddr1, 192,16,1,2);
823 uip_ipaddr(ipaddr2, 192,16,1,3);
824 if(uip_ipaddr_maskcmp(ipaddr1, ipaddr2, mask)) {
825 printf("They are the same");
826 }
827 \endcode
828 *
829 * \param addr1 The first IP address.
830 * \param addr2 The second IP address.
831 * \param mask The netmask.
832 *
833 * \hideinitializer
834 */
835#define uip_ipaddr_maskcmp(addr1, addr2, mask) \
836 (((((u16_t *)addr1)[0] & ((u16_t *)mask)[0]) == \
837 (((u16_t *)addr2)[0] & ((u16_t *)mask)[0])) && \
838 ((((u16_t *)addr1)[1] & ((u16_t *)mask)[1]) == \
839 (((u16_t *)addr2)[1] & ((u16_t *)mask)[1])))
840
841
842/**
843 * Mask out the network part of an IP address.
844 *
845 * Masks out the network part of an IP address, given the address and
846 * the netmask.
847 *
848 * Example:
849 \code
850 u16_t ipaddr1[2], ipaddr2[2], netmask[2];
851
852 uip_ipaddr(ipaddr1, 192,16,1,2);
853 uip_ipaddr(netmask, 255,255,255,0);
854 uip_ipaddr_mask(ipaddr2, ipaddr1, netmask);
855 \endcode
856 *
857 * In the example above, the variable "ipaddr2" will contain the IP
858 * address 192.168.1.0.
859 *
860 * \param dest Where the result is to be placed.
861 * \param src The IP address.
862 * \param mask The netmask.
863 *
864 * \hideinitializer
865 */
866#define uip_ipaddr_mask(dest, src, mask) do { \
867 ((u16_t *)dest)[0] = ((u16_t *)src)[0] & ((u16_t *)mask)[0]; \
868 ((u16_t *)dest)[1] = ((u16_t *)src)[1] & ((u16_t *)mask)[1]; \
869 } while(0)
870
871/**
872 * Pick the first octet of an IP address.
873 *
874 * Picks out the first octet of an IP address.
875 *
876 * Example:
877 \code
878 u16_t ipaddr[2];
879 u8_t octet;
880
881 uip_ipaddr(ipaddr, 1,2,3,4);
882 octet = uip_ipaddr1(ipaddr);
883 \endcode
884 *
885 * In the example above, the variable "octet" will contain the value 1.
886 *
887 * \hideinitializer
888 */
889#define uip_ipaddr1(addr) (htons(((u16_t *)(addr))[0]) >> 8)
890
891/**
892 * Pick the second octet of an IP address.
893 *
894 * Picks out the second octet of an IP address.
895 *
896 * Example:
897 \code
898 u16_t ipaddr[2];
899 u8_t octet;
900
901 uip_ipaddr(ipaddr, 1,2,3,4);
902 octet = uip_ipaddr2(ipaddr);
903 \endcode
904 *
905 * In the example above, the variable "octet" will contain the value 2.
906 *
907 * \hideinitializer
908 */
909#define uip_ipaddr2(addr) (htons(((u16_t *)(addr))[0]) & 0xff)
910
911/**
912 * Pick the third octet of an IP address.
913 *
914 * Picks out the third octet of an IP address.
915 *
916 * Example:
917 \code
918 u16_t ipaddr[2];
919 u8_t octet;
920
921 uip_ipaddr(ipaddr, 1,2,3,4);
922 octet = uip_ipaddr3(ipaddr);
923 \endcode
924 *
925 * In the example above, the variable "octet" will contain the value 3.
926 *
927 * \hideinitializer
928 */
929#define uip_ipaddr3(addr) (htons(((u16_t *)(addr))[1]) >> 8)
930
931/**
932 * Pick the fourth octet of an IP address.
933 *
934 * Picks out the fourth octet of an IP address.
935 *
936 * Example:
937 \code
938 u16_t ipaddr[2];
939 u8_t octet;
940
941 uip_ipaddr(ipaddr, 1,2,3,4);
942 octet = uip_ipaddr4(ipaddr);
943 \endcode
944 *
945 * In the example above, the variable "octet" will contain the value 4.
946 *
947 * \hideinitializer
948 */
949#define uip_ipaddr4(addr) (htons(((u16_t *)(addr))[1]) & 0xff)
950
951/**
adamdunkels0170b082003-10-01 11:25:37 +0000952 * Convert 16-bit quantity from host byte order to network byte order.
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000953 *
adamdunkels0170b082003-10-01 11:25:37 +0000954 * This macro is primarily used for converting constants from host
955 * byte order to network byte order. For converting variables to
956 * network byte order, use the htons() function instead.
adamdunkelsb489e7a2003-10-14 11:12:50 +0000957 *
958 * \hideinitializer
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000959 */
adamdunkels47ec7fa2003-03-28 12:11:17 +0000960#ifndef HTONS
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000961# if BYTE_ORDER == BIG_ENDIAN
adamdunkels47ec7fa2003-03-28 12:11:17 +0000962# define HTONS(n) (n)
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000963# else /* BYTE_ORDER == BIG_ENDIAN */
adamdunkels47ec7fa2003-03-28 12:11:17 +0000964# define HTONS(n) ((((u16_t)((n) & 0xff)) << 8) | (((n) & 0xff00) >> 8))
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000965# endif /* BYTE_ORDER == BIG_ENDIAN */
adamdunkels47ec7fa2003-03-28 12:11:17 +0000966#endif /* HTONS */
967
adamdunkels0170b082003-10-01 11:25:37 +0000968/**
969 * Convert 16-bit quantity from host byte order to network byte order.
970 *
971 * This function is primarily used for converting variables from host
972 * byte order to network byte order. For converting constants to
973 * network byte order, use the HTONS() macro instead.
974 */
adamdunkels47ec7fa2003-03-28 12:11:17 +0000975#ifndef htons
976u16_t htons(u16_t val);
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000977#endif /* htons */
978
adamdunkels0170b082003-10-01 11:25:37 +0000979/** @} */
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000980
adamdunkels0170b082003-10-01 11:25:37 +0000981/**
982 * Pointer to the application data in the packet buffer.
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000983 *
984 * This pointer points to the application data when the application is
adamdunkels0170b082003-10-01 11:25:37 +0000985 * called. If the application wishes to send data, the application may
986 * use this space to write the data into before calling uip_send().
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000987 */
adamdunkels18076c62004-06-06 06:16:03 +0000988extern u8_t *uip_appdata;
989extern u8_t *uip_sappdata;
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000990
991#if UIP_URGDATA > 0
992/* u8_t *uip_urgdata:
993 *
994 * This pointer points to any urgent data that has been received. Only
995 * present if compiled with support for urgent data (UIP_URGDATA).
996 */
adamdunkels18076c62004-06-06 06:16:03 +0000997extern u8_t *uip_urgdata;
adamdunkelsca9ddcb2003-03-19 14:13:31 +0000998#endif /* UIP_URGDATA > 0 */
999
1000
1001/* u[8|16]_t uip_len:
1002 *
1003 * When the application is called, uip_len contains the length of any
1004 * new data that has been received from the remote host. The
1005 * application should set this variable to the size of any data that
1006 * the application wishes to send. When the network device driver
1007 * output function is called, uip_len should contain the length of the
1008 * outgoing packet.
1009 */
adamdunkels18076c62004-06-06 06:16:03 +00001010extern u16_t uip_len, uip_slen;
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001011
1012#if UIP_URGDATA > 0
adamdunkels18076c62004-06-06 06:16:03 +00001013extern u8_t uip_urglen, uip_surglen;
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001014#endif /* UIP_URGDATA > 0 */
1015
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001016
adamdunkels0170b082003-10-01 11:25:37 +00001017/**
1018 * Representation of a uIP TCP connection.
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001019 *
1020 * The uip_conn structure is used for identifying a connection. All
1021 * but one field in the structure are to be considered read-only by an
1022 * application. The only exception is the appstate field whos purpose
1023 * is to let the application store application-specific state (e.g.,
1024 * file pointers) for the connection. The size of this field is
1025 * configured in the "uipopt.h" header file.
1026 */
1027struct uip_conn {
adamdunkels0170b082003-10-01 11:25:37 +00001028 u16_t ripaddr[2]; /**< The IP address of the remote host. */
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001029
adamdunkels0170b082003-10-01 11:25:37 +00001030 u16_t lport; /**< The local TCP port, in network byte order. */
1031 u16_t rport; /**< The local remote TCP port, in network byte
1032 order. */
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001033
adamdunkels0170b082003-10-01 11:25:37 +00001034 u8_t rcv_nxt[4]; /**< The sequence number that we expect to
1035 receive next. */
1036 u8_t snd_nxt[4]; /**< The sequence number that was last sent by
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001037 us. */
adamdunkels0170b082003-10-01 11:25:37 +00001038 u16_t len; /**< Length of the data that was previously sent. */
1039 u16_t mss; /**< Current maximum segment size for the
1040 connection. */
1041 u16_t initialmss; /**< Initial maximum segment size for the
1042 connection. */
adamdunkelsb489e7a2003-10-14 11:12:50 +00001043 u8_t sa; /**< Retransmission time-out calculation state
1044 variable. */
1045 u8_t sv; /**< Retransmission time-out calculation state
1046 variable. */
1047 u8_t rto; /**< Retransmission time-out. */
adamdunkels0170b082003-10-01 11:25:37 +00001048 u8_t tcpstateflags; /**< TCP state and flags. */
1049 u8_t timer; /**< The retransmission timer. */
1050 u8_t nrtx; /**< The number of retransmissions for the last
1051 segment sent. */
1052
1053 /** The application state. */
1054 u8_t appstate[UIP_APPSTATE_SIZE];
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001055};
1056
adamdunkels0170b082003-10-01 11:25:37 +00001057
1058/* Pointer to the current connection. */
1059extern struct uip_conn *uip_conn;
1060/* The array containing all uIP connections. */
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001061extern struct uip_conn uip_conns[UIP_CONNS];
adamdunkels0170b082003-10-01 11:25:37 +00001062/**
1063 * \addtogroup uiparch
1064 * @{
1065 */
1066
1067/**
1068 * 4-byte array used for the 32-bit sequence number calculations.
1069 */
adamdunkels18076c62004-06-06 06:16:03 +00001070extern u8_t uip_acc32[4];
adamdunkels0170b082003-10-01 11:25:37 +00001071
1072/** @} */
1073
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001074
1075#if UIP_UDP
adamdunkels1e45c6d2003-09-02 21:47:27 +00001076/**
1077 * Representation of a uIP UDP connection.
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001078 */
1079struct uip_udp_conn {
adamdunkelsb489e7a2003-10-14 11:12:50 +00001080 u16_t ripaddr[2]; /**< The IP address of the remote peer. */
1081 u16_t lport; /**< The local port number in network byte order. */
1082 u16_t rport; /**< The remote port number in network byte order. */
adamdunkels399a0782004-02-16 20:52:07 +00001083
1084 /** The application state. */
1085 u8_t appstate[UIP_APPSTATE_SIZE];
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001086};
1087
1088extern struct uip_udp_conn *uip_udp_conn;
1089extern struct uip_udp_conn uip_udp_conns[UIP_UDP_CONNS];
1090#endif /* UIP_UDP */
1091
adamdunkelsb489e7a2003-10-14 11:12:50 +00001092/**
1093 * The structure holding the TCP/IP statistics that are gathered if
1094 * UIP_STATISTICS is set to 1.
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001095 *
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001096 */
1097struct uip_stats {
1098 struct {
adamdunkelsb489e7a2003-10-14 11:12:50 +00001099 uip_stats_t drop; /**< Number of dropped packets at the IP
1100 layer. */
1101 uip_stats_t recv; /**< Number of received packets at the IP
1102 layer. */
1103 uip_stats_t sent; /**< Number of sent packets at the IP
1104 layer. */
1105 uip_stats_t vhlerr; /**< Number of packets dropped due to wrong
1106 IP version or header length. */
1107 uip_stats_t hblenerr; /**< Number of packets dropped due to wrong
1108 IP length, high byte. */
1109 uip_stats_t lblenerr; /**< Number of packets dropped due to wrong
1110 IP length, low byte. */
1111 uip_stats_t fragerr; /**< Number of packets dropped since they
1112 were IP fragments. */
1113 uip_stats_t chkerr; /**< Number of packets dropped due to IP
1114 checksum errors. */
1115 uip_stats_t protoerr; /**< Number of packets dropped since they
1116 were neither ICMP, UDP nor TCP. */
1117 } ip; /**< IP statistics. */
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001118 struct {
adamdunkelsb489e7a2003-10-14 11:12:50 +00001119 uip_stats_t drop; /**< Number of dropped ICMP packets. */
1120 uip_stats_t recv; /**< Number of received ICMP packets. */
1121 uip_stats_t sent; /**< Number of sent ICMP packets. */
1122 uip_stats_t typeerr; /**< Number of ICMP packets with a wrong
1123 type. */
1124 } icmp; /**< ICMP statistics. */
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001125 struct {
adamdunkelsb489e7a2003-10-14 11:12:50 +00001126 uip_stats_t drop; /**< Number of dropped TCP segments. */
1127 uip_stats_t recv; /**< Number of recived TCP segments. */
1128 uip_stats_t sent; /**< Number of sent TCP segments. */
1129 uip_stats_t chkerr; /**< Number of TCP segments with a bad
1130 checksum. */
1131 uip_stats_t ackerr; /**< Number of TCP segments with a bad ACK
1132 number. */
1133 uip_stats_t rst; /**< Number of recevied TCP RST (reset) segments. */
1134 uip_stats_t rexmit; /**< Number of retransmitted TCP segments. */
1135 uip_stats_t syndrop; /**< Number of dropped SYNs due to too few
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001136 connections was avaliable. */
adamdunkelsb489e7a2003-10-14 11:12:50 +00001137 uip_stats_t synrst; /**< Number of SYNs for closed ports,
1138 triggering a RST. */
1139 } tcp; /**< TCP statistics. */
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001140};
1141
adamdunkelsb489e7a2003-10-14 11:12:50 +00001142/**
1143 * The uIP TCP/IP statistics.
1144 *
1145 * This is the variable in which the uIP TCP/IP statistics are gathered.
1146 */
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001147extern struct uip_stats uip_stat;
1148
1149
1150/*-----------------------------------------------------------------------------------*/
1151/* All the stuff below this point is internal to uIP and should not be
1152 * used directly by an application or by a device driver.
1153 */
1154/*-----------------------------------------------------------------------------------*/
1155/* u8_t uip_flags:
1156 *
1157 * When the application is called, uip_flags will contain the flags
1158 * that are defined in this file. Please read below for more
1159 * infomation.
1160 */
adamdunkels18076c62004-06-06 06:16:03 +00001161extern u8_t uip_flags;
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001162
1163/* The following flags may be set in the global variable uip_flags
1164 before calling the application callback. The UIP_ACKDATA and
1165 UIP_NEWDATA flags may both be set at the same time, whereas the
1166 others are mutualy exclusive. Note that these flags should *NOT* be
1167 accessed directly, but through the uIP functions/macros. */
1168
1169#define UIP_ACKDATA 1 /* Signifies that the outstanding data was
1170 acked and the application should send
1171 out new data instead of retransmitting
1172 the last data. */
1173#define UIP_NEWDATA 2 /* Flags the fact that the peer has sent
1174 us new data. */
1175#define UIP_REXMIT 4 /* Tells the application to retransmit the
1176 data that was last sent. */
1177#define UIP_POLL 8 /* Used for polling the application, to
1178 check if the application has data that
1179 it wants to send. */
1180#define UIP_CLOSE 16 /* The remote host has closed the
1181 connection, thus the connection has
1182 gone away. Or the application signals
1183 that it wants to close the
1184 connection. */
1185#define UIP_ABORT 32 /* The remote host has aborted the
1186 connection, thus the connection has
1187 gone away. Or the application signals
1188 that it wants to abort the
1189 connection. */
1190#define UIP_CONNECTED 64 /* We have got a connection from a remote
1191 host and have set up a new connection
1192 for it, or an active connection has
1193 been successfully established. */
1194
1195#define UIP_TIMEDOUT 128 /* The connection has been aborted due to
1196 too many retransmissions. */
1197
1198
1199/* uip_process(flag):
1200 *
1201 * The actual uIP function which does all the work.
1202 */
1203void uip_process(u8_t flag);
1204
1205/* The following flags are passed as an argument to the uip_process()
1206 function. They are used to distinguish between the two cases where
1207 uip_process() is called. It can be called either because we have
1208 incoming data that should be processed, or because the periodic
1209 timer has fired. */
1210
1211#define UIP_DATA 1 /* Tells uIP that there is incoming data in
1212 the uip_buf buffer. The length of the
1213 data is stored in the global variable
1214 uip_len. */
1215#define UIP_TIMER 2 /* Tells uIP that the periodic timer has
1216 fired. */
1217#if UIP_UDP
1218#define UIP_UDP_TIMER 3
1219#endif /* UIP_UDP */
1220
1221/* The TCP states used in the uip_conn->tcpstateflags. */
1222#define CLOSED 0
1223#define SYN_RCVD 1
1224#define SYN_SENT 2
1225#define ESTABLISHED 3
1226#define FIN_WAIT_1 4
1227#define FIN_WAIT_2 5
1228#define CLOSING 6
1229#define TIME_WAIT 7
1230#define LAST_ACK 8
1231#define TS_MASK 15
1232
1233#define UIP_STOPPED 16
1234
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001235#define UIP_TCPIP_HLEN 40
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001236
1237/* The TCP and IP headers. */
1238typedef struct {
1239 /* IP header. */
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001240 u8_t vhl,
1241 tos,
1242 len[2],
1243 ipid[2],
1244 ipoffset[2],
1245 ttl,
1246 proto;
1247 u16_t ipchksum;
1248 u16_t srcipaddr[2],
1249 destipaddr[2];
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001250
1251 /* TCP header. */
1252 u16_t srcport,
1253 destport;
1254 u8_t seqno[4],
1255 ackno[4],
1256 tcpoffset,
1257 flags,
1258 wnd[2];
1259 u16_t tcpchksum;
1260 u8_t urgp[2];
1261 u8_t optdata[4];
1262} uip_tcpip_hdr;
1263
1264/* The ICMP and IP headers. */
1265typedef struct {
1266 /* IP header. */
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001267 u8_t vhl,
1268 tos,
1269 len[2],
1270 ipid[2],
1271 ipoffset[2],
1272 ttl,
1273 proto;
1274 u16_t ipchksum;
1275 u16_t srcipaddr[2],
1276 destipaddr[2];
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001277 /* ICMP (echo) header. */
1278 u8_t type, icode;
1279 u16_t icmpchksum;
1280 u16_t id, seqno;
1281} uip_icmpip_hdr;
1282
1283
1284/* The UDP and IP headers. */
1285typedef struct {
1286 /* IP header. */
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001287 u8_t vhl,
1288 tos,
1289 len[2],
1290 ipid[2],
1291 ipoffset[2],
1292 ttl,
1293 proto;
1294 u16_t ipchksum;
1295 u16_t srcipaddr[2],
1296 destipaddr[2];
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001297
1298 /* UDP header. */
1299 u16_t srcport,
1300 destport;
1301 u16_t udplen;
1302 u16_t udpchksum;
1303} uip_udpip_hdr;
1304
1305#define UIP_PROTO_ICMP 1
1306#define UIP_PROTO_TCP 6
1307#define UIP_PROTO_UDP 17
1308
adamdunkels72a83032005-02-22 22:32:40 +00001309/* Header sizes. */
1310#define UIP_IPH_LEN 20 /* Size of IP header */
1311#define UIP_UDPH_LEN 8 /* Size of UDP header */
1312#define UIP_TCPH_LEN 20 /* Size of TCP header */
1313#define UIP_IPUDPH_LEN 28 /* Size of IP + UDP header */
1314#define UIP_IPTCPH_LEN 40 /* Size of IP + TCP header */
1315
adamdunkels18076c62004-06-06 06:16:03 +00001316
1317
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001318#if UIP_FIXEDADDR
adamdunkels18076c62004-06-06 06:16:03 +00001319extern const u16_t uip_hostaddr[2], uip_netmask[2], uip_draddr[2];
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001320#else /* UIP_FIXEDADDR */
adamdunkels18076c62004-06-06 06:16:03 +00001321extern u16_t uip_hostaddr[2], uip_netmask[2], uip_draddr[2];
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001322#endif /* UIP_FIXEDADDR */
1323
adamdunkels18076c62004-06-06 06:16:03 +00001324
1325
adamdunkelsb380a3e2004-09-17 20:59:23 +00001326/**
1327 * Representation of a 48-bit Ethernet address.
1328 */
1329struct uip_eth_addr {
1330 u8_t addr[6];
1331};
1332
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001333#endif /* __UIP_H__ */
1334
1335
adamdunkels0170b082003-10-01 11:25:37 +00001336/** @} */
adamdunkelsca9ddcb2003-03-19 14:13:31 +00001337