Provide ABI compatibility shim to enable configuring of addresses
with ifconfig(8) prior to r228571. Requested by: brooks
This commit is contained in:
parent
b133becced
commit
7121247312
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=228768
@ -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 */
|
||||
|
@ -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;
|
||||
|
||||
|
@ -275,6 +275,13 @@ in6_control(struct socket *so, u_long cmd, caddr_t data,
|
||||
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 cmd, caddr_t data,
|
||||
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);
|
||||
|
@ -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)
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user