Ensure consistent error messages from ifconfig(8).

If multiple threads are invoking "ifconfig XXX create" a race may occur
which can lead to two different error messages for the same error.

a) ifconfig: SIOCIFCREATE2: File exists
b) ifconfig: interface XXX already exists

This patch ensures ifconfig prints the same error code
for the same case.

Reviewed by:	imp@ and kib@
Differential Revision:	https://reviews.freebsd.org/D27380
MFC after:	1 week
Sponsored by:	Mellanox Technologies // NVIDIA Networking
This commit is contained in:
Hans Petter Selasky 2020-11-26 16:36:50 +00:00
parent accf961151
commit 05952067bb
7 changed files with 19 additions and 10 deletions

View File

@ -151,8 +151,7 @@ ifclonecreate(int s, void *arg)
}
if (clone_cb == NULL) {
/* NB: no parameters */
if (ioctl(s, SIOCIFCREATE2, &ifr) < 0)
err(1, "SIOCIFCREATE2");
ioctl_ifcreate(s, &ifr);
} else {
clone_cb(s, &ifr);
}

View File

@ -198,6 +198,19 @@ usage(void)
exit(1);
}
void
ioctl_ifcreate(int s, struct ifreq *ifr)
{
if (ioctl(s, SIOCIFCREATE2, ifr) < 0) {
switch (errno) {
case EEXIST:
errx(1, "interface %s already exists", ifr->ifr_name);
default:
err(1, "SIOCIFCREATE2");
}
}
}
#define ORDERS_SIZE(x) sizeof(x) / sizeof(x[0])
static int

View File

@ -160,3 +160,4 @@ struct ifmediareq *ifmedia_getstate(int s);
void print_vhid(const struct ifaddrs *, const char *);
void ioctl_ifcreate(int s, struct ifreq *);

View File

@ -5758,8 +5758,7 @@ wlan_create(int s, struct ifreq *ifr)
memcmp(params.icp_bssid, zerobssid, sizeof(zerobssid)) == 0)
errx(1, "no bssid specified for WDS (use wlanbssid)");
ifr->ifr_data = (caddr_t) &params;
if (ioctl(s, SIOCIFCREATE2, ifr) < 0)
err(1, "SIOCIFCREATE2");
ioctl_ifcreate(s, ifr);
/* XXX preserve original name for ifclonecreate(). */
strlcpy(orig_name, name, sizeof(orig_name));

View File

@ -324,8 +324,7 @@ static void
lagg_create(int s, struct ifreq *ifr)
{
ifr->ifr_data = (caddr_t) &params;
if (ioctl(s, SIOCIFCREATE2, ifr) < 0)
err(1, "SIOCIFCREATE2");
ioctl_ifcreate(s, ifr);
}
static struct cmd lagg_cmds[] = {

View File

@ -162,8 +162,7 @@ vlan_create(int s, struct ifreq *ifr)
errx(1, "must specify a parent device for vlan create");
ifr->ifr_data = (caddr_t) &params;
}
if (ioctl(s, SIOCIFCREATE2, ifr) < 0)
err(1, "SIOCIFCREATE2");
ioctl_ifcreate(s, ifr);
}
static void

View File

@ -191,8 +191,7 @@ vxlan_create(int s, struct ifreq *ifr)
vxlan_check_params();
ifr->ifr_data = (caddr_t) &params;
if (ioctl(s, SIOCIFCREATE2, ifr) < 0)
err(1, "SIOCIFCREATE2");
ioctl_ifcreate(s, ifr);
}
static