summaryrefslogtreecommitdiffstats
path: root/src/stateless/dp
diff options
context:
space:
mode:
authorHanoh Haim <hhaim@cisco.com>2015-12-15 14:45:55 +0200
committerHanoh Haim <hhaim@cisco.com>2015-12-15 14:45:55 +0200
commite7ffce7b0317f9861264b17d003b22915177de33 (patch)
treeccf0b538a8bfbabb476f4f6e9b02139eb17dc11b /src/stateless/dp
parente263b80e39391a7552d9b9f56940e4fe4a9c3fbc (diff)
first test works
Diffstat (limited to 'src/stateless/dp')
-rw-r--r--src/stateless/dp/trex_stateless_dp_core.cpp36
-rw-r--r--src/stateless/dp/trex_stream_node.h11
2 files changed, 40 insertions, 7 deletions
diff --git a/src/stateless/dp/trex_stateless_dp_core.cpp b/src/stateless/dp/trex_stateless_dp_core.cpp
index 142b38bf..585ff2c7 100644
--- a/src/stateless/dp/trex_stateless_dp_core.cpp
+++ b/src/stateless/dp/trex_stateless_dp_core.cpp
@@ -120,7 +120,15 @@ rte_mbuf_t * CGenNodeStateless::alloc_node_with_vm(){
char *p=rte_pktmbuf_append(m, prefix_size);
memcpy( p ,m_original_packet_data_prefix, prefix_size);
- /* TBD run VM on the pointer p */
+
+ /* 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) {
@@ -144,7 +152,11 @@ void CGenNodeStateless::free_stl_node(){
}
free_prefix_header();
}
-
+ if (m_vm_flow_var) {
+ /* free flow var */
+ free(m_vm_flow_var);
+ m_vm_flow_var=0;
+ }
}
@@ -527,7 +539,13 @@ TrexStatelessDpCore::add_stream(TrexStatelessDpPerPort * lp_port,
node->set_mbuf_cache_dir(dir);
- if (stream->m_has_vm == false ) {
+ 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);
@@ -545,8 +563,18 @@ TrexStatelessDpCore::add_stream(TrexStatelessDpPerPort * lp_port,
node->m_original_packet_data_prefix =0;
}else{
- /* we need to copy the object */
+ /* 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 ;
diff --git a/src/stateless/dp/trex_stream_node.h b/src/stateless/dp/trex_stream_node.h
index fc7d7a44..d33785fe 100644
--- a/src/stateless/dp/trex_stream_node.h
+++ b/src/stateless/dp/trex_stream_node.h
@@ -93,15 +93,20 @@ private:
uint32_t m_multi_bursts; /* in case of multi_burst how many bursts */
/* cache line 1 */
- TrexStream * m_ref_stream_info; /* the stream info */
+ TrexStream * m_ref_stream_info; /* the stream info */
CGenNodeStateless * m_next_stream;
uint8_t * m_original_packet_data_prefix; /* pointer to the original first pointer 64/128/512 */
- /* pad to match the size of CGenNode */
- uint8_t m_pad_end[48];
+ /* Fast Field VM section */
+ uint8_t * m_vm_flow_var; /* pointer to the vm flow var */
+ uint8_t * m_vm_program; /* pointer to the program */
+ uint16_t m_vm_program_size; /* up to 64K op codes */
+ /* End Fast Field VM Section */
+ /* pad to match the size of CGenNode */
+ uint8_t m_pad_end[30];
public: