| @@ -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)) | |||