You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
4.1 KiB
112 lines
4.1 KiB
/*
|
|
*
|
|
* Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
|
|
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
|
*/
|
|
// Copyright (c) 1995-96 by Cisco Systems, Inc.
|
|
|
|
package com.sun.jmx.snmp.daemon;
|
|
|
|
// JAVA imports
|
|
//
|
|
import java.net.DatagramPacket;
|
|
import java.util.logging.Level;
|
|
|
|
// JMX imports
|
|
//
|
|
import static com.sun.jmx.defaults.JmxProperties.SNMP_ADAPTOR_LOGGER;
|
|
import com.sun.jmx.snmp.SnmpMessage;
|
|
import com.sun.jmx.snmp.SnmpPduFactory;
|
|
import com.sun.jmx.snmp.SnmpPduPacket;
|
|
import com.sun.jmx.snmp.SnmpPduRequest;
|
|
|
|
/**
|
|
* This class is used to handle received inform request responses.
|
|
* This classes parses the SNMP inform response packet to obtain the corresponding inform request.
|
|
*/
|
|
|
|
class SnmpResponseHandler {
|
|
|
|
// VARIABLES
|
|
//----------
|
|
|
|
SnmpAdaptorServer adaptor = null;
|
|
SnmpQManager snmpq = null;
|
|
|
|
// CONSTRUCTORS
|
|
//-------------
|
|
|
|
public SnmpResponseHandler(SnmpAdaptorServer adp, SnmpQManager s) {
|
|
adaptor = adp;
|
|
snmpq = s;
|
|
}
|
|
|
|
// PUBLIC METHODS
|
|
//---------------
|
|
|
|
public synchronized void processDatagram(DatagramPacket dgrm) {
|
|
|
|
byte []data = dgrm.getData();
|
|
int datalen = dgrm.getLength();
|
|
|
|
if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINER)) {
|
|
SNMP_ADAPTOR_LOGGER.logp(Level.FINER, SnmpResponseHandler.class.getName(),
|
|
"action", "processDatagram", "Received from " + dgrm.getAddress().toString() +
|
|
" Length = " + datalen + "\nDump : \n" + SnmpMessage.dumpHexBuffer(data, 0, datalen));
|
|
}
|
|
|
|
try {
|
|
SnmpMessage msg = new SnmpMessage();
|
|
msg.decodeMessage(data, datalen);
|
|
msg.address = dgrm.getAddress();
|
|
msg.port = dgrm.getPort();
|
|
|
|
// Retreive the PDU factory of the SNMP adaptor to decode the received inform response.
|
|
//
|
|
SnmpPduFactory pduFactory = adaptor.getPduFactory();
|
|
if (pduFactory == null) {
|
|
if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
|
|
SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, SnmpResponseHandler.class.getName(),
|
|
"processDatagram", "Dropping packet. Unable to find the pdu factory of the SNMP adaptor server");
|
|
}
|
|
}
|
|
else {
|
|
SnmpPduPacket snmpProt = (SnmpPduPacket)pduFactory.decodeSnmpPdu(msg);
|
|
|
|
if (snmpProt == null) {
|
|
if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
|
|
SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, SnmpResponseHandler.class.getName(),
|
|
"processDatagram", "Dropping packet. Pdu factory returned a null value");
|
|
}
|
|
}
|
|
else if (snmpProt instanceof SnmpPduRequest) {
|
|
|
|
SnmpPduRequest pduReq = (SnmpPduRequest)snmpProt;
|
|
SnmpInformRequest req = snmpq.removeRequest(pduReq.requestId) ;
|
|
if (req != null) {
|
|
req.invokeOnResponse(pduReq);
|
|
} else {
|
|
if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
|
|
SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, SnmpResponseHandler.class.getName(),
|
|
"processDatagram", "Dropping packet. Unable to find corresponding for InformRequestId = " + pduReq.requestId);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
|
|
SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, SnmpResponseHandler.class.getName(),
|
|
"processDatagram", "Dropping packet. The packet does not contain an inform response");
|
|
}
|
|
}
|
|
snmpProt = null ;
|
|
}
|
|
} catch (Exception e) {
|
|
if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
|
|
SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, SnmpResponseHandler.class.getName(),
|
|
"processDatagram", "Exception while processsing", e);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|