69 |
|
|
70 |
static u8_t tcp_timer; |
static u8_t tcp_timer; |
71 |
|
|
72 |
|
static u16_t tcp_new_port(void); |
73 |
|
|
74 |
/*-----------------------------------------------------------------------------------*/ |
/*-----------------------------------------------------------------------------------*/ |
75 |
/* |
/* |
76 |
* tcp_init(): |
* tcp_init(): |
252 |
{ |
{ |
253 |
struct tcp_pcb *cpcb; |
struct tcp_pcb *cpcb; |
254 |
|
|
255 |
|
if(port == 0) { |
256 |
|
port = tcp_new_port(); |
257 |
|
} |
258 |
|
|
259 |
/* Check if the address already is in use. */ |
/* Check if the address already is in use. */ |
260 |
for(cpcb = (struct tcp_pcb *)tcp_listen_pcbs; |
for(cpcb = (struct tcp_pcb *)tcp_listen_pcbs; |
261 |
cpcb != NULL; cpcb = cpcb->next) { |
cpcb != NULL; cpcb = cpcb->next) { |
281 |
pcb->local_ip = *ipaddr; |
pcb->local_ip = *ipaddr; |
282 |
} |
} |
283 |
pcb->local_port = port; |
pcb->local_port = port; |
284 |
DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %d\n", port)); |
DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %u\n", port)); |
285 |
return ERR_OK; |
return ERR_OK; |
286 |
} |
} |
287 |
#if LWIP_CALLBACK_API |
#if LWIP_CALLBACK_API |
343 |
!(pcb->flags & TF_ACK_NOW)) { |
!(pcb->flags & TF_ACK_NOW)) { |
344 |
tcp_ack(pcb); |
tcp_ack(pcb); |
345 |
} |
} |
346 |
DEBUGF(TCP_DEBUG, ("tcp_recved: recveived %d bytes, wnd %u (%u).\n", |
DEBUGF(TCP_DEBUG, ("tcp_recved: recveived %u bytes, wnd %u (%u).\n", |
347 |
len, pcb->rcv_wnd, TCP_WND - pcb->rcv_wnd)); |
len, pcb->rcv_wnd, TCP_WND - pcb->rcv_wnd)); |
348 |
} |
} |
349 |
/*-----------------------------------------------------------------------------------*/ |
/*-----------------------------------------------------------------------------------*/ |
358 |
tcp_new_port(void) |
tcp_new_port(void) |
359 |
{ |
{ |
360 |
struct tcp_pcb *pcb; |
struct tcp_pcb *pcb; |
361 |
static u16_t port = 4096; |
#ifndef TCP_LOCAL_PORT_RANGE_START |
362 |
|
#define TCP_LOCAL_PORT_RANGE_START 4096 |
363 |
|
#define TCP_LOCAL_PORT_RANGE_END 0x7fff |
364 |
|
#endif |
365 |
|
static u16_t port = TCP_LOCAL_PORT_RANGE_START; |
366 |
|
|
367 |
again: |
again: |
368 |
if(++port > 0x7fff) { |
if(++port > TCP_LOCAL_PORT_RANGE_END) { |
369 |
port = 4096; |
port = TCP_LOCAL_PORT_RANGE_START; |
370 |
} |
} |
371 |
|
|
372 |
for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { |
for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { |
403 |
err_t ret; |
err_t ret; |
404 |
u32_t iss; |
u32_t iss; |
405 |
|
|
406 |
DEBUGF(TCP_DEBUG, ("tcp_connect to port %d\n", port)); |
DEBUGF(TCP_DEBUG, ("tcp_connect to port %u\n", port)); |
407 |
if(ipaddr != NULL) { |
if(ipaddr != NULL) { |
408 |
pcb->remote_ip = *ipaddr; |
pcb->remote_ip = *ipaddr; |
409 |
} else { |
} else { |
468 |
if (pcb == NULL) DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs")); |
if (pcb == NULL) DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs")); |
469 |
while(pcb != NULL) { |
while(pcb != NULL) { |
470 |
DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb")); |
DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb")); |
471 |
ASSERT("tcp_slowtmr: active pcb->state != CLOSED", pcb->state != CLOSED); |
LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED", pcb->state != CLOSED); |
472 |
ASSERT("tcp_slowtmr: active pcb->state != LISTEN", pcb->state != LISTEN); |
LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN", pcb->state != LISTEN); |
473 |
ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT); |
LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT); |
474 |
|
|
475 |
pcb_remove = 0; |
pcb_remove = 0; |
476 |
|
|
486 |
if(pcb->unacked != NULL && pcb->rtime >= pcb->rto) { |
if(pcb->unacked != NULL && pcb->rtime >= pcb->rto) { |
487 |
|
|
488 |
/* Time for a retransmission. */ |
/* Time for a retransmission. */ |
489 |
DEBUGF(TCP_RTO_DEBUG, ("tcp_slowtmr: rtime %d pcb->rto %d\n", |
DEBUGF(TCP_RTO_DEBUG, ("tcp_slowtmr: rtime %u pcb->rto %u\n", |
490 |
pcb->rtime, pcb->rto)); |
pcb->rtime, pcb->rto)); |
491 |
|
|
492 |
/* Double retransmission time-out unless we are trying to |
/* Double retransmission time-out unless we are trying to |
547 |
tcp_pcb_purge(pcb); |
tcp_pcb_purge(pcb); |
548 |
/* Remove PCB from tcp_active_pcbs list. */ |
/* Remove PCB from tcp_active_pcbs list. */ |
549 |
if(prev != NULL) { |
if(prev != NULL) { |
550 |
ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs); |
LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs); |
551 |
prev->next = pcb->next; |
prev->next = pcb->next; |
552 |
} else { |
} else { |
553 |
/* This PCB was the first. */ |
/* This PCB was the first. */ |
554 |
ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb); |
LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb); |
555 |
tcp_active_pcbs = pcb->next; |
tcp_active_pcbs = pcb->next; |
556 |
} |
} |
557 |
|
|
583 |
prev = NULL; |
prev = NULL; |
584 |
pcb = tcp_tw_pcbs; |
pcb = tcp_tw_pcbs; |
585 |
while(pcb != NULL) { |
while(pcb != NULL) { |
586 |
ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); |
LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); |
587 |
pcb_remove = 0; |
pcb_remove = 0; |
588 |
|
|
589 |
/* Check if this PCB has stayed long enough in TIME-WAIT */ |
/* Check if this PCB has stayed long enough in TIME-WAIT */ |
598 |
tcp_pcb_purge(pcb); |
tcp_pcb_purge(pcb); |
599 |
/* Remove PCB from tcp_tw_pcbs list. */ |
/* Remove PCB from tcp_tw_pcbs list. */ |
600 |
if(prev != NULL) { |
if(prev != NULL) { |
601 |
ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs); |
LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs); |
602 |
prev->next = pcb->next; |
prev->next = pcb->next; |
603 |
} else { |
} else { |
604 |
/* This PCB was the first. */ |
/* This PCB was the first. */ |
605 |
ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb); |
LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb); |
606 |
tcp_tw_pcbs = pcb->next; |
tcp_tw_pcbs = pcb->next; |
607 |
} |
} |
608 |
pcb2 = pcb->next; |
pcb2 = pcb->next; |
1012 |
} |
} |
1013 |
pcb->state = CLOSED; |
pcb->state = CLOSED; |
1014 |
|
|
1015 |
ASSERT("tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane()); |
LWIP_ASSERT("tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane()); |
1016 |
} |
} |
1017 |
/*-----------------------------------------------------------------------------------*/ |
/*-----------------------------------------------------------------------------------*/ |
1018 |
/* |
/* |
1046 |
DEBUGF(TCP_DEBUG, ("| %08lu | (ack no)\n", |
DEBUGF(TCP_DEBUG, ("| %08lu | (ack no)\n", |
1047 |
tcphdr->ackno)); |
tcphdr->ackno)); |
1048 |
DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); |
DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); |
1049 |
DEBUGF(TCP_DEBUG, ("| %2d | |%d%d%d%d%d| %5d | (offset, flags (", |
DEBUGF(TCP_DEBUG, ("| %2u | |%u%u%u%u%u| %5u | (offset, flags (", |
1050 |
|
TCPH_OFFSET(tcphdr), |
1051 |
TCPH_FLAGS(tcphdr) >> 4 & 1, |
TCPH_FLAGS(tcphdr) >> 4 & 1, |
1052 |
TCPH_FLAGS(tcphdr) >> 4 & 1, |
TCPH_FLAGS(tcphdr) >> 4 & 1, |
1053 |
TCPH_FLAGS(tcphdr) >> 3 & 1, |
TCPH_FLAGS(tcphdr) >> 3 & 1, |
1058 |
tcp_debug_print_flags(TCPH_FLAGS(tcphdr)); |
tcp_debug_print_flags(TCPH_FLAGS(tcphdr)); |
1059 |
DEBUGF(TCP_DEBUG, ("), win)\n")); |
DEBUGF(TCP_DEBUG, ("), win)\n")); |
1060 |
DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); |
DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); |
1061 |
DEBUGF(TCP_DEBUG, ("| 0x%04x | %5d | (chksum, urgp)\n", |
DEBUGF(TCP_DEBUG, ("| 0x%04x | %5u | (chksum, urgp)\n", |
1062 |
ntohs(tcphdr->chksum), ntohs(tcphdr->urgp))); |
ntohs(tcphdr->chksum), ntohs(tcphdr->urgp))); |
1063 |
DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); |
DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); |
1064 |
} |
} |
1133 |
struct tcp_pcb *pcb; |
struct tcp_pcb *pcb; |
1134 |
DEBUGF(TCP_DEBUG, ("Active PCB states:\n")); |
DEBUGF(TCP_DEBUG, ("Active PCB states:\n")); |
1135 |
for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { |
for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { |
1136 |
DEBUGF(TCP_DEBUG, ("Local port %d, foreign port %d snd_nxt %lu rcv_nxt %lu ", |
DEBUGF(TCP_DEBUG, ("Local port %u, foreign port %u snd_nxt %lu rcv_nxt %lu ", |
1137 |
pcb->local_port, pcb->remote_port, |
pcb->local_port, pcb->remote_port, |
1138 |
pcb->snd_nxt, pcb->rcv_nxt)); |
pcb->snd_nxt, pcb->rcv_nxt)); |
1139 |
tcp_debug_print_state(pcb->state); |
tcp_debug_print_state(pcb->state); |
1140 |
} |
} |
1141 |
DEBUGF(TCP_DEBUG, ("Listen PCB states:\n")); |
DEBUGF(TCP_DEBUG, ("Listen PCB states:\n")); |
1142 |
for(pcb = (struct tcp_pcb *)tcp_listen_pcbs; pcb != NULL; pcb = pcb->next) { |
for(pcb = (struct tcp_pcb *)tcp_listen_pcbs; pcb != NULL; pcb = pcb->next) { |
1143 |
DEBUGF(TCP_DEBUG, ("Local port %d, foreign port %d snd_nxt %lu rcv_nxt %lu ", |
DEBUGF(TCP_DEBUG, ("Local port %u, foreign port %u snd_nxt %lu rcv_nxt %lu ", |
1144 |
pcb->local_port, pcb->remote_port, |
pcb->local_port, pcb->remote_port, |
1145 |
pcb->snd_nxt, pcb->rcv_nxt)); |
pcb->snd_nxt, pcb->rcv_nxt)); |
1146 |
tcp_debug_print_state(pcb->state); |
tcp_debug_print_state(pcb->state); |
1147 |
} |
} |
1148 |
DEBUGF(TCP_DEBUG, ("TIME-WAIT PCB states:\n")); |
DEBUGF(TCP_DEBUG, ("TIME-WAIT PCB states:\n")); |
1149 |
for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { |
for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { |
1150 |
DEBUGF(TCP_DEBUG, ("Local port %d, foreign port %d snd_nxt %lu rcv_nxt %lu ", |
DEBUGF(TCP_DEBUG, ("Local port %u, foreign port %u snd_nxt %lu rcv_nxt %lu ", |
1151 |
pcb->local_port, pcb->remote_port, |
pcb->local_port, pcb->remote_port, |
1152 |
pcb->snd_nxt, pcb->rcv_nxt)); |
pcb->snd_nxt, pcb->rcv_nxt)); |
1153 |
tcp_debug_print_state(pcb->state); |
tcp_debug_print_state(pcb->state); |
1159 |
{ |
{ |
1160 |
struct tcp_pcb *pcb; |
struct tcp_pcb *pcb; |
1161 |
for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { |
for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { |
1162 |
ASSERT("tcp_pcbs_sane: active pcb->state != CLOSED", pcb->state != CLOSED); |
LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != CLOSED", pcb->state != CLOSED); |
1163 |
ASSERT("tcp_pcbs_sane: active pcb->state != LISTEN", pcb->state != LISTEN); |
LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != LISTEN", pcb->state != LISTEN); |
1164 |
ASSERT("tcp_pcbs_sane: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT); |
LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT); |
1165 |
} |
} |
1166 |
for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { |
for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { |
1167 |
ASSERT("tcp_pcbs_sane: tw pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); |
LWIP_ASSERT("tcp_pcbs_sane: tw pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); |
1168 |
} |
} |
1169 |
return 1; |
return 1; |
1170 |
} |
} |