405 |
tcphdr->chksum = inet_chksum_pseudo(p, &(pcb->local_ip), &(pcb->remote_ip), |
tcphdr->chksum = inet_chksum_pseudo(p, &(pcb->local_ip), &(pcb->remote_ip), |
406 |
IP_PROTO_TCP, p->tot_len); |
IP_PROTO_TCP, p->tot_len); |
407 |
|
|
408 |
ip_output(p, &(pcb->local_ip), &(pcb->remote_ip), TCP_TTL, |
|
409 |
|
ip_output(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos, |
410 |
IP_PROTO_TCP); |
IP_PROTO_TCP); |
411 |
pbuf_free(p); |
pbuf_free(p); |
412 |
|
|
528 |
++lwip_stats.tcp.xmit; |
++lwip_stats.tcp.xmit; |
529 |
#endif /* TCP_STATS */ |
#endif /* TCP_STATS */ |
530 |
|
|
531 |
ip_output(seg->p, &(pcb->local_ip), &(pcb->remote_ip), TCP_TTL, |
ip_output(seg->p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos, |
532 |
IP_PROTO_TCP); |
IP_PROTO_TCP); |
533 |
} |
} |
534 |
/*-----------------------------------------------------------------------------------*/ |
/*-----------------------------------------------------------------------------------*/ |
562 |
#ifdef TCP_STATS |
#ifdef TCP_STATS |
563 |
++lwip_stats.tcp.xmit; |
++lwip_stats.tcp.xmit; |
564 |
#endif /* TCP_STATS */ |
#endif /* TCP_STATS */ |
565 |
ip_output(p, local_ip, remote_ip, TCP_TTL, IP_PROTO_TCP); |
/* Send output with hardcoded TTL since we have no access to the pcb */ |
566 |
|
ip_output(p, local_ip, remote_ip, TCP_TTL, 0, IP_PROTO_TCP); |
567 |
pbuf_free(p); |
pbuf_free(p); |
568 |
LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %lu ackno %lu.\n", seqno, ackno)); |
LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %lu ackno %lu.\n", seqno, ackno)); |
569 |
} |
} |
597 |
tcp_output(pcb); |
tcp_output(pcb); |
598 |
|
|
599 |
} |
} |
600 |
|
/*-----------------------------------------------------------------------------------*/ |
601 |
|
void |
602 |
|
tcp_keepalive(struct tcp_pcb *pcb) |
603 |
|
{ |
604 |
|
struct pbuf *p; |
605 |
|
struct tcp_hdr *tcphdr; |
606 |
|
|
607 |
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: sending KEEPALIVE probe to %u.%u.%u.%u\n", |
608 |
|
ip4_addr1(&pcb->remote_ip), ip4_addr2(&pcb->remote_ip), |
609 |
|
ip4_addr3(&pcb->remote_ip), ip4_addr4(&pcb->remote_ip))); |
610 |
|
|
611 |
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: tcp_ticks %ld pcb->tmr %ld pcb->keep_cnt %ld\n", tcp_ticks, pcb->tmr, pcb->keep_cnt)); |
612 |
|
|
613 |
|
p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM); |
614 |
|
|
615 |
|
if(p == NULL) { |
616 |
|
LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: could not allocate memory for pbuf\n")); |
617 |
|
return; |
618 |
|
} |
619 |
|
|
620 |
|
tcphdr = p->payload; |
621 |
|
tcphdr->src = htons(pcb->local_port); |
622 |
|
tcphdr->dest = htons(pcb->remote_port); |
623 |
|
tcphdr->seqno = htonl(pcb->snd_nxt - 1); |
624 |
|
tcphdr->ackno = htonl(pcb->rcv_nxt); |
625 |
|
tcphdr->wnd = htons(pcb->rcv_wnd); |
626 |
|
tcphdr->urgp = 0; |
627 |
|
TCPH_HDRLEN_SET(tcphdr, 5); |
628 |
|
|
629 |
|
tcphdr->chksum = 0; |
630 |
|
tcphdr->chksum = inet_chksum_pseudo(p, &pcb->local_ip, &pcb->remote_ip, IP_PROTO_TCP, p->tot_len); |
631 |
|
|
632 |
|
#ifdef TCP_STATS |
633 |
|
++lwip_stats.tcp.xmit; |
634 |
|
#endif /* TCP_STATS */ |
635 |
|
|
636 |
|
/* Send output to IP */ |
637 |
|
ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP); |
638 |
|
|
639 |
|
pbuf_free(p); |
640 |
|
|
641 |
|
LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_keepalive: seqno %lu ackno %lu.\n", pcb->snd_nxt - 1, pcb->rcv_nxt)); |
642 |
|
} |
643 |
|
|
644 |
#endif /* LWIP_TCP */ |
#endif /* LWIP_TCP */ |
645 |
|
|
646 |
|
|