36 |
* |
* |
37 |
*/ |
*/ |
38 |
|
|
39 |
/*-----------------------------------------------------------------------------------*/ |
|
40 |
/* tcp.c |
/* tcp.c |
41 |
* |
* |
42 |
* This file contains common functions for the TCP implementation, such as functinos |
* This file contains common functions for the TCP implementation, such as functinos |
44 |
* related to input and output is found in tcp_input.c and tcp_output.c respectively. |
* related to input and output is found in tcp_input.c and tcp_output.c respectively. |
45 |
* |
* |
46 |
*/ |
*/ |
47 |
/*-----------------------------------------------------------------------------------*/ |
|
48 |
|
|
49 |
|
|
50 |
#include "lwip/opt.h" |
#include "lwip/opt.h" |
74 |
|
|
75 |
static u16_t tcp_new_port(void); |
static u16_t tcp_new_port(void); |
76 |
|
|
77 |
/*-----------------------------------------------------------------------------------*/ |
|
78 |
/* |
/* |
79 |
* tcp_init(): |
* tcp_init(): |
80 |
* |
* |
81 |
* Initializes the TCP layer. |
* Initializes the TCP layer. |
82 |
*/ |
*/ |
83 |
/*-----------------------------------------------------------------------------------*/ |
|
84 |
void |
void |
85 |
tcp_init(void) |
tcp_init(void) |
86 |
{ |
{ |
95 |
tcp_timer = 0; |
tcp_timer = 0; |
96 |
|
|
97 |
} |
} |
98 |
/*-----------------------------------------------------------------------------------*/ |
|
99 |
/* |
/* |
100 |
* tcp_tmr(): |
* tcp_tmr(): |
101 |
* |
* |
102 |
* Called periodically to dispatch TCP timers. |
* Called periodically to dispatch TCP timers. |
103 |
* |
* |
104 |
*/ |
*/ |
105 |
/*-----------------------------------------------------------------------------------*/ |
|
106 |
void |
void |
107 |
tcp_tmr(void) |
tcp_tmr(void) |
108 |
{ |
{ |
115 |
tcp_slowtmr(); |
tcp_slowtmr(); |
116 |
} |
} |
117 |
} |
} |
118 |
/*-----------------------------------------------------------------------------------*/ |
|
119 |
/* |
/* |
120 |
* tcp_close(): |
* tcp_close(): |
121 |
* |
* |
122 |
* Closes the connection held by the PCB. |
* Closes the connection held by the PCB. |
123 |
* |
* |
124 |
*/ |
*/ |
125 |
/*-----------------------------------------------------------------------------------*/ |
|
126 |
err_t |
err_t |
127 |
tcp_close(struct tcp_pcb *pcb) |
tcp_close(struct tcp_pcb *pcb) |
128 |
{ |
{ |
176 |
} |
} |
177 |
return err; |
return err; |
178 |
} |
} |
179 |
/*-----------------------------------------------------------------------------------*/ |
|
180 |
/* |
/* |
181 |
* tcp_abort() |
* tcp_abort() |
182 |
* |
* |
185 |
* killed because of shortage of memory. |
* killed because of shortage of memory. |
186 |
* |
* |
187 |
*/ |
*/ |
188 |
/*-----------------------------------------------------------------------------------*/ |
|
189 |
void |
void |
190 |
tcp_abort(struct tcp_pcb *pcb) |
tcp_abort(struct tcp_pcb *pcb) |
191 |
{ |
{ |
233 |
tcp_rst(seqno, ackno, &local_ip, &remote_ip, local_port, remote_port); |
tcp_rst(seqno, ackno, &local_ip, &remote_ip, local_port, remote_port); |
234 |
} |
} |
235 |
} |
} |
236 |
/*-----------------------------------------------------------------------------------*/ |
|
237 |
/* |
/* |
238 |
* tcp_bind(): |
* tcp_bind(): |
239 |
* |
* |
242 |
* the outgoing network interface is used instead. |
* the outgoing network interface is used instead. |
243 |
* |
* |
244 |
*/ |
*/ |
245 |
/*-----------------------------------------------------------------------------------*/ |
|
246 |
err_t |
err_t |
247 |
tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port) |
tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port) |
248 |
{ |
{ |
390 |
return ERR_ABRT; |
return ERR_ABRT; |
391 |
} |
} |
392 |
#endif /* LWIP_CALLBACK_API */ |
#endif /* LWIP_CALLBACK_API */ |
393 |
/*-----------------------------------------------------------------------------------*/ |
|
394 |
/* |
/* |
395 |
* tcp_listen(): |
* tcp_listen(): |
396 |
* |
* |
400 |
* connection to LISTEN is an irreversible process. |
* connection to LISTEN is an irreversible process. |
401 |
* |
* |
402 |
*/ |
*/ |
403 |
/*-----------------------------------------------------------------------------------*/ |
|
404 |
struct tcp_pcb * |
struct tcp_pcb * |
405 |
tcp_listen(struct tcp_pcb *pcb) |
tcp_listen(struct tcp_pcb *pcb) |
406 |
{ |
{ |
429 |
TCP_REG(&tcp_listen_pcbs, lpcb); |
TCP_REG(&tcp_listen_pcbs, lpcb); |
430 |
return (struct tcp_pcb *)lpcb; |
return (struct tcp_pcb *)lpcb; |
431 |
} |
} |
432 |
/*-----------------------------------------------------------------------------------*/ |
|
433 |
/* |
/* |
434 |
* tcp_recved(): |
* tcp_recved(): |
435 |
* |
* |
438 |
* when the data has been processed. |
* when the data has been processed. |
439 |
* |
* |
440 |
*/ |
*/ |
441 |
/*-----------------------------------------------------------------------------------*/ |
|
442 |
void |
void |
443 |
tcp_recved(struct tcp_pcb *pcb, u16_t len) |
tcp_recved(struct tcp_pcb *pcb, u16_t len) |
444 |
{ |
{ |
455 |
LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: recveived %u bytes, wnd %u (%u).\n", |
LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: recveived %u bytes, wnd %u (%u).\n", |
456 |
len, pcb->rcv_wnd, TCP_WND - pcb->rcv_wnd)); |
len, pcb->rcv_wnd, TCP_WND - pcb->rcv_wnd)); |
457 |
} |
} |
458 |
/*-----------------------------------------------------------------------------------*/ |
|
459 |
/* |
/* |
460 |
* tcp_new_port(): |
* tcp_new_port(): |
461 |
* |
* |
462 |
* A nastly hack featuring 'goto' statements that allocates a |
* A nastly hack featuring 'goto' statements that allocates a |
463 |
* new TCP local port. |
* new TCP local port. |
464 |
*/ |
*/ |
465 |
/*-----------------------------------------------------------------------------------*/ |
|
466 |
static u16_t |
static u16_t |
467 |
tcp_new_port(void) |
tcp_new_port(void) |
468 |
{ |
{ |
495 |
} |
} |
496 |
return port; |
return port; |
497 |
} |
} |
498 |
/*-----------------------------------------------------------------------------------*/ |
|
499 |
/* |
/* |
500 |
* tcp_connect(): |
* tcp_connect(): |
501 |
* |
* |
503 |
* argument will be called when the connection has been established. |
* argument will be called when the connection has been established. |
504 |
* |
* |
505 |
*/ |
*/ |
506 |
/*-----------------------------------------------------------------------------------*/ |
|
507 |
err_t |
err_t |
508 |
tcp_connect(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port, |
tcp_connect(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port, |
509 |
err_t (* connected)(void *arg, struct tcp_pcb *tpcb, err_t err)) |
err_t (* connected)(void *arg, struct tcp_pcb *tpcb, err_t err)) |
550 |
} |
} |
551 |
return ret; |
return ret; |
552 |
} |
} |
553 |
/*-----------------------------------------------------------------------------------*/ |
|
554 |
/* |
/* |
555 |
* tcp_slowtmr(): |
* tcp_slowtmr(): |
556 |
* |
* |
558 |
* removes PCBs that have been in TIME-WAIT for enough time. It also increments |
* removes PCBs that have been in TIME-WAIT for enough time. It also increments |
559 |
* various timers such as the inactivity timer in each PCB. |
* various timers such as the inactivity timer in each PCB. |
560 |
*/ |
*/ |
561 |
/*-----------------------------------------------------------------------------------*/ |
|
562 |
void |
void |
563 |
tcp_slowtmr(void) |
tcp_slowtmr(void) |
564 |
{ |
{ |
734 |
} |
} |
735 |
} |
} |
736 |
} |
} |
737 |
/*-----------------------------------------------------------------------------------*/ |
|
738 |
/* |
/* |
739 |
* tcp_fasttmr(): |
* tcp_fasttmr(): |
740 |
* |
* |
741 |
* Is called every TCP_FAST_INTERVAL (250 ms) and sends delayed ACKs. |
* Is called every TCP_FAST_INTERVAL (250 ms) and sends delayed ACKs. |
742 |
*/ |
*/ |
743 |
/*-----------------------------------------------------------------------------------*/ |
|
744 |
void |
void |
745 |
tcp_fasttmr(void) |
tcp_fasttmr(void) |
746 |
{ |
{ |
755 |
} |
} |
756 |
} |
} |
757 |
} |
} |
758 |
/*-----------------------------------------------------------------------------------*/ |
|
759 |
/* |
/* |
760 |
* tcp_segs_free(): |
* tcp_segs_free(): |
761 |
* |
* |
762 |
* Deallocates a list of TCP segments (tcp_seg structures). |
* Deallocates a list of TCP segments (tcp_seg structures). |
763 |
* |
* |
764 |
*/ |
*/ |
765 |
/*-----------------------------------------------------------------------------------*/ |
|
766 |
u8_t |
u8_t |
767 |
tcp_segs_free(struct tcp_seg *seg) |
tcp_segs_free(struct tcp_seg *seg) |
768 |
{ |
{ |
775 |
} |
} |
776 |
return count; |
return count; |
777 |
} |
} |
778 |
/*-----------------------------------------------------------------------------------*/ |
|
779 |
/* |
/* |
780 |
* tcp_seg_free(): |
* tcp_seg_free(): |
781 |
* |
* |
782 |
* Frees a TCP segment. |
* Frees a TCP segment. |
783 |
* |
* |
784 |
*/ |
*/ |
785 |
/*-----------------------------------------------------------------------------------*/ |
|
786 |
u8_t |
u8_t |
787 |
tcp_seg_free(struct tcp_seg *seg) |
tcp_seg_free(struct tcp_seg *seg) |
788 |
{ |
{ |
799 |
} |
} |
800 |
return count; |
return count; |
801 |
} |
} |
802 |
/*-----------------------------------------------------------------------------------*/ |
|
803 |
/* |
/* |
804 |
* tcp_setprio(): |
* tcp_setprio(): |
805 |
* |
* |
806 |
* Sets the priority of a connection. |
* Sets the priority of a connection. |
807 |
* |
* |
808 |
*/ |
*/ |
809 |
/*-----------------------------------------------------------------------------------*/ |
|
810 |
void |
void |
811 |
tcp_setprio(struct tcp_pcb *pcb, u8_t prio) |
tcp_setprio(struct tcp_pcb *pcb, u8_t prio) |
812 |
{ |
{ |
813 |
pcb->prio = prio; |
pcb->prio = prio; |
814 |
} |
} |
815 |
#if TCP_QUEUE_OOSEQ |
#if TCP_QUEUE_OOSEQ |
816 |
/*-----------------------------------------------------------------------------------*/ |
|
817 |
/* |
/* |
818 |
* tcp_seg_copy(): |
* tcp_seg_copy(): |
819 |
* |
* |
820 |
* Returns a copy of the given TCP segment. |
* Returns a copy of the given TCP segment. |
821 |
* |
* |
822 |
*/ |
*/ |
823 |
/*-----------------------------------------------------------------------------------*/ |
|
824 |
struct tcp_seg * |
struct tcp_seg * |
825 |
tcp_seg_copy(struct tcp_seg *seg) |
tcp_seg_copy(struct tcp_seg *seg) |
826 |
{ |
{ |
835 |
return cseg; |
return cseg; |
836 |
} |
} |
837 |
#endif |
#endif |
838 |
/*-----------------------------------------------------------------------------------*/ |
|
839 |
#if LWIP_CALLBACK_API |
#if LWIP_CALLBACK_API |
840 |
static err_t |
static err_t |
841 |
tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) |
tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) |
849 |
return ERR_OK; |
return ERR_OK; |
850 |
} |
} |
851 |
#endif /* LWIP_CALLBACK_API */ |
#endif /* LWIP_CALLBACK_API */ |
852 |
/*-----------------------------------------------------------------------------------*/ |
|
853 |
static void |
static void |
854 |
tcp_kill_prio(u8_t prio) |
tcp_kill_prio(u8_t prio) |
855 |
{ |
{ |
880 |
} |
} |
881 |
} |
} |
882 |
|
|
883 |
/*-----------------------------------------------------------------------------------*/ |
|
884 |
static void |
static void |
885 |
tcp_kill_timewait(void) |
tcp_kill_timewait(void) |
886 |
{ |
{ |
902 |
} |
} |
903 |
} |
} |
904 |
|
|
905 |
/*-----------------------------------------------------------------------------------*/ |
|
906 |
/*-----------------------------------------------------------------------------------*/ |
|
907 |
struct tcp_pcb * |
struct tcp_pcb * |
908 |
tcp_alloc(u8_t prio) |
tcp_alloc(u8_t prio) |
909 |
{ |
{ |
955 |
} |
} |
956 |
return pcb; |
return pcb; |
957 |
} |
} |
958 |
/*-----------------------------------------------------------------------------------*/ |
|
959 |
/* |
/* |
960 |
* tcp_new(): |
* tcp_new(): |
961 |
* |
* |
963 |
* any of the TCP PCB lists. |
* any of the TCP PCB lists. |
964 |
* |
* |
965 |
*/ |
*/ |
966 |
/*-----------------------------------------------------------------------------------*/ |
|
967 |
struct tcp_pcb * |
struct tcp_pcb * |
968 |
tcp_new(void) |
tcp_new(void) |
969 |
{ |
{ |
970 |
return tcp_alloc(TCP_PRIO_NORMAL); |
return tcp_alloc(TCP_PRIO_NORMAL); |
971 |
} |
} |
972 |
/*-----------------------------------------------------------------------------------*/ |
|
973 |
/* |
/* |
974 |
* tcp_arg(): |
* tcp_arg(): |
975 |
* |
* |
977 |
* functions. |
* functions. |
978 |
* |
* |
979 |
*/ |
*/ |
980 |
/*-----------------------------------------------------------------------------------*/ |
|
981 |
void |
void |
982 |
tcp_arg(struct tcp_pcb *pcb, void *arg) |
tcp_arg(struct tcp_pcb *pcb, void *arg) |
983 |
{ |
{ |
984 |
pcb->callback_arg = arg; |
pcb->callback_arg = arg; |
985 |
} |
} |
986 |
#if LWIP_CALLBACK_API |
#if LWIP_CALLBACK_API |
987 |
/*-----------------------------------------------------------------------------------*/ |
|
988 |
/* |
/* |
989 |
* tcp_recv(): |
* tcp_recv(): |
990 |
* |
* |
992 |
* connection receives data. |
* connection receives data. |
993 |
* |
* |
994 |
*/ |
*/ |
995 |
/*-----------------------------------------------------------------------------------*/ |
|
996 |
void |
void |
997 |
tcp_recv(struct tcp_pcb *pcb, |
tcp_recv(struct tcp_pcb *pcb, |
998 |
err_t (* recv)(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)) |
err_t (* recv)(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)) |
999 |
{ |
{ |
1000 |
pcb->recv = recv; |
pcb->recv = recv; |
1001 |
} |
} |
1002 |
/*-----------------------------------------------------------------------------------*/ |
|
1003 |
/* |
/* |
1004 |
* tcp_sent(): |
* tcp_sent(): |
1005 |
* |
* |
1007 |
* has been successfully delivered to the remote host. |
* has been successfully delivered to the remote host. |
1008 |
* |
* |
1009 |
*/ |
*/ |
1010 |
/*-----------------------------------------------------------------------------------*/ |
|
1011 |
void |
void |
1012 |
tcp_sent(struct tcp_pcb *pcb, |
tcp_sent(struct tcp_pcb *pcb, |
1013 |
err_t (* sent)(void *arg, struct tcp_pcb *tpcb, u16_t len)) |
err_t (* sent)(void *arg, struct tcp_pcb *tpcb, u16_t len)) |
1014 |
{ |
{ |
1015 |
pcb->sent = sent; |
pcb->sent = sent; |
1016 |
} |
} |
1017 |
/*-----------------------------------------------------------------------------------*/ |
|
1018 |
/* |
/* |
1019 |
* tcp_err(): |
* tcp_err(): |
1020 |
* |
* |
1022 |
* has occured on the connection. |
* has occured on the connection. |
1023 |
* |
* |
1024 |
*/ |
*/ |
1025 |
/*-----------------------------------------------------------------------------------*/ |
|
1026 |
void |
void |
1027 |
tcp_err(struct tcp_pcb *pcb, |
tcp_err(struct tcp_pcb *pcb, |
1028 |
void (* errf)(void *arg, err_t err)) |
void (* errf)(void *arg, err_t err)) |
1029 |
{ |
{ |
1030 |
pcb->errf = errf; |
pcb->errf = errf; |
1031 |
} |
} |
1032 |
/*-----------------------------------------------------------------------------------*/ |
|
1033 |
/* |
/* |
1034 |
* tcp_accept(): |
* tcp_accept(): |
1035 |
* |
* |
1037 |
* LISTENing connection has been connected to another host. |
* LISTENing connection has been connected to another host. |
1038 |
* |
* |
1039 |
*/ |
*/ |
1040 |
/*-----------------------------------------------------------------------------------*/ |
|
1041 |
void |
void |
1042 |
tcp_accept(struct tcp_pcb *pcb, |
tcp_accept(struct tcp_pcb *pcb, |
1043 |
err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err)) |
err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err)) |
1046 |
} |
} |
1047 |
#endif /* LWIP_CALLBACK_API */ |
#endif /* LWIP_CALLBACK_API */ |
1048 |
|
|
1049 |
/*-----------------------------------------------------------------------------------*/ |
|
1050 |
/* |
/* |
1051 |
* tcp_poll(): |
* tcp_poll(): |
1052 |
* |
* |
1055 |
* timer interval, which is called twice a second. |
* timer interval, which is called twice a second. |
1056 |
* |
* |
1057 |
*/ |
*/ |
1058 |
/*-----------------------------------------------------------------------------------*/ |
|
1059 |
void |
void |
1060 |
tcp_poll(struct tcp_pcb *pcb, |
tcp_poll(struct tcp_pcb *pcb, |
1061 |
err_t (* poll)(void *arg, struct tcp_pcb *tpcb), u8_t interval) |
err_t (* poll)(void *arg, struct tcp_pcb *tpcb), u8_t interval) |
1065 |
#endif /* LWIP_CALLBACK_API */ |
#endif /* LWIP_CALLBACK_API */ |
1066 |
pcb->pollinterval = interval; |
pcb->pollinterval = interval; |
1067 |
} |
} |
1068 |
/*-----------------------------------------------------------------------------------*/ |
|
1069 |
/* |
/* |
1070 |
* tcp_pcb_purge(): |
* tcp_pcb_purge(): |
1071 |
* |
* |
1072 |
* Purges a TCP PCB. Removes any buffered data and frees the buffer memory. |
* Purges a TCP PCB. Removes any buffered data and frees the buffer memory. |
1073 |
* |
* |
1074 |
*/ |
*/ |
1075 |
/*-----------------------------------------------------------------------------------*/ |
|
1076 |
void |
void |
1077 |
tcp_pcb_purge(struct tcp_pcb *pcb) |
tcp_pcb_purge(struct tcp_pcb *pcb) |
1078 |
{ |
{ |
1107 |
NULL; |
NULL; |
1108 |
} |
} |
1109 |
} |
} |
1110 |
/*-----------------------------------------------------------------------------------*/ |
|
1111 |
/* |
/* |
1112 |
* tcp_pcb_remove(): |
* tcp_pcb_remove(): |
1113 |
* |
* |
1114 |
* Purges the PCB and removes it from a PCB list. Any delayed ACKs are sent first. |
* Purges the PCB and removes it from a PCB list. Any delayed ACKs are sent first. |
1115 |
* |
* |
1116 |
*/ |
*/ |
1117 |
/*-----------------------------------------------------------------------------------*/ |
|
1118 |
void |
void |
1119 |
tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb) |
tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb) |
1120 |
{ |
{ |
1133 |
|
|
1134 |
LWIP_ASSERT("tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane()); |
LWIP_ASSERT("tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane()); |
1135 |
} |
} |
1136 |
/*-----------------------------------------------------------------------------------*/ |
|
1137 |
/* |
/* |
1138 |
* tcp_next_iss(): |
* tcp_next_iss(): |
1139 |
* |
* |
1140 |
* Calculates a new initial sequence number for new connections. |
* Calculates a new initial sequence number for new connections. |
1141 |
* |
* |
1142 |
*/ |
*/ |
1143 |
/*-----------------------------------------------------------------------------------*/ |
|
1144 |
u32_t |
u32_t |
1145 |
tcp_next_iss(void) |
tcp_next_iss(void) |
1146 |
{ |
{ |
1149 |
iss += tcp_ticks; /* XXX */ |
iss += tcp_ticks; /* XXX */ |
1150 |
return iss; |
return iss; |
1151 |
} |
} |
1152 |
/*-----------------------------------------------------------------------------------*/ |
|
1153 |
#if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG |
#if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG |
1154 |
void |
void |
1155 |
tcp_debug_print(struct tcp_hdr *tcphdr) |
tcp_debug_print(struct tcp_hdr *tcphdr) |
1181 |
ntohs(tcphdr->chksum), ntohs(tcphdr->urgp))); |
ntohs(tcphdr->chksum), ntohs(tcphdr->urgp))); |
1182 |
LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); |
LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); |
1183 |
} |
} |
1184 |
/*-----------------------------------------------------------------------------------*/ |
|
1185 |
void |
void |
1186 |
tcp_debug_print_state(enum tcp_state s) |
tcp_debug_print_state(enum tcp_state s) |
1187 |
{ |
{ |
1222 |
break; |
break; |
1223 |
} |
} |
1224 |
} |
} |
1225 |
/*-----------------------------------------------------------------------------------*/ |
|
1226 |
void |
void |
1227 |
tcp_debug_print_flags(u8_t flags) |
tcp_debug_print_flags(u8_t flags) |
1228 |
{ |
{ |
1251 |
LWIP_DEBUGF(TCP_DEBUG, ("CWR ")); |
LWIP_DEBUGF(TCP_DEBUG, ("CWR ")); |
1252 |
} |
} |
1253 |
} |
} |
1254 |
/*-----------------------------------------------------------------------------------*/ |
|
1255 |
void |
void |
1256 |
tcp_debug_print_pcbs(void) |
tcp_debug_print_pcbs(void) |
1257 |
{ |
{ |
1278 |
tcp_debug_print_state(pcb->state); |
tcp_debug_print_state(pcb->state); |
1279 |
} |
} |
1280 |
} |
} |
1281 |
/*-----------------------------------------------------------------------------------*/ |
|
1282 |
int |
int |
1283 |
tcp_pcbs_sane(void) |
tcp_pcbs_sane(void) |
1284 |
{ |
{ |
1295 |
} |
} |
1296 |
#endif /* TCP_DEBUG */ |
#endif /* TCP_DEBUG */ |
1297 |
#endif /* LWIP_TCP */ |
#endif /* LWIP_TCP */ |
1298 |
/*-----------------------------------------------------------------------------------*/ |
|
1299 |
|
|
1300 |
|
|
1301 |
|
|