Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 30 Mar 2007 00:26:22 GMT
From:      Jung-uk Kim <jkim@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 116894 for review
Message-ID:  <200703300026.l2U0QM1R079133@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=116894

Change 116894 by jkim@jkim_hammer on 2007/03/30 00:25:28

	IFC

Affected files ...

.. //depot/projects/linuxolator/src/sys/amd64/amd64/cpu_switch.S#6 integrate
.. //depot/projects/linuxolator/src/sys/amd64/amd64/genassym.c#7 integrate
.. //depot/projects/linuxolator/src/sys/amd64/amd64/machdep.c#16 integrate
.. //depot/projects/linuxolator/src/sys/amd64/include/pcb.h#4 integrate
.. //depot/projects/linuxolator/src/sys/amd64/include/segments.h#3 integrate
.. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_locore.s#4 integrate
.. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_machdep.c#47 integrate
.. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_proto.h#23 integrate
.. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_syscall.h#23 integrate
.. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_sysent.c#22 integrate
.. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_sysvec.c#12 integrate
.. //depot/projects/linuxolator/src/sys/amd64/linux32/syscalls.master#23 integrate
.. //depot/projects/linuxolator/src/sys/dev/isp/isp.c#14 integrate
.. //depot/projects/linuxolator/src/sys/netinet/in.c#6 integrate

Differences ...

==== //depot/projects/linuxolator/src/sys/amd64/amd64/cpu_switch.S#6 (text+ko) ====

@@ -30,7 +30,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/amd64/amd64/cpu_switch.S,v 1.155 2006/12/20 04:40:38 davidxu Exp $
+ * $FreeBSD: src/sys/amd64/amd64/cpu_switch.S,v 1.156 2007/03/30 00:06:20 jkim Exp $
  */
 
 #include <machine/asmacros.h>

==== //depot/projects/linuxolator/src/sys/amd64/amd64/genassym.c#7 (text+ko) ====

@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/genassym.c,v 1.160 2006/12/20 04:40:38 davidxu Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/genassym.c,v 1.161 2007/03/30 00:06:20 jkim Exp $");
 
 #include "opt_compat.h"
 #include "opt_kstack_pages.h"

==== //depot/projects/linuxolator/src/sys/amd64/amd64/machdep.c#16 (text+ko) ====

@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/machdep.c,v 1.669 2007/01/27 18:13:24 jkoshy Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/machdep.c,v 1.670 2007/03/30 00:06:20 jkim Exp $");
 
 #include "opt_atalk.h"
 #include "opt_atpic.h"

==== //depot/projects/linuxolator/src/sys/amd64/include/pcb.h#4 (text+ko) ====

@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *	from: @(#)pcb.h	5.10 (Berkeley) 5/12/91
- * $FreeBSD: src/sys/amd64/include/pcb.h,v 1.62 2005/09/27 21:11:35 peter Exp $
+ * $FreeBSD: src/sys/amd64/include/pcb.h,v 1.63 2007/03/30 00:06:21 jkim Exp $
  */
 
 #ifndef _AMD64_PCB_H_

==== //depot/projects/linuxolator/src/sys/amd64/include/segments.h#3 (text+ko) ====

@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *	from: @(#)segments.h	7.1 (Berkeley) 5/9/91
- * $FreeBSD: src/sys/amd64/include/segments.h,v 1.38 2004/04/05 21:25:51 imp Exp $
+ * $FreeBSD: src/sys/amd64/include/segments.h,v 1.39 2007/03/30 00:06:21 jkim Exp $
  */
 
 #ifndef _MACHINE_SEGMENTS_H_

==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_locore.s#4 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/amd64/linux32/linux32_locore.s,v 1.1 2004/08/16 07:55:06 tjr Exp $ */
+/* $FreeBSD: src/sys/amd64/linux32/linux32_locore.s,v 1.2 2007/03/30 00:06:21 jkim Exp $ */
 
 #include "linux32_assym.h"			/* system definitions */
 #include <machine/asmacros.h>			/* miscellaneous asm macros */

==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_machdep.c#47 (text+ko) ====

@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_machdep.c,v 1.36 2007/03/02 00:08:47 jkim Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_machdep.c,v 1.37 2007/03/30 00:06:21 jkim Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>

==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_proto.h#23 (text+ko) ====

@@ -2,8 +2,8 @@
  * System call prototypes.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/amd64/linux32/linux32_proto.h,v 1.30 2007/03/29 02:11:46 julian Exp $
- * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.26 2007/02/15 01:13:36 jkim Exp 
+ * $FreeBSD: src/sys/amd64/linux32/linux32_proto.h,v 1.31 2007/03/30 00:08:21 jkim Exp $
+ * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.28 2007/03/30 00:06:21 jkim Exp 
  */
 
 #ifndef _LINUX_SYSPROTO_H_

==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_syscall.h#23 (text+ko) ====

@@ -2,8 +2,8 @@
  * System call numbers.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/amd64/linux32/linux32_syscall.h,v 1.30 2007/03/29 02:11:46 julian Exp $
- * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.26 2007/02/15 01:13:36 jkim Exp 
+ * $FreeBSD: src/sys/amd64/linux32/linux32_syscall.h,v 1.31 2007/03/30 00:08:21 jkim Exp $
+ * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.28 2007/03/30 00:06:21 jkim Exp 
  */
 
 #define	LINUX_SYS_exit	1

==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_sysent.c#22 (text+ko) ====

@@ -2,8 +2,8 @@
  * System call switch table.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/amd64/linux32/linux32_sysent.c,v 1.30 2007/03/29 02:11:46 julian Exp $
- * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.26 2007/02/15 01:13:36 jkim Exp 
+ * $FreeBSD: src/sys/amd64/linux32/linux32_sysent.c,v 1.31 2007/03/30 00:08:21 jkim Exp $
+ * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.28 2007/03/30 00:06:21 jkim Exp 
  */
 
 #include <bsm/audit_kevents.h>

==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_sysvec.c#12 (text+ko) ====

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_sysvec.c,v 1.26 2006/12/03 21:06:07 netchild Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_sysvec.c,v 1.27 2007/03/30 00:06:21 jkim Exp $");
 #include "opt_compat.h"
 
 #ifndef COMPAT_IA32

==== //depot/projects/linuxolator/src/sys/amd64/linux32/syscalls.master#23 (text+ko) ====

@@ -1,4 +1,4 @@
- $FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.27 2007/03/29 02:11:46 julian Exp $
+ $FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.28 2007/03/30 00:06:21 jkim Exp $
 
 ;	@(#)syscalls.master	8.1 (Berkeley) 7/19/93
 ; System call name/number master file (or rather, slave, from LINUX).

==== //depot/projects/linuxolator/src/sys/dev/isp/isp.c#14 (text+ko) ====

@@ -46,7 +46,7 @@
 #endif
 #ifdef	__FreeBSD__
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/isp/isp.c,v 1.144 2007/03/22 23:38:31 mjacob Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/isp/isp.c,v 1.145 2007/03/29 21:29:26 mjacob Exp $");
 #include <dev/isp/isp_freebsd.h>
 #endif
 #ifdef	__OpenBSD__
@@ -4068,7 +4068,7 @@
 		}
 
 		hdlidx = fcp->isp_ini_map[XS_TGT(xs)] - 1;
-		isp_prt(isp, ISP_LOGDEBUG1, "XS_TGT(xs)=%d- handle value %d",
+		isp_prt(isp, ISP_LOGDEBUG1, "XS_TGT(xs)=%d- hdlidx value %d",
 		    XS_TGT(xs), hdlidx);
 		if (hdlidx < 0 || hdlidx >= MAX_FC_TARG) {
 			XS_SETERR(xs, HBA_SELTIMEOUT);
@@ -4296,7 +4296,7 @@
 		 * Issue a bus reset.
 		 */
 		if (IS_24XX(isp)) {
-			isp_prt(isp, ISP_LOGWARN, "RESET BUS NOT IMPLETENTED");
+			isp_prt(isp, ISP_LOGWARN, "RESET BUS NOT IMPLEMENTED");
 			break;
 		} else if (IS_FC(isp)) {
 			mbs.param[1] = 10;
@@ -4325,7 +4325,7 @@
 	case ISPCTL_RESET_DEV:
 		tgt = (*((int *) arg)) & 0xffff;
 		if (IS_24XX(isp)) {
-			isp_prt(isp, ISP_LOGWARN, "RESET DEV NOT IMPLETENTED");
+			isp_prt(isp, ISP_LOGWARN, "RESET DEV NOT IMPLEMENTED");
 			break;
 		} else if (IS_FC(isp)) {
 			if (FCPARAM(isp)->isp_2klogin) {
@@ -4362,7 +4362,7 @@
 			break;
 		}
 		if (IS_24XX(isp)) {
-			isp_prt(isp, ISP_LOGWARN, "ABORT CMD NOT IMPLETENTED");
+			isp_prt(isp, ISP_LOGWARN, "ABORT CMD NOT IMPLEMENTED");
 			break;
 		} else if (IS_FC(isp)) {
 			if (FCPARAM(isp)->isp_sccfw) {

==== //depot/projects/linuxolator/src/sys/netinet/in.c#6 (text+ko) ====

@@ -28,7 +28,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)in.c	8.4 (Berkeley) 1/9/95
- * $FreeBSD: src/sys/netinet/in.c,v 1.97 2007/03/20 00:36:10 bms Exp $
+ * $FreeBSD: src/sys/netinet/in.c,v 1.98 2007/03/29 21:39:22 bms Exp $
  */
 
 #include "opt_carp.h"
@@ -224,13 +224,17 @@
 	register struct ifreq *ifr = (struct ifreq *)data;
 	register struct in_ifaddr *ia = 0, *iap;
 	register struct ifaddr *ifa;
+	struct in_addr allhosts_addr;
 	struct in_addr dst;
 	struct in_ifaddr *oia;
 	struct in_aliasreq *ifra = (struct in_aliasreq *)data;
 	struct sockaddr_in oldaddr;
 	int error, hostIsNew, iaIsNew, maskIsNew, s;
+	int iaIsFirst;
 
+	iaIsFirst = 0;
 	iaIsNew = 0;
+	allhosts_addr.s_addr = htonl(INADDR_ALLHOSTS_GROUP);
 
 	switch (cmd) {
 	case SIOCALIFADDR:
@@ -281,6 +285,8 @@
 					break;
 				}
 			}
+		if (ia == NULL)
+			iaIsFirst = 1;
 	}
 
 	switch (cmd) {
@@ -422,8 +428,11 @@
 		    (struct sockaddr_in *) &ifr->ifr_addr, 1);
 		if (error != 0 && iaIsNew)
 			break;
-		if (error == 0)
+		if (error == 0) {
+			if (iaIsFirst && (ifp->if_flags & IFF_MULTICAST) != 0)
+				in_addmulti(&allhosts_addr, ifp);
 			EVENTHANDLER_INVOKE(ifaddr_event, ifp);
+		}
 		return (0);
 
 	case SIOCSIFNETMASK:
@@ -466,8 +475,11 @@
 		if ((ifp->if_flags & IFF_BROADCAST) &&
 		    (ifra->ifra_broadaddr.sin_family == AF_INET))
 			ia->ia_broadaddr = ifra->ifra_broadaddr;
-		if (error == 0)
+		if (error == 0) {
+			if (iaIsFirst && (ifp->if_flags & IFF_MULTICAST) != 0)
+				in_addmulti(&allhosts_addr, ifp);
 			EVENTHANDLER_INVOKE(ifaddr_event, ifp);
+		}
 		return (error);
 
 	case SIOCDIFADDR:
@@ -502,8 +514,27 @@
 	s = splnet();
 	TAILQ_REMOVE(&ifp->if_addrhead, &ia->ia_ifa, ifa_link);
 	TAILQ_REMOVE(&in_ifaddrhead, ia, ia_link);
-	if (ia->ia_addr.sin_family == AF_INET)
+	if (ia->ia_addr.sin_family == AF_INET) {
 		LIST_REMOVE(ia, ia_hash);
+		/*
+		 * If this is the last IPv4 address configured on this
+		 * interface, leave the all-hosts group.
+		 * XXX: This is quite ugly because of locking and structure.
+		 */
+		oia = NULL;
+		IFP_TO_IA(ifp, oia);
+		if (oia == NULL) {
+			struct in_multi *inm;
+
+			IFF_LOCKGIANT(ifp);
+			IN_MULTI_LOCK();
+			IN_LOOKUP_MULTI(allhosts_addr, ifp, inm);
+			if (inm != NULL)
+				in_delmulti_locked(inm);
+			IN_MULTI_UNLOCK();
+			IFF_UNLOCKGIANT(ifp);
+		}
+	}
 	IFAFREE(&ia->ia_ifa);
 	splx(s);
 
@@ -792,16 +823,6 @@
 	if ((error = in_addprefix(ia, flags)) != 0)
 		return (error);
 
-	/*
-	 * If the interface supports multicast, join the "all hosts"
-	 * multicast group on that interface.
-	 */
-	if (ifp->if_flags & IFF_MULTICAST) {
-		struct in_addr addr;
-
-		addr.s_addr = htonl(INADDR_ALLHOSTS_GROUP);
-		in_addmulti(&addr, ifp);
-	}
 	return (error);
 }
 
@@ -1113,6 +1134,9 @@
 		igmp_leavegroup(inm);
 
 		ifma = inm->inm_ifma;
+#ifdef DIAGNOSTIC
+		printf("%s: purging ifma %p\n", __func__, ifma);
+#endif
 		KASSERT(ifma->ifma_protospec == inm,
 		    ("%s: ifma_protospec != inm", __func__));
 		ifma->ifma_protospec = NULL;
@@ -1134,6 +1158,9 @@
 	struct in_multi *inm;
 	struct in_multi *oinm;
 
+#ifdef DIAGNOSTIC
+	printf("%s: purging ifp %p\n", __func__, ifp);
+#endif
 	IFF_LOCKGIANT(ifp);
 	IN_MULTI_LOCK();
 	LIST_FOREACH_SAFE(inm, &in_multihead, inm_link, oinm) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200703300026.l2U0QM1R079133>