| @@ -166,7 +166,25 @@ def activate_hystart(): | |||
| def is_hystart_activated(): | |||
| return subprocess.check_output('cat /sys/module/tcp_cubic/parameters/hystart', shell=True) == "1" | |||
| return ( | |||
| subprocess.check_output( | |||
| "cat /sys/module/tcp_cubic/parameters/hystart", shell=True | |||
| ) | |||
| == "1" | |||
| ) | |||
| def is_tcp_probe_enabled(): | |||
| return ( | |||
| subprocess.check_output( | |||
| "cat /sys/kernel/debug/tracing/events/tcp/tcp_probe/enable", shell=True | |||
| ) | |||
| == "1" | |||
| ) | |||
| def enable_tcp_probe(): | |||
| os.system("echo '1' > /sys/kernel/debug/tracing/events/tcp/tcp_probe/enable") | |||
| def set_default_receive_window(): | |||
| @@ -187,7 +205,9 @@ def monitor_serial(ser, output_file): | |||
| run_cmds = [NR_CQI_COMMAND, NR_SERVINGCELL_COMMAND, NR_EN_DC_STATUS_COMMAND] | |||
| try: | |||
| while ser.is_open: | |||
| response = subprocess.check_output(CMD_TIME_EPOCH, shell=True).decode("utf-8") | |||
| response = subprocess.check_output(CMD_TIME_EPOCH, shell=True).decode( | |||
| "utf-8" | |||
| ) | |||
| for cmd in run_cmds: | |||
| ser.write(cmd) | |||
| sleep(0.3) | |||
| @@ -203,9 +223,12 @@ def monitor_serial(ser, output_file): | |||
| if not ser.is_open: | |||
| print_message("Serial port is closed. Exit monitoring thread.") | |||
| else: | |||
| print_message("Something went wrong while monitoring serial interface. Exit monitoring thread.") | |||
| print_message( | |||
| "Something went wrong while monitoring serial interface. Exit monitoring thread." | |||
| ) | |||
| return | |||
| class Server: | |||
| def __init__(self, config): | |||
| self.config = config | |||
| @@ -235,10 +258,10 @@ class Server: | |||
| print_message("HARQ nothing to do on server side.") | |||
| def bandwidth(self): | |||
| use_reverse_mode = False | |||
| server_is_sender = False | |||
| if "reverse" in self.config["set"]: | |||
| use_reverse_mode = self.config["set"]["reverse"] | |||
| print_message("Use reverse mode: {}".format(use_reverse_mode)) | |||
| server_is_sender = self.config["set"]["server_is_sender"] | |||
| print_message("Use reverse mode: {}".format(server_is_sender)) | |||
| tcp_algo = list() | |||
| if "algo" in self.config["set"]: | |||
| @@ -257,12 +280,22 @@ class Server: | |||
| # prevent address already in use | |||
| sleep(2) | |||
| ws_filter = "" | |||
| if use_reverse_mode: | |||
| if server_is_sender: | |||
| # server sends | |||
| if not is_tcp_probe_enabled(): | |||
| print_message("tcp probe is not enabled!") | |||
| enable_tcp_probe() | |||
| print_message("tcp probe is now enabled") | |||
| for n in range(1, self.config["number_of_measurements"] + 1): | |||
| print_message( | |||
| "{} of {}".format(n, self.config["number_of_measurements"]) | |||
| ) | |||
| print_message( | |||
| "Using {} for congestion control".format( | |||
| tcp_algo[congestion_control_index] | |||
| ) | |||
| ) | |||
| iperf_command = [ | |||
| "iperf3", | |||
| "-s", | |||
| @@ -281,6 +314,9 @@ class Server: | |||
| ) | |||
| subprocess.call(iperf_command) | |||
| processHandler.kill_all() | |||
| congestion_control_index = (congestion_control_index + 1) % len( | |||
| tcp_algo | |||
| ) | |||
| else: | |||
| # client sends | |||
| ws_filter = "{} and port {}".format("tcp", self.config["port"]) | |||
| @@ -319,7 +355,12 @@ class Server: | |||
| else: | |||
| name_option = "" | |||
| filepath = "{}{}{}_bandwidth_{}_{}_{}.pcap".format( | |||
| self.config["folder"], self.config["prefix"], name_option, "tcp", tcp_algo[congestion_control_index], n | |||
| self.config["folder"], | |||
| self.config["prefix"], | |||
| name_option, | |||
| "tcp", | |||
| tcp_algo[congestion_control_index], | |||
| n, | |||
| ) | |||
| tcpdump_flags.append("-s96") | |||
| thread = Thread( | |||
| @@ -344,7 +385,9 @@ class Server: | |||
| subprocess.call(iperf_command) | |||
| sleep(2) | |||
| processHandler.kill_all() | |||
| congestion_control_index = (congestion_control_index + 1) % len(tcp_algo) | |||
| congestion_control_index = (congestion_control_index + 1) % len( | |||
| tcp_algo | |||
| ) | |||
| def cbr(self): | |||
| use_reverse_mode = False | |||
| @@ -479,7 +522,11 @@ class Client: | |||
| self.config["number_of_measurements"], | |||
| ) | |||
| command = [c] | |||
| print_message("Start sending {} pings with nog gap.".format(self.config["number_of_measurements"])) | |||
| print_message( | |||
| "Start sending {} pings with nog gap.".format( | |||
| self.config["number_of_measurements"] | |||
| ) | |||
| ) | |||
| ping_out = subprocess.check_output(command, shell=True).decode("utf-8") | |||
| filepath = "{}{}_ping_no_gap.txt".format( | |||
| self.config["folder"], self.config["prefix"] | |||
| @@ -599,10 +646,10 @@ class Client: | |||
| processHandler.kill_all() | |||
| def bandwidth(self): | |||
| use_reverse_mode = False | |||
| server_is_sender = False | |||
| if "reverse" in self.config["set"]: | |||
| use_reverse_mode = self.config["set"]["reverse"] == "true" | |||
| print_message("Use reverse mode: {}".format(use_reverse_mode)) | |||
| server_is_sender = self.config["set"]["reverse"] == "true" | |||
| print_message("Use reverse mode: {}".format(server_is_sender)) | |||
| tcp_algo = list() | |||
| if "algo" in self.config["set"]: | |||
| @@ -626,7 +673,7 @@ class Client: | |||
| sleep(2) | |||
| congestion_control_index = 0 | |||
| if use_reverse_mode: | |||
| if server_is_sender: | |||
| # server is sending | |||
| ws_filter = "{} and port {}".format("tcp", self.config["port"]) | |||
| print_message("Use ws filter: {}".format(ws_filter)) | |||
| @@ -635,13 +682,17 @@ class Client: | |||
| "{} of {}".format(n, self.config["number_of_measurements"]) | |||
| ) | |||
| print_message( | |||
| "Measurement {} of {}".format( | |||
| n, self.config["number_of_measurements"] | |||
| "Using {} for congestion control".format( | |||
| tcp_algo[congestion_control_index] | |||
| ) | |||
| ) | |||
| tcpdump_flags = [] | |||
| filepath = "{}{}_bandwidth_reverse_{}_{}_{}.pcap".format( | |||
| self.config["folder"], self.config["prefix"], "tcp", tcp_algo[congestion_control_index], n | |||
| self.config["folder"], | |||
| self.config["prefix"], | |||
| "tcp", | |||
| tcp_algo[congestion_control_index], | |||
| n, | |||
| ) | |||
| tcpdump_flags.append("-s96") | |||
| thread = Thread( | |||
| @@ -669,11 +720,17 @@ class Client: | |||
| subprocess.call(iperf_command) | |||
| sleep(4) | |||
| processHandler.kill_all() | |||
| congestion_control_index = (congestion_control_index + 1) % len(tcp_algo) | |||
| congestion_control_index = (congestion_control_index + 1) % len( | |||
| tcp_algo | |||
| ) | |||
| else: | |||
| # client is sending | |||
| state_counter = 0 | |||
| name_option = "" | |||
| if not is_tcp_probe_enabled(): | |||
| print_message("tcp probe is not enabled!") | |||
| enable_tcp_probe() | |||
| print_message("tcp probe is now enabled") | |||
| for n in range(1, self.config["number_of_measurements"] + 1): | |||
| print_message( | |||
| "{} of {}".format(n, self.config["number_of_measurements"]) | |||
| @@ -715,7 +772,9 @@ class Client: | |||
| sleep(2) | |||
| subprocess.call(iperf_command) | |||
| processHandler.kill_all() | |||
| congestion_control_index = (congestion_control_index + 1) % len(tcp_algo) | |||
| congestion_control_index = (congestion_control_index + 1) % len( | |||
| tcp_algo | |||
| ) | |||
| sleep(4) | |||
| def cbr(self): | |||
| @@ -955,7 +1014,7 @@ if __name__ == "__main__": | |||
| default=False, | |||
| help="Measure greedy tcp throughput with iperf3." | |||
| "Use the --set flag for: " | |||
| "reverse=false enable reverse mode. Server is sending." | |||
| "server_is_sender=false if enable server is sending." | |||
| "algo=cubic set tcp algorithm. Can be a comma separated string for multiple congestion control algorithms." | |||
| "alternate_hystart=false if enabled alternate reproduce every Cubic measurement wicht and without HyStart (Also raises the receive window.). " | |||
| "time=10 length of transmission in seconds.", | |||