From owner-svn-src-all@FreeBSD.ORG Wed Dec 21 12:39:09 2011 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A32D5106566C; Wed, 21 Dec 2011 12:39:09 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 90AD38FC08; Wed, 21 Dec 2011 12:39:09 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pBLCd9gU068776; Wed, 21 Dec 2011 12:39:09 GMT (envelope-from glebius@svn.freebsd.org) Received: (from glebius@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pBLCd9YJ068770; Wed, 21 Dec 2011 12:39:09 GMT (envelope-from glebius@svn.freebsd.org) Message-Id: <201112211239.pBLCd9YJ068770@svn.freebsd.org> From: Gleb Smirnoff Date: Wed, 21 Dec 2011 12:39:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r228768 - in head/sys: net netinet netinet6 sys X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 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: Wed, 21 Dec 2011 12:39:09 -0000 Author: glebius Date: Wed Dec 21 12:39:08 2011 New Revision: 228768 URL: http://svn.freebsd.org/changeset/base/228768 Log: Provide ABI compatibility shim to enable configuring of addresses with ifconfig(8) prior to r228571. Requested by: brooks Modified: head/sys/net/if.h head/sys/netinet/in.c head/sys/netinet6/in6.c head/sys/netinet6/in6_var.h head/sys/sys/sockio.h Modified: head/sys/net/if.h ============================================================================== --- head/sys/net/if.h Wed Dec 21 12:21:22 2011 (r228767) +++ head/sys/net/if.h Wed Dec 21 12:39:08 2011 (r228768) @@ -362,6 +362,14 @@ struct ifaliasreq { int ifra_vhid; }; +/* Compat with pre-10.x */ +struct oifaliasreq { + char ifra_name[IFNAMSIZ]; + struct sockaddr ifra_addr; + struct sockaddr ifra_broadaddr; + struct sockaddr ifra_mask; +}; + struct ifmediareq { char ifm_name[IFNAMSIZ]; /* if name, e.g. "en0" */ int ifm_current; /* current media options */ Modified: head/sys/netinet/in.c ============================================================================== --- head/sys/netinet/in.c Wed Dec 21 12:21:22 2011 (r228767) +++ head/sys/netinet/in.c Wed Dec 21 12:39:08 2011 (r228768) @@ -223,6 +223,14 @@ in_control(struct socket *so, u_long cmd struct sockaddr_in oldaddr; int error, hostIsNew, iaIsNew, maskIsNew; int iaIsFirst; + u_long ocmd = cmd; + + /* + * Pre-10.x compat: OSIOCAIFADDR passes a shorter + * struct in_aliasreq, without ifra_vhid. + */ + if (cmd == OSIOCAIFADDR) + cmd = SIOCAIFADDR; ia = NULL; iaIsFirst = 0; @@ -253,10 +261,18 @@ in_control(struct socket *so, u_long cmd sizeof(struct sockaddr_in) || ifra->ifra_broadaddr.sin_family != AF_INET)) return (EINVAL); +#if 0 + /* + * ifconfig(8) in pre-10.x doesn't set sin_family for the + * mask. The code is disabled for the 10.x timeline, to + * make SIOCAIFADDR compatible with 9.x ifconfig(8). + * The code should be enabled in 11.x + */ if (ifra->ifra_mask.sin_len != 0 && (ifra->ifra_mask.sin_len != sizeof(struct sockaddr_in) || ifra->ifra_mask.sin_family != AF_INET)) return (EINVAL); +#endif break; case SIOCSIFADDR: case SIOCSIFBRDADDR: @@ -564,7 +580,7 @@ in_control(struct socket *so, u_long cmd } if (hostIsNew || maskIsNew) error = in_ifinit(ifp, ia, &ifra->ifra_addr, 0, - maskIsNew, ifra->ifra_vhid); + maskIsNew, (ocmd == cmd ? ifra->ifra_vhid : 0)); if (error != 0 && iaIsNew) break; Modified: head/sys/netinet6/in6.c ============================================================================== --- head/sys/netinet6/in6.c Wed Dec 21 12:21:22 2011 (r228767) +++ head/sys/netinet6/in6.c Wed Dec 21 12:39:08 2011 (r228768) @@ -275,6 +275,13 @@ in6_control(struct socket *so, u_long cm struct sockaddr_in6 *sa6; int carp_attached = 0; int error; + u_long ocmd = cmd; + + /* + * Compat to make pre-10.x ifconfig(8) operable. + */ + if (cmd == OSIOCAIFADDR_IN6) + cmd = SIOCAIFADDR_IN6; switch (cmd) { case SIOCGETSGCNT_IN6: @@ -654,7 +661,7 @@ in6_control(struct socket *so, u_long cm break; } - if (ifra->ifra_vhid > 0) { + if (cmd == ocmd && ifra->ifra_vhid > 0) { if (carp_attach_p != NULL) error = (*carp_attach_p)(&ia->ia_ifa, ifra->ifra_vhid); Modified: head/sys/netinet6/in6_var.h ============================================================================== --- head/sys/netinet6/in6_var.h Wed Dec 21 12:21:22 2011 (r228767) +++ head/sys/netinet6/in6_var.h Wed Dec 21 12:39:08 2011 (r228768) @@ -290,6 +290,16 @@ struct in6_aliasreq { int ifra_vhid; }; +/* pre-10.x compat */ +struct oin6_aliasreq { + char ifra_name[IFNAMSIZ]; + struct sockaddr_in6 ifra_addr; + struct sockaddr_in6 ifra_dstaddr; + struct sockaddr_in6 ifra_prefixmask; + int ifra_flags; + struct in6_addrlifetime ifra_lifetime; +}; + /* prefix type macro */ #define IN6_PREFIX_ND 1 #define IN6_PREFIX_RR 2 @@ -410,7 +420,8 @@ struct in6_rrenumreq { #define SIOCGIFNETMASK_IN6 _IOWR('i', 37, struct in6_ifreq) #define SIOCDIFADDR_IN6 _IOW('i', 25, struct in6_ifreq) -#define SIOCAIFADDR_IN6 _IOW('i', 26, struct in6_aliasreq) +#define OSIOCAIFADDR_IN6 _IOW('i', 26, struct oin6_aliasreq) +#define SIOCAIFADDR_IN6 _IOW('i', 27, struct in6_aliasreq) #define SIOCSIFPHYADDR_IN6 _IOW('i', 70, struct in6_aliasreq) #define SIOCGIFPSRCADDR_IN6 _IOWR('i', 71, struct in6_ifreq) Modified: head/sys/sys/sockio.h ============================================================================== --- head/sys/sys/sockio.h Wed Dec 21 12:21:22 2011 (r228767) +++ head/sys/sys/sockio.h Wed Dec 21 12:39:08 2011 (r228768) @@ -68,8 +68,7 @@ #define SIOCGIFMETRIC _IOWR('i', 23, struct ifreq) /* get IF metric */ #define SIOCSIFMETRIC _IOW('i', 24, struct ifreq) /* set IF metric */ #define SIOCDIFADDR _IOW('i', 25, struct ifreq) /* delete IF addr */ -#define SIOCAIFADDR _IOW('i', 26, struct ifaliasreq)/* add/chg IF alias */ - +#define OSIOCAIFADDR _IOW('i', 26, struct oifaliasreq)/* add/chg IF alias */ #define SIOCALIFADDR _IOW('i', 27, struct if_laddrreq) /* add IF addr */ #define SIOCGLIFADDR _IOWR('i', 28, struct if_laddrreq) /* get IF addr */ #define SIOCDLIFADDR _IOW('i', 29, struct if_laddrreq) /* delete IF addr */ @@ -81,6 +80,7 @@ #define SIOCSIFNAME _IOW('i', 40, struct ifreq) /* set IF name */ #define SIOCSIFDESCR _IOW('i', 41, struct ifreq) /* set ifnet descr */ #define SIOCGIFDESCR _IOWR('i', 42, struct ifreq) /* get ifnet descr */ +#define SIOCAIFADDR _IOW('i', 43, struct ifaliasreq)/* add/chg IF alias */ #define SIOCADDMULTI _IOW('i', 49, struct ifreq) /* add m'cast addr */ #define SIOCDELMULTI _IOW('i', 50, struct ifreq) /* del m'cast addr */