This is the mail archive of the ecos-discuss@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patch redboot tcp, suggestion


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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]