diff --git a/format_udp_pcap_to_csv.py b/format_udp_pcap_to_csv.py old mode 100644 new mode 100755 index e69de29..6afe274 --- a/format_udp_pcap_to_csv.py +++ b/format_udp_pcap_to_csv.py @@ -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))