[Bug 235920] ifconfig: unable to create another interface after renaming the previous one with the same name
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 19 Apr 2023 03:24:44 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=235920
--- Comment #4 from Zhenlei Huang <zlei@FreeBSD.org> ---
(In reply to Oleg Ginzburg from comment #0)
If `ifconfig create` with an unit number, then cloner will check whether the
number is available or not ( via alloc_unr_specific() ).
```
static int
tun_clone_create(struct if_clone *ifc, char *name, size_t len,
struct ifc_data *ifd, struct ifnet **ifpp)
{
struct tuntap_driver *drv;
struct cdev *dev;
int err, i, tunflags, unit;
tunflags = 0;
/* The name here tells us exactly what we're creating */
err = tuntap_name2info(name, &unit, &tunflags);
if (err != 0)
return (err);
drv = tuntap_driver_from_flags(tunflags);
if (drv == NULL)
return (ENXIO);
if (unit != -1) {
/* If this unit number is still available that's okay. */
if (alloc_unr_specific(drv->unrhdr, unit) == -1)
return (EEXIST);
} else {
unit = alloc_unr(drv->unrhdr);
}
snprintf(name, IFNAMSIZ, "%s%d", drv->cdevsw.d_name, unit);
/* find any existing device, or allocate new unit number */
dev = NULL;
i = clone_create(&drv->clones, &drv->cdevsw, &unit, &dev, 0);
/* No preexisting struct cdev *, create one */
if (i != 0)
i = tun_create_device(drv, unit, NULL, &dev, name);
if (i == 0) {
tuncreate(dev);
struct tuntap_softc *tp = dev->si_drv1;
*ifpp = tp->tun_ifp;
}
return (i);
}
```
When an interface is renamed, its unit number is not `freed` and thus lead this
problem.
Other interfaces such as if_bridge are also affected.
```
# ifconfig bridge0 create name br0
# ifconfig bridge0 create
ifconfig: interface bridge0 already exists
```
--
You are receiving this mail because:
You are the assignee for the bug.