summaryrefslogtreecommitdiffstats
path: root/sys/netinet/in.c
diff options
context:
space:
mode:
authorglebius <glebius@FreeBSD.org>2011-12-21 12:39:08 +0000
committerglebius <glebius@FreeBSD.org>2011-12-21 12:39:08 +0000
commit653f8c5e7181f0fd06ea5451ebb67351c2dd5626 (patch)
tree96279cd42bceb4e7d71094c239ecf1b647e643e6 /sys/netinet/in.c
parent8451340f0023a2f549ad478e31b8cdeaeeac1096 (diff)
downloadFreeBSD-src-653f8c5e7181f0fd06ea5451ebb67351c2dd5626.zip
FreeBSD-src-653f8c5e7181f0fd06ea5451ebb67351c2dd5626.tar.gz
Provide ABI compatibility shim to enable configuring of addresses
with ifconfig(8) prior to r228571. Requested by: brooks
Diffstat (limited to 'sys/netinet/in.c')
-rw-r--r--sys/netinet/in.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/sys/netinet/in.c b/sys/netinet/in.c
index e0b3efa..26ef6d6 100644
--- a/sys/netinet/in.c
+++ b/sys/netinet/in.c
@@ -223,6 +223,14 @@ in_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
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, caddr_t data, struct ifnet *ifp,
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, caddr_t data, struct ifnet *ifp,
}
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;
OpenPOWER on IntegriCloud