1 #define DEBUG_PRINTF(...) /*printf(__VA_ARGS__)*/ 
  10  * The uIP TCP/IP stack code. 
  11  * \author Adam Dunkels <adam@dunkels.com> 
  15  * Copyright (c) 2001-2003, Adam Dunkels. 
  16  * All rights reserved. 
  18  * Redistribution and use in source and binary forms, with or without 
  19  * modification, are permitted provided that the following conditions 
  21  * 1. Redistributions of source code must retain the above copyright 
  22  *    notice, this list of conditions and the following disclaimer. 
  23  * 2. Redistributions in binary form must reproduce the above copyright 
  24  *    notice, this list of conditions and the following disclaimer in the 
  25  *    documentation and/or other materials provided with the distribution. 
  26  * 3. The name of the author may not be used to endorse or promote 
  27  *    products derived from this software without specific prior 
  30  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 
  31  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
  32  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
  33  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 
  34  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
  35  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 
  36  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
  37  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
  38  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
  39  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
  40  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  42  * This file is part of the uIP TCP/IP stack. 
  44  * $Id: uip.c,v 1.15 2008/10/15 08:08:32 adamdunkels Exp $ 
  49  * uIP is a small implementation of the IP, UDP and TCP protocols (as 
  50  * well as some basic ICMP stuff). The implementation couples the IP, 
  51  * UDP, TCP and the application layers very tightly. To keep the size 
  52  * of the compiled code down, this code frequently uses the goto 
  53  * statement. While it would be possible to break the uip_process() 
  54  * function into many smaller functions, this would increase the code 
  55  * size because of the overhead of parameter passing and the fact that 
  56  * the optimiser would not be as efficient. 
  58  * The principle is that we have a small buffer, called the uip_buf, 
  59  * in which the device driver puts an incoming packet. The TCP/IP 
  60  * stack parses the headers in the packet, and calls the 
  61  * application. If the remote host has sent data to the application, 
  62  * this data is present in the uip_buf and the application read the 
  63  * data from there. It is up to the application to put this data into 
  64  * a byte stream if needed. The application will not be fed with data 
  65  * that is out of sequence. 
  67  * If the application whishes to send data to the peer, it should put 
  68  * its data into the uip_buf. The uip_appdata pointer points to the 
  69  * first available byte. The TCP/IP stack will calculate the 
  70  * checksums, and fill in the necessary header fields and finally send 
  71  * the packet back to the peer. 
  78 #if !UIP_CONF_IPV6 /* If UIP_CONF_IPV6 is defined, we compile the 
  79                       uip6.c file instead of this one. Therefore 
  80                       this #ifndef removes the entire compilation 
  81                       output of the uip.c file */ 
  85 #include "net/uip-neighbor.h" 
  86 #endif /* UIP_CONF_IPV6 */ 
  90 /*---------------------------------------------------------------------------*/ 
  91 /* Variable definitions. */ 
  94 /* The IP address of this host. If it is defined to be fixed (by 
  95    setting UIP_FIXEDADDR to 1 in uipopt.h), the address is set 
  96    here. Otherwise, the address */ 
  98 const uip_ipaddr_t uip_hostaddr 
= 
  99   { UIP_IPADDR0
, UIP_IPADDR1
, UIP_IPADDR2
, UIP_IPADDR3 
}; 
 100 const uip_ipaddr_t uip_draddr 
= 
 101   { UIP_DRIPADDR0
, UIP_DRIPADDR1
, UIP_DRIPADDR2
, UIP_DRIPADDR3 
}; 
 102 const uip_ipaddr_t uip_netmask 
= 
 103   { UIP_NETMASK0
, UIP_NETMASK1
, UIP_NETMASK2
, UIP_NETMASK3 
}; 
 105 uip_ipaddr_t uip_hostaddr
, uip_draddr
, uip_netmask
; 
 106 #endif /* UIP_FIXEDADDR */ 
 108 const uip_ipaddr_t uip_broadcast_addr 
= 
 110   { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
 111       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } }; 
 112 #else /* UIP_CONF_IPV6 */ 
 113   { { 0xff, 0xff, 0xff, 0xff } }; 
 114 #endif /* UIP_CONF_IPV6 */ 
 115 const uip_ipaddr_t uip_all_zeroes_addr 
= { { 0x0, /* rest is 0 */ } }; 
 118 const struct uip_eth_addr uip_ethaddr 
= {{UIP_ETHADDR0
, 
 125 struct uip_eth_addr uip_ethaddr 
= {{0,0,0,0,0,0}}; 
 128 #ifndef UIP_CONF_EXTERNAL_BUFFER 
 129 u8_t uip_buf
[UIP_BUFSIZE 
+ 2];   /* The packet buffer that contains 
 131 #endif /* UIP_CONF_EXTERNAL_BUFFER */ 
 133 void *uip_appdata
;               /* The uip_appdata pointer points to 
 135 void *uip_sappdata
;              /* The uip_appdata pointer points to 
 136                                     the application data which is to 
 139 void *uip_urgdata
;               /* The uip_urgdata pointer points to 
 140                                     urgent data (out-of-band data), if 
 142 u16_t uip_urglen
, uip_surglen
; 
 143 #endif /* UIP_URGDATA > 0 */ 
 145 u16_t uip_len
, uip_slen
; 
 146                              /* The uip_len is either 8 or 16 bits, 
 147                                 depending on the maximum packet 
 150 u8_t uip_flags
;     /* The uip_flags variable is used for 
 151                                 communication between the TCP/IP stack 
 152                                 and the application program. */ 
 153 struct uip_conn 
*uip_conn
;   /* uip_conn always points to the current 
 156 struct uip_conn uip_conns
[UIP_CONNS
]; 
 157                              /* The uip_conns array holds all TCP 
 159 u16_t uip_listenports
[UIP_LISTENPORTS
]; 
 160                              /* The uip_listenports list all currently 
 163 struct uip_udp_conn 
*uip_udp_conn
; 
 164 struct uip_udp_conn uip_udp_conns
[UIP_UDP_CONNS
]; 
 167 static u16_t ipid
;           /* Ths ipid variable is an increasing 
 168                                 number that is used for the IP ID 
 171 void uip_setipid(u16_t id
) { ipid 
= id
; } 
 173 static u8_t iss
[4];          /* The iss variable is used for the TCP 
 174                                 initial sequence number. */ 
 177 static u16_t lastport
;       /* Keeps track of the last port used for 
 179 #endif /* UIP_ACTIVE_OPEN */ 
 181 /* Temporary variables. */ 
 186 /* Structures and definitions. */ 
 195 #define TCP_OPT_END     0   /* End of TCP options list */ 
 196 #define TCP_OPT_NOOP    1   /* "No-operation" TCP option */ 
 197 #define TCP_OPT_MSS     2   /* Maximum segment size TCP option */ 
 199 #define TCP_OPT_MSS_LEN 4   /* Length of TCP MSS option. */ 
 201 #define ICMP_ECHO_REPLY 0 
 204 #define ICMP_DEST_UNREACHABLE        3 
 205 #define ICMP_PORT_UNREACHABLE        3 
 207 #define ICMP6_ECHO_REPLY             129 
 208 #define ICMP6_ECHO                   128 
 209 #define ICMP6_NEIGHBOR_SOLICITATION  135 
 210 #define ICMP6_NEIGHBOR_ADVERTISEMENT 136 
 212 #define ICMP6_FLAG_S (1 << 6) 
 214 #define ICMP6_OPTION_SOURCE_LINK_ADDRESS 1 
 215 #define ICMP6_OPTION_TARGET_LINK_ADDRESS 2 
 219 #define BUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN]) 
 220 #define FBUF ((struct uip_tcpip_hdr *)&uip_reassbuf[0]) 
 221 #define ICMPBUF ((struct uip_icmpip_hdr *)&uip_buf[UIP_LLH_LEN]) 
 222 #define UDPBUF ((struct uip_udpip_hdr *)&uip_buf[UIP_LLH_LEN]) 
 225 #if UIP_STATISTICS == 1 
 226 struct uip_stats uip_stat
; 
 227 #define UIP_STAT(s) s 
 230 #endif /* UIP_STATISTICS == 1 */ 
 234 void uip_log(char *msg
); 
 235 #define UIP_LOG(m) uip_log(m) 
 238 #endif /* UIP_LOGGING == 1 */ 
 242 uip_add32(u8_t 
*op32
, u16_t op16
) 
 244   uip_acc32
[3] = op32
[3] + (op16 
& 0xff); 
 245   uip_acc32
[2] = op32
[2] + (op16 
>> 8); 
 246   uip_acc32
[1] = op32
[1]; 
 247   uip_acc32
[0] = op32
[0]; 
 249   if(uip_acc32
[2] < (op16 
>> 8)) { 
 251     if(uip_acc32
[1] == 0) { 
 257   if(uip_acc32
[3] < (op16 
& 0xff)) { 
 259     if(uip_acc32
[2] == 0) { 
 261       if(uip_acc32
[1] == 0) { 
 268 #endif /* UIP_ARCH_ADD32 */ 
 270 #if ! UIP_ARCH_CHKSUM 
 271 /*---------------------------------------------------------------------------*/ 
 273 chksum(u16_t sum
, const u8_t 
*data
, u16_t len
) 
 277   const u8_t 
*last_byte
; 
 280   last_byte 
= data 
+ len 
- 1; 
 282   while(dataptr 
< last_byte
) {  /* At least two more bytes */ 
 283     t 
= (dataptr
[0] << 8) + dataptr
[1]; 
 291   if(dataptr 
== last_byte
) { 
 292     t 
= (dataptr
[0] << 8) + 0; 
 299   /* Return sum in host byte order. */ 
 302 /*---------------------------------------------------------------------------*/ 
 304 uip_chksum(u16_t 
*data
, u16_t len
) 
 306   return htons(chksum(0, (u8_t 
*)data
, len
)); 
 308 /*---------------------------------------------------------------------------*/ 
 309 #ifndef UIP_ARCH_IPCHKSUM 
 315   sum 
= chksum(0, &uip_buf
[UIP_LLH_LEN
], UIP_IPH_LEN
); 
 316   DEBUG_PRINTF("uip_ipchksum: sum 0x%04x\n", sum
); 
 317   return (sum 
== 0) ? 
0xffff : htons(sum
); 
 320 /*---------------------------------------------------------------------------*/ 
 322 upper_layer_chksum(u8_t proto
) 
 324   u16_t upper_layer_len
; 
 328   upper_layer_len 
= (((u16_t
)(BUF
->len
[0]) << 8) + BUF
->len
[1]); 
 329 #else /* UIP_CONF_IPV6 */ 
 330   upper_layer_len 
= (((u16_t
)(BUF
->len
[0]) << 8) + BUF
->len
[1]) - UIP_IPH_LEN
; 
 331 #endif /* UIP_CONF_IPV6 */ 
 333   /* First sum pseudoheader. */ 
 335   /* IP protocol and length fields. This addition cannot carry. */ 
 336   sum 
= upper_layer_len 
+ proto
; 
 337   /* Sum IP source and destination addresses. */ 
 338   sum 
= chksum(sum
, (u8_t 
*)&BUF
->srcipaddr
, 2 * sizeof(uip_ipaddr_t
)); 
 340   /* Sum TCP header and data. */ 
 341   sum 
= chksum(sum
, &uip_buf
[UIP_IPH_LEN 
+ UIP_LLH_LEN
], 
 344   return (sum 
== 0) ? 
0xffff : htons(sum
); 
 346 /*---------------------------------------------------------------------------*/ 
 349 uip_icmp6chksum(void) 
 351   return upper_layer_chksum(UIP_PROTO_ICMP6
); 
 354 #endif /* UIP_CONF_IPV6 */ 
 355 /*---------------------------------------------------------------------------*/ 
 359   return upper_layer_chksum(UIP_PROTO_TCP
); 
 361 /*---------------------------------------------------------------------------*/ 
 362 #if UIP_UDP_CHECKSUMS 
 366   return upper_layer_chksum(UIP_PROTO_UDP
); 
 368 #endif /* UIP_UDP_CHECKSUMS */ 
 369 #endif /* UIP_ARCH_CHKSUM */ 
 370 /*---------------------------------------------------------------------------*/ 
 374   for(c 
= 0; c 
< UIP_LISTENPORTS
; ++c
) { 
 375     uip_listenports
[c
] = 0; 
 377   for(c 
= 0; c 
< UIP_CONNS
; ++c
) { 
 378     uip_conns
[c
].tcpstateflags 
= UIP_CLOSED
; 
 382 #endif /* UIP_ACTIVE_OPEN */ 
 385   for(c 
= 0; c 
< UIP_UDP_CONNS
; ++c
) { 
 386     uip_udp_conns
[c
].lport 
= 0; 
 391   /* IPv4 initialization. */ 
 392 #if UIP_FIXEDADDR == 0 
 393   /*  uip_hostaddr[0] = uip_hostaddr[1] = 0;*/ 
 394 #endif /* UIP_FIXEDADDR */ 
 397 /*---------------------------------------------------------------------------*/ 
 400 uip_connect(uip_ipaddr_t 
*ripaddr
, u16_t rport
) 
 402   register struct uip_conn 
*conn
, *cconn
; 
 404   /* Find an unused local port. */ 
 408   if(lastport 
>= 32000) { 
 412   /* Check if this port is already in use, and if so try to find 
 414   for(c 
= 0; c 
< UIP_CONNS
; ++c
) { 
 415     conn 
= &uip_conns
[c
]; 
 416     if(conn
->tcpstateflags 
!= UIP_CLOSED 
&& 
 417        conn
->lport 
== htons(lastport
)) { 
 423   for(c 
= 0; c 
< UIP_CONNS
; ++c
) { 
 424     cconn 
= &uip_conns
[c
]; 
 425     if(cconn
->tcpstateflags 
== UIP_CLOSED
) { 
 429     if(cconn
->tcpstateflags 
== UIP_TIME_WAIT
) { 
 431          cconn
->timer 
> conn
->timer
) { 
 441   conn
->tcpstateflags 
= UIP_SYN_SENT
; 
 443   conn
->snd_nxt
[0] = iss
[0]; 
 444   conn
->snd_nxt
[1] = iss
[1]; 
 445   conn
->snd_nxt
[2] = iss
[2]; 
 446   conn
->snd_nxt
[3] = iss
[3]; 
 448   conn
->initialmss 
= conn
->mss 
= UIP_TCP_MSS
; 
 450   conn
->len 
= 1;   /* TCP length of the SYN is one. */ 
 452   conn
->timer 
= 1; /* Send the SYN next time around. */ 
 455   conn
->sv 
= 16;   /* Initial value of the RTT variance. */ 
 456   conn
->lport 
= htons(lastport
); 
 458   uip_ipaddr_copy(&conn
->ripaddr
, ripaddr
); 
 462 #endif /* UIP_ACTIVE_OPEN */ 
 463 /*---------------------------------------------------------------------------*/ 
 465 struct uip_udp_conn 
* 
 466 uip_udp_new(const uip_ipaddr_t 
*ripaddr
, u16_t rport
) 
 468   register struct uip_udp_conn 
*conn
; 
 470   /* Find an unused local port. */ 
 474   if(lastport 
>= 32000) { 
 478   for(c 
= 0; c 
< UIP_UDP_CONNS
; ++c
) { 
 479     if(uip_udp_conns
[c
].lport 
== htons(lastport
)) { 
 486   for(c 
= 0; c 
< UIP_UDP_CONNS
; ++c
) { 
 487     if(uip_udp_conns
[c
].lport 
== 0) { 
 488       conn 
= &uip_udp_conns
[c
]; 
 497   conn
->lport 
= HTONS(lastport
); 
 499   if(ripaddr 
== NULL
) { 
 500     memset(&conn
->ripaddr
, 0, sizeof(uip_ipaddr_t
)); 
 502     uip_ipaddr_copy(&conn
->ripaddr
, ripaddr
); 
 509 /*---------------------------------------------------------------------------*/ 
 511 uip_unlisten(u16_t port
) 
 513   for(c 
= 0; c 
< UIP_LISTENPORTS
; ++c
) { 
 514     if(uip_listenports
[c
] == port
) { 
 515       uip_listenports
[c
] = 0; 
 520 /*---------------------------------------------------------------------------*/ 
 522 uip_listen(u16_t port
) 
 524   for(c 
= 0; c 
< UIP_LISTENPORTS
; ++c
) { 
 525     if(uip_listenports
[c
] == 0) { 
 526       uip_listenports
[c
] = port
; 
 531 /*---------------------------------------------------------------------------*/ 
 532 /* XXX: IP fragment reassembly: not well-tested. */ 
 534 #if UIP_REASSEMBLY && !UIP_CONF_IPV6 
 535 #define UIP_REASS_BUFSIZE (UIP_BUFSIZE - UIP_LLH_LEN) 
 536 static u8_t uip_reassbuf
[UIP_REASS_BUFSIZE
]; 
 537 static u8_t uip_reassbitmap
[UIP_REASS_BUFSIZE 
/ (8 * 8)]; 
 538 static const u8_t bitmap_bits
[8] = {0xff, 0x7f, 0x3f, 0x1f, 
 539                                     0x0f, 0x07, 0x03, 0x01}; 
 540 static u16_t uip_reasslen
; 
 541 static u8_t uip_reassflags
; 
 542 #define UIP_REASS_FLAG_LASTFRAG 0x01 
 543 static u8_t uip_reasstmr
; 
 553   /* If ip_reasstmr is zero, no packet is present in the buffer, so we 
 554      write the IP header of the fragment into the reassembly 
 555      buffer. The timer is updated with the maximum age. */ 
 556   if(uip_reasstmr 
== 0) { 
 557     memcpy(uip_reassbuf
, &BUF
->vhl
, UIP_IPH_LEN
); 
 558     uip_reasstmr 
= UIP_REASS_MAXAGE
; 
 560     /* Clear the bitmap. */ 
 561     memset(uip_reassbitmap
, 0, sizeof(uip_reassbitmap
)); 
 564   /* Check if the incoming fragment matches the one currently present 
 565      in the reasembly buffer. If so, we proceed with copying the 
 566      fragment into the buffer. */ 
 567   if(BUF
->srcipaddr
[0] == FBUF
->srcipaddr
[0] && 
 568      BUF
->srcipaddr
[1] == FBUF
->srcipaddr
[1] && 
 569      BUF
->destipaddr
[0] == FBUF
->destipaddr
[0] && 
 570      BUF
->destipaddr
[1] == FBUF
->destipaddr
[1] && 
 571      BUF
->ipid
[0] == FBUF
->ipid
[0] && 
 572      BUF
->ipid
[1] == FBUF
->ipid
[1]) { 
 574     len 
= (BUF
->len
[0] << 8) + BUF
->len
[1] - (BUF
->vhl 
& 0x0f) * 4; 
 575     offset 
= (((BUF
->ipoffset
[0] & 0x3f) << 8) + BUF
->ipoffset
[1]) * 8; 
 577     /* If the offset or the offset + fragment length overflows the 
 578        reassembly buffer, we discard the entire packet. */ 
 579     if(offset 
> UIP_REASS_BUFSIZE 
|| 
 580        offset 
+ len 
> UIP_REASS_BUFSIZE
) { 
 585     /* Copy the fragment into the reassembly buffer, at the right 
 587     memcpy(&uip_reassbuf
[UIP_IPH_LEN 
+ offset
], 
 588            (char *)BUF 
+ (int)((BUF
->vhl 
& 0x0f) * 4), 
 591     /* Update the bitmap. */ 
 592     if(offset 
/ (8 * 8) == (offset 
+ len
) / (8 * 8)) { 
 593       /* If the two endpoints are in the same byte, we only update 
 596       uip_reassbitmap
[offset 
/ (8 * 8)] |= 
 597              bitmap_bits
[(offset 
/ 8 ) & 7] & 
 598              ~bitmap_bits
[((offset 
+ len
) / 8 ) & 7]; 
 600       /* If the two endpoints are in different bytes, we update the 
 601          bytes in the endpoints and fill the stuff in-between with 
 603       uip_reassbitmap
[offset 
/ (8 * 8)] |= 
 604         bitmap_bits
[(offset 
/ 8 ) & 7]; 
 605       for(i 
= 1 + offset 
/ (8 * 8); i 
< (offset 
+ len
) / (8 * 8); ++i
) { 
 606         uip_reassbitmap
[i
] = 0xff; 
 608       uip_reassbitmap
[(offset 
+ len
) / (8 * 8)] |= 
 609         ~bitmap_bits
[((offset 
+ len
) / 8 ) & 7]; 
 612     /* If this fragment has the More Fragments flag set to zero, we 
 613        know that this is the last fragment, so we can calculate the 
 614        size of the entire packet. We also set the 
 615        IP_REASS_FLAG_LASTFRAG flag to indicate that we have received 
 616        the final fragment. */ 
 618     if((BUF
->ipoffset
[0] & IP_MF
) == 0) { 
 619       uip_reassflags 
|= UIP_REASS_FLAG_LASTFRAG
; 
 620       uip_reasslen 
= offset 
+ len
; 
 623     /* Finally, we check if we have a full packet in the buffer. We do 
 624        this by checking if we have the last fragment and if all bits 
 625        in the bitmap are set. */ 
 626     if(uip_reassflags 
& UIP_REASS_FLAG_LASTFRAG
) { 
 627       /* Check all bytes up to and including all but the last byte in 
 629       for(i 
= 0; i 
< uip_reasslen 
/ (8 * 8) - 1; ++i
) { 
 630         if(uip_reassbitmap
[i
] != 0xff) { 
 634       /* Check the last byte in the bitmap. It should contain just the 
 635          right amount of bits. */ 
 636       if(uip_reassbitmap
[uip_reasslen 
/ (8 * 8)] != 
 637          (u8_t
)~bitmap_bits
[uip_reasslen 
/ 8 & 7]) { 
 641       /* If we have come this far, we have a full packet in the 
 642          buffer, so we allocate a pbuf and copy the packet into it. We 
 643          also reset the timer. */ 
 645       memcpy(BUF
, FBUF
, uip_reasslen
); 
 647       /* Pretend to be a "normal" (i.e., not fragmented) IP packet 
 649       BUF
->ipoffset
[0] = BUF
->ipoffset
[1] = 0; 
 650       BUF
->len
[0] = uip_reasslen 
>> 8; 
 651       BUF
->len
[1] = uip_reasslen 
& 0xff; 
 653       BUF
->ipchksum 
= ~(uip_ipchksum()); 
 662 #endif /* UIP_REASSEMBLY */ 
 663 /*---------------------------------------------------------------------------*/ 
 665 uip_add_rcv_nxt(u16_t n
) 
 667   uip_add32(uip_conn
->rcv_nxt
, n
); 
 668   uip_conn
->rcv_nxt
[0] = uip_acc32
[0]; 
 669   uip_conn
->rcv_nxt
[1] = uip_acc32
[1]; 
 670   uip_conn
->rcv_nxt
[2] = uip_acc32
[2]; 
 671   uip_conn
->rcv_nxt
[3] = uip_acc32
[3]; 
 673 /*---------------------------------------------------------------------------*/ 
 675 uip_process(u8_t flag
) 
 677   register struct uip_conn 
*uip_connr 
= uip_conn
; 
 680   if(flag 
== UIP_UDP_SEND_CONN
) { 
 685   uip_sappdata 
= uip_appdata 
= &uip_buf
[UIP_IPTCPH_LEN 
+ UIP_LLH_LEN
]; 
 687   /* Check if we were invoked because of a poll request for a 
 688      particular connection. */ 
 689   if(flag 
== UIP_POLL_REQUEST
) { 
 690     if((uip_connr
->tcpstateflags 
& UIP_TS_MASK
) == UIP_ESTABLISHED 
&& 
 691        !uip_outstanding(uip_connr
)) { 
 692         uip_len 
= uip_slen 
= 0; 
 693         uip_flags 
= UIP_POLL
; 
 699     /* Check if we were invoked because of the periodic timer firing. */ 
 700   } else if(flag 
== UIP_TIMER
) { 
 702     if(uip_reasstmr 
!= 0) { 
 705 #endif /* UIP_REASSEMBLY */ 
 706     /* Increase the initial sequence number. */ 
 715     /* Reset the length variables. */ 
 719     /* Check if the connection is in a state in which we simply wait 
 720        for the connection to time out. If so, we increase the 
 721        connection's timer and remove the connection if it times 
 723     if(uip_connr
->tcpstateflags 
== UIP_TIME_WAIT 
|| 
 724        uip_connr
->tcpstateflags 
== UIP_FIN_WAIT_2
) { 
 725       ++(uip_connr
->timer
); 
 726       if(uip_connr
->timer 
== UIP_TIME_WAIT_TIMEOUT
) { 
 727         uip_connr
->tcpstateflags 
= UIP_CLOSED
; 
 729     } else if(uip_connr
->tcpstateflags 
!= UIP_CLOSED
) { 
 730       /* If the connection has outstanding data, we increase the 
 731          connection's timer and see if it has reached the RTO value 
 732          in which case we retransmit. */ 
 733       if(uip_outstanding(uip_connr
)) { 
 734         if(uip_connr
->timer
-- == 0) { 
 735           if(uip_connr
->nrtx 
== UIP_MAXRTX 
|| 
 736              ((uip_connr
->tcpstateflags 
== UIP_SYN_SENT 
|| 
 737                uip_connr
->tcpstateflags 
== UIP_SYN_RCVD
) && 
 738               uip_connr
->nrtx 
== UIP_MAXSYNRTX
)) { 
 739             uip_connr
->tcpstateflags 
= UIP_CLOSED
; 
 741             /* We call UIP_APPCALL() with uip_flags set to 
 742                UIP_TIMEDOUT to inform the application that the 
 743                connection has timed out. */ 
 744             uip_flags 
= UIP_TIMEDOUT
; 
 747             /* We also send a reset packet to the remote host. */ 
 748             BUF
->flags 
= TCP_RST 
| TCP_ACK
; 
 749             goto tcp_send_nodata
; 
 752           /* Exponential back-off. */ 
 753           uip_connr
->timer 
= UIP_RTO 
<< (uip_connr
->nrtx 
> 4?
 
 758           /* Ok, so we need to retransmit. We do this differently 
 759              depending on which state we are in. In ESTABLISHED, we 
 760              call upon the application so that it may prepare the 
 761              data for the retransmit. In SYN_RCVD, we resend the 
 762              SYNACK that we sent earlier and in LAST_ACK we have to 
 763              retransmit our FINACK. */ 
 764           UIP_STAT(++uip_stat
.tcp
.rexmit
); 
 765           switch(uip_connr
->tcpstateflags 
& UIP_TS_MASK
) { 
 767             /* In the SYN_RCVD state, we should retransmit our 
 769             goto tcp_send_synack
; 
 773             /* In the SYN_SENT state, we retransmit out SYN. */ 
 776 #endif /* UIP_ACTIVE_OPEN */ 
 778           case UIP_ESTABLISHED
: 
 779             /* In the ESTABLISHED state, we call upon the application 
 780                to do the actual retransmit after which we jump into 
 781                the code for sending out the packet (the apprexmit 
 783             uip_flags 
= UIP_REXMIT
; 
 790             /* In all these states we should retransmit a FINACK. */ 
 791             goto tcp_send_finack
; 
 795       } else if((uip_connr
->tcpstateflags 
& UIP_TS_MASK
) == UIP_ESTABLISHED
) { 
 796         /* If there was no need for a retransmission, we poll the 
 797            application for new data. */ 
 798         uip_len 
= uip_slen 
= 0;             
 799         uip_flags 
= UIP_POLL
; 
 807   if(flag 
== UIP_UDP_TIMER
) { 
 808     if(uip_udp_conn
->lport 
!= 0) { 
 810       uip_sappdata 
= uip_appdata 
= &uip_buf
[UIP_LLH_LEN 
+ UIP_IPUDPH_LEN
]; 
 811       uip_len 
= uip_slen 
= 0; 
 812       uip_flags 
= UIP_POLL
; 
 821   /* This is where the input processing starts. */ 
 822   UIP_STAT(++uip_stat
.ip
.recv
); 
 824   /* Start of IP input header processing code. */ 
 827   /* Check validity of the IP header. */ 
 828   if((BUF
->vtc 
& 0xf0) != 0x60)  { /* IP version and header length. */ 
 829     UIP_STAT(++uip_stat
.ip
.drop
); 
 830     UIP_STAT(++uip_stat
.ip
.vhlerr
); 
 831     UIP_LOG("ipv6: invalid version."); 
 834 #else /* UIP_CONF_IPV6 */ 
 835   /* Check validity of the IP header. */ 
 836   if(BUF
->vhl 
!= 0x45)  { /* IP version and header length. */ 
 837     UIP_STAT(++uip_stat
.ip
.drop
); 
 838     UIP_STAT(++uip_stat
.ip
.vhlerr
); 
 839     UIP_LOG("ip: invalid version or header length."); 
 842 #endif /* UIP_CONF_IPV6 */ 
 844   /* Check the size of the packet. If the size reported to us in 
 845      uip_len is smaller the size reported in the IP header, we assume 
 846      that the packet has been corrupted in transit. If the size of 
 847      uip_len is larger than the size reported in the IP packet header, 
 848      the packet has been padded and we set uip_len to the correct 
 851   if((BUF
->len
[0] << 8) + BUF
->len
[1] <= uip_len
) { 
 852     uip_len 
= (BUF
->len
[0] << 8) + BUF
->len
[1]; 
 854     uip_len 
+= 40; /* The length reported in the IPv6 header is the 
 855                       length of the payload that follows the 
 856                       header. However, uIP uses the uip_len variable 
 857                       for holding the size of the entire packet, 
 858                       including the IP header. For IPv4 this is not a 
 859                       problem as the length field in the IPv4 header 
 860                       contains the length of the entire packet. But 
 861                       for IPv6 we need to add the size of the IPv6 
 862                       header (40 bytes). */ 
 863 #endif /* UIP_CONF_IPV6 */ 
 865     UIP_LOG("ip: packet shorter than reported in IP header."); 
 870   /* Check the fragment flag. */ 
 871   if((BUF
->ipoffset
[0] & 0x3f) != 0 || 
 872      BUF
->ipoffset
[1] != 0) { 
 874     uip_len 
= uip_reass(); 
 878 #else /* UIP_REASSEMBLY */ 
 879     UIP_STAT(++uip_stat
.ip
.drop
); 
 880     UIP_STAT(++uip_stat
.ip
.fragerr
); 
 881     UIP_LOG("ip: fragment dropped."); 
 883 #endif /* UIP_REASSEMBLY */ 
 885 #endif /* UIP_CONF_IPV6 */ 
 887   if(uip_ipaddr_cmp(&uip_hostaddr
, &uip_all_zeroes_addr
)) { 
 888     /* If we are configured to use ping IP address configuration and 
 889        hasn't been assigned an IP address yet, we accept all ICMP 
 891 #if UIP_PINGADDRCONF && !UIP_CONF_IPV6 
 892     if(BUF
->proto 
== UIP_PROTO_ICMP
) { 
 893       UIP_LOG("ip: possible ping config packet received."); 
 896       UIP_LOG("ip: packet dropped since no address assigned."); 
 899 #endif /* UIP_PINGADDRCONF */ 
 902     /* If IP broadcast support is configured, we check for a broadcast 
 903        UDP packet, which may be destined to us. */ 
 905     DEBUG_PRINTF("UDP IP checksum 0x%04x\n", uip_ipchksum()); 
 906     if(BUF
->proto 
== UIP_PROTO_UDP 
&& 
 907        uip_ipaddr_cmp(&BUF
->destipaddr
, &uip_broadcast_addr
) 
 909          uip_ipchksum() == 0xffff*/) { 
 912 #endif /* UIP_BROADCAST */ 
 914     /* Check if the packet is destined for our IP address. */ 
 916     if(!uip_ipaddr_cmp(&BUF
->destipaddr
, &uip_hostaddr
)) { 
 917       UIP_STAT(++uip_stat
.ip
.drop
); 
 920 #else /* UIP_CONF_IPV6 */ 
 921     /* For IPv6, packet reception is a little trickier as we need to 
 922        make sure that we listen to certain multicast addresses (all 
 923        hosts multicast address, and the solicited-node multicast 
 924        address) as well. However, we will cheat here and accept all 
 925        multicast packets that are sent to the ff02::/16 addresses. */ 
 926     if(!uip_ipaddr_cmp(&BUF
->destipaddr
, &uip_hostaddr
) && 
 927        BUF
->destipaddr
.u16
[0] != HTONS(0xff02)) { 
 928       UIP_STAT(++uip_stat
.ip
.drop
); 
 931 #endif /* UIP_CONF_IPV6 */ 
 935   if(uip_ipchksum() != 0xffff) { /* Compute and check the IP header 
 937     UIP_STAT(++uip_stat
.ip
.drop
); 
 938     UIP_STAT(++uip_stat
.ip
.chkerr
); 
 939     UIP_LOG("ip: bad checksum."); 
 942 #endif /* UIP_CONF_IPV6 */ 
 944   if(BUF
->proto 
== UIP_PROTO_TCP
) { /* Check for TCP packet. If so, 
 945                                        proceed with TCP input 
 951   if(BUF
->proto 
== UIP_PROTO_UDP
) { 
 957   /* ICMPv4 processing code follows. */ 
 958   if(BUF
->proto 
!= UIP_PROTO_ICMP
) { /* We only allow ICMP packets from 
 960     UIP_STAT(++uip_stat
.ip
.drop
); 
 961     UIP_STAT(++uip_stat
.ip
.protoerr
); 
 962     UIP_LOG("ip: neither tcp nor icmp."); 
 968 #endif /* UIP_PINGADDRCONF */ 
 969   UIP_STAT(++uip_stat
.icmp
.recv
); 
 971   /* ICMP echo (i.e., ping) processing. This is simple, we only change 
 972      the ICMP type from ECHO to ECHO_REPLY and adjust the ICMP 
 973      checksum before we return the packet. */ 
 974   if(ICMPBUF
->type 
!= ICMP_ECHO
) { 
 975     UIP_STAT(++uip_stat
.icmp
.drop
); 
 976     UIP_STAT(++uip_stat
.icmp
.typeerr
); 
 977     UIP_LOG("icmp: not icmp echo."); 
 981   /* If we are configured to use ping IP address assignment, we use 
 982      the destination IP address of this ping packet and assign it to 
 985   if(uip_ipaddr_cmp(&uip_hostaddr
, &uip_all_zeroes_addr
)) { 
 986     uip_hostaddr 
= BUF
->destipaddr
; 
 988 #endif /* UIP_PINGADDRCONF */ 
 990   ICMPBUF
->type 
= ICMP_ECHO_REPLY
; 
 992   if(ICMPBUF
->icmpchksum 
>= HTONS(0xffff - (ICMP_ECHO 
<< 8))) { 
 993     ICMPBUF
->icmpchksum 
+= HTONS(ICMP_ECHO 
<< 8) + 1; 
 995     ICMPBUF
->icmpchksum 
+= HTONS(ICMP_ECHO 
<< 8); 
 998   /* Swap IP addresses. */ 
 999   uip_ipaddr_copy(&BUF
->destipaddr
, &BUF
->srcipaddr
); 
1000   uip_ipaddr_copy(&BUF
->srcipaddr
, &uip_hostaddr
); 
1002   UIP_STAT(++uip_stat
.icmp
.sent
); 
1006   /* End of IPv4 input header processing code. */ 
1007 #else /* !UIP_CONF_IPV6 */ 
1009   /* This is IPv6 ICMPv6 processing code. */ 
1010   DEBUG_PRINTF("icmp6_input: length %d\n", uip_len
); 
1012   if(BUF
->proto 
!= UIP_PROTO_ICMP6
) { /* We only allow ICMPv6 packets from 
1014     UIP_STAT(++uip_stat
.ip
.drop
); 
1015     UIP_STAT(++uip_stat
.ip
.protoerr
); 
1016     UIP_LOG("ip: neither tcp nor icmp6."); 
1020   UIP_STAT(++uip_stat
.icmp
.recv
); 
1022   /* If we get a neighbor solicitation for our address we should send 
1023      a neighbor advertisement message back. */ 
1024   if(ICMPBUF
->type 
== ICMP6_NEIGHBOR_SOLICITATION
) { 
1025     if(uip_ipaddr_cmp(&ICMPBUF
->icmp6data
, &uip_hostaddr
)) { 
1027       if(ICMPBUF
->options
[0] == ICMP6_OPTION_SOURCE_LINK_ADDRESS
) { 
1028         /* Save the sender's address in our neighbor list. */ 
1029         uip_neighbor_add(&ICMPBUF
->srcipaddr
, &(ICMPBUF
->options
[2])); 
1032       /* We should now send a neighbor advertisement back to where the 
1033          neighbor solicitation came from. */ 
1034       ICMPBUF
->type 
= ICMP6_NEIGHBOR_ADVERTISEMENT
; 
1035       ICMPBUF
->flags 
= ICMP6_FLAG_S
; /* Solicited flag. */ 
1037       ICMPBUF
->reserved1 
= ICMPBUF
->reserved2 
= ICMPBUF
->reserved3 
= 0; 
1039       uip_ipaddr_copy(&ICMPBUF
->destipaddr
, &ICMPBUF
->srcipaddr
); 
1040       uip_ipaddr_copy(&ICMPBUF
->srcipaddr
, &uip_hostaddr
); 
1041       ICMPBUF
->options
[0] = ICMP6_OPTION_TARGET_LINK_ADDRESS
; 
1042       ICMPBUF
->options
[1] = 1;  /* Options length, 1 = 8 bytes. */ 
1043       memcpy(&(ICMPBUF
->options
[2]), &uip_ethaddr
, sizeof(uip_ethaddr
)); 
1044       ICMPBUF
->icmpchksum 
= 0; 
1045       ICMPBUF
->icmpchksum 
= ~uip_icmp6chksum(); 
1051   } else if(ICMPBUF
->type 
== ICMP6_ECHO
) { 
1052     /* ICMP echo (i.e., ping) processing. This is simple, we only 
1053        change the ICMP type from ECHO to ECHO_REPLY and update the 
1054        ICMP checksum before we return the packet. */ 
1056     ICMPBUF
->type 
= ICMP6_ECHO_REPLY
; 
1058     uip_ipaddr_copy(&BUF
->destipaddr
, &BUF
->srcipaddr
); 
1059     uip_ipaddr_copy(&BUF
->srcipaddr
, &uip_hostaddr
); 
1060     ICMPBUF
->icmpchksum 
= 0; 
1061     ICMPBUF
->icmpchksum 
= ~uip_icmp6chksum(); 
1063     UIP_STAT(++uip_stat
.icmp
.sent
); 
1066     DEBUG_PRINTF("Unknown icmp6 message type %d\n", ICMPBUF
->type
); 
1067     UIP_STAT(++uip_stat
.icmp
.drop
); 
1068     UIP_STAT(++uip_stat
.icmp
.typeerr
); 
1069     UIP_LOG("icmp: unknown ICMP message."); 
1073   /* End of IPv6 ICMP processing. */ 
1075 #endif /* !UIP_CONF_IPV6 */ 
1078   /* UDP input processing. */ 
1080   /* UDP processing is really just a hack. We don't do anything to the 
1081      UDP/IP headers, but let the UDP application do all the hard 
1082      work. If the application sets uip_slen, it has a packet to 
1084 #if UIP_UDP_CHECKSUMS 
1085   uip_len 
= uip_len 
- UIP_IPUDPH_LEN
; 
1086   uip_appdata 
= &uip_buf
[UIP_LLH_LEN 
+ UIP_IPUDPH_LEN
]; 
1087   if(UDPBUF
->udpchksum 
!= 0 && uip_udpchksum() != 0xffff) { 
1088     UIP_STAT(++uip_stat
.udp
.drop
); 
1089     UIP_STAT(++uip_stat
.udp
.chkerr
); 
1090     UIP_LOG("udp: bad checksum."); 
1093 #else /* UIP_UDP_CHECKSUMS */ 
1094   uip_len 
= uip_len 
- UIP_IPUDPH_LEN
; 
1095 #endif /* UIP_UDP_CHECKSUMS */ 
1097   /* Demultiplex this UDP packet between the UDP "connections". */ 
1098   for(uip_udp_conn 
= &uip_udp_conns
[0]; 
1099       uip_udp_conn 
< &uip_udp_conns
[UIP_UDP_CONNS
]; 
1101     /* If the local UDP port is non-zero, the connection is considered 
1102        to be used. If so, the local port number is checked against the 
1103        destination port number in the received packet. If the two port 
1104        numbers match, the remote port number is checked if the 
1105        connection is bound to a remote port. Finally, if the 
1106        connection is bound to a remote IP address, the source IP 
1107        address of the packet is checked. */ 
1108     if(uip_udp_conn
->lport 
!= 0 && 
1109        UDPBUF
->destport 
== uip_udp_conn
->lport 
&& 
1110        (uip_udp_conn
->rport 
== 0 || 
1111         UDPBUF
->srcport 
== uip_udp_conn
->rport
) && 
1112        (uip_ipaddr_cmp(&uip_udp_conn
->ripaddr
, &uip_all_zeroes_addr
) || 
1113         uip_ipaddr_cmp(&uip_udp_conn
->ripaddr
, &uip_broadcast_addr
) || 
1114         uip_ipaddr_cmp(&BUF
->srcipaddr
, &uip_udp_conn
->ripaddr
))) { 
1118   UIP_LOG("udp: no matching connection found"); 
1119 #if UIP_CONF_ICMP_DEST_UNREACH && !UIP_CONF_IPV6 
1120   /* Copy fields from packet header into payload of this ICMP packet. */ 
1121   memcpy(&(ICMPBUF
->payload
[0]), ICMPBUF
, UIP_IPH_LEN 
+ 8); 
1123   /* Set the ICMP type and code. */ 
1124   ICMPBUF
->type 
= ICMP_DEST_UNREACHABLE
; 
1125   ICMPBUF
->icode 
= ICMP_PORT_UNREACHABLE
; 
1127   /* Calculate the ICMP checksum. */ 
1128   ICMPBUF
->icmpchksum 
= 0; 
1129   ICMPBUF
->icmpchksum 
= ~uip_chksum((u16_t 
*)&(ICMPBUF
->type
), 36); 
1131   /* Set the IP destination address to be the source address of the 
1133   uip_ipaddr_copy(&BUF
->destipaddr
, &BUF
->srcipaddr
); 
1135   /* Set our IP address as the source address. */ 
1136   uip_ipaddr_copy(&BUF
->srcipaddr
, &uip_hostaddr
); 
1138   /* The size of the ICMP destination unreachable packet is 36 + the 
1139      size of the IP header (20) = 56. */ 
1140   uip_len 
= 36 + UIP_IPH_LEN
; 
1141   ICMPBUF
->len
[0] = 0; 
1142   ICMPBUF
->len
[1] = (u8_t
)uip_len
; 
1143   ICMPBUF
->ttl 
= UIP_TTL
; 
1144   ICMPBUF
->proto 
= UIP_PROTO_ICMP
; 
1147 #else /* UIP_CONF_ICMP_DEST_UNREACH */ 
1149 #endif /* UIP_CONF_ICMP_DEST_UNREACH */ 
1153   uip_flags 
= UIP_NEWDATA
; 
1154   uip_sappdata 
= uip_appdata 
= &uip_buf
[UIP_LLH_LEN 
+ UIP_IPUDPH_LEN
]; 
1162   uip_len 
= uip_slen 
+ UIP_IPUDPH_LEN
; 
1165   /* For IPv6, the IP length field does not include the IPv6 IP header 
1167   BUF
->len
[0] = ((uip_len 
- UIP_IPH_LEN
) >> 8); 
1168   BUF
->len
[1] = ((uip_len 
- UIP_IPH_LEN
) & 0xff); 
1169 #else /* UIP_CONF_IPV6 */ 
1170   BUF
->len
[0] = (uip_len 
>> 8); 
1171   BUF
->len
[1] = (uip_len 
& 0xff); 
1172 #endif /* UIP_CONF_IPV6 */ 
1174   BUF
->ttl 
= uip_udp_conn
->ttl
; 
1175   BUF
->proto 
= UIP_PROTO_UDP
; 
1177   UDPBUF
->udplen 
= HTONS(uip_slen 
+ UIP_UDPH_LEN
); 
1178   UDPBUF
->udpchksum 
= 0; 
1180   BUF
->srcport  
= uip_udp_conn
->lport
; 
1181   BUF
->destport 
= uip_udp_conn
->rport
; 
1183   uip_ipaddr_copy(&BUF
->srcipaddr
, &uip_hostaddr
); 
1184   uip_ipaddr_copy(&BUF
->destipaddr
, &uip_udp_conn
->ripaddr
); 
1186   uip_appdata 
= &uip_buf
[UIP_LLH_LEN 
+ UIP_IPTCPH_LEN
]; 
1188 #if UIP_UDP_CHECKSUMS 
1189   /* Calculate UDP checksum. */ 
1190   UDPBUF
->udpchksum 
= ~(uip_udpchksum()); 
1191   if(UDPBUF
->udpchksum 
== 0) { 
1192     UDPBUF
->udpchksum 
= 0xffff; 
1194 #endif /* UIP_UDP_CHECKSUMS */ 
1197 #endif /* UIP_UDP */ 
1199   /* TCP input processing. */ 
1201   UIP_STAT(++uip_stat
.tcp
.recv
); 
1203   /* Start of TCP input header processing code. */ 
1205   if(uip_tcpchksum() != 0xffff) {   /* Compute and check the TCP 
1207     UIP_STAT(++uip_stat
.tcp
.drop
); 
1208     UIP_STAT(++uip_stat
.tcp
.chkerr
); 
1209     UIP_LOG("tcp: bad checksum."); 
1213   /* Demultiplex this segment. */ 
1214   /* First check any active connections. */ 
1215   for(uip_connr 
= &uip_conns
[0]; uip_connr 
<= &uip_conns
[UIP_CONNS 
- 1]; 
1217     if(uip_connr
->tcpstateflags 
!= UIP_CLOSED 
&& 
1218        BUF
->destport 
== uip_connr
->lport 
&& 
1219        BUF
->srcport 
== uip_connr
->rport 
&& 
1220        uip_ipaddr_cmp(&BUF
->srcipaddr
, &uip_connr
->ripaddr
)) { 
1225   /* If we didn't find and active connection that expected the packet, 
1226      either this packet is an old duplicate, or this is a SYN packet 
1227      destined for a connection in LISTEN. If the SYN flag isn't set, 
1228      it is an old packet and we send a RST. */ 
1229   if((BUF
->flags 
& TCP_CTL
) != TCP_SYN
) { 
1233   tmp16 
= BUF
->destport
; 
1234   /* Next, check listening connections. */ 
1235   for(c 
= 0; c 
< UIP_LISTENPORTS
; ++c
) { 
1236     if(tmp16 
== uip_listenports
[c
]) { 
1241   /* No matching connection found, so we send a RST packet. */ 
1242   UIP_STAT(++uip_stat
.tcp
.synrst
); 
1245   /* We do not send resets in response to resets. */ 
1246   if(BUF
->flags 
& TCP_RST
) { 
1250   UIP_STAT(++uip_stat
.tcp
.rst
); 
1252   BUF
->flags 
= TCP_RST 
| TCP_ACK
; 
1253   uip_len 
= UIP_IPTCPH_LEN
; 
1254   BUF
->tcpoffset 
= 5 << 4; 
1256   /* Flip the seqno and ackno fields in the TCP header. */ 
1258   BUF
->seqno
[3] = BUF
->ackno
[3]; 
1262   BUF
->seqno
[2] = BUF
->ackno
[2]; 
1266   BUF
->seqno
[1] = BUF
->ackno
[1]; 
1270   BUF
->seqno
[0] = BUF
->ackno
[0]; 
1273   /* We also have to increase the sequence number we are 
1274      acknowledging. If the least significant byte overflowed, we need 
1275      to propagate the carry to the other bytes as well. */ 
1276   if(++BUF
->ackno
[3] == 0) { 
1277     if(++BUF
->ackno
[2] == 0) { 
1278       if(++BUF
->ackno
[1] == 0) { 
1284   /* Swap port numbers. */ 
1285   tmp16 
= BUF
->srcport
; 
1286   BUF
->srcport 
= BUF
->destport
; 
1287   BUF
->destport 
= tmp16
; 
1289   /* Swap IP addresses. */ 
1290   uip_ipaddr_copy(&BUF
->destipaddr
, &BUF
->srcipaddr
); 
1291   uip_ipaddr_copy(&BUF
->srcipaddr
, &uip_hostaddr
); 
1293   /* And send out the RST packet! */ 
1294   goto tcp_send_noconn
; 
1296   /* This label will be jumped to if we matched the incoming packet 
1297      with a connection in LISTEN. In that case, we should create a new 
1298      connection and send a SYNACK in return. */ 
1300   /* First we check if there are any connections available. Unused 
1301      connections are kept in the same table as used connections, but 
1302      unused ones have the tcpstate set to CLOSED. Also, connections in 
1303      TIME_WAIT are kept track of and we'll use the oldest one if no 
1304      CLOSED connections are found. Thanks to Eddie C. Dost for a very 
1305      nice algorithm for the TIME_WAIT search. */ 
1307   for(c 
= 0; c 
< UIP_CONNS
; ++c
) { 
1308     if(uip_conns
[c
].tcpstateflags 
== UIP_CLOSED
) { 
1309       uip_connr 
= &uip_conns
[c
]; 
1312     if(uip_conns
[c
].tcpstateflags 
== UIP_TIME_WAIT
) { 
1313       if(uip_connr 
== 0 || 
1314          uip_conns
[c
].timer 
> uip_connr
->timer
) { 
1315         uip_connr 
= &uip_conns
[c
]; 
1320   if(uip_connr 
== 0) { 
1321     /* All connections are used already, we drop packet and hope that 
1322        the remote end will retransmit the packet at a time when we 
1323        have more spare connections. */ 
1324     UIP_STAT(++uip_stat
.tcp
.syndrop
); 
1325     UIP_LOG("tcp: found no unused connections."); 
1328   uip_conn 
= uip_connr
; 
1330   /* Fill in the necessary fields for the new connection. */ 
1331   uip_connr
->rto 
= uip_connr
->timer 
= UIP_RTO
; 
1334   uip_connr
->nrtx 
= 0; 
1335   uip_connr
->lport 
= BUF
->destport
; 
1336   uip_connr
->rport 
= BUF
->srcport
; 
1337   uip_ipaddr_copy(&uip_connr
->ripaddr
, &BUF
->srcipaddr
); 
1338   uip_connr
->tcpstateflags 
= UIP_SYN_RCVD
; 
1340   uip_connr
->snd_nxt
[0] = iss
[0]; 
1341   uip_connr
->snd_nxt
[1] = iss
[1]; 
1342   uip_connr
->snd_nxt
[2] = iss
[2]; 
1343   uip_connr
->snd_nxt
[3] = iss
[3]; 
1346   /* rcv_nxt should be the seqno from the incoming packet + 1. */ 
1347   uip_connr
->rcv_nxt
[3] = BUF
->seqno
[3]; 
1348   uip_connr
->rcv_nxt
[2] = BUF
->seqno
[2]; 
1349   uip_connr
->rcv_nxt
[1] = BUF
->seqno
[1]; 
1350   uip_connr
->rcv_nxt
[0] = BUF
->seqno
[0]; 
1353   /* Parse the TCP MSS option, if present. */ 
1354   if((BUF
->tcpoffset 
& 0xf0) > 0x50) { 
1355     for(c 
= 0; c 
< ((BUF
->tcpoffset 
>> 4) - 5) << 2 ;) { 
1356       opt 
= uip_buf
[UIP_TCPIP_HLEN 
+ UIP_LLH_LEN 
+ c
]; 
1357       if(opt 
== TCP_OPT_END
) { 
1358         /* End of options. */ 
1360       } else if(opt 
== TCP_OPT_NOOP
) { 
1363       } else if(opt 
== TCP_OPT_MSS 
&& 
1364                 uip_buf
[UIP_TCPIP_HLEN 
+ UIP_LLH_LEN 
+ 1 + c
] == TCP_OPT_MSS_LEN
) { 
1365         /* An MSS option with the right option length. */ 
1366         tmp16 
= ((u16_t
)uip_buf
[UIP_TCPIP_HLEN 
+ UIP_LLH_LEN 
+ 2 + c
] << 8) | 
1367           (u16_t
)uip_buf
[UIP_IPTCPH_LEN 
+ UIP_LLH_LEN 
+ 3 + c
]; 
1368         uip_connr
->initialmss 
= uip_connr
->mss 
= 
1369           tmp16 
> UIP_TCP_MSS? UIP_TCP_MSS
: tmp16
; 
1371         /* And we are done processing options. */ 
1374         /* All other options have a length field, so that we easily 
1375            can skip past them. */ 
1376         if(uip_buf
[UIP_TCPIP_HLEN 
+ UIP_LLH_LEN 
+ 1 + c
] == 0) { 
1377           /* If the length field is zero, the options are malformed 
1378              and we don't process them further. */ 
1381         c 
+= uip_buf
[UIP_TCPIP_HLEN 
+ UIP_LLH_LEN 
+ 1 + c
]; 
1386   /* Our response will be a SYNACK. */ 
1389   BUF
->flags 
= TCP_ACK
; 
1392   BUF
->flags 
|= TCP_SYN
; 
1393 #else /* UIP_ACTIVE_OPEN */ 
1395   BUF
->flags 
= TCP_SYN 
| TCP_ACK
; 
1396 #endif /* UIP_ACTIVE_OPEN */ 
1398   /* We send out the TCP Maximum Segment Size option with our 
1400   BUF
->optdata
[0] = TCP_OPT_MSS
; 
1401   BUF
->optdata
[1] = TCP_OPT_MSS_LEN
; 
1402   BUF
->optdata
[2] = (UIP_TCP_MSS
) / 256; 
1403   BUF
->optdata
[3] = (UIP_TCP_MSS
) & 255; 
1404   uip_len 
= UIP_IPTCPH_LEN 
+ TCP_OPT_MSS_LEN
; 
1405   BUF
->tcpoffset 
= ((UIP_TCPH_LEN 
+ TCP_OPT_MSS_LEN
) / 4) << 4; 
1408   /* This label will be jumped to if we found an active connection. */ 
1410   uip_conn 
= uip_connr
; 
1412   /* We do a very naive form of TCP reset processing; we just accept 
1413      any RST and kill our connection. We should in fact check if the 
1414      sequence number of this reset is within our advertised window 
1415      before we accept the reset. */ 
1416   if(BUF
->flags 
& TCP_RST
) { 
1417     uip_connr
->tcpstateflags 
= UIP_CLOSED
; 
1418     UIP_LOG("tcp: got reset, aborting connection."); 
1419     uip_flags 
= UIP_ABORT
; 
1423   /* Calculate the length of the data, if the application has sent 
1425   c 
= (BUF
->tcpoffset 
>> 4) << 2; 
1426   /* uip_len will contain the length of the actual TCP data. This is 
1427      calculated by subtracing the length of the TCP header (in 
1428      c) and the length of the IP header (20 bytes). */ 
1429   uip_len 
= uip_len 
- c 
- UIP_IPH_LEN
; 
1431   /* First, check if the sequence number of the incoming packet is 
1432      what we're expecting next. If not, we send out an ACK with the 
1433      correct numbers in. */ 
1434   if(!(((uip_connr
->tcpstateflags 
& UIP_TS_MASK
) == UIP_SYN_SENT
) && 
1435        ((BUF
->flags 
& TCP_CTL
) == (TCP_SYN 
| TCP_ACK
)))) { 
1436     if((uip_len 
> 0 || ((BUF
->flags 
& (TCP_SYN 
| TCP_FIN
)) != 0)) && 
1437        (BUF
->seqno
[0] != uip_connr
->rcv_nxt
[0] || 
1438         BUF
->seqno
[1] != uip_connr
->rcv_nxt
[1] || 
1439         BUF
->seqno
[2] != uip_connr
->rcv_nxt
[2] || 
1440         BUF
->seqno
[3] != uip_connr
->rcv_nxt
[3])) { 
1445   /* Next, check if the incoming segment acknowledges any outstanding 
1446      data. If so, we update the sequence number, reset the length of 
1447      the outstanding data, calculate RTT estimations, and reset the 
1448      retransmission timer. */ 
1449   if((BUF
->flags 
& TCP_ACK
) && uip_outstanding(uip_connr
)) { 
1450     uip_add32(uip_connr
->snd_nxt
, uip_connr
->len
); 
1452     if(BUF
->ackno
[0] == uip_acc32
[0] && 
1453        BUF
->ackno
[1] == uip_acc32
[1] && 
1454        BUF
->ackno
[2] == uip_acc32
[2] && 
1455        BUF
->ackno
[3] == uip_acc32
[3]) { 
1456       /* Update sequence number. */ 
1457       uip_connr
->snd_nxt
[0] = uip_acc32
[0]; 
1458       uip_connr
->snd_nxt
[1] = uip_acc32
[1]; 
1459       uip_connr
->snd_nxt
[2] = uip_acc32
[2]; 
1460       uip_connr
->snd_nxt
[3] = uip_acc32
[3]; 
1462       /* Do RTT estimation, unless we have done retransmissions. */ 
1463       if(uip_connr
->nrtx 
== 0) { 
1465         m 
= uip_connr
->rto 
- uip_connr
->timer
; 
1466         /* This is taken directly from VJs original code in his paper */ 
1467         m 
= m 
- (uip_connr
->sa 
>> 3); 
1472         m 
= m 
- (uip_connr
->sv 
>> 2); 
1474         uip_connr
->rto 
= (uip_connr
->sa 
>> 3) + uip_connr
->sv
; 
1477       /* Set the acknowledged flag. */ 
1478       uip_flags 
= UIP_ACKDATA
; 
1479       /* Reset the retransmission timer. */ 
1480       uip_connr
->timer 
= uip_connr
->rto
; 
1482       /* Reset length of outstanding data. */ 
1488   /* Do different things depending on in what state the connection is. */ 
1489   switch(uip_connr
->tcpstateflags 
& UIP_TS_MASK
) { 
1490     /* CLOSED and LISTEN are not handled here. CLOSE_WAIT is not 
1491         implemented, since we force the application to close when the 
1492         peer sends a FIN (hence the application goes directly from 
1493         ESTABLISHED to LAST_ACK). */ 
1495     /* In SYN_RCVD we have sent out a SYNACK in response to a SYN, and 
1496        we are waiting for an ACK that acknowledges the data we sent 
1497        out the last time. Therefore, we want to have the UIP_ACKDATA 
1498        flag set. If so, we enter the ESTABLISHED state. */ 
1499     if(uip_flags 
& UIP_ACKDATA
) { 
1500       uip_connr
->tcpstateflags 
= UIP_ESTABLISHED
; 
1501       uip_flags 
= UIP_CONNECTED
; 
1504         uip_flags 
|= UIP_NEWDATA
; 
1505         uip_add_rcv_nxt(uip_len
); 
1514     /* In SYN_SENT, we wait for a SYNACK that is sent in response to 
1515        our SYN. The rcv_nxt is set to sequence number in the SYNACK 
1516        plus one, and we send an ACK. We move into the ESTABLISHED 
1518     if((uip_flags 
& UIP_ACKDATA
) && 
1519        (BUF
->flags 
& TCP_CTL
) == (TCP_SYN 
| TCP_ACK
)) { 
1521       /* Parse the TCP MSS option, if present. */ 
1522       if((BUF
->tcpoffset 
& 0xf0) > 0x50) { 
1523         for(c 
= 0; c 
< ((BUF
->tcpoffset 
>> 4) - 5) << 2 ;) { 
1524           opt 
= uip_buf
[UIP_IPTCPH_LEN 
+ UIP_LLH_LEN 
+ c
]; 
1525           if(opt 
== TCP_OPT_END
) { 
1526             /* End of options. */ 
1528           } else if(opt 
== TCP_OPT_NOOP
) { 
1531           } else if(opt 
== TCP_OPT_MSS 
&& 
1532                     uip_buf
[UIP_TCPIP_HLEN 
+ UIP_LLH_LEN 
+ 1 + c
] == TCP_OPT_MSS_LEN
) { 
1533             /* An MSS option with the right option length. */ 
1534             tmp16 
= (uip_buf
[UIP_TCPIP_HLEN 
+ UIP_LLH_LEN 
+ 2 + c
] << 8) | 
1535               uip_buf
[UIP_TCPIP_HLEN 
+ UIP_LLH_LEN 
+ 3 + c
]; 
1536             uip_connr
->initialmss 
= 
1537               uip_connr
->mss 
= tmp16 
> UIP_TCP_MSS? UIP_TCP_MSS
: tmp16
; 
1539             /* And we are done processing options. */ 
1542             /* All other options have a length field, so that we easily 
1543                can skip past them. */ 
1544             if(uip_buf
[UIP_TCPIP_HLEN 
+ UIP_LLH_LEN 
+ 1 + c
] == 0) { 
1545               /* If the length field is zero, the options are malformed 
1546                  and we don't process them further. */ 
1549             c 
+= uip_buf
[UIP_TCPIP_HLEN 
+ UIP_LLH_LEN 
+ 1 + c
]; 
1553       uip_connr
->tcpstateflags 
= UIP_ESTABLISHED
; 
1554       uip_connr
->rcv_nxt
[0] = BUF
->seqno
[0]; 
1555       uip_connr
->rcv_nxt
[1] = BUF
->seqno
[1]; 
1556       uip_connr
->rcv_nxt
[2] = BUF
->seqno
[2]; 
1557       uip_connr
->rcv_nxt
[3] = BUF
->seqno
[3]; 
1559       uip_flags 
= UIP_CONNECTED 
| UIP_NEWDATA
; 
1566     /* Inform the application that the connection failed */ 
1567     uip_flags 
= UIP_ABORT
; 
1569     /* The connection is closed after we send the RST */ 
1570     uip_conn
->tcpstateflags 
= UIP_CLOSED
; 
1572 #endif /* UIP_ACTIVE_OPEN */ 
1574   case UIP_ESTABLISHED
: 
1575     /* In the ESTABLISHED state, we call upon the application to feed 
1576     data into the uip_buf. If the UIP_ACKDATA flag is set, the 
1577     application should put new data into the buffer, otherwise we are 
1578     retransmitting an old segment, and the application should put that 
1579     data into the buffer. 
1581     If the incoming packet is a FIN, we should close the connection on 
1582     this side as well, and we send out a FIN and enter the LAST_ACK 
1583     state. We require that there is no outstanding data; otherwise the 
1584     sequence numbers will be screwed up. */ 
1586     if(BUF
->flags 
& TCP_FIN 
&& !(uip_connr
->tcpstateflags 
& UIP_STOPPED
)) { 
1587       if(uip_outstanding(uip_connr
)) { 
1590       uip_add_rcv_nxt(1 + uip_len
); 
1591       uip_flags 
|= UIP_CLOSE
; 
1593         uip_flags 
|= UIP_NEWDATA
; 
1597       uip_connr
->tcpstateflags 
= UIP_LAST_ACK
; 
1598       uip_connr
->nrtx 
= 0; 
1600       BUF
->flags 
= TCP_FIN 
| TCP_ACK
; 
1601       goto tcp_send_nodata
; 
1604     /* Check the URG flag. If this is set, the segment carries urgent 
1605        data that we must pass to the application. */ 
1606     if((BUF
->flags 
& TCP_URG
) != 0) { 
1608       uip_urglen 
= (BUF
->urgp
[0] << 8) | BUF
->urgp
[1]; 
1609       if(uip_urglen 
> uip_len
) { 
1610         /* There is more urgent data in the next segment to come. */ 
1611         uip_urglen 
= uip_len
; 
1613       uip_add_rcv_nxt(uip_urglen
); 
1614       uip_len 
-= uip_urglen
; 
1615       uip_urgdata 
= uip_appdata
; 
1616       uip_appdata 
+= uip_urglen
; 
1619 #else /* UIP_URGDATA > 0 */ 
1620       uip_appdata 
= ((char *)uip_appdata
) + ((BUF
->urgp
[0] << 8) | BUF
->urgp
[1]); 
1621       uip_len 
-= (BUF
->urgp
[0] << 8) | BUF
->urgp
[1]; 
1622 #endif /* UIP_URGDATA > 0 */ 
1625     /* If uip_len > 0 we have TCP data in the packet, and we flag this 
1626        by setting the UIP_NEWDATA flag and update the sequence number 
1627        we acknowledge. If the application has stopped the dataflow 
1628        using uip_stop(), we must not accept any data packets from the 
1630     if(uip_len 
> 0 && !(uip_connr
->tcpstateflags 
& UIP_STOPPED
)) { 
1631       uip_flags 
|= UIP_NEWDATA
; 
1632       uip_add_rcv_nxt(uip_len
); 
1635     /* Check if the available buffer space advertised by the other end 
1636        is smaller than the initial MSS for this connection. If so, we 
1637        set the current MSS to the window size to ensure that the 
1638        application does not send more data than the other end can 
1641        If the remote host advertises a zero window, we set the MSS to 
1642        the initial MSS so that the application will send an entire MSS 
1643        of data. This data will not be acknowledged by the receiver, 
1644        and the application will retransmit it. This is called the 
1645        "persistent timer" and uses the retransmission mechanism. 
1647     tmp16 
= ((u16_t
)BUF
->wnd
[0] << 8) + (u16_t
)BUF
->wnd
[1]; 
1648     if(tmp16 
> uip_connr
->initialmss 
|| 
1650       tmp16 
= uip_connr
->initialmss
; 
1652     uip_connr
->mss 
= tmp16
; 
1654     /* If this packet constitutes an ACK for outstanding data (flagged 
1655        by the UIP_ACKDATA flag, we should call the application since it 
1656        might want to send more data. If the incoming packet had data 
1657        from the peer (as flagged by the UIP_NEWDATA flag), the 
1658        application must also be notified. 
1660        When the application is called, the global variable uip_len 
1661        contains the length of the incoming data. The application can 
1662        access the incoming data through the global pointer 
1663        uip_appdata, which usually points UIP_IPTCPH_LEN + UIP_LLH_LEN 
1664        bytes into the uip_buf array. 
1666        If the application wishes to send any data, this data should be 
1667        put into the uip_appdata and the length of the data should be 
1668        put into uip_len. If the application don't have any data to 
1669        send, uip_len must be set to 0. */ 
1670     if(uip_flags 
& (UIP_NEWDATA 
| UIP_ACKDATA
)) { 
1676       if(uip_flags 
& UIP_ABORT
) { 
1678         uip_connr
->tcpstateflags 
= UIP_CLOSED
; 
1679         BUF
->flags 
= TCP_RST 
| TCP_ACK
; 
1680         goto tcp_send_nodata
; 
1683       if(uip_flags 
& UIP_CLOSE
) { 
1686         uip_connr
->tcpstateflags 
= UIP_FIN_WAIT_1
; 
1687         uip_connr
->nrtx 
= 0; 
1688         BUF
->flags 
= TCP_FIN 
| TCP_ACK
; 
1689         goto tcp_send_nodata
; 
1692       /* If uip_slen > 0, the application has data to be sent. */ 
1695         /* If the connection has acknowledged data, the contents of 
1696            the ->len variable should be discarded. */ 
1697         if((uip_flags 
& UIP_ACKDATA
) != 0) { 
1701         /* If the ->len variable is non-zero the connection has 
1702            already data in transit and cannot send anymore right 
1704         if(uip_connr
->len 
== 0) { 
1706           /* The application cannot send more than what is allowed by 
1707              the mss (the minumum of the MSS and the available 
1709           if(uip_slen 
> uip_connr
->mss
) { 
1710             uip_slen 
= uip_connr
->mss
; 
1713           /* Remember how much data we send out now so that we know 
1714              when everything has been acknowledged. */ 
1715           uip_connr
->len 
= uip_slen
; 
1718           /* If the application already had unacknowledged data, we 
1719              make sure that the application does not send (i.e., 
1720              retransmit) out more than it previously sent out. */ 
1721           uip_slen 
= uip_connr
->len
; 
1724       uip_connr
->nrtx 
= 0; 
1726       uip_appdata 
= uip_sappdata
; 
1728       /* If the application has data to be sent, or if the incoming 
1729          packet had new data in it, we must send out a packet. */ 
1730       if(uip_slen 
> 0 && uip_connr
->len 
> 0) { 
1731         /* Add the length of the IP and TCP headers. */ 
1732         uip_len 
= uip_connr
->len 
+ UIP_TCPIP_HLEN
; 
1733         /* We always set the ACK flag in response packets. */ 
1734         BUF
->flags 
= TCP_ACK 
| TCP_PSH
; 
1735         /* Send the packet. */ 
1736         goto tcp_send_noopts
; 
1738       /* If there is no data to send, just send out a pure ACK if 
1739          there is newdata. */ 
1740       if(uip_flags 
& UIP_NEWDATA
) { 
1741         uip_len 
= UIP_TCPIP_HLEN
; 
1742         BUF
->flags 
= TCP_ACK
; 
1743         goto tcp_send_noopts
; 
1748     /* We can close this connection if the peer has acknowledged our 
1749        FIN. This is indicated by the UIP_ACKDATA flag. */ 
1750     if(uip_flags 
& UIP_ACKDATA
) { 
1751       uip_connr
->tcpstateflags 
= UIP_CLOSED
; 
1752       uip_flags 
= UIP_CLOSE
; 
1757   case UIP_FIN_WAIT_1
: 
1758     /* The application has closed the connection, but the remote host 
1759        hasn't closed its end yet. Thus we do nothing but wait for a 
1760        FIN from the other side. */ 
1762       uip_add_rcv_nxt(uip_len
); 
1764     if(BUF
->flags 
& TCP_FIN
) { 
1765       if(uip_flags 
& UIP_ACKDATA
) { 
1766         uip_connr
->tcpstateflags 
= UIP_TIME_WAIT
; 
1767         uip_connr
->timer 
= 0; 
1770         uip_connr
->tcpstateflags 
= UIP_CLOSING
; 
1773       uip_flags 
= UIP_CLOSE
; 
1776     } else if(uip_flags 
& UIP_ACKDATA
) { 
1777       uip_connr
->tcpstateflags 
= UIP_FIN_WAIT_2
; 
1786   case UIP_FIN_WAIT_2
: 
1788       uip_add_rcv_nxt(uip_len
); 
1790     if(BUF
->flags 
& TCP_FIN
) { 
1791       uip_connr
->tcpstateflags 
= UIP_TIME_WAIT
; 
1792       uip_connr
->timer 
= 0; 
1794       uip_flags 
= UIP_CLOSE
; 
1807     if(uip_flags 
& UIP_ACKDATA
) { 
1808       uip_connr
->tcpstateflags 
= UIP_TIME_WAIT
; 
1809       uip_connr
->timer 
= 0; 
1814   /* We jump here when we are ready to send the packet, and just want 
1815      to set the appropriate TCP sequence numbers in the TCP header. */ 
1817   BUF
->flags 
= TCP_ACK
; 
1820   uip_len 
= UIP_IPTCPH_LEN
; 
1823   BUF
->tcpoffset 
= (UIP_TCPH_LEN 
/ 4) << 4; 
1825   /* We're done with the input processing. We are now ready to send a 
1826      reply. Our job is to fill in all the fields of the TCP and IP 
1827      headers before calculating the checksum and finally send the 
1830   BUF
->ackno
[0] = uip_connr
->rcv_nxt
[0]; 
1831   BUF
->ackno
[1] = uip_connr
->rcv_nxt
[1]; 
1832   BUF
->ackno
[2] = uip_connr
->rcv_nxt
[2]; 
1833   BUF
->ackno
[3] = uip_connr
->rcv_nxt
[3]; 
1835   BUF
->seqno
[0] = uip_connr
->snd_nxt
[0]; 
1836   BUF
->seqno
[1] = uip_connr
->snd_nxt
[1]; 
1837   BUF
->seqno
[2] = uip_connr
->snd_nxt
[2]; 
1838   BUF
->seqno
[3] = uip_connr
->snd_nxt
[3]; 
1840   BUF
->proto 
= UIP_PROTO_TCP
; 
1842   BUF
->srcport  
= uip_connr
->lport
; 
1843   BUF
->destport 
= uip_connr
->rport
; 
1845   uip_ipaddr_copy(&BUF
->srcipaddr
, &uip_hostaddr
); 
1846   uip_ipaddr_copy(&BUF
->destipaddr
, &uip_connr
->ripaddr
); 
1848   if(uip_connr
->tcpstateflags 
& UIP_STOPPED
) { 
1849     /* If the connection has issued uip_stop(), we advertise a zero 
1850        window so that the remote host will stop sending data. */ 
1851     BUF
->wnd
[0] = BUF
->wnd
[1] = 0; 
1853     BUF
->wnd
[0] = ((UIP_RECEIVE_WINDOW
) >> 8); 
1854     BUF
->wnd
[1] = ((UIP_RECEIVE_WINDOW
) & 0xff); 
1860   /* For IPv6, the IP length field does not include the IPv6 IP header 
1862   BUF
->len
[0] = ((uip_len 
- UIP_IPH_LEN
) >> 8); 
1863   BUF
->len
[1] = ((uip_len 
- UIP_IPH_LEN
) & 0xff); 
1864 #else /* UIP_CONF_IPV6 */ 
1865   BUF
->len
[0] = (uip_len 
>> 8); 
1866   BUF
->len
[1] = (uip_len 
& 0xff); 
1867 #endif /* UIP_CONF_IPV6 */ 
1869   BUF
->urgp
[0] = BUF
->urgp
[1] = 0; 
1871   /* Calculate TCP checksum. */ 
1873   BUF
->tcpchksum 
= ~(uip_tcpchksum()); 
1880 #else /* UIP_CONF_IPV6 */ 
1883   BUF
->ipoffset
[0] = BUF
->ipoffset
[1] = 0; 
1885   BUF
->ipid
[0] = ipid 
>> 8; 
1886   BUF
->ipid
[1] = ipid 
& 0xff; 
1887   /* Calculate IP checksum. */ 
1889   BUF
->ipchksum 
= ~(uip_ipchksum()); 
1890   DEBUG_PRINTF("uip ip_send_nolen: chkecum 0x%04x\n", uip_ipchksum()); 
1891 #endif /* UIP_CONF_IPV6 */    
1892   UIP_STAT(++uip_stat
.tcp
.sent
); 
1895 #endif /* UIP_CONF_IPV6 */ 
1896   DEBUG_PRINTF("Sending packet with length %d (%d)\n", uip_len
, 
1897                (BUF
->len
[0] << 8) | BUF
->len
[1]); 
1899   UIP_STAT(++uip_stat
.ip
.sent
); 
1900   /* Return and let the caller do the actual transmission. */ 
1909 /*---------------------------------------------------------------------------*/ 
1921 /*---------------------------------------------------------------------------*/ 
1923 uip_send(const void *data
, int len
) 
1926 #define MIN(a,b) ((a) < (b)? (a): (b)) 
1927   copylen 
= MIN(len
, UIP_BUFSIZE 
- UIP_LLH_LEN 
- UIP_TCPIP_HLEN 
- 
1928                 (int)((char *)uip_sappdata 
- (char *)&uip_buf
[UIP_LLH_LEN 
+ UIP_TCPIP_HLEN
])); 
1931     if(data 
!= uip_sappdata
) { 
1932       memcpy(uip_sappdata
, (data
), uip_slen
); 
1936 /*---------------------------------------------------------------------------*/ 
1938 #endif /* UIP_CONF_IPV6 */