|
- #!/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 = pd.merge(sender_df, receiver_df, on="data_hash", how="outer")
- 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))
|