ifp: add if_setdescr() / if_freedesrt() methods

Add methods for setting and removing the description from the interface,
 so the external users can manage it without using ioctl API.

MFC after:      2 weeks
This commit is contained in:
Alexander V. Chernikov 2022-09-24 19:37:29 +00:00
parent 26c190d280
commit 9a7c520a78
2 changed files with 23 additions and 9 deletions

View file

@ -653,7 +653,7 @@ if_free_deferred(epoch_context_t ctx)
for (int i = 0; i < IFCOUNTERS; i++)
counter_u64_free(ifp->if_counters[i]);
free(ifp->if_description, M_IFDESCR);
if_freedescr(ifp->if_description);
free(ifp->if_hw_addr, M_IFADDR);
free(ifp, M_IFNET);
}
@ -2478,7 +2478,7 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
int new_flags, temp_flags;
size_t namelen, onamelen;
size_t descrlen, nvbuflen;
char *descrbuf, *odescrbuf;
char *descrbuf;
char new_name[IFNAMSIZ];
char old_name[IFNAMSIZ], strbuf[IFNAMSIZ + 8];
struct ifaddr *ifa;
@ -2615,18 +2615,13 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
error = copyin(ifr_buffer_get_buffer(ifr), descrbuf,
ifr_buffer_get_length(ifr) - 1);
if (error) {
free(descrbuf, M_IFDESCR);
if_freedescr(descrbuf);
break;
}
}
sx_xlock(&ifdescr_sx);
odescrbuf = ifp->if_description;
ifp->if_description = descrbuf;
sx_xunlock(&ifdescr_sx);
if_setdescr(ifp, descrbuf);
getmicrotime(&ifp->if_lastchange);
free(odescrbuf, M_IFDESCR);
break;
case SIOCGIFFIB:
@ -4267,6 +4262,23 @@ if_getcapenable(if_t ifp)
return ((struct ifnet *)ifp)->if_capenable;
}
void
if_setdescr(if_t ifp, char *descrbuf)
{
sx_xlock(&ifdescr_sx);
char *odescrbuf = ifp->if_description;
ifp->if_description = descrbuf;
sx_xunlock(&ifdescr_sx);
if_freedescr(odescrbuf);
}
void
if_freedescr(char *descrbuf)
{
free(descrbuf, M_IFDESCR);
}
/*
* This is largely undesirable because it ties ifnet to a device, but does
* provide flexiblity for an embedded product vendor. Should be used with

View file

@ -739,6 +739,8 @@ int if_setcapenable(if_t ifp, int capenable);
int if_setcapenablebit(if_t ifp, int setcap, int clearcap);
int if_getcapenable(if_t ifp);
const char *if_getdname(if_t ifp);
void if_setdescr(if_t ifp, char *descrbuf);
void if_freedescr(char *descrbuf);
int if_setdev(if_t ifp, void *dev);
int if_setdrvflagbits(if_t ifp, int if_setflags, int clear_flags);
int if_getdrvflags(if_t ifp);