package net.decix.jipfix; import java.net.Inet4Address; import java.net.UnknownHostException; import java.util.HashSet; import java.util.Set; import net.decix.jipfix.header.DataRecord; import net.decix.jipfix.header.L2IPDataRecord; import net.decix.jipfix.header.MessageHeader; import net.decix.jipfix.header.SetHeader; import net.decix.util.HeaderBytesException; import net.decix.util.HeaderParseException; import net.decix.util.MacAddress; import net.decix.util.Utility; import org.pcap4j.core.NotOpenException; import org.pcap4j.core.PacketListener; import org.pcap4j.core.PcapDumper; import org.pcap4j.core.PcapHandle; import org.pcap4j.core.PcapNativeException; import org.pcap4j.core.Pcaps; import org.pcap4j.packet.EthernetPacket; import org.pcap4j.packet.IpV4Packet; import org.pcap4j.packet.Packet; import org.pcap4j.packet.UdpPacket; import org.pcap4j.packet.UnknownPacket; public class PCAPParser { // private static final String PCAP_FILE_READ = "/Users/tking/Downloads/2014-03-05_IPFIX_capture01.pcap"; // IPFIX-Test.pcap // private static final String PCAP_FILE_READ = "/Users/tking/Downloads/IPFIX-Test.pcap"; private static final String PCAP_FILE_READ = "/Users/tking/Downloads/ipfix-all-routers-2014-12-18.pcap"; // private static final String PCAP_FILE_READ = "/Users/tking/Downloads/ipfix-2014-04-14.2.pcap"; private static final String PCAP_FILE_WRITE = "/Users/tking/Downloads/IPFIX-Test_Created_By_JIPFIX.pcap"; // private static final String PCAP_FILE_WRITE = "c:\\tmp\\trace_out.pcap"; // private static final String PCAP_FILE_WRITE = "/Users/tking/Downloads/IPFIX-Test_Created_By_JIPFIX2.pcap"; // private static PcapHandle handleWrite; private static PcapDumper dumper; public static void main(String[] args) throws PcapNativeException, NotOpenException, InterruptedException { final Set<Long> observationDomainIDs = new HashSet<Long>(); final Set<MacAddress> srcMacAddresses = new HashSet<MacAddress>(); final Set<MacAddress> destMacAddresses = new HashSet<MacAddress>(); PcapHandle handleRead = Pcaps.openOffline(PCAP_FILE_READ); // handleWrite = Pcaps.openOffline(PCAP_FILE_WRITE); dumper = handleRead.dumpOpen(PCAP_FILE_WRITE); PacketListener listener = new PacketListener() { public void gotPacket(Packet fullPacket) { // System.out.println(packet); UdpPacket udpPacket = fullPacket.get(UdpPacket.class); if (udpPacket == null) return; if (udpPacket.getHeader().getDstPort().value() != 2056) return; // System.out.println(packet); byte[] bytes = udpPacket.getRawData(); byte[] onlyIPFIX = new byte[bytes.length - 8]; System.arraycopy(bytes, 8, onlyIPFIX, 0, bytes.length - 8); try { MessageHeader mh = MessageHeader.parse(onlyIPFIX); // Packet.Builder udpB = fullPacket.get(UdpPacket.class).getBuilder(); // UnknownPacket.Builder upB = new UnknownPacket.Builder(); // upB.rawData(mh.getBytes()); // udpB.payloadBuilder(upB); // // Packet.Builder ipB = fullPacket.get(IpV4Packet.class).getBuilder(); // ipB.payloadBuilder(udpB); // // Packet.Builder etherB = fullPacket.get(EthernetPacket.class).getBuilder(); // etherB.payloadBuilder(ipB); // // Packet newPacket = etherB.build(); // dumper.dump(newPacket, 0l, 0); if (onlyIPFIX.length != mh.getBytes().length) { System.out.println("Lenght: OnlyIPFIX: " + onlyIPFIX.length + " : Generated: " + mh.getBytes().length); } // boolean containsOtherThan306SetID = false; // for (SetHeader sh : mh.getSetHeaders()) { // if (sh.getSetID() != 306) containsOtherThan306SetID = true; // } // if (containsOtherThan306SetID) { // //System.out.printf("frame #%d%n", packet.getFrameNumber()); // System.out.println("Template?"); // } else { // Random r = new Random(); // int i = r.nextInt(100); // if (i <= 0) { // System.out.printf("frame #%d%n", packet.getFrameNumber()); // System.out.println(mh); // } observationDomainIDs.add(mh.getObservationDomainID()); for (SetHeader sh : mh.getSetHeaders()) { for (DataRecord dr : sh.getDataRecords()) { if (dr instanceof L2IPDataRecord) { L2IPDataRecord lidr = (L2IPDataRecord) dr; if (lidr.getSourceIPv4Address().equals(Inet4Address.getByName("85.214.108.26")) || lidr.getSourceIPv4Address().equals(Inet4Address.getByName("85.214.108.26"))) { System.out.println(lidr); } // srcMacAddresses.add(lidr.getSourceMacAddress()); // destMacAddresses.add(lidr.getDestinationMacAddress()); // if (Utility.isConfigured(lidr.getDestinationIPv6Address())) { // // System.out.println(mh); // } } } } // } } catch (HeaderParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (HeaderBytesException e) { // TODO Auto-generated catch block e.printStackTrace(); // } catch (NotOpenException e) { // // TODO Auto-generated catch block // e.printStackTrace(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; handleRead.loop(-1, listener); handleRead.close(); dumper.close(); System.out.println("\nObservation domain IDs: (" + observationDomainIDs.size() + ")"); for (Long id : observationDomainIDs) { System.out.println(id); } System.out.println("\nSrc MacAddresses: (" + srcMacAddresses.size() + ")"); for (MacAddress ma : srcMacAddresses) { System.out.println(ma); } System.out.println("\nDest MacAddresses: (" + destMacAddresses.size() + ")"); for (MacAddress ma : destMacAddresses) { System.out.println(ma); } } }