summaryrefslogtreecommitdiffstats
path: root/src/stateless/dp/trex_stateless_dp_core.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/stateless/dp/trex_stateless_dp_core.cpp')
-rw-r--r--src/stateless/dp/trex_stateless_dp_core.cpp140
1 files changed, 121 insertions, 19 deletions
diff --git a/src/stateless/dp/trex_stateless_dp_core.cpp b/src/stateless/dp/trex_stateless_dp_core.cpp
index dd4937cd..585ff2c7 100644
--- a/src/stateless/dp/trex_stateless_dp_core.cpp
+++ b/src/stateless/dp/trex_stateless_dp_core.cpp
@@ -106,12 +106,56 @@ std::string CGenNodeStateless::get_stream_state_str(stream_state_t stream_state)
}
+rte_mbuf_t * CGenNodeStateless::alloc_node_with_vm(){
+
+ rte_mbuf_t * m;
+ /* alloc small packet buffer*/
+ uint16_t prefix_size = prefix_header_size();
+ m = CGlobalInfo::pktmbuf_alloc( get_socket_id(), prefix_size );
+ if (m==0) {
+ return (m);
+ }
+ /* TBD remove this, should handle cases of error */
+ assert(m);
+ char *p=rte_pktmbuf_append(m, prefix_size);
+ memcpy( p ,m_original_packet_data_prefix, prefix_size);
+
+
+ /* run the VM program */
+ StreamDPVmInstructionsRunner runner;
+
+ runner.run( m_vm_program_size,
+ m_vm_program,
+ m_vm_flow_var,
+ (uint8_t*)p);
+
+
+ rte_mbuf_t * m_const = get_const_mbuf();
+ if ( m_const != NULL) {
+ utl_rte_pktmbuf_add_after(m,m_const);
+ }
+ return (m);
+}
+
+
void CGenNodeStateless::free_stl_node(){
/* if we have cache mbuf free it */
rte_mbuf_t * m=get_cache_mbuf();
if (m) {
rte_pktmbuf_free(m);
m_cache_mbuf=0;
+ }else{
+ /* non cache - must have an header */
+ m=get_const_mbuf();
+ if (m) {
+ rte_pktmbuf_free(m); /* reduce the ref counter */
+ }
+ free_prefix_header();
+ }
+ if (m_vm_flow_var) {
+ /* free flow var */
+ free(m_vm_flow_var);
+ m_vm_flow_var=0;
}
}
@@ -139,7 +183,7 @@ bool TrexStatelessDpPerPort::resume_traffic(uint8_t port_id){
return (true);
}
-bool TrexStatelessDpPerPort::update_traffic(uint8_t port_id, double mul) {
+bool TrexStatelessDpPerPort::update_traffic(uint8_t port_id, double factor) {
assert( (m_state == TrexStatelessDpPerPort::ppSTATE_TRANSMITTING ||
(m_state == TrexStatelessDpPerPort::ppSTATE_PAUSE)) );
@@ -148,7 +192,7 @@ bool TrexStatelessDpPerPort::update_traffic(uint8_t port_id, double mul) {
CGenNodeStateless * node = dp_stream.m_node;
assert(node->get_port_id() == port_id);
- node->set_multiplier(mul);
+ node->update_rate(factor);
}
return (true);
@@ -423,6 +467,7 @@ TrexStatelessDpCore::add_stream(TrexStatelessDpPerPort * lp_port,
CGenNodeStateless *node = m_core->create_node_sl();
/* add periodic */
+ node->m_cache_mbuf=0;
node->m_type = CGenNode::STATELESS_PKT;
node->m_ref_stream_info = stream->clone_as_dp();
@@ -442,6 +487,10 @@ TrexStatelessDpCore::add_stream(TrexStatelessDpPerPort * lp_port,
pkt_dir_t dir = m_core->m_node_gen.m_v_if->port_id_to_dir(stream->m_port_id);
node->m_flags = 0;
+ node->m_src_port =0;
+ node->m_original_packet_data_prefix = 0;
+
+
/* set socket id */
node->set_socket_id(m_core->m_node_gen.m_socket_id);
@@ -453,8 +502,7 @@ TrexStatelessDpCore::add_stream(TrexStatelessDpPerPort * lp_port,
node->m_pause =0;
node->m_stream_type = stream->m_type;
- node->m_base_pps = stream->get_pps();
- node->set_multiplier(comp->get_multiplier());
+ node->m_next_time_offset = 1.0 / stream->get_pps();
/* stateless specific fields */
switch ( stream->m_type ) {
@@ -487,23 +535,77 @@ TrexStatelessDpCore::add_stream(TrexStatelessDpPerPort * lp_port,
node->m_port_id = stream->m_port_id;
- /* allocate const mbuf */
- rte_mbuf_t *m = CGlobalInfo::pktmbuf_alloc(node->get_socket_id(), pkt_size);
- assert(m);
-
- char *p = rte_pktmbuf_append(m, pkt_size);
- assert(p);
- /* copy the packet */
- memcpy(p,stream_pkt,pkt_size);
-
/* set dir 0 or 1 client or server */
node->set_mbuf_cache_dir(dir);
- /* TBD repace the mac if req we should add flag */
- m_core->m_node_gen.m_v_if->update_mac_addr_from_global_cfg(dir, m);
- /* set the packet as a readonly */
- node->set_cache_mbuf(m);
+ if (stream->is_vm() == false ) {
+ /* no VM */
+
+ node->m_vm_flow_var = NULL;
+ node->m_vm_program = NULL;
+ node->m_vm_program_size =0;
+
+ /* allocate const mbuf */
+ rte_mbuf_t *m = CGlobalInfo::pktmbuf_alloc(node->get_socket_id(), pkt_size);
+ assert(m);
+
+ char *p = rte_pktmbuf_append(m, pkt_size);
+ assert(p);
+ /* copy the packet */
+ memcpy(p,stream_pkt,pkt_size);
+
+ /* TBD repace the mac if req we should add flag */
+ m_core->m_node_gen.m_v_if->update_mac_addr_from_global_cfg(dir,(uint8_t*) p);
+
+ /* set the packet as a readonly */
+ node->set_cache_mbuf(m);
+
+ node->m_original_packet_data_prefix =0;
+ }else{
+
+ /* set the program */
+ TrexStream * local_mem_stream = node->m_ref_stream_info;
+
+ StreamVmDp * lpDpVm = local_mem_stream->getDpVm();
+
+ node->m_vm_flow_var = lpDpVm->clone_bss(); /* clone the flow var */
+ node->m_vm_program = lpDpVm->get_program(); /* same ref to the program */
+ node->m_vm_program_size =lpDpVm->get_program_size();
+
+
+ /* we need to copy the object */
+ if ( pkt_size > stream->m_vm_prefix_size ) {
+ /* we need const packet */
+ uint16_t const_pkt_size = pkt_size - stream->m_vm_prefix_size ;
+ rte_mbuf_t *m = CGlobalInfo::pktmbuf_alloc(node->get_socket_id(), const_pkt_size );
+ assert(m);
+
+ char *p = rte_pktmbuf_append(m, const_pkt_size);
+ assert(p);
+
+ /* copy packet data */
+ memcpy(p,(stream_pkt+ stream->m_vm_prefix_size),const_pkt_size);
+
+ node->set_const_mbuf(m);
+ }
+
+
+ if (stream->m_vm_prefix_size > pkt_size ) {
+ stream->m_vm_prefix_size = pkt_size;
+ }
+ /* copy the headr */
+ uint16_t header_size = stream->m_vm_prefix_size;
+ assert(header_size);
+ node->alloc_prefix_header(header_size);
+ uint8_t *p=node->m_original_packet_data_prefix;
+ assert(p);
+
+ memcpy(p,stream_pkt , header_size);
+ /* TBD repace the mac if req we should add flag */
+ m_core->m_node_gen.m_v_if->update_mac_addr_from_global_cfg(dir, p);
+ }
+
CDpOneStream one_stream;
@@ -597,11 +699,11 @@ TrexStatelessDpCore::pause_traffic(uint8_t port_id){
}
void
-TrexStatelessDpCore::update_traffic(uint8_t port_id, double mul) {
+TrexStatelessDpCore::update_traffic(uint8_t port_id, double factor) {
TrexStatelessDpPerPort * lp_port = get_port_db(port_id);
- lp_port->update_traffic(port_id, mul);
+ lp_port->update_traffic(port_id, factor);
}