From owner-cvs-all Wed Oct 24 1:50:40 2001 Delivered-To: cvs-all@freebsd.org Received: from whale.sunbay.crimea.ua (whale.sunbay.crimea.ua [212.110.138.65]) by hub.freebsd.org (Postfix) with ESMTP id 0741C37B401; Wed, 24 Oct 2001 01:50:23 -0700 (PDT) Received: (from ru@localhost) by whale.sunbay.crimea.ua (8.11.6/8.11.2) id f9O8oHM10351; Wed, 24 Oct 2001 11:50:17 +0300 (EEST) (envelope-from ru) Date: Wed, 24 Oct 2001 11:50:17 +0300 From: Ruslan Ermilov To: Jonathan Lemon Cc: cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org Subject: Re: cvs commit: src/sys/netinet if_ether.c in.c in_var.h ip_icmp.c ip_input.c ip_output.c Message-ID: <20011024115017.C92032@sunbay.com> References: <200109290434.f8T4YB458912@freefall.freebsd.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <200109290434.f8T4YB458912@freefall.freebsd.org>; from jlemon@FreeBSD.org on Fri, Sep 28, 2001 at 09:34:11PM -0700 Sender: owner-cvs-all@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG On Fri, Sep 28, 2001 at 09:34:11PM -0700, Jonathan Lemon wrote: > jlemon 2001/09/28 21:34:11 PDT > > Modified files: > sys/netinet if_ether.c in.c in_var.h ip_icmp.c > ip_input.c ip_output.c > Log: > Add a hash table that contains the list of internet addresses, and use > this in place of the in_ifaddr list when appropriate. This improves > performance on hosts which have a large number of IP aliases. > > Revision Changes Path > 1.83 +25 -18 src/sys/netinet/if_ether.c > 1.58 +20 -14 src/sys/netinet/in.c > 1.41 +19 -3 src/sys/netinet/in_var.h > 1.61 +21 -14 src/sys/netinet/ip_icmp.c > 1.181 +31 -18 src/sys/netinet/ip_input.c > 1.138 +3 -2 src/sys/netinet/ip_output.c > I've been looking into these changes, and have a few comments. The KASSERT() you added in ip_icmp.c:icmp_reflect() should be moved slightly up. In if_ether.c:in_arpinput(), in the BRIDGE case, the old code initialized "maybe_ia" irrespective of the receive interface. The new code, in the case of non-match, falls back to the first INET address on the receive interface (only). While it's OK if that address exists, and the behavior is better that with the old code, it should also fall back to the first INET address in the system if the INET address on the receive doesn't exist (ifa is still NULL) and BRIDGE_TEST is true. Here's patch, untested: Index: if_ether.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/if_ether.c,v retrieving revision 1.86 diff -u -p -r1.86 if_ether.c --- if_ether.c 2001/10/20 05:14:06 1.86 +++ if_ether.c 2001/10/24 08:47:46 @@ -600,10 +600,13 @@ in_arpinput(m) if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_INET) break; if (ifa == NULL) { - m_freem(m); - return; - } - ia = ifatoia(ifa); + if (!BRIDGE_TEST || + (ia = TAILQ_FIRST(&in_ifaddrhead)) == NULL) { + m_freem(m); + return; + } + } else + ia = ifatoia(ifa); match: myaddr = ia->ia_addr.sin_addr; if (!bcmp(ar_sha(ah), IF_LLADDR(ifp), ifp->if_addrlen)) { Cheers, -- Ruslan Ermilov Oracle Developer/DBA, ru@sunbay.com Sunbay Software AG, ru@FreeBSD.org FreeBSD committer, +380.652.512.251 Simferopol, Ukraine http://www.FreeBSD.org The Power To Serve http://www.oracle.com Enabling The Information Age To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe cvs-all" in the body of the message