Subject: Re: kern/7480
To: None <gnats-bugs@netbsd.org>
From: Jason Thorpe <thorpej@nas.nasa.gov>
List: tech-net
Date: 05/03/1999 14:56:35
Hi, I just cooked up a change to fix this problem, and when looking at the
PR, noticed that Heiko cooked up pretty much the same thing.

This patch should go in ASAP, and be pulled up onto the release branch.

I'll commit it this afternoon, unless someone beats me to it :-)

        -- Jason R. Thorpe <thorpej@nas.nasa.gov>

Index: in_var.h
===================================================================
RCS file: /cvsroot/src/sys/netinet/in_var.h,v
retrieving revision 1.32
diff -c -r1.32 in_var.h
*** in_var.h	1998/12/19 02:46:12	1.32
--- in_var.h	1999/05/03 21:46:42
***************
*** 144,156 ****
  /*
   * Macro for finding whether an internet address (in_addr) belongs to one
   * of our interfaces (in_ifaddr).  NULL if the address isn't ours.
   */
  #define INADDR_TO_IA(addr, ia) \
  	/* struct in_addr addr; */ \
  	/* struct in_ifaddr *ia; */ \
  { \
  	for (ia = IN_IFADDR_HASH((addr).s_addr).lh_first; \
! 	    ia != NULL && !in_hosteq(ia->ia_addr.sin_addr, (addr)); \
  	    ia = ia->ia_hash.le_next) \
  		 continue; \
  }
--- 144,160 ----
  /*
   * Macro for finding whether an internet address (in_addr) belongs to one
   * of our interfaces (in_ifaddr).  NULL if the address isn't ours.
+  *
+  * Note that even if we find an interface with the address we're looking
+  * for, we should skip that interface if it is not up.
   */
  #define INADDR_TO_IA(addr, ia) \
  	/* struct in_addr addr; */ \
  	/* struct in_ifaddr *ia; */ \
  { \
  	for (ia = IN_IFADDR_HASH((addr).s_addr).lh_first; \
! 	    ia != NULL && !in_hosteq(ia->ia_addr.sin_addr, (addr)) && \
! 	    (ia->ia_ifp->if_flags & IFF_UP) != 0; \
  	    ia = ia->ia_hash.le_next) \
  		 continue; \
  }
Index: ip_input.c
===================================================================
RCS file: /cvsroot/src/sys/netinet/ip_input.c,v
retrieving revision 1.84
diff -c -r1.84 ip_input.c
*** ip_input.c	1999/04/07 05:34:32	1.84
--- ip_input.c	1999/05/03 21:46:43
***************
*** 419,428 ****
  	 * Check our list of addresses, to see if the packet is for us.
  	 */
  	INADDR_TO_IA(ip->ip_dst, ia);
! 	if (ia != NULL) {
! 		if (ia->ia_ifp->if_flags & IFF_UP)
! 			goto ours;
! 	}
  	if (m->m_pkthdr.rcvif->if_flags & IFF_BROADCAST) {
  		for (ifa = m->m_pkthdr.rcvif->if_addrlist.tqh_first;
  		    ifa != NULL; ifa = ifa->ifa_list.tqe_next) {
--- 419,426 ----
  	 * Check our list of addresses, to see if the packet is for us.
  	 */
  	INADDR_TO_IA(ip->ip_dst, ia);
! 	if (ia != NULL)
! 		goto ours;
  	if (m->m_pkthdr.rcvif->if_flags & IFF_BROADCAST) {
  		for (ifa = m->m_pkthdr.rcvif->if_addrlist.tqh_first;
  		    ifa != NULL; ifa = ifa->ifa_list.tqe_next) {