89 #define PRINTF(...) printf(__VA_ARGS__)
90 #define PRINT6ADDR(addr) PRINTF(" %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x ", ((u8_t *)addr)[0], ((u8_t *)addr)[1], ((u8_t *)addr)[2], ((u8_t *)addr)[3], ((u8_t *)addr)[4], ((u8_t *)addr)[5], ((u8_t *)addr)[6], ((u8_t *)addr)[7], ((u8_t *)addr)[8], ((u8_t *)addr)[9], ((u8_t *)addr)[10], ((u8_t *)addr)[11], ((u8_t *)addr)[12], ((u8_t *)addr)[13], ((u8_t *)addr)[14], ((u8_t *)addr)[15])
91 #define PRINTLLADDR(lladdr) PRINTF(" %02x:%02x:%02x:%02x:%02x:%02x ",lladdr->addr[0], lladdr->addr[1], lladdr->addr[2], lladdr->addr[3],lladdr->addr[4], lladdr->addr[5])
94 #define PRINT6ADDR(addr)
98 void uip_rpl_input(
void);
104 #define UIP_LOG(m) uip_log(m)
109 #if UIP_STATISTICS == 1
118 #if UIP_CONF_LL_802154
154 #define FBUF ((struct uip_tcpip_hdr *)&uip_reassbuf[0])
155 #define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
156 #define UIP_ICMP_BUF ((struct uip_icmp_hdr *)&uip_buf[uip_l2_l3_hdr_len])
157 #define UIP_UDP_BUF ((struct uip_udp_hdr *)&uip_buf[uip_l2_l3_hdr_len])
158 #define UIP_TCP_BUF ((struct uip_tcp_hdr *)&uip_buf[uip_l2_l3_hdr_len])
159 #define UIP_EXT_BUF ((struct uip_ext_hdr *)&uip_buf[uip_l2_l3_hdr_len])
160 #define UIP_ROUTING_BUF ((struct uip_routing_hdr *)&uip_buf[uip_l2_l3_hdr_len])
161 #define UIP_FRAG_BUF ((struct uip_frag_hdr *)&uip_buf[uip_l2_l3_hdr_len])
162 #define UIP_HBHO_BUF ((struct uip_hbho_hdr *)&uip_buf[uip_l2_l3_hdr_len])
163 #define UIP_DESTO_BUF ((struct uip_desto_hdr *)&uip_buf[uip_l2_l3_hdr_len])
164 #define UIP_EXT_HDR_OPT_BUF ((struct uip_ext_hdr_opt *)&uip_buf[uip_l2_l3_hdr_len + uip_ext_opt_offset])
165 #define UIP_EXT_HDR_OPT_PADN_BUF ((struct uip_ext_hdr_opt_padn *)&uip_buf[uip_l2_l3_hdr_len + uip_ext_opt_offset])
166 #define UIP_ICMP6_ERROR_BUF ((struct uip_icmp6_error *)&uip_buf[uip_l2_l3_icmp_hdr_len])
172 #ifndef UIP_CONF_EXTERNAL_BUFFER
184 u16_t uip_urglen, uip_surglen;
203 #if (UIP_TCP || UIP_UDP)
207 #if UIP_ACTIVE_OPEN || UIP_UDP
209 static u16_t lastport;
228 #define TCP_OPT_END 0
229 #define TCP_OPT_NOOP 1
230 #define TCP_OPT_MSS 2
232 #define TCP_OPT_MSS_LEN 4
268 struct uip_icmp6_conn uip_icmp6_conns;
274 #if (!UIP_ARCH_ADD32 && UIP_TCP)
280 uip_acc32[1] = op32[1];
281 uip_acc32[0] = op32[0];
283 if(uip_acc32[2] < (op16 >> 8)) {
285 if(uip_acc32[1] == 0) {
291 if(uip_acc32[3] < (op16 & 0xff)) {
293 if(uip_acc32[2] == 0) {
295 if(uip_acc32[1] == 0) {
304 #if ! UIP_ARCH_CHKSUM
307 chksum(u16_t sum,
const u8_t *data, u16_t len)
311 const u8_t *last_byte;
314 last_byte = data + len - 1;
316 while(dataptr < last_byte) {
317 t = (dataptr[0] << 8) + dataptr[1];
325 if(dataptr == last_byte) {
326 t = (dataptr[0] << 8) + 0;
340 return uip_htons(chksum(0, (u8_t *)data, len));
343 #ifndef UIP_ARCH_IPCHKSUM
349 sum = chksum(0, &uip_buf[
UIP_LLH_LEN], UIP_IPH_LEN);
350 PRINTF(
"uip_ipchksum: sum 0x%04x\n", sum);
351 return (sum == 0) ? 0xffff :
uip_htons(sum);
356 upper_layer_chksum(u8_t proto)
367 volatile u16_t upper_layer_len;
374 sum = upper_layer_len + proto;
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;
424 #if UIP_ACTIVE_OPEN || UIP_UDP
430 uip_udp_conns[c].
lport = 0;
435 #if UIP_TCP && UIP_ACTIVE_OPEN
439 register struct uip_conn *conn, *cconn;
445 if(lastport >= 32000) {
452 conn = &uip_conns[c];
461 cconn = &uip_conns[c];
507 struct uip_udp_conn *
510 register struct uip_udp_conn *conn;
516 if(lastport >= 32000) {
528 if(uip_udp_conns[c].
lport == 0) {
529 conn = &uip_udp_conns[c];
540 if(ripaddr ==
NULL) {
545 conn->
ttl = uip_ds6_if.cur_hop_limit;
556 if(uip_listenports[c] == port) {
557 uip_listenports[c] = 0;
567 if(uip_listenports[c] == 0) {
568 uip_listenports[c] = port;
576 #if UIP_CONF_IPV6_REASSEMBLY
577 #define UIP_REASS_BUFSIZE (UIP_BUFSIZE - UIP_LLH_LEN)
579 static u8_t uip_reassbuf[UIP_REASS_BUFSIZE];
581 static u8_t uip_reassbitmap[UIP_REASS_BUFSIZE / (8 * 8)];
584 static const u8_t bitmap_bits[8] = {0xff, 0x7f, 0x3f, 0x1f,
585 0x0f, 0x07, 0x03, 0x01};
586 static u16_t uip_reasslen;
587 static u8_t uip_reassflags;
589 #define UIP_REASS_FLAG_LASTFRAG 0x01
590 #define UIP_REASS_FLAG_FIRSTFRAG 0x02
591 #define UIP_REASS_FLAG_ERROR_MSG 0x04
604 struct etimer uip_reass_timer;
622 if(uip_reass_on == 0) {
623 PRINTF(
"Starting reassembly\n");
629 uip_id = UIP_FRAG_BUF->id;
631 memset(uip_reassbitmap, 0,
sizeof(uip_reassbitmap));
640 UIP_FRAG_BUF->id == uip_id) {
642 offset = (uip_ntohs(UIP_FRAG_BUF->offsetresmore) & 0xfff8);
644 PRINTF(
"len %d\n", len);
645 PRINTF(
"offset %d\n", offset);
647 uip_reassflags |= UIP_REASS_FLAG_FIRSTFRAG;
656 PRINT6ADDR(&FBUF->srcipaddr);
658 PRINT6ADDR(&FBUF->destipaddr);
665 if(offset > UIP_REASS_BUFSIZE ||
666 offset + len > UIP_REASS_BUFSIZE) {
674 if((uip_ntohs(UIP_FRAG_BUF->offsetresmore) & IP_MF) == 0) {
675 uip_reassflags |= UIP_REASS_FLAG_LASTFRAG;
677 uip_reasslen = offset + len;
678 PRINTF(
"LAST FRAGMENT reasslen %d\n", uip_reasslen);
686 uip_reassflags |= UIP_REASS_FLAG_ERROR_MSG;
697 memcpy((uint8_t *)FBUF + UIP_IPH_LEN +
uip_ext_len + offset,
698 (uint8_t *)UIP_FRAG_BUF + UIP_FRAGH_LEN, len);
701 if(offset >> 6 == (offset + len) >> 6) {
702 uip_reassbitmap[offset >> 6] |=
703 bitmap_bits[(offset >> 3) & 7] &
704 ~bitmap_bits[((offset + len) >> 3) & 7];
709 uip_reassbitmap[offset >> 6] |= bitmap_bits[(offset >> 3) & 7];
711 for(i = (1 + (offset >> 6)); i < ((offset + len) >> 6); ++i) {
712 uip_reassbitmap[i] = 0xff;
714 uip_reassbitmap[(offset + len) >> 6] |=
715 ~bitmap_bits[((offset + len) >> 3) & 7];
722 if(uip_reassflags & UIP_REASS_FLAG_LASTFRAG) {
725 for(i = 0; i < (uip_reasslen >> 6); ++i) {
726 if(uip_reassbitmap[i] != 0xff) {
732 if(uip_reassbitmap[uip_reasslen >> 6] !=
733 (u8_t)~bitmap_bits[(uip_reasslen >> 3) & 7]) {
744 UIP_IP_BUF->len[0] = ((uip_reasslen - UIP_IPH_LEN) >> 8);
745 UIP_IP_BUF->len[1] = ((uip_reasslen - UIP_IPH_LEN) & 0xff);
746 PRINTF(
"REASSEMBLED PAQUET %d (%d)\n", uip_reasslen,
753 PRINTF(
"Already reassembling another paquet\n");
766 if(uip_reassflags & UIP_REASS_FLAG_FIRSTFRAG){
767 PRINTF(
"FRAG INTERRUPTED TOO LATE\n");
793 uip_add_rcv_nxt(u16_t n)
796 uip_conn->
rcv_nxt[0] = uip_acc32[0];
797 uip_conn->
rcv_nxt[1] = uip_acc32[1];
798 uip_conn->
rcv_nxt[2] = uip_acc32[2];
799 uip_conn->
rcv_nxt[3] = uip_acc32[3];
808 ext_hdr_options_process(
void)
817 switch(UIP_EXT_HDR_OPT_BUF->type) {
823 case UIP_EXT_HDR_OPT_PAD1:
824 PRINTF(
"Processing PAD1 option\n");
827 case UIP_EXT_HDR_OPT_PADN:
828 PRINTF(
"Processing PADN option\n");
845 PRINTF(
"MSB %x\n", UIP_EXT_HDR_OPT_BUF->type);
846 switch(UIP_EXT_HDR_OPT_BUF->type & 0xC0) {
852 if(uip_is_addr_mcast(&
UIP_IP_BUF->destipaddr)) {
874 register struct uip_conn *uip_connr =
uip_conn;
877 if(flag == UIP_UDP_SEND_CONN) {
885 if(flag == UIP_POLL_REQUEST) {
887 if((uip_connr->
tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED &&
888 !uip_outstanding(uip_connr)) {
889 uip_flags = UIP_POLL;
893 }
else if((uip_connr->
tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) {
895 UIP_TCP_BUF->flags = 0;
902 }
else if(flag == UIP_TIMER) {
925 ++(uip_connr->
timer);
935 if(uip_outstanding(uip_connr)) {
936 if(uip_connr->
timer-- == 0) {
948 uip_flags = UIP_TIMEDOUT;
952 UIP_TCP_BUF->flags = TCP_RST | TCP_ACK;
953 goto tcp_send_nodata;
974 goto tcp_send_synack;
979 UIP_TCP_BUF->flags = 0;
983 case UIP_ESTABLISHED:
990 uip_flags = UIP_REXMIT;
998 goto tcp_send_finack;
1001 }
else if((uip_connr->
tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED) {
1006 uip_flags = UIP_POLL;
1015 if(flag == UIP_UDP_TIMER) {
1016 if(uip_udp_conn->
lport != 0) {
1020 uip_flags = UIP_POLL;
1039 UIP_LOG(
"ipv6: invalid version.");
1065 UIP_LOG(
"ip: packet shorter than reported in IP header.");
1069 PRINTF(
"IPv6 packet received from ");
1075 if(uip_is_addr_mcast(&
UIP_IP_BUF->srcipaddr)){
1077 PRINTF(
"Dropping packet, src is mcast\n");
1083 if(!uip_ds6_is_my_addr(&
UIP_IP_BUF->destipaddr) &&
1084 !uip_ds6_is_my_maddr(&
UIP_IP_BUF->destipaddr)) {
1085 if(!uip_is_addr_mcast(&
UIP_IP_BUF->destipaddr) &&
1086 !uip_is_addr_link_local(&
UIP_IP_BUF->destipaddr) &&
1087 !uip_is_addr_link_local(&
UIP_IP_BUF->srcipaddr) &&
1088 !uip_is_addr_unspecified(&
UIP_IP_BUF->srcipaddr) &&
1089 !uip_is_addr_loopback(&
UIP_IP_BUF->destipaddr)) {
1106 PRINTF(
"Forwarding packet to ");
1112 if((uip_is_addr_link_local(&
UIP_IP_BUF->srcipaddr)) &&
1113 (!uip_is_addr_unspecified(&
UIP_IP_BUF->srcipaddr)) &&
1114 (!uip_is_addr_loopback(&
UIP_IP_BUF->destipaddr)) &&
1115 (!uip_is_addr_mcast(&
UIP_IP_BUF->destipaddr)) &&
1116 (!uip_ds6_is_addr_onlink((&
UIP_IP_BUF->destipaddr)))) {
1117 PRINTF(
"LL source address with off link destination, dropping\n");
1122 PRINTF(
"Dropping packet, not for me and link local or multicast\n");
1128 if(!uip_ds6_is_my_addr(&
UIP_IP_BUF->destipaddr) &&
1129 !uip_ds6_is_my_maddr(&
UIP_IP_BUF->destipaddr) &&
1130 !uip_is_addr_mcast(&
UIP_IP_BUF->destipaddr)) {
1131 PRINTF(
"Dropping packet, not for me\n");
1156 case UIP_PROTO_ICMP6:
1159 case UIP_PROTO_HBHO:
1160 PRINTF(
"Processing hbh header\n");
1162 #if UIP_CONF_IPV6_CHECKS
1170 switch(ext_hdr_options_process()) {
1185 case UIP_PROTO_DESTO:
1186 #if UIP_CONF_IPV6_CHECKS
1188 PRINTF(
"Processing desto header\n");
1199 switch(ext_hdr_options_process()) {
1214 case UIP_PROTO_ROUTING:
1215 #if UIP_CONF_IPV6_CHECKS
1231 PRINTF(
"Processing Routing header\n");
1232 if(UIP_ROUTING_BUF->seg_left > 0) {
1235 UIP_LOG(
"ip6: unrecognized routing type");
1241 case UIP_PROTO_FRAG:
1243 #if UIP_CONF_IPV6_REASSEMBLY
1244 PRINTF(
"Processing frag header\n");
1249 if(uip_reassflags & UIP_REASS_FLAG_ERROR_MSG){
1255 PRINTF(
"Processing reassembled packet\n");
1263 UIP_LOG(
"ip: fragment dropped.");
1266 case UIP_PROTO_NONE:
1280 UIP_LOG(
"ip6: unrecognized header");
1286 PRINTF(
"icmp6_input: length %d\n",
uip_len);
1288 #if UIP_CONF_IPV6_CHECKS
1293 UIP_LOG(
"icmpv6: bad checksum.");
1320 #if UIP_CONF_ROUTER && UIP_ND6_SEND_RA
1335 #if UIP_CONF_IPV6_RPL
1345 PRINTF(
"Received an icmp6 echo reply\n");
1350 PRINTF(
"Unknown icmp6 message type %d\n",
UIP_ICMP_BUF->type);
1353 UIP_LOG(
"icmp6: unknown ICMP message.");
1369 PRINTF(
"Receiving UDP packet\n");
1376 #if UIP_UDP_CHECKSUMS
1379 if(UIP_UDP_BUF->udpchksum != 0 &&
uip_udpchksum() != 0xffff) {
1382 PRINTF(
"udp: bad checksum 0x%04x 0x%04x\n", UIP_UDP_BUF->udpchksum,
1391 if(UIP_UDP_BUF->destport == 0) {
1392 PRINTF(
"udp: zero port.\n");
1397 for(uip_udp_conn = &uip_udp_conns[0];
1407 if(uip_udp_conn->
lport != 0 &&
1408 UIP_UDP_BUF->destport == uip_udp_conn->
lport &&
1409 (uip_udp_conn->
rport == 0 ||
1410 UIP_UDP_BUF->srcport == uip_udp_conn->
rport) &&
1411 (uip_is_addr_unspecified(&uip_udp_conn->
ripaddr) ||
1416 PRINTF(
"udp: no matching connection found\n");
1418 #if UIP_UDP_SEND_UNREACH_NOPORT
1427 PRINTF(
"In udp_found\n");
1430 uip_flags = UIP_NEWDATA;
1436 PRINTF(
"In udp_send\n");
1441 uip_len = uip_slen + UIP_IPUDPH_LEN;
1451 UIP_UDP_BUF->udplen =
UIP_HTONS(uip_slen + UIP_UDPH_LEN);
1452 UIP_UDP_BUF->udpchksum = 0;
1454 UIP_UDP_BUF->srcport = uip_udp_conn->
lport;
1455 UIP_UDP_BUF->destport = uip_udp_conn->
rport;
1462 #if UIP_UDP_CHECKSUMS
1465 if(UIP_UDP_BUF->udpchksum == 0) {
1466 UIP_UDP_BUF->udpchksum = 0xffff;
1478 PRINTF(
"Receiving TCP packet\n");
1485 UIP_LOG(
"tcp: bad checksum.");
1490 if(UIP_TCP_BUF->destport == 0 || UIP_TCP_BUF->srcport == 0) {
1491 UIP_LOG(
"tcp: zero port.");
1497 for(uip_connr = &uip_conns[0]; uip_connr <= &uip_conns[UIP_CONNS - 1];
1500 UIP_TCP_BUF->destport == uip_connr->
lport &&
1501 UIP_TCP_BUF->srcport == uip_connr->
rport &&
1511 if((UIP_TCP_BUF->flags & TCP_CTL) != TCP_SYN) {
1515 tmp16 = UIP_TCP_BUF->destport;
1518 if(tmp16 == uip_listenports[c]) {
1527 PRINTF(
"In reset\n");
1529 if(UIP_TCP_BUF->flags & TCP_RST) {
1535 UIP_TCP_BUF->flags = TCP_RST | TCP_ACK;
1537 UIP_TCP_BUF->tcpoffset = 5 << 4;
1540 c = UIP_TCP_BUF->seqno[3];
1541 UIP_TCP_BUF->seqno[3] = UIP_TCP_BUF->ackno[3];
1542 UIP_TCP_BUF->ackno[3] = c;
1544 c = UIP_TCP_BUF->seqno[2];
1545 UIP_TCP_BUF->seqno[2] = UIP_TCP_BUF->ackno[2];
1546 UIP_TCP_BUF->ackno[2] = c;
1548 c = UIP_TCP_BUF->seqno[1];
1549 UIP_TCP_BUF->seqno[1] = UIP_TCP_BUF->ackno[1];
1550 UIP_TCP_BUF->ackno[1] = c;
1552 c = UIP_TCP_BUF->seqno[0];
1553 UIP_TCP_BUF->seqno[0] = UIP_TCP_BUF->ackno[0];
1554 UIP_TCP_BUF->ackno[0] = c;
1559 if(++UIP_TCP_BUF->ackno[3] == 0) {
1560 if(++UIP_TCP_BUF->ackno[2] == 0) {
1561 if(++UIP_TCP_BUF->ackno[1] == 0) {
1562 ++UIP_TCP_BUF->ackno[0];
1568 tmp16 = UIP_TCP_BUF->srcport;
1569 UIP_TCP_BUF->srcport = UIP_TCP_BUF->destport;
1570 UIP_TCP_BUF->destport = tmp16;
1576 goto tcp_send_noconn;
1582 PRINTF(
"In found listen\n");
1592 uip_connr = &uip_conns[c];
1596 if(uip_connr == 0 ||
1598 uip_connr = &uip_conns[c];
1603 if(uip_connr == 0) {
1608 UIP_LOG(
"tcp: found no unused connections.");
1611 uip_conn = uip_connr;
1617 uip_connr->
nrtx = 0;
1618 uip_connr->
lport = UIP_TCP_BUF->destport;
1619 uip_connr->
rport = UIP_TCP_BUF->srcport;
1623 uip_connr->
snd_nxt[0] = iss[0];
1624 uip_connr->
snd_nxt[1] = iss[1];
1625 uip_connr->
snd_nxt[2] = iss[2];
1626 uip_connr->
snd_nxt[3] = iss[3];
1630 uip_connr->
rcv_nxt[3] = UIP_TCP_BUF->seqno[3];
1631 uip_connr->
rcv_nxt[2] = UIP_TCP_BUF->seqno[2];
1632 uip_connr->
rcv_nxt[1] = UIP_TCP_BUF->seqno[1];
1633 uip_connr->
rcv_nxt[0] = UIP_TCP_BUF->seqno[0];
1637 if((UIP_TCP_BUF->tcpoffset & 0xf0) > 0x50) {
1638 for(c = 0; c < ((UIP_TCP_BUF->tcpoffset >> 4) - 5) << 2 ;) {
1640 if(opt == TCP_OPT_END) {
1643 }
else if(opt == TCP_OPT_NOOP) {
1646 }
else if(opt == TCP_OPT_MSS &&
1647 uip_buf[UIP_TCPIP_HLEN +
UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN) {
1659 if(uip_buf[UIP_TCPIP_HLEN +
UIP_LLH_LEN + 1 + c] == 0) {
1664 c += uip_buf[UIP_TCPIP_HLEN +
UIP_LLH_LEN + 1 + c];
1672 UIP_TCP_BUF->flags = TCP_ACK;
1675 UIP_TCP_BUF->flags |= TCP_SYN;
1678 UIP_TCP_BUF->flags = TCP_SYN | TCP_ACK;
1683 UIP_TCP_BUF->optdata[0] = TCP_OPT_MSS;
1684 UIP_TCP_BUF->optdata[1] = TCP_OPT_MSS_LEN;
1687 uip_len = UIP_IPTCPH_LEN + TCP_OPT_MSS_LEN;
1688 UIP_TCP_BUF->tcpoffset = ((UIP_TCPH_LEN + TCP_OPT_MSS_LEN) / 4) << 4;
1693 PRINTF(
"In found\n");
1694 uip_conn = uip_connr;
1700 if(UIP_TCP_BUF->flags & TCP_RST) {
1702 UIP_LOG(
"tcp: got reset, aborting connection.");
1703 uip_flags = UIP_ABORT;
1709 c = (UIP_TCP_BUF->tcpoffset >> 4) << 2;
1720 if(!((((uip_connr->
tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) &&
1721 ((UIP_TCP_BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK))) ||
1722 (((uip_connr->
tcpstateflags & UIP_TS_MASK) == UIP_SYN_RCVD) &&
1723 ((UIP_TCP_BUF->flags & TCP_CTL) == TCP_SYN)))) {
1724 if((
uip_len > 0 || ((UIP_TCP_BUF->flags & (TCP_SYN | TCP_FIN)) != 0)) &&
1725 (UIP_TCP_BUF->seqno[0] != uip_connr->
rcv_nxt[0] ||
1726 UIP_TCP_BUF->seqno[1] != uip_connr->
rcv_nxt[1] ||
1727 UIP_TCP_BUF->seqno[2] != uip_connr->
rcv_nxt[2] ||
1728 UIP_TCP_BUF->seqno[3] != uip_connr->
rcv_nxt[3])) {
1730 if(UIP_TCP_BUF->flags & TCP_SYN) {
1731 goto tcp_send_synack;
1741 if((UIP_TCP_BUF->flags & TCP_ACK) && uip_outstanding(uip_connr)) {
1744 if(UIP_TCP_BUF->ackno[0] == uip_acc32[0] &&
1745 UIP_TCP_BUF->ackno[1] == uip_acc32[1] &&
1746 UIP_TCP_BUF->ackno[2] == uip_acc32[2] &&
1747 UIP_TCP_BUF->ackno[3] == uip_acc32[3]) {
1749 uip_connr->
snd_nxt[0] = uip_acc32[0];
1750 uip_connr->
snd_nxt[1] = uip_acc32[1];
1751 uip_connr->
snd_nxt[2] = uip_acc32[2];
1752 uip_connr->
snd_nxt[3] = uip_acc32[3];
1755 if(uip_connr->
nrtx == 0) {
1757 m = uip_connr->
rto - uip_connr->
timer;
1759 m = m - (uip_connr->
sa >> 3);
1764 m = m - (uip_connr->
sv >> 2);
1766 uip_connr->
rto = (uip_connr->
sa >> 3) + uip_connr->
sv;
1770 uip_flags = UIP_ACKDATA;
1791 if(uip_flags & UIP_ACKDATA) {
1793 uip_flags = UIP_CONNECTED;
1796 uip_flags |= UIP_NEWDATA;
1804 if((UIP_TCP_BUF->flags & TCP_CTL) == TCP_SYN) {
1805 goto tcp_send_synack;
1814 if((uip_flags & UIP_ACKDATA) &&
1815 (UIP_TCP_BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK)) {
1818 if((UIP_TCP_BUF->tcpoffset & 0xf0) > 0x50) {
1819 for(c = 0; c < ((UIP_TCP_BUF->tcpoffset >> 4) - 5) << 2 ;) {
1821 if(opt == TCP_OPT_END) {
1824 }
else if(opt == TCP_OPT_NOOP) {
1827 }
else if(opt == TCP_OPT_MSS &&
1828 uip_buf[UIP_TCPIP_HLEN +
UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN) {
1830 tmp16 = (uip_buf[UIP_TCPIP_HLEN +
UIP_LLH_LEN + 2 + c] << 8) |
1840 if(uip_buf[UIP_TCPIP_HLEN +
UIP_LLH_LEN + 1 + c] == 0) {
1845 c += uip_buf[UIP_TCPIP_HLEN +
UIP_LLH_LEN + 1 + c];
1850 uip_connr->
rcv_nxt[0] = UIP_TCP_BUF->seqno[0];
1851 uip_connr->
rcv_nxt[1] = UIP_TCP_BUF->seqno[1];
1852 uip_connr->
rcv_nxt[2] = UIP_TCP_BUF->seqno[2];
1853 uip_connr->
rcv_nxt[3] = UIP_TCP_BUF->seqno[3];
1855 uip_flags = UIP_CONNECTED | UIP_NEWDATA;
1863 uip_flags = UIP_ABORT;
1870 case UIP_ESTABLISHED:
1882 if(UIP_TCP_BUF->flags & TCP_FIN && !(uip_connr->
tcpstateflags & UIP_STOPPED)) {
1883 if(uip_outstanding(uip_connr)) {
1887 uip_flags |= UIP_CLOSE;
1889 uip_flags |= UIP_NEWDATA;
1894 uip_connr->
nrtx = 0;
1896 UIP_TCP_BUF->flags = TCP_FIN | TCP_ACK;
1897 goto tcp_send_nodata;
1902 if((UIP_TCP_BUF->flags & TCP_URG) != 0) {
1904 uip_urglen = (UIP_TCP_BUF->urgp[0] << 8) | UIP_TCP_BUF->urgp[1];
1909 uip_add_rcv_nxt(uip_urglen);
1917 uip_len -= (UIP_TCP_BUF->urgp[0] << 8) | UIP_TCP_BUF->urgp[1];
1927 uip_flags |= UIP_NEWDATA;
1943 tmp16 = ((
u16_t)UIP_TCP_BUF->wnd[0] << 8) + (
u16_t)UIP_TCP_BUF->wnd[1];
1948 uip_connr->
mss = tmp16;
1966 if(uip_flags & (UIP_NEWDATA | UIP_ACKDATA)) {
1972 if(uip_flags & UIP_ABORT) {
1975 UIP_TCP_BUF->flags = TCP_RST | TCP_ACK;
1976 goto tcp_send_nodata;
1979 if(uip_flags & UIP_CLOSE) {
1983 uip_connr->
nrtx = 0;
1984 UIP_TCP_BUF->flags = TCP_FIN | TCP_ACK;
1985 goto tcp_send_nodata;
1993 if((uip_flags & UIP_ACKDATA) != 0) {
2000 if(uip_connr->
len == 0) {
2005 if(uip_slen > uip_connr->
mss) {
2006 uip_slen = uip_connr->
mss;
2011 uip_connr->
len = uip_slen;
2017 uip_slen = uip_connr->
len;
2020 uip_connr->
nrtx = 0;
2026 if(uip_slen > 0 && uip_connr->
len > 0) {
2030 UIP_TCP_BUF->flags = TCP_ACK | TCP_PSH;
2032 goto tcp_send_noopts;
2036 if(uip_flags & UIP_NEWDATA) {
2038 UIP_TCP_BUF->flags = TCP_ACK;
2039 goto tcp_send_noopts;
2046 if(uip_flags & UIP_ACKDATA) {
2048 uip_flags = UIP_CLOSE;
2053 case UIP_FIN_WAIT_1:
2060 if(UIP_TCP_BUF->flags & TCP_FIN) {
2061 if(uip_flags & UIP_ACKDATA) {
2063 uip_connr->
timer = 0;
2069 uip_flags = UIP_CLOSE;
2072 }
else if(uip_flags & UIP_ACKDATA) {
2082 case UIP_FIN_WAIT_2:
2086 if(UIP_TCP_BUF->flags & TCP_FIN) {
2088 uip_connr->
timer = 0;
2090 uip_flags = UIP_CLOSE;
2103 if(uip_flags & UIP_ACKDATA) {
2105 uip_connr->
timer = 0;
2113 UIP_TCP_BUF->flags = TCP_ACK;
2119 UIP_TCP_BUF->tcpoffset = (UIP_TCPH_LEN / 4) << 4;
2126 PRINTF(
"In tcp_send\n");
2128 UIP_TCP_BUF->ackno[0] = uip_connr->
rcv_nxt[0];
2129 UIP_TCP_BUF->ackno[1] = uip_connr->
rcv_nxt[1];
2130 UIP_TCP_BUF->ackno[2] = uip_connr->
rcv_nxt[2];
2131 UIP_TCP_BUF->ackno[3] = uip_connr->
rcv_nxt[3];
2133 UIP_TCP_BUF->seqno[0] = uip_connr->
snd_nxt[0];
2134 UIP_TCP_BUF->seqno[1] = uip_connr->
snd_nxt[1];
2135 UIP_TCP_BUF->seqno[2] = uip_connr->
snd_nxt[2];
2136 UIP_TCP_BUF->seqno[3] = uip_connr->
snd_nxt[3];
2140 UIP_TCP_BUF->srcport = uip_connr->
lport;
2141 UIP_TCP_BUF->destport = uip_connr->
rport;
2146 PRINTF(
"Sending TCP packet to");
2155 UIP_TCP_BUF->wnd[0] = UIP_TCP_BUF->wnd[1] = 0;
2166 UIP_TCP_BUF->urgp[0] = UIP_TCP_BUF->urgp[1] = 0;
2169 UIP_TCP_BUF->tcpchksum = 0;
2181 PRINTF(
"Sending packet with length %d (%d)\n",
uip_len,
2204 uip_htonl(u32_t val)
2206 return UIP_HTONL(val);
2213 #define MIN(a,b) ((a) < (b)? (a): (b))
2215 (
int)((
char *)uip_sappdata - (
char *)&uip_buf[
UIP_LLH_LEN + UIP_TCPIP_HLEN]));
2218 if(data != uip_sappdata) {
2219 memcpy(uip_sappdata, (data), uip_slen);