Внутри lwip код довольно нехитрый:
Код
for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
if (pcb->remote_port == tcphdr->src &&
pcb->local_port == tcphdr->dest &&
ip_addr_cmp(&(pcb->remote_ip), ¤t_iphdr_src) &&
ip_addr_cmp(&(pcb->local_ip), ¤t_iphdr_dest)) {
/* Move this PCB to the front of the list so that subsequent
lookups will be faster (we exploit locality in TCP segment
arrivals). */
if (prev != NULL) {
prev->next = pcb->next;
pcb->next = tcp_active_pcbs;
tcp_active_pcbs = pcb;
}
break;
}
prev = pcb;
}
Нет причин ждать там подвоха. И, я думаю, такой косяк народ давно уже заметил бы и исправил.
Возможно, у вас память портится или что-то в этом духе. Недостаточный размер стека и всё такое. Всякое бывает.