Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of OmniWheels by
tcp_priv.h
00001 /** 00002 * @file 00003 * TCP internal implementations (do not use in application code) 00004 */ 00005 00006 /* 00007 * Copyright (c) 2001-2004 Swedish Institute of Computer Science. 00008 * All rights reserved. 00009 * 00010 * Redistribution and use in source and binary forms, with or without modification, 00011 * are permitted provided that the following conditions are met: 00012 * 00013 * 1. Redistributions of source code must retain the above copyright notice, 00014 * this list of conditions and the following disclaimer. 00015 * 2. Redistributions in binary form must reproduce the above copyright notice, 00016 * this list of conditions and the following disclaimer in the documentation 00017 * and/or other materials provided with the distribution. 00018 * 3. The name of the author may not be used to endorse or promote products 00019 * derived from this software without specific prior written permission. 00020 * 00021 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 00022 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 00023 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 00024 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00025 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 00026 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00027 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00028 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 00029 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 00030 * OF SUCH DAMAGE. 00031 * 00032 * This file is part of the lwIP TCP/IP stack. 00033 * 00034 * Author: Adam Dunkels <adam@sics.se> 00035 * 00036 */ 00037 #ifndef LWIP_HDR_TCP_PRIV_H 00038 #define LWIP_HDR_TCP_PRIV_H 00039 00040 #include "lwip/opt.h" 00041 00042 #if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ 00043 00044 #include "lwip/tcp.h" 00045 #include "lwip/mem.h" 00046 #include "lwip/pbuf.h" 00047 #include "lwip/ip.h" 00048 #include "lwip/icmp.h" 00049 #include "lwip/err.h" 00050 #include "lwip/ip6.h" 00051 #include "lwip/ip6_addr.h" 00052 #include "lwip/prot/tcp.h" 00053 00054 #ifdef __cplusplus 00055 extern "C" { 00056 #endif 00057 00058 /* Functions for interfacing with TCP: */ 00059 00060 /* Lower layer interface to TCP: */ 00061 void tcp_init (void); /* Initialize this module. */ 00062 void tcp_tmr (void); /* Must be called every 00063 TCP_TMR_INTERVAL 00064 ms. (Typically 250 ms). */ 00065 /* It is also possible to call these two functions at the right 00066 intervals (instead of calling tcp_tmr()). */ 00067 void tcp_slowtmr (void); 00068 void tcp_fasttmr (void); 00069 00070 /* Call this from a netif driver (watch out for threading issues!) that has 00071 returned a memory error on transmit and now has free buffers to send more. 00072 This iterates all active pcbs that had an error and tries to call 00073 tcp_output, so use this with care as it might slow down the system. */ 00074 void tcp_txnow (void); 00075 00076 /* Only used by IP to pass a TCP segment to TCP: */ 00077 void tcp_input (struct pbuf *p, struct netif *inp); 00078 /* Used within the TCP code only: */ 00079 struct tcp_pcb * tcp_alloc (u8_t prio); 00080 void tcp_abandon (struct tcp_pcb *pcb, int reset); 00081 err_t tcp_send_empty_ack(struct tcp_pcb *pcb); 00082 void tcp_rexmit (struct tcp_pcb *pcb); 00083 void tcp_rexmit_rto (struct tcp_pcb *pcb); 00084 void tcp_rexmit_fast (struct tcp_pcb *pcb); 00085 u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb); 00086 err_t tcp_process_refused_data(struct tcp_pcb *pcb); 00087 00088 /** 00089 * This is the Nagle algorithm: try to combine user data to send as few TCP 00090 * segments as possible. Only send if 00091 * - no previously transmitted data on the connection remains unacknowledged or 00092 * - the TF_NODELAY flag is set (nagle algorithm turned off for this pcb) or 00093 * - the only unsent segment is at least pcb->mss bytes long (or there is more 00094 * than one unsent segment - with lwIP, this can happen although unsent->len < mss) 00095 * - or if we are in fast-retransmit (TF_INFR) 00096 */ 00097 #define tcp_do_output_nagle(tpcb) ((((tpcb)->unacked == NULL) || \ 00098 ((tpcb)->flags & (TF_NODELAY | TF_INFR)) || \ 00099 (((tpcb)->unsent != NULL) && (((tpcb)->unsent->next != NULL) || \ 00100 ((tpcb)->unsent->len >= (tpcb)->mss))) || \ 00101 ((tcp_sndbuf(tpcb) == 0) || (tcp_sndqueuelen(tpcb) >= TCP_SND_QUEUELEN)) \ 00102 ) ? 1 : 0) 00103 #define tcp_output_nagle(tpcb) (tcp_do_output_nagle(tpcb) ? tcp_output(tpcb) : ERR_OK) 00104 00105 00106 #define TCP_SEQ_LT(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) < 0) 00107 #define TCP_SEQ_LEQ(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) <= 0) 00108 #define TCP_SEQ_GT(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) > 0) 00109 #define TCP_SEQ_GEQ(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) >= 0) 00110 /* is b<=a<=c? */ 00111 #if 0 /* see bug #10548 */ 00112 #define TCP_SEQ_BETWEEN(a,b,c) ((c)-(b) >= (a)-(b)) 00113 #endif 00114 #define TCP_SEQ_BETWEEN(a,b,c) (TCP_SEQ_GEQ(a,b) && TCP_SEQ_LEQ(a,c)) 00115 00116 #ifndef TCP_TMR_INTERVAL 00117 #define TCP_TMR_INTERVAL 250 /* The TCP timer interval in milliseconds. */ 00118 #endif /* TCP_TMR_INTERVAL */ 00119 00120 #ifndef TCP_FAST_INTERVAL 00121 #define TCP_FAST_INTERVAL TCP_TMR_INTERVAL /* the fine grained timeout in milliseconds */ 00122 #endif /* TCP_FAST_INTERVAL */ 00123 00124 #ifndef TCP_SLOW_INTERVAL 00125 #define TCP_SLOW_INTERVAL (2*TCP_TMR_INTERVAL) /* the coarse grained timeout in milliseconds */ 00126 #endif /* TCP_SLOW_INTERVAL */ 00127 00128 #define TCP_FIN_WAIT_TIMEOUT 20000 /* milliseconds */ 00129 #define TCP_SYN_RCVD_TIMEOUT 20000 /* milliseconds */ 00130 00131 #define TCP_OOSEQ_TIMEOUT 6U /* x RTO */ 00132 00133 #ifndef TCP_MSL 00134 #define TCP_MSL 60000UL /* The maximum segment lifetime in milliseconds */ 00135 #endif 00136 00137 /* Keepalive values, compliant with RFC 1122. Don't change this unless you know what you're doing */ 00138 #ifndef TCP_KEEPIDLE_DEFAULT 00139 #define TCP_KEEPIDLE_DEFAULT 7200000UL /* Default KEEPALIVE timer in milliseconds */ 00140 #endif 00141 00142 #ifndef TCP_KEEPINTVL_DEFAULT 00143 #define TCP_KEEPINTVL_DEFAULT 75000UL /* Default Time between KEEPALIVE probes in milliseconds */ 00144 #endif 00145 00146 #ifndef TCP_KEEPCNT_DEFAULT 00147 #define TCP_KEEPCNT_DEFAULT 9U /* Default Counter for KEEPALIVE probes */ 00148 #endif 00149 00150 #define TCP_MAXIDLE TCP_KEEPCNT_DEFAULT * TCP_KEEPINTVL_DEFAULT /* Maximum KEEPALIVE probe time */ 00151 00152 #define TCP_TCPLEN(seg) ((seg)->len + (((TCPH_FLAGS((seg)->tcphdr) & (TCP_FIN | TCP_SYN)) != 0) ? 1U : 0U)) 00153 00154 /** Flags used on input processing, not on pcb->flags 00155 */ 00156 #define TF_RESET (u8_t)0x08U /* Connection was reset. */ 00157 #define TF_CLOSED (u8_t)0x10U /* Connection was successfully closed. */ 00158 #define TF_GOT_FIN (u8_t)0x20U /* Connection was closed by the remote end. */ 00159 00160 00161 #if LWIP_EVENT_API 00162 00163 #define TCP_EVENT_ACCEPT(lpcb,pcb,arg,err,ret) ret = lwip_tcp_event(arg, (pcb),\ 00164 LWIP_EVENT_ACCEPT, NULL, 0, err) 00165 #define TCP_EVENT_SENT(pcb,space,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ 00166 LWIP_EVENT_SENT, NULL, space, ERR_OK) 00167 #define TCP_EVENT_RECV(pcb,p,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ 00168 LWIP_EVENT_RECV, (p), 0, (err)) 00169 #define TCP_EVENT_CLOSED(pcb,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ 00170 LWIP_EVENT_RECV, NULL, 0, ERR_OK) 00171 #define TCP_EVENT_CONNECTED(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ 00172 LWIP_EVENT_CONNECTED, NULL, 0, (err)) 00173 #define TCP_EVENT_POLL(pcb,ret) do { if ((pcb)->state != SYN_RCVD) { \ 00174 ret = lwip_tcp_event((pcb)->callback_arg, (pcb), LWIP_EVENT_POLL, NULL, 0, ERR_OK); \ 00175 } else { \ 00176 ret = ERR_ARG; } } while(0) 00177 #define TCP_EVENT_ERR(last_state,errf,arg,err) do { if (last_state != SYN_RCVD) { \ 00178 lwip_tcp_event((arg), NULL, LWIP_EVENT_ERR, NULL, 0, (err)); } } while(0) 00179 00180 #else /* LWIP_EVENT_API */ 00181 00182 #define TCP_EVENT_ACCEPT(lpcb,pcb,arg,err,ret) \ 00183 do { \ 00184 if((lpcb)->accept != NULL) \ 00185 (ret) = (lpcb)->accept((arg),(pcb),(err)); \ 00186 else (ret) = ERR_ARG; \ 00187 } while (0) 00188 00189 #define TCP_EVENT_SENT(pcb,space,ret) \ 00190 do { \ 00191 if((pcb)->sent != NULL) \ 00192 (ret) = (pcb)->sent((pcb)->callback_arg,(pcb),(space)); \ 00193 else (ret) = ERR_OK; \ 00194 } while (0) 00195 00196 #define TCP_EVENT_RECV(pcb,p,err,ret) \ 00197 do { \ 00198 if((pcb)->recv != NULL) { \ 00199 (ret) = (pcb)->recv((pcb)->callback_arg,(pcb),(p),(err));\ 00200 } else { \ 00201 (ret) = tcp_recv_null(NULL, (pcb), (p), (err)); \ 00202 } \ 00203 } while (0) 00204 00205 #define TCP_EVENT_CLOSED(pcb,ret) \ 00206 do { \ 00207 if(((pcb)->recv != NULL)) { \ 00208 (ret) = (pcb)->recv((pcb)->callback_arg,(pcb),NULL,ERR_OK);\ 00209 } else { \ 00210 (ret) = ERR_OK; \ 00211 } \ 00212 } while (0) 00213 00214 #define TCP_EVENT_CONNECTED(pcb,err,ret) \ 00215 do { \ 00216 if((pcb)->connected != NULL) \ 00217 (ret) = (pcb)->connected((pcb)->callback_arg,(pcb),(err)); \ 00218 else (ret) = ERR_OK; \ 00219 } while (0) 00220 00221 #define TCP_EVENT_POLL(pcb,ret) \ 00222 do { \ 00223 if((pcb)->poll != NULL) \ 00224 (ret) = (pcb)->poll((pcb)->callback_arg,(pcb)); \ 00225 else (ret) = ERR_OK; \ 00226 } while (0) 00227 00228 #define TCP_EVENT_ERR(last_state,errf,arg,err) \ 00229 do { \ 00230 LWIP_UNUSED_ARG(last_state); \ 00231 if((errf) != NULL) \ 00232 (errf)((arg),(err)); \ 00233 } while (0) 00234 00235 #endif /* LWIP_EVENT_API */ 00236 00237 /** Enabled extra-check for TCP_OVERSIZE if LWIP_DEBUG is enabled */ 00238 #if TCP_OVERSIZE && defined(LWIP_DEBUG) 00239 #define TCP_OVERSIZE_DBGCHECK 1 00240 #else 00241 #define TCP_OVERSIZE_DBGCHECK 0 00242 #endif 00243 00244 /** Don't generate checksum on copy if CHECKSUM_GEN_TCP is disabled */ 00245 #define TCP_CHECKSUM_ON_COPY (LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_TCP) 00246 00247 /* This structure represents a TCP segment on the unsent, unacked and ooseq queues */ 00248 struct tcp_seg { 00249 struct tcp_seg *next; /* used when putting segments on a queue */ 00250 struct pbuf *p; /* buffer containing data + TCP header */ 00251 u16_t len; /* the TCP length of this segment */ 00252 #if TCP_OVERSIZE_DBGCHECK 00253 u16_t oversize_left; /* Extra bytes available at the end of the last 00254 pbuf in unsent (used for asserting vs. 00255 tcp_pcb.unsent_oversize only) */ 00256 #endif /* TCP_OVERSIZE_DBGCHECK */ 00257 #if TCP_CHECKSUM_ON_COPY 00258 u16_t chksum; 00259 u8_t chksum_swapped; 00260 #endif /* TCP_CHECKSUM_ON_COPY */ 00261 u8_t flags; 00262 #define TF_SEG_OPTS_MSS (u8_t)0x01U /* Include MSS option. */ 00263 #define TF_SEG_OPTS_TS (u8_t)0x02U /* Include timestamp option. */ 00264 #define TF_SEG_DATA_CHECKSUMMED (u8_t)0x04U /* ALL data (not the header) is 00265 checksummed into 'chksum' */ 00266 #define TF_SEG_OPTS_WND_SCALE (u8_t)0x08U /* Include WND SCALE option */ 00267 struct tcp_hdr *tcphdr; /* the TCP header */ 00268 }; 00269 00270 #define LWIP_TCP_OPT_EOL 0 00271 #define LWIP_TCP_OPT_NOP 1 00272 #define LWIP_TCP_OPT_MSS 2 00273 #define LWIP_TCP_OPT_WS 3 00274 #define LWIP_TCP_OPT_TS 8 00275 00276 #define LWIP_TCP_OPT_LEN_MSS 4 00277 #if LWIP_TCP_TIMESTAMPS 00278 #define LWIP_TCP_OPT_LEN_TS 10 00279 #define LWIP_TCP_OPT_LEN_TS_OUT 12 /* aligned for output (includes NOP padding) */ 00280 #else 00281 #define LWIP_TCP_OPT_LEN_TS_OUT 0 00282 #endif 00283 #if LWIP_WND_SCALE 00284 #define LWIP_TCP_OPT_LEN_WS 3 00285 #define LWIP_TCP_OPT_LEN_WS_OUT 4 /* aligned for output (includes NOP padding) */ 00286 #else 00287 #define LWIP_TCP_OPT_LEN_WS_OUT 0 00288 #endif 00289 00290 #define LWIP_TCP_OPT_LENGTH(flags) \ 00291 (flags & TF_SEG_OPTS_MSS ? LWIP_TCP_OPT_LEN_MSS : 0) + \ 00292 (flags & TF_SEG_OPTS_TS ? LWIP_TCP_OPT_LEN_TS_OUT : 0) + \ 00293 (flags & TF_SEG_OPTS_WND_SCALE ? LWIP_TCP_OPT_LEN_WS_OUT : 0) 00294 00295 /** This returns a TCP header option for MSS in an u32_t */ 00296 #define TCP_BUILD_MSS_OPTION(mss) lwip_htonl(0x02040000 | ((mss) & 0xFFFF)) 00297 00298 #if LWIP_WND_SCALE 00299 #define TCPWNDSIZE_F U32_F 00300 #define TCPWND_MAX 0xFFFFFFFFU 00301 #define TCPWND_CHECK16(x) LWIP_ASSERT("window size > 0xFFFF", (x) <= 0xFFFF) 00302 #define TCPWND_MIN16(x) ((u16_t)LWIP_MIN((x), 0xFFFF)) 00303 #else /* LWIP_WND_SCALE */ 00304 #define TCPWNDSIZE_F U16_F 00305 #define TCPWND_MAX 0xFFFFU 00306 #define TCPWND_CHECK16(x) 00307 #define TCPWND_MIN16(x) x 00308 #endif /* LWIP_WND_SCALE */ 00309 00310 /* Global variables: */ 00311 extern struct tcp_pcb *tcp_input_pcb; 00312 extern u32_t tcp_ticks; 00313 extern u8_t tcp_active_pcbs_changed; 00314 00315 /* The TCP PCB lists. */ 00316 union tcp_listen_pcbs_t { /* List of all TCP PCBs in LISTEN state. */ 00317 struct tcp_pcb_listen *listen_pcbs; 00318 struct tcp_pcb *pcbs; 00319 }; 00320 extern struct tcp_pcb *tcp_bound_pcbs; 00321 extern union tcp_listen_pcbs_t tcp_listen_pcbs; 00322 extern struct tcp_pcb *tcp_active_pcbs; /* List of all TCP PCBs that are in a 00323 state in which they accept or send 00324 data. */ 00325 extern struct tcp_pcb *tcp_tw_pcbs; /* List of all TCP PCBs in TIME-WAIT. */ 00326 00327 #define NUM_TCP_PCB_LISTS_NO_TIME_WAIT 3 00328 #define NUM_TCP_PCB_LISTS 4 00329 extern struct tcp_pcb ** const tcp_pcb_lists[NUM_TCP_PCB_LISTS]; 00330 00331 /* Axioms about the above lists: 00332 1) Every TCP PCB that is not CLOSED is in one of the lists. 00333 2) A PCB is only in one of the lists. 00334 3) All PCBs in the tcp_listen_pcbs list is in LISTEN state. 00335 4) All PCBs in the tcp_tw_pcbs list is in TIME-WAIT state. 00336 */ 00337 /* Define two macros, TCP_REG and TCP_RMV that registers a TCP PCB 00338 with a PCB list or removes a PCB from a list, respectively. */ 00339 #ifndef TCP_DEBUG_PCB_LISTS 00340 #define TCP_DEBUG_PCB_LISTS 0 00341 #endif 00342 #if TCP_DEBUG_PCB_LISTS 00343 #define TCP_REG(pcbs, npcb) do {\ 00344 struct tcp_pcb *tcp_tmp_pcb; \ 00345 LWIP_DEBUGF(TCP_DEBUG, ("TCP_REG %p local port %d\n", (npcb), (npcb)->local_port)); \ 00346 for (tcp_tmp_pcb = *(pcbs); \ 00347 tcp_tmp_pcb != NULL; \ 00348 tcp_tmp_pcb = tcp_tmp_pcb->next) { \ 00349 LWIP_ASSERT("TCP_REG: already registered\n", tcp_tmp_pcb != (npcb)); \ 00350 } \ 00351 LWIP_ASSERT("TCP_REG: pcb->state != CLOSED", ((pcbs) == &tcp_bound_pcbs) || ((npcb)->state != CLOSED)); \ 00352 (npcb)->next = *(pcbs); \ 00353 LWIP_ASSERT("TCP_REG: npcb->next != npcb", (npcb)->next != (npcb)); \ 00354 *(pcbs) = (npcb); \ 00355 LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \ 00356 tcp_timer_needed(); \ 00357 } while(0) 00358 #define TCP_RMV(pcbs, npcb) do { \ 00359 struct tcp_pcb *tcp_tmp_pcb; \ 00360 LWIP_ASSERT("TCP_RMV: pcbs != NULL", *(pcbs) != NULL); \ 00361 LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removing %p from %p\n", (npcb), *(pcbs))); \ 00362 if(*(pcbs) == (npcb)) { \ 00363 *(pcbs) = (*pcbs)->next; \ 00364 } else for (tcp_tmp_pcb = *(pcbs); tcp_tmp_pcb != NULL; tcp_tmp_pcb = tcp_tmp_pcb->next) { \ 00365 if(tcp_tmp_pcb->next == (npcb)) { \ 00366 tcp_tmp_pcb->next = (npcb)->next; \ 00367 break; \ 00368 } \ 00369 } \ 00370 (npcb)->next = NULL; \ 00371 LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \ 00372 LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removed %p from %p\n", (npcb), *(pcbs))); \ 00373 } while(0) 00374 00375 #else /* LWIP_DEBUG */ 00376 00377 #define TCP_REG(pcbs, npcb) \ 00378 do { \ 00379 (npcb)->next = *pcbs; \ 00380 *(pcbs) = (npcb); \ 00381 tcp_timer_needed(); \ 00382 } while (0) 00383 00384 #define TCP_RMV(pcbs, npcb) \ 00385 do { \ 00386 if(*(pcbs) == (npcb)) { \ 00387 (*(pcbs)) = (*pcbs)->next; \ 00388 } \ 00389 else { \ 00390 struct tcp_pcb *tcp_tmp_pcb; \ 00391 for (tcp_tmp_pcb = *pcbs; \ 00392 tcp_tmp_pcb != NULL; \ 00393 tcp_tmp_pcb = tcp_tmp_pcb->next) { \ 00394 if(tcp_tmp_pcb->next == (npcb)) { \ 00395 tcp_tmp_pcb->next = (npcb)->next; \ 00396 break; \ 00397 } \ 00398 } \ 00399 } \ 00400 (npcb)->next = NULL; \ 00401 } while(0) 00402 00403 #endif /* LWIP_DEBUG */ 00404 00405 #define TCP_REG_ACTIVE(npcb) \ 00406 do { \ 00407 TCP_REG(&tcp_active_pcbs, npcb); \ 00408 tcp_active_pcbs_changed = 1; \ 00409 } while (0) 00410 00411 #define TCP_RMV_ACTIVE(npcb) \ 00412 do { \ 00413 TCP_RMV(&tcp_active_pcbs, npcb); \ 00414 tcp_active_pcbs_changed = 1; \ 00415 } while (0) 00416 00417 #define TCP_PCB_REMOVE_ACTIVE(pcb) \ 00418 do { \ 00419 tcp_pcb_remove(&tcp_active_pcbs, pcb); \ 00420 tcp_active_pcbs_changed = 1; \ 00421 } while (0) 00422 00423 00424 /* Internal functions: */ 00425 struct tcp_pcb *tcp_pcb_copy(struct tcp_pcb *pcb); 00426 void tcp_pcb_purge(struct tcp_pcb *pcb); 00427 void tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb); 00428 00429 void tcp_segs_free(struct tcp_seg *seg); 00430 void tcp_seg_free(struct tcp_seg *seg); 00431 struct tcp_seg *tcp_seg_copy(struct tcp_seg *seg); 00432 00433 #define tcp_ack(pcb) \ 00434 do { \ 00435 if((pcb)->flags & TF_ACK_DELAY) { \ 00436 (pcb)->flags &= ~TF_ACK_DELAY; \ 00437 (pcb)->flags |= TF_ACK_NOW; \ 00438 } \ 00439 else { \ 00440 (pcb)->flags |= TF_ACK_DELAY; \ 00441 } \ 00442 } while (0) 00443 00444 #define tcp_ack_now(pcb) \ 00445 do { \ 00446 (pcb)->flags |= TF_ACK_NOW; \ 00447 } while (0) 00448 00449 err_t tcp_send_fin(struct tcp_pcb *pcb); 00450 err_t tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags); 00451 00452 void tcp_rexmit_seg(struct tcp_pcb *pcb, struct tcp_seg *seg); 00453 00454 void tcp_rst(u32_t seqno, u32_t ackno, 00455 const ip_addr_t *local_ip, const ip_addr_t *remote_ip, 00456 u16_t local_port, u16_t remote_port); 00457 00458 u32_t tcp_next_iss(struct tcp_pcb *pcb); 00459 00460 err_t tcp_keepalive(struct tcp_pcb *pcb); 00461 err_t tcp_zero_window_probe(struct tcp_pcb *pcb); 00462 void tcp_trigger_input_pcb_close(void); 00463 00464 #if TCP_CALCULATE_EFF_SEND_MSS 00465 u16_t tcp_eff_send_mss_impl(u16_t sendmss, const ip_addr_t *dest 00466 #if LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING 00467 , const ip_addr_t *src 00468 #endif /* LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING */ 00469 ); 00470 #if LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING 00471 #define tcp_eff_send_mss(sendmss, src, dest) tcp_eff_send_mss_impl(sendmss, dest, src) 00472 #else /* LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING */ 00473 #define tcp_eff_send_mss(sendmss, src, dest) tcp_eff_send_mss_impl(sendmss, dest) 00474 #endif /* LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING */ 00475 #endif /* TCP_CALCULATE_EFF_SEND_MSS */ 00476 00477 #if LWIP_CALLBACK_API 00478 err_t tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err); 00479 #endif /* LWIP_CALLBACK_API */ 00480 00481 #if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG 00482 void tcp_debug_print(struct tcp_hdr *tcphdr); 00483 void tcp_debug_print_flags(u8_t flags); 00484 void tcp_debug_print_state(enum tcp_state s); 00485 void tcp_debug_print_pcbs(void); 00486 s16_t tcp_pcbs_sane(void); 00487 #else 00488 # define tcp_debug_print(tcphdr) 00489 # define tcp_debug_print_flags(flags) 00490 # define tcp_debug_print_state(s) 00491 # define tcp_debug_print_pcbs() 00492 # define tcp_pcbs_sane() 1 00493 #endif /* TCP_DEBUG */ 00494 00495 /** External function (implemented in timers.c), called when TCP detects 00496 * that a timer is needed (i.e. active- or time-wait-pcb found). */ 00497 void tcp_timer_needed(void); 00498 00499 void tcp_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr); 00500 00501 #ifdef __cplusplus 00502 } 00503 #endif 00504 00505 #endif /* LWIP_TCP */ 00506 00507 #endif /* LWIP_HDR_TCP_PRIV_H */
Generated on Fri Jul 22 2022 04:54:01 by
 1.7.2
 1.7.2 
    