Index: sys/netinet/if_arp.c
===================================================================
RCS file: /cvsroot/src/sys/netinet/if_arp.c,v
retrieving revision 1.141
diff -u -r1.141 if_arp.c
--- sys/netinet/if_arp.c	28 Aug 2008 07:58:05 -0000	1.141
+++ sys/netinet/if_arp.c	24 Sep 2008 12:48:45 -0000
@@ -142,6 +142,14 @@
 #define	rt_expire rt_rmx.rmx_expire
 #define	rt_pksent rt_rmx.rmx_pksent
 
+/* verbosity */
+#define ARP_VERBOSE_NONE	0
+#define ARP_VERBOSE_ERR		1
+#define ARP_VERBOSE_WARN	2
+#define ARP_VERBOSE_INFO	3
+
+int	arp_verboselevel = ARP_VERBOSE_INFO;
+
 static	struct sockaddr *arp_setgate(struct rtentry *, struct sockaddr *,
 	    const struct sockaddr *);
 static	void arptfree(struct llinfo_arp *);
@@ -1031,17 +1039,22 @@
 	/* XXX checks for bridge case? */
 	if (!memcmp(ar_sha(ah), ifp->if_broadcastaddr, ifp->if_addrlen)) {
 		ARP_STATINC(ARP_STAT_RCVBCASTSHA);
-		log(LOG_ERR,
-		    "%s: arp: link address is broadcast for IP address %s!\n",
-		    ifp->if_xname, in_fmtaddr(isaddr));
+		if (arp_verboselevel >= ARP_VERBOSE_ERR)
+			log(LOG_ERR,
+			    "%s: arp: link address is broadcast for"
+			    " IP address %s!\n",
+			    ifp->if_xname, in_fmtaddr(isaddr));
 		goto out;
 	}
 
 	if (in_hosteq(isaddr, myaddr)) {
 		ARP_STATINC(ARP_STAT_RCVLOCALSPA);
-		log(LOG_ERR,
-		   "duplicate IP address %s sent from link address %s\n",
-		   in_fmtaddr(isaddr), lla_snprintf(ar_sha(ah), ah->ar_hln));
+		if (arp_verboselevel >= ARP_VERBOSE_ERR)
+			log(LOG_ERR,
+			   "duplicate IP address %s sent from"
+			   " link address %s\n",
+			   in_fmtaddr(isaddr), lla_snprintf(ar_sha(ah),
+			   ah->ar_hln));
 		itaddr = myaddr;
 		goto reply;
 	}
@@ -1051,27 +1064,34 @@
 		    memcmp(ar_sha(ah), CLLADDR(sdl), sdl->sdl_alen)) {
 			if (rt->rt_flags & RTF_STATIC) {
 				ARP_STATINC(ARP_STAT_RCVOVERPERM);
-				log(LOG_INFO,
-				    "%s tried to overwrite permanent arp info"
-				    " for %s\n",
-				    lla_snprintf(ar_sha(ah), ah->ar_hln),
-				    in_fmtaddr(isaddr));
+				if (arp_verboselevel >= ARP_VERBOSE_INFO)
+					log(LOG_INFO,
+					    "%s tried to overwrite permanent"
+					    " arp info for %s\n",
+					    lla_snprintf(ar_sha(ah),
+					        ah->ar_hln),
+					    in_fmtaddr(isaddr));
 				goto out;
 			} else if (rt->rt_ifp != ifp) {
 				ARP_STATINC(ARP_STAT_RCVOVERINT);
-				log(LOG_INFO,
-				    "%s on %s tried to overwrite "
-				    "arp info for %s on %s\n",
-				    lla_snprintf(ar_sha(ah), ah->ar_hln),
-				    ifp->if_xname, in_fmtaddr(isaddr),
-				    rt->rt_ifp->if_xname);
+				if (arp_verboselevel >= ARP_VERBOSE_INFO)
+					log(LOG_INFO,
+					    "%s on %s tried to overwrite "
+					    "arp info for %s on %s\n",
+					    lla_snprintf(ar_sha(ah),
+					        ah->ar_hln),
+					    ifp->if_xname, in_fmtaddr(isaddr),
+					    rt->rt_ifp->if_xname);
 				    goto out;
 			} else {
 				ARP_STATINC(ARP_STAT_RCVOVER);
-				log(LOG_INFO,
-				    "arp info overwritten for %s by %s\n",
-				    in_fmtaddr(isaddr),
-				    lla_snprintf(ar_sha(ah), ah->ar_hln));
+				if (arp_verboselevel >= ARP_VERBOSE_INFO)
+					log(LOG_INFO,
+					    "arp info overwritten for %s"
+					    " by %s\n",
+					    in_fmtaddr(isaddr),
+					    lla_snprintf(ar_sha(ah),
+					        ah->ar_hln));
 			}
 		}
 		/*
@@ -1082,16 +1102,20 @@
 		if (sdl->sdl_alen &&
 		    sdl->sdl_alen != ah->ar_hln) {
 			ARP_STATINC(ARP_STAT_RCVLENCHG);
-			log(LOG_WARNING,
-			    "arp from %s: new addr len %d, was %d\n",
-			    in_fmtaddr(isaddr), ah->ar_hln, sdl->sdl_alen);
+			if (arp_verboselevel >= ARP_VERBOSE_WARN)
+				log(LOG_WARNING,
+				    "arp from %s: new addr len %d, was %d\n",
+				    in_fmtaddr(isaddr), ah->ar_hln,
+				    sdl->sdl_alen);
 		}
 		if (ifp->if_addrlen != ah->ar_hln) {
 			ARP_STATINC(ARP_STAT_RCVBADLEN);
-			log(LOG_WARNING,
-			    "arp from %s: addr len: new %d, i/f %d (ignored)\n",
-			    in_fmtaddr(isaddr), ah->ar_hln,
-			    ifp->if_addrlen);
+			if (arp_verboselevel >= ARP_VERBOSE_WARN)
+				log(LOG_WARNING,
+				    "arp from %s: addr len: new %d,"
+				    " i/f %d (ignored)\n",
+				    in_fmtaddr(isaddr), ah->ar_hln,
+				    ifp->if_addrlen);
 			goto reply;
 		}
 #if NTOKEN > 0
@@ -1603,6 +1627,13 @@
 
 	sysctl_createv(clog, 0, NULL, NULL,
 			CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
+			CTLTYPE_INT, "verbose",
+			SYSCTL_DESCR("ARP message verbosity"),
+			NULL, 0, &arp_verboselevel, 0,
+			CTL_NET,PF_INET, node->sysctl_num, CTL_CREATE, CTL_EOL);
+
+	sysctl_createv(clog, 0, NULL, NULL,
+			CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
 			CTLTYPE_INT, "prune",
 			SYSCTL_DESCR("ARP cache pruning interval"),
 			NULL, 0, &arpt_prune, 0,
