[SNMP4J] ProxyForwarder - snmpProxyMultipleTargetOut Bug

Senthil Muniswamy senthil.muniswamy at gmail.com
Tue Aug 22 00:20:49 CEST 2006


Frank,

When multiple targets are specified in snmpProxyMultipleTargetOut, target
list was populated with the whole tag list rather passing individuals tags.
Also, the OctetString.split() method used by SnmpTagList.getTags() method
returns the tag list with the delimiters.

Please find the fixes.

ProxyForwarderImpl.java:
  protected boolean multipleForward(ProxyForwardRequest request) {
    List matches = getMatches(request);
    boolean allOK = true;
    for (Iterator it = matches.iterator(); it.hasNext(); ) {
      SnmpProxyRow item = (SnmpProxyRow) it.next();
      OctetString outParam = item.getSnmpProxyMultipleTargetOut();
      if (logger.isDebugEnabled()) {
        logger.debug("Proxy multiple targets out with tag "+outParam);
      }
      Set tags = SnmpTagList.getTags(outParam);
      for (Iterator iter = tags.iterator(); iter.hasNext(); ) {
        OctetString tag = (OctetString)iter.next();
        Collection targets = this.targetMIB.getTargetAddrRowsForTag(tag);
        for (Iterator tit = targets.iterator(); tit.hasNext(); ) {
          SnmpTargetAddrEntryRow targetRow = (SnmpTargetAddrEntryRow)
tit.next();
          Target target = targetRow.getTarget(request.getContextEngineID(),
                                              request.getContext());
          if (target != null) {
            try {
              PDU reqPDU = request.getCommandEvent().getPDU();
              PDU pdu = DefaultPDUFactory.createPDU(target, reqPDU.getType
());
              proxyForwardTranslation(request, reqPDU, pdu);
              ResponseEvent resp = session.send(pdu, target);
              if (logger.isInfoEnabled()) {
                logger.info("Forwarded " + request.getCommandEvent() +
                            " to target " + target + " with response " +
resp);
              }
              if (request.getCommandEvent().getPDU().getType() == PDU.INFORM)
{
                if ((resp.getResponse() == null) ||
                    (resp.getResponse().getType() == PDU.REPORT) ||
                    (resp.getResponse().getErrorStatus() != PDU.noError)) {
                  allOK = false;
                }
              }
            }
            catch (IOException ex) {
              if (logger.isDebugEnabled()) {
                ex.printStackTrace();
              }
              logger.error("Failed to forward request " + request +
                           " to target " + target);
              allOK = false;
            }
          }
          else {
            if (logger.isDebugEnabled()) {
              logger.debug("Parameters for target "+targetRow+" not found");
            }
          }
        }
      }
    }
    return allOK;
  }


OctetString.java:
  public static final Collection split(OctetString octetString,
                                       OctetString delimOctets) {
    List parts = new LinkedList();
    int maxDelim = -1;
    for (int i=0; i<delimOctets.length(); i++) {
      int delim = delimOctets.get(i) & 0xFF;
      if (delim > maxDelim) {
        maxDelim = delim;
      }
    }
    int startPos = 0;
    for (int i=0; i<octetString.length(); i++) {
      int c = octetString.value[i] & 0xFF;
      if (c <= maxDelim) {
        for (int j=0; j<delimOctets.length(); j++) {
          if (c == delimOctets.get(j)) {
            if ((startPos >= 0) && (i > startPos)) {
              parts.add(new OctetString(octetString.value, startPos,
i-startPos));
            }
            startPos = -1;
          }
          else if (startPos < 0) {
            startPos = i+1;
          }
        }
      }
    }
    if (startPos >= 0) {
      parts.add(new OctetString(octetString.value, startPos,
                                octetString.length()-startPos));
    }
    return parts;
  }



More information about the SNMP4J mailing list