1 /**
2 * @file
3 * Transmission Control Protocol for IP
4 * See also @ref tcp_raw
5 *
6 * @defgroup tcp_raw TCP
7 * @ingroup callbackstyle_api
8 * Transmission Control Protocol for IP\n
9 * @see @ref raw_api and @ref netconn
10 *
11 * Common functions for the TCP implementation, such as functinos
12 * for manipulating the data structures and the TCP timer functions. TCP functions
13 * related to input and output is found in tcp_in.c and tcp_out.c respectively.\n
14 */
15
16 /*
17 * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
18 * All rights reserved.
19 *
20 * Redistribution and use in source and binary forms, with or without modification,
21 * are permitted provided that the following conditions are met:
22 *
23 * 1. Redistributions of source code must retain the above copyright notice,
24 * this list of conditions and the following disclaimer.
25 * 2. Redistributions in binary form must reproduce the above copyright notice,
26 * this list of conditions and the following disclaimer in the documentation
27 * and/or other materials provided with the distribution.
28 * 3. The name of the author may not be used to endorse or promote products
29 * derived from this software without specific prior written permission.
30 *
31 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
32 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
33 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
34 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
35 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
36 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
37 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
38 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
39 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
40 * OF SUCH DAMAGE.
41 *
42 * This file is part of the lwIP TCP/IP stack.
43 *
44 * Author: Adam Dunkels <[email protected]>
45 *
46 */
47
48 #include "lwip/opt.h"
49
50 #if LWIP_TCP /* don't build if not configured for use in lwipopts.h */
51
52 #include "lwip/def.h"
53 #include "lwip/mem.h"
54 #include "lwip/memp.h"
55 #include "lwip/tcp.h"
56 #include "lwip/priv/tcp_priv.h"
57 #include "lwip/debug.h"
58 #include "lwip/stats.h"
59 #include "lwip/ip6.h"
60 #include "lwip/ip6_addr.h"
61 #include "lwip/nd6.h"
62
63 #include <string.h>
64
65 #ifdef LWIP_HOOK_FILENAME
66 #include LWIP_HOOK_FILENAME
67 #endif
68
69 #ifndef TCP_LOCAL_PORT_RANGE_START
70 /* From http://www.iana.org/assignments/port-numbers:
71 "The Dynamic and/or Private Ports are those from 49152 through 65535" */
72 #define TCP_LOCAL_PORT_RANGE_START 0xc000
73 #define TCP_LOCAL_PORT_RANGE_END 0xffff
74 #define TCP_ENSURE_LOCAL_PORT_RANGE(port) ((u16_t)(((port) & ~TCP_LOCAL_PORT_RANGE_START) + TCP_LOCAL_PORT_RANGE_START))
75 #endif
76
77 #if LWIP_TCP_KEEPALIVE
78 #define TCP_KEEP_DUR(pcb) ((pcb)->keep_cnt * (pcb)->keep_intvl)
79 #define TCP_KEEP_INTVL(pcb) ((pcb)->keep_intvl)
80 #else /* LWIP_TCP_KEEPALIVE */
81 #define TCP_KEEP_DUR(pcb) TCP_MAXIDLE
82 #define TCP_KEEP_INTVL(pcb) TCP_KEEPINTVL_DEFAULT
83 #endif /* LWIP_TCP_KEEPALIVE */
84
85 /* As initial send MSS, we use TCP_MSS but limit it to 536. */
86 #if TCP_MSS > 536
87 #define INITIAL_MSS 536
88 #else
89 #define INITIAL_MSS TCP_MSS
90 #endif
91
92 static const char * const tcp_state_str[] = {
93 "CLOSED",
94 "LISTEN",
95 "SYN_SENT",
96 "SYN_RCVD",
97 "ESTABLISHED",
98 "FIN_WAIT_1",
99 "FIN_WAIT_2",
100 "CLOSE_WAIT",
101 "CLOSING",
102 "LAST_ACK",
103 "TIME_WAIT"
104 };
105
106 /* last local TCP port */
107 static u16_t tcp_port = TCP_LOCAL_PORT_RANGE_START;
108
109 /* Incremented every coarse grained timer shot (typically every 500 ms). */
110 u32_t tcp_ticks;
111 static const u8_t tcp_backoff[13] =
112 { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7};
113 /* Times per slowtmr hits */
114 static const u8_t tcp_persist_backoff[7] = { 3, 6, 12, 24, 48, 96, 120 };
115
116 /* The TCP PCB lists. */
117
118 /** List of all TCP PCBs bound but not yet (connected || listening) */
119 struct tcp_pcb *tcp_bound_pcbs;
120 /** List of all TCP PCBs in LISTEN state */
121 union tcp_listen_pcbs_t tcp_listen_pcbs;
122 /** List of all TCP PCBs that are in a state in which
123 * they accept or send data. */
124 struct tcp_pcb *tcp_active_pcbs;
125 /** List of all TCP PCBs in TIME-WAIT state */
126 struct tcp_pcb *tcp_tw_pcbs;
127
128 /** An array with all (non-temporary) PCB lists, mainly used for smaller code size */
129 struct tcp_pcb ** const tcp_pcb_lists[] = {&tcp_listen_pcbs.pcbs, &tcp_bound_pcbs,
130 &tcp_active_pcbs, &tcp_tw_pcbs};
131
132 u8_t tcp_active_pcbs_changed;
133
134 /** Timer counter to handle calling slow-timer from tcp_tmr() */
135 static u8_t tcp_timer;
136 static u8_t tcp_timer_ctr;
137 static u16_t tcp_new_port(void);
138
139 static err_t tcp_close_shutdown_fin(struct tcp_pcb *pcb);
140
141 /**
142 * Initialize this module.
143 */
144 void
tcp_init(void)145 tcp_init(void)
146 {
147 #if LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND)
148 tcp_port = TCP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND());
149 #endif /* LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) */
150 }
151
152 /**
153 * Called periodically to dispatch TCP timers.
154 */
155 void
tcp_tmr(void)156 tcp_tmr(void)
157 {
158 /* Call tcp_fasttmr() every 250 ms */
159 tcp_fasttmr();
160
161 if (++tcp_timer & 1) {
162 /* Call tcp_slowtmr() every 500 ms, i.e., every other timer
163 tcp_tmr() is called. */
164 tcp_slowtmr();
165 }
166 }
167
168 #if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG
169 /** Called when a listen pcb is closed. Iterates one pcb list and removes the
170 * closed listener pcb from pcb->listener if matching.
171 */
172 static void
tcp_remove_listener(struct tcp_pcb * list,struct tcp_pcb_listen * lpcb)173 tcp_remove_listener(struct tcp_pcb *list, struct tcp_pcb_listen *lpcb)
174 {
175 struct tcp_pcb *pcb;
176 for (pcb = list; pcb != NULL; pcb = pcb->next) {
177 if (pcb->listener == lpcb) {
178 pcb->listener = NULL;
179 }
180 }
181 }
182 #endif
183
184 /** Called when a listen pcb is closed. Iterates all pcb lists and removes the
185 * closed listener pcb from pcb->listener if matching.
186 */
187 static void
tcp_listen_closed(struct tcp_pcb * pcb)188 tcp_listen_closed(struct tcp_pcb *pcb)
189 {
190 #if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG
191 size_t i;
192 LWIP_ASSERT("pcb != NULL", pcb != NULL);
193 LWIP_ASSERT("pcb->state == LISTEN", pcb->state == LISTEN);
194 for (i = 1; i < LWIP_ARRAYSIZE(tcp_pcb_lists); i++) {
195 tcp_remove_listener(*tcp_pcb_lists[i], (struct tcp_pcb_listen*)pcb);
196 }
197 #endif
198 LWIP_UNUSED_ARG(pcb);
199 }
200
201 #if TCP_LISTEN_BACKLOG
202 /** @ingroup tcp_raw
203 * Delay accepting a connection in respect to the listen backlog:
204 * the number of outstanding connections is increased until
205 * tcp_backlog_accepted() is called.
206 *
207 * ATTENTION: the caller is responsible for calling tcp_backlog_accepted()
208 * or else the backlog feature will get out of sync!
209 *
210 * @param pcb the connection pcb which is not fully accepted yet
211 */
212 void
tcp_backlog_delayed(struct tcp_pcb * pcb)213 tcp_backlog_delayed(struct tcp_pcb* pcb)
214 {
215 LWIP_ASSERT("pcb != NULL", pcb != NULL);
216 if ((pcb->flags & TF_BACKLOGPEND) == 0) {
217 if (pcb->listener != NULL) {
218 pcb->listener->accepts_pending++;
219 LWIP_ASSERT("accepts_pending != 0", pcb->listener->accepts_pending != 0);
220 pcb->flags |= TF_BACKLOGPEND;
221 }
222 }
223 }
224
225 /** @ingroup tcp_raw
226 * A delayed-accept a connection is accepted (or closed/aborted): decreases
227 * the number of outstanding connections after calling tcp_backlog_delayed().
228 *
229 * ATTENTION: the caller is responsible for calling tcp_backlog_accepted()
230 * or else the backlog feature will get out of sync!
231 *
232 * @param pcb the connection pcb which is now fully accepted (or closed/aborted)
233 */
234 void
tcp_backlog_accepted(struct tcp_pcb * pcb)235 tcp_backlog_accepted(struct tcp_pcb* pcb)
236 {
237 LWIP_ASSERT("pcb != NULL", pcb != NULL);
238 if ((pcb->flags & TF_BACKLOGPEND) != 0) {
239 if (pcb->listener != NULL) {
240 LWIP_ASSERT("accepts_pending != 0", pcb->listener->accepts_pending != 0);
241 pcb->listener->accepts_pending--;
242 pcb->flags &= ~TF_BACKLOGPEND;
243 }
244 }
245 }
246 #endif /* TCP_LISTEN_BACKLOG */
247
248 /**
249 * Closes the TX side of a connection held by the PCB.
250 * For tcp_close(), a RST is sent if the application didn't receive all data
251 * (tcp_recved() not called for all data passed to recv callback).
252 *
253 * Listening pcbs are freed and may not be referenced any more.
254 * Connection pcbs are freed if not yet connected and may not be referenced
255 * any more. If a connection is established (at least SYN received or in
256 * a closing state), the connection is closed, and put in a closing state.
257 * The pcb is then automatically freed in tcp_slowtmr(). It is therefore
258 * unsafe to reference it.
259 *
260 * @param pcb the tcp_pcb to close
261 * @return ERR_OK if connection has been closed
262 * another err_t if closing failed and pcb is not freed
263 */
264 static err_t
tcp_close_shutdown(struct tcp_pcb * pcb,u8_t rst_on_unacked_data)265 tcp_close_shutdown(struct tcp_pcb *pcb, u8_t rst_on_unacked_data)
266 {
267 if (rst_on_unacked_data && ((pcb->state == ESTABLISHED) || (pcb->state == CLOSE_WAIT))) {
268 if ((pcb->refused_data != NULL) || (pcb->rcv_wnd != TCP_WND_MAX(pcb))) {
269 /* Not all data received by application, send RST to tell the remote
270 side about this. */
271 LWIP_ASSERT("pcb->flags & TF_RXCLOSED", pcb->flags & TF_RXCLOSED);
272
273 /* don't call tcp_abort here: we must not deallocate the pcb since
274 that might not be expected when calling tcp_close */
275 tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
276 pcb->local_port, pcb->remote_port);
277
278 tcp_pcb_purge(pcb);
279 TCP_RMV_ACTIVE(pcb);
280 if (pcb->state == ESTABLISHED) {
281 /* move to TIME_WAIT since we close actively */
282 pcb->state = TIME_WAIT;
283 TCP_REG(&tcp_tw_pcbs, pcb);
284 } else {
285 /* CLOSE_WAIT: deallocate the pcb since we already sent a RST for it */
286 if (tcp_input_pcb == pcb) {
287 /* prevent using a deallocated pcb: free it from tcp_input later */
288 tcp_trigger_input_pcb_close();
289 } else {
290 memp_free(MEMP_TCP_PCB, pcb);
291 }
292 }
293 return ERR_OK;
294 }
295 }
296
297 /* - states which free the pcb are handled here,
298 - states which send FIN and change state are handled in tcp_close_shutdown_fin() */
299 switch (pcb->state) {
300 case CLOSED:
301 /* Closing a pcb in the CLOSED state might seem erroneous,
302 * however, it is in this state once allocated and as yet unused
303 * and the user needs some way to free it should the need arise.
304 * Calling tcp_close() with a pcb that has already been closed, (i.e. twice)
305 * or for a pcb that has been used and then entered the CLOSED state
306 * is erroneous, but this should never happen as the pcb has in those cases
307 * been freed, and so any remaining handles are bogus. */
308 if (pcb->local_port != 0) {
309 TCP_RMV(&tcp_bound_pcbs, pcb);
310 }
311 memp_free(MEMP_TCP_PCB, pcb);
312 break;
313 case LISTEN:
314 tcp_listen_closed(pcb);
315 tcp_pcb_remove(&tcp_listen_pcbs.pcbs, pcb);
316 memp_free(MEMP_TCP_PCB_LISTEN, pcb);
317 break;
318 case SYN_SENT:
319 TCP_PCB_REMOVE_ACTIVE(pcb);
320 memp_free(MEMP_TCP_PCB, pcb);
321 MIB2_STATS_INC(mib2.tcpattemptfails);
322 break;
323 default:
324 return tcp_close_shutdown_fin(pcb);
325 }
326 return ERR_OK;
327 }
328
329 static err_t
tcp_close_shutdown_fin(struct tcp_pcb * pcb)330 tcp_close_shutdown_fin(struct tcp_pcb *pcb)
331 {
332 err_t err;
333 LWIP_ASSERT("pcb != NULL", pcb != NULL);
334
335 switch (pcb->state) {
336 case SYN_RCVD:
337 err = tcp_send_fin(pcb);
338 if (err == ERR_OK) {
339 tcp_backlog_accepted(pcb);
340 MIB2_STATS_INC(mib2.tcpattemptfails);
341 pcb->state = FIN_WAIT_1;
342 }
343 break;
344 case ESTABLISHED:
345 err = tcp_send_fin(pcb);
346 if (err == ERR_OK) {
347 MIB2_STATS_INC(mib2.tcpestabresets);
348 pcb->state = FIN_WAIT_1;
349 }
350 break;
351 case CLOSE_WAIT:
352 err = tcp_send_fin(pcb);
353 if (err == ERR_OK) {
354 MIB2_STATS_INC(mib2.tcpestabresets);
355 pcb->state = LAST_ACK;
356 }
357 break;
358 default:
359 /* Has already been closed, do nothing. */
360 return ERR_OK;
361 break;
362 }
363
364 if (err == ERR_OK) {
365 /* To ensure all data has been sent when tcp_close returns, we have
366 to make sure tcp_output doesn't fail.
367 Since we don't really have to ensure all data has been sent when tcp_close
368 returns (unsent data is sent from tcp timer functions, also), we don't care
369 for the return value of tcp_output for now. */
370 tcp_output(pcb);
371 } else if (err == ERR_MEM) {
372 /* Mark this pcb for closing. Closing is retried from tcp_tmr. */
373 pcb->flags |= TF_CLOSEPEND;
374 }
375 return err;
376 }
377
378 /**
379 * @ingroup tcp_raw
380 * Closes the connection held by the PCB.
381 *
382 * Listening pcbs are freed and may not be referenced any more.
383 * Connection pcbs are freed if not yet connected and may not be referenced
384 * any more. If a connection is established (at least SYN received or in
385 * a closing state), the connection is closed, and put in a closing state.
386 * The pcb is then automatically freed in tcp_slowtmr(). It is therefore
387 * unsafe to reference it (unless an error is returned).
388 *
389 * @param pcb the tcp_pcb to close
390 * @return ERR_OK if connection has been closed
391 * another err_t if closing failed and pcb is not freed
392 */
393 err_t
tcp_close(struct tcp_pcb * pcb)394 tcp_close(struct tcp_pcb *pcb)
395 {
396 LWIP_DEBUGF(TCP_DEBUG, ("tcp_close: closing in "));
397 tcp_debug_print_state(pcb->state);
398
399 if (pcb->state != LISTEN) {
400 /* Set a flag not to receive any more data... */
401 pcb->flags |= TF_RXCLOSED;
402 }
403 /* ... and close */
404 return tcp_close_shutdown(pcb, 1);
405 }
406
407 /**
408 * @ingroup tcp_raw
409 * Causes all or part of a full-duplex connection of this PCB to be shut down.
410 * This doesn't deallocate the PCB unless shutting down both sides!
411 * Shutting down both sides is the same as calling tcp_close, so if it succeds,
412 * the PCB should not be referenced any more.
413 *
414 * @param pcb PCB to shutdown
415 * @param shut_rx shut down receive side if this is != 0
416 * @param shut_tx shut down send side if this is != 0
417 * @return ERR_OK if shutdown succeeded (or the PCB has already been shut down)
418 * another err_t on error.
419 */
420 err_t
tcp_shutdown(struct tcp_pcb * pcb,int shut_rx,int shut_tx)421 tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx)
422 {
423 if (pcb->state == LISTEN) {
424 return ERR_CONN;
425 }
426 if (shut_rx) {
427 /* shut down the receive side: set a flag not to receive any more data... */
428 pcb->flags |= TF_RXCLOSED;
429 if (shut_tx) {
430 /* shutting down the tx AND rx side is the same as closing for the raw API */
431 return tcp_close_shutdown(pcb, 1);
432 }
433 /* ... and free buffered data */
434 if (pcb->refused_data != NULL) {
435 pbuf_free(pcb->refused_data);
436 pcb->refused_data = NULL;
437 }
438 }
439 if (shut_tx) {
440 /* This can't happen twice since if it succeeds, the pcb's state is changed.
441 Only close in these states as the others directly deallocate the PCB */
442 switch (pcb->state) {
443 case SYN_RCVD:
444 case ESTABLISHED:
445 case CLOSE_WAIT:
446 return tcp_close_shutdown(pcb, (u8_t)shut_rx);
447 default:
448 /* Not (yet?) connected, cannot shutdown the TX side as that would bring us
449 into CLOSED state, where the PCB is deallocated. */
450 return ERR_CONN;
451 }
452 }
453 return ERR_OK;
454 }
455
456 /**
457 * Abandons a connection and optionally sends a RST to the remote
458 * host. Deletes the local protocol control block. This is done when
459 * a connection is killed because of shortage of memory.
460 *
461 * @param pcb the tcp_pcb to abort
462 * @param reset boolean to indicate whether a reset should be sent
463 */
464 void
tcp_abandon(struct tcp_pcb * pcb,int reset)465 tcp_abandon(struct tcp_pcb *pcb, int reset)
466 {
467 u32_t seqno, ackno;
468 #if LWIP_CALLBACK_API
469 tcp_err_fn errf;
470 #endif /* LWIP_CALLBACK_API */
471 void *errf_arg;
472
473 /* pcb->state LISTEN not allowed here */
474 LWIP_ASSERT("don't call tcp_abort/tcp_abandon for listen-pcbs",
475 pcb->state != LISTEN);
476 /* Figure out on which TCP PCB list we are, and remove us. If we
477 are in an active state, call the receive function associated with
478 the PCB with a NULL argument, and send an RST to the remote end. */
479 if (pcb->state == TIME_WAIT) {
480 tcp_pcb_remove(&tcp_tw_pcbs, pcb);
481 memp_free(MEMP_TCP_PCB, pcb);
482 } else {
483 int send_rst = 0;
484 u16_t local_port = 0;
485 enum tcp_state last_state;
486 seqno = pcb->snd_nxt;
487 ackno = pcb->rcv_nxt;
488 #if LWIP_CALLBACK_API
489 errf = pcb->errf;
490 #endif /* LWIP_CALLBACK_API */
491 errf_arg = pcb->callback_arg;
492 if (pcb->state == CLOSED) {
493 if (pcb->local_port != 0) {
494 /* bound, not yet opened */
495 TCP_RMV(&tcp_bound_pcbs, pcb);
496 }
497 } else {
498 send_rst = reset;
499 local_port = pcb->local_port;
500 TCP_PCB_REMOVE_ACTIVE(pcb);
501 }
502 if (pcb->unacked != NULL) {
503 tcp_segs_free(pcb->unacked);
504 }
505 if (pcb->unsent != NULL) {
506 tcp_segs_free(pcb->unsent);
507 }
508 #if TCP_QUEUE_OOSEQ
509 if (pcb->ooseq != NULL) {
510 tcp_segs_free(pcb->ooseq);
511 }
512 #endif /* TCP_QUEUE_OOSEQ */
513 tcp_backlog_accepted(pcb);
514 if (send_rst) {
515 LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_abandon: sending RST\n"));
516 tcp_rst(seqno, ackno, &pcb->local_ip, &pcb->remote_ip, local_port, pcb->remote_port);
517 }
518 last_state = pcb->state;
519 memp_free(MEMP_TCP_PCB, pcb);
520 TCP_EVENT_ERR(last_state, errf, errf_arg, ERR_ABRT);
521 }
522 }
523
524 /**
525 * @ingroup tcp_raw
526 * Aborts the connection by sending a RST (reset) segment to the remote
527 * host. The pcb is deallocated. This function never fails.
528 *
529 * ATTENTION: When calling this from one of the TCP callbacks, make
530 * sure you always return ERR_ABRT (and never return ERR_ABRT otherwise
531 * or you will risk accessing deallocated memory or memory leaks!
532 *
533 * @param pcb the tcp pcb to abort
534 */
535 void
tcp_abort(struct tcp_pcb * pcb)536 tcp_abort(struct tcp_pcb *pcb)
537 {
538 tcp_abandon(pcb, 1);
539 }
540
541 /**
542 * @ingroup tcp_raw
543 * Binds the connection to a local port number and IP address. If the
544 * IP address is not given (i.e., ipaddr == NULL), the IP address of
545 * the outgoing network interface is used instead.
546 *
547 * @param pcb the tcp_pcb to bind (no check is done whether this pcb is
548 * already bound!)
549 * @param ipaddr the local ip address to bind to (use IP4_ADDR_ANY to bind
550 * to any local address
551 * @param port the local port to bind to
552 * @return ERR_USE if the port is already in use
553 * ERR_VAL if bind failed because the PCB is not in a valid state
554 * ERR_OK if bound
555 */
556 err_t
tcp_bind(struct tcp_pcb * pcb,const ip_addr_t * ipaddr,u16_t port)557 tcp_bind(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port)
558 {
559 int i;
560 int max_pcb_list = NUM_TCP_PCB_LISTS;
561 struct tcp_pcb *cpcb;
562
563 #if LWIP_IPV4
564 /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */
565 if (ipaddr == NULL) {
566 ipaddr = IP4_ADDR_ANY;
567 }
568 #endif /* LWIP_IPV4 */
569
570 /* still need to check for ipaddr == NULL in IPv6 only case */
571 if ((pcb == NULL) || (ipaddr == NULL)) {
572 return ERR_VAL;
573 }
574
575 LWIP_ERROR("tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_VAL);
576
577 #if SO_REUSE
578 /* Unless the REUSEADDR flag is set,
579 we have to check the pcbs in TIME-WAIT state, also.
580 We do not dump TIME_WAIT pcb's; they can still be matched by incoming
581 packets using both local and remote IP addresses and ports to distinguish.
582 */
583 if (ip_get_option(pcb, SOF_REUSEADDR)) {
584 max_pcb_list = NUM_TCP_PCB_LISTS_NO_TIME_WAIT;
585 }
586 #endif /* SO_REUSE */
587
588 if (port == 0) {
589 port = tcp_new_port();
590 if (port == 0) {
591 return ERR_BUF;
592 }
593 } else {
594 /* Check if the address already is in use (on all lists) */
595 for (i = 0; i < max_pcb_list; i++) {
596 for (cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) {
597 if (cpcb->local_port == port) {
598 #if SO_REUSE
599 /* Omit checking for the same port if both pcbs have REUSEADDR set.
600 For SO_REUSEADDR, the duplicate-check for a 5-tuple is done in
601 tcp_connect. */
602 if (!ip_get_option(pcb, SOF_REUSEADDR) ||
603 !ip_get_option(cpcb, SOF_REUSEADDR))
604 #endif /* SO_REUSE */
605 {
606 /* @todo: check accept_any_ip_version */
607 if ((IP_IS_V6(ipaddr) == IP_IS_V6_VAL(cpcb->local_ip)) &&
608 (ip_addr_isany(&cpcb->local_ip) ||
609 ip_addr_isany(ipaddr) ||
610 ip_addr_cmp(&cpcb->local_ip, ipaddr))) {
611 return ERR_USE;
612 }
613 }
614 }
615 }
616 }
617 }
618
619 if (!ip_addr_isany(ipaddr)) {
620 ip_addr_set(&pcb->local_ip, ipaddr);
621 }
622 pcb->local_port = port;
623 TCP_REG(&tcp_bound_pcbs, pcb);
624 LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %"U16_F"\n", port));
625 return ERR_OK;
626 }
627 #if LWIP_CALLBACK_API
628 /**
629 * Default accept callback if no accept callback is specified by the user.
630 */
631 static err_t
tcp_accept_null(void * arg,struct tcp_pcb * pcb,err_t err)632 tcp_accept_null(void *arg, struct tcp_pcb *pcb, err_t err)
633 {
634 LWIP_UNUSED_ARG(arg);
635 LWIP_UNUSED_ARG(err);
636
637 tcp_abort(pcb);
638
639 return ERR_ABRT;
640 }
641 #endif /* LWIP_CALLBACK_API */
642
643 /**
644 * @ingroup tcp_raw
645 * Set the state of the connection to be LISTEN, which means that it
646 * is able to accept incoming connections. The protocol control block
647 * is reallocated in order to consume less memory. Setting the
648 * connection to LISTEN is an irreversible process.
649 *
650 * @param pcb the original tcp_pcb
651 * @param backlog the incoming connections queue limit
652 * @return tcp_pcb used for listening, consumes less memory.
653 *
654 * @note The original tcp_pcb is freed. This function therefore has to be
655 * called like this:
656 * tpcb = tcp_listen_with_backlog(tpcb, backlog);
657 */
658 struct tcp_pcb *
tcp_listen_with_backlog(struct tcp_pcb * pcb,u8_t backlog)659 tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)
660 {
661 return tcp_listen_with_backlog_and_err(pcb, backlog, NULL);
662 }
663
664 /**
665 * @ingroup tcp_raw
666 * Set the state of the connection to be LISTEN, which means that it
667 * is able to accept incoming connections. The protocol control block
668 * is reallocated in order to consume less memory. Setting the
669 * connection to LISTEN is an irreversible process.
670 *
671 * @param pcb the original tcp_pcb
672 * @param backlog the incoming connections queue limit
673 * @param err when NULL is returned, this contains the error reason
674 * @return tcp_pcb used for listening, consumes less memory.
675 *
676 * @note The original tcp_pcb is freed. This function therefore has to be
677 * called like this:
678 * tpcb = tcp_listen_with_backlog_and_err(tpcb, backlog, &err);
679 */
680 struct tcp_pcb *
tcp_listen_with_backlog_and_err(struct tcp_pcb * pcb,u8_t backlog,err_t * err)681 tcp_listen_with_backlog_and_err(struct tcp_pcb *pcb, u8_t backlog, err_t *err)
682 {
683 struct tcp_pcb_listen *lpcb = NULL;
684 err_t res;
685
686 LWIP_UNUSED_ARG(backlog);
687 LWIP_ERROR("tcp_listen: pcb already connected", pcb->state == CLOSED, res = ERR_CLSD; goto done);
688
689 /* already listening? */
690 if (pcb->state == LISTEN) {
691 lpcb = (struct tcp_pcb_listen*)pcb;
692 res = ERR_ALREADY;
693 goto done;
694 }
695 #if SO_REUSE
696 if (ip_get_option(pcb, SOF_REUSEADDR)) {
697 /* Since SOF_REUSEADDR allows reusing a local address before the pcb's usage
698 is declared (listen-/connection-pcb), we have to make sure now that
699 this port is only used once for every local IP. */
700 for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
701 if ((lpcb->local_port == pcb->local_port) &&
702 ip_addr_cmp(&lpcb->local_ip, &pcb->local_ip)) {
703 /* this address/port is already used */
704 lpcb = NULL;
705 res = ERR_USE;
706 goto done;
707 }
708 }
709 }
710 #endif /* SO_REUSE */
711 lpcb = (struct tcp_pcb_listen *)memp_malloc(MEMP_TCP_PCB_LISTEN);
712 if (lpcb == NULL) {
713 res = ERR_MEM;
714 goto done;
715 }
716 lpcb->callback_arg = pcb->callback_arg;
717 lpcb->local_port = pcb->local_port;
718 lpcb->state = LISTEN;
719 lpcb->prio = pcb->prio;
720 lpcb->so_options = pcb->so_options;
721 lpcb->ttl = pcb->ttl;
722 lpcb->tos = pcb->tos;
723 #if LWIP_IPV4 && LWIP_IPV6
724 IP_SET_TYPE_VAL(lpcb->remote_ip, pcb->local_ip.type);
725 #endif /* LWIP_IPV4 && LWIP_IPV6 */
726 ip_addr_copy(lpcb->local_ip, pcb->local_ip);
727 if (pcb->local_port != 0) {
728 TCP_RMV(&tcp_bound_pcbs, pcb);
729 }
730 memp_free(MEMP_TCP_PCB, pcb);
731 #if LWIP_CALLBACK_API
732 lpcb->accept = tcp_accept_null;
733 #endif /* LWIP_CALLBACK_API */
734 #if TCP_LISTEN_BACKLOG
735 lpcb->accepts_pending = 0;
736 tcp_backlog_set(lpcb, backlog);
737 #endif /* TCP_LISTEN_BACKLOG */
738 TCP_REG(&tcp_listen_pcbs.pcbs, (struct tcp_pcb *)lpcb);
739 res = ERR_OK;
740 done:
741 if (err != NULL) {
742 *err = res;
743 }
744 return (struct tcp_pcb *)lpcb;
745 }
746
747 /**
748 * Update the state that tracks the available window space to advertise.
749 *
750 * Returns how much extra window would be advertised if we sent an
751 * update now.
752 */
753 u32_t
tcp_update_rcv_ann_wnd(struct tcp_pcb * pcb)754 tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
755 {
756 u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
757
758 if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) {
759 /* we can advertise more window */
760 pcb->rcv_ann_wnd = pcb->rcv_wnd;
761 return new_right_edge - pcb->rcv_ann_right_edge;
762 } else {
763 if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) {
764 /* Can happen due to other end sending out of advertised window,
765 * but within actual available (but not yet advertised) window */
766 pcb->rcv_ann_wnd = 0;
767 } else {
768 /* keep the right edge of window constant */
769 u32_t new_rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt;
770 #if !LWIP_WND_SCALE
771 LWIP_ASSERT("new_rcv_ann_wnd <= 0xffff", new_rcv_ann_wnd <= 0xffff);
772 #endif
773 pcb->rcv_ann_wnd = (tcpwnd_size_t)new_rcv_ann_wnd;
774 }
775 return 0;
776 }
777 }
778
779 /**
780 * @ingroup tcp_raw
781 * This function should be called by the application when it has
782 * processed the data. The purpose is to advertise a larger window
783 * when the data has been processed.
784 *
785 * @param pcb the tcp_pcb for which data is read
786 * @param len the amount of bytes that have been read by the application
787 */
788 void
tcp_recved(struct tcp_pcb * pcb,u16_t len)789 tcp_recved(struct tcp_pcb *pcb, u16_t len)
790 {
791 int wnd_inflation;
792
793 /* pcb->state LISTEN not allowed here */
794 LWIP_ASSERT("don't call tcp_recved for listen-pcbs",
795 pcb->state != LISTEN);
796
797 pcb->rcv_wnd += len;
798 if (pcb->rcv_wnd > TCP_WND_MAX(pcb)) {
799 pcb->rcv_wnd = TCP_WND_MAX(pcb);
800 } else if (pcb->rcv_wnd == 0) {
801 /* rcv_wnd overflowed */
802 if ((pcb->state == CLOSE_WAIT) || (pcb->state == LAST_ACK)) {
803 /* In passive close, we allow this, since the FIN bit is added to rcv_wnd
804 by the stack itself, since it is not mandatory for an application
805 to call tcp_recved() for the FIN bit, but e.g. the netconn API does so. */
806 pcb->rcv_wnd = TCP_WND_MAX(pcb);
807 } else {
808 LWIP_ASSERT("tcp_recved: len wrapped rcv_wnd\n", 0);
809 }
810 }
811
812 wnd_inflation = tcp_update_rcv_ann_wnd(pcb);
813
814 /* If the change in the right edge of window is significant (default
815 * watermark is TCP_WND/4), then send an explicit update now.
816 * Otherwise wait for a packet to be sent in the normal course of
817 * events (or more window to be available later) */
818 if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) {
819 tcp_ack_now(pcb);
820 tcp_output(pcb);
821 }
822
823 LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: received %"U16_F" bytes, wnd %"TCPWNDSIZE_F" (%"TCPWNDSIZE_F").\n",
824 len, pcb->rcv_wnd, (u16_t)(TCP_WND_MAX(pcb) - pcb->rcv_wnd)));
825 }
826
827 /**
828 * Allocate a new local TCP port.
829 *
830 * @return a new (free) local TCP port number
831 */
832 static u16_t
tcp_new_port(void)833 tcp_new_port(void)
834 {
835 u8_t i;
836 u16_t n = 0;
837 struct tcp_pcb *pcb;
838
839 again:
840 if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) {
841 tcp_port = TCP_LOCAL_PORT_RANGE_START;
842 }
843 /* Check all PCB lists. */
844 for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {
845 for (pcb = *tcp_pcb_lists[i]; pcb != NULL; pcb = pcb->next) {
846 if (pcb->local_port == tcp_port) {
847 if (++n > (TCP_LOCAL_PORT_RANGE_END - TCP_LOCAL_PORT_RANGE_START)) {
848 return 0;
849 }
850 goto again;
851 }
852 }
853 }
854 return tcp_port;
855 }
856
857 /**
858 * @ingroup tcp_raw
859 * Connects to another host. The function given as the "connected"
860 * argument will be called when the connection has been established.
861 *
862 * @param pcb the tcp_pcb used to establish the connection
863 * @param ipaddr the remote ip address to connect to
864 * @param port the remote tcp port to connect to
865 * @param connected callback function to call when connected (on error,
866 the err calback will be called)
867 * @return ERR_VAL if invalid arguments are given
868 * ERR_OK if connect request has been sent
869 * other err_t values if connect request couldn't be sent
870 */
871 err_t
tcp_connect(struct tcp_pcb * pcb,const ip_addr_t * ipaddr,u16_t port,tcp_connected_fn connected)872 tcp_connect(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port,
873 tcp_connected_fn connected)
874 {
875 err_t ret;
876 u32_t iss;
877 u16_t old_local_port;
878
879 if ((pcb == NULL) || (ipaddr == NULL)) {
880 return ERR_VAL;
881 }
882
883 LWIP_ERROR("tcp_connect: can only connect from state CLOSED", pcb->state == CLOSED, return ERR_ISCONN);
884
885 LWIP_DEBUGF(TCP_DEBUG, ("tcp_connect to port %"U16_F"\n", port));
886 ip_addr_set(&pcb->remote_ip, ipaddr);
887 pcb->remote_port = port;
888
889 /* check if we have a route to the remote host */
890 if (ip_addr_isany(&pcb->local_ip)) {
891 /* no local IP address set, yet. */
892 struct netif *netif;
893 const ip_addr_t *local_ip;
894 ip_route_get_local_ip(&pcb->local_ip, &pcb->remote_ip, netif, local_ip);
895 if ((netif == NULL) || (local_ip == NULL)) {
896 /* Don't even try to send a SYN packet if we have no route
897 since that will fail. */
898 return ERR_RTE;
899 }
900 /* Use the address as local address of the pcb. */
901 ip_addr_copy(pcb->local_ip, *local_ip);
902 }
903
904 old_local_port = pcb->local_port;
905 if (pcb->local_port == 0) {
906 pcb->local_port = tcp_new_port();
907 if (pcb->local_port == 0) {
908 return ERR_BUF;
909 }
910 } else {
911 #if SO_REUSE
912 if (ip_get_option(pcb, SOF_REUSEADDR)) {
913 /* Since SOF_REUSEADDR allows reusing a local address, we have to make sure
914 now that the 5-tuple is unique. */
915 struct tcp_pcb *cpcb;
916 int i;
917 /* Don't check listen- and bound-PCBs, check active- and TIME-WAIT PCBs. */
918 for (i = 2; i < NUM_TCP_PCB_LISTS; i++) {
919 for (cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) {
920 if ((cpcb->local_port == pcb->local_port) &&
921 (cpcb->remote_port == port) &&
922 ip_addr_cmp(&cpcb->local_ip, &pcb->local_ip) &&
923 ip_addr_cmp(&cpcb->remote_ip, ipaddr)) {
924 /* linux returns EISCONN here, but ERR_USE should be OK for us */
925 return ERR_USE;
926 }
927 }
928 }
929 }
930 #endif /* SO_REUSE */
931 }
932
933 iss = tcp_next_iss(pcb);
934 pcb->rcv_nxt = 0;
935 pcb->snd_nxt = iss;
936 pcb->lastack = iss - 1;
937 pcb->snd_wl2 = iss - 1;
938 pcb->snd_lbb = iss - 1;
939 /* Start with a window that does not need scaling. When window scaling is
940 enabled and used, the window is enlarged when both sides agree on scaling. */
941 pcb->rcv_wnd = pcb->rcv_ann_wnd = TCPWND_MIN16(TCP_WND);
942 pcb->rcv_ann_right_edge = pcb->rcv_nxt;
943 pcb->snd_wnd = TCP_WND;
944 /* As initial send MSS, we use TCP_MSS but limit it to 536.
945 The send MSS is updated when an MSS option is received. */
946 pcb->mss = INITIAL_MSS;
947 #if TCP_CALCULATE_EFF_SEND_MSS
948 pcb->mss = tcp_eff_send_mss(pcb->mss, &pcb->local_ip, &pcb->remote_ip);
949 #endif /* TCP_CALCULATE_EFF_SEND_MSS */
950 pcb->cwnd = 1;
951 #if LWIP_CALLBACK_API
952 pcb->connected = connected;
953 #else /* LWIP_CALLBACK_API */
954 LWIP_UNUSED_ARG(connected);
955 #endif /* LWIP_CALLBACK_API */
956
957 /* Send a SYN together with the MSS option. */
958 ret = tcp_enqueue_flags(pcb, TCP_SYN);
959 if (ret == ERR_OK) {
960 /* SYN segment was enqueued, changed the pcbs state now */
961 pcb->state = SYN_SENT;
962 if (old_local_port != 0) {
963 TCP_RMV(&tcp_bound_pcbs, pcb);
964 }
965 TCP_REG_ACTIVE(pcb);
966 MIB2_STATS_INC(mib2.tcpactiveopens);
967
968 tcp_output(pcb);
969 }
970 return ret;
971 }
972
973 /**
974 * Called every 500 ms and implements the retransmission timer and the timer that
975 * removes PCBs that have been in TIME-WAIT for enough time. It also increments
976 * various timers such as the inactivity timer in each PCB.
977 *
978 * Automatically called from tcp_tmr().
979 */
980 void
tcp_slowtmr(void)981 tcp_slowtmr(void)
982 {
983 struct tcp_pcb *pcb, *prev;
984 tcpwnd_size_t eff_wnd;
985 u8_t pcb_remove; /* flag if a PCB should be removed */
986 u8_t pcb_reset; /* flag if a RST should be sent when removing */
987 err_t err;
988
989 err = ERR_OK;
990
991 ++tcp_ticks;
992 ++tcp_timer_ctr;
993
994 tcp_slowtmr_start:
995 /* Steps through all of the active PCBs. */
996 prev = NULL;
997 pcb = tcp_active_pcbs;
998 if (pcb == NULL) {
999 LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs\n"));
1000 }
1001 while (pcb != NULL) {
1002 LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb\n"));
1003 LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED);
1004 LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN);
1005 LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT);
1006 if (pcb->last_timer == tcp_timer_ctr) {
1007 /* skip this pcb, we have already processed it */
1008 pcb = pcb->next;
1009 continue;
1010 }
1011 pcb->last_timer = tcp_timer_ctr;
1012
1013 pcb_remove = 0;
1014 pcb_reset = 0;
1015
1016 if (pcb->state == SYN_SENT && pcb->nrtx >= TCP_SYNMAXRTX) {
1017 ++pcb_remove;
1018 LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max SYN retries reached\n"));
1019 }
1020 else if (pcb->nrtx >= TCP_MAXRTX) {
1021 ++pcb_remove;
1022 LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
1023 } else {
1024 if (pcb->persist_backoff > 0) {
1025 /* If snd_wnd is zero, use persist timer to send 1 byte probes
1026 * instead of using the standard retransmission mechanism. */
1027 u8_t backoff_cnt = tcp_persist_backoff[pcb->persist_backoff-1];
1028 if (pcb->persist_cnt < backoff_cnt) {
1029 pcb->persist_cnt++;
1030 }
1031 if (pcb->persist_cnt >= backoff_cnt) {
1032 if (tcp_zero_window_probe(pcb) == ERR_OK) {
1033 pcb->persist_cnt = 0;
1034 if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) {
1035 pcb->persist_backoff++;
1036 }
1037 }
1038 }
1039 } else {
1040 /* Increase the retransmission timer if it is running */
1041 if (pcb->rtime >= 0) {
1042 ++pcb->rtime;
1043 }
1044
1045 if (pcb->unacked != NULL && pcb->rtime >= pcb->rto) {
1046 /* Time for a retransmission. */
1047 LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_slowtmr: rtime %"S16_F
1048 " pcb->rto %"S16_F"\n",
1049 pcb->rtime, pcb->rto));
1050
1051 /* Double retransmission time-out unless we are trying to
1052 * connect to somebody (i.e., we are in SYN_SENT). */
1053 if (pcb->state != SYN_SENT) {
1054 u8_t backoff_idx = LWIP_MIN(pcb->nrtx, sizeof(tcp_backoff)-1);
1055 pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[backoff_idx];
1056 }
1057
1058 /* Reset the retransmission timer. */
1059 pcb->rtime = 0;
1060
1061 /* Reduce congestion window and ssthresh. */
1062 eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
1063 pcb->ssthresh = eff_wnd >> 1;
1064 if (pcb->ssthresh < (tcpwnd_size_t)(pcb->mss << 1)) {
1065 pcb->ssthresh = (pcb->mss << 1);
1066 }
1067 pcb->cwnd = pcb->mss;
1068 LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: cwnd %"TCPWNDSIZE_F
1069 " ssthresh %"TCPWNDSIZE_F"\n",
1070 pcb->cwnd, pcb->ssthresh));
1071
1072 /* The following needs to be called AFTER cwnd is set to one
1073 mss - STJ */
1074 tcp_rexmit_rto(pcb);
1075 }
1076 }
1077 }
1078 /* Check if this PCB has stayed too long in FIN-WAIT-2 */
1079 if (pcb->state == FIN_WAIT_2) {
1080 /* If this PCB is in FIN_WAIT_2 because of SHUT_WR don't let it time out. */
1081 if (pcb->flags & TF_RXCLOSED) {
1082 /* PCB was fully closed (either through close() or SHUT_RDWR):
1083 normal FIN-WAIT timeout handling. */
1084 if ((u32_t)(tcp_ticks - pcb->tmr) >
1085 TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) {
1086 ++pcb_remove;
1087 LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in FIN-WAIT-2\n"));
1088 }
1089 }
1090 }
1091
1092 /* Check if KEEPALIVE should be sent */
1093 if (ip_get_option(pcb, SOF_KEEPALIVE) &&
1094 ((pcb->state == ESTABLISHED) ||
1095 (pcb->state == CLOSE_WAIT))) {
1096 if ((u32_t)(tcp_ticks - pcb->tmr) >
1097 (pcb->keep_idle + TCP_KEEP_DUR(pcb)) / TCP_SLOW_INTERVAL)
1098 {
1099 LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: KEEPALIVE timeout. Aborting connection to "));
1100 ip_addr_debug_print(TCP_DEBUG, &pcb->remote_ip);
1101 LWIP_DEBUGF(TCP_DEBUG, ("\n"));
1102
1103 ++pcb_remove;
1104 ++pcb_reset;
1105 } else if ((u32_t)(tcp_ticks - pcb->tmr) >
1106 (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEP_INTVL(pcb))
1107 / TCP_SLOW_INTERVAL)
1108 {
1109 err = tcp_keepalive(pcb);
1110 if (err == ERR_OK) {
1111 pcb->keep_cnt_sent++;
1112 }
1113 }
1114 }
1115
1116 /* If this PCB has queued out of sequence data, but has been
1117 inactive for too long, will drop the data (it will eventually
1118 be retransmitted). */
1119 #if TCP_QUEUE_OOSEQ
1120 if (pcb->ooseq != NULL &&
1121 (u32_t)tcp_ticks - pcb->tmr >= pcb->rto * TCP_OOSEQ_TIMEOUT) {
1122 tcp_segs_free(pcb->ooseq);
1123 pcb->ooseq = NULL;
1124 LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: dropping OOSEQ queued data\n"));
1125 }
1126 #endif /* TCP_QUEUE_OOSEQ */
1127
1128 /* Check if this PCB has stayed too long in SYN-RCVD */
1129 if (pcb->state == SYN_RCVD) {
1130 if ((u32_t)(tcp_ticks - pcb->tmr) >
1131 TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) {
1132 ++pcb_remove;
1133 LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in SYN-RCVD\n"));
1134 }
1135 }
1136
1137 /* Check if this PCB has stayed too long in LAST-ACK */
1138 if (pcb->state == LAST_ACK) {
1139 if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
1140 ++pcb_remove;
1141 LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in LAST-ACK\n"));
1142 }
1143 }
1144
1145 /* If the PCB should be removed, do it. */
1146 if (pcb_remove) {
1147 struct tcp_pcb *pcb2;
1148 #if LWIP_CALLBACK_API
1149 tcp_err_fn err_fn = pcb->errf;
1150 #endif /* LWIP_CALLBACK_API */
1151 void *err_arg;
1152 enum tcp_state last_state;
1153 tcp_pcb_purge(pcb);
1154 /* Remove PCB from tcp_active_pcbs list. */
1155 if (prev != NULL) {
1156 LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs);
1157 prev->next = pcb->next;
1158 } else {
1159 /* This PCB was the first. */
1160 LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb);
1161 tcp_active_pcbs = pcb->next;
1162 }
1163
1164 if (pcb_reset) {
1165 tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
1166 pcb->local_port, pcb->remote_port);
1167 }
1168
1169 err_arg = pcb->callback_arg;
1170 last_state = pcb->state;
1171 pcb2 = pcb;
1172 pcb = pcb->next;
1173 memp_free(MEMP_TCP_PCB, pcb2);
1174
1175 tcp_active_pcbs_changed = 0;
1176 TCP_EVENT_ERR(last_state, err_fn, err_arg, ERR_ABRT);
1177 if (tcp_active_pcbs_changed) {
1178 goto tcp_slowtmr_start;
1179 }
1180 } else {
1181 /* get the 'next' element now and work with 'prev' below (in case of abort) */
1182 prev = pcb;
1183 pcb = pcb->next;
1184
1185 /* We check if we should poll the connection. */
1186 ++prev->polltmr;
1187 if (prev->polltmr >= prev->pollinterval) {
1188 prev->polltmr = 0;
1189 LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: polling application\n"));
1190 tcp_active_pcbs_changed = 0;
1191 TCP_EVENT_POLL(prev, err);
1192 if (tcp_active_pcbs_changed) {
1193 goto tcp_slowtmr_start;
1194 }
1195 /* if err == ERR_ABRT, 'prev' is already deallocated */
1196 if (err == ERR_OK) {
1197 tcp_output(prev);
1198 }
1199 }
1200 }
1201 }
1202
1203
1204 /* Steps through all of the TIME-WAIT PCBs. */
1205 prev = NULL;
1206 pcb = tcp_tw_pcbs;
1207 while (pcb != NULL) {
1208 LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
1209 pcb_remove = 0;
1210
1211 /* Check if this PCB has stayed long enough in TIME-WAIT */
1212 if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
1213 ++pcb_remove;
1214 }
1215
1216 /* If the PCB should be removed, do it. */
1217 if (pcb_remove) {
1218 struct tcp_pcb *pcb2;
1219 tcp_pcb_purge(pcb);
1220 /* Remove PCB from tcp_tw_pcbs list. */
1221 if (prev != NULL) {
1222 LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs);
1223 prev->next = pcb->next;
1224 } else {
1225 /* This PCB was the first. */
1226 LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
1227 tcp_tw_pcbs = pcb->next;
1228 }
1229 pcb2 = pcb;
1230 pcb = pcb->next;
1231 memp_free(MEMP_TCP_PCB, pcb2);
1232 } else {
1233 prev = pcb;
1234 pcb = pcb->next;
1235 }
1236 }
1237 }
1238
1239 /**
1240 * Is called every TCP_FAST_INTERVAL (250 ms) and process data previously
1241 * "refused" by upper layer (application) and sends delayed ACKs.
1242 *
1243 * Automatically called from tcp_tmr().
1244 */
1245 void
tcp_fasttmr(void)1246 tcp_fasttmr(void)
1247 {
1248 struct tcp_pcb *pcb;
1249
1250 ++tcp_timer_ctr;
1251
1252 tcp_fasttmr_start:
1253 pcb = tcp_active_pcbs;
1254
1255 while (pcb != NULL) {
1256 if (pcb->last_timer != tcp_timer_ctr) {
1257 struct tcp_pcb *next;
1258 pcb->last_timer = tcp_timer_ctr;
1259 /* send delayed ACKs */
1260 if (pcb->flags & TF_ACK_DELAY) {
1261 LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: delayed ACK\n"));
1262 tcp_ack_now(pcb);
1263 tcp_output(pcb);
1264 pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
1265 }
1266 /* send pending FIN */
1267 if (pcb->flags & TF_CLOSEPEND) {
1268 LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: pending FIN\n"));
1269 pcb->flags &= ~(TF_CLOSEPEND);
1270 tcp_close_shutdown_fin(pcb);
1271 }
1272
1273 next = pcb->next;
1274
1275 /* If there is data which was previously "refused" by upper layer */
1276 if (pcb->refused_data != NULL) {
1277 tcp_active_pcbs_changed = 0;
1278 tcp_process_refused_data(pcb);
1279 if (tcp_active_pcbs_changed) {
1280 /* application callback has changed the pcb list: restart the loop */
1281 goto tcp_fasttmr_start;
1282 }
1283 }
1284 pcb = next;
1285 } else {
1286 pcb = pcb->next;
1287 }
1288 }
1289 }
1290
1291 /** Call tcp_output for all active pcbs that have TF_NAGLEMEMERR set */
1292 void
tcp_txnow(void)1293 tcp_txnow(void)
1294 {
1295 struct tcp_pcb *pcb;
1296
1297 for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
1298 if (pcb->flags & TF_NAGLEMEMERR) {
1299 tcp_output(pcb);
1300 }
1301 }
1302 }
1303
1304 /** Pass pcb->refused_data to the recv callback */
1305 err_t
tcp_process_refused_data(struct tcp_pcb * pcb)1306 tcp_process_refused_data(struct tcp_pcb *pcb)
1307 {
1308 #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
1309 struct pbuf *rest;
1310 while (pcb->refused_data != NULL)
1311 #endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
1312 {
1313 err_t err;
1314 u8_t refused_flags = pcb->refused_data->flags;
1315 /* set pcb->refused_data to NULL in case the callback frees it and then
1316 closes the pcb */
1317 struct pbuf *refused_data = pcb->refused_data;
1318 #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
1319 pbuf_split_64k(refused_data, &rest);
1320 pcb->refused_data = rest;
1321 #else /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
1322 pcb->refused_data = NULL;
1323 #endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
1324 /* Notify again application with data previously received. */
1325 LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: notify kept packet\n"));
1326 TCP_EVENT_RECV(pcb, refused_data, ERR_OK, err);
1327 if (err == ERR_OK) {
1328 /* did refused_data include a FIN? */
1329 if (refused_flags & PBUF_FLAG_TCP_FIN
1330 #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
1331 && (rest == NULL)
1332 #endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
1333 ) {
1334 /* correct rcv_wnd as the application won't call tcp_recved()
1335 for the FIN's seqno */
1336 if (pcb->rcv_wnd != TCP_WND_MAX(pcb)) {
1337 pcb->rcv_wnd++;
1338 }
1339 TCP_EVENT_CLOSED(pcb, err);
1340 if (err == ERR_ABRT) {
1341 return ERR_ABRT;
1342 }
1343 }
1344 } else if (err == ERR_ABRT) {
1345 /* if err == ERR_ABRT, 'pcb' is already deallocated */
1346 /* Drop incoming packets because pcb is "full" (only if the incoming
1347 segment contains data). */
1348 LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: drop incoming packets, because pcb is \"full\"\n"));
1349 return ERR_ABRT;
1350 } else {
1351 /* data is still refused, pbuf is still valid (go on for ACK-only packets) */
1352 #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
1353 if (rest != NULL) {
1354 pbuf_cat(refused_data, rest);
1355 }
1356 #endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
1357 pcb->refused_data = refused_data;
1358 return ERR_INPROGRESS;
1359 }
1360 }
1361 return ERR_OK;
1362 }
1363
1364 /**
1365 * Deallocates a list of TCP segments (tcp_seg structures).
1366 *
1367 * @param seg tcp_seg list of TCP segments to free
1368 */
1369 void
tcp_segs_free(struct tcp_seg * seg)1370 tcp_segs_free(struct tcp_seg *seg)
1371 {
1372 while (seg != NULL) {
1373 struct tcp_seg *next = seg->next;
1374 tcp_seg_free(seg);
1375 seg = next;
1376 }
1377 }
1378
1379 /**
1380 * Frees a TCP segment (tcp_seg structure).
1381 *
1382 * @param seg single tcp_seg to free
1383 */
1384 void
tcp_seg_free(struct tcp_seg * seg)1385 tcp_seg_free(struct tcp_seg *seg)
1386 {
1387 if (seg != NULL) {
1388 if (seg->p != NULL) {
1389 pbuf_free(seg->p);
1390 #if TCP_DEBUG
1391 seg->p = NULL;
1392 #endif /* TCP_DEBUG */
1393 }
1394 memp_free(MEMP_TCP_SEG, seg);
1395 }
1396 }
1397
1398 /**
1399 * Sets the priority of a connection.
1400 *
1401 * @param pcb the tcp_pcb to manipulate
1402 * @param prio new priority
1403 */
1404 void
tcp_setprio(struct tcp_pcb * pcb,u8_t prio)1405 tcp_setprio(struct tcp_pcb *pcb, u8_t prio)
1406 {
1407 pcb->prio = prio;
1408 }
1409
1410 #if TCP_QUEUE_OOSEQ
1411 /**
1412 * Returns a copy of the given TCP segment.
1413 * The pbuf and data are not copied, only the pointers
1414 *
1415 * @param seg the old tcp_seg
1416 * @return a copy of seg
1417 */
1418 struct tcp_seg *
tcp_seg_copy(struct tcp_seg * seg)1419 tcp_seg_copy(struct tcp_seg *seg)
1420 {
1421 struct tcp_seg *cseg;
1422
1423 cseg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG);
1424 if (cseg == NULL) {
1425 return NULL;
1426 }
1427 SMEMCPY((u8_t *)cseg, (const u8_t *)seg, sizeof(struct tcp_seg));
1428 pbuf_ref(cseg->p);
1429 return cseg;
1430 }
1431 #endif /* TCP_QUEUE_OOSEQ */
1432
1433 #if LWIP_CALLBACK_API
1434 /**
1435 * Default receive callback that is called if the user didn't register
1436 * a recv callback for the pcb.
1437 */
1438 err_t
tcp_recv_null(void * arg,struct tcp_pcb * pcb,struct pbuf * p,err_t err)1439 tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
1440 {
1441 LWIP_UNUSED_ARG(arg);
1442 if (p != NULL) {
1443 tcp_recved(pcb, p->tot_len);
1444 pbuf_free(p);
1445 } else if (err == ERR_OK) {
1446 return tcp_close(pcb);
1447 }
1448 return ERR_OK;
1449 }
1450 #endif /* LWIP_CALLBACK_API */
1451
1452 /**
1453 * Kills the oldest active connection that has the same or lower priority than
1454 * 'prio'.
1455 *
1456 * @param prio minimum priority
1457 */
1458 static void
tcp_kill_prio(u8_t prio)1459 tcp_kill_prio(u8_t prio)
1460 {
1461 struct tcp_pcb *pcb, *inactive;
1462 u32_t inactivity;
1463 u8_t mprio;
1464
1465 mprio = LWIP_MIN(TCP_PRIO_MAX, prio);
1466
1467 /* We kill the oldest active connection that has lower priority than prio. */
1468 inactivity = 0;
1469 inactive = NULL;
1470 for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
1471 if (pcb->prio <= mprio &&
1472 (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
1473 inactivity = tcp_ticks - pcb->tmr;
1474 inactive = pcb;
1475 mprio = pcb->prio;
1476 }
1477 }
1478 if (inactive != NULL) {
1479 LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_prio: killing oldest PCB %p (%"S32_F")\n",
1480 (void *)inactive, inactivity));
1481 tcp_abort(inactive);
1482 }
1483 }
1484
1485 /**
1486 * Kills the oldest connection that is in specific state.
1487 * Called from tcp_alloc() for LAST_ACK and CLOSING if no more connections are available.
1488 */
1489 static void
tcp_kill_state(enum tcp_state state)1490 tcp_kill_state(enum tcp_state state)
1491 {
1492 struct tcp_pcb *pcb, *inactive;
1493 u32_t inactivity;
1494
1495 LWIP_ASSERT("invalid state", (state == CLOSING) || (state == LAST_ACK));
1496
1497 inactivity = 0;
1498 inactive = NULL;
1499 /* Go through the list of active pcbs and get the oldest pcb that is in state
1500 CLOSING/LAST_ACK. */
1501 for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
1502 if (pcb->state == state) {
1503 if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
1504 inactivity = tcp_ticks - pcb->tmr;
1505 inactive = pcb;
1506 }
1507 }
1508 }
1509 if (inactive != NULL) {
1510 LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_closing: killing oldest %s PCB %p (%"S32_F")\n",
1511 tcp_state_str[state], (void *)inactive, inactivity));
1512 /* Don't send a RST, since no data is lost. */
1513 tcp_abandon(inactive, 0);
1514 }
1515 }
1516
1517 /**
1518 * Kills the oldest connection that is in TIME_WAIT state.
1519 * Called from tcp_alloc() if no more connections are available.
1520 */
1521 static void
tcp_kill_timewait(void)1522 tcp_kill_timewait(void)
1523 {
1524 struct tcp_pcb *pcb, *inactive;
1525 u32_t inactivity;
1526
1527 inactivity = 0;
1528 inactive = NULL;
1529 /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */
1530 for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
1531 if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
1532 inactivity = tcp_ticks - pcb->tmr;
1533 inactive = pcb;
1534 }
1535 }
1536 if (inactive != NULL) {
1537 LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_timewait: killing oldest TIME-WAIT PCB %p (%"S32_F")\n",
1538 (void *)inactive, inactivity));
1539 tcp_abort(inactive);
1540 }
1541 }
1542
1543 /**
1544 * Allocate a new tcp_pcb structure.
1545 *
1546 * @param prio priority for the new pcb
1547 * @return a new tcp_pcb that initially is in state CLOSED
1548 */
1549 struct tcp_pcb *
tcp_alloc(u8_t prio)1550 tcp_alloc(u8_t prio)
1551 {
1552 struct tcp_pcb *pcb;
1553
1554 pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
1555 if (pcb == NULL) {
1556 /* Try killing oldest connection in TIME-WAIT. */
1557 LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest TIME-WAIT connection\n"));
1558 tcp_kill_timewait();
1559 /* Try to allocate a tcp_pcb again. */
1560 pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
1561 if (pcb == NULL) {
1562 /* Try killing oldest connection in LAST-ACK (these wouldn't go to TIME-WAIT). */
1563 LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest LAST-ACK connection\n"));
1564 tcp_kill_state(LAST_ACK);
1565 /* Try to allocate a tcp_pcb again. */
1566 pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
1567 if (pcb == NULL) {
1568 /* Try killing oldest connection in CLOSING. */
1569 LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest CLOSING connection\n"));
1570 tcp_kill_state(CLOSING);
1571 /* Try to allocate a tcp_pcb again. */
1572 pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
1573 if (pcb == NULL) {
1574 /* Try killing active connections with lower priority than the new one. */
1575 LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing connection with prio lower than %d\n", prio));
1576 tcp_kill_prio(prio);
1577 /* Try to allocate a tcp_pcb again. */
1578 pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
1579 if (pcb != NULL) {
1580 /* adjust err stats: memp_malloc failed multiple times before */
1581 MEMP_STATS_DEC(err, MEMP_TCP_PCB);
1582 }
1583 }
1584 if (pcb != NULL) {
1585 /* adjust err stats: memp_malloc failed multiple times before */
1586 MEMP_STATS_DEC(err, MEMP_TCP_PCB);
1587 }
1588 }
1589 if (pcb != NULL) {
1590 /* adjust err stats: memp_malloc failed multiple times before */
1591 MEMP_STATS_DEC(err, MEMP_TCP_PCB);
1592 }
1593 }
1594 if (pcb != NULL) {
1595 /* adjust err stats: memp_malloc failed above */
1596 MEMP_STATS_DEC(err, MEMP_TCP_PCB);
1597 }
1598 }
1599 if (pcb != NULL) {
1600 /* zero out the whole pcb, so there is no need to initialize members to zero */
1601 memset(pcb, 0, sizeof(struct tcp_pcb));
1602 pcb->prio = prio;
1603 pcb->snd_buf = TCP_SND_BUF;
1604 /* Start with a window that does not need scaling. When window scaling is
1605 enabled and used, the window is enlarged when both sides agree on scaling. */
1606 pcb->rcv_wnd = pcb->rcv_ann_wnd = TCPWND_MIN16(TCP_WND);
1607 pcb->ttl = TCP_TTL;
1608 /* As initial send MSS, we use TCP_MSS but limit it to 536.
1609 The send MSS is updated when an MSS option is received. */
1610 pcb->mss = INITIAL_MSS;
1611 pcb->rto = 3000 / TCP_SLOW_INTERVAL;
1612 pcb->sv = 3000 / TCP_SLOW_INTERVAL;
1613 pcb->rtime = -1;
1614 pcb->cwnd = 1;
1615 pcb->tmr = tcp_ticks;
1616 pcb->last_timer = tcp_timer_ctr;
1617
1618 /* RFC 5681 recommends setting ssthresh abritrarily high and gives an example
1619 of using the largest advertised receive window. We've seen complications with
1620 receiving TCPs that use window scaling and/or window auto-tuning where the
1621 initial advertised window is very small and then grows rapidly once the
1622 connection is established. To avoid these complications, we set ssthresh to the
1623 largest effective cwnd (amount of in-flight data) that the sender can have. */
1624 pcb->ssthresh = TCP_SND_BUF;
1625
1626 #if LWIP_CALLBACK_API
1627 pcb->recv = tcp_recv_null;
1628 #endif /* LWIP_CALLBACK_API */
1629
1630 /* Init KEEPALIVE timer */
1631 pcb->keep_idle = TCP_KEEPIDLE_DEFAULT;
1632
1633 #if LWIP_TCP_KEEPALIVE
1634 pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT;
1635 pcb->keep_cnt = TCP_KEEPCNT_DEFAULT;
1636 #endif /* LWIP_TCP_KEEPALIVE */
1637 }
1638 return pcb;
1639 }
1640
1641 /**
1642 * @ingroup tcp_raw
1643 * Creates a new TCP protocol control block but doesn't place it on
1644 * any of the TCP PCB lists.
1645 * The pcb is not put on any list until binding using tcp_bind().
1646 *
1647 * @internal: Maybe there should be a idle TCP PCB list where these
1648 * PCBs are put on. Port reservation using tcp_bind() is implemented but
1649 * allocated pcbs that are not bound can't be killed automatically if wanting
1650 * to allocate a pcb with higher prio (@see tcp_kill_prio())
1651 *
1652 * @return a new tcp_pcb that initially is in state CLOSED
1653 */
1654 struct tcp_pcb *
tcp_new(void)1655 tcp_new(void)
1656 {
1657 return tcp_alloc(TCP_PRIO_NORMAL);
1658 }
1659
1660 /**
1661 * @ingroup tcp_raw
1662 * Creates a new TCP protocol control block but doesn't
1663 * place it on any of the TCP PCB lists.
1664 * The pcb is not put on any list until binding using tcp_bind().
1665 *
1666 * @param type IP address type, see @ref lwip_ip_addr_type definitions.
1667 * If you want to listen to IPv4 and IPv6 (dual-stack) connections,
1668 * supply @ref IPADDR_TYPE_ANY as argument and bind to @ref IP_ANY_TYPE.
1669 * @return a new tcp_pcb that initially is in state CLOSED
1670 */
1671 struct tcp_pcb *
tcp_new_ip_type(u8_t type)1672 tcp_new_ip_type(u8_t type)
1673 {
1674 struct tcp_pcb * pcb;
1675 pcb = tcp_alloc(TCP_PRIO_NORMAL);
1676 #if LWIP_IPV4 && LWIP_IPV6
1677 if (pcb != NULL) {
1678 IP_SET_TYPE_VAL(pcb->local_ip, type);
1679 IP_SET_TYPE_VAL(pcb->remote_ip, type);
1680 }
1681 #else
1682 LWIP_UNUSED_ARG(type);
1683 #endif /* LWIP_IPV4 && LWIP_IPV6 */
1684 return pcb;
1685 }
1686
1687 /**
1688 * @ingroup tcp_raw
1689 * Used to specify the argument that should be passed callback
1690 * functions.
1691 *
1692 * @param pcb tcp_pcb to set the callback argument
1693 * @param arg void pointer argument to pass to callback functions
1694 */
1695 void
tcp_arg(struct tcp_pcb * pcb,void * arg)1696 tcp_arg(struct tcp_pcb *pcb, void *arg)
1697 {
1698 /* This function is allowed to be called for both listen pcbs and
1699 connection pcbs. */
1700 if (pcb != NULL) {
1701 pcb->callback_arg = arg;
1702 }
1703 }
1704 #if LWIP_CALLBACK_API
1705
1706 /**
1707 * @ingroup tcp_raw
1708 * Used to specify the function that should be called when a TCP
1709 * connection receives data.
1710 *
1711 * @param pcb tcp_pcb to set the recv callback
1712 * @param recv callback function to call for this pcb when data is received
1713 */
1714 void
tcp_recv(struct tcp_pcb * pcb,tcp_recv_fn recv)1715 tcp_recv(struct tcp_pcb *pcb, tcp_recv_fn recv)
1716 {
1717 if (pcb != NULL) {
1718 LWIP_ASSERT("invalid socket state for recv callback", pcb->state != LISTEN);
1719 pcb->recv = recv;
1720 }
1721 }
1722
1723 /**
1724 * @ingroup tcp_raw
1725 * Used to specify the function that should be called when TCP data
1726 * has been successfully delivered to the remote host.
1727 *
1728 * @param pcb tcp_pcb to set the sent callback
1729 * @param sent callback function to call for this pcb when data is successfully sent
1730 */
1731 void
tcp_sent(struct tcp_pcb * pcb,tcp_sent_fn sent)1732 tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent)
1733 {
1734 if (pcb != NULL) {
1735 LWIP_ASSERT("invalid socket state for sent callback", pcb->state != LISTEN);
1736 pcb->sent = sent;
1737 }
1738 }
1739
1740 /**
1741 * @ingroup tcp_raw
1742 * Used to specify the function that should be called when a fatal error
1743 * has occurred on the connection.
1744 *
1745 * @note The corresponding pcb is already freed when this callback is called!
1746 *
1747 * @param pcb tcp_pcb to set the err callback
1748 * @param err callback function to call for this pcb when a fatal error
1749 * has occurred on the connection
1750 */
1751 void
tcp_err(struct tcp_pcb * pcb,tcp_err_fn err)1752 tcp_err(struct tcp_pcb *pcb, tcp_err_fn err)
1753 {
1754 if (pcb != NULL) {
1755 LWIP_ASSERT("invalid socket state for err callback", pcb->state != LISTEN);
1756 pcb->errf = err;
1757 }
1758 }
1759
1760 /**
1761 * @ingroup tcp_raw
1762 * Used for specifying the function that should be called when a
1763 * LISTENing connection has been connected to another host.
1764 *
1765 * @param pcb tcp_pcb to set the accept callback
1766 * @param accept callback function to call for this pcb when LISTENing
1767 * connection has been connected to another host
1768 */
1769 void
tcp_accept(struct tcp_pcb * pcb,tcp_accept_fn accept)1770 tcp_accept(struct tcp_pcb *pcb, tcp_accept_fn accept)
1771 {
1772 if ((pcb != NULL) && (pcb->state == LISTEN)) {
1773 struct tcp_pcb_listen *lpcb = (struct tcp_pcb_listen*)pcb;
1774 lpcb->accept = accept;
1775 }
1776 }
1777 #endif /* LWIP_CALLBACK_API */
1778
1779
1780 /**
1781 * @ingroup tcp_raw
1782 * Used to specify the function that should be called periodically
1783 * from TCP. The interval is specified in terms of the TCP coarse
1784 * timer interval, which is called twice a second.
1785 *
1786 */
1787 void
tcp_poll(struct tcp_pcb * pcb,tcp_poll_fn poll,u8_t interval)1788 tcp_poll(struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval)
1789 {
1790 LWIP_ASSERT("invalid socket state for poll", pcb->state != LISTEN);
1791 #if LWIP_CALLBACK_API
1792 pcb->poll = poll;
1793 #else /* LWIP_CALLBACK_API */
1794 LWIP_UNUSED_ARG(poll);
1795 #endif /* LWIP_CALLBACK_API */
1796 pcb->pollinterval = interval;
1797 }
1798
1799 /**
1800 * Purges a TCP PCB. Removes any buffered data and frees the buffer memory
1801 * (pcb->ooseq, pcb->unsent and pcb->unacked are freed).
1802 *
1803 * @param pcb tcp_pcb to purge. The pcb itself is not deallocated!
1804 */
1805 void
tcp_pcb_purge(struct tcp_pcb * pcb)1806 tcp_pcb_purge(struct tcp_pcb *pcb)
1807 {
1808 if (pcb->state != CLOSED &&
1809 pcb->state != TIME_WAIT &&
1810 pcb->state != LISTEN) {
1811
1812 LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge\n"));
1813
1814 tcp_backlog_accepted(pcb);
1815
1816 if (pcb->refused_data != NULL) {
1817 LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->refused_data\n"));
1818 pbuf_free(pcb->refused_data);
1819 pcb->refused_data = NULL;
1820 }
1821 if (pcb->unsent != NULL) {
1822 LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: not all data sent\n"));
1823 }
1824 if (pcb->unacked != NULL) {
1825 LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->unacked\n"));
1826 }
1827 #if TCP_QUEUE_OOSEQ
1828 if (pcb->ooseq != NULL) {
1829 LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->ooseq\n"));
1830 }
1831 tcp_segs_free(pcb->ooseq);
1832 pcb->ooseq = NULL;
1833 #endif /* TCP_QUEUE_OOSEQ */
1834
1835 /* Stop the retransmission timer as it will expect data on unacked
1836 queue if it fires */
1837 pcb->rtime = -1;
1838
1839 tcp_segs_free(pcb->unsent);
1840 tcp_segs_free(pcb->unacked);
1841 pcb->unacked = pcb->unsent = NULL;
1842 #if TCP_OVERSIZE
1843 pcb->unsent_oversize = 0;
1844 #endif /* TCP_OVERSIZE */
1845 }
1846 }
1847
1848 /**
1849 * Purges the PCB and removes it from a PCB list. Any delayed ACKs are sent first.
1850 *
1851 * @param pcblist PCB list to purge.
1852 * @param pcb tcp_pcb to purge. The pcb itself is NOT deallocated!
1853 */
1854 void
tcp_pcb_remove(struct tcp_pcb ** pcblist,struct tcp_pcb * pcb)1855 tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb)
1856 {
1857 TCP_RMV(pcblist, pcb);
1858
1859 tcp_pcb_purge(pcb);
1860
1861 /* if there is an outstanding delayed ACKs, send it */
1862 if (pcb->state != TIME_WAIT &&
1863 pcb->state != LISTEN &&
1864 pcb->flags & TF_ACK_DELAY) {
1865 pcb->flags |= TF_ACK_NOW;
1866 tcp_output(pcb);
1867 }
1868
1869 if (pcb->state != LISTEN) {
1870 LWIP_ASSERT("unsent segments leaking", pcb->unsent == NULL);
1871 LWIP_ASSERT("unacked segments leaking", pcb->unacked == NULL);
1872 #if TCP_QUEUE_OOSEQ
1873 LWIP_ASSERT("ooseq segments leaking", pcb->ooseq == NULL);
1874 #endif /* TCP_QUEUE_OOSEQ */
1875 }
1876
1877 pcb->state = CLOSED;
1878 /* reset the local port to prevent the pcb from being 'bound' */
1879 pcb->local_port = 0;
1880
1881 LWIP_ASSERT("tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane());
1882 }
1883
1884 /**
1885 * Calculates a new initial sequence number for new connections.
1886 *
1887 * @return u32_t pseudo random sequence number
1888 */
1889 u32_t
tcp_next_iss(struct tcp_pcb * pcb)1890 tcp_next_iss(struct tcp_pcb *pcb)
1891 {
1892 #ifdef LWIP_HOOK_TCP_ISN
1893 return LWIP_HOOK_TCP_ISN(&pcb->local_ip, pcb->local_port, &pcb->remote_ip, pcb->remote_port);
1894 #else /* LWIP_HOOK_TCP_ISN */
1895 static u32_t iss = 6510;
1896
1897 LWIP_UNUSED_ARG(pcb);
1898
1899 iss += tcp_ticks; /* XXX */
1900 return iss;
1901 #endif /* LWIP_HOOK_TCP_ISN */
1902 }
1903
1904 #if TCP_CALCULATE_EFF_SEND_MSS
1905 /**
1906 * Calculates the effective send mss that can be used for a specific IP address
1907 * by using ip_route to determine the netif used to send to the address and
1908 * calculating the minimum of TCP_MSS and that netif's mtu (if set).
1909 */
1910 u16_t
tcp_eff_send_mss_impl(u16_t sendmss,const ip_addr_t * dest,const ip_addr_t * src)1911 tcp_eff_send_mss_impl(u16_t sendmss, const ip_addr_t *dest
1912 #if LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING
1913 , const ip_addr_t *src
1914 #endif /* LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING */
1915 )
1916 {
1917 u16_t mss_s;
1918 struct netif *outif;
1919 s16_t mtu;
1920
1921 outif = ip_route(src, dest);
1922 #if LWIP_IPV6
1923 #if LWIP_IPV4
1924 if (IP_IS_V6(dest))
1925 #endif /* LWIP_IPV4 */
1926 {
1927 /* First look in destination cache, to see if there is a Path MTU. */
1928 mtu = nd6_get_destination_mtu(ip_2_ip6(dest), outif);
1929 }
1930 #if LWIP_IPV4
1931 else
1932 #endif /* LWIP_IPV4 */
1933 #endif /* LWIP_IPV6 */
1934 #if LWIP_IPV4
1935 {
1936 if (outif == NULL) {
1937 return sendmss;
1938 }
1939 mtu = outif->mtu;
1940 }
1941 #endif /* LWIP_IPV4 */
1942
1943 if (mtu != 0) {
1944 #if LWIP_IPV6
1945 #if LWIP_IPV4
1946 if (IP_IS_V6(dest))
1947 #endif /* LWIP_IPV4 */
1948 {
1949 mss_s = mtu - IP6_HLEN - TCP_HLEN;
1950 }
1951 #if LWIP_IPV4
1952 else
1953 #endif /* LWIP_IPV4 */
1954 #endif /* LWIP_IPV6 */
1955 #if LWIP_IPV4
1956 {
1957 mss_s = mtu - IP_HLEN - TCP_HLEN;
1958 }
1959 #endif /* LWIP_IPV4 */
1960 /* RFC 1122, chap 4.2.2.6:
1961 * Eff.snd.MSS = min(SendMSS+20, MMS_S) - TCPhdrsize - IPoptionsize
1962 * We correct for TCP options in tcp_write(), and don't support IP options.
1963 */
1964 sendmss = LWIP_MIN(sendmss, mss_s);
1965 }
1966 return sendmss;
1967 }
1968 #endif /* TCP_CALCULATE_EFF_SEND_MSS */
1969
1970 /** Helper function for tcp_netif_ip_addr_changed() that iterates a pcb list */
1971 static void
tcp_netif_ip_addr_changed_pcblist(const ip_addr_t * old_addr,struct tcp_pcb * pcb_list)1972 tcp_netif_ip_addr_changed_pcblist(const ip_addr_t* old_addr, struct tcp_pcb* pcb_list)
1973 {
1974 struct tcp_pcb *pcb;
1975 pcb = pcb_list;
1976 while (pcb != NULL) {
1977 /* PCB bound to current local interface address? */
1978 if (ip_addr_cmp(&pcb->local_ip, old_addr)
1979 #if LWIP_AUTOIP
1980 /* connections to link-local addresses must persist (RFC3927 ch. 1.9) */
1981 && (!IP_IS_V4_VAL(pcb->local_ip) || !ip4_addr_islinklocal(ip_2_ip4(&pcb->local_ip)))
1982 #endif /* LWIP_AUTOIP */
1983 ) {
1984 /* this connection must be aborted */
1985 struct tcp_pcb *next = pcb->next;
1986 LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: aborting TCP pcb %p\n", (void *)pcb));
1987 tcp_abort(pcb);
1988 pcb = next;
1989 } else {
1990 pcb = pcb->next;
1991 }
1992 }
1993 }
1994
1995 /** This function is called from netif.c when address is changed or netif is removed
1996 *
1997 * @param old_addr IP address of the netif before change
1998 * @param new_addr IP address of the netif after change or NULL if netif has been removed
1999 */
2000 void
tcp_netif_ip_addr_changed(const ip_addr_t * old_addr,const ip_addr_t * new_addr)2001 tcp_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr)
2002 {
2003 struct tcp_pcb_listen *lpcb, *next;
2004
2005 if (!ip_addr_isany(old_addr)) {
2006 tcp_netif_ip_addr_changed_pcblist(old_addr, tcp_active_pcbs);
2007 tcp_netif_ip_addr_changed_pcblist(old_addr, tcp_bound_pcbs);
2008
2009 if (!ip_addr_isany(new_addr)) {
2010 /* PCB bound to current local interface address? */
2011 for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = next) {
2012 next = lpcb->next;
2013 /* PCB bound to current local interface address? */
2014 if (ip_addr_cmp(&lpcb->local_ip, old_addr)) {
2015 /* The PCB is listening to the old ipaddr and
2016 * is set to listen to the new one instead */
2017 ip_addr_copy(lpcb->local_ip, *new_addr);
2018 }
2019 }
2020 }
2021 }
2022 }
2023
2024 const char*
tcp_debug_state_str(enum tcp_state s)2025 tcp_debug_state_str(enum tcp_state s)
2026 {
2027 return tcp_state_str[s];
2028 }
2029
2030 #if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG
2031 /**
2032 * Print a tcp header for debugging purposes.
2033 *
2034 * @param tcphdr pointer to a struct tcp_hdr
2035 */
2036 void
tcp_debug_print(struct tcp_hdr * tcphdr)2037 tcp_debug_print(struct tcp_hdr *tcphdr)
2038 {
2039 LWIP_DEBUGF(TCP_DEBUG, ("TCP header:\n"));
2040 LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
2041 LWIP_DEBUGF(TCP_DEBUG, ("| %5"U16_F" | %5"U16_F" | (src port, dest port)\n",
2042 lwip_ntohs(tcphdr->src), lwip_ntohs(tcphdr->dest)));
2043 LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
2044 LWIP_DEBUGF(TCP_DEBUG, ("| %010"U32_F" | (seq no)\n",
2045 lwip_ntohl(tcphdr->seqno)));
2046 LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
2047 LWIP_DEBUGF(TCP_DEBUG, ("| %010"U32_F" | (ack no)\n",
2048 lwip_ntohl(tcphdr->ackno)));
2049 LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
2050 LWIP_DEBUGF(TCP_DEBUG, ("| %2"U16_F" | |%"U16_F"%"U16_F"%"U16_F"%"U16_F"%"U16_F"%"U16_F"| %5"U16_F" | (hdrlen, flags (",
2051 TCPH_HDRLEN(tcphdr),
2052 (u16_t)(TCPH_FLAGS(tcphdr) >> 5 & 1),
2053 (u16_t)(TCPH_FLAGS(tcphdr) >> 4 & 1),
2054 (u16_t)(TCPH_FLAGS(tcphdr) >> 3 & 1),
2055 (u16_t)(TCPH_FLAGS(tcphdr) >> 2 & 1),
2056 (u16_t)(TCPH_FLAGS(tcphdr) >> 1 & 1),
2057 (u16_t)(TCPH_FLAGS(tcphdr) & 1),
2058 lwip_ntohs(tcphdr->wnd)));
2059 tcp_debug_print_flags(TCPH_FLAGS(tcphdr));
2060 LWIP_DEBUGF(TCP_DEBUG, ("), win)\n"));
2061 LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
2062 LWIP_DEBUGF(TCP_DEBUG, ("| 0x%04"X16_F" | %5"U16_F" | (chksum, urgp)\n",
2063 lwip_ntohs(tcphdr->chksum), lwip_ntohs(tcphdr->urgp)));
2064 LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
2065 }
2066
2067 /**
2068 * Print a tcp state for debugging purposes.
2069 *
2070 * @param s enum tcp_state to print
2071 */
2072 void
tcp_debug_print_state(enum tcp_state s)2073 tcp_debug_print_state(enum tcp_state s)
2074 {
2075 LWIP_DEBUGF(TCP_DEBUG, ("State: %s\n", tcp_state_str[s]));
2076 }
2077
2078 /**
2079 * Print tcp flags for debugging purposes.
2080 *
2081 * @param flags tcp flags, all active flags are printed
2082 */
2083 void
tcp_debug_print_flags(u8_t flags)2084 tcp_debug_print_flags(u8_t flags)
2085 {
2086 if (flags & TCP_FIN) {
2087 LWIP_DEBUGF(TCP_DEBUG, ("FIN "));
2088 }
2089 if (flags & TCP_SYN) {
2090 LWIP_DEBUGF(TCP_DEBUG, ("SYN "));
2091 }
2092 if (flags & TCP_RST) {
2093 LWIP_DEBUGF(TCP_DEBUG, ("RST "));
2094 }
2095 if (flags & TCP_PSH) {
2096 LWIP_DEBUGF(TCP_DEBUG, ("PSH "));
2097 }
2098 if (flags & TCP_ACK) {
2099 LWIP_DEBUGF(TCP_DEBUG, ("ACK "));
2100 }
2101 if (flags & TCP_URG) {
2102 LWIP_DEBUGF(TCP_DEBUG, ("URG "));
2103 }
2104 if (flags & TCP_ECE) {
2105 LWIP_DEBUGF(TCP_DEBUG, ("ECE "));
2106 }
2107 if (flags & TCP_CWR) {
2108 LWIP_DEBUGF(TCP_DEBUG, ("CWR "));
2109 }
2110 LWIP_DEBUGF(TCP_DEBUG, ("\n"));
2111 }
2112
2113 /**
2114 * Print all tcp_pcbs in every list for debugging purposes.
2115 */
2116 void
tcp_debug_print_pcbs(void)2117 tcp_debug_print_pcbs(void)
2118 {
2119 struct tcp_pcb *pcb;
2120 struct tcp_pcb_listen *pcbl;
2121
2122 LWIP_DEBUGF(TCP_DEBUG, ("Active PCB states:\n"));
2123 for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
2124 LWIP_DEBUGF(TCP_DEBUG, ("Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ",
2125 pcb->local_port, pcb->remote_port,
2126 pcb->snd_nxt, pcb->rcv_nxt));
2127 tcp_debug_print_state(pcb->state);
2128 }
2129
2130 LWIP_DEBUGF(TCP_DEBUG, ("Listen PCB states:\n"));
2131 for (pcbl = tcp_listen_pcbs.listen_pcbs; pcbl != NULL; pcbl = pcbl->next) {
2132 LWIP_DEBUGF(TCP_DEBUG, ("Local port %"U16_F" ", pcbl->local_port));
2133 tcp_debug_print_state(pcbl->state);
2134 }
2135
2136 LWIP_DEBUGF(TCP_DEBUG, ("TIME-WAIT PCB states:\n"));
2137 for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
2138 LWIP_DEBUGF(TCP_DEBUG, ("Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ",
2139 pcb->local_port, pcb->remote_port,
2140 pcb->snd_nxt, pcb->rcv_nxt));
2141 tcp_debug_print_state(pcb->state);
2142 }
2143 }
2144
2145 /**
2146 * Check state consistency of the tcp_pcb lists.
2147 */
2148 s16_t
tcp_pcbs_sane(void)2149 tcp_pcbs_sane(void)
2150 {
2151 struct tcp_pcb *pcb;
2152 for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
2153 LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != CLOSED", pcb->state != CLOSED);
2154 LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != LISTEN", pcb->state != LISTEN);
2155 LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
2156 }
2157 for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
2158 LWIP_ASSERT("tcp_pcbs_sane: tw pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
2159 }
2160 return 1;
2161 }
2162 #endif /* TCP_DEBUG */
2163
2164 #endif /* LWIP_TCP */
2165