diff options
author | imarom <imarom@cisco.com> | 2016-08-04 14:13:10 +0300 |
---|---|---|
committer | imarom <imarom@cisco.com> | 2016-08-07 11:47:35 +0300 |
commit | e946a09e5237da5d87048c0f07e0685a99ba193c (patch) | |
tree | 5c58465e78c98a761b3a7d1ad0faae62659d24c7 /src/stateless/dp/trex_stateless_dp_core.cpp | |
parent | fef2d27782b661913f52a0016447bfdcc3ce49af (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.cpp | 39 |
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 */ |