Adds format script for upd transmissions.
This commit is contained in:
117
format_udp_pcap_to_csv.py
Normal file → Executable file
117
format_udp_pcap_to_csv.py
Normal file → Executable file
@@ -0,0 +1,117 @@
|
||||
#!/usr/bin/env python3
|
||||
import os
|
||||
from datetime import datetime
|
||||
import subprocess
|
||||
from argparse import ArgumentParser
|
||||
from io import StringIO
|
||||
|
||||
import pandas as pd
|
||||
|
||||
|
||||
def format_udp_pcap_to_csv(folder, sender_pcap_name, receiver_pcap_name, output=None):
|
||||
tmp = list()
|
||||
for pcap in [sender_pcap_name, receiver_pcap_name]:
|
||||
tshark_command = [
|
||||
"tshark",
|
||||
"-r",
|
||||
"{}{}".format(folder, pcap),
|
||||
"-O",
|
||||
"udp",
|
||||
"-T",
|
||||
"fields",
|
||||
"-e",
|
||||
"frame.time_epoch",
|
||||
"-e",
|
||||
"data.len",
|
||||
"-e",
|
||||
"data",
|
||||
"-E",
|
||||
"header=y",
|
||||
"-E",
|
||||
"separator=,",
|
||||
]
|
||||
tshark_out = subprocess.check_output(tshark_command)
|
||||
tmp.append(
|
||||
pd.read_csv(
|
||||
StringIO(tshark_out.decode("utf-8")),
|
||||
converters=dict(data=lambda x: hash(x)),
|
||||
)
|
||||
)
|
||||
sender_df = tmp[0].rename(
|
||||
columns={"frame.time_epoch": "departure_time", "data": "data_hash", "data.len": "data.len_send"}
|
||||
)
|
||||
receiver_df = tmp[1].rename(
|
||||
columns={"frame.time_epoch": "arrival_time", "data": "data_hash", "data.len": "data.len_received"}
|
||||
)
|
||||
|
||||
transmission_df = sender_df.merge(receiver_df, on="data_hash")
|
||||
transmission_df["delay"] = transmission_df.arrival_time - transmission_df.departure_time
|
||||
|
||||
direction = "uplink"
|
||||
if "server" in sender_pcap_name and "client" in receiver_pcap_name:
|
||||
direction = "downlink"
|
||||
|
||||
filename = sender_pcap_name.replace("_sender_", "_{}_".format(direction))
|
||||
filename = filename.replace("client_", "")
|
||||
filename = filename.replace("server_", "")
|
||||
filename = filename.replace(".pcap", ".csv")
|
||||
|
||||
transmission_df.to_csv("{}{}".format(folder if output is None else output, filename))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
start_time = datetime.now()
|
||||
parser = ArgumentParser()
|
||||
|
||||
parser.add_argument("-f", "--folder", required=True, help="Folder with pcap files.")
|
||||
parser.add_argument(
|
||||
"-o", "--output", required=False, help="Folder for created csv files."
|
||||
)
|
||||
parser.add_argument(
|
||||
"--name_contains", required=False, default=".pcap", help="Substring in filename."
|
||||
)
|
||||
parser.add_argument(
|
||||
"--use_subdirs", required=False, default=False, help="Use pcaps in subdirs."
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
sender_pcap_list = list()
|
||||
counter = 1
|
||||
|
||||
if args.use_subdirs:
|
||||
sub_dirs = os.listdir(args.folder)
|
||||
for d in sub_dirs:
|
||||
filenames = os.listdir("{}{}".format(args.folder, d))
|
||||
for filename in filenames:
|
||||
if filename.endswith(".pcap") and args.name_contains in filename and "sender" in filename:
|
||||
sender_pcap_list.append("{}/{}".format(d, filename))
|
||||
else:
|
||||
filenames = os.listdir(args.folder)
|
||||
for filename in filenames:
|
||||
if filename.endswith(".pcap") and args.name_contains in filename and "sender" in filename:
|
||||
sender_pcap_list.append(filename)
|
||||
|
||||
for sender_pcap in sender_pcap_list:
|
||||
receiver_pcap = sender_pcap.replace("sender", "receiver")
|
||||
if "client" in receiver_pcap:
|
||||
receiver_pcap = receiver_pcap.replace("client", "server")
|
||||
else:
|
||||
receiver_pcap = receiver_pcap.replace("server", "client")
|
||||
|
||||
print("\rProcessing file pair no: {} out of {} ({}%) ".format(
|
||||
counter,
|
||||
len(sender_pcap_list),
|
||||
round((counter / len(sender_pcap_list)) * 100, 2)
|
||||
), end="")
|
||||
|
||||
format_udp_pcap_to_csv(
|
||||
args.folder,
|
||||
sender_pcap,
|
||||
receiver_pcap,
|
||||
output=args.folder if args.output is None else args.output
|
||||
)
|
||||
counter += 1
|
||||
|
||||
print("\nWrote CSV files to: {}".format(args.folder if args.output is None else args.output))
|
||||
print("Runtime: {}".format(datetime.now() - start_time))
|
||||
|
||||
Reference in New Issue
Block a user