Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 23 Jan 2023 22:12:28 GMT
From:      "Alexander V. Chernikov" <melifaro@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: a9dcee4334b2 - stable/13 - ifp: add if_setdescr() / if_freedesrt() methods
Message-ID:  <202301232212.30NMCSxq017495@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by melifaro:

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

commit a9dcee4334b26c41ee3ce78ccb48d61ce21bc4f4
Author:     Alexander V. Chernikov <melifaro@FreeBSD.org>
AuthorDate: 2022-09-24 19:37:29 +0000
Commit:     Alexander V. Chernikov <melifaro@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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202301232212.30NMCSxq017495>