Drop support for SIOCSIFADDR, SIOCSIFNETMASK, SIOCSIFBRDADDR, SIOCSIFDSTADDR

ioctl commands.

PR:		163524
Reviewed by:	net
This commit is contained in:
Gleb Smirnoff 2012-01-16 09:53:24 +00:00
parent 3a4a1a7f8a
commit 56cf9dc1f6
2 changed files with 7 additions and 77 deletions

View File

@ -73,7 +73,7 @@ static int in_lifaddr_ioctl(struct socket *, u_long, caddr_t,
static void in_socktrim(struct sockaddr_in *); static void in_socktrim(struct sockaddr_in *);
static int in_ifinit(struct ifnet *, struct in_ifaddr *, static int in_ifinit(struct ifnet *, struct in_ifaddr *,
struct sockaddr_in *, int, int, int); struct sockaddr_in *, int, int);
static void in_purgemaddrs(struct ifnet *); static void in_purgemaddrs(struct ifnet *);
static VNET_DEFINE(int, nosameprefix); static VNET_DEFINE(int, nosameprefix);
@ -220,7 +220,6 @@ in_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
struct in_addr dst; struct in_addr dst;
struct in_ifinfo *ii; struct in_ifinfo *ii;
struct in_aliasreq *ifra = (struct in_aliasreq *)data; struct in_aliasreq *ifra = (struct in_aliasreq *)data;
struct sockaddr_in oldaddr;
int error, hostIsNew, iaIsNew, maskIsNew; int error, hostIsNew, iaIsNew, maskIsNew;
int iaIsFirst; int iaIsFirst;
u_long ocmd = cmd; u_long ocmd = cmd;
@ -278,10 +277,8 @@ in_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
case SIOCSIFBRDADDR: case SIOCSIFBRDADDR:
case SIOCSIFDSTADDR: case SIOCSIFDSTADDR:
case SIOCSIFNETMASK: case SIOCSIFNETMASK:
if (ifr->ifr_addr.sa_family != AF_INET || /* We no longer support that old commands. */
ifr->ifr_addr.sa_len != sizeof(struct sockaddr_in)) return (EINVAL);
return (EINVAL);
break;
case SIOCALIFADDR: case SIOCALIFADDR:
if (td != NULL) { if (td != NULL) {
@ -322,10 +319,6 @@ in_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
*/ */
switch (cmd) { switch (cmd) {
case SIOCAIFADDR: case SIOCAIFADDR:
case SIOCSIFADDR:
case SIOCSIFBRDADDR:
case SIOCSIFNETMASK:
case SIOCSIFDSTADDR:
if (td != NULL) { if (td != NULL) {
error = priv_check(td, PRIV_NET_ADDIFADDR); error = priv_check(td, PRIV_NET_ADDIFADDR);
if (error) if (error)
@ -413,10 +406,6 @@ in_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
error = EADDRNOTAVAIL; error = EADDRNOTAVAIL;
goto out; goto out;
} }
/* FALLTHROUGH */
case SIOCSIFADDR:
case SIOCSIFNETMASK:
case SIOCSIFDSTADDR:
if (ia == NULL) { if (ia == NULL) {
ia = (struct in_ifaddr *) ia = (struct in_ifaddr *)
malloc(sizeof *ia, M_IFADDR, M_NOWAIT | malloc(sizeof *ia, M_IFADDR, M_NOWAIT |
@ -452,7 +441,6 @@ in_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
} }
break; break;
case SIOCSIFBRDADDR:
case SIOCGIFADDR: case SIOCGIFADDR:
case SIOCGIFNETMASK: case SIOCGIFNETMASK:
case SIOCGIFDSTADDR: case SIOCGIFDSTADDR:
@ -493,61 +481,6 @@ in_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
*((struct sockaddr_in *)&ifr->ifr_addr) = ia->ia_sockmask; *((struct sockaddr_in *)&ifr->ifr_addr) = ia->ia_sockmask;
goto out; goto out;
case SIOCSIFDSTADDR:
if ((ifp->if_flags & IFF_POINTOPOINT) == 0) {
error = EINVAL;
goto out;
}
oldaddr = ia->ia_dstaddr;
ia->ia_dstaddr = *(struct sockaddr_in *)&ifr->ifr_dstaddr;
if (ifp->if_ioctl != NULL) {
error = (*ifp->if_ioctl)(ifp, SIOCSIFDSTADDR,
(caddr_t)ia);
if (error) {
ia->ia_dstaddr = oldaddr;
goto out;
}
}
if (ia->ia_flags & IFA_ROUTE) {
ia->ia_ifa.ifa_dstaddr = (struct sockaddr *)&oldaddr;
rtinit(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST);
ia->ia_ifa.ifa_dstaddr =
(struct sockaddr *)&ia->ia_dstaddr;
rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_HOST|RTF_UP);
}
goto out;
case SIOCSIFBRDADDR:
if ((ifp->if_flags & IFF_BROADCAST) == 0) {
error = EINVAL;
goto out;
}
ia->ia_broadaddr = *(struct sockaddr_in *)&ifr->ifr_broadaddr;
goto out;
case SIOCSIFADDR:
error = in_ifinit(ifp, ia,
(struct sockaddr_in *) &ifr->ifr_addr, 1, 0, 0);
if (error != 0 && iaIsNew)
break;
if (error == 0) {
ii = ((struct in_ifinfo *)ifp->if_afdata[AF_INET]);
if (iaIsFirst &&
(ifp->if_flags & IFF_MULTICAST) != 0) {
error = in_joingroup(ifp, &allhosts_addr,
NULL, &ii->ii_allhosts);
}
EVENTHANDLER_INVOKE(ifaddr_event, ifp);
}
error = 0;
goto out;
case SIOCSIFNETMASK:
ia->ia_sockmask.sin_addr = ((struct sockaddr_in *)
&ifr->ifr_addr)->sin_addr;
ia->ia_subnetmask = ntohl(ia->ia_sockmask.sin_addr.s_addr);
goto out;
case SIOCAIFADDR: case SIOCAIFADDR:
maskIsNew = 0; maskIsNew = 0;
hostIsNew = 1; hostIsNew = 1;
@ -579,8 +512,8 @@ in_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
maskIsNew = 1; /* We lie; but the effect's the same */ maskIsNew = 1; /* We lie; but the effect's the same */
} }
if (hostIsNew || maskIsNew) if (hostIsNew || maskIsNew)
error = in_ifinit(ifp, ia, &ifra->ifra_addr, 0, error = in_ifinit(ifp, ia, &ifra->ifra_addr, maskIsNew,
maskIsNew, (ocmd == cmd ? ifra->ifra_vhid : 0)); (ocmd == cmd ? ifra->ifra_vhid : 0));
if (error != 0 && iaIsNew) if (error != 0 && iaIsNew)
break; break;
@ -863,14 +796,11 @@ in_ifscrub(struct ifnet *ifp, struct in_ifaddr *ia, u_int flags)
*/ */
static int static int
in_ifinit(struct ifnet *ifp, struct in_ifaddr *ia, struct sockaddr_in *sin, in_ifinit(struct ifnet *ifp, struct in_ifaddr *ia, struct sockaddr_in *sin,
int scrub, int masksupplied, int vhid) int masksupplied, int vhid)
{ {
register u_long i = ntohl(sin->sin_addr.s_addr); register u_long i = ntohl(sin->sin_addr.s_addr);
int flags = RTF_UP, error = 0; int flags = RTF_UP, error = 0;
if (scrub)
in_scrubprefix(ia, LLE_STATIC);
IN_IFADDR_WLOCK(); IN_IFADDR_WLOCK();
if (ia->ia_addr.sin_family == AF_INET) if (ia->ia_addr.sin_family == AF_INET)
LIST_REMOVE(ia, ia_hash); LIST_REMOVE(ia, ia_hash);

View File

@ -58,7 +58,7 @@
* in the range 5 to 9. * in the range 5 to 9.
*/ */
#undef __FreeBSD_version #undef __FreeBSD_version
#define __FreeBSD_version 1000004 /* Master, propagated to newvers */ #define __FreeBSD_version 1000005 /* Master, propagated to newvers */
/* /*
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD, * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,