@Override public void onEvent(PacketContainer container, long sequence, boolean endOfBatch) throws Exception { if (shouldSkipEvent(sequence)) { return; } DataLinkType dlt = container.getDlt(); byte[] data = container.getRawPacket(); Packet packet = PacketFactories.getFactory(Packet.class, DataLinkType.class) .newInstance(data, 0, data.length, dlt); // Don't use packet.get(IpV4Packet.class). // In case of 'IP in IP' packets it doesn't work properly. IpV4Packet ipV4Packet = extractIpV4Packet(packet, pkt -> pkt.getOuterOf(UdpPacket.class), pkt -> pkt.getOuterOf(TcpPacket.class), pkt -> pkt.getOuterOf(FragmentedPacket.class)); if (ipV4Packet != null) { IpNumber protocol = ipV4Packet.getHeader().getProtocol(); if (protocol.compareTo(IpNumber.UDP) == 0 || protocol.compareTo(IpNumber.TCP) == 0) { container.setIpV4Packet(ipV4Packet); } } }