root/webserver/example/freeRTOS/Demo/Common/ethernet/uIP/uip-1.0/uip/uip.c

Revision 14, 58.7 kB (checked in by phil, 15 years ago)

added unmodified FreeRTOS package V5.4.1 with only web srv demo source for LPC2368 for CrossWorks?

Line 
1 #define DEBUG_PRINTF(...) /*printf(__VA_ARGS__)*/
2
3 /**
4  * \defgroup uip The uIP TCP/IP stack
5  * @{
6  *
7  * uIP is an implementation of the TCP/IP protocol stack intended for
8  * small 8-bit and 16-bit microcontrollers.
9  *
10  * uIP provides the necessary protocols for Internet communication,
11  * with a very small code footprint and RAM requirements - the uIP
12  * code size is on the order of a few kilobytes and RAM usage is on
13  * the order of a few hundred bytes.
14  */
15
16 /**
17  * \file
18  * The uIP TCP/IP stack code.
19  * \author Adam Dunkels <adam@dunkels.com>
20  */
21
22 /*
23  * Copyright (c) 2001-2003, 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: uip.c,v 1.65 2006/06/11 21:46:39 adam Exp $
53  *
54  */
55
56 /*
57  * uIP is a small implementation of the IP, UDP and TCP protocols (as
58  * well as some basic ICMP stuff). The implementation couples the IP,
59  * UDP, TCP and the application layers very tightly. To keep the size
60  * of the compiled code down, this code frequently uses the goto
61  * statement. While it would be possible to break the uip_process()
62  * function into many smaller functions, this would increase the code
63  * size because of the overhead of parameter passing and the fact that
64  * the optimier would not be as efficient.
65  *
66  * The principle is that we have a small buffer, called the uip_buf,
67  * in which the device driver puts an incoming packet. The TCP/IP
68  * stack parses the headers in the packet, and calls the
69  * application. If the remote host has sent data to the application,
70  * this data is present in the uip_buf and the application read the
71  * data from there. It is up to the application to put this data into
72  * a byte stream if needed. The application will not be fed with data
73  * that is out of sequence.
74  *
75  * If the application whishes to send data to the peer, it should put
76  * its data into the uip_buf. The uip_appdata pointer points to the
77  * first available byte. The TCP/IP stack will calculate the
78  * checksums, and fill in the necessary header fields and finally send
79  * the packet back to the peer.
80 */
81
82 #include "uip.h"
83 #include "uipopt.h"
84 #include "uip_arch.h"
85
86 #if UIP_CONF_IPV6
87 #include "uip-neighbor.h"
88 #endif /* UIP_CONF_IPV6 */
89
90 #include <string.h>
91
92 /*---------------------------------------------------------------------------*/
93 /* Variable definitions. */
94
95
96 /* The IP address of this host. If it is defined to be fixed (by
97    setting UIP_FIXEDADDR to 1 in uipopt.h), the address is set
98    here. Otherwise, the address */
99 #if UIP_FIXEDADDR > 0
100 const uip_ipaddr_t uip_hostaddr =
101   {HTONS((UIP_IPADDR0 << 8) | UIP_IPADDR1),
102    HTONS((UIP_IPADDR2 << 8) | UIP_IPADDR3)};
103 const uip_ipaddr_t uip_draddr =
104   {HTONS((UIP_DRIPADDR0 << 8) | UIP_DRIPADDR1),
105    HTONS((UIP_DRIPADDR2 << 8) | UIP_DRIPADDR3)};
106 const uip_ipaddr_t uip_netmask =
107   {HTONS((UIP_NETMASK0 << 8) | UIP_NETMASK1),
108    HTONS((UIP_NETMASK2 << 8) | UIP_NETMASK3)};
109 #else
110 uip_ipaddr_t uip_hostaddr, uip_draddr, uip_netmask;
111 #endif /* UIP_FIXEDADDR */
112
113 static const uip_ipaddr_t all_ones_addr =
114 #if UIP_CONF_IPV6
115   {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff};
116 #else /* UIP_CONF_IPV6 */
117   {0xffff,0xffff};
118 #endif /* UIP_CONF_IPV6 */
119 static const uip_ipaddr_t all_zeroes_addr =
120 #if UIP_CONF_IPV6
121   {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000};
122 #else /* UIP_CONF_IPV6 */
123   {0x0000,0x0000};
124 #endif /* UIP_CONF_IPV6 */
125
126 #if UIP_FIXEDETHADDR
127 const struct uip_eth_addr uip_ethaddr = {{UIP_ETHADDR0,
128                                           UIP_ETHADDR1,
129                                           UIP_ETHADDR2,
130                                           UIP_ETHADDR3,
131                                           UIP_ETHADDR4,
132                                           UIP_ETHADDR5}};
133 #else
134 struct uip_eth_addr uip_ethaddr = {{0,0,0,0,0,0}};
135 #endif
136
137 #ifndef UIP_CONF_EXTERNAL_BUFFER
138
139 #ifdef __ICCARM__
140         #pragma data_alignment=4
141                 u8_t uip_buf[UIP_BUFSIZE + 2]; /* The packet buffer that contains incoming packets. */
142 #else
143         u8_t uip_buf[UIP_BUFSIZE + 2] ALIGN_STRUCT_END; /* The packet buffer that contains incoming packets. */
144 #endif
145
146 #endif /* UIP_CONF_EXTERNAL_BUFFER */
147
148 void *uip_appdata;               /* The uip_appdata pointer points to
149                                     application data. */
150 void *uip_sappdata;              /* The uip_appdata pointer points to
151                                     the application data which is to
152                                     be sent. */
153 #if UIP_URGDATA > 0
154 void *uip_urgdata;               /* The uip_urgdata pointer points to
155                                     urgent data (out-of-band data), if
156                                     present. */
157 u16_t uip_urglen, uip_surglen;
158 #endif /* UIP_URGDATA > 0 */
159
160 u16_t uip_len, uip_slen;
161                              /* The uip_len is either 8 or 16 bits,
162                                 depending on the maximum packet
163                                 size. */
164
165 u8_t uip_flags;     /* The uip_flags variable is used for
166                                 communication between the TCP/IP stack
167                                 and the application program. */
168 struct uip_conn *uip_conn;   /* uip_conn always points to the current
169                                 connection. */
170
171 struct uip_conn uip_conns[UIP_CONNS];
172                              /* The uip_conns array holds all TCP
173                                 connections. */
174 u16_t uip_listenports[UIP_LISTENPORTS];
175                              /* The uip_listenports list all currently
176                                 listning ports. */
177 #if UIP_UDP
178 struct uip_udp_conn *uip_udp_conn;
179 struct uip_udp_conn uip_udp_conns[UIP_UDP_CONNS];
180 #endif /* UIP_UDP */
181
182 static u16_t ipid;           /* Ths ipid variable is an increasing
183                                 number that is used for the IP ID
184                                 field. */
185
186 void uip_setipid(u16_t id) { ipid = id; }
187
188 static u8_t iss[4];          /* The iss variable is used for the TCP
189                                 initial sequence number. */
190
191 #if UIP_ACTIVE_OPEN
192 static u16_t lastport;       /* Keeps track of the last port used for
193                                 a new connection. */
194 #endif /* UIP_ACTIVE_OPEN */
195
196 /* Temporary variables. */
197 u8_t uip_acc32[4];
198 static u8_t c, opt;
199 static u16_t tmp16;
200
201 /* Structures and definitions. */
202 #define TCP_FIN 0x01
203 #define TCP_SYN 0x02
204 #define TCP_RST 0x04
205 #define TCP_PSH 0x08
206 #define TCP_ACK 0x10
207 #define TCP_URG 0x20
208 #define TCP_CTL 0x3f
209
210 #define TCP_OPT_END     0   /* End of TCP options list */
211 #define TCP_OPT_NOOP    1   /* "No-operation" TCP option */
212 #define TCP_OPT_MSS     2   /* Maximum segment size TCP option */
213
214 #define TCP_OPT_MSS_LEN 4   /* Length of TCP MSS option. */
215
216 #define ICMP_ECHO_REPLY 0
217 #define ICMP_ECHO       8
218
219 #define ICMP6_ECHO_REPLY             129
220 #define ICMP6_ECHO                   128
221 #define ICMP6_NEIGHBOR_SOLICITATION  135
222 #define ICMP6_NEIGHBOR_ADVERTISEMENT 136
223
224 #define ICMP6_FLAG_S (1 << 6)
225
226 #define ICMP6_OPTION_SOURCE_LINK_ADDRESS 1
227 #define ICMP6_OPTION_TARGET_LINK_ADDRESS 2
228
229
230 /* Macros. */
231 #define BUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
232 #define FBUF ((struct uip_tcpip_hdr *)&uip_reassbuf[0])
233 #define ICMPBUF ((struct uip_icmpip_hdr *)&uip_buf[UIP_LLH_LEN])
234 #define UDPBUF ((struct uip_udpip_hdr *)&uip_buf[UIP_LLH_LEN])
235
236
237 #if UIP_STATISTICS == 1
238 struct uip_stats uip_stat;
239 #define UIP_STAT(s) s
240 #else
241 #define UIP_STAT(s)
242 #endif /* UIP_STATISTICS == 1 */
243
244 #if UIP_LOGGING == 1
245 #include <stdio.h>
246 void uip_log(char *msg);
247 #define UIP_LOG(m) uip_log(m)
248 #else
249 #define UIP_LOG(m)
250 #endif /* UIP_LOGGING == 1 */
251
252 #if ! UIP_ARCH_ADD32
253 void
254 uip_add32(u8_t *op32, u16_t op16)
255 {
256   uip_acc32[3] = op32[3] + (op16 & 0xff);
257   uip_acc32[2] = op32[2] + (op16 >> 8);
258   uip_acc32[1] = op32[1];
259   uip_acc32[0] = op32[0];
260
261   if(uip_acc32[2] < (op16 >> 8)) {
262     ++uip_acc32[1];
263     if(uip_acc32[1] == 0) {
264       ++uip_acc32[0];
265     }
266   }
267
268
269   if(uip_acc32[3] < (op16 & 0xff)) {
270     ++uip_acc32[2];
271     if(uip_acc32[2] == 0) {
272       ++uip_acc32[1];
273       if(uip_acc32[1] == 0) {
274         ++uip_acc32[0];
275       }
276     }
277   }
278 }
279
280 #endif /* UIP_ARCH_ADD32 */
281
282 #if ! UIP_ARCH_CHKSUM
283 /*---------------------------------------------------------------------------*/
284 static u16_t
285 chksum(u16_t sum, const u8_t *data, u16_t len)
286 {
287   u16_t t;
288   const u8_t *dataptr;
289   const u8_t *last_byte;
290
291   dataptr = data;
292   last_byte = data + len - 1;
293
294   while(dataptr < last_byte) {  /* At least two more bytes */
295     t = (dataptr[0] << 8) + dataptr[1];
296     sum += t;
297     if(sum < t) {
298       sum++;            /* carry */
299     }
300     dataptr += 2;
301   }
302
303   if(dataptr == last_byte) {
304     t = (dataptr[0] << 8) + 0;
305     sum += t;
306     if(sum < t) {
307       sum++;            /* carry */
308     }
309   }
310
311   /* Return sum in host byte order. */
312   return sum;
313 }
314 /*---------------------------------------------------------------------------*/
315 u16_t
316 uip_chksum(u16_t *data, u16_t len)
317 {
318   return htons(chksum(0, (u8_t *)data, len));
319 }
320 /*---------------------------------------------------------------------------*/
321 #ifndef UIP_ARCH_IPCHKSUM
322 u16_t
323 uip_ipchksum(void)
324 {
325   u16_t sum;
326
327   sum = chksum(0, &uip_buf[UIP_LLH_LEN], UIP_IPH_LEN);
328   DEBUG_PRINTF("uip_ipchksum: sum 0x%04x\n", sum);
329   return (sum == 0) ? 0xffff : htons(sum);
330 }
331 #endif
332 /*---------------------------------------------------------------------------*/
333 static u16_t
334 upper_layer_chksum(u8_t proto)
335 {
336   u16_t upper_layer_len;
337   u16_t sum;
338
339 #if UIP_CONF_IPV6
340   upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]);
341 #else /* UIP_CONF_IPV6 */
342   upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]) - UIP_IPH_LEN;
343 #endif /* UIP_CONF_IPV6 */
344
345   /* First sum pseudoheader. */
346
347   /* IP protocol and length fields. This addition cannot carry. */
348   sum = upper_layer_len + proto;
349   /* Sum IP source and destination addresses. */
350   sum = chksum(sum, (u8_t *)&BUF->srcipaddr[0], 2 * sizeof(uip_ipaddr_t));
351
352   /* Sum TCP header and data. */
353   sum = chksum(sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN],
354                upper_layer_len);
355
356   return (sum == 0) ? 0xffff : htons(sum);
357 }
358 /*---------------------------------------------------------------------------*/
359 #if UIP_CONF_IPV6
360 u16_t
361 uip_icmp6chksum(void)
362 {
363   return upper_layer_chksum(UIP_PROTO_ICMP6);
364
365 }
366 #endif /* UIP_CONF_IPV6 */
367 /*---------------------------------------------------------------------------*/
368 u16_t
369 uip_tcpchksum(void)
370 {
371   return upper_layer_chksum(UIP_PROTO_TCP);
372 }
373 /*---------------------------------------------------------------------------*/
374 #if UIP_UDP_CHECKSUMS
375 u16_t
376 uip_udpchksum(void)
377 {
378   return upper_layer_chksum(UIP_PROTO_UDP);
379 }
380 #endif /* UIP_UDP_CHECKSUMS */
381 #endif /* UIP_ARCH_CHKSUM */
382 /*---------------------------------------------------------------------------*/
383 void
384 uip_init(void)
385 {
386   for(c = 0; c < UIP_LISTENPORTS; ++c) {
387     uip_listenports[c] = 0;
388   }
389   for(c = 0; c < UIP_CONNS; ++c) {
390     uip_conns[c].tcpstateflags = UIP_CLOSED;
391   }
392 #if UIP_ACTIVE_OPEN
393   lastport = 1024;
394 #endif /* UIP_ACTIVE_OPEN */
395
396 #if UIP_UDP
397   for(c = 0; c < UIP_UDP_CONNS; ++c) {
398     uip_udp_conns[c].lport = 0;
399   }
400 #endif /* UIP_UDP */
401
402
403   /* IPv4 initialization. */
404 #if UIP_FIXEDADDR == 0
405   /*  uip_hostaddr[0] = uip_hostaddr[1] = 0;*/
406 #endif /* UIP_FIXEDADDR */
407
408 }
409 /*---------------------------------------------------------------------------*/
410 #if UIP_ACTIVE_OPEN
411 struct uip_conn *
412 uip_connect(uip_ipaddr_t *ripaddr, u16_t rport)
413 {
414   register struct uip_conn *conn, *cconn;
415
416   /* Find an unused local port. */
417  again:
418   ++lastport;
419
420   if(lastport >= 32000) {
421     lastport = 4096;
422   }
423
424   /* Check if this port is already in use, and if so try to find
425      another one. */
426   for(c = 0; c < UIP_CONNS; ++c) {
427     conn = &uip_conns[c];
428     if(conn->tcpstateflags != UIP_CLOSED &&
429        conn->lport == htons(lastport)) {
430       goto again;
431     }
432   }
433
434   conn = 0;
435   for(c = 0; c < UIP_CONNS; ++c) {
436     cconn = &uip_conns[c];
437     if(cconn->tcpstateflags == UIP_CLOSED) {
438       conn = cconn;
439       break;
440     }
441     if(cconn->tcpstateflags == UIP_TIME_WAIT) {
442       if(conn == 0 ||
443          cconn->timer > conn->timer) {
444         conn = cconn;
445       }
446     }
447   }
448
449   if(conn == 0) {
450     return 0;
451   }
452
453   conn->tcpstateflags = UIP_SYN_SENT;
454
455   conn->snd_nxt[0] = iss[0];
456   conn->snd_nxt[1] = iss[1];
457   conn->snd_nxt[2] = iss[2];
458   conn->snd_nxt[3] = iss[3];
459
460   conn->initialmss = conn->mss = UIP_TCP_MSS;
461
462   conn->len = 1;   /* TCP length of the SYN is one. */
463   conn->nrtx = 0;
464   conn->timer = 1; /* Send the SYN next time around. */
465   conn->rto = UIP_RTO;
466   conn->sa = 0;
467   conn->sv = 16;   /* Initial value of the RTT variance. */
468   conn->lport = htons(lastport);
469   conn->rport = rport;
470   uip_ipaddr_copy(&conn->ripaddr, ripaddr);
471
472   return conn;
473 }
474 #endif /* UIP_ACTIVE_OPEN */
475 /*---------------------------------------------------------------------------*/
476 #if UIP_UDP
477 struct uip_udp_conn *
478 uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport)
479 {
480   register struct uip_udp_conn *conn;
481
482   /* Find an unused local port. */
483  again:
484   ++lastport;
485
486   if(lastport >= 32000) {
487     lastport = 4096;
488   }
489
490   for(c = 0; c < UIP_UDP_CONNS; ++c) {
491     if(uip_udp_conns[c].lport == htons(lastport)) {
492       goto again;
493     }
494   }
495
496
497   conn = 0;
498   for(c = 0; c < UIP_UDP_CONNS; ++c) {
499     if(uip_udp_conns[c].lport == 0) {
500       conn = &uip_udp_conns[c];
501       break;
502     }
503   }
504
505   if(conn == 0) {
506     return 0;
507   }
508
509   conn->lport = HTONS(lastport);
510   conn->rport = rport;
511   if(ripaddr == NULL) {
512     memset(conn->ripaddr, 0, sizeof(uip_ipaddr_t));
513   } else {
514     uip_ipaddr_copy(&conn->ripaddr, ripaddr);
515   }
516   conn->ttl = UIP_TTL;
517
518   return conn;
519 }
520 #endif /* UIP_UDP */
521 /*---------------------------------------------------------------------------*/
522 void
523 uip_unlisten(u16_t port)
524 {
525   for(c = 0; c < UIP_LISTENPORTS; ++c) {
526     if(uip_listenports[c] == port) {
527       uip_listenports[c] = 0;
528       return;
529     }
530   }
531 }
532 /*---------------------------------------------------------------------------*/
533 void
534 uip_listen(u16_t port)
535 {
536   for(c = 0; c < UIP_LISTENPORTS; ++c) {
537     if(uip_listenports[c] == 0) {
538       uip_listenports[c] = port;
539       return;
540     }
541   }
542 }
543 /*---------------------------------------------------------------------------*/
544 /* XXX: IP fragment reassembly: not well-tested. */
545
546 #if UIP_REASSEMBLY && !UIP_CONF_IPV6
547 #define UIP_REASS_BUFSIZE (UIP_BUFSIZE - UIP_LLH_LEN)
548 static u8_t uip_reassbuf[UIP_REASS_BUFSIZE];
549 static u8_t uip_reassbitmap[UIP_REASS_BUFSIZE / (8 * 8)];
550 static const u8_t bitmap_bits[8] = {0xff, 0x7f, 0x3f, 0x1f,
551                                     0x0f, 0x07, 0x03, 0x01};
552 static u16_t uip_reasslen;
553 static u8_t uip_reassflags;
554 #define UIP_REASS_FLAG_LASTFRAG 0x01
555 static u8_t uip_reasstmr;
556
557 #define IP_MF   0x20
558
559 static u8_t
560 uip_reass(void)
561 {
562   u16_t offset, len;
563   u16_t i;
564
565   /* If ip_reasstmr is zero, no packet is present in the buffer, so we
566      write the IP header of the fragment into the reassembly
567      buffer. The timer is updated with the maximum age. */
568   if(uip_reasstmr == 0) {
569     memcpy(uip_reassbuf, &BUF->vhl, UIP_IPH_LEN);
570     uip_reasstmr = UIP_REASS_MAXAGE;
571     uip_reassflags = 0;
572     /* Clear the bitmap. */
573     memset(uip_reassbitmap, 0, sizeof(uip_reassbitmap));
574   }
575
576   /* Check if the incoming fragment matches the one currently present
577      in the reasembly buffer. If so, we proceed with copying the
578      fragment into the buffer. */
579   if(BUF->srcipaddr[0] == FBUF->srcipaddr[0] &&
580      BUF->srcipaddr[1] == FBUF->srcipaddr[1] &&
581      BUF->destipaddr[0] == FBUF->destipaddr[0] &&
582      BUF->destipaddr[1] == FBUF->destipaddr[1] &&
583      BUF->ipid[0] == FBUF->ipid[0] &&
584      BUF->ipid[1] == FBUF->ipid[1]) {
585
586     len = (BUF->len[0] << 8) + BUF->len[1] - (BUF->vhl & 0x0f) * 4;
587     offset = (((BUF->ipoffset[0] & 0x3f) << 8) + BUF->ipoffset[1]) * 8;
588
589     /* If the offset or the offset + fragment length overflows the
590        reassembly buffer, we discard the entire packet. */
591     if(offset > UIP_REASS_BUFSIZE ||
592        offset + len > UIP_REASS_BUFSIZE) {
593       uip_reasstmr = 0;
594       goto nullreturn;
595     }
596
597     /* Copy the fragment into the reassembly buffer, at the right
598        offset. */
599     memcpy(&uip_reassbuf[UIP_IPH_LEN + offset],
600            (char *)BUF + (int)((BUF->vhl & 0x0f) * 4),
601            len);
602
603     /* Update the bitmap. */
604     if(offset / (8 * 8) == (offset + len) / (8 * 8)) {
605       /* If the two endpoints are in the same byte, we only update
606          that byte. */
607
608       uip_reassbitmap[offset / (8 * 8)] |=
609              bitmap_bits[(offset / 8 ) & 7] &
610              ~bitmap_bits[((offset + len) / 8 ) & 7];
611     } else {
612       /* If the two endpoints are in different bytes, we update the
613          bytes in the endpoints and fill the stuff inbetween with
614          0xff. */
615       uip_reassbitmap[offset / (8 * 8)] |=
616         bitmap_bits[(offset / 8 ) & 7];
617       for(i = 1 + offset / (8 * 8); i < (offset + len) / (8 * 8); ++i) {
618         uip_reassbitmap[i] = 0xff;
619       }
620       uip_reassbitmap[(offset + len) / (8 * 8)] |=
621         ~bitmap_bits[((offset + len) / 8 ) & 7];
622     }
623
624     /* If this fragment has the More Fragments flag set to zero, we
625        know that this is the last fragment, so we can calculate the
626        size of the entire packet. We also set the
627        IP_REASS_FLAG_LASTFRAG flag to indicate that we have received
628        the final fragment. */
629
630     if((BUF->ipoffset[0] & IP_MF) == 0) {
631       uip_reassflags |= UIP_REASS_FLAG_LASTFRAG;
632       uip_reasslen = offset + len;
633     }
634
635     /* Finally, we check if we have a full packet in the buffer. We do
636        this by checking if we have the last fragment and if all bits
637        in the bitmap are set. */
638     if(uip_reassflags & UIP_REASS_FLAG_LASTFRAG) {
639       /* Check all bytes up to and including all but the last byte in
640          the bitmap. */
641       for(i = 0; i < uip_reasslen / (8 * 8) - 1; ++i) {
642         if(uip_reassbitmap[i] != 0xff) {
643           goto nullreturn;
644         }
645       }
646       /* Check the last byte in the bitmap. It should contain just the
647          right amount of bits. */
648       if(uip_reassbitmap[uip_reasslen / (8 * 8)] !=
649          (u8_t)~bitmap_bits[uip_reasslen / 8 & 7]) {
650         goto nullreturn;
651       }
652
653       /* If we have come this far, we have a full packet in the
654          buffer, so we allocate a pbuf and copy the packet into it. We
655          also reset the timer. */
656       uip_reasstmr = 0;
657       memcpy(BUF, FBUF, uip_reasslen);
658
659       /* Pretend to be a "normal" (i.e., not fragmented) IP packet
660          from now on. */
661       BUF->ipoffset[0] = BUF->ipoffset[1] = 0;
662       BUF->len[0] = uip_reasslen >> 8;
663       BUF->len[1] = uip_reasslen & 0xff;
664       BUF->ipchksum = 0;
665       BUF->ipchksum = ~(uip_ipchksum());
666
667       return uip_reasslen;
668     }
669   }
670
671  nullreturn:
672   return 0;
673 }
674 #endif /* UIP_REASSEMBLY */
675 /*---------------------------------------------------------------------------*/
676 static void
677 uip_add_rcv_nxt(u16_t n)
678 {
679   uip_add32(uip_conn->rcv_nxt, n);
680   uip_conn->rcv_nxt[0] = uip_acc32[0];
681   uip_conn->rcv_nxt[1] = uip_acc32[1];
682   uip_conn->rcv_nxt[2] = uip_acc32[2];
683   uip_conn->rcv_nxt[3] = uip_acc32[3];
684 }
685 /*---------------------------------------------------------------------------*/
686 void
687 uip_process(u8_t flag)
688 {
689   register struct uip_conn *uip_connr = uip_conn;
690
691 #if UIP_UDP
692   if(flag == UIP_UDP_SEND_CONN) {
693     goto udp_send;
694   }
695 #endif /* UIP_UDP */
696
697   uip_sappdata = uip_appdata = &uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN];
698
699   /* Check if we were invoked because of a poll request for a
700      particular connection. */
701   if(flag == UIP_POLL_REQUEST) {
702     if((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED &&
703        !uip_outstanding(uip_connr)) {
704         uip_flags = UIP_POLL;
705         UIP_APPCALL();
706         goto appsend;
707     }
708     goto drop;
709
710     /* Check if we were invoked because of the perodic timer fireing. */
711   } else if(flag == UIP_TIMER) {
712 #if UIP_REASSEMBLY
713     if(uip_reasstmr != 0) {
714       --uip_reasstmr;
715     }
716 #endif /* UIP_REASSEMBLY */
717     /* Increase the initial sequence number. */
718     if(++iss[3] == 0) {
719       if(++iss[2] == 0) {
720         if(++iss[1] == 0) {
721           ++iss[0];
722         }
723       }
724     }
725
726     /* Reset the length variables. */
727     uip_len = 0;
728     uip_slen = 0;
729
730     /* Check if the connection is in a state in which we simply wait
731        for the connection to time out. If so, we increase the
732        connection's timer and remove the connection if it times
733        out. */
734     if(uip_connr->tcpstateflags == UIP_TIME_WAIT ||
735        uip_connr->tcpstateflags == UIP_FIN_WAIT_2) {
736       ++(uip_connr->timer);
737       if(uip_connr->timer == UIP_TIME_WAIT_TIMEOUT) {
738         uip_connr->tcpstateflags = UIP_CLOSED;
739       }
740     } else if(uip_connr->tcpstateflags != UIP_CLOSED) {
741       /* If the connection has outstanding data, we increase the
742          connection's timer and see if it has reached the RTO value
743          in which case we retransmit. */
744       if(uip_outstanding(uip_connr)) {
745           uip_connr->timer = uip_connr->timer - 1;
746         if(uip_connr->timer == 0) {
747           if(uip_connr->nrtx == UIP_MAXRTX ||
748              ((uip_connr->tcpstateflags == UIP_SYN_SENT ||
749                uip_connr->tcpstateflags == UIP_SYN_RCVD) &&
750               uip_connr->nrtx == UIP_MAXSYNRTX)) {
751             uip_connr->tcpstateflags = UIP_CLOSED;
752
753             /* We call UIP_APPCALL() with uip_flags set to
754                UIP_TIMEDOUT to inform the application that the
755                connection has timed out. */
756             uip_flags = UIP_TIMEDOUT;
757             UIP_APPCALL();
758
759             /* We also send a reset packet to the remote host. */
760             BUF->flags = TCP_RST | TCP_ACK;
761             goto tcp_send_nodata;
762           }
763
764           /* Exponential backoff. */
765           uip_connr->timer = UIP_RTO << (uip_connr->nrtx > 4?
766                                          4:
767                                          uip_connr->nrtx);
768           ++(uip_connr->nrtx);
769
770           /* Ok, so we need to retransmit. We do this differently
771              depending on which state we are in. In ESTABLISHED, we
772              call upon the application so that it may prepare the
773              data for the retransmit. In SYN_RCVD, we resend the
774              SYNACK that we sent earlier and in LAST_ACK we have to
775              retransmit our FINACK. */
776           UIP_STAT(++uip_stat.tcp.rexmit);
777           switch(uip_connr->tcpstateflags & UIP_TS_MASK) {
778           case UIP_SYN_RCVD:
779             /* In the SYN_RCVD state, we should retransmit our
780                SYNACK. */
781             goto tcp_send_synack;
782
783 #if UIP_ACTIVE_OPEN
784           case UIP_SYN_SENT:
785             /* In the SYN_SENT state, we retransmit out SYN. */
786             BUF->flags = 0;
787             goto tcp_send_syn;
788 #endif /* UIP_ACTIVE_OPEN */
789
790           case UIP_ESTABLISHED:
791             /* In the ESTABLISHED state, we call upon the application
792                to do the actual retransmit after which we jump into
793                the code for sending out the packet (the apprexmit
794                label). */
795             uip_flags = UIP_REXMIT;
796             UIP_APPCALL();
797             goto apprexmit;
798
799           case UIP_FIN_WAIT_1:
800           case UIP_CLOSING:
801           case UIP_LAST_ACK:
802             /* In all these states we should retransmit a FINACK. */
803             goto tcp_send_finack;
804
805           }
806         }
807       } else if((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED) {
808         /* If there was no need for a retransmission, we poll the
809            application for new data. */
810         uip_flags = UIP_POLL;
811         UIP_APPCALL();
812         goto appsend;
813       }
814     }
815     goto drop;
816   }
817 #if UIP_UDP
818   if(flag == UIP_UDP_TIMER) {
819     if(uip_udp_conn->lport != 0) {
820       uip_conn = NULL;
821       uip_sappdata = uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN];
822       uip_len = uip_slen = 0;
823       uip_flags = UIP_POLL;
824       UIP_UDP_APPCALL();
825       goto udp_send;
826     } else {
827       goto drop;
828     }
829   }
830 #endif
831
832   /* This is where the input processing starts. */
833   UIP_STAT(++uip_stat.ip.recv);
834
835   /* Start of IP input header processing code. */
836
837 #if UIP_CONF_IPV6
838   /* Check validity of the IP header. */
839   if((BUF->vtc & 0xf0) != 0x60)  { /* IP version and header length. */
840     UIP_STAT(++uip_stat.ip.drop);
841     UIP_STAT(++uip_stat.ip.vhlerr);
842     UIP_LOG("ipv6: invalid version.");
843     goto drop;
844   }
845 #else /* UIP_CONF_IPV6 */
846   /* Check validity of the IP header. */
847   if(BUF->vhl != 0x45)  { /* IP version and header length. */
848     UIP_STAT(++uip_stat.ip.drop);
849     UIP_STAT(++uip_stat.ip.vhlerr);
850     UIP_LOG("ip: invalid version or header length.");
851     goto drop;
852   }
853 #endif /* UIP_CONF_IPV6 */
854
855   /* Check the size of the packet. If the size reported to us in
856      uip_len is smaller the size reported in the IP header, we assume
857      that the packet has been corrupted in transit. If the size of
858      uip_len is larger than the size reported in the IP packet header,
859      the packet has been padded and we set uip_len to the correct
860      value.. */
861
862   if((BUF->len[0] << 8) + BUF->len[1] <= uip_len) {
863     uip_len = (BUF->len[0] << 8) + BUF->len[1];
864 #if UIP_CONF_IPV6
865     uip_len += 40; /* The length reported in the IPv6 header is the
866                       length of the payload that follows the
867                       header. However, uIP uses the uip_len variable
868                       for holding the size of the entire packet,
869                       including the IP header. For IPv4 this is not a
870                       problem as the length field in the IPv4 header
871                       contains the length of the entire packet. But
872                       for IPv6 we need to add the size of the IPv6
873                       header (40 bytes). */
874 #endif /* UIP_CONF_IPV6 */
875   } else {
876     UIP_LOG("ip: packet shorter than reported in IP header.");
877     goto drop;
878   }
879
880 #if !UIP_CONF_IPV6
881   /* Check the fragment flag. */
882   if((BUF->ipoffset[0] & 0x3f) != 0 ||
883      BUF->ipoffset[1] != 0) {
884 #if UIP_REASSEMBLY
885     uip_len = uip_reass();
886     if(uip_len == 0) {
887       goto drop;
888     }
889 #else /* UIP_REASSEMBLY */
890     UIP_STAT(++uip_stat.ip.drop);
891     UIP_STAT(++uip_stat.ip.fragerr);
892     UIP_LOG("ip: fragment dropped.");
893     goto drop;
894 #endif /* UIP_REASSEMBLY */
895   }
896 #endif /* UIP_CONF_IPV6 */
897
898   if(uip_ipaddr_cmp(uip_hostaddr, all_zeroes_addr)) {
899     /* If we are configured to use ping IP address configuration and
900        hasn't been assigned an IP address yet, we accept all ICMP
901        packets. */
902 #if UIP_PINGADDRCONF && !UIP_CONF_IPV6
903     if(BUF->proto == UIP_PROTO_ICMP) {
904       UIP_LOG("ip: possible ping config packet received.");
905       goto icmp_input;
906     } else {
907       UIP_LOG("ip: packet dropped since no address assigned.");
908       goto drop;
909     }
910 #endif /* UIP_PINGADDRCONF */
911
912   } else {
913     /* If IP broadcast support is configured, we check for a broadcast
914        UDP packet, which may be destined to us. */
915 #if UIP_BROADCAST
916     DEBUG_PRINTF("UDP IP checksum 0x%04x\n", uip_ipchksum());
917     if(BUF->proto == UIP_PROTO_UDP &&
918        uip_ipaddr_cmp(BUF->destipaddr, all_ones_addr)
919        /*&&
920          uip_ipchksum() == 0xffff*/) {
921       goto udp_input;
922     }
923 #endif /* UIP_BROADCAST */
924
925     /* Check if the packet is destined for our IP address. */
926 #if !UIP_CONF_IPV6
927     if(!uip_ipaddr_cmp(BUF->destipaddr, uip_hostaddr)) {
928       UIP_STAT(++uip_stat.ip.drop);
929       goto drop;
930     }
931 #else /* UIP_CONF_IPV6 */
932     /* For IPv6, packet reception is a little trickier as we need to
933        make sure that we listen to certain multicast addresses (all
934        hosts multicast address, and the solicited-node multicast
935        address) as well. However, we will cheat here and accept all
936        multicast packets that are sent to the ff02::/16 addresses. */
937     if(!uip_ipaddr_cmp(BUF->destipaddr, uip_hostaddr) &&
938        BUF->destipaddr[0] != HTONS(0xff02)) {
939       UIP_STAT(++uip_stat.ip.drop);
940       goto drop;
941     }
942 #endif /* UIP_CONF_IPV6 */
943   }
944
945 #if !UIP_CONF_IPV6
946   if(uip_ipchksum() != 0xffff) { /* Compute and check the IP header
947                                     checksum. */
948     UIP_STAT(++uip_stat.ip.drop);
949     UIP_STAT(++uip_stat.ip.chkerr);
950     UIP_LOG("ip: bad checksum.");
951     goto drop;
952   }
953 #endif /* UIP_CONF_IPV6 */
954
955   if(BUF->proto == UIP_PROTO_TCP) { /* Check for TCP packet. If so,
956                                        proceed with TCP input
957                                        processing. */
958     goto tcp_input;
959   }
960
961 #if UIP_UDP
962   if(BUF->proto == UIP_PROTO_UDP) {
963     goto udp_input;
964   }
965 #endif /* UIP_UDP */
966
967 #if !UIP_CONF_IPV6
968   /* ICMPv4 processing code follows. */
969   if(BUF->proto != UIP_PROTO_ICMP) { /* We only allow ICMP packets from
970                                         here. */
971     UIP_STAT(++uip_stat.ip.drop);
972     UIP_STAT(++uip_stat.ip.protoerr);
973     UIP_LOG("ip: neither tcp nor icmp.");
974     goto drop;
975   }
976
977 #if UIP_PINGADDRCONF
978  icmp_input:
979 #endif /* UIP_PINGADDRCONF */
980   UIP_STAT(++uip_stat.icmp.recv);
981
982   /* ICMP echo (i.e., ping) processing. This is simple, we only change
983      the ICMP type from ECHO to ECHO_REPLY and adjust the ICMP
984      checksum before we return the packet. */
985   if(ICMPBUF->type != ICMP_ECHO) {
986     UIP_STAT(++uip_stat.icmp.drop);
987     UIP_STAT(++uip_stat.icmp.typeerr);
988     UIP_LOG("icmp: not icmp echo.");
989     goto drop;
990   }
991
992   /* If we are configured to use ping IP address assignment, we use
993      the destination IP address of this ping packet and assign it to
994      ourself. */
995 #if UIP_PINGADDRCONF
996   if((uip_hostaddr[0] | uip_hostaddr[1]) == 0) {
997     uip_hostaddr[0] = BUF->destipaddr[0];
998     uip_hostaddr[1] = BUF->destipaddr[1];
999   }
1000 #endif /* UIP_PINGADDRCONF */
1001
1002   ICMPBUF->type = ICMP_ECHO_REPLY;
1003
1004   if(ICMPBUF->icmpchksum >= HTONS(0xffff - (ICMP_ECHO << 8))) {
1005     ICMPBUF->icmpchksum += HTONS(ICMP_ECHO << 8) + 1;
1006   } else {
1007     ICMPBUF->icmpchksum += HTONS(ICMP_ECHO << 8);
1008   }
1009
1010   /* Swap IP addresses. */
1011   uip_ipaddr_copy(BUF->destipaddr, BUF->srcipaddr);
1012   uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr);
1013
1014   UIP_STAT(++uip_stat.icmp.sent);
1015   goto send;
1016
1017   /* End of IPv4 input header processing code. */
1018 #else /* !UIP_CONF_IPV6 */
1019
1020   /* This is IPv6 ICMPv6 processing code. */
1021   DEBUG_PRINTF("icmp6_input: length %d\n", uip_len);
1022
1023   if(BUF->proto != UIP_PROTO_ICMP6) { /* We only allow ICMPv6 packets from
1024                                          here. */
1025     UIP_STAT(++uip_stat.ip.drop);
1026     UIP_STAT(++uip_stat.ip.protoerr);
1027     UIP_LOG("ip: neither tcp nor icmp6.");
1028     goto drop;
1029   }
1030
1031   UIP_STAT(++uip_stat.icmp.recv);
1032
1033   /* If we get a neighbor solicitation for our address we should send
1034      a neighbor advertisement message back. */
1035   if(ICMPBUF->type == ICMP6_NEIGHBOR_SOLICITATION) {
1036     if(uip_ipaddr_cmp(ICMPBUF->icmp6data, uip_hostaddr)) {
1037
1038       if(ICMPBUF->options[0] == ICMP6_OPTION_SOURCE_LINK_ADDRESS) {
1039         /* Save the sender's address in our neighbor list. */
1040         uip_neighbor_add(ICMPBUF->srcipaddr, &(ICMPBUF->options[2]));
1041       }
1042
1043       /* We should now send a neighbor advertisement back to where the
1044          neighbor solicication came from. */
1045       ICMPBUF->type = ICMP6_NEIGHBOR_ADVERTISEMENT;
1046       ICMPBUF->flags = ICMP6_FLAG_S; /* Solicited flag. */
1047
1048       ICMPBUF->reserved1 = ICMPBUF->reserved2 = ICMPBUF->reserved3 = 0;
1049
1050       uip_ipaddr_copy(ICMPBUF->destipaddr, ICMPBUF->srcipaddr);
1051       uip_ipaddr_copy(ICMPBUF->srcipaddr, uip_hostaddr);
1052       ICMPBUF->options[0] = ICMP6_OPTION_TARGET_LINK_ADDRESS;
1053       ICMPBUF->options[1] = 1;  /* Options length, 1 = 8 bytes. */
1054       memcpy(&(ICMPBUF->options[2]), &uip_ethaddr, sizeof(uip_ethaddr));
1055       ICMPBUF->icmpchksum = 0;
1056       ICMPBUF->icmpchksum = ~uip_icmp6chksum();
1057       goto send;
1058
1059     }
1060     goto drop;
1061   } else if(ICMPBUF->type == ICMP6_ECHO) {
1062     /* ICMP echo (i.e., ping) processing. This is simple, we only
1063        change the ICMP type from ECHO to ECHO_REPLY and update the
1064        ICMP checksum before we return the packet. */
1065
1066     ICMPBUF->type = ICMP6_ECHO_REPLY;
1067
1068     uip_ipaddr_copy(BUF->destipaddr, BUF->srcipaddr);
1069     uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr);
1070     ICMPBUF->icmpchksum = 0;
1071     ICMPBUF->icmpchksum = ~uip_icmp6chksum();
1072
1073     UIP_STAT(++uip_stat.icmp.sent);
1074     goto send;
1075   } else {
1076     DEBUG_PRINTF("Unknown icmp6 message type %d\n", ICMPBUF->type);
1077     UIP_STAT(++uip_stat.icmp.drop);
1078     UIP_STAT(++uip_stat.icmp.typeerr);
1079     UIP_LOG("icmp: unknown ICMP message.");
1080     goto drop;
1081   }
1082
1083   /* End of IPv6 ICMP processing. */
1084
1085 #endif /* !UIP_CONF_IPV6 */
1086
1087 #if UIP_UDP
1088   /* UDP input processing. */
1089  udp_input:
1090   /* UDP processing is really just a hack. We don't do anything to the
1091      UDP/IP headers, but let the UDP application do all the hard
1092      work. If the application sets uip_slen, it has a packet to
1093      send. */
1094 #if UIP_UDP_CHECKSUMS
1095   uip_len = uip_len - UIP_IPUDPH_LEN;
1096   uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN];
1097   if(UDPBUF->udpchksum != 0 && uip_udpchksum() != 0xffff) {
1098     UIP_STAT(++uip_stat.udp.drop);
1099     UIP_STAT(++uip_stat.udp.chkerr);
1100     UIP_LOG("udp: bad checksum.");
1101     goto drop;
1102   }
1103 #else /* UIP_UDP_CHECKSUMS */
1104   uip_len = uip_len - UIP_IPUDPH_LEN;
1105 #endif /* UIP_UDP_CHECKSUMS */
1106
1107   /* Demultiplex this UDP packet between the UDP "connections". */
1108   for(uip_udp_conn = &uip_udp_conns[0];
1109       uip_udp_conn < &uip_udp_conns[UIP_UDP_CONNS];
1110       ++uip_udp_conn) {
1111     /* If the local UDP port is non-zero, the connection is considered
1112        to be used. If so, the local port number is checked against the
1113        destination port number in the received packet. If the two port
1114        numbers match, the remote port number is checked if the
1115        connection is bound to a remote port. Finally, if the
1116        connection is bound to a remote IP address, the source IP
1117        address of the packet is checked. */
1118     if(uip_udp_conn->lport != 0 &&
1119        UDPBUF->destport == uip_udp_conn->lport &&
1120        (uip_udp_conn->rport == 0 ||
1121         UDPBUF->srcport == uip_udp_conn->rport) &&
1122        (uip_ipaddr_cmp(uip_udp_conn->ripaddr, all_zeroes_addr) ||
1123         uip_ipaddr_cmp(uip_udp_conn->ripaddr, all_ones_addr) ||
1124         uip_ipaddr_cmp(BUF->srcipaddr, uip_udp_conn->ripaddr))) {
1125       goto udp_found;
1126     }
1127   }
1128   UIP_LOG("udp: no matching connection found");
1129   goto drop;
1130
1131  udp_found:
1132   UIP_STAT(++uip_stat.udp.recv);
1133   uip_conn = NULL;
1134   uip_flags = UIP_NEWDATA;
1135   uip_sappdata = uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN];
1136   uip_slen = 0;
1137   UIP_UDP_APPCALL();
1138  udp_send:
1139   if(uip_slen == 0) {
1140     goto drop;
1141   }
1142   uip_len = uip_slen + UIP_IPUDPH_LEN;
1143
1144 #if UIP_CONF_IPV6
1145   /* For IPv6, the IP length field does not include the IPv6 IP header
1146      length. */
1147   BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8);
1148   BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff);
1149 #else /* UIP_CONF_IPV6 */
1150   BUF->len[0] = (uip_len >> 8);
1151   BUF->len[1] = (uip_len & 0xff);
1152 #endif /* UIP_CONF_IPV6 */
1153
1154   BUF->ttl = uip_udp_conn->ttl;
1155   BUF->proto = UIP_PROTO_UDP;
1156
1157   UDPBUF->udplen = HTONS(uip_slen + UIP_UDPH_LEN);
1158   UDPBUF->udpchksum = 0;
1159
1160   BUF->srcport  = uip_udp_conn->lport;
1161   BUF->destport = uip_udp_conn->rport;
1162
1163   uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr);
1164   uip_ipaddr_copy(BUF->destipaddr, uip_udp_conn->ripaddr);
1165
1166   uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPTCPH_LEN];
1167
1168 #if UIP_UDP_CHECKSUMS
1169   /* Calculate UDP checksum. */
1170   UDPBUF->udpchksum = ~(uip_udpchksum());
1171   if(UDPBUF->udpchksum == 0) {
1172     UDPBUF->udpchksum = 0xffff;
1173   }
1174 #endif /* UIP_UDP_CHECKSUMS */
1175   UIP_STAT(++uip_stat.udp.sent);
1176   goto ip_send_nolen;
1177 #endif /* UIP_UDP */
1178
1179   /* TCP input processing. */
1180  tcp_input:
1181   UIP_STAT(++uip_stat.tcp.recv);
1182
1183   /* Start of TCP input header processing code. */
1184
1185   if(uip_tcpchksum() != 0xffff) {   /* Compute and check the TCP
1186                                        checksum. */
1187     UIP_STAT(++uip_stat.tcp.drop);
1188     UIP_STAT(++uip_stat.tcp.chkerr);
1189     UIP_LOG("tcp: bad checksum.");
1190     goto drop;
1191   }
1192
1193
1194   /* Demultiplex this segment. */
1195   /* First check any active connections. */
1196   for(uip_connr = &uip_conns[0]; uip_connr <= &uip_conns[UIP_CONNS - 1];
1197       ++uip_connr) {
1198     if(uip_connr->tcpstateflags != UIP_CLOSED &&
1199        BUF->destport == uip_connr->lport &&
1200        BUF->srcport == uip_connr->rport &&
1201        uip_ipaddr_cmp(BUF->srcipaddr, uip_connr->ripaddr)) {
1202       goto found;
1203     }
1204   }
1205
1206   /* If we didn't find and active connection that expected the packet,
1207      either this packet is an old duplicate, or this is a SYN packet
1208      destined for a connection in LISTEN. If the SYN flag isn't set,
1209      it is an old packet and we send a RST. */
1210   if((BUF->flags & TCP_CTL) != TCP_SYN) {
1211     goto reset;
1212   }
1213
1214   tmp16 = BUF->destport;
1215   /* Next, check listening connections. */
1216   for(c = 0; c < UIP_LISTENPORTS; ++c) {
1217     if(tmp16 == uip_listenports[c])
1218       goto found_listen;
1219   }
1220
1221   /* No matching connection found, so we send a RST packet. */
1222   UIP_STAT(++uip_stat.tcp.synrst);
1223  reset:
1224
1225   /* We do not send resets in response to resets. */
1226   if(BUF->flags & TCP_RST) {
1227     goto drop;
1228   }
1229
1230   UIP_STAT(++uip_stat.tcp.rst);
1231
1232   BUF->flags = TCP_RST | TCP_ACK;
1233   uip_len = UIP_IPTCPH_LEN;
1234   BUF->tcpoffset = 5 << 4;
1235
1236   /* Flip the seqno and ackno fields in the TCP header. */
1237   c = BUF->seqno[3];
1238   BUF->seqno[3] = BUF->ackno[3];
1239   BUF->ackno[3] = c;
1240
1241   c = BUF->seqno[2];
1242   BUF->seqno[2] = BUF->ackno[2];
1243   BUF->ackno[2] = c;
1244
1245   c = BUF->seqno[1];
1246   BUF->seqno[1] = BUF->ackno[1];
1247   BUF->ackno[1] = c;
1248
1249   c = BUF->seqno[0];
1250   BUF->seqno[0] = BUF->ackno[0];
1251   BUF->ackno[0] = c;
1252
1253   /* We also have to increase the sequence number we are
1254      acknowledging. If the least significant byte overflowed, we need
1255      to propagate the carry to the other bytes as well. */
1256   if(++BUF->ackno[3] == 0) {
1257     if(++BUF->ackno[2] == 0) {
1258       if(++BUF->ackno[1] == 0) {
1259         ++BUF->ackno[0];
1260       }
1261     }
1262   }
1263
1264   /* Swap port numbers. */
1265   tmp16 = BUF->srcport;
1266   BUF->srcport = BUF->destport;
1267   BUF->destport = tmp16;
1268
1269   /* Swap IP addresses. */
1270   uip_ipaddr_copy(BUF->destipaddr, BUF->srcipaddr);
1271   uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr);
1272
1273   /* And send out the RST packet! */
1274   goto tcp_send_noconn;
1275
1276   /* This label will be jumped to if we matched the incoming packet
1277      with a connection in LISTEN. In that case, we should create a new
1278      connection and send a SYNACK in return. */
1279  found_listen:
1280   /* First we check if there are any connections avaliable. Unused
1281      connections are kept in the same table as used connections, but
1282      unused ones have the tcpstate set to CLOSED. Also, connections in
1283      TIME_WAIT are kept track of and we'll use the oldest one if no
1284      CLOSED connections are found. Thanks to Eddie C. Dost for a very
1285      nice algorithm for the TIME_WAIT search. */
1286   uip_connr = 0;
1287   for(c = 0; c < UIP_CONNS; ++c) {
1288     if(uip_conns[c].tcpstateflags == UIP_CLOSED) {
1289       uip_connr = &uip_conns[c];
1290       break;
1291     }
1292     if(uip_conns[c].tcpstateflags == UIP_TIME_WAIT) {
1293       if(uip_connr == 0 ||
1294          uip_conns[c].timer > uip_connr->timer) {
1295         uip_connr = &uip_conns[c];
1296       }
1297     }
1298   }
1299
1300   if(uip_connr == 0) {
1301     /* All connections are used already, we drop packet and hope that
1302        the remote end will retransmit the packet at a time when we
1303        have more spare connections. */
1304     UIP_STAT(++uip_stat.tcp.syndrop);
1305     UIP_LOG("tcp: found no unused connections.");
1306     goto drop;
1307   }
1308   uip_conn = uip_connr;
1309
1310   /* Fill in the necessary fields for the new connection. */
1311   uip_connr->rto = uip_connr->timer = UIP_RTO;
1312   uip_connr->sa = 0;
1313   uip_connr->sv = 4;
1314   uip_connr->nrtx = 0;
1315   uip_connr->lport = BUF->destport;
1316   uip_connr->rport = BUF->srcport;
1317   uip_ipaddr_copy(uip_connr->ripaddr, BUF->srcipaddr);
1318   uip_connr->tcpstateflags = UIP_SYN_RCVD;
1319
1320   uip_connr->snd_nxt[0] = iss[0];
1321   uip_connr->snd_nxt[1] = iss[1];
1322   uip_connr->snd_nxt[2] = iss[2];
1323   uip_connr->snd_nxt[3] = iss[3];
1324   uip_connr->len = 1;
1325
1326   /* rcv_nxt should be the seqno from the incoming packet + 1. */
1327   uip_connr->rcv_nxt[3] = BUF->seqno[3];
1328   uip_connr->rcv_nxt[2] = BUF->seqno[2];
1329   uip_connr->rcv_nxt[1] = BUF->seqno[1];
1330   uip_connr->rcv_nxt[0] = BUF->seqno[0];
1331   uip_add_rcv_nxt(1);
1332
1333   /* Parse the TCP MSS option, if present. */
1334   if((BUF->tcpoffset & 0xf0) > 0x50) {
1335     for(c = 0; c < ((BUF->tcpoffset >> 4) - 5) << 2 ;) {
1336       opt = uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + c];
1337       if(opt == TCP_OPT_END) {
1338         /* End of options. */
1339         break;
1340       } else if(opt == TCP_OPT_NOOP) {
1341         ++c;
1342         /* NOP option. */
1343       } else if(opt == TCP_OPT_MSS &&
1344                 uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN) {
1345         /* An MSS option with the right option length. */
1346         tmp16 = ((u16_t)uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 2 + c] << 8) |
1347           (u16_t)uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN + 3 + c];
1348         uip_connr->initialmss = uip_connr->mss =
1349           tmp16 > UIP_TCP_MSS? UIP_TCP_MSS: tmp16;
1350
1351         /* And we are done processing options. */
1352         break;
1353       } else {
1354         /* All other options have a length field, so that we easily
1355            can skip past them. */
1356         if(uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == 0) {
1357           /* If the length field is zero, the options are malformed
1358              and we don't process them further. */
1359           break;
1360         }
1361         c += uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c];
1362       }
1363     }
1364   }
1365
1366   /* Our response will be a SYNACK. */
1367 #if UIP_ACTIVE_OPEN
1368  tcp_send_synack:
1369   BUF->flags = TCP_ACK;
1370
1371  tcp_send_syn:
1372   BUF->flags |= TCP_SYN;
1373 #else /* UIP_ACTIVE_OPEN */
1374  tcp_send_synack:
1375   BUF->flags = TCP_SYN | TCP_ACK;
1376 #endif /* UIP_ACTIVE_OPEN */
1377
1378   /* We send out the TCP Maximum Segment Size option with our
1379      SYNACK. */
1380   BUF->optdata[0] = TCP_OPT_MSS;
1381   BUF->optdata[1] = TCP_OPT_MSS_LEN;
1382   BUF->optdata[2] = (UIP_TCP_MSS) / 256;
1383   BUF->optdata[3] = (UIP_TCP_MSS) & 255;
1384   uip_len = UIP_IPTCPH_LEN + TCP_OPT_MSS_LEN;
1385   BUF->tcpoffset = ((UIP_TCPH_LEN + TCP_OPT_MSS_LEN) / 4) << 4;
1386   goto tcp_send;
1387
1388   /* This label will be jumped to if we found an active connection. */
1389  found:
1390   uip_conn = uip_connr;
1391   uip_flags = 0;
1392   /* We do a very naive form of TCP reset processing; we just accept
1393      any RST and kill our connection. We should in fact check if the
1394      sequence number of this reset is wihtin our advertised window
1395      before we accept the reset. */
1396   if(BUF->flags & TCP_RST) {
1397     uip_connr->tcpstateflags = UIP_CLOSED;
1398     UIP_LOG("tcp: got reset, aborting connection.");
1399     uip_flags = UIP_ABORT;
1400     UIP_APPCALL();
1401     goto drop;
1402   }
1403   /* Calculated the length of the data, if the application has sent
1404      any data to us. */
1405   c = (BUF->tcpoffset >> 4) << 2;
1406   /* uip_len will contain the length of the actual TCP data. This is
1407      calculated by subtracing the length of the TCP header (in
1408      c) and the length of the IP header (20 bytes). */
1409   uip_len = uip_len - c - UIP_IPH_LEN;
1410
1411   /* First, check if the sequence number of the incoming packet is
1412      what we're expecting next. If not, we send out an ACK with the
1413      correct numbers in. */
1414   if(!(((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) &&
1415        ((BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK)))) {
1416     if((uip_len > 0 || ((BUF->flags & (TCP_SYN | TCP_FIN)) != 0)) &&
1417        (BUF->seqno[0] != uip_connr->rcv_nxt[0] ||
1418         BUF->seqno[1] != uip_connr->rcv_nxt[1] ||
1419         BUF->seqno[2] != uip_connr->rcv_nxt[2] ||
1420         BUF->seqno[3] != uip_connr->rcv_nxt[3])) {
1421       goto tcp_send_ack;
1422     }
1423   }
1424
1425   /* Next, check if the incoming segment acknowledges any outstanding
1426      data. If so, we update the sequence number, reset the length of
1427      the outstanding data, calculate RTT estimations, and reset the
1428      retransmission timer. */
1429   if((BUF->flags & TCP_ACK) && uip_outstanding(uip_connr)) {
1430     uip_add32(uip_connr->snd_nxt, uip_connr->len);
1431
1432     if(BUF->ackno[0] == uip_acc32[0] &&
1433        BUF->ackno[1] == uip_acc32[1] &&
1434        BUF->ackno[2] == uip_acc32[2] &&
1435        BUF->ackno[3] == uip_acc32[3]) {
1436       /* Update sequence number. */
1437       uip_connr->snd_nxt[0] = uip_acc32[0];
1438       uip_connr->snd_nxt[1] = uip_acc32[1];
1439       uip_connr->snd_nxt[2] = uip_acc32[2];
1440       uip_connr->snd_nxt[3] = uip_acc32[3];
1441
1442
1443       /* Do RTT estimation, unless we have done retransmissions. */
1444       if(uip_connr->nrtx == 0) {
1445         signed char m;
1446         m = uip_connr->rto - uip_connr->timer;
1447         /* This is taken directly from VJs original code in his paper */
1448         m = m - (uip_connr->sa >> 3);
1449         uip_connr->sa += m;
1450         if(m < 0) {
1451           m = -m;
1452         }
1453         m = m - (uip_connr->sv >> 2);
1454         uip_connr->sv += m;
1455         uip_connr->rto = (uip_connr->sa >> 3) + uip_connr->sv;
1456
1457       }
1458       /* Set the acknowledged flag. */
1459       uip_flags = UIP_ACKDATA;
1460       /* Reset the retransmission timer. */
1461       uip_connr->timer = uip_connr->rto;
1462
1463       /* Reset length of outstanding data. */
1464       uip_connr->len = 0;
1465     }
1466
1467   }
1468
1469   /* Do different things depending on in what state the connection is. */
1470   switch(uip_connr->tcpstateflags & UIP_TS_MASK) {
1471     /* CLOSED and LISTEN are not handled here. CLOSE_WAIT is not
1472         implemented, since we force the application to close when the
1473         peer sends a FIN (hence the application goes directly from
1474         ESTABLISHED to LAST_ACK). */
1475   case UIP_SYN_RCVD:
1476     /* In SYN_RCVD we have sent out a SYNACK in response to a SYN, and
1477        we are waiting for an ACK that acknowledges the data we sent
1478        out the last time. Therefore, we want to have the UIP_ACKDATA
1479        flag set. If so, we enter the ESTABLISHED state. */
1480     if(uip_flags & UIP_ACKDATA) {
1481       uip_connr->tcpstateflags = UIP_ESTABLISHED;
1482       uip_flags = UIP_CONNECTED;
1483       uip_connr->len = 0;
1484       if(uip_len > 0) {
1485         uip_flags |= UIP_NEWDATA;
1486         uip_add_rcv_nxt(uip_len);
1487       }
1488       uip_slen = 0;
1489       UIP_APPCALL();
1490       goto appsend;
1491     }
1492     goto drop;
1493 #if UIP_ACTIVE_OPEN
1494   case UIP_SYN_SENT:
1495     /* In SYN_SENT, we wait for a SYNACK that is sent in response to
1496        our SYN. The rcv_nxt is set to sequence number in the SYNACK
1497        plus one, and we send an ACK. We move into the ESTABLISHED
1498        state. */
1499     if((uip_flags & UIP_ACKDATA) &&
1500        (BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK)) {
1501
1502       /* Parse the TCP MSS option, if present. */
1503       if((BUF->tcpoffset & 0xf0) > 0x50) {
1504         for(c = 0; c < ((BUF->tcpoffset >> 4) - 5) << 2 ;) {
1505           opt = uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN + c];
1506           if(opt == TCP_OPT_END) {
1507             /* End of options. */
1508             break;
1509           } else if(opt == TCP_OPT_NOOP) {
1510             ++c;
1511             /* NOP option. */
1512           } else if(opt == TCP_OPT_MSS &&
1513                     uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN) {
1514             /* An MSS option with the right option length. */
1515             tmp16 = (uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 2 + c] << 8) |
1516               uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 3 + c];
1517             uip_connr->initialmss =
1518               uip_connr->mss = tmp16 > UIP_TCP_MSS? UIP_TCP_MSS: tmp16;
1519
1520             /* And we are done processing options. */
1521             break;
1522           } else {
1523             /* All other options have a length field, so that we easily
1524                can skip past them. */
1525             if(uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == 0) {
1526               /* If the length field is zero, the options are malformed
1527                  and we don't process them further. */
1528               break;
1529             }
1530             c += uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c];
1531           }
1532         }
1533       }
1534       uip_connr->tcpstateflags = UIP_ESTABLISHED;
1535       uip_connr->rcv_nxt[0] = BUF->seqno[0];
1536       uip_connr->rcv_nxt[1] = BUF->seqno[1];
1537       uip_connr->rcv_nxt[2] = BUF->seqno[2];
1538       uip_connr->rcv_nxt[3] = BUF->seqno[3];
1539       uip_add_rcv_nxt(1);
1540       uip_flags = UIP_CONNECTED | UIP_NEWDATA;
1541       uip_connr->len = 0;
1542       uip_len = 0;
1543       uip_slen = 0;
1544       UIP_APPCALL();
1545       goto appsend;
1546     }
1547     /* Inform the application that the connection failed */
1548     uip_flags = UIP_ABORT;
1549     UIP_APPCALL();
1550     /* The connection is closed after we send the RST */
1551     uip_conn->tcpstateflags = UIP_CLOSED;
1552     goto reset;
1553 #endif /* UIP_ACTIVE_OPEN */
1554
1555   case UIP_ESTABLISHED:
1556     /* In the ESTABLISHED state, we call upon the application to feed
1557     data into the uip_buf. If the UIP_ACKDATA flag is set, the
1558     application should put new data into the buffer, otherwise we are
1559     retransmitting an old segment, and the application should put that
1560     data into the buffer.
1561
1562     If the incoming packet is a FIN, we should close the connection on
1563     this side as well, and we send out a FIN and enter the LAST_ACK
1564     state. We require that there is no outstanding data; otherwise the
1565     sequence numbers will be screwed up. */
1566
1567     if(BUF->flags & TCP_FIN && !(uip_connr->tcpstateflags & UIP_STOPPED)) {
1568       if(uip_outstanding(uip_connr)) {
1569         goto drop;
1570       }
1571       uip_add_rcv_nxt(1 + uip_len);
1572       uip_flags |= UIP_CLOSE;
1573       if(uip_len > 0) {
1574         uip_flags |= UIP_NEWDATA;
1575       }
1576       UIP_APPCALL();
1577       uip_connr->len = 1;
1578       uip_connr->tcpstateflags = UIP_LAST_ACK;
1579       uip_connr->nrtx = 0;
1580     tcp_send_finack:
1581       BUF->flags = TCP_FIN | TCP_ACK;
1582       goto tcp_send_nodata;
1583     }
1584
1585     /* Check the URG flag. If this is set, the segment carries urgent
1586        data that we must pass to the application. */
1587     if((BUF->flags & TCP_URG) != 0) {
1588 #if UIP_URGDATA > 0
1589       uip_urglen = (BUF->urgp[0] << 8) | BUF->urgp[1];
1590       if(uip_urglen > uip_len) {
1591         /* There is more urgent data in the next segment to come. */
1592         uip_urglen = uip_len;
1593       }
1594       uip_add_rcv_nxt(uip_urglen);
1595       uip_len -= uip_urglen;
1596       uip_urgdata = uip_appdata;
1597       uip_appdata += uip_urglen;
1598     } else {
1599       uip_urglen = 0;
1600 #else /* UIP_URGDATA > 0 */
1601       uip_appdata = ((char *)uip_appdata) + ((BUF->urgp[0] << 8) | BUF->urgp[1]);
1602       uip_len -= (BUF->urgp[0] << 8) | BUF->urgp[1];
1603 #endif /* UIP_URGDATA > 0 */
1604     }
1605
1606     /* If uip_len > 0 we have TCP data in the packet, and we flag this
1607        by setting the UIP_NEWDATA flag and update the sequence number
1608        we acknowledge. If the application has stopped the dataflow
1609        using uip_stop(), we must not accept any data packets from the
1610        remote host. */
1611     if(uip_len > 0 && !(uip_connr->tcpstateflags & UIP_STOPPED)) {
1612       uip_flags |= UIP_NEWDATA;
1613       uip_add_rcv_nxt(uip_len);
1614     }
1615
1616     /* Check if the available buffer space advertised by the other end
1617        is smaller than the initial MSS for this connection. If so, we
1618        set the current MSS to the window size to ensure that the
1619        application does not send more data than the other end can
1620        handle.
1621
1622        If the remote host advertises a zero window, we set the MSS to
1623        the initial MSS so that the application will send an entire MSS
1624        of data. This data will not be acknowledged by the receiver,
1625        and the application will retransmit it. This is called the
1626        "persistent timer" and uses the retransmission mechanim.
1627     */
1628     tmp16 = ((u16_t)BUF->wnd[0] << 8) + (u16_t)BUF->wnd[1];
1629     if(tmp16 > uip_connr->initialmss ||
1630        tmp16 == 0) {
1631       tmp16 = uip_connr->initialmss;
1632     }
1633     uip_connr->mss = tmp16;
1634
1635     /* If this packet constitutes an ACK for outstanding data (flagged
1636        by the UIP_ACKDATA flag, we should call the application since it
1637        might want to send more data. If the incoming packet had data
1638        from the peer (as flagged by the UIP_NEWDATA flag), the
1639        application must also be notified.
1640
1641        When the application is called, the global variable uip_len
1642        contains the length of the incoming data. The application can
1643        access the incoming data through the global pointer
1644        uip_appdata, which usually points UIP_IPTCPH_LEN + UIP_LLH_LEN
1645        bytes into the uip_buf array.
1646
1647        If the application wishes to send any data, this data should be
1648        put into the uip_appdata and the length of the data should be
1649        put into uip_len. If the application don't have any data to
1650        send, uip_len must be set to 0. */
1651     if(uip_flags & (UIP_NEWDATA | UIP_ACKDATA)) {
1652       uip_slen = 0;
1653       UIP_APPCALL();
1654
1655     appsend:
1656
1657       if(uip_flags & UIP_ABORT) {
1658         uip_slen = 0;
1659         uip_connr->tcpstateflags = UIP_CLOSED;
1660         BUF->flags = TCP_RST | TCP_ACK;
1661         goto tcp_send_nodata;
1662       }
1663
1664       if(uip_flags & UIP_CLOSE) {
1665         uip_slen = 0;
1666         uip_connr->len = 1;
1667         uip_connr->tcpstateflags = UIP_FIN_WAIT_1;
1668         uip_connr->nrtx = 0;
1669         BUF->flags = TCP_FIN | TCP_ACK;
1670         goto tcp_send_nodata;
1671       }
1672
1673       /* If uip_slen > 0, the application has data to be sent. */
1674       if(uip_slen > 0) {
1675
1676         /* If the connection has acknowledged data, the contents of
1677            the ->len variable should be discarded. */
1678         if((uip_flags & UIP_ACKDATA) != 0) {
1679           uip_connr->len = 0;
1680         }
1681
1682         /* If the ->len variable is non-zero the connection has
1683            already data in transit and cannot send anymore right
1684            now. */
1685         if(uip_connr->len == 0) {
1686
1687           /* The application cannot send more than what is allowed by
1688              the mss (the minumum of the MSS and the available
1689              window). */
1690           if(uip_slen > uip_connr->mss) {
1691             uip_slen = uip_connr->mss;
1692           }
1693
1694           /* Remember how much data we send out now so that we know
1695              when everything has been acknowledged. */
1696           uip_connr->len = uip_slen;
1697         } else {
1698
1699           /* If the application already had unacknowledged data, we
1700              make sure that the application does not send (i.e.,
1701              retransmit) out more than it previously sent out. */
1702           uip_slen = uip_connr->len;
1703         }
1704       }
1705       uip_connr->nrtx = 0;
1706     apprexmit:
1707       uip_appdata = uip_sappdata;
1708
1709       /* If the application has data to be sent, or if the incoming
1710          packet had new data in it, we must send out a packet. */
1711       if(uip_slen > 0 && uip_connr->len > 0) {
1712         /* Add the length of the IP and TCP headers. */
1713         uip_len = uip_connr->len + UIP_TCPIP_HLEN;
1714         /* We always set the ACK flag in response packets. */
1715         BUF->flags = TCP_ACK | TCP_PSH;
1716         /* Send the packet. */
1717         goto tcp_send_noopts;
1718       }
1719       /* If there is no data to send, just send out a pure ACK if
1720          there is newdata. */
1721       if(uip_flags & UIP_NEWDATA) {
1722         uip_len = UIP_TCPIP_HLEN;
1723         BUF->flags = TCP_ACK;
1724         goto tcp_send_noopts;
1725       }
1726     }
1727     goto drop;
1728   case UIP_LAST_ACK:
1729     /* We can close this connection if the peer has acknowledged our
1730        FIN. This is indicated by the UIP_ACKDATA flag. */
1731     if(uip_flags & UIP_ACKDATA) {
1732       uip_connr->tcpstateflags = UIP_CLOSED;
1733       uip_flags = UIP_CLOSE;
1734       UIP_APPCALL();
1735     }
1736     break;
1737
1738   case UIP_FIN_WAIT_1:
1739     /* The application has closed the connection, but the remote host
1740        hasn't closed its end yet. Thus we do nothing but wait for a
1741        FIN from the other side. */
1742     if(uip_len > 0) {
1743       uip_add_rcv_nxt(uip_len);
1744     }
1745     if(BUF->flags & TCP_FIN) {
1746       if(uip_flags & UIP_ACKDATA) {
1747         uip_connr->tcpstateflags = UIP_TIME_WAIT;
1748         uip_connr->timer = 0;
1749         uip_connr->len = 0;
1750       } else {
1751         uip_connr->tcpstateflags = UIP_CLOSING;
1752       }
1753       uip_add_rcv_nxt(1);
1754       uip_flags = UIP_CLOSE;
1755       UIP_APPCALL();
1756       goto tcp_send_ack;
1757     } else if(uip_flags & UIP_ACKDATA) {
1758       uip_connr->tcpstateflags = UIP_FIN_WAIT_2;
1759       uip_connr->len = 0;
1760       goto drop;
1761     }
1762     if(uip_len > 0) {
1763       goto tcp_send_ack;
1764     }
1765     goto drop;
1766
1767   case UIP_FIN_WAIT_2:
1768     if(uip_len > 0) {
1769       uip_add_rcv_nxt(uip_len);
1770     }
1771     if(BUF->flags & TCP_FIN) {
1772       uip_connr->tcpstateflags = UIP_TIME_WAIT;
1773       uip_connr->timer = 0;
1774       uip_add_rcv_nxt(1);
1775       uip_flags = UIP_CLOSE;
1776       UIP_APPCALL();
1777       goto tcp_send_ack;
1778     }
1779     if(uip_len > 0) {
1780       goto tcp_send_ack;
1781     }
1782     goto drop;
1783
1784   case UIP_TIME_WAIT:
1785     goto tcp_send_ack;
1786
1787   case UIP_CLOSING:
1788     if(uip_flags & UIP_ACKDATA) {
1789       uip_connr->tcpstateflags = UIP_TIME_WAIT;
1790       uip_connr->timer = 0;
1791     }
1792   }
1793   goto drop;
1794
1795
1796   /* We jump here when we are ready to send the packet, and just want
1797      to set the appropriate TCP sequence numbers in the TCP header. */
1798  tcp_send_ack:
1799   BUF->flags = TCP_ACK;
1800  tcp_send_nodata:
1801   uip_len = UIP_IPTCPH_LEN;
1802  tcp_send_noopts:
1803   BUF->tcpoffset = (UIP_TCPH_LEN / 4) << 4;
1804  tcp_send:
1805   /* We're done with the input processing. We are now ready to send a
1806      reply. Our job is to fill in all the fields of the TCP and IP
1807      headers before calculating the checksum and finally send the
1808      packet. */
1809   BUF->ackno[0] = uip_connr->rcv_nxt[0];
1810   BUF->ackno[1] = uip_connr->rcv_nxt[1];
1811   BUF->ackno[2] = uip_connr->rcv_nxt[2];
1812   BUF->ackno[3] = uip_connr->rcv_nxt[3];
1813
1814   BUF->seqno[0] = uip_connr->snd_nxt[0];
1815   BUF->seqno[1] = uip_connr->snd_nxt[1];
1816   BUF->seqno[2] = uip_connr->snd_nxt[2];
1817   BUF->seqno[3] = uip_connr->snd_nxt[3];
1818
1819   BUF->proto = UIP_PROTO_TCP;
1820
1821   BUF->srcport  = uip_connr->lport;
1822   BUF->destport = uip_connr->rport;
1823
1824   uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr);
1825   uip_ipaddr_copy(BUF->destipaddr, uip_connr->ripaddr);
1826
1827   if(uip_connr->tcpstateflags & UIP_STOPPED) {
1828     /* If the connection has issued uip_stop(), we advertise a zero
1829        window so that the remote host will stop sending data. */
1830     BUF->wnd[0] = BUF->wnd[1] = 0;
1831   } else {
1832     BUF->wnd[0] = ((UIP_RECEIVE_WINDOW) >> 8);
1833     BUF->wnd[1] = ((UIP_RECEIVE_WINDOW) & 0xff);
1834   }
1835
1836  tcp_send_noconn:
1837   BUF->ttl = UIP_TTL;
1838 #if UIP_CONF_IPV6
1839   /* For IPv6, the IP length field does not include the IPv6 IP header
1840      length. */
1841   BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8);
1842   BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff);
1843 #else /* UIP_CONF_IPV6 */
1844   BUF->len[0] = (uip_len >> 8);
1845   BUF->len[1] = (uip_len & 0xff);
1846 #endif /* UIP_CONF_IPV6 */
1847
1848   BUF->urgp[0] = BUF->urgp[1] = 0;
1849
1850   /* Calculate TCP checksum. */
1851   BUF->tcpchksum = 0;
1852   BUF->tcpchksum = ~(uip_tcpchksum());
1853
1854 #if UIP_UDP
1855  ip_send_nolen:
1856 #endif /* UIP_UDP */
1857
1858 #if UIP_CONF_IPV6
1859   BUF->vtc = 0x60;
1860   BUF->tcflow = 0x00;
1861   BUF->flow = 0x00;
1862 #else /* UIP_CONF_IPV6 */
1863   BUF->vhl = 0x45;
1864   BUF->tos = 0;
1865   BUF->ipoffset[0] = BUF->ipoffset[1] = 0;
1866   ++ipid;
1867   BUF->ipid[0] = ipid >> 8;
1868   BUF->ipid[1] = ipid & 0xff;
1869   /* Calculate IP checksum. */
1870   BUF->ipchksum = 0;
1871   BUF->ipchksum = ~(uip_ipchksum());
1872   DEBUG_PRINTF("uip ip_send_nolen: chkecum 0x%04x\n", uip_ipchksum());
1873 #endif /* UIP_CONF_IPV6 */
1874
1875   UIP_STAT(++uip_stat.tcp.sent);
1876  send:
1877   DEBUG_PRINTF("Sending packet with length %d (%d)\n", uip_len,
1878                (BUF->len[0] << 8) | BUF->len[1]);
1879
1880   UIP_STAT(++uip_stat.ip.sent);
1881   /* Return and let the caller do the actual transmission. */
1882   uip_flags = 0;
1883   return;
1884  drop:
1885   uip_len = 0;
1886   uip_flags = 0;
1887   return;
1888 }
1889 /*---------------------------------------------------------------------------*/
1890 u16_t
1891 htons(u16_t val)
1892 {
1893   return HTONS(val);
1894 }
1895 /*---------------------------------------------------------------------------*/
1896 void
1897 uip_send(const void *data, int len)
1898 {
1899   if(len > 0) {
1900     uip_slen = len;
1901     if(data != uip_sappdata) {
1902       memcpy(uip_sappdata, (data), uip_slen);
1903     }
1904   }
1905 }
1906 /** @} */
Note: See TracBrowser for help on using the browser.