76 #include "net/ipv6/uip-nd6.h"
77 #include "net/ipv6/uip-ds6.h"
87 #define DEBUG DEBUG_NONE
97 #define UIP_LOG(m) uip_log(m)
102 #if UIP_STATISTICS == 1
111 #if UIP_CONF_LL_802154
147 #define FBUF ((struct uip_tcpip_hdr *)&uip_reassbuf[0])
148 #define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
149 #define UIP_ICMP_BUF ((struct uip_icmp_hdr *)&uip_buf[uip_l2_l3_hdr_len])
150 #define UIP_UDP_BUF ((struct uip_udp_hdr *)&uip_buf[UIP_LLH_LEN + UIP_IPH_LEN])
151 #define UIP_TCP_BUF ((struct uip_tcp_hdr *)&uip_buf[UIP_LLH_LEN + UIP_IPH_LEN])
152 #define UIP_EXT_BUF ((struct uip_ext_hdr *)&uip_buf[uip_l2_l3_hdr_len])
153 #define UIP_ROUTING_BUF ((struct uip_routing_hdr *)&uip_buf[uip_l2_l3_hdr_len])
154 #define UIP_FRAG_BUF ((struct uip_frag_hdr *)&uip_buf[uip_l2_l3_hdr_len])
155 #define UIP_HBHO_BUF ((struct uip_hbho_hdr *)&uip_buf[uip_l2_l3_hdr_len])
156 #define UIP_DESTO_BUF ((struct uip_desto_hdr *)&uip_buf[uip_l2_l3_hdr_len])
157 #define UIP_EXT_HDR_OPT_BUF ((struct uip_ext_hdr_opt *)&uip_buf[uip_l2_l3_hdr_len + uip_ext_opt_offset])
158 #define UIP_EXT_HDR_OPT_PADN_BUF ((struct uip_ext_hdr_opt_padn *)&uip_buf[uip_l2_l3_hdr_len + uip_ext_opt_offset])
159 #if UIP_CONF_IPV6_RPL
160 #define UIP_EXT_HDR_OPT_RPL_BUF ((struct uip_ext_hdr_opt_rpl *)&uip_buf[uip_l2_l3_hdr_len + uip_ext_opt_offset])
162 #define UIP_ICMP6_ERROR_BUF ((struct uip_icmp6_error *)&uip_buf[uip_l2_l3_icmp_hdr_len])
168 #ifndef UIP_CONF_EXTERNAL_BUFFER
180 uint16_t uip_urglen, uip_surglen;
199 #if (UIP_TCP || UIP_UDP)
203 #if UIP_ACTIVE_OPEN || UIP_UDP
205 static uint16_t lastport;
224 #define TCP_OPT_END 0
225 #define TCP_OPT_NOOP 1
226 #define TCP_OPT_MSS 2
228 #define TCP_OPT_MSS_LEN 4
241 static uint8_t iss[4];
246 static uint16_t tmp16;
264 struct uip_icmp6_conn uip_icmp6_conns;
271 #if (!UIP_ARCH_ADD32 && UIP_TCP)
277 uip_acc32[1] = op32[1];
278 uip_acc32[0] = op32[0];
280 if(uip_acc32[2] < (op16 >> 8)) {
282 if(uip_acc32[1] == 0) {
288 if(uip_acc32[3] < (op16 & 0xff)) {
290 if(uip_acc32[2] == 0) {
292 if(uip_acc32[1] == 0) {
301 #if ! UIP_ARCH_CHKSUM
304 chksum(uint16_t sum,
const uint8_t *data, uint16_t len)
307 const uint8_t *dataptr;
308 const uint8_t *last_byte;
311 last_byte = data + len - 1;
313 while(dataptr < last_byte) {
314 t = (dataptr[0] << 8) + dataptr[1];
322 if(dataptr == last_byte) {
323 t = (dataptr[0] << 8) + 0;
337 return uip_htons(chksum(0, (uint8_t *)data, len));
340 #ifndef UIP_ARCH_IPCHKSUM
346 sum = chksum(0, &uip_buf[
UIP_LLH_LEN], UIP_IPH_LEN);
347 PRINTF(
"uip_ipchksum: sum 0x%04x\n", sum);
348 return (sum == 0) ? 0xffff :
uip_htons(sum);
353 upper_layer_chksum(uint8_t proto)
364 volatile uint16_t upper_layer_len;
369 PRINTF(
"Upper layer checksum len: %d from: %d\n", upper_layer_len,
374 sum = upper_layer_len + proto;
376 sum = chksum(sum, (uint8_t *)&
UIP_IP_BUF->srcipaddr, 2 *
sizeof(uip_ipaddr_t));
382 return (sum == 0) ? 0xffff :
uip_htons(sum);
388 return upper_layer_chksum(UIP_PROTO_ICMP6);
396 return upper_layer_chksum(UIP_PROTO_TCP);
400 #if UIP_UDP && UIP_UDP_CHECKSUMS
404 return upper_layer_chksum(UIP_PROTO_UDP);
417 uip_listenports[c] = 0;
420 uip_conns[c].tcpstateflags = UIP_CLOSED;
424 #if UIP_ACTIVE_OPEN || UIP_UDP
430 uip_udp_conns[c].
lport = 0;
434 #if UIP_CONF_IPV6_MULTICAST
439 #if UIP_TCP && UIP_ACTIVE_OPEN
443 register struct uip_conn *conn, *cconn;
449 if(lastport >= 32000) {
456 conn = &uip_conns[c];
465 cconn = &uip_conns[c];
515 PRINTF(
"Cutting ext-header before processing (extlen: %d, uiplen: %d)\n",
518 PRINTF(
"ERROR: uip_len too short compared to ext len\n");
523 memmove(((uint8_t *)UIP_TCP_BUF), (uint8_t *)UIP_TCP_BUF +
uip_ext_len,
536 struct uip_udp_conn *
537 uip_udp_new(
const uip_ipaddr_t *ripaddr, uint16_t rport)
539 register struct uip_udp_conn *conn;
545 if(lastport >= 32000) {
557 if(uip_udp_conns[c].
lport == 0) {
558 conn = &uip_udp_conns[c];
569 if(ripaddr ==
NULL) {
570 memset(&conn->
ripaddr, 0,
sizeof(uip_ipaddr_t));
574 conn->
ttl = uip_ds6_if.cur_hop_limit;
585 if(uip_listenports[c] == port) {
586 uip_listenports[c] = 0;
596 if(uip_listenports[c] == 0) {
597 uip_listenports[c] = port;
605 #if UIP_CONF_IPV6_REASSEMBLY
606 #define UIP_REASS_BUFSIZE (UIP_BUFSIZE - UIP_LLH_LEN)
608 static uint8_t uip_reassbuf[UIP_REASS_BUFSIZE];
610 static uint8_t uip_reassbitmap[UIP_REASS_BUFSIZE / (8 * 8)];
613 static const uint8_t bitmap_bits[8] = {0xff, 0x7f, 0x3f, 0x1f,
614 0x0f, 0x07, 0x03, 0x01};
615 static uint16_t uip_reasslen;
616 static uint8_t uip_reassflags;
618 #define UIP_REASS_FLAG_LASTFRAG 0x01
619 #define UIP_REASS_FLAG_FIRSTFRAG 0x02
620 #define UIP_REASS_FLAG_ERROR_MSG 0x04
633 struct etimer uip_reass_timer;
634 uint8_t uip_reass_on;
636 static uint32_t uip_id;
651 if(uip_reass_on == 0) {
652 PRINTF(
"Starting reassembly\n");
658 uip_id = UIP_FRAG_BUF->id;
660 memset(uip_reassbitmap, 0,
sizeof(uip_reassbitmap));
667 if(uip_ipaddr_cmp(&FBUF->srcipaddr, &
UIP_IP_BUF->srcipaddr) &&
668 uip_ipaddr_cmp(&FBUF->destipaddr, &
UIP_IP_BUF->destipaddr) &&
669 UIP_FRAG_BUF->id == uip_id) {
671 offset = (uip_ntohs(UIP_FRAG_BUF->offsetresmore) & 0xfff8);
673 PRINTF(
"len %d\n", len);
674 PRINTF(
"offset %d\n", offset);
676 uip_reassflags |= UIP_REASS_FLAG_FIRSTFRAG;
685 PRINT6ADDR(&FBUF->srcipaddr);
687 PRINT6ADDR(&FBUF->destipaddr);
694 if(offset > UIP_REASS_BUFSIZE ||
695 offset + len > UIP_REASS_BUFSIZE) {
703 if((uip_ntohs(UIP_FRAG_BUF->offsetresmore) & IP_MF) == 0) {
704 uip_reassflags |= UIP_REASS_FLAG_LASTFRAG;
706 uip_reasslen = offset + len;
707 PRINTF(
"LAST FRAGMENT reasslen %d\n", uip_reasslen);
715 uip_reassflags |= UIP_REASS_FLAG_ERROR_MSG;
726 memcpy((uint8_t *)FBUF + UIP_IPH_LEN +
uip_ext_len + offset,
727 (uint8_t *)UIP_FRAG_BUF + UIP_FRAGH_LEN, len);
730 if(offset >> 6 == (offset + len) >> 6) {
731 uip_reassbitmap[offset >> 6] |=
732 bitmap_bits[(offset >> 3) & 7] &
733 ~bitmap_bits[((offset + len) >> 3) & 7];
738 uip_reassbitmap[offset >> 6] |= bitmap_bits[(offset >> 3) & 7];
740 for(i = (1 + (offset >> 6)); i < ((offset + len) >> 6); ++i) {
741 uip_reassbitmap[i] = 0xff;
743 uip_reassbitmap[(offset + len) >> 6] |=
744 ~bitmap_bits[((offset + len) >> 3) & 7];
751 if(uip_reassflags & UIP_REASS_FLAG_LASTFRAG) {
754 for(i = 0; i < (uip_reasslen >> 6); ++i) {
755 if(uip_reassbitmap[i] != 0xff) {
761 if(uip_reassbitmap[uip_reasslen >> 6] !=
762 (uint8_t)~bitmap_bits[(uip_reasslen >> 3) & 7]) {
773 UIP_IP_BUF->len[0] = ((uip_reasslen - UIP_IPH_LEN) >> 8);
774 UIP_IP_BUF->len[1] = ((uip_reasslen - UIP_IPH_LEN) & 0xff);
775 PRINTF(
"REASSEMBLED PAQUET %d (%d)\n", uip_reasslen,
782 PRINTF(
"Already reassembling another paquet\n");
795 if(uip_reassflags & UIP_REASS_FLAG_FIRSTFRAG){
796 PRINTF(
"FRAG INTERRUPTED TOO LATE\n");
822 uip_add_rcv_nxt(uint16_t n)
825 uip_conn->
rcv_nxt[0] = uip_acc32[0];
826 uip_conn->
rcv_nxt[1] = uip_acc32[1];
827 uip_conn->
rcv_nxt[2] = uip_acc32[2];
828 uip_conn->
rcv_nxt[3] = uip_acc32[3];
837 ext_hdr_options_process(
void)
846 switch(UIP_EXT_HDR_OPT_BUF->type) {
853 PRINTF(
"Processing PAD1 option\n");
856 case UIP_EXT_HDR_OPT_PADN:
857 PRINTF(
"Processing PADN option\n");
860 case UIP_EXT_HDR_OPT_RPL:
869 #if UIP_CONF_IPV6_RPL
870 PRINTF(
"Processing RPL option\n");
872 PRINTF(
"RPL Option Error: Dropping Packet\n");
892 PRINTF(
"MSB %x\n", UIP_EXT_HDR_OPT_BUF->type);
893 switch(UIP_EXT_HDR_OPT_BUF->type & 0xC0) {
921 register struct uip_conn *uip_connr =
uip_conn;
924 if(flag == UIP_UDP_SEND_CONN) {
932 if(flag == UIP_POLL_REQUEST) {
934 if((uip_connr->
tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED &&
935 !uip_outstanding(uip_connr)) {
936 uip_flags = UIP_POLL;
940 }
else if((uip_connr->
tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) {
942 UIP_TCP_BUF->flags = 0;
949 }
else if(flag == UIP_TIMER) {
972 ++(uip_connr->
timer);
982 if(uip_outstanding(uip_connr)) {
983 if(uip_connr->
timer-- == 0) {
995 uip_flags = UIP_TIMEDOUT;
999 UIP_TCP_BUF->flags = TCP_RST | TCP_ACK;
1000 goto tcp_send_nodata;
1007 ++(uip_connr->
nrtx);
1021 goto tcp_send_synack;
1026 UIP_TCP_BUF->flags = 0;
1030 case UIP_ESTABLISHED:
1037 uip_flags = UIP_REXMIT;
1041 case UIP_FIN_WAIT_1:
1045 goto tcp_send_finack;
1048 }
else if((uip_connr->
tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED) {
1053 uip_flags = UIP_POLL;
1062 if(flag == UIP_UDP_TIMER) {
1063 if(uip_udp_conn->
lport != 0) {
1067 uip_flags = UIP_POLL;
1086 UIP_LOG(
"ipv6: invalid version.");
1112 UIP_LOG(
"ip: packet shorter than reported in IP header.");
1116 PRINTF(
"IPv6 packet received from ");
1119 PRINTF(
": %u",
UIP_HTONS(UIP_UDP_BUF->srcport));
1127 PRINTF(
"Dropping packet, src is mcast\n");
1141 #if UIP_CONF_IPV6_CHECKS
1144 switch(ext_hdr_options_process()) {
1151 PRINTF(
"Dropping packet after extension header processing\n");
1155 PRINTF(
"Sending error message after extension header processing\n");
1173 #if UIP_CONF_IPV6_MULTICAST
1175 if(UIP_MCAST6.in() == UIP_MCAST6_ACCEPT) {
1209 #if UIP_CONF_IPV6_RPL
1210 rpl_update_header_empty();
1214 PRINTF(
"Forwarding packet to ");
1224 (!uip_ds6_is_addr_onlink((&
UIP_IP_BUF->destipaddr)))) {
1225 PRINTF(
"LL source address with off link destination, dropping\n");
1230 PRINTF(
"Dropping packet, not for me and link local or multicast\n");
1239 PRINTF(
"Dropping packet, not for me\n");
1253 #if UIP_CONF_IPV6_MULTICAST
1269 case UIP_PROTO_ICMP6:
1273 PRINTF(
"Processing hbh header\n");
1275 #if UIP_CONF_IPV6_CHECKS
1283 switch(ext_hdr_options_process()) {
1298 case UIP_PROTO_DESTO:
1299 #if UIP_CONF_IPV6_CHECKS
1301 PRINTF(
"Processing desto header\n");
1312 switch(ext_hdr_options_process()) {
1327 case UIP_PROTO_ROUTING:
1328 #if UIP_CONF_IPV6_CHECKS
1344 PRINTF(
"Processing Routing header\n");
1345 if(UIP_ROUTING_BUF->seg_left > 0) {
1348 UIP_LOG(
"ip6: unrecognized routing type");
1354 case UIP_PROTO_FRAG:
1356 #if UIP_CONF_IPV6_REASSEMBLY
1357 PRINTF(
"Processing frag header\n");
1362 if(uip_reassflags & UIP_REASS_FLAG_ERROR_MSG){
1368 PRINTF(
"Processing reassembled packet\n");
1376 UIP_LOG(
"ip: fragment dropped.");
1379 case UIP_PROTO_NONE:
1393 UIP_LOG(
"ip6: unrecognized header");
1401 #if UIP_CONF_IPV6_CHECKS
1406 UIP_LOG(
"icmpv6: bad checksum.");
1407 PRINTF(
"icmpv6: bad checksum.");
1444 #if UIP_CONF_ROUTER && UIP_ND6_SEND_RA
1459 #if UIP_CONF_IPV6_RPL
1470 PRINTF(
"Received an icmp6 echo reply\n");
1474 #if UIP_CONF_IPV6_ROLL_TM
1481 PRINTF(
"Unknown icmp6 message type %d\n",
UIP_ICMP_BUF->type);
1484 UIP_LOG(
"icmp6: unknown ICMP message.");
1503 PRINTF(
"Receiving UDP packet\n");
1509 #if UIP_UDP_CHECKSUMS
1517 if(UIP_UDP_BUF->udpchksum != 0 &&
uip_udpchksum() != 0xffff) {
1520 PRINTF(
"udp: bad checksum 0x%04x 0x%04x\n", UIP_UDP_BUF->udpchksum,
1529 if(UIP_UDP_BUF->destport == 0) {
1530 PRINTF(
"udp: zero port.\n");
1535 for(uip_udp_conn = &uip_udp_conns[0];
1545 if(uip_udp_conn->
lport != 0 &&
1546 UIP_UDP_BUF->destport == uip_udp_conn->
lport &&
1547 (uip_udp_conn->
rport == 0 ||
1548 UIP_UDP_BUF->srcport == uip_udp_conn->
rport) &&
1554 PRINTF(
"udp: no matching connection found\n");
1557 #if UIP_UDP_SEND_UNREACH_NOPORT
1565 PRINTF(
"In udp_found\n");
1569 uip_flags = UIP_NEWDATA;
1575 PRINTF(
"In udp_send\n");
1580 uip_len = uip_slen + UIP_IPUDPH_LEN;
1590 UIP_UDP_BUF->udplen =
UIP_HTONS(uip_slen + UIP_UDPH_LEN);
1591 UIP_UDP_BUF->udpchksum = 0;
1593 UIP_UDP_BUF->srcport = uip_udp_conn->
lport;
1594 UIP_UDP_BUF->destport = uip_udp_conn->
rport;
1601 #if UIP_CONF_IPV6_RPL
1602 rpl_insert_header();
1605 #if UIP_UDP_CHECKSUMS
1608 if(UIP_UDP_BUF->udpchksum == 0) {
1609 UIP_UDP_BUF->udpchksum = 0xffff;
1623 PRINTF(
"Receiving TCP packet\n");
1630 PRINTF(
"tcp: bad checksum 0x%04x 0x%04x\n", UIP_TCP_BUF->tcpchksum,
1636 if(UIP_TCP_BUF->destport == 0 || UIP_TCP_BUF->srcport == 0) {
1637 PRINTF(
"tcp: zero port.");
1643 for(uip_connr = &uip_conns[0]; uip_connr <= &uip_conns[UIP_CONNS - 1];
1646 UIP_TCP_BUF->destport == uip_connr->
lport &&
1647 UIP_TCP_BUF->srcport == uip_connr->
rport &&
1657 if((UIP_TCP_BUF->flags & TCP_CTL) != TCP_SYN) {
1661 tmp16 = UIP_TCP_BUF->destport;
1664 if(tmp16 == uip_listenports[c]) {
1673 PRINTF(
"In reset\n");
1675 if(UIP_TCP_BUF->flags & TCP_RST) {
1681 UIP_TCP_BUF->flags = TCP_RST | TCP_ACK;
1683 UIP_TCP_BUF->tcpoffset = 5 << 4;
1686 c = UIP_TCP_BUF->seqno[3];
1687 UIP_TCP_BUF->seqno[3] = UIP_TCP_BUF->ackno[3];
1688 UIP_TCP_BUF->ackno[3] = c;
1690 c = UIP_TCP_BUF->seqno[2];
1691 UIP_TCP_BUF->seqno[2] = UIP_TCP_BUF->ackno[2];
1692 UIP_TCP_BUF->ackno[2] = c;
1694 c = UIP_TCP_BUF->seqno[1];
1695 UIP_TCP_BUF->seqno[1] = UIP_TCP_BUF->ackno[1];
1696 UIP_TCP_BUF->ackno[1] = c;
1698 c = UIP_TCP_BUF->seqno[0];
1699 UIP_TCP_BUF->seqno[0] = UIP_TCP_BUF->ackno[0];
1700 UIP_TCP_BUF->ackno[0] = c;
1705 if(++UIP_TCP_BUF->ackno[3] == 0) {
1706 if(++UIP_TCP_BUF->ackno[2] == 0) {
1707 if(++UIP_TCP_BUF->ackno[1] == 0) {
1708 ++UIP_TCP_BUF->ackno[0];
1714 tmp16 = UIP_TCP_BUF->srcport;
1715 UIP_TCP_BUF->srcport = UIP_TCP_BUF->destport;
1716 UIP_TCP_BUF->destport = tmp16;
1722 goto tcp_send_noconn;
1728 PRINTF(
"In found listen\n");
1738 uip_connr = &uip_conns[c];
1742 if(uip_connr == 0 ||
1744 uip_connr = &uip_conns[c];
1749 if(uip_connr == 0) {
1754 UIP_LOG(
"tcp: found no unused connections.");
1757 uip_conn = uip_connr;
1763 uip_connr->
nrtx = 0;
1764 uip_connr->
lport = UIP_TCP_BUF->destport;
1765 uip_connr->
rport = UIP_TCP_BUF->srcport;
1769 uip_connr->
snd_nxt[0] = iss[0];
1770 uip_connr->
snd_nxt[1] = iss[1];
1771 uip_connr->
snd_nxt[2] = iss[2];
1772 uip_connr->
snd_nxt[3] = iss[3];
1776 uip_connr->
rcv_nxt[3] = UIP_TCP_BUF->seqno[3];
1777 uip_connr->
rcv_nxt[2] = UIP_TCP_BUF->seqno[2];
1778 uip_connr->
rcv_nxt[1] = UIP_TCP_BUF->seqno[1];
1779 uip_connr->
rcv_nxt[0] = UIP_TCP_BUF->seqno[0];
1783 if((UIP_TCP_BUF->tcpoffset & 0xf0) > 0x50) {
1784 for(c = 0; c < ((UIP_TCP_BUF->tcpoffset >> 4) - 5) << 2 ;) {
1786 if(opt == TCP_OPT_END) {
1789 }
else if(opt == TCP_OPT_NOOP) {
1792 }
else if(opt == TCP_OPT_MSS &&
1793 uip_buf[UIP_TCPIP_HLEN +
UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN) {
1795 tmp16 = ((uint16_t)uip_buf[UIP_TCPIP_HLEN +
UIP_LLH_LEN + 2 + c] << 8) |
1796 (uint16_t)uip_buf[UIP_IPTCPH_LEN +
UIP_LLH_LEN + 3 + c];
1805 if(uip_buf[UIP_TCPIP_HLEN +
UIP_LLH_LEN + 1 + c] == 0) {
1810 c += uip_buf[UIP_TCPIP_HLEN +
UIP_LLH_LEN + 1 + c];
1818 UIP_TCP_BUF->flags = TCP_ACK;
1821 UIP_TCP_BUF->flags |= TCP_SYN;
1824 UIP_TCP_BUF->flags = TCP_SYN | TCP_ACK;
1829 UIP_TCP_BUF->optdata[0] = TCP_OPT_MSS;
1830 UIP_TCP_BUF->optdata[1] = TCP_OPT_MSS_LEN;
1833 uip_len = UIP_IPTCPH_LEN + TCP_OPT_MSS_LEN;
1834 UIP_TCP_BUF->tcpoffset = ((UIP_TCPH_LEN + TCP_OPT_MSS_LEN) / 4) << 4;
1839 PRINTF(
"In found\n");
1840 uip_conn = uip_connr;
1846 if(UIP_TCP_BUF->flags & TCP_RST) {
1848 UIP_LOG(
"tcp: got reset, aborting connection.");
1849 uip_flags = UIP_ABORT;
1855 c = (UIP_TCP_BUF->tcpoffset >> 4) << 2;
1866 if(!((((uip_connr->
tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) &&
1867 ((UIP_TCP_BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK))) ||
1868 (((uip_connr->
tcpstateflags & UIP_TS_MASK) == UIP_SYN_RCVD) &&
1869 ((UIP_TCP_BUF->flags & TCP_CTL) == TCP_SYN)))) {
1870 if((
uip_len > 0 || ((UIP_TCP_BUF->flags & (TCP_SYN | TCP_FIN)) != 0)) &&
1871 (UIP_TCP_BUF->seqno[0] != uip_connr->
rcv_nxt[0] ||
1872 UIP_TCP_BUF->seqno[1] != uip_connr->
rcv_nxt[1] ||
1873 UIP_TCP_BUF->seqno[2] != uip_connr->
rcv_nxt[2] ||
1874 UIP_TCP_BUF->seqno[3] != uip_connr->
rcv_nxt[3])) {
1876 if((UIP_TCP_BUF->flags & TCP_SYN)) {
1877 if((uip_connr->
tcpstateflags & UIP_TS_MASK) == UIP_SYN_RCVD) {
1878 goto tcp_send_synack;
1879 }
else if((uip_connr->
tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) {
1891 if((UIP_TCP_BUF->flags & TCP_ACK) && uip_outstanding(uip_connr)) {
1894 if(UIP_TCP_BUF->ackno[0] == uip_acc32[0] &&
1895 UIP_TCP_BUF->ackno[1] == uip_acc32[1] &&
1896 UIP_TCP_BUF->ackno[2] == uip_acc32[2] &&
1897 UIP_TCP_BUF->ackno[3] == uip_acc32[3]) {
1899 uip_connr->
snd_nxt[0] = uip_acc32[0];
1900 uip_connr->
snd_nxt[1] = uip_acc32[1];
1901 uip_connr->
snd_nxt[2] = uip_acc32[2];
1902 uip_connr->
snd_nxt[3] = uip_acc32[3];
1905 if(uip_connr->
nrtx == 0) {
1907 m = uip_connr->
rto - uip_connr->
timer;
1909 m = m - (uip_connr->
sa >> 3);
1914 m = m - (uip_connr->
sv >> 2);
1916 uip_connr->
rto = (uip_connr->
sa >> 3) + uip_connr->
sv;
1920 uip_flags = UIP_ACKDATA;
1941 if(uip_flags & UIP_ACKDATA) {
1943 uip_flags = UIP_CONNECTED;
1946 uip_flags |= UIP_NEWDATA;
1954 if((UIP_TCP_BUF->flags & TCP_CTL) == TCP_SYN) {
1955 goto tcp_send_synack;
1964 if((uip_flags & UIP_ACKDATA) &&
1965 (UIP_TCP_BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK)) {
1968 if((UIP_TCP_BUF->tcpoffset & 0xf0) > 0x50) {
1969 for(c = 0; c < ((UIP_TCP_BUF->tcpoffset >> 4) - 5) << 2 ;) {
1971 if(opt == TCP_OPT_END) {
1974 }
else if(opt == TCP_OPT_NOOP) {
1977 }
else if(opt == TCP_OPT_MSS &&
1978 uip_buf[UIP_TCPIP_HLEN +
UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN) {
1980 tmp16 = (uip_buf[UIP_TCPIP_HLEN +
UIP_LLH_LEN + 2 + c] << 8) |
1990 if(uip_buf[UIP_TCPIP_HLEN +
UIP_LLH_LEN + 1 + c] == 0) {
1995 c += uip_buf[UIP_TCPIP_HLEN +
UIP_LLH_LEN + 1 + c];
2000 uip_connr->
rcv_nxt[0] = UIP_TCP_BUF->seqno[0];
2001 uip_connr->
rcv_nxt[1] = UIP_TCP_BUF->seqno[1];
2002 uip_connr->
rcv_nxt[2] = UIP_TCP_BUF->seqno[2];
2003 uip_connr->
rcv_nxt[3] = UIP_TCP_BUF->seqno[3];
2005 uip_flags = UIP_CONNECTED | UIP_NEWDATA;
2013 uip_flags = UIP_ABORT;
2020 case UIP_ESTABLISHED:
2032 if(UIP_TCP_BUF->flags & TCP_FIN && !(uip_connr->
tcpstateflags & UIP_STOPPED)) {
2033 if(uip_outstanding(uip_connr)) {
2037 uip_flags |= UIP_CLOSE;
2039 uip_flags |= UIP_NEWDATA;
2044 uip_connr->
nrtx = 0;
2046 UIP_TCP_BUF->flags = TCP_FIN | TCP_ACK;
2047 goto tcp_send_nodata;
2052 if((UIP_TCP_BUF->flags & TCP_URG) != 0) {
2054 uip_urglen = (UIP_TCP_BUF->urgp[0] << 8) | UIP_TCP_BUF->urgp[1];
2059 uip_add_rcv_nxt(uip_urglen);
2067 uip_len -= (UIP_TCP_BUF->urgp[0] << 8) | UIP_TCP_BUF->urgp[1];
2077 uip_flags |= UIP_NEWDATA;
2093 tmp16 = ((uint16_t)UIP_TCP_BUF->wnd[0] << 8) + (uint16_t)UIP_TCP_BUF->wnd[1];
2098 uip_connr->
mss = tmp16;
2116 if(uip_flags & (UIP_NEWDATA | UIP_ACKDATA)) {
2122 if(uip_flags & UIP_ABORT) {
2125 UIP_TCP_BUF->flags = TCP_RST | TCP_ACK;
2126 goto tcp_send_nodata;
2129 if(uip_flags & UIP_CLOSE) {
2133 uip_connr->
nrtx = 0;
2134 UIP_TCP_BUF->flags = TCP_FIN | TCP_ACK;
2135 goto tcp_send_nodata;
2143 if((uip_flags & UIP_ACKDATA) != 0) {
2150 if(uip_connr->
len == 0) {
2155 if(uip_slen > uip_connr->
mss) {
2156 uip_slen = uip_connr->
mss;
2161 uip_connr->
len = uip_slen;
2167 uip_slen = uip_connr->
len;
2170 uip_connr->
nrtx = 0;
2176 if(uip_slen > 0 && uip_connr->
len > 0) {
2180 UIP_TCP_BUF->flags = TCP_ACK | TCP_PSH;
2182 goto tcp_send_noopts;
2186 if(uip_flags & UIP_NEWDATA) {
2188 UIP_TCP_BUF->flags = TCP_ACK;
2189 goto tcp_send_noopts;
2196 if(uip_flags & UIP_ACKDATA) {
2198 uip_flags = UIP_CLOSE;
2203 case UIP_FIN_WAIT_1:
2210 if(UIP_TCP_BUF->flags & TCP_FIN) {
2211 if(uip_flags & UIP_ACKDATA) {
2213 uip_connr->
timer = 0;
2219 uip_flags = UIP_CLOSE;
2222 }
else if(uip_flags & UIP_ACKDATA) {
2232 case UIP_FIN_WAIT_2:
2236 if(UIP_TCP_BUF->flags & TCP_FIN) {
2238 uip_connr->
timer = 0;
2240 uip_flags = UIP_CLOSE;
2253 if(uip_flags & UIP_ACKDATA) {
2255 uip_connr->
timer = 0;
2263 UIP_TCP_BUF->flags = TCP_ACK;
2269 UIP_TCP_BUF->tcpoffset = (UIP_TCPH_LEN / 4) << 4;
2276 PRINTF(
"In tcp_send\n");
2278 UIP_TCP_BUF->ackno[0] = uip_connr->
rcv_nxt[0];
2279 UIP_TCP_BUF->ackno[1] = uip_connr->
rcv_nxt[1];
2280 UIP_TCP_BUF->ackno[2] = uip_connr->
rcv_nxt[2];
2281 UIP_TCP_BUF->ackno[3] = uip_connr->
rcv_nxt[3];
2283 UIP_TCP_BUF->seqno[0] = uip_connr->
snd_nxt[0];
2284 UIP_TCP_BUF->seqno[1] = uip_connr->
snd_nxt[1];
2285 UIP_TCP_BUF->seqno[2] = uip_connr->
snd_nxt[2];
2286 UIP_TCP_BUF->seqno[3] = uip_connr->
snd_nxt[3];
2290 UIP_TCP_BUF->srcport = uip_connr->
lport;
2291 UIP_TCP_BUF->destport = uip_connr->
rport;
2295 PRINTF(
"Sending TCP packet to ");
2304 UIP_TCP_BUF->wnd[0] = UIP_TCP_BUF->wnd[1] = 0;
2315 UIP_TCP_BUF->urgp[0] = UIP_TCP_BUF->urgp[1] = 0;
2318 UIP_TCP_BUF->tcpchksum = 0;
2330 PRINTF(
"Sending packet with length %d (%d)\n",
uip_len,
2353 uip_htonl(uint32_t val)
2355 return UIP_HTONL(val);
2362 #define MIN(a,b) ((a) < (b)? (a): (b))
2364 if(uip_sappdata !=
NULL) {
2366 (
int)((
char *)uip_sappdata -
2373 if(data != uip_sappdata) {
2374 if(uip_sappdata ==
NULL) {
2375 memcpy((
char *)&uip_buf[
UIP_LLH_LEN + UIP_TCPIP_HLEN],
2378 memcpy(uip_sappdata, (data), uip_slen);