Go to the documentation of this file.00001
00002
00003 import sys
00004 import math
00005
00006 def get_projected_link_metrics(bandwidth_limit, latency, loss, packet_size, tx_bandwidth):
00007 bandwidth_limit = float(bandwidth_limit)
00008 tx_bandwidth = float(tx_bandwidth)
00009 if bandwidth_limit == 0.0:
00010 bandwidth_limit = 10000 * 1e6
00011
00012 tx_bandwidth_loss_adjusted = tx_bandwidth * (1 - loss/100.0)
00013
00014 link_saturated = tx_bandwidth_loss_adjusted > bandwidth_limit
00015
00016 proj_bandwidth = min(bandwidth_limit, tx_bandwidth_loss_adjusted)
00017
00018 loss_due_to_saturation = (1 - bandwidth_limit/tx_bandwidth) * 100.0
00019
00020 proj_loss = max(loss_due_to_saturation, loss)
00021
00022 if not link_saturated:
00023 proj_latency = latency
00024 else:
00025 packet_send_time = (8.0 * packet_size) / bandwidth_limit
00026 netem_rule_in_place = (loss != 0.0 or latency != 0.0)
00027
00028 if netem_rule_in_place:
00029 queue_size_in_packets = math.ceil(latency/packet_send_time + 1)
00030 proj_latency = queue_size_in_packets * packet_send_time
00031
00032
00033
00034 if loss > loss_due_to_saturation:
00035 proj_latency = proj_latency * loss/(100.0 - loss_due_to_saturation)
00036 else:
00037 proj_latency = packet_send_time
00038
00039 return (proj_bandwidth, proj_latency, proj_loss)
00040
00041 if __name__ == '__main__':
00042 if len(sys.argv) != 6:
00043 print "Usage: projected_link_metrics.py <bandwidth_limit> <latency> <loss> <packet_size> <tx_bandwidth>\n"
00044 print "bandwidth_limit: simulated link capacity (in bps)"
00045 print "latency: simulated link latency (in seconds)"
00046 print "loss: packet loss (in %, but don't include the % sign)"
00047 print "packet_size: in bytes (NOT bits)"
00048 print "tx_bandwidth: send rate in bps"
00049 print
00050 print "Example: projected_link_metrics.py 1000000 0.01 20.0 1500 1500000"
00051 print "Simulates a link capacity of 1Mbit/s with a 10ms latency and 20% packet loss, packet size of 1500bytes" \
00052 " and data sent at 1.5Mbit/s"
00053 exit(1)
00054
00055 (bandwidth, latency, loss) = get_projected_link_metrics(float(sys.argv[1]), float(sys.argv[2]), float(sys.argv[3]),
00056 int(sys.argv[4]), float(sys.argv[5]))
00057
00058 print "Projected metrics: bandwidth %.2fKbit/s latency %.2fms loss %.2f%%"% \
00059 (bandwidth/1e3, latency*1e3, loss)
00060
00061