Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 22 Apr 2013 13:57:59 +0400
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        Juan Mojica <jmojica@gmail.com>
Cc:        FreeBSD Net <freebsd-net@freebsd.org>
Subject:   Re: ARP: Error Message in if_ether.c "arprequest: cannot find matching address"
Message-ID:  <20130422095759.GC76816@FreeBSD.org>
In-Reply-To: <CAPKuH-w4ugf4KSWBKMoURbNsSrs1O-XNmWdn47VKn9MkCOgRDw@mail.gmail.com>
References:  <CAPKuH-w4ugf4KSWBKMoURbNsSrs1O-XNmWdn47VKn9MkCOgRDw@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--45nhIriPRwzWsBkh
Content-Type: text/plain; charset=koi8-r
Content-Disposition: inline

On Wed, Apr 17, 2013 at 08:46:42AM -0400, Juan Mojica wrote:
J> We manage to hit the following message with some regularity.
J> 
J> arprequest: cannot find matching address
J> 
J> The code shows a printf:
J> 
J> printf("%s: cannot find matching address\n", __func__);
J> 
J> 
J> Any reason this is a printf and not a
J> 
J> log(LOG_ERR,
J> 
J> The only things I can come up with are:
J> 
J> a) it is a really severe and should be printed out, which if that is the
J> case why isn't there an assert there?
J> b) whoops, that should probably be a log(LOG_ERR,
J> On our end we need to figure out exactly why we're intermittently hitting
J> this patch of code.

Can you please try this patch? Let's see what's going on.

printf()ing in kernel is especially unsafe when the event can be triggered
remotely. The arprequest() is called on output path of a packet, however
I'm not sure that it can't be triggered by incoming packet.

-- 
Totus tuus, Glebius.

--45nhIriPRwzWsBkh
Content-Type: text/x-diff; charset=koi8-r
Content-Disposition: attachment; filename="if_ether.c.diff"

Index: if_ether.c
===================================================================
--- if_ether.c	(revision 249764)
+++ if_ether.c	(working copy)
@@ -250,7 +250,9 @@ arprequest(struct ifnet *ifp, struct in_addr *sip,
 		}
 		IF_ADDR_RUNLOCK(ifp);
 		if (sip == NULL) {
-			printf("%s: cannot find matching address\n", __func__);
+			log(LOG_ERR, "%s: cannot find matching address for "
+			    "%s on %s\n", __func__, inet_ntoa(*tip),
+			    if_name(ifp));
 			return;
 		}
 	}

--45nhIriPRwzWsBkh--



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