--- a/usr/src/uts/common/inet/snmpcom.c Sat Oct 22 11:06:40 2005 -0700
+++ b/usr/src/uts/common/inet/snmpcom.c Sat Oct 22 22:50:14 2005 -0700
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 1992,1997-2003 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1990 Mentat Inc. */
@@ -51,6 +51,11 @@
#include <inet/optcom.h>
#include <inet/snmpcom.h>
+#include <inet/ip.h>
+#include <inet/ip6.h>
+#include <inet/tcp.h>
+#include <inet/udp_impl.h>
+
#define DEFAULT_LENGTH sizeof (long)
#define DATA_MBLK_SIZE 1024
#define TOAHDR_SIZE (sizeof (struct T_optmgmt_ack) +\
@@ -90,10 +95,7 @@
* ctl buffer.
*/
int
-snmp_append_data(mpdata, blob, len)
- mblk_t *mpdata;
- char *blob;
- int len;
+snmp_append_data(mblk_t *mpdata, char *blob, int len)
{
if (!mpdata)
@@ -169,12 +171,7 @@
* for them: getfn() returns 0, setfn() returns 1.
*/
boolean_t
-snmpcom_req(q, mp, setfn, getfn, credp)
- queue_t *q;
- mblk_t *mp;
- pfi_t setfn;
- pfi_t getfn;
- cred_t *credp;
+snmpcom_req(queue_t *q, mblk_t *mp, pfi_t setfn, pfi_t getfn, cred_t *credp)
{
mblk_t *mpctl;
struct opthdr *req;
@@ -184,6 +181,7 @@
sor_t *sreq;
struct T_optmgmt_req *tor = (struct T_optmgmt_req *)mp->b_rptr;
struct T_optmgmt_ack *toa;
+ boolean_t pass_to_ip = B_FALSE;
if (mp->b_cont) { /* don't deal with multiple mblk's */
freemsg(mp->b_cont);
@@ -209,6 +207,10 @@
req_start->level <= EXPER_RANGE_END)))
return (B_FALSE);
+ if (setfn == tcp_snmp_set || setfn == udp_snmp_set ||
+ getfn == tcp_snmp_get || getfn == udp_snmp_get)
+ pass_to_ip = B_TRUE;
+
switch (tor->MGMT_flags) {
case T_NEGOTIATE:
@@ -235,8 +237,10 @@
(uchar_t *)&req[1], req->len))
goto bad_req4;
}
- if (q->q_next)
+ if (q->q_next != NULL)
putnext(q, mp);
+ else if (pass_to_ip)
+ ip_output(Q_TO_CONN(q), mp, q, IP_WPUT);
else
freemsg(mp);
return (B_TRUE);
@@ -268,9 +272,12 @@
* this is bottom module of stream, send up an EOD ctl msg,
* otherwise pass onto the next guy for processing.
*/
- if (q->q_next) {
+ if (q->q_next != NULL) {
putnext(q, mp);
return (B_TRUE);
+ } else if (pass_to_ip) {
+ ip_output(Q_TO_CONN(q), mp, q, IP_WPUT);
+ return (B_TRUE);
}
if (mp->b_cont) {
freemsg(mp->b_cont);