usr/src/uts/common/inet/snmpcom.c
author masputra
Sat, 22 Oct 2005 22:50:14 -0700
changeset 741 40027a3621ac
parent 0 68f95e015346
child 3448 aaf16568054b
permissions -rw-r--r--
PSARC 2005/082 Yosemite: UDP Performance Enhancement 4796051 Solaris needs a more complete HW checksumming support 4905227 duplicate macros in ipclassifier.h and ip.h 4915681 need hardware checksum offload for the case of IP/UDP reassembly 6201076 outbound flow-control dysfunctional, ip to ce using mdt 6223331 ipv6 flow control may corrupt UDP packets 6223809 16-bit aligned IP header should be allowed for all x86 platforms 6275398 Galaxy hangs when running lmbench 6281836 Yosemite project integration into Solaris 6281885 xge needs to support IPv6 checksum offload 6282776 IPv6 NCE fast path is not created for incoming solicitation 6304890 IP transmit-side checksum logic needs to be tightened 6304902 IP6_IN_NOCKSUM is obsolete and should be torched 6304904 UDP should reject TI_GETPEERNAME for non-connected endpoint 6306768 IP and UDP device and module definitions need to be centralized
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
    23
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
/* Copyright (c) 1990 Mentat Inc. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 * This file contains common code for handling Options Management requests
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
 * for SNMP/MIB.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <sys/stream.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <sys/stropts.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#define	_SUN_TPI_VERSION 2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <sys/tihdr.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <sys/ddi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <sys/cmn_err.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <sys/policy.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include <sys/socket.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include <netinet/in.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include <inet/common.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include <inet/mi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#include <inet/mib2.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#include <inet/optcom.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#include <inet/snmpcom.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
    54
#include <inet/ip.h>
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
    55
#include <inet/ip6.h>
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
    56
#include <inet/tcp.h>
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
    57
#include <inet/udp_impl.h>
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
    58
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
#define	DEFAULT_LENGTH	sizeof (long)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
#define	DATA_MBLK_SIZE	1024
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
#define	TOAHDR_SIZE	(sizeof (struct T_optmgmt_ack) +\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
	sizeof (struct opthdr))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
/* SNMP Option Request Structure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
typedef struct sor_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
	int	sor_group;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
	int	sor_code;		/* MIB2 index value */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
	int	sor_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
} sor_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
 * Validation Table for set requests.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
static sor_t	req_arr[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
	{ MIB2_IP,	1,	sizeof (int)			},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
	{ MIB2_IP,	2,	sizeof (int)			},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
	{ MIB2_IP,	21,	sizeof (mib2_ipRouteEntry_t)	},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	{ MIB2_IP,	22,	sizeof (mib2_ipNetToMediaEntry_t)},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
	{ MIB2_TCP,	13,	sizeof (mib2_tcpConnEntry_t)	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
 * Binary compatibility to what used to be T_CURRENT in older releases.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
 * Unfortunately, the binary chosen for it was different and used by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
 * T_PARTSUCCESS in the new name space. However T_PARTSUCESS is only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
 * anticiapted in new T_OPTMGM_REQ (and not O_T_OPTMGMT_REQ messages).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
 * Only a test for TBADFLAG which uses one of the MIB option levels
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
 * may have trouble with this provision for binary compatibility.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
#define	OLD_T_CURRENT	0x100	/* same value as T_PARTSUCCESS */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
 * MIB info returned in data part of M_PROTO msg.  All info for a single
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
 * request is appended in a chain of mblk's off of the M_PROTO T_OPTMGMT_ACK
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
 * ctl buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
int
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
    98
snmp_append_data(mblk_t *mpdata, char *blob, int len)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	if (!mpdata)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	while (mpdata->b_cont)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
		mpdata = mpdata->b_cont;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	if (mpdata->b_wptr + len >= mpdata->b_datap->db_lim) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
		mpdata->b_cont = allocb(DATA_MBLK_SIZE, BPRI_HI);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
		mpdata = mpdata->b_cont;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
		if (!mpdata)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	bcopy(blob, (char *)mpdata->b_wptr, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	mpdata->b_wptr += len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
 * Need a form which avoids O(n^2) behavior locating the end of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
 * chain every time.  This is it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
snmp_append_data2(mblk_t *mpdata, mblk_t **last_mpp, char *blob, int len)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	if (!mpdata)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	if (*last_mpp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
		while (mpdata->b_cont)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
			mpdata = mpdata->b_cont;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
		*last_mpp = mpdata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	if ((*last_mpp)->b_wptr + len >= (*last_mpp)->b_datap->db_lim) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
		(*last_mpp)->b_cont = allocb(DATA_MBLK_SIZE, BPRI_HI);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
		*last_mpp = (*last_mpp)->b_cont;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
		if (!*last_mpp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	bcopy(blob, (char *)(*last_mpp)->b_wptr, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	(*last_mpp)->b_wptr += len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
 * SNMP requests are issued using putmsg() on a stream containing all
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
 * relevant modules.  The ctl part contains a O_T_OPTMGMT_REQ message,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
 * and the data part is NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
 * to process this msg. If snmpcom_req() returns FALSE, then the module
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
 * will try optcom_req to see if its some sort of SOCKET or IP option.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
 * snmpcom_req returns TRUE whenever the first option is recognized as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
 * an SNMP request, even if a bad one.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
 * "get" is done by a single O_T_OPTMGMT_REQ with MGMT_flags set to T_CURRENT.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
 * All modules respond with one or msg's about what they know.  Responses
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
 * are in T_OPTMGMT_ACK format.  The opthdr level/name fields identify what
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
 * is begin returned, the len field how big it is (in bytes).  The info
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
 * itself is in the data portion of the msg.  Fixed length info returned
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
 * in one msg; each table in a separate msg.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
 * setfn() returns 1 if things ok, 0 if set request invalid or otherwise
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
 * messed up.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
 * If the passed q is at the bottom of the module chain (q_next == NULL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
 * a ctl msg with req->name, level, len all zero is sent upstream.  This
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
 * is and EOD flag to the caller.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
 * IMPORTANT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
 * - The msg type is M_PROTO, not M_PCPROTO!!!  This is by design,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
 *   since multiple messages will be sent to stream head and we want
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
 *   them queued for reading, not discarded.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
 * - All requests which match a table entry are sent to all get/set functions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
 *   of each module.  The functions must simply ignore requests not meant
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
 *   for them: getfn() returns 0, setfn() returns 1.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
boolean_t
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   174
snmpcom_req(queue_t *q, mblk_t *mp, pfi_t setfn, pfi_t getfn, cred_t *credp)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	mblk_t			*mpctl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	struct opthdr		*req;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	struct opthdr		*next_req;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	struct opthdr		*req_end;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	struct opthdr		*req_start;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	sor_t			*sreq;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	struct T_optmgmt_req	*tor = (struct T_optmgmt_req *)mp->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	struct T_optmgmt_ack	*toa;
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   184
	boolean_t		pass_to_ip = B_FALSE;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
	if (mp->b_cont) {	/* don't deal with multiple mblk's */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
		freemsg(mp->b_cont);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
		mp->b_cont = (mblk_t *)0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
		optcom_err_ack(q, mp, TSYSERR, EBADMSG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
		return (B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	if ((mp->b_wptr - mp->b_rptr) < sizeof (struct T_optmgmt_req) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
	    !(req_start = (struct opthdr *)mi_offset_param(mp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
		tor->OPT_offset, tor->OPT_length)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
		goto bad_req1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	if (! __TPI_OPT_ISALIGNED(req_start))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
		goto bad_req1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	 * if first option not in the MIB2 or EXPER range, return false so
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	 * optcom_req can scope things out.  Otherwise it's passed to each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	 * calling module to process or ignore as it sees fit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	if ((!(req_start->level >= MIB2_RANGE_START &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
			req_start->level <= MIB2_RANGE_END)) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	    (!(req_start->level >= EXPER_RANGE_START &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
			req_start->level <= EXPER_RANGE_END)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
		return (B_FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   210
	if (setfn == tcp_snmp_set || setfn == udp_snmp_set ||
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   211
	    getfn == tcp_snmp_get || getfn == udp_snmp_get)
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   212
		pass_to_ip = B_TRUE;
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   213
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	switch (tor->MGMT_flags) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	case T_NEGOTIATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
		if (secpolicy_net_config(credp, B_FALSE) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
			optcom_err_ack(q, mp, TACCES, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
			return (B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
		req_end = (struct opthdr *)((uchar_t *)req_start +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
			tor->OPT_length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
		for (req = req_start; req < req_end; req = next_req) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
			next_req =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
				(struct opthdr *)((uchar_t *)&req[1] +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
				_TPI_ALIGN_OPT(req->len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
			if (next_req > req_end)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
				goto bad_req2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
			for (sreq = req_arr; sreq < A_END(req_arr); sreq++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
				if (req->level == sreq->sor_group &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
				    req->name == sreq->sor_code)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
			if (sreq >= A_END(req_arr))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
				goto bad_req3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
			if (!(*setfn)(q, req->level, req->name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
				(uchar_t *)&req[1], req->len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
				goto bad_req4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
		}
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   240
		if (q->q_next != NULL)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
			putnext(q, mp);
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   242
		else if (pass_to_ip)
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   243
			ip_output(Q_TO_CONN(q), mp, q, IP_WPUT);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
			freemsg(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
		return (B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	case OLD_T_CURRENT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
	case T_CURRENT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
		mpctl = allocb(TOAHDR_SIZE, BPRI_MED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
		if (!mpctl) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
			optcom_err_ack(q, mp, TSYSERR, ENOMEM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
			return (B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
		mpctl->b_cont = allocb(DATA_MBLK_SIZE, BPRI_MED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
		if (!mpctl->b_cont) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
			freemsg(mpctl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
			optcom_err_ack(q, mp, TSYSERR, ENOMEM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
			return (B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
		mpctl->b_datap->db_type = M_PROTO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
		mpctl->b_wptr += TOAHDR_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
		toa = (struct T_optmgmt_ack *)mpctl->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
		toa->PRIM_type = T_OPTMGMT_ACK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
		toa->OPT_offset = sizeof (struct T_optmgmt_ack);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
		toa->OPT_length = sizeof (struct opthdr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
		toa->MGMT_flags = T_SUCCESS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
		if (!(*getfn)(q, mpctl))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
			freemsg(mpctl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
		 * all data for this module has now been sent upstream.  If
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
		 * this is bottom module of stream, send up an EOD ctl msg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
		 * otherwise pass onto the next guy for processing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
		 */
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   275
		if (q->q_next != NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
			putnext(q, mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
			return (B_TRUE);
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   278
		} else if (pass_to_ip) {
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   279
			ip_output(Q_TO_CONN(q), mp, q, IP_WPUT);
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 0
diff changeset
   280
			return (B_TRUE);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
		if (mp->b_cont) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
			freemsg(mp->b_cont);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
			mp->b_cont = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
		mpctl = reallocb(mp, TOAHDR_SIZE, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
		if (!mpctl) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
			optcom_err_ack(q, mp, TSYSERR, ENOMEM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
			return (B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
		mpctl->b_datap->db_type = M_PROTO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
		mpctl->b_wptr = mpctl->b_rptr + TOAHDR_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
		toa = (struct T_optmgmt_ack *)mpctl->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
		toa->PRIM_type = T_OPTMGMT_ACK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
		toa->OPT_offset = sizeof (struct T_optmgmt_ack);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
		toa->OPT_length = sizeof (struct opthdr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
		toa->MGMT_flags = T_SUCCESS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
		req = (struct opthdr *)&toa[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
		req->level = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
		req->name = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
		req->len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
		qreply(q, mpctl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
		return (B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
		optcom_err_ack(q, mp, TBADFLAG, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
		return (B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
bad_req1:;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	printf("snmpcom bad_req1\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	goto bad_req;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
bad_req2:;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	printf("snmpcom bad_req2\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	goto bad_req;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
bad_req3:;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	printf("snmpcom bad_req3\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
	goto bad_req;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
bad_req4:;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
	printf("snmpcom bad_req4\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	/* FALLTHRU */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
bad_req:;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
	optcom_err_ack(q, mp, TBADOPT, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
	return (B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
}