1 package edu.uci.iotproject.trafficreassembly.layer2;
3 import edu.uci.iotproject.detection.Layer2FlowObserver;
4 import org.pcap4j.core.PcapPacket;
5 import org.pcap4j.packet.EthernetPacket;
6 import org.pcap4j.util.MacAddress;
8 import java.util.ArrayList;
9 import java.util.Collections;
10 import java.util.List;
13 * The packets exchanged between two endpoints (MAC addresses).
15 * @author Janus Varmarken
17 public class Layer2Flow {
19 private final MacAddress mEndpoint1;
20 private final MacAddress mEndpoint2;
22 private final List<Layer2FlowObserver> mFlowObservers = new ArrayList<>();
24 public Layer2Flow(MacAddress endpoint1, MacAddress endpoint2) {
25 mEndpoint1 = endpoint1;
26 mEndpoint2 = endpoint2;
29 public void addFlowObserver(Layer2FlowObserver observer) {
30 mFlowObservers.add(observer);
33 public void removeFlowObserver(Layer2FlowObserver observer) {
34 mFlowObservers.remove(observer);
38 * The packets in the flow.
40 private final List<PcapPacket> mPackets = new ArrayList<>();
43 * Add a packet to this flow.
44 * @param packet The packet that is to be added to the flow.
46 public void addPacket(PcapPacket packet) {
47 verifyAddresses(packet);
49 // Notify flow observers of the new packet
50 mFlowObservers.forEach(o -> o.onNewPacket(this, packet));
53 public List<PcapPacket> getPackets() {
54 return Collections.unmodifiableList(mPackets);
57 private void verifyAddresses(PcapPacket packet) {
58 EthernetPacket ethPkt = packet.get(EthernetPacket.class);
59 MacAddress srcAddr = ethPkt.getHeader().getSrcAddr();
60 MacAddress dstAddr = ethPkt.getHeader().getDstAddr();
61 if ((mEndpoint1.equals(srcAddr) && mEndpoint2.equals(dstAddr)) ||
62 (mEndpoint1.equals(dstAddr) && mEndpoint2.equals(srcAddr))) {
66 throw new IllegalArgumentException("Mismatch in MACs: packet does not pertain to this flow");
76 Packet stream -> flow reassembler -> flow1, flow2, flow3... -> for each flow, keep a sequence matcher for each sequence of cluster