/*
* 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.util;
import java.io.EOFException;
import java.io.File;
import java.io.IOException;
import org.krakenapps.pcap.Protocol;
import org.krakenapps.pcap.decoder.arp.ArpDecoder;
import org.krakenapps.pcap.decoder.ethernet.EthernetDecoder;
import org.krakenapps.pcap.decoder.ethernet.EthernetType;
import org.krakenapps.pcap.decoder.icmp.IcmpDecoder;
import org.krakenapps.pcap.decoder.icmpv6.Icmpv6Decoder;
import org.krakenapps.pcap.decoder.icmpv6.Icmpv6Processor;
import org.krakenapps.pcap.decoder.ip.InternetProtocol;
import org.krakenapps.pcap.decoder.ip.IpDecoder;
import org.krakenapps.pcap.decoder.ipv6.Ipv6Decoder;
import org.krakenapps.pcap.decoder.tcp.TcpDecoder;
import org.krakenapps.pcap.decoder.tcp.TcpPortProtocolMapper;
import org.krakenapps.pcap.decoder.tcp.TcpProcessor;
import org.krakenapps.pcap.decoder.tcp.TcpSegmentCallback;
import org.krakenapps.pcap.decoder.udp.UdpDecoder;
import org.krakenapps.pcap.decoder.udp.UdpPortProtocolMapper;
import org.krakenapps.pcap.decoder.udp.UdpProcessor;
import org.krakenapps.pcap.file.PcapFileInputStream;
import org.krakenapps.pcap.packet.PcapPacket;
/**
* @author mindori
*/
public class PcapFileRunner {
private File dumpFile;
private EthernetDecoder eth;
private ArpDecoder arp;
private IpDecoder ip;
private Ipv6Decoder ipv6;
private IcmpDecoder icmp;
private Icmpv6Decoder icmpv6;
private TcpDecoder tcp;
private UdpDecoder udp;
public PcapFileRunner(File dumpFile) {
this.dumpFile = dumpFile;
eth = new EthernetDecoder();
arp = new ArpDecoder();
ip = new IpDecoder();
ipv6 = new Ipv6Decoder();
icmp = new IcmpDecoder();
icmpv6 = new Icmpv6Decoder();
tcp = new TcpDecoder(new TcpPortProtocolMapper());
udp = new UdpDecoder(new UdpPortProtocolMapper());
eth.register(EthernetType.IPV4, ip);
eth.register(EthernetType.IPV6, ipv6);
eth.register(EthernetType.ARP, arp);
ip.register(InternetProtocol.ICMP, icmp);
ip.register(InternetProtocol.TCP, tcp);
ip.register(InternetProtocol.UDP, udp);
ipv6.register(InternetProtocol.ICMPV6, icmpv6);
ipv6.register(InternetProtocol.TCP, tcp);
ipv6.register(InternetProtocol.UDP, udp);
}
public void run() throws IOException {
PcapFileInputStream is = null;
try {
is = new PcapFileInputStream(dumpFile);
while (true) {
PcapPacket packet = is.getPacket();
if (packet == null)
break;
eth.decode(packet);
}
} catch (EOFException e) {
// do nothing
} finally {
if (is != null)
is.close();
}
}
public void setTcpProcessor(Protocol protocol, TcpProcessor processor) {
tcp.getProtocolMapper().register(protocol, processor);
}
public void setUdpProcessor(Protocol protocol, UdpProcessor processor) {
udp.getProtocolMapper().register(protocol, processor);
}
public void addTcpCallback(TcpSegmentCallback callback) {
tcp.registerSegmentCallback(callback);
}
public void addIcmpv6Processor(Icmpv6Processor processor) {
icmpv6.register(processor);
}
public EthernetDecoder getEthernetDecoder() {
return eth;
}
public ArpDecoder getArpDecoder() {
return arp;
}
public IpDecoder getIpDecoder() {
return ip;
}
public Ipv6Decoder getIpv6Decoder() {
return ipv6;
}
public IcmpDecoder getIcmpDecoder() {
return icmp;
}
public Icmpv6Decoder getIcmpv6Decoder() {
return icmpv6;
}
public TcpDecoder getTcpDecoder() {
return tcp;
}
public UdpDecoder getUdpDecoder() {
return udp;
}
}