aboutsummaryrefslogtreecommitdiffstats
path: root/resources
diff options
context:
space:
mode:
Diffstat (limited to 'resources')
-rw-r--r--resources/libraries/python/DropRateSearch.py36
-rw-r--r--resources/libraries/python/TrafficGenerator.py16
2 files changed, 29 insertions, 23 deletions
diff --git a/resources/libraries/python/DropRateSearch.py b/resources/libraries/python/DropRateSearch.py
index 354e7d493c..2de8e3c174 100644
--- a/resources/libraries/python/DropRateSearch.py
+++ b/resources/libraries/python/DropRateSearch.py
@@ -109,7 +109,7 @@ class DropRateSearch(object):
@abstractmethod
def measure_loss(self, rate, frame_size, loss_acceptance,
- loss_acceptance_type, traffic_type):
+ loss_acceptance_type, traffic_type, skip_warmup=False):
"""Send traffic from TG and measure count of dropped frames.
:param rate: Offered traffic load.
@@ -117,11 +117,13 @@ class DropRateSearch(object):
:param loss_acceptance: Permitted drop ratio or frames count.
:param loss_acceptance_type: Type of permitted loss.
:param traffic_type: Traffic profile ([2,3]-node-L[2,3], ...).
+ :param skip_warmup: Start TRex without warmup traffic if true.
:type rate: int
:type frame_size: str
:type loss_acceptance: float
:type loss_acceptance_type: LossAcceptanceType
:type traffic_type: str
+ :type traffic_type: bool
:returns: Drop threshold exceeded? (True/False)
:rtype bool
"""
@@ -415,12 +417,11 @@ class DropRateSearch(object):
if prev_rate is None:
self._search_result = SearchResults.FAILURE
self._search_result_rate = None
- return
# else we found the rate, which is value from previous run
else:
self._search_result = SearchResults.SUCCESS
self._search_result_rate = prev_rate
- return
+ return
# there was no loss / loss below acceptance criteria
elif res:
prev_rate = rate
@@ -480,17 +481,20 @@ class DropRateSearch(object):
SearchResults.SUSPICIOUS]:
return self._search_result_rate, self.get_latency()
- def binary_search(self, b_min, b_max, traffic_type, skip_max_rate=False):
+ def binary_search(self, b_min, b_max, traffic_type, skip_max_rate=False,
+ skip_warmup=False):
"""Binary search of rate with loss below acceptance criteria.
:param b_min: Min range rate.
:param b_max: Max range rate.
:param traffic_type: Traffic profile.
:param skip_max_rate: Start with max rate first
+ :param skip_warmup: Start TRex without warmup traffic if true.
:type b_min: float
:type b_max: float
:type traffic_type: str
:type skip_max_rate: bool
+ :type skip_warmup: bool
:returns: nothing
:raises: ValueError if input values are not valid
"""
@@ -502,22 +506,17 @@ class DropRateSearch(object):
if float(b_max) < float(b_min):
raise ValueError("Min rate is greater than max rate")
- # binary search
- if skip_max_rate:
- # rate is half of interval + start of interval
- rate = ((float(b_max) - float(b_min)) / 2) + float(b_min)
- else:
- # rate is max of interval
- rate = float(b_max)
+ # rate is half of interval + start of interval if not using max rate
+ rate = ((float(b_max) - float(b_min)) / 2) + float(b_min) \
+ if skip_max_rate else float(b_max)
+
# rate diff with previous run
rate_diff = abs(self._last_binary_rate - rate)
# convergence criterium
if float(rate_diff) < float(self._binary_convergence_threshold):
- if not self._search_result_rate:
- self._search_result = SearchResults.FAILURE
- else:
- self._search_result = SearchResults.SUCCESS
+ self._search_result = SearchResults.SUCCESS \
+ if self._search_result_rate else SearchResults.FAILURE
return
self._last_binary_rate = rate
@@ -527,17 +526,17 @@ class DropRateSearch(object):
res.append(self.measure_loss(rate, self._frame_size,
self._loss_acceptance,
self._loss_acceptance_type,
- traffic_type))
+ traffic_type, skip_warmup=skip_warmup))
res = self._get_res_based_on_search_type(res)
# loss occurred and it was above acceptance criteria
if not res:
- self.binary_search(b_min, rate, traffic_type, True)
+ self.binary_search(b_min, rate, traffic_type, True, True)
# there was no loss / loss below acceptance criteria
else:
self._search_result_rate = rate
- self.binary_search(rate, b_max, traffic_type, True)
+ self.binary_search(rate, b_max, traffic_type, True, True)
def combined_search(self, start_rate, traffic_type):
"""Combined search of rate with loss below acceptance criteria.
@@ -608,4 +607,3 @@ class DropRateSearch(object):
return abs(num_b - num_a) <= max(rel_tol * max(abs(num_a), abs(num_b)),
abs_tol)
-
diff --git a/resources/libraries/python/TrafficGenerator.py b/resources/libraries/python/TrafficGenerator.py
index f363fe3f55..b7c8d6ef4e 100644
--- a/resources/libraries/python/TrafficGenerator.py
+++ b/resources/libraries/python/TrafficGenerator.py
@@ -33,7 +33,7 @@ class TGDropRateSearchImpl(DropRateSearch):
super(TGDropRateSearchImpl, self).__init__()
def measure_loss(self, rate, frame_size, loss_acceptance,
- loss_acceptance_type, traffic_type):
+ loss_acceptance_type, traffic_type, skip_warmup=False):
"""Runs the traffic and evaluate the measured results.
:param rate: Offered traffic load.
@@ -41,11 +41,13 @@ class TGDropRateSearchImpl(DropRateSearch):
:param loss_acceptance: Permitted drop ratio or frames count.
:param loss_acceptance_type: Type of permitted loss.
:param traffic_type: Traffic profile ([2,3]-node-L[2,3], ...).
+ :param skip_warmup: Start TRex without warmup traffic if true.
:type rate: int
:type frame_size: str
:type loss_acceptance: float
:type loss_acceptance_type: LossAcceptanceType
:type traffic_type: str
+ :type skip_warmup: bool
:returns: Drop threshold exceeded? (True/False)
:rtype: bool
:raises: NotImplementedError if TG is not supported.
@@ -60,9 +62,15 @@ class TGDropRateSearchImpl(DropRateSearch):
raise RuntimeError('TG subtype not defined')
elif tg_instance.node['subtype'] == NodeSubTypeTG.TREX:
unit_rate = str(rate) + self.get_rate_type_str()
- tg_instance.trex_stl_start_remote_exec(self.get_duration(),
- unit_rate, frame_size,
- traffic_type)
+ if skip_warmup:
+ tg_instance.trex_stl_start_remote_exec(self.get_duration(),
+ unit_rate, frame_size,
+ traffic_type,
+ warmup_time=0)
+ else:
+ tg_instance.trex_stl_start_remote_exec(self.get_duration(),
+ unit_rate, frame_size,
+ traffic_type)
loss = tg_instance.get_loss()
sent = tg_instance.get_sent()
if self.loss_acceptance_type_is_percentage():