From owner-svn-src-all@FreeBSD.ORG Thu Oct 10 15:44:27 2013 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id E4B0B19E; Thu, 10 Oct 2013 15:44:26 +0000 (UTC) (envelope-from pluknet@gmail.com) Received: from mail-we0-x22d.google.com (mail-we0-x22d.google.com [IPv6:2a00:1450:400c:c03::22d]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 0634525C4; Thu, 10 Oct 2013 15:44:25 +0000 (UTC) Received: by mail-we0-f173.google.com with SMTP id u57so2745585wes.4 for ; Thu, 10 Oct 2013 08:44:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=z9KUALDrYG98mPMmjNxUu0UH3Y/tkj393OjBQcvGfM0=; b=nz0d6oeN5ocFQ0ioHvut4/0srDcfSZY8c7gYlZMg455g8+S7/68LeHQdTP0cNUkIcD pJMSs0Uk+PaCyoA6bNP4IvCFqoNF+4TX7b2x1768lJGso4wYzoCiJZqemyxKQ67qvsUP bjLojzE2IZshJR9sS00cULscSV2yH+hAk4L1B/ERxvGJ2dC1kdXGxlWy+XY8YWFnbuZi VeSWxTzEfP/Wl5tlO4X2277tKBzINW7xOBeb6jkTvM2TJA985f3JoeFTDrJR8+g4xXik eMRAKNjBYEhjlIjzZfEj1EewQyPeFbFW6q1GZ3Yc7bxqCDiZE0veRD1BpfoXZyO2kTPd JOCw== MIME-Version: 1.0 X-Received: by 10.180.89.225 with SMTP id br1mr8410196wib.50.1381419864515; Thu, 10 Oct 2013 08:44:24 -0700 (PDT) Sender: pluknet@gmail.com Received: by 10.216.62.69 with HTTP; Thu, 10 Oct 2013 08:44:24 -0700 (PDT) In-Reply-To: <201202110602.q1B62Hx2015984@svn.freebsd.org> References: <201202110602.q1B62Hx2015984@svn.freebsd.org> Date: Thu, 10 Oct 2013 19:44:24 +0400 X-Google-Sender-Auth: O2J9l1_ItGqvX9YqH7lrzw2o1_w Message-ID: Subject: Re: svn commit: r231505 - in head: lib/libc/gen sys/net sys/sys From: Sergey Kandaurov To: "Bjoern A. Zeeb" Content-Type: text/plain; charset=ISO-8859-1 Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 10 Oct 2013 15:44:27 -0000 On 11 February 2012 10:02, Bjoern A. Zeeb wrote: > Author: bz > Date: Sat Feb 11 06:02:16 2012 > New Revision: 231505 > URL: http://svn.freebsd.org/changeset/base/231505 > > Log: > Introduce a new NET_RT_IFLISTL API to query the address list. It works > on extended and extensible structs if_msghdrl and ifa_msghdrl. This > will allow us to extend both the msghdrl structs and eventually if_data > in the future without breaking the ABI. There is some inconsistency between native and compat32 binaries wrt NET_RT_IFLISTL. I didn't investigate how it may affect userland utilities. [My limited debugging said me it does not.] > static int > +sysctl_iflist_ifml(struct ifnet *ifp, struct rt_addrinfo *info, > + struct walkarg *w, int len) > +{ > + struct if_msghdrl *ifm; > + > +#ifdef COMPAT_FREEBSD32 > + if (w->w_req->flags & SCTL_MASK32) { > + struct if_msghdrl32 *ifm32; > + > + ifm32 = (struct if_msghdrl32 *)w->w_tmem; > + ifm32->ifm_addrs = info->rti_addrs; > + ifm32->ifm_flags = ifp->if_flags | ifp->if_drv_flags; > + ifm32->ifm_index = ifp->if_index; > + ifm32->_ifm_spare1 = 0; > + ifm32->ifm_len = sizeof(*ifm32); > + ifm32->ifm_data_off = offsetof(struct if_msghdrl32, ifm_data); > + > + copy_ifdata32(&ifp->if_data, &ifm32->ifm_data); > + /* Fixup if_data carp(4) vhid. */ > + if (carp_get_vhid_p != NULL) > + ifm32->ifm_data.ifi_vhid = > + (*carp_get_vhid_p)(ifp->if_addr); > + > + return (SYSCTL_OUT(w->w_req, (caddr_t)ifm32, len)); > + } > +#endif > + ifm = (struct if_msghdrl *)w->w_tmem; > + ifm->ifm_addrs = info->rti_addrs; > + ifm->ifm_flags = ifp->if_flags | ifp->if_drv_flags; > + ifm->ifm_index = ifp->if_index; > + ifm->_ifm_spare1 = 0; > + ifm->ifm_len = sizeof(*ifm); > + ifm->ifm_data_off = offsetof(struct if_msghdrl, ifm_data); > + > + ifm->ifm_data = ifp->if_data; > + /* Fixup if_data carp(4) vhid. */ > + if (carp_get_vhid_p != NULL) > + ifm->ifm_data.ifi_vhid = (*carp_get_vhid_p)(ifp->if_addr); > + > + return (SYSCTL_OUT(w->w_req, (caddr_t)ifm, len)); > +} This function consistently uses ifp->if_data to fill ifm_data. But please see below. > + > +static int > +sysctl_iflist_ifm(struct ifnet *ifp, struct rt_addrinfo *info, > + struct walkarg *w, int len) > +{ > + struct if_msghdr *ifm; > + > +#ifdef COMPAT_FREEBSD32 > + if (w->w_req->flags & SCTL_MASK32) { > + struct if_msghdr32 *ifm32; > + > + ifm32 = (struct if_msghdr32 *)w->w_tmem; > + ifm32->ifm_addrs = info->rti_addrs; > + ifm32->ifm_flags = ifp->if_flags | ifp->if_drv_flags; > + ifm32->ifm_index = ifp->if_index; > + > + copy_ifdata32(&ifp->if_data, &ifm32->ifm_data); > + /* Fixup if_data carp(4) vhid. */ > + if (carp_get_vhid_p != NULL) > + ifm32->ifm_data.ifi_vhid = > + (*carp_get_vhid_p)(ifp->if_addr); > + > + return (SYSCTL_OUT(w->w_req, (caddr_t)ifm32, len)); > + } > +#endif > + ifm = (struct if_msghdr *)w->w_tmem; > + ifm->ifm_addrs = info->rti_addrs; > + ifm->ifm_flags = ifp->if_flags | ifp->if_drv_flags; > + ifm->ifm_index = ifp->if_index; > + > + ifm->ifm_data = ifp->if_data; > + /* Fixup if_data carp(4) vhid. */ > + if (carp_get_vhid_p != NULL) > + ifm->ifm_data.ifi_vhid = (*carp_get_vhid_p)(ifp->if_addr); > + > + return (SYSCTL_OUT(w->w_req, (caddr_t)ifm, len)); > +} Ditto. > + > +static int > +sysctl_iflist_ifaml(struct ifaddr *ifa, struct rt_addrinfo *info, > + struct walkarg *w, int len) > +{ > + struct ifa_msghdrl *ifam; > + > +#ifdef COMPAT_FREEBSD32 > + if (w->w_req->flags & SCTL_MASK32) { > + struct ifa_msghdrl32 *ifam32; > + > + ifam32 = (struct ifa_msghdrl32 *)w->w_tmem; > + ifam32->ifam_addrs = info->rti_addrs; > + ifam32->ifam_flags = ifa->ifa_flags; > + ifam32->ifam_index = ifa->ifa_ifp->if_index; > + ifam32->_ifam_spare1 = 0; > + ifam32->ifam_len = sizeof(*ifam32); > + ifam32->ifam_data_off = > + offsetof(struct ifa_msghdrl32, ifam_data); > + ifam32->ifam_metric = ifa->ifa_metric; > + > + copy_ifdata32(&ifa->ifa_ifp->if_data, &ifam32->ifam_data); > + /* Fixup if_data carp(4) vhid. */ > + if (carp_get_vhid_p != NULL) > + ifam32->ifam_data.ifi_vhid = (*carp_get_vhid_p)(ifa); > + > + return (SYSCTL_OUT(w->w_req, (caddr_t)ifam32, len)); > + } > +#endif > + > + ifam = (struct ifa_msghdrl *)w->w_tmem; > + ifam->ifam_addrs = info->rti_addrs; > + ifam->ifam_flags = ifa->ifa_flags; > + ifam->ifam_index = ifa->ifa_ifp->if_index; > + ifam->_ifam_spare1 = 0; > + ifam->ifam_len = sizeof(*ifam); > + ifam->ifam_data_off = offsetof(struct ifa_msghdrl, ifam_data); > + ifam->ifam_metric = ifa->ifa_metric; > + > + ifam->ifam_data = ifa->if_data; > + /* Fixup if_data carp(4) vhid. */ > + if (carp_get_vhid_p != NULL) > + ifam->ifam_data.ifi_vhid = (*carp_get_vhid_p)(ifa); > + > + return (SYSCTL_OUT(w->w_req, w->w_tmem, len)); > +} This function uses ifa->if_data to fill ifam_data for native binaries, and ifa->ifa_ifp->if_data for compat32. AFAIK they may not match. -- wbr, pluknet