/*
* Copyright 2010 NCHOVY
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.krakenapps.pcap.decoder.snmp;
import java.util.HashSet;
import java.util.Set;
import org.krakenapps.pcap.decoder.snmp.types.Integer32;
import org.krakenapps.pcap.decoder.snmp.types.Sequence;
import org.krakenapps.pcap.decoder.snmp.types.Variable;
import org.krakenapps.pcap.decoder.snmp.v2.Pdu;
import org.krakenapps.pcap.decoder.udp.UdpPacket;
import org.krakenapps.pcap.decoder.udp.UdpProcessor;
import org.krakenapps.pcap.util.Buffer;
public class SnmpDecoder implements UdpProcessor {
private Set<SnmpV1Processor> v1Callbacks;
private Set<SnmpV2Processor> v2Callbacks;
private Set<SnmpV3Processor> v3Callbacks;
public SnmpDecoder() {
v1Callbacks = new HashSet<SnmpV1Processor>();
v2Callbacks = new HashSet<SnmpV2Processor>();
v3Callbacks = new HashSet<SnmpV3Processor>();
}
public void register(SnmpV1Processor processor) {
v1Callbacks.add(processor);
}
public void register(SnmpV2Processor processor) {
v2Callbacks.add(processor);
}
public void register(SnmpV3Processor processor) {
v3Callbacks.add(processor);
}
public void unregister(SnmpV1Processor processor) {
v1Callbacks.remove(processor);
}
public void unregister(SnmpV2Processor processor) {
v2Callbacks.remove(processor);
}
public void unregister(SnmpV3Processor processor) {
v3Callbacks.remove(processor);
}
@Override
public void process(UdpPacket p) {
Buffer b = p.getData();
int remain = b.readableBytes();
byte[] data = new byte[remain];
b.gets(data, 0, remain);
Sequence seq = (Sequence) Variable.decode(data, 0, 0);
int version = (int) ((Integer32) seq.get(0)).get();
switch (version) {
case 0: {
org.krakenapps.pcap.decoder.snmp.v1.Pdu pdu = org.krakenapps.pcap.decoder.snmp.v1.Pdu.parse(seq);
for (SnmpV1Processor callback : v1Callbacks)
callback.onReceive(p.getSource(), p.getDestination(), pdu);
}
break;
case 1: {
Pdu pdu = Pdu.parse(seq);
for (SnmpV2Processor callback : v2Callbacks)
callback.onReceive(p.getSource(), p.getDestination(), pdu);
}
break;
case 2:
break;
}
}
}