f1b7190c76129fa4450b289d315d3bcaf2d988fa
[pingpong.git] / Code / Projects / SmartPlugDetector / src / main / java / edu / uci / iotproject / trafficreassembly / layer2 / Layer2Flow.java
1 package edu.uci.iotproject.trafficreassembly.layer2;
2
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;
7
8 import java.util.ArrayList;
9 import java.util.Collections;
10 import java.util.List;
11
12 /**
13  * The packets exchanged between two endpoints (MAC addresses).
14  *
15  * @author Janus Varmarken
16  */
17 public class Layer2Flow {
18
19     private final MacAddress mEndpoint1;
20     private final MacAddress mEndpoint2;
21
22     private final List<Layer2FlowObserver> mFlowObservers = new ArrayList<>();
23
24     public Layer2Flow(MacAddress endpoint1, MacAddress endpoint2) {
25         mEndpoint1 = endpoint1;
26         mEndpoint2 = endpoint2;
27     }
28
29     public void addFlowObserver(Layer2FlowObserver observer) {
30         mFlowObservers.add(observer);
31     }
32
33     public void removeFlowObserver(Layer2FlowObserver observer) {
34         mFlowObservers.remove(observer);
35     }
36
37     /**
38      * The packets in the flow.
39      */
40     private final List<PcapPacket> mPackets = new ArrayList<>();
41
42     /**
43      * Add a packet to this flow.
44      * @param packet The packet that is to be added to the flow.
45      */
46     public void addPacket(PcapPacket packet) {
47         verifyAddresses(packet);
48         mPackets.add(packet);
49         // Notify flow observers of the new packet
50         mFlowObservers.forEach(o -> o.onNewPacket(this, packet));
51     }
52
53     public List<PcapPacket> getPackets() {
54         return Collections.unmodifiableList(mPackets);
55     }
56
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))) {
63             // All is good.
64             return;
65         }
66         throw new IllegalArgumentException("Mismatch in MACs: packet does not pertain to this flow");
67     }
68
69 }
70
71
72
73 /*
74
75
76  Packet stream -> flow reassembler -> flow1, flow2, flow3... -> for each flow, keep a sequence matcher for each sequence of cluster
77
78
79  */