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,