Changeset View
Changeset View
Standalone View
Standalone View
head/sys/net/if_clone.c
Show First 20 Lines • Show All 589 Lines • ▼ Show 20 Lines | for (*unit = 0; *cp != '\0'; cp++) { | ||||
return (EINVAL); | return (EINVAL); | ||||
*unit = (*unit * 10) + (*cp - '0'); | *unit = (*unit * 10) + (*cp - '0'); | ||||
} | } | ||||
} | } | ||||
return (0); | return (0); | ||||
} | } | ||||
int | static int | ||||
ifc_alloc_unit(struct if_clone *ifc, int *unit) | ifc_alloc_unit_specific(struct if_clone *ifc, int *unit) | ||||
{ | { | ||||
char name[IFNAMSIZ]; | char name[IFNAMSIZ]; | ||||
int wildcard; | |||||
wildcard = (*unit < 0); | |||||
retry: | |||||
if (*unit > ifc->ifc_maxunit) | if (*unit > ifc->ifc_maxunit) | ||||
return (ENOSPC); | return (ENOSPC); | ||||
if (*unit < 0) { | |||||
*unit = alloc_unr(ifc->ifc_unrhdr); | if (alloc_unr_specific(ifc->ifc_unrhdr, *unit) == -1) | ||||
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); | return (EEXIST); | ||||
} | |||||
} | |||||
snprintf(name, IFNAMSIZ, "%s%d", ifc->ifc_name, *unit); | snprintf(name, IFNAMSIZ, "%s%d", ifc->ifc_name, *unit); | ||||
if (ifunit(name) != NULL) { | if (ifunit(name) != NULL) { | ||||
free_unr(ifc->ifc_unrhdr, *unit); | free_unr(ifc->ifc_unrhdr, *unit); | ||||
if (wildcard) { | |||||
(*unit)++; | |||||
goto retry; | |||||
} else | |||||
return (EEXIST); | return (EEXIST); | ||||
} | } | ||||
IF_CLONE_ADDREF(ifc); | IF_CLONE_ADDREF(ifc); | ||||
return (0); | 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 | void | ||||
ifc_free_unit(struct if_clone *ifc, int unit) | ifc_free_unit(struct if_clone *ifc, int unit) | ||||
{ | { | ||||
free_unr(ifc->ifc_unrhdr, unit); | free_unr(ifc->ifc_unrhdr, unit); | ||||
IF_CLONE_REMREF(ifc); | IF_CLONE_REMREF(ifc); | ||||
▲ Show 20 Lines • Show All 81 Lines • Show Last 20 Lines |