view usr/src/cmd/picl/plugins/sun4v/lib/snmp/asn1.h @ 3941:328be6a20f20

FWARC/2007/133 SNMP Domain Service FWARC/2007/138 Updates to PRI structures 6438074 customer requests ability to query power/fan status info from OS 6526169 prtdiag output doesn't have Memory Configuration Information 6531453 sun4v picl needs device labels in the devtree 6534449 Unable to send a domain services message larger than 4K
author venki
date Sat, 31 Mar 2007 18:24:05 -0700
parents
children
line wrap: on
line source

/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_ASN1_H
#define	_ASN1_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef	__cplusplus
extern "C" {
#endif

/*
 * ASN.1 values are encoded as octet strings based on the use of a
 * Type-Length-Value (TLV) structure. The Type indicates the ASN.1
 * type, the class of the type, and whether the encoding is primitive
 * or constructed. The Length indicates the length of the actual value
 * representation and the Value represents the value as a string
 * of octets.
 *
 *              +------------+--------+----------+
 *              | Identifier | Length | Contents |
 *              +------------+--------+----------+
 *
 * The encoding of the Identifier field is shown below (for tags less than 31):
 *
 *              +-------+-----+------------+
 *              | Class | P/C | Tag number |
 *              +-------+-----+------------+
 *          Bit   7   6    5   4  3  2  1  0
 *
 * The class field specifies one of four classes, the P/C bit specifies
 * whether this is a primitive/constructed encoding and the tag number
 * distinguishes one data type from another within the class.
 */

/*
 * Identifier classes
 */
#define	ASN_UNIVERSAL		((uchar_t)0x00)
#define	ASN_APPLICATION		((uchar_t)0x40)
#define	ASN_CONTEXT		((uchar_t)0x80)
#define	ASN_PRIVATE		((uchar_t)0xc0)

/*
 * Encoding type
 */
#define	ASN_PRIMITIVE		((uchar_t)0x00)
#define	ASN_CONSTRUCTOR		((uchar_t)0x20)

/*
 * Tag numbers for the Universal class of ASN.1 values
 */
#define	ASN_BOOLEAN		((uchar_t)0x01)
#define	ASN_INTEGER		((uchar_t)0x02)
#define	ASN_BIT_STR		((uchar_t)0x03)
#define	ASN_OCTET_STR		((uchar_t)0x04)
#define	ASN_NULL		((uchar_t)0x05)
#define	ASN_OBJECT_ID		((uchar_t)0x06)
#define	ASN_SEQUENCE		((uchar_t)0x10)
#define	ASN_SET			((uchar_t)0x11)

/*
 * ASN Extension Tag in the identifier
 */
#define	ASN_EXT_TAG		((uchar_t)0x1f)

/*
 * Application class ASN.1 identifiers
 */
#define	ASN_COUNTER	(ASN_APPLICATION | ASN_PRIMITIVE | (uchar_t)0x01)
#define	ASN_TIMETICKS	(ASN_APPLICATION | ASN_PRIMITIVE | (uchar_t)0x03)

/*
 * The Length field in the TLV structure described above is represented
 * in many ways depending on the value.
 *
 * If the length is less than 128, the length field consists of a
 * single octet beginning with a zero.
 *
 *                        +---+-----------+
 *                        | 0 | Length(L) |
 *                        +---+-----------+
 *
 * If the length is greater than 127, the first octet of the length field
 * contains a seven-bit integer that specifies the number of additional
 * length octets and the additional octets specify the actual length.
 *
 *              <-- one octet --><----- K octets ----->
 *              +---------------+---------------------+
 *              |  1  |    K    |      Length(L)      |
 *              +---------------+---------------------+
 *
 */
#define	ASN_LONG_LEN	((uchar_t)0x80)
#define	ASN_BIT8	((uchar_t)0x80)

/*
 * Some parts of the code assumes a few things -- big-endian ordering,
 * sizeof int, etc. to simplify things.
 */
#define	BUILD_INT_SHIFT	23
#define	BUILD_INT_MASK	0x1ff

/*
 * Exported ASN.1 encoding related interfaces (only exported within
 * snmplib, we need to do ld versioning to limit the scope of these to
 * within snmplib).
 */
uchar_t	*asn_build_sequence(uchar_t *, size_t *, uchar_t, size_t);
uchar_t	*asn_build_header(uchar_t *, size_t *, uchar_t, size_t);
uchar_t	*asn_build_length(uchar_t *, size_t *, size_t);
uchar_t	*asn_build_int(uchar_t *, size_t *, uchar_t, int);
uchar_t	*asn_build_string(uchar_t *, size_t *, uchar_t, uchar_t *, size_t);
uchar_t	*asn_build_objid(uchar_t *, size_t *, uchar_t, void *, size_t);
uchar_t	*asn_build_null(uchar_t *, size_t *, uchar_t);

uchar_t	*asn_parse_sequence(uchar_t *, size_t *, uchar_t);
uchar_t	*asn_parse_header(uchar_t *, size_t *, uchar_t *);
uchar_t	*asn_parse_length(uchar_t *, size_t *);
uchar_t	*asn_parse_int(uchar_t *, size_t *, int *);
uchar_t *asn_parse_uint(uchar_t *, size_t *, uint_t *);
uchar_t	*asn_parse_string(uchar_t *, size_t *, uchar_t **, size_t *);
uchar_t	*asn_parse_objid(uchar_t *, size_t *, void *, size_t *);
uchar_t	*asn_parse_objval(uchar_t *, size_t *, void *);

#ifdef	__cplusplus
}
#endif

#endif	/* _ASN1_H */