The branch stable/13 has been updated by melifaro:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=a9dcee4334b26c41ee3ce78ccb48d61ce21bc4f4

commit a9dcee4334b26c41ee3ce78ccb48d61ce21bc4f4
Author:     Alexander V. Chernikov <melif...@freebsd.org>
AuthorDate: 2022-09-24 19:37:29 +0000
Commit:     Alexander V. Chernikov <melif...@freebsd.org>
CommitDate: 2023-01-23 22:10:07 +0000

    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
    
    (cherry picked from commit 9a7c520a7811a036a8140effb352f44ad5640c0e)
---
 sys/net/if.c     | 30 +++++++++++++++++++++---------
 sys/net/if_var.h |  2 ++
 2 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/sys/net/if.c b/sys/net/if.c
index 7423c4963f57..813525c2e7bd 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -703,7 +703,7 @@ if_free_internal(struct ifnet *ifp)
        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);
 }
@@ -2486,7 +2486,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;
-       char *descrbuf, *odescrbuf;
+       char *descrbuf;
        char new_name[IFNAMSIZ];
        struct ifaddr *ifa;
        struct sockaddr_dl *sdl;
@@ -2578,18 +2578,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:
@@ -4157,6 +4152,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
diff --git a/sys/net/if_var.h b/sys/net/if_var.h
index 48da169fd1d6..6738f00a4f08 100644
--- a/sys/net/if_var.h
+++ b/sys/net/if_var.h
@@ -708,6 +708,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);

Reply via email to