traffic-taffy 0.9.3__py3-none-any.whl → 0.9.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- traffic_taffy/__init__.py +1 -1
- traffic_taffy/algorithms/statistical.py +3 -3
- traffic_taffy/dissector_engine/dpkt.py +62 -13
- traffic_taffy/report.py +12 -0
- traffic_taffy/tests/test_dpkt_engine.py +15 -0
- {traffic_taffy-0.9.3.dist-info → traffic_taffy-0.9.5.dist-info}/METADATA +1 -1
- {traffic_taffy-0.9.3.dist-info → traffic_taffy-0.9.5.dist-info}/RECORD +10 -8
- {traffic_taffy-0.9.3.dist-info → traffic_taffy-0.9.5.dist-info}/WHEEL +0 -0
- {traffic_taffy-0.9.3.dist-info → traffic_taffy-0.9.5.dist-info}/entry_points.txt +0 -0
- {traffic_taffy-0.9.3.dist-info → traffic_taffy-0.9.5.dist-info}/licenses/LICENSE.txt +0 -0
traffic_taffy/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__VERSION__ = "0.9.
|
1
|
+
__VERSION__ = "0.9.5"
|
@@ -65,7 +65,7 @@ class ComparisonStatistical(ComparisonSlicesAlgorithm):
|
|
65
65
|
right_count = right_side[key][subkey]
|
66
66
|
left_percentage = 0.0
|
67
67
|
if right_side_total == 0:
|
68
|
-
right_percentage =
|
68
|
+
right_percentage = 1.0
|
69
69
|
else:
|
70
70
|
right_percentage = right_side[key][subkey] / right_side_total
|
71
71
|
new_right_count += 1 # this value wasn't in the left
|
@@ -81,12 +81,12 @@ class ComparisonStatistical(ComparisonSlicesAlgorithm):
|
|
81
81
|
)
|
82
82
|
|
83
83
|
if right_side_total == 0:
|
84
|
-
right_percent =
|
84
|
+
right_percent = 1.0
|
85
85
|
else:
|
86
86
|
right_percent = new_right_count / right_side_total
|
87
87
|
|
88
88
|
if left_side_total == 0:
|
89
|
-
left_percent =
|
89
|
+
left_percent = 1.0
|
90
90
|
else:
|
91
91
|
left_percent = new_left_count / left_side_total
|
92
92
|
|
@@ -2,12 +2,13 @@
|
|
2
2
|
|
3
3
|
from __future__ import annotations
|
4
4
|
|
5
|
-
from logging import debug
|
5
|
+
from logging import debug, error
|
6
6
|
from traffic_taffy.dissector_engine import DissectionEngine
|
7
7
|
from traffic_taffy.dissection import Dissection, PCAPDissectorLevel
|
8
8
|
from pcap_parallel import PCAPParallel
|
9
9
|
|
10
10
|
import dpkt
|
11
|
+
import socket
|
11
12
|
|
12
13
|
|
13
14
|
class DissectionEngineDpkt(DissectionEngine):
|
@@ -20,6 +21,7 @@ class DissectionEngineDpkt(DissectionEngine):
|
|
20
21
|
def __init__(self, *args: list, **kwargs: dict):
|
21
22
|
"""Create a dissection engine for quickly parsing and counting packets."""
|
22
23
|
super().__init__(*args, **kwargs)
|
24
|
+
self.data_link_type = None
|
23
25
|
|
24
26
|
def load_data(self) -> None:
|
25
27
|
"""Load the specified PCAP into memory."""
|
@@ -29,6 +31,9 @@ class DissectionEngineDpkt(DissectionEngine):
|
|
29
31
|
else:
|
30
32
|
# it's an open handle already
|
31
33
|
pcap = dpkt.pcap.Reader(self.pcap_file)
|
34
|
+
|
35
|
+
self.data_link_type = pcap.datalink()
|
36
|
+
|
32
37
|
if self.pcap_filter:
|
33
38
|
pcap.setfilter(self.pcap_filter)
|
34
39
|
pcap.dispatch(self.maximum_count, self.callback)
|
@@ -144,14 +149,34 @@ class DissectionEngineDpkt(DissectionEngine):
|
|
144
149
|
level = level.value
|
145
150
|
|
146
151
|
if level >= PCAPDissectorLevel.THROUGH_IP.value:
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
152
|
+
if self.data_link_type == 1:
|
153
|
+
# Ethernet based encapsulation
|
154
|
+
eth = dpkt.ethernet.Ethernet(packet)
|
155
|
+
# these names are designed to match scapy names
|
156
|
+
self.incr("Ethernet_dst", eth.dst)
|
157
|
+
self.incr("Ethernet_src", eth.src)
|
158
|
+
self.incr("Ethernet_type", eth.type)
|
159
|
+
data = eth.data
|
160
|
+
elif self.data_link_type == 101:
|
161
|
+
# Raw IP encapsulation
|
162
|
+
if packet[0] == 0x45:
|
163
|
+
data = dpkt.ip.IP(packet)
|
164
|
+
elif packet[0] == 0x60:
|
165
|
+
data = dpkt.ip6.IP6(packet)
|
166
|
+
else:
|
167
|
+
error("Unknown IP version in data")
|
168
|
+
raise ValueError("unknown IP version")
|
169
|
+
else:
|
170
|
+
error(f"unknown link type: {self.data_link_type}")
|
171
|
+
raise ValueError("unknown link type")
|
172
|
+
|
173
|
+
# TODO(hardaker): add ip6.IP6 support
|
174
|
+
next_layer = None
|
175
|
+
udp = None
|
176
|
+
tcp = None
|
177
|
+
|
178
|
+
if isinstance(data, dpkt.ip.IP):
|
179
|
+
ip = data
|
155
180
|
udp = None
|
156
181
|
tcp = None
|
157
182
|
|
@@ -177,8 +202,32 @@ class DissectionEngineDpkt(DissectionEngine):
|
|
177
202
|
self.incr(prefix + "version", ip.v)
|
178
203
|
self.incr(prefix + "ttl", ip.ttl)
|
179
204
|
|
180
|
-
|
181
|
-
|
205
|
+
next_layer = ip.data
|
206
|
+
|
207
|
+
elif isinstance(data, dpkt.ip6.IP6):
|
208
|
+
ip6 = data
|
209
|
+
|
210
|
+
ipver = "IPv6"
|
211
|
+
prefix = f"Ethernet_{ipver}_"
|
212
|
+
|
213
|
+
# TODO(hardaker): make sure all these match scapy
|
214
|
+
socket.inet_ntop(
|
215
|
+
socket.AF_INET6,
|
216
|
+
b"\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01",
|
217
|
+
)
|
218
|
+
|
219
|
+
self.incr(prefix + "dst", socket.inet_ntop(socket.AF_INET6, ip6.dst))
|
220
|
+
self.incr(prefix + "src", socket.inet_ntop(socket.AF_INET6, ip6.src))
|
221
|
+
self.incr(prefix + "fl", ip6.flow)
|
222
|
+
self.incr(prefix + "hlim", ip6.hlim)
|
223
|
+
self.incr(prefix + "nh", ip6.nxt)
|
224
|
+
self.incr(prefix + "plen", ip6.plen)
|
225
|
+
self.incr(prefix + "tc", ip6.fc)
|
226
|
+
next_layer = ip6.data
|
227
|
+
|
228
|
+
if next_layer:
|
229
|
+
if isinstance(next_layer, dpkt.udp.UDP):
|
230
|
+
udp = next_layer
|
182
231
|
self.incr(prefix + "UDP_sport", udp.sport)
|
183
232
|
self.incr(prefix + "UDP_dport", udp.dport)
|
184
233
|
self.incr(prefix + "UDP_len", udp.ulen)
|
@@ -186,8 +235,8 @@ class DissectionEngineDpkt(DissectionEngine):
|
|
186
235
|
|
187
236
|
# TODO(hardaker): handle DNS and others for level 3
|
188
237
|
|
189
|
-
elif isinstance(
|
190
|
-
tcp =
|
238
|
+
elif isinstance(next_layer, dpkt.tcp.TCP):
|
239
|
+
tcp = next_layer
|
191
240
|
self.incr(prefix + "TCP_sport", tcp.sport)
|
192
241
|
self.incr(prefix + "TCP_dport", tcp.dport)
|
193
242
|
self.incr(prefix + "TCP_seq", tcp.seq)
|
traffic_taffy/report.py
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
import os
|
2
|
+
from traffic_taffy.dissection import PCAPDissectorLevel
|
3
|
+
from traffic_taffy.dissector_engine.dpkt import DissectionEngineDpkt
|
4
|
+
|
5
|
+
def test_dpkt_engine():
|
6
|
+
test_pcap = "dns.pcap"
|
7
|
+
test_pcap = "port53-2023-30-31_20.pcap"
|
8
|
+
test_pcap = "airplane-wireless.pcap"
|
9
|
+
if not os.path.exists(test_pcap):
|
10
|
+
return
|
11
|
+
|
12
|
+
engine = DissectionEngineDpkt(test_pcap,
|
13
|
+
dissector_level = PCAPDissectorLevel.COMMON_LAYERS)
|
14
|
+
dissection = engine.load()
|
15
|
+
|
@@ -1,4 +1,4 @@
|
|
1
|
-
traffic_taffy/__init__.py,sha256=
|
1
|
+
traffic_taffy/__init__.py,sha256=xEWNhlRR6R-6owCOTbPr3aDZBNjhXPEL8bZfHLBc-RI,22
|
2
2
|
traffic_taffy/compare.py,sha256=g9rU6oa_2Wy0nUJ7K6TI8JTctyGCRvYEUakDBf7blOY,8644
|
3
3
|
traffic_taffy/comparison.py,sha256=KJxOp4UqhfRkF4LI1PMDRIefeyTm2w5sbdr7VUTS4KM,1451
|
4
4
|
traffic_taffy/config.py,sha256=DgTu2kA1Ec4Hbwl_44kTsdyJYvxAabgJk9a7aOH2XXU,4444
|
@@ -7,16 +7,17 @@ traffic_taffy/dissectmany.py,sha256=SWFXFyERNCi0j7hiMDEeJJdPYDpa0SOlSj1V8AqpXUA,
|
|
7
7
|
traffic_taffy/dissector.py,sha256=M5MHVPwfeMHa6s4TG8ZiiNjk7qaht65wdqm0nmRHdQ8,15682
|
8
8
|
traffic_taffy/graph.py,sha256=EfkxH5D9PNlDpvftkh9GyUusV05EV537QGB7JOMeW4w,4730
|
9
9
|
traffic_taffy/graphdata.py,sha256=r_QNXO3FzC7Vx4123SdCliAh7j2NCQ4Lb5uoOJnlt2M,3376
|
10
|
+
traffic_taffy/report.py,sha256=Yzb27hUWcWL-RxWpSQmRyM8NyWxQGT0l0jUCGHoYDSY,224
|
10
11
|
traffic_taffy/taffy_config.py,sha256=AmdQbWAhoiV7aTNSpV1exJfd5eA0a3sYTIjikHkMPwY,1124
|
11
12
|
traffic_taffy/algorithms/__init__.py,sha256=A7xI2ctotBT7WgG-6ItilXE_FIWF9QWc6UjdfGyThKw,737
|
12
13
|
traffic_taffy/algorithms/comparecorrelation.py,sha256=gakZJotZNOVj96y4_-vtt_ka8pZLBVERf44Yixtq_yE,5875
|
13
14
|
traffic_taffy/algorithms/comparecorrelationchanges.py,sha256=-ztWKpNN5lm_6e7hTSZytwzuK1RpMpfe1ksQgsb0_tk,7646
|
14
15
|
traffic_taffy/algorithms/compareseries.py,sha256=cVonTV6TnMZAaHlGqZ6shn0aDQTTHzK-tPvUAk3OkuQ,4165
|
15
16
|
traffic_taffy/algorithms/compareslices.py,sha256=aIDhISKi-m8uD65pBd3A2naoxYD9zeay6y7mAk4hXdg,4336
|
16
|
-
traffic_taffy/algorithms/statistical.py,sha256=
|
17
|
+
traffic_taffy/algorithms/statistical.py,sha256=0Hr62ZUZlFCNPUh6yVBRFjNho42cTGeX_GHtbq1sbak,4281
|
17
18
|
traffic_taffy/dissector_engine/__init__.py,sha256=Hu-UQtz7yhivmQLUP5b8tFQLEhy2bfvrRV3Q4aZp6vg,2202
|
18
19
|
traffic_taffy/dissector_engine/dnstap.py,sha256=rBzVlB0D3YVhHOsr17cbnCIZU13g20srgR4sE7ZfNUE,4810
|
19
|
-
traffic_taffy/dissector_engine/dpkt.py,sha256=
|
20
|
+
traffic_taffy/dissector_engine/dpkt.py,sha256=q7cJz6WWpe9xUcEbAY_yn_cma_4loXuS3QKIVln6FHQ,12788
|
20
21
|
traffic_taffy/dissector_engine/scapy.py,sha256=WrZUfV_viR2Tro0kM3QKUkufIcM3RyYaZ3ncA1yZsaU,4897
|
21
22
|
traffic_taffy/hooks/__init__.py,sha256=Bvhl6RnyBqQkWuCU6TS0O_ZHe4qCQsC4HE8FELigWPw,661
|
22
23
|
traffic_taffy/hooks/ip2asn.py,sha256=7UA52L6jej0RYBptzP9izO0yXMcqH7wcp2ocDRUN5dg,2216
|
@@ -34,6 +35,7 @@ traffic_taffy/reports/correlationreport.py,sha256=9PdL_53mxfO619PFSoeRsTEm63L1J_
|
|
34
35
|
traffic_taffy/tests/test_compare_results.py,sha256=iLcS9wvEqxgKszIspLtD2Zw8Qk5JxOCurQwWYzhtOkM,2318
|
35
36
|
traffic_taffy/tests/test_config.py,sha256=UCqSJXVwpFFchcIbyFzLqjVF-wgEV755KlQ7thommro,4284
|
36
37
|
traffic_taffy/tests/test_dict_merge.py,sha256=t3rZSQQ0AlBxRKfLborx9SxYN53cCAQQzZ2w-__WT2Y,1429
|
38
|
+
traffic_taffy/tests/test_dpkt_engine.py,sha256=512Wfq7D1qVkfhGwf1u2QSgZooWqZQWV9L4OhpAr4AE,489
|
37
39
|
traffic_taffy/tests/test_global_config.py,sha256=kjr1wy1cXWagVLb0OnQYH0vz2htxLs944Xo42lNsir4,597
|
38
40
|
traffic_taffy/tests/test_hooks.py,sha256=amjEbtMwOZZCg_RCJ0wQR7aOqNfwz3IG3WY-9CwjSF4,1260
|
39
41
|
traffic_taffy/tests/test_normalize.py,sha256=sKHyiV8YXcKKcWqsbZP94nu_g5oEMJzzj6umeHxwa64,2638
|
@@ -49,8 +51,8 @@ traffic_taffy/tools/dissect.py,sha256=B-7e7aqEOWtJ-0P2Y-mzmrzoDqVrDCJ2JzGR45Qtuu
|
|
49
51
|
traffic_taffy/tools/explore.py,sha256=gUcOfAgangJJI1si1gLPUoWRUKmWUAXSP0oTD2JJygw,24149
|
50
52
|
traffic_taffy/tools/export.py,sha256=9zBBGhZK95b4ZiLJ8XK30GPsaBjgR84Sk1HoPIxRpTI,2844
|
51
53
|
traffic_taffy/tools/graph.py,sha256=KiKDY9R8JLT5-JouANoi_1WGcdFMhXsLnYlhPsFRWpM,2316
|
52
|
-
traffic_taffy-0.9.
|
53
|
-
traffic_taffy-0.9.
|
54
|
-
traffic_taffy-0.9.
|
55
|
-
traffic_taffy-0.9.
|
56
|
-
traffic_taffy-0.9.
|
54
|
+
traffic_taffy-0.9.5.dist-info/METADATA,sha256=OqsDUw_g2NHB5jXHmcrq5dCSjPrQAXujOnVi5GZhb7U,2241
|
55
|
+
traffic_taffy-0.9.5.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87
|
56
|
+
traffic_taffy-0.9.5.dist-info/entry_points.txt,sha256=F0lqjvw94nQ3hY4eerN7faT9aKhhGUHbqBhuEr9q1r8,361
|
57
|
+
traffic_taffy-0.9.5.dist-info/licenses/LICENSE.txt,sha256=hiV1DJgDQeSM1r7P-ez5oxily11S5nsCedU0jKzKKzo,11338
|
58
|
+
traffic_taffy-0.9.5.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|