The branch main has been updated by glebius:

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

commit 183d09305677b7c669eba8ed6fe8d0b879684913
Author:     Gleb Smirnoff <gleb...@freebsd.org>
AuthorDate: 2025-07-25 20:09:36 +0000
Commit:     Gleb Smirnoff <gleb...@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

Reply via email to