157 |
for an active connection. */ |
for an active connection. */ |
158 |
prev = NULL; |
prev = NULL; |
159 |
for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { |
for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { |
160 |
ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED); |
LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED); |
161 |
ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT); |
LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT); |
162 |
ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN); |
LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN); |
163 |
if(pcb->remote_port == tcphdr->src && |
if(pcb->remote_port == tcphdr->src && |
164 |
pcb->local_port == tcphdr->dest && |
pcb->local_port == tcphdr->dest && |
165 |
ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src)) && |
ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src)) && |
168 |
/* Move this PCB to the front of the list so that subsequent |
/* Move this PCB to the front of the list so that subsequent |
169 |
lookups will be faster (we exploit locality in TCP segment |
lookups will be faster (we exploit locality in TCP segment |
170 |
arrivals). */ |
arrivals). */ |
171 |
ASSERT("tcp_input: pcb->next != pcb (before cache)", pcb->next != pcb); |
LWIP_ASSERT("tcp_input: pcb->next != pcb (before cache)", pcb->next != pcb); |
172 |
if(prev != NULL) { |
if(prev != NULL) { |
173 |
prev->next = pcb->next; |
prev->next = pcb->next; |
174 |
pcb->next = tcp_active_pcbs; |
pcb->next = tcp_active_pcbs; |
175 |
tcp_active_pcbs = pcb; |
tcp_active_pcbs = pcb; |
176 |
} |
} |
177 |
ASSERT("tcp_input: pcb->next != pcb (after cache)", pcb->next != pcb); |
LWIP_ASSERT("tcp_input: pcb->next != pcb (after cache)", pcb->next != pcb); |
178 |
break; |
break; |
179 |
} |
} |
180 |
prev = pcb; |
prev = pcb; |
185 |
in the TIME-WAIT state. */ |
in the TIME-WAIT state. */ |
186 |
|
|
187 |
for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { |
for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { |
188 |
ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); |
LWIP_ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); |
189 |
if(pcb->remote_port == tcphdr->src && |
if(pcb->remote_port == tcphdr->src && |
190 |
pcb->local_port == tcphdr->dest && |
pcb->local_port == tcphdr->dest && |
191 |
ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src)) && |
ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src)) && |
201 |
} |
} |
202 |
|
|
203 |
/* Finally, if we still did not get a match, we check all PCBs that |
/* Finally, if we still did not get a match, we check all PCBs that |
204 |
are LISTENing for incomming connections. */ |
are LISTENing for incoming connections. */ |
205 |
prev = NULL; |
prev = NULL; |
206 |
for(lpcb = tcp_listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { |
for(lpcb = tcp_listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { |
207 |
if((ip_addr_isany(&(lpcb->local_ip)) || |
if((ip_addr_isany(&(lpcb->local_ip)) || |
326 |
pbuf_free(p); |
pbuf_free(p); |
327 |
} |
} |
328 |
|
|
329 |
ASSERT("tcp_input: tcp_pcbs_sane()", tcp_pcbs_sane()); |
LWIP_ASSERT("tcp_input: tcp_pcbs_sane()", tcp_pcbs_sane()); |
330 |
PERF_STOP("tcp_input"); |
PERF_STOP("tcp_input"); |
331 |
} |
} |
332 |
/*-----------------------------------------------------------------------------------*/ |
/*-----------------------------------------------------------------------------------*/ |
450 |
|
|
451 |
if(acceptable) { |
if(acceptable) { |
452 |
DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: Connection RESET\n")); |
DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: Connection RESET\n")); |
453 |
ASSERT("tcp_input: pcb->state != CLOSED", pcb->state != CLOSED); |
LWIP_ASSERT("tcp_input: pcb->state != CLOSED", pcb->state != CLOSED); |
454 |
recv_flags = TF_RESET; |
recv_flags = TF_RESET; |
455 |
pcb->flags &= ~TF_ACK_DELAY; |
pcb->flags &= ~TF_ACK_DELAY; |
456 |
return ERR_RST; |
return ERR_RST; |
500 |
TCP_SEQ_LEQ(ackno, pcb->snd_nxt)) { |
TCP_SEQ_LEQ(ackno, pcb->snd_nxt)) { |
501 |
pcb->state = ESTABLISHED; |
pcb->state = ESTABLISHED; |
502 |
DEBUGF(DEMO_DEBUG, ("TCP connection established %d -> %d.\n", inseg.tcphdr->src, inseg.tcphdr->dest)); |
DEBUGF(DEMO_DEBUG, ("TCP connection established %d -> %d.\n", inseg.tcphdr->src, inseg.tcphdr->dest)); |
503 |
ASSERT("pcb->accept != NULL", pcb->accept != NULL); |
LWIP_ASSERT("pcb->accept != NULL", pcb->accept != NULL); |
504 |
/* Call the accept function. */ |
/* Call the accept function. */ |
505 |
TCP_EVENT_ACCEPT(pcb, ERR_OK, err); |
TCP_EVENT_ACCEPT(pcb, ERR_OK, err); |
506 |
if(err != ERR_OK) { |
if(err != ERR_OK) { |
727 |
DEBUGF(TCP_QLEN_DEBUG, ("%d (after freeing unacked)\n", pcb->snd_queuelen)); |
DEBUGF(TCP_QLEN_DEBUG, ("%d (after freeing unacked)\n", pcb->snd_queuelen)); |
728 |
#ifdef LWIP_DEBUG |
#ifdef LWIP_DEBUG |
729 |
if(pcb->snd_queuelen != 0) { |
if(pcb->snd_queuelen != 0) { |
730 |
ASSERT("tcp_receive: valid queue length", pcb->unacked != NULL || |
LWIP_ASSERT("tcp_receive: valid queue length", pcb->unacked != NULL || |
731 |
pcb->unsent != NULL); |
pcb->unsent != NULL); |
732 |
} |
} |
733 |
#endif /* LWIP_DEBUG */ |
#endif /* LWIP_DEBUG */ |
758 |
DEBUGF(TCP_QLEN_DEBUG, ("%d (after freeing unsent)\n", pcb->snd_queuelen)); |
DEBUGF(TCP_QLEN_DEBUG, ("%d (after freeing unsent)\n", pcb->snd_queuelen)); |
759 |
#ifdef LWIP_DEBUG |
#ifdef LWIP_DEBUG |
760 |
if(pcb->snd_queuelen != 0) { |
if(pcb->snd_queuelen != 0) { |
761 |
ASSERT("tcp_receive: valid queue length", pcb->unacked != NULL || |
LWIP_ASSERT("tcp_receive: valid queue length", pcb->unacked != NULL || |
762 |
pcb->unsent != NULL); |
pcb->unsent != NULL); |
763 |
} |
} |
764 |
#endif /* LWIP_DEBUG */ |
#endif /* LWIP_DEBUG */ |