summaryrefslogtreecommitdiffstats
path: root/src/stateless/dp/trex_stateless_dp_core.cpp
diff options
context:
space:
mode:
authorimarom <imarom@cisco.com>2016-08-04 14:13:10 +0300
committerimarom <imarom@cisco.com>2016-08-07 11:47:35 +0300
commite946a09e5237da5d87048c0f07e0685a99ba193c (patch)
tree5c58465e78c98a761b3a7d1ad0faae62659d24c7 /src/stateless/dp/trex_stateless_dp_core.cpp
parentfef2d27782b661913f52a0016447bfdcc3ce49af (diff)
fix for #trex-240
https://trex-tgn.cisco.com/youtrack/issue/trex-240
Diffstat (limited to 'src/stateless/dp/trex_stateless_dp_core.cpp')
-rw-r--r--src/stateless/dp/trex_stateless_dp_core.cpp39
1 files changed, 26 insertions, 13 deletions
diff --git a/src/stateless/dp/trex_stateless_dp_core.cpp b/src/stateless/dp/trex_stateless_dp_core.cpp
index 5ad15033..4d9137f1 100644
--- a/src/stateless/dp/trex_stateless_dp_core.cpp
+++ b/src/stateless/dp/trex_stateless_dp_core.cpp
@@ -149,23 +149,39 @@ void CGenNodeStateless::Dump(FILE *fd){
}
+void CGenNodeStateless::generate_random_seed() {
+ /* seed can be provided by the user */
+ uint32_t unique_seed;
+ if (m_ref_stream_info->m_random_seed) {
+ unique_seed = m_ref_stream_info->m_random_seed;
+ } else {
+ unsigned int tmp = (unsigned int)time(NULL);
+ unique_seed = rand_r(&tmp);
+ }
+
+ /* per thread divergence */
+ unique_seed = (unique_seed * ( (m_thread_id + 1) * 514229 ) ) & 0xFFFFFFFF;
+
+ /* set random */
+ set_random_seed(unique_seed);
+}
-void CGenNodeStateless::refresh_vm_bss(){
+
+void CGenNodeStateless::refresh_vm_bss() {
if ( m_vm_flow_var ) {
StreamVmDp * vm_s=m_ref_stream_info->m_vm_dp;
assert(vm_s);
memcpy(m_vm_flow_var,vm_s->get_bss(),vm_s->get_bss_size());
- if ( vm_s->is_random_seed() ){
- /* if we have random seed for this program */
- if (m_ref_stream_info->m_random_seed) {
- set_random_seed(m_ref_stream_info->m_random_seed);
- }
+ if ( vm_s->is_random_seed() ) {
+ generate_random_seed();
}
+
}
}
+
/**
* this function called when stream restart after it was inactive
*/
@@ -872,6 +888,7 @@ TrexStatelessDpCore::add_stream(TrexStatelessDpPerPort * lp_port,
CGenNodeStateless *node = m_core->create_node_sl();
+ node->m_thread_id = m_thread_id;
node->cache_mbuf_array_init();
node->m_batch_size=0;
@@ -992,13 +1009,9 @@ TrexStatelessDpCore::add_stream(TrexStatelessDpPerPort * lp_port,
node->m_vm_program = lpDpVm->get_program(); /* same ref to the program */
node->m_vm_program_size = lpDpVm->get_program_size();
-
- /* set the random seed if was set */
- if ( lpDpVm->is_random_seed() ){
- /* if we have random seed for this program */
- if (stream->m_random_seed) {
- node->set_random_seed(stream->m_random_seed);
- }
+ /* generate random seed if needed*/
+ if (lpDpVm->is_random_seed()) {
+ node->generate_random_seed();
}
/* we need to copy the object */