Skip to content

Commit

Permalink
Merge branch 'freebsd/10-stable/master' into hardened/10-stable/master
Browse files Browse the repository at this point in the history
* freebsd/10-stable/master:
  MFC r324672: ifnet(9): split ifc_alloc_unit() (should simplify code flow)
  • Loading branch information
opntr-auto committed Oct 21, 2017
2 parents bc985f7 + 56d77e5 commit b6dda51
Showing 1 changed file with 36 additions and 24 deletions.
60 changes: 36 additions & 24 deletions sys/net/if_clone.c
Original file line number Diff line number Diff line change
Expand Up @@ -602,46 +602,58 @@ ifc_name2unit(const char *name, int *unit)
return (0);
}

int
ifc_alloc_unit(struct if_clone *ifc, int *unit)
static int
ifc_alloc_unit_specific(struct if_clone *ifc, int *unit)
{
char name[IFNAMSIZ];
int wildcard;

wildcard = (*unit < 0);
retry:
if (*unit > ifc->ifc_maxunit)
return (ENOSPC);
if (*unit < 0) {
*unit = alloc_unr(ifc->ifc_unrhdr);
if (*unit == -1)
return (ENOSPC);
} else {
*unit = alloc_unr_specific(ifc->ifc_unrhdr, *unit);
if (*unit == -1) {
if (wildcard) {
(*unit)++;
goto retry;
} else
return (EEXIST);
}
}

if (alloc_unr_specific(ifc->ifc_unrhdr, *unit) == -1)
return (EEXIST);

snprintf(name, IFNAMSIZ, "%s%d", ifc->ifc_name, *unit);
if (ifunit(name) != NULL) {
free_unr(ifc->ifc_unrhdr, *unit);
if (wildcard) {
(*unit)++;
goto retry;
} else
return (EEXIST);
return (EEXIST);
}

IF_CLONE_ADDREF(ifc);

return (0);
}

static int
ifc_alloc_unit_next(struct if_clone *ifc, int *unit)
{
int error;

*unit = alloc_unr(ifc->ifc_unrhdr);
if (*unit == -1)
return (ENOSPC);

free_unr(ifc->ifc_unrhdr, *unit);
for (;;) {
error = ifc_alloc_unit_specific(ifc, unit);
if (error != EEXIST)
break;

(*unit)++;
}

return (error);
}

int
ifc_alloc_unit(struct if_clone *ifc, int *unit)
{
if (*unit < 0)
return (ifc_alloc_unit_next(ifc, unit));
else
return (ifc_alloc_unit_specific(ifc, unit));
}

void
ifc_free_unit(struct if_clone *ifc, int unit)
{
Expand Down

0 comments on commit b6dda51

Please sign in to comment.