git: 183d09305677 - main - bsnmpd: merge send and send2 methods for transports
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 25 Jul 2025 20:12:02 UTC
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