Add support to the 'ether' address family to support setting of addresses.
This allows you to set ether addresses with 'ifconfig ether'. Also, use some saner socket address families that allow several special case tests to be removed.
This commit is contained in:
parent
f38211642f
commit
de010cdfd0
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=63026
@ -227,7 +227,7 @@ typedef void af_getaddr __P((const char *, int));
|
|||||||
typedef void af_getprefix __P((const char *, int));
|
typedef void af_getprefix __P((const char *, int));
|
||||||
|
|
||||||
af_status in_status, ipx_status, at_status, ether_status;
|
af_status in_status, ipx_status, at_status, ether_status;
|
||||||
af_getaddr in_getaddr, ipx_getaddr, at_getaddr;
|
af_getaddr in_getaddr, ipx_getaddr, at_getaddr, ether_getaddr;
|
||||||
|
|
||||||
#ifdef INET6
|
#ifdef INET6
|
||||||
af_status in6_status;
|
af_status in6_status;
|
||||||
@ -268,13 +268,14 @@ struct afswtch {
|
|||||||
{ "ns", AF_NS, xns_status, xns_getaddr, NULL,
|
{ "ns", AF_NS, xns_status, xns_getaddr, NULL,
|
||||||
SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) },
|
SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) },
|
||||||
#endif
|
#endif
|
||||||
{ "ether", AF_INET, ether_status, NULL, NULL }, /* XXX not real!! */
|
{ "ether", AF_LINK, ether_status, ether_getaddr, NULL,
|
||||||
|
0, SIOCSIFLLADDR, NULL, C(ridreq) },
|
||||||
#if 0 /* XXX conflicts with the media command */
|
#if 0 /* XXX conflicts with the media command */
|
||||||
#ifdef USE_IF_MEDIA
|
#ifdef USE_IF_MEDIA
|
||||||
{ "media", AF_INET, media_status, NULL, NULL, }, /* XXX not real!! */
|
{ "media", AF_UNSPEC, media_status, NULL, NULL, }, /* XXX not real!! */
|
||||||
#endif
|
#endif
|
||||||
#ifdef USE_VLANS
|
#ifdef USE_VLANS
|
||||||
{ "vlan", AF_INET, media_status, NULL, NULL, }, /* XXX not real!! */
|
{ "vlan", AF_UNSPEC, vlan_status, NULL, NULL, }, /* XXX not real!! */
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
{ 0, 0, 0, 0 }
|
{ 0, 0, 0, 0 }
|
||||||
@ -541,7 +542,7 @@ ifconfig(argc, argv, afp)
|
|||||||
|
|
||||||
if (afp == NULL)
|
if (afp == NULL)
|
||||||
afp = &afs[0];
|
afp = &afs[0];
|
||||||
ifr.ifr_addr.sa_family = afp->af_af;
|
ifr.ifr_addr.sa_family = afp->af_af == AF_LINK ? AF_INET : afp->af_af;
|
||||||
strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
|
strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
|
||||||
|
|
||||||
if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
|
if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
|
||||||
@ -653,7 +654,7 @@ setifaddr(addr, param, s, afp)
|
|||||||
* and the flags may change when the address is set.
|
* and the flags may change when the address is set.
|
||||||
*/
|
*/
|
||||||
setaddr++;
|
setaddr++;
|
||||||
if (doalias == 0)
|
if (doalias == 0 && afp->af_af != AF_LINK)
|
||||||
clearaddr = 1;
|
clearaddr = 1;
|
||||||
(*afp->af_getaddr)(addr, (doalias >= 0 ? ADDR : RIDADDR));
|
(*afp->af_getaddr)(addr, (doalias >= 0 ? ADDR : RIDADDR));
|
||||||
}
|
}
|
||||||
@ -869,7 +870,7 @@ status(afp, addrcount, sdl, ifm, ifam)
|
|||||||
} else
|
} else
|
||||||
allfamilies = 0;
|
allfamilies = 0;
|
||||||
|
|
||||||
ifr.ifr_addr.sa_family = afp->af_af;
|
ifr.ifr_addr.sa_family = afp->af_af == AF_LINK ? AF_INET : afp->af_af;
|
||||||
strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
|
strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
|
||||||
|
|
||||||
if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
|
if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
|
||||||
@ -908,26 +909,12 @@ status(afp, addrcount, sdl, ifm, ifam)
|
|||||||
&info);
|
&info);
|
||||||
|
|
||||||
if (!allfamilies) {
|
if (!allfamilies) {
|
||||||
if (afp->af_af == info.rti_info[RTAX_IFA]->sa_family &&
|
if (afp->af_af == info.rti_info[RTAX_IFA]->sa_family) {
|
||||||
#ifdef USE_IF_MEDIA
|
|
||||||
afp->af_status != media_status &&
|
|
||||||
#endif
|
|
||||||
#ifdef USE_VLANS
|
|
||||||
afp->af_status != vlan_status &&
|
|
||||||
#endif
|
|
||||||
afp->af_status != ether_status) {
|
|
||||||
p = afp;
|
p = afp;
|
||||||
(*p->af_status)(s, &info);
|
(*p->af_status)(s, &info);
|
||||||
}
|
}
|
||||||
} else for (p = afs; p->af_name; p++) {
|
} else for (p = afs; p->af_name; p++) {
|
||||||
if (p->af_af == info.rti_info[RTAX_IFA]->sa_family &&
|
if (p->af_af == info.rti_info[RTAX_IFA]->sa_family)
|
||||||
#ifdef USE_IF_MEDIA
|
|
||||||
p->af_status != media_status &&
|
|
||||||
#endif
|
|
||||||
#ifdef USE_VLANS
|
|
||||||
p->af_status != vlan_status &&
|
|
||||||
#endif
|
|
||||||
p->af_status != ether_status)
|
|
||||||
(*p->af_status)(s, &info);
|
(*p->af_status)(s, &info);
|
||||||
}
|
}
|
||||||
addrcount--;
|
addrcount--;
|
||||||
@ -1402,6 +1389,24 @@ at_getaddr(addr, which)
|
|||||||
sat->sat_addr.s_node = node;
|
sat->sat_addr.s_node = node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ether_getaddr(addr, which)
|
||||||
|
const char *addr;
|
||||||
|
int which;
|
||||||
|
{
|
||||||
|
struct ether_addr *ea;
|
||||||
|
struct sockaddr *sea = &ridreq.ifr_addr;
|
||||||
|
|
||||||
|
ea = ether_aton(addr);
|
||||||
|
if (ea == NULL)
|
||||||
|
errx(1, "malformed ether address");
|
||||||
|
if (which == MASK)
|
||||||
|
errx(1, "Ethernet does not use netmasks");
|
||||||
|
sea->sa_family = AF_LINK;
|
||||||
|
sea->sa_len = ETHER_ADDR_LEN;
|
||||||
|
bcopy(ea, sea->sa_data, ETHER_ADDR_LEN);
|
||||||
|
}
|
||||||
|
|
||||||
/* XXX FIXME -- should use strtoul for better parsing. */
|
/* XXX FIXME -- should use strtoul for better parsing. */
|
||||||
void
|
void
|
||||||
setatrange(range, dummy, s, afp)
|
setatrange(range, dummy, s, afp)
|
||||||
|
Loading…
Reference in New Issue
Block a user