This is the mail archive of the
ecos-discuss@sources.redhat.com
mailing list for the eCos project.
Patch redboot tcp, suggestion
- From: Hendrik Ruijter <hendrik dot ruijter at axis dot com>
- To: ecos-discuss at sources dot redhat dot com
- Date: Wed, 27 Feb 2002 14:27:29 +0100
- Subject: [ECOS] Patch redboot tcp, suggestion
- Organization: Axis Communications AB
Acknowledgements for retransmissions of segments
with sequence numbers lower than the assumed last
acknowledged were never sent.
The code at present sends an ACK on every segment
which should be improved together with proper window
advertisment.
Changed the debug messages ack and seq numbers from
hex to unsigned long in order to make it easier to
compare with snoop-logs.
Test case: lost frames.
Brgrds,
Hendrik Ruijter
*** src/net/tcp.c 12 Dec 2001 11:56:46 -0000 1.1.1.1
--- src/net/tcp.c 19 Feb 2002 09:12:19 -0000 1.1.1.1.2.1
*************** tcp_send(tcp_socket_t *s, int flags, int
*** 149,155 ****
__ip_send(pkt, IP_PROTO_TCP, &s->his_addr);
! BSPLOG(bsp_log("tcp_send: state[%d] flags[%s] ack[%x] data[%d].\n",
s->state, flags_to_str(tcp->flags), s->ack, s->data_bytes));
if (s->state == _TIME_WAIT)
--- 149,155 ----
__ip_send(pkt, IP_PROTO_TCP, &s->his_addr);
! BSPLOG(bsp_log("tcp_send: state[%d] flags[%s] ack[%u] data[%d].\n",
s->state, flags_to_str(tcp->flags), s->ack, s->data_bytes));
if (s->state == _TIME_WAIT)
*************** handle_data(tcp_socket_t *s, pktbuf_t *p
*** 291,298 ****
seq = ntohl(tcp->seqnum);
! BSPLOG(bsp_log("tcp data: seq[%x] len[%d].\n", seq, data_len));
!
if (SEQ_LE(seq, s->ack)) {
/*
* Figure difference between which byte we're expecting and which byte
--- 291,299 ----
seq = ntohl(tcp->seqnum);
! BSPLOG(bsp_log("handle_data: seq[%u] len[%d] s->ack[%u].\n", seq, data_len,
! s->ack));
! BSPLOG(bsp_log("handle_data: SEQ_LE[%d]\n", SEQ_LE(seq, s->ack)));
if (SEQ_LE(seq, s->ack)) {
/*
* Figure difference between which byte we're expecting and which byte
*************** handle_data(tcp_socket_t *s, pktbuf_t *p
*** 302,307 ****
--- 303,309 ----
data_len -= diff;
data_ptr += diff;
+ BSPLOG(bsp_log("handle_data: data_len[%d].\n", data_len));
if (data_len > 0) {
/* queue the new data */
s->ack += data_len;
*************** handle_data(tcp_socket_t *s, pktbuf_t *p
*** 310,322 ****
while (p->next)
p = p->next;
p->next = pkt;
! BSPLOG(bsp_log("tcp data: Add pkt[%x] len[%d].\n",
pkt, data_len));
} else {
s->rxlist = pkt;
s->rxcnt = data_len;
s->rxptr = data_ptr;
! BSPLOG(bsp_log("tcp data: pkt[%x] len[%d].\n",
pkt, data_len));
}
return 1;
--- 312,324 ----
while (p->next)
p = p->next;
p->next = pkt;
! BSPLOG(bsp_log("handle_data: Add pkt[%x] len[%d].\n",
pkt, data_len));
} else {
s->rxlist = pkt;
s->rxcnt = data_len;
s->rxptr = data_ptr;
! BSPLOG(bsp_log("handle_data: pkt[%x] len[%d].\n",
pkt, data_len));
}
return 1;
*************** handle_ack(tcp_socket_t *s, pktbuf_t *pk
*** 345,351 ****
if (advance > s->data_bytes)
advance = s->data_bytes;
! BSPLOG(bsp_log("seq advance %d", advance));
if (advance > 0) {
s->seq += advance;
--- 347,353 ----
if (advance > s->data_bytes)
advance = s->data_bytes;
! BSPLOG(bsp_log("handle_ack: seq advance %d", advance));
if (advance > 0) {
s->seq += advance;
*************** __tcp_handler(pktbuf_t *pkt, ip_route_t
*** 411,422 ****
if (tcp->flags & TCP_FLAG_SYN) {
s->state = _SYN_RCVD;
s->ack = ntohl(tcp->seqnum) + 1;
s->his_port = ntohs(tcp->src_port);
memcpy(s->his_addr.ip_addr, r->ip_addr, sizeof(ip_addr_t));
s->data_bytes = 0;
s->ack_pending = 0;
! BSPLOG(bsp_log("SYN from %d.%d.%d.%d:%d (seq %x)\n",
s->his_addr.ip_addr[0],s->his_addr.ip_addr[1],
s->his_addr.ip_addr[2],s->his_addr.ip_addr[3],
s->his_port, ntohl(tcp->seqnum)));
--- 413,425 ----
if (tcp->flags & TCP_FLAG_SYN) {
s->state = _SYN_RCVD;
s->ack = ntohl(tcp->seqnum) + 1;
+ BSPLOG(bsp_log("_LISTEN: s->ack[%u]\n", s->ack));
s->his_port = ntohs(tcp->src_port);
memcpy(s->his_addr.ip_addr, r->ip_addr, sizeof(ip_addr_t));
s->data_bytes = 0;
s->ack_pending = 0;
! BSPLOG(bsp_log("SYN from %d.%d.%d.%d:%d (seq %d)\n",
s->his_addr.ip_addr[0],s->his_addr.ip_addr[1],
s->his_addr.ip_addr[2],s->his_addr.ip_addr[3],
s->his_port, ntohl(tcp->seqnum)));
*************** __tcp_handler(pktbuf_t *pkt, ip_route_t
*** 455,460 ****
--- 458,464 ----
case _ESTABLISHED:
case _CLOSE_WAIT:
+ BSPLOG(bsp_log("_ESTABLISHED: s->ack[%u]\n", s->ack));
ack = s->ack; /* save original ack */
if (tcp->flags & TCP_FLAG_ACK)
handle_ack(s, pkt);
*************** __tcp_handler(pktbuf_t *pkt, ip_route_t
*** 469,484 ****
s->ack++;
s->state = _CLOSE_WAIT;
}
/*
* Send an ack if neccessary.
*/
if (s->ack != ack || s->ack_pending) {
/*
! * we can't send an ack if our write packet is holding outgoing
! * data pending an incoming ack.
*/
if (s->data_bytes == 0) {
! BSPLOG(bsp_log("Sending ack: new[%x] old[%x]\n",
s->ack, ack));
__timer_cancel(&s->timer);
tcp_send(s, TCP_FLAG_ACK, 0);
--- 473,494 ----
s->ack++;
s->state = _CLOSE_WAIT;
}
+
+ BSPLOG(bsp_log("Sending ack: new[%u] old[%u]\n", s->ack, ack));
+ __timer_cancel(&s->timer);
+ tcp_send(s, TCP_FLAG_ACK, 0);
+
+ #if 0
/*
* Send an ack if neccessary.
*/
if (s->ack != ack || s->ack_pending) {
/*
! * we can't send an ack if our write packet is holding
! * outgoing data pending an incoming ack.
*/
if (s->data_bytes == 0) {
! BSPLOG(bsp_log("Sending ack: new[%u] old[%u]\n",
s->ack, ack));
__timer_cancel(&s->timer);
tcp_send(s, TCP_FLAG_ACK, 0);
*************** __tcp_handler(pktbuf_t *pkt, ip_route_t
*** 486,491 ****
--- 496,502 ----
} else
s->ack_pending = 1;
}
+ #endif
break;
case _LAST_ACK:
*************** __tcp_poll(void)
*** 577,583 ****
int
__tcp_listen(tcp_socket_t *s, word port)
{
! BSPLOG(bsp_log("tcp_listen: s[%p] port[%x]\n", s, port));
memset(s, 0, sizeof(tcp_socket_t));
s->state = _LISTEN;
--- 588,594 ----
int
__tcp_listen(tcp_socket_t *s, word port)
{
! BSPLOG(bsp_log("tcp_listen: s[%p] port[%d]\n", s, port));
memset(s, 0, sizeof(tcp_socket_t));
s->state = _LISTEN;
--
Before posting, please read the FAQ: http://sources.redhat.com/fom/ecos
and search the list archive: http://sources.redhat.com/ml/ecos-discuss