From owner-freebsd-net@FreeBSD.ORG Thu May 2 14:20:17 2013 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 5329430D; Thu, 2 May 2013 14:20:17 +0000 (UTC) (envelope-from jmojica@gmail.com) Received: from mail-wi0-x22a.google.com (mail-wi0-x22a.google.com [IPv6:2a00:1450:400c:c05::22a]) by mx1.freebsd.org (Postfix) with ESMTP id A4F0C1F7F; Thu, 2 May 2013 14:20:16 +0000 (UTC) Received: by mail-wi0-f170.google.com with SMTP id hq12so657534wib.1 for ; Thu, 02 May 2013 07:20:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=B9f1BRXp+FrZmyhbzAjwFKIPKS1cONtUo/kiyiSd9Do=; b=xmtHlgf1c4NOJd+95D4QA1ZmkeZqp/AjA1GI6VZQ9WsI0UT2bmktdDRqo67w9xDGbC WQ21Eih32OxVr0B6/ttprHh6FVcdDtoVPC1MKZHJWoPwRvZgSJiHY5EPSXx9vChWYX1d l5a8YZZEG7EynWSxFdUbtS80PpAVVyfSBmbGTcZH9J7iBCF6MPYA/7zwJhQRc117iSL5 6wsHlERXz277R5l6qKiHEB8f+P1kUqou9BRvV28zgfi1kZI3hJwltineviVATv/m9CH4 HW2bpQnUuR2thSkVmHU1aznmCPRNJ5l4fboB9uaMsZrW99rPhJYNeEiAo1xF6M6Y0NlE mAOw== MIME-Version: 1.0 X-Received: by 10.194.109.227 with SMTP id hv3mr8273405wjb.32.1367504415684; Thu, 02 May 2013 07:20:15 -0700 (PDT) Received: by 10.194.82.138 with HTTP; Thu, 2 May 2013 07:20:15 -0700 (PDT) In-Reply-To: References: Date: Thu, 2 May 2013 10:20:15 -0400 Message-ID: Subject: Re: in_lltable_rtcheck From: Juan Mojica To: "Li, Qing" Content-Type: text/plain; charset=ISO-8859-1 X-Content-Filtered-By: Mailman/MimeDel 2.1.14 Cc: FreeBSD Net , "qingli@freebsd.org" X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 02 May 2013 14:20:17 -0000 It looks like the same/similar problem is in sys/net/if.c struct ifaddr * ifaof_ifpforaddr(struct sockaddr *addr, struct ifnet *ifp) ... cp = addr->sa_data; cp2 = ifa->ifa_addr->sa_data; cp3 = ifa->ifa_netmask->sa_data; cplim = ifa->ifa_netmask->sa_len + (char *)ifa->ifa_netmask; for (; cp3 < cplim; cp3++) if ((*cp++ ^ *cp2++) & *cp3) break; if (cp3 == cplim) goto done; ... This is intended to be to be agnostic to the v3 protocol, but the unintended consequence is that it compares the in_port_t field as well. -Juan On Tue, Apr 30, 2013 at 9:22 AM, Juan Mojica wrote: > Great! Thanks Qing. I'll come up with a patch and reply. > > -Juan > > > On Mon, Apr 29, 2013 at 9:40 PM, Li, Qing wrote: > >> The problem you described here seemed familiar so I checked into the svn >> history, >> and found I have in fact fixed this issue in other parts of the code. >> >> Please see >> http://svnweb.freebsd.org/base?view=revision&revision=186708 >> >> So I think similar fix should be applied here as well. >> >> --Qing >> >> >> ________________________________________ >> From: owner-freebsd-net@freebsd.org [owner-freebsd-net@freebsd.org] on >> behalf of Juan Mojica [jmojica@gmail.com] >> Sent: Monday, April 29, 2013 6:17 PM >> To: FreeBSD Net >> Subject: in_lltable_rtcheck >> >> Why is the code comparing the entire sockaddr structure instead of just >> the >> relevant fields? We have a flood of the log message below when >> transitioning an IP address from one port to another. And this triggers >> other behavior as well. >> >> Through GDB, we can see that the addresses are in the same subnet. The >> problem is that the sin_port port fields in the l3addr and in sa do not >> match. >> >> Is there a reason sin_port should be compared here? >> >> I can come up with a patch, that's not an issue, but I wanted to confirm >> with others first. >> >> >> if (!(rt->rt_flags & RTF_HOST) && rt->rt_ifp != ifp) { >> const char *sa, *mask, *addr, *lim; >> int len; >> >> mask = (const char *)rt_mask(rt); >> /* >> * Just being extra cautious to avoid some custom >> * code getting into trouble. >> */ >> if (mask == NULL) { >> RTFREE_LOCKED(rt); >> return (EINVAL); >> } >> >> sa = (const char *)rt_key(rt); >> addr = (const char *)l3addr; >> len = ((const struct sockaddr_in *)l3addr)->sin_len; >> lim = addr + len; >> >> for ( ; addr < lim; sa++, mask++, addr++) { >> if ((*sa ^ *addr) & *mask) { >> #ifdef DIAGNOSTIC >> log(LOG_INFO, "IPv4 address: \"%s\" is >> not on the network\n", >> inet_ntoa(((const struct sockaddr_in >> *)l3addr)->sin_addr)); >> #endif >> RTFREE_LOCKED(rt); >> return (EINVAL); >> } >> } >> } >> >> >> Regards >> >> -- >> Juan Mojica >> Email: jmojica@gmail.com >> _______________________________________________ >> freebsd-net@freebsd.org mailing list >> http://lists.freebsd.org/mailman/listinfo/freebsd-net >> To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org" >> > > > > -- > Juan Mojica > Email: jmojica@gmail.com > -- Juan Mojica Email: jmojica@gmail.com