/*
 * Copyright (c) 2001, 2006, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package com.sun.jmx.snmp;

import com.sun.jmx.snmp.SnmpSecurityParameters;
// java imports
//
import java.util.Vector;
import java.net.InetAddress;


import com.sun.jmx.snmp.SnmpStatusException;
A partially decoded representation of an SNMP packet. It contains the information contained in any SNMP message (SNMPv1, SNMPv2 or SNMPv3).

This API is a Sun Microsystems internal API and is subject to change without notice.

Since:1.5
/** * A partially decoded representation of an SNMP packet. It contains * the information contained in any SNMP message (SNMPv1, SNMPv2 or * SNMPv3). * <p><b>This API is a Sun Microsystems internal API and is subject * to change without notice.</b></p> * @since 1.5 */
public abstract class SnmpMsg implements SnmpDefinitions {
The protocol version.

decodeMessage and encodeMessage do not perform any check on this value.
decodeSnmpPdu and encodeSnmpPdu only accept the values 0 (for SNMPv1), 1 (for SNMPv2) and 3 (for SNMPv3).

/** * The protocol version. * <P><CODE>decodeMessage</CODE> and <CODE>encodeMessage</CODE> do not * perform any check on this value. * <BR><CODE>decodeSnmpPdu</CODE> and <CODE>encodeSnmpPdu</CODE> only * accept the values 0 (for SNMPv1), 1 (for SNMPv2) and 3 (for SNMPv3). */
public int version = 0;
Encoding of the PDU.

This is usually the BER encoding of the PDU's syntax defined in RFC1157 and RFC1902. However, this can be authenticated or encrypted data (but you need to implemented your own SnmpPduFactory class).

/** * Encoding of the PDU. * <P>This is usually the BER encoding of the PDU's syntax * defined in RFC1157 and RFC1902. However, this can be authenticated * or encrypted data (but you need to implemented your own * <CODE>SnmpPduFactory</CODE> class). */
public byte[] data = null;
Number of useful bytes in the data field.
/** * Number of useful bytes in the <CODE>data</CODE> field. */
public int dataLength = 0;
Source or destination address.
For an incoming message it's the source. For an outgoing message it's the destination.
/** * Source or destination address. * <BR>For an incoming message it's the source. * For an outgoing message it's the destination. */
public InetAddress address = null;
Source or destination port.
For an incoming message it's the source. For an outgoing message it's the destination.
/** * Source or destination port. * <BR>For an incoming message it's the source. * For an outgoing message it's the destination. */
public int port = 0;
Security parameters. Contain informations according to Security Model (Usm, community string based, ...).
/** * Security parameters. Contain informations according to Security Model (Usm, community string based, ...). */
public SnmpSecurityParameters securityParameters = null;
Returns the encoded SNMP version present in the passed byte array.
Params:
  • data – The unmarshalled SNMP message.
Returns:The SNMP version (0, 1 or 3).
/** * Returns the encoded SNMP version present in the passed byte array. * @param data The unmarshalled SNMP message. * @return The SNMP version (0, 1 or 3). */
public static int getProtocolVersion(byte[] data) throws SnmpStatusException { int version = 0; BerDecoder bdec = null; try { bdec = new BerDecoder(data); bdec.openSequence(); version = bdec.fetchInteger(); } catch(BerException x) { throw new SnmpStatusException("Invalid encoding") ; } try { bdec.closeSequence(); } catch(BerException x) { } return version; }
Returns the associated request ID.
Params:
  • data – The flat message.
Returns:The request ID.
/** * Returns the associated request ID. * @param data The flat message. * @return The request ID. */
public abstract int getRequestId(byte[] data) throws SnmpStatusException;
Encodes this message and puts the result in the specified byte array. For internal use only.
Params:
  • outputBytes – An array to receive the resulting encoding.
Throws:
/** * Encodes this message and puts the result in the specified byte array. * For internal use only. * * @param outputBytes An array to receive the resulting encoding. * * @exception ArrayIndexOutOfBoundsException If the result does not fit * into the specified array. */
public abstract int encodeMessage(byte[] outputBytes) throws SnmpTooBigException;
Decodes the specified bytes and initializes this message. For internal use only.
Params:
  • inputBytes – The bytes to be decoded.
Throws:
/** * Decodes the specified bytes and initializes this message. * For internal use only. * * @param inputBytes The bytes to be decoded. * * @exception SnmpStatusException If the specified bytes are not a valid encoding. */
public abstract void decodeMessage(byte[] inputBytes, int byteCount) throws SnmpStatusException;
Initializes this message with the specified pdu.

This method initializes the data field with an array of maxDataLength bytes. It encodes the pdu. The resulting encoding is stored in the data field and the length of the encoding is stored in dataLength.

If the encoding length exceeds maxDataLength, the method throws an exception.

Params:
  • pdu – The PDU to be encoded.
  • maxDataLength – The maximum length permitted for the data field.
Throws:
/** * Initializes this message with the specified <CODE>pdu</CODE>. * <P> * This method initializes the data field with an array of * <CODE>maxDataLength</CODE> bytes. It encodes the <CODE>pdu</CODE>. * The resulting encoding is stored in the data field * and the length of the encoding is stored in <CODE>dataLength</CODE>. * <p> * If the encoding length exceeds <CODE>maxDataLength</CODE>, * the method throws an exception. * * @param pdu The PDU to be encoded. * @param maxDataLength The maximum length permitted for the data field. * * @exception SnmpStatusException If the specified <CODE>pdu</CODE> is not valid. * @exception SnmpTooBigException If the resulting encoding does not fit * into <CODE>maxDataLength</CODE> bytes. * @exception ArrayIndexOutOfBoundsException If the encoding exceeds <CODE>maxDataLength</CODE>. */
public abstract void encodeSnmpPdu(SnmpPdu pdu, int maxDataLength) throws SnmpStatusException, SnmpTooBigException;
Gets the PDU encoded in this message.

This method decodes the data field and returns the resulting PDU.

Throws:
Returns:The resulting PDU.
/** * Gets the PDU encoded in this message. * <P> * This method decodes the data field and returns the resulting PDU. * * @return The resulting PDU. * @exception SnmpStatusException If the encoding is not valid. */
public abstract SnmpPdu decodeSnmpPdu() throws SnmpStatusException;
Dumps the content of a byte buffer using hexadecimal form.
Params:
  • b – The buffer to dump.
  • offset – The position of the first byte to be dumped.
  • len – The number of bytes to be dumped starting from offset.
Returns:The string containing the dump.
/** * Dumps the content of a byte buffer using hexadecimal form. * * @param b The buffer to dump. * @param offset The position of the first byte to be dumped. * @param len The number of bytes to be dumped starting from offset. * * @return The string containing the dump. */
public static String dumpHexBuffer(byte [] b, int offset, int len) { StringBuffer buf = new StringBuffer(len << 1) ; int k = 1 ; int flen = offset + len ; for (int i = offset; i < flen ; i++) { int j = b[i] & 0xFF ; buf.append(Character.forDigit((j >>> 4) , 16)) ; buf.append(Character.forDigit((j & 0x0F), 16)) ; k++ ; if (k%16 == 0) { buf.append('\n') ; k = 1 ; } else buf.append(' ') ; } return buf.toString() ; }
Dumps this message in a string.
Returns:The string containing the dump.
/** * Dumps this message in a string. * * @return The string containing the dump. */
public String printMessage() { StringBuffer sb = new StringBuffer() ; sb.append("Version: ") ; sb.append(version) ; sb.append("\n") ; if (data == null) { sb.append("Data: null") ; } else { sb.append("Data: {\n") ; sb.append(dumpHexBuffer(data, 0, dataLength)) ; sb.append("\n}\n") ; } return sb.toString() ; }
For SNMP Runtime private use only.
/** * For SNMP Runtime private use only. */
public void encodeVarBindList(BerEncoder benc, SnmpVarBind[] varBindList) throws SnmpStatusException, SnmpTooBigException { // // Remember: the encoder does backward encoding // int encodedVarBindCount = 0 ; try { benc.openSequence() ; if (varBindList != null) { for (int i = varBindList.length - 1 ; i >= 0 ; i--) { SnmpVarBind bind = varBindList[i] ; if (bind != null) { benc.openSequence() ; encodeVarBindValue(benc, bind.value) ; benc.putOid(bind.oid.longValue()) ; benc.closeSequence() ; encodedVarBindCount++ ; } } } benc.closeSequence() ; } catch(ArrayIndexOutOfBoundsException x) { throw new SnmpTooBigException(encodedVarBindCount) ; } }
For SNMP Runtime private use only.
/** * For SNMP Runtime private use only. */
void encodeVarBindValue(BerEncoder benc, SnmpValue v)throws SnmpStatusException { if (v == null) { benc.putNull() ; } else if (v instanceof SnmpIpAddress) { benc.putOctetString(((SnmpIpAddress)v).byteValue(), SnmpValue.IpAddressTag) ; } else if (v instanceof SnmpCounter) { benc.putInteger(((SnmpCounter)v).longValue(), SnmpValue.CounterTag) ; } else if (v instanceof SnmpGauge) { benc.putInteger(((SnmpGauge)v).longValue(), SnmpValue.GaugeTag) ; } else if (v instanceof SnmpTimeticks) { benc.putInteger(((SnmpTimeticks)v).longValue(), SnmpValue.TimeticksTag) ; } else if (v instanceof SnmpOpaque) { benc.putOctetString(((SnmpOpaque)v).byteValue(), SnmpValue.OpaqueTag) ; } else if (v instanceof SnmpInt) { benc.putInteger(((SnmpInt)v).intValue()) ; } else if (v instanceof SnmpString) { benc.putOctetString(((SnmpString)v).byteValue()) ; } else if (v instanceof SnmpOid) { benc.putOid(((SnmpOid)v).longValue()) ; } else if (v instanceof SnmpCounter64) { if (version == snmpVersionOne) { throw new SnmpStatusException("Invalid value for SNMP v1 : " + v) ; } benc.putInteger(((SnmpCounter64)v).longValue(), SnmpValue.Counter64Tag) ; } else if (v instanceof SnmpNull) { int tag = ((SnmpNull)v).getTag() ; if ((version == snmpVersionOne) && (tag != SnmpValue.NullTag)) { throw new SnmpStatusException("Invalid value for SNMP v1 : " + v) ; } if ((version == snmpVersionTwo) && (tag != SnmpValue.NullTag) && (tag != SnmpVarBind.errNoSuchObjectTag) && (tag != SnmpVarBind.errNoSuchInstanceTag) && (tag != SnmpVarBind.errEndOfMibViewTag)) { throw new SnmpStatusException("Invalid value " + v) ; } benc.putNull(tag) ; } else { throw new SnmpStatusException("Invalid value " + v) ; } }
For SNMP Runtime private use only.
/** * For SNMP Runtime private use only. */
public SnmpVarBind[] decodeVarBindList(BerDecoder bdec) throws BerException { bdec.openSequence() ; Vector<SnmpVarBind> tmp = new Vector<SnmpVarBind>() ; while (bdec.cannotCloseSequence()) { SnmpVarBind bind = new SnmpVarBind() ; bdec.openSequence() ; bind.oid = new SnmpOid(bdec.fetchOid()) ; bind.setSnmpValue(decodeVarBindValue(bdec)) ; bdec.closeSequence() ; tmp.addElement(bind) ; } bdec.closeSequence() ; SnmpVarBind[] varBindList= new SnmpVarBind[tmp.size()] ; tmp.copyInto(varBindList); return varBindList ; }
For SNMP Runtime private use only.
/** * For SNMP Runtime private use only. */
SnmpValue decodeVarBindValue(BerDecoder bdec) throws BerException { SnmpValue result = null ; int tag = bdec.getTag() ; // bugId 4641696 : RuntimeExceptions must be transformed in // BerException. switch(tag) { // // Simple syntax // case BerDecoder.IntegerTag : try { result = new SnmpInt(bdec.fetchInteger()) ; } catch(RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpInt from decoded value."); } break ; case BerDecoder.OctetStringTag : try { result = new SnmpString(bdec.fetchOctetString()) ; } catch(RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpString from decoded value."); } break ; case BerDecoder.OidTag : try { result = new SnmpOid(bdec.fetchOid()) ; } catch(RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpOid from decoded value."); } break ; case BerDecoder.NullTag : bdec.fetchNull() ; try { result = new SnmpNull() ; } catch(RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpNull from decoded value."); } break ; // // Application syntax // case SnmpValue.IpAddressTag : try { result = new SnmpIpAddress(bdec.fetchOctetString(tag)) ; } catch (RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpIpAddress from decoded value."); } break ; case SnmpValue.CounterTag : try { result = new SnmpCounter(bdec.fetchIntegerAsLong(tag)) ; } catch(RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpCounter from decoded value."); } break ; case SnmpValue.GaugeTag : try { result = new SnmpGauge(bdec.fetchIntegerAsLong(tag)) ; } catch(RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpGauge from decoded value."); } break ; case SnmpValue.TimeticksTag : try { result = new SnmpTimeticks(bdec.fetchIntegerAsLong(tag)) ; } catch(RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpTimeticks from decoded value."); } break ; case SnmpValue.OpaqueTag : try { result = new SnmpOpaque(bdec.fetchOctetString(tag)) ; } catch(RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpOpaque from decoded value."); } break ; // // V2 syntaxes // case SnmpValue.Counter64Tag : if (version == snmpVersionOne) { throw new BerException(BerException.BAD_VERSION) ; } try { result = new SnmpCounter64(bdec.fetchIntegerAsLong(tag)) ; } catch(RuntimeException r) { throw new BerException(); // BerException("Can't build SnmpCounter64 from decoded value."); } break ; case SnmpVarBind.errNoSuchObjectTag : if (version == snmpVersionOne) { throw new BerException(BerException.BAD_VERSION) ; } bdec.fetchNull(tag) ; result = SnmpVarBind.noSuchObject ; break ; case SnmpVarBind.errNoSuchInstanceTag : if (version == snmpVersionOne) { throw new BerException(BerException.BAD_VERSION) ; } bdec.fetchNull(tag) ; result = SnmpVarBind.noSuchInstance ; break ; case SnmpVarBind.errEndOfMibViewTag : if (version == snmpVersionOne) { throw new BerException(BerException.BAD_VERSION) ; } bdec.fetchNull(tag) ; result = SnmpVarBind.endOfMibView ; break ; default: throw new BerException() ; } return result ; } }