[comp.bugs.4bsd.ucb-fixes] ARTICLE #12

bostic@OKEEFFE.BERKELEY.EDU (Keith Bostic) (03/23/87)

4.3BSD network bug (#8, exrecv)
Index:	sys/vaxif/if_ex.c 4.3BSD FIX

Description:
The ex driver must protect its enqueueing of data from ethernet boards
that interrupt at a higher priority.

Fix:
*** if_ex.c.7.1	Wed Mar  4 23:34:11 1987
--- if_ex.c.7.2	Mon Oct 13 16:57:19 1986
***************
*** 5,7 ****
   *
!  *	@(#)if_ex.c	7.1 (Berkeley) 6/5/86
   */
--- 5,7 ----
   *
!  *	@(#)if_ex.c	7.2 (Berkeley) 10/13/86
   */
***************
*** 29,30 ****
--- 29,31 ----
  #include "ioctl.h"
+ #include "syslog.h"
  #include "errno.h"
***************
*** 492,494 ****
  				xs->xs_if.if_oerrors++;
! 				printf("ex%d: transmit error=%b\n",
  					unit, bp->mb_rply, XMIT_BITS);
--- 493,495 ----
  				xs->xs_if.if_oerrors++;
! 				log(LOG_ERR, "ex%d: transmit error=%b\n",
  					unit, bp->mb_rply, XMIT_BITS);
***************
*** 557,558 ****
--- 558,560 ----
  	register struct ifqueue *inq;
+ 	int s;
  
***************
*** 562,564 ****
  		xs->xs_if.if_ierrors++;
! 		printf("ex%d: receive error=%b\n",
  			unit, bp->mb_rply, RECV_BITS);
--- 564,566 ----
  		xs->xs_if.if_ierrors++;
! 		log(LOG_ERR, "ex%d: receive error=%b\n",
  			unit, bp->mb_rply, RECV_BITS);
***************
*** 631,632 ****
--- 633,635 ----
  
+ 	s = splimp();
  	if (IF_QFULL(inq)) {

***************
*** 634,638 ****
  		m_freem(m);
! 		return;
! 	}
! 	IF_ENQUEUE(inq, m);
  }
--- 637,641 ----
  		m_freem(m);
! 	} else
! 		IF_ENQUEUE(inq, m);
! 	splx(s);
  }
***************
*** 914,916 ****
  #ifdef	DEBUG
! 	printf("ex%d: reset addr %s\n", ui->ui_unit,
  		ether_sprintf(bp->mb_na.na_addrs));
--- 917,919 ----
  #ifdef	DEBUG
! 	log(LOG_DEBUG, "ex%d: reset addr %s\n", ui->ui_unit,
  		ether_sprintf(bp->mb_na.na_addrs));