Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 25 Jul 2025 20:12:02 GMT
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 183d09305677 - main - bsnmpd: merge send and send2 methods for transports
Message-ID:  <202507252012.56PKC2Dr010149@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by glebius:

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

commit 183d09305677b7c669eba8ed6fe8d0b879684913
Author:     Gleb Smirnoff <glebius@FreeBSD.org>
AuthorDate: 2025-07-25 20:09:36 +0000
Commit:     Gleb Smirnoff <glebius@FreeBSD.org>
CommitDate: 2025-07-25 20:09:36 +0000

    bsnmpd: merge send and send2 methods for transports
    
    Shall be no functional change for normal SNMP sends, e.g. replies and
    traps.
    
    NB: for the inet_send() called from snmp_send_port() we now actually use
    supplied address, but we could do a better job at finding matching socket.
    However, it could be that snmp_send_port() is not used by any external
    module, and in that case it is easier to just deprecate it as poorly
    fitting design of the server.  This will be checked with exp-run.
    
    Reviewed by:            harti
    Differential Revision:  https://reviews.freebsd.org/D51360
---
 contrib/bsnmp/snmpd/main.c        | 17 +++++++----------
 contrib/bsnmp/snmpd/snmpd.h       |  6 +-----
 contrib/bsnmp/snmpd/trans_inet.c  |  9 ++++-----
 contrib/bsnmp/snmpd/trans_lsock.c | 13 +++++++------
 4 files changed, 19 insertions(+), 26 deletions(-)

diff --git a/contrib/bsnmp/snmpd/main.c b/contrib/bsnmp/snmpd/main.c
index f71e3f9515f2..933ab7aa655a 100644
--- a/contrib/bsnmp/snmpd/main.c
+++ b/contrib/bsnmp/snmpd/main.c
@@ -1186,12 +1186,7 @@ snmpd_input(struct port_input *pi, struct tport *tport)
 	    sndbuf, &sndlen, "SNMP", ierr, vi, NULL);
 
 	if (ferr == SNMPD_INPUT_OK) {
-		if (tport->transport->vtab->send != NULL)
-			slen = tport->transport->vtab->send(tport, sndbuf,
-			    sndlen, pi->peer, pi->peerlen);
-		else
-			slen = tport->transport->vtab->send2(tport, sndbuf,
-			    sndlen, pi);
+		slen = tport->transport->vtab->send(tport, sndbuf, sndlen, pi);
 		if (slen == -1)
 			syslog(LOG_ERR, "send*: %m");
 		else if ((size_t)slen != sndlen)
@@ -1214,6 +1209,11 @@ void
 snmp_send_port(void *targ, const struct asn_oid *port, struct snmp_pdu *pdu,
     const struct sockaddr *addr, socklen_t addrlen)
 {
+	struct port_input pi = {
+		.fd = -1,
+		.peer = __DECONST(struct sockaddr *, addr),
+		.peerlen = addrlen,
+	};
 	struct transport *trans = targ;
 	struct tport *tp;
 	u_char *sndbuf;
@@ -1231,10 +1231,7 @@ snmp_send_port(void *targ, const struct asn_oid *port, struct snmp_pdu *pdu,
 
 	snmp_output(pdu, sndbuf, &sndlen, "SNMP PROXY");
 
-	if (trans->vtab->send != NULL)
-		len = trans->vtab->send(tp, sndbuf, sndlen, addr, addrlen);
-	else
-		len = trans->vtab->send2(tp, sndbuf, sndlen, NULL);
+	len = trans->vtab->send(tp, sndbuf, sndlen, &pi);
 
 	if (len == -1)
 		syslog(LOG_ERR, "sendto: %m");
diff --git a/contrib/bsnmp/snmpd/snmpd.h b/contrib/bsnmp/snmpd/snmpd.h
index 394a4f4736d6..b0e60040d025 100644
--- a/contrib/bsnmp/snmpd/snmpd.h
+++ b/contrib/bsnmp/snmpd/snmpd.h
@@ -192,12 +192,8 @@ struct transport_def {
 	int		(*init_port)(struct tport *);
 
 	ssize_t		(*send)(struct tport *, const u_char *, size_t,
-			    const struct sockaddr *, size_t);
-	ssize_t         (*recv)(struct tport *, struct port_input *);
-
-	/** send via a multi-socket port */
-	ssize_t		(*send2)(struct tport *, const u_char *, size_t,
 			    struct port_input *);
+	ssize_t         (*recv)(struct tport *, struct port_input *);
 };
 struct transport {
 	struct asn_oid	index;		/* transport table index */
diff --git a/contrib/bsnmp/snmpd/trans_inet.c b/contrib/bsnmp/snmpd/trans_inet.c
index eb41f9b678e9..d06b85ac11f6 100644
--- a/contrib/bsnmp/snmpd/trans_inet.c
+++ b/contrib/bsnmp/snmpd/trans_inet.c
@@ -375,17 +375,16 @@ inet_recv(struct tport *tp, struct port_input *pi)
  * \param tp		port
  * \param buf		data to send
  * \param len		number of bytes to send
- * \param addr		destination address
- * \param addlen	destination address length
+ * \param pi		destination
  *
  * \return number of bytes sent
  */
 static ssize_t
-inet_send2(struct tport *tp, const u_char *buf, size_t len,
+inet_send(struct tport *tp, const u_char *buf, size_t len,
     struct port_input *pi)
 {
 	struct inet_port *p = __containerof(tp, struct inet_port, tport);
-	struct port_sock *s = (pi == NULL) ?  TAILQ_FIRST(&p->socks) :
+	struct port_sock *s = (pi->fd == -1) ? TAILQ_FIRST(&p->socks) :
 	    __containerof(pi, struct port_sock, input);
 
 	struct iovec iov;
@@ -421,7 +420,7 @@ const struct transport_def inet_trans = {
 	.close_port = 	inet_destroy_port,
 	.init_port = 	inet_activate,
 	.recv = 	inet_recv,
-	.send2 = 	inet_send2,
+	.send = 	inet_send,
 };
 
 struct inet_port_params {
diff --git a/contrib/bsnmp/snmpd/trans_lsock.c b/contrib/bsnmp/snmpd/trans_lsock.c
index 68aea2c77187..4a850d434d7c 100644
--- a/contrib/bsnmp/snmpd/trans_lsock.c
+++ b/contrib/bsnmp/snmpd/trans_lsock.c
@@ -58,7 +58,7 @@ static int lsock_stop(int);
 static void lsock_close_port(struct tport *);
 static int lsock_init_port(struct tport *);
 static ssize_t lsock_send(struct tport *, const u_char *, size_t,
-    const struct sockaddr *, size_t);
+    struct port_input *);
 static ssize_t lsock_recv(struct tport *, struct port_input *);
 
 /* exported */
@@ -396,9 +396,9 @@ lsock_init_port(struct tport *tp)
  */
 static ssize_t
 lsock_send(struct tport *tp, const u_char *buf, size_t len,
-    const struct sockaddr *addr, size_t addrlen)
+    struct port_input *pi)
 {
-	struct lsock_port *p = (struct lsock_port *)tp;
+	struct lsock_port *p = __containerof(tp, struct lsock_port, tport);
 	struct lsock_peer *peer;
 
 	if (p->type == LOCP_DGRAM_PRIV || p->type == LOCP_DGRAM_UNPRIV) {
@@ -407,8 +407,8 @@ lsock_send(struct tport *tp, const u_char *buf, size_t len,
 	} else {
 		/* search for the peer */
 		LIST_FOREACH(peer, &p->peers, link)
-			if (peer->input.peerlen == addrlen &&
-			    memcmp(peer->input.peer, addr, addrlen) == 0)
+			if (peer->input.peerlen == pi->peerlen &&
+			    memcmp(peer->input.peer, pi->peer, pi->peerlen) == 0)
 				break;
 		if (peer == NULL) {
 			errno = ENOTCONN;
@@ -416,7 +416,8 @@ lsock_send(struct tport *tp, const u_char *buf, size_t len,
 		}
 	}
 
-	return (sendto(peer->input.fd, buf, len, MSG_NOSIGNAL, addr, addrlen));
+	return (sendto(peer->input.fd, buf, len, MSG_NOSIGNAL, pi->peer,
+	    pi->peerlen));
 }
 
 static void



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