def parallel_duration_run_suit():
    # TCP
    print "START ", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    starttime = time.time()

    measurement_folder_name = raw_input('Enter measurement name: ')
    tot_runs = raw_input('how many runs? each run should last around 5-6 mins - I suggest at least 30 with laptop in the same location. ')

    try:
        tot_runs = int(tot_runs)
    except Exception:
        tot_runs = 1
        print "Error. Running "+str(tot_runs)+" measurement."

    e = Experiment()
    e.collect_calibrate = False
    e.use_iperf_timeout = 1

    all_folder_name_list = []

    for nruns in range(tot_runs):
        #for num_par in [1, 2, 3, 4, 5, 10]:
        #    for timeout in [2, 5, 10, 15]:
        for num_par in [1, 10]:
            for timeout in [10]:
                print "\n\t\tTCP duration: "+str(timeout)+"; parallel: "+str(num_par)+"; RUN: " + str(nruns) + "\n"

                folder_name = measurement_folder_name + '_tcp_duration_' + str(timeout) + '_parallel_' + str(num_par)

                if not folder_name in all_folder_name_list:
                    all_folder_name_list.append(folder_name)

                e.timeout = timeout
                e.num_parallel_streams = num_par
                e.set_unique_id(folder_name)

                print time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(time.time())) + ": Run no traff " +str(e.experiment_counter)
                e.run_only_experiment(e.no_traffic, 'no_tra')

                #real_tcp_perf(e)
                real_tcp_perf2(e)

    for folder_name in all_folder_name_list:
        e.set_unique_id(folder_name)
        e.transfer_all_later()
        e.kill_all(1)
        e.clear_all()

    # FOLLOW UP WITH UDP
    timeout=2
    folder_name = measurement_folder_name + '_udp_duration_'+str(timeout)
    measure_iperf_udp_bandwidth_ratios(folder_name, tot_runs, timeout, False)

    print "DONE ", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    endtime = time.time()

    print "\n Total time taken = ", endtime - starttime

    return
def ping_buffer_endhost_test():

    print "START ", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    starttime = time.time()

    measurement_folder_name = raw_input('Enter measurement name: ')
    tot_runs = raw_input('how many runs? each run should last around 5-6 mins - I suggest at least 30 with laptop in the same location. ')

    try:
        tot_runs = int(tot_runs)
    except Exception:
        tot_runs = 1
        print "Error. Running "+str(tot_runs)+" measurement."

    e = Experiment(measurement_folder_name)
    # set all to yes
    e.collect_calibrate = False
    e.use_iperf_timeout = 1
    e.USE_IPERF3 = 1
    e.USE_IPERF_REV = 1
    e.USE_UDP_PROBE = 0
    e.USE_NETPERF = 0
    e.tcp = 1
    e.udp = 1
    e.start_servers()
    e.WTF_enable = 1
    e.timeout = 5
    e.parallel = 1
    e.num_parallel_streams = 4


    for nruns in range(tot_runs):
        e.run_only_experiment(e.no_traffic, 'no_tra')
        e.run_only_experiment(e.iperf3_tcp_up_AS, 'AS_tcp')
        e.run_only_experiment(e.iperf3_tcp_dw_SA, 'SA_tcp')
        #e.run_only_experiment(e.iperf_tcp_up_AS, 'AS_tcp')
        #e.run_only_experiment(e.iperf_tcp_dw_SA, 'SA_tcp')

        e.parallel = 0
        e.run_only_experiment(e.iperf_udp_up_AS, 'AS_udp')
        e.run_only_experiment(e.iperf_udp_dw_SA, 'SA_udp')

        time.sleep(5)

    print "DONE ", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    endtime = time.time()
    print "\n Total time taken = ", endtime - starttime

    e.transfer_all_later()

    e.kill_all(1)
    e.clear_all()

    endtime2 = time.time()
    print "\n Total transfer time = ", endtime2 - endtime

    return e
def real_measurements(calibrate=False, timeout=5):

    measurement_folder_name = raw_input('Enter measurement name: ')
    tot_runs = raw_input('how many runs? each run should last around 5-6 mins - I suggest at least 30 with laptop in the same location. ')

    try:
        tot_runs = int(tot_runs)
    except Exception:
        tot_runs = 1
        print "Error. Running "+str(tot_runs)+" measurement."


    e = Experiment(measurement_folder_name)
    e.collect_calibrate = calibrate

    e.use_iperf_timeout = 1
    e.timeout = timeout
    e.tcpdump = 0

    for nruns in range(tot_runs):
        print "\n\t\tRUN : " + str(nruns) + "\n"

        print time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(time.time())) + ": Run Experiment Suit"
        if e.collect_calibrate:
            e.run_calibrate()                       # 120 + 20 = 140 s
        else:
            print "not doing calibrate"

        print time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(time.time())) + ": Run no traff " +str(e.experiment_counter)
        e.run_experiment(e.no_traffic, 'no_tra')

        e.get_udpprobe_rate()
        real_udp_perf(e)
        real_tcp_perf(e)
        real_udp_probes(e)
        e.blast=1
        #e.set_udp_rate_mbit(100,100,300)
        real_udp_perf(e)
        e.blast=0

        e.increment_experiment_counter()
        print time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(time.time())) + ": Wait 5 sec before next run"
        time.sleep(5)                          # 1 s wait before next suit

    e.transfer_all_later()

    e.kill_all(1)
    e.clear_all()
    return e
def wired_simulation_testbed(rates, delays, tot_runs):

    client_int = 'eth0'
    router_int = 'eth0'

    for rate in rates:
        for delay in delays:
            Q = Router('192.168.1.1', 'root', 'passw0rd')
            if rate != 0:
                Q.remoteCommand('sh ratelimit3.sh eth0 '+str(rate))
                Q.remoteCommand('sh ratelimit3.sh eth1 '+str(rate))
                Q.remoteCommand('tc qdisc del dev eth0 root')
                Q.remoteCommand('tc qdisc del dev eth1 root')
            Q.host.close()

            R = remove_tc_shaping(client_int, router_int)
            if delay != 0:
                subprocess.check_output('tc qdisc add dev '+client_int+' root netem delay ' +str(delay)+ 'ms', shell=True)
                R.remoteCommand('tc qdisc add dev '+router_int+' root netem delay ' +str(delay)+ 'ms')
            R.host.close()

            measurement_folder_name = 'wired_delay_'+str(int(2*delay))+'_access_'+str(rate)
            print "\n\t\t START " + measurement_folder_name + "\n"
            time.sleep(5)

            e = Experiment(measurement_folder_name)
            e.collect_calibrate = False

            for nruns in range(tot_runs):
                print "\n\t\t RUN : " + str(nruns) + " DELAY : " + str(delay) + " ACCESS LINK RATE : " + str(rate) + "\n"
                experiment_suit(e)
                time.sleep(1)

            # transfer all with no delay and no shaping
            R = remove_tc_shaping(client_int, router_int)
            R.host.close()
            Q = Router('192.168.1.1', 'root', 'passw0rd')
            Q.remoteCommand('tc qdisc del dev eth0 root')
            Q.remoteCommand('tc qdisc del dev eth1 root')
            Q.host.close()

            e.kill_all()
            e.clear_all()
            e.transfer_all_later()

            print "\n\t\t DONE " + measurement_folder_name + "\n"

    return e
def measure_iperf_udp_bandwidth_ratios(measurement_folder_name, tot_runs, timeout, calibrate=False):
    e = Experiment(measurement_folder_name)
    e.collect_calibrate = calibrate

    e.use_iperf_timeout = 1
    e.timeout = timeout
    e.tcpdump = 1
    e.parallel = 0
    e.udp = 1

    for nruns in range(tot_runs):
        print "\n\t\tUDP duration: "+str(timeout)+"; RUN : " + str(nruns) + "\n"

        print time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(time.time())) + ": Run Experiment Suit"
        if e.collect_calibrate:
            e.run_calibrate()                       # 120 + 20 = 140 s
        else:
            print "not doing calibrate"

        print time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(time.time())) + ": Run no traff " +str(e.experiment_counter)
        e.run_experiment(e.no_traffic, 'no_tra')

        e.set_udp_rate_mbit(10,10,10)
        #real_udp_perf(e)
        real_udp_perf2(e)
        e.set_udp_rate_mbit(100,100,100)
        #real_udp_perf(e)
        real_udp_perf2(e)

        #SHAPERPROBE
        #real_udp_probes(e)
        #e.get_udpprobe_rate(1)
        #real_udp_perf(e)
        #e.get_udpprobe_rate(0)
        #real_udp_perf(e)

        e.increment_experiment_counter()
        print time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(time.time())) + ": Wait 5 sec before next run"
        time.sleep(5)                          # 1 s wait before next suit

    e.transfer_all_later()

    e.kill_all(1)
    e.clear_all()

    return
def test_measurements(tot_runs, rate, timeout, comment=''):

    rate_bit = str(rate * 8)
    timeout_sec = str(timeout)
    rate_byte = str(rate)
    Q = Router('192.168.1.1', 'root', 'passw0rd')

    if rate != 0 and rate_byte != '0':
        Q.remoteCommand('sh ratelimit3.sh eth0 '+rate_byte)
        Q.remoteCommand('sh ratelimit3.sh eth1 '+rate_byte)
        Q.remoteCommand('tc qdisc del dev br-lan root;tc qdisc add dev br-lan root netem delay 40ms;tc qdisc show dev br-lan')
    else:
        Q.remoteCommand('tc qdisc del dev eth0 root')
        Q.remoteCommand('tc qdisc del dev eth1 root')
        #Q.remoteCommand('tc qdisc del dev br-lan root')

    Q.host.close()

    if comment != '':
        e = Experiment('hnl1_access_'+rate_bit+'Mbps_timeout_'+timeout_sec+'_'+comment)
    else:
        e = Experiment('hnl1_access_'+rate_bit+'Mbps_timeout_'+timeout_sec)

    e.collect_calibrate = False
    e.set_udp_rate_mbit(rate * 8)
    e.set_test_timeout(timeout)
    e.set_test_timeout(timeout)

    for nruns in range(tot_runs):
        print "\n\t\t RUN : " + str(nruns) + " rate : " + rate_bit + "Mbps\n"
        experiment_suit_testbed_all(e)
        #experiment_suit_testbed_udp(e)
        time.sleep(1)

    Q = Router('192.168.1.1', 'root', 'passw0rd')
    Q.remoteCommand('tc qdisc del dev eth0 root')
    Q.remoteCommand('tc qdisc del dev eth1 root')
    Q.remoteCommand('tc qdisc del dev br-lan root')
    Q.host.close()

    e.transfer_all_later()

    e.kill_all()
    e.clear_all()

    return e
def measure_iperf_sizes(folder_name, tot_runs, to, bits, calibrate=False):

    e = Experiment(folder_name)
    e.collect_calibrate = calibrate

    e.use_iperf_timeout = 0
    e.timeout = to

    e.num_bits_to_send = bits

    for nruns in range(tot_runs):
        print "\n\t\tbits: "+bits+"; RUN : " + str(nruns) + "\n"

        experiment_suit_real_all(e)
        time.sleep(1)

    e.transfer_all_later()

    e.kill_all(1)
    e.clear_all()
    return e
def measure_iperf_tcp_duration_streams(folder_name, tot_runs, timeout, num_par=10, calibrate=False):

    e = Experiment(folder_name)
    e.collect_calibrate = calibrate

    e.use_iperf_timeout = 1
    e.timeout = timeout
    e.num_parallel_streams = num_par

    for nruns in range(tot_runs):
        print "\n\t\tduration: "+str(timeout)+"; parallel: "+str(num_par)+"; RUN: " + str(nruns) + "\n"
        experiment_suit_real_all(e)
        #print time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(time.time())) + ": Run netperf AR " +str(e.experiment_counter)
        #e.run_only_experiment(e.netperf_tcp_up_AR, 'AR_tcp')
        #print time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(time.time())) + ": Run netperf RA " +str(e.experiment_counter)
        #e.run_only_experiment(e.netperf_tcp_dw_RA, 'RA_tcp')
        time.sleep(1)

    e.transfer_all_later()

    e.kill_all(1)
    e.clear_all()
    return e