| #!/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)) |