summaryrefslogtreecommitdiffstats
path: root/src/stateless/dp
diff options
context:
space:
mode:
authorimarom <imarom@cisco.com>2015-10-29 18:15:17 +0200
committerimarom <imarom@cisco.com>2015-10-29 18:15:17 +0200
commit9a820782c35c6de79d2e724a48087e8ee62fc72d (patch)
tree08b13a55cd5eb4f93d51fca5fc373a9c7a9dfb72 /src/stateless/dp
parente0e66e7eef2f9d1f4cb1c93841b2345a42c8d278 (diff)
Hanoch's review comments #1 : fixed performancei issue
with the stateless node
Diffstat (limited to 'src/stateless/dp')
-rw-r--r--src/stateless/dp/trex_stateless_dp_core.cpp43
-rw-r--r--src/stateless/dp/trex_stateless_dp_core.h10
-rw-r--r--src/stateless/dp/trex_stream_node.h104
3 files changed, 109 insertions, 48 deletions
diff --git a/src/stateless/dp/trex_stateless_dp_core.cpp b/src/stateless/dp/trex_stateless_dp_core.cpp
index 73387f0e..9c10504e 100644
--- a/src/stateless/dp/trex_stateless_dp_core.cpp
+++ b/src/stateless/dp/trex_stateless_dp_core.cpp
@@ -21,20 +21,10 @@ limitations under the License.
#include <trex_stateless_dp_core.h>
#include <trex_stateless_messaging.h>
#include <trex_streams_compiler.h>
+#include <trex_stream_node.h>
#include <bp_sim.h>
-/**
- * extended info for the stateless node
- * TODO:
- * static_assert(sizeof(dp_node_extended_info_st) <= sizeof(CGenNodeStateless::m_pad_end), "hello");
- */
-typedef struct dp_node_extended_info_ {
- double next_time_offset;
- uint8_t is_stream_active;
-
-} dp_node_extended_info_st;
-
TrexStatelessDpCore::TrexStatelessDpCore(uint8_t thread_id, CFlowGenListPerThread *core) {
m_thread_id = thread_id;
m_core = core;
@@ -62,29 +52,6 @@ TrexStatelessDpCore::start() {
}
void
-TrexStatelessDpCore::handle_pkt_event(CGenNode *node) {
-
- //TODO: optimize the fast path here...
-
- CGenNodeStateless *node_sl = (CGenNodeStateless *)node;
- dp_node_extended_info_st *opaque = (dp_node_extended_info_st *)node_sl->get_opaque_storage();
-
- /* is this stream active ? */
- if (!opaque->is_stream_active) {
- m_core->free_node(node);
- return;
- }
-
- m_core->m_node_gen.m_v_if->send_node(node);
-
- /* in case of continues */
- node->m_time += opaque->next_time_offset;
-
- /* insert a new event */
- m_core->m_node_gen.m_p_queue.push(node);
-}
-
-void
TrexStatelessDpCore::add_cont_stream(double pps, const uint8_t *pkt, uint16_t pkt_len) {
CGenNodeStateless *node = m_core->create_node_sl();
@@ -100,9 +67,8 @@ TrexStatelessDpCore::add_cont_stream(double pps, const uint8_t *pkt, uint16_t pk
uint16_t pkt_size = pkt_len;
const uint8_t *stream_pkt = pkt;
- dp_node_extended_info_st *opaque = (dp_node_extended_info_st *)node->get_opaque_storage();
- opaque->next_time_offset = 1.0 / pps;
- opaque->is_stream_active = 1;
+ node->m_next_time_offset = 1.0 / pps;
+ node->m_is_stream_active = 1;
/* allocate const mbuf */
rte_mbuf_t *m = CGlobalInfo::pktmbuf_alloc(node->get_socket_id(), pkt_size);
@@ -145,8 +111,7 @@ TrexStatelessDpCore::stop_traffic() {
for every active node - make sure next time
the scheduler invokes it, it will be free */
for (auto node : m_active_nodes) {
- dp_node_extended_info_st *opaque = (dp_node_extended_info_st *)node->get_opaque_storage();
- opaque->is_stream_active = 0;
+ node->m_is_stream_active = 0;
}
m_active_nodes.clear();
diff --git a/src/stateless/dp/trex_stateless_dp_core.h b/src/stateless/dp/trex_stateless_dp_core.h
index d95f7eeb..fa3c5b22 100644
--- a/src/stateless/dp/trex_stateless_dp_core.h
+++ b/src/stateless/dp/trex_stateless_dp_core.h
@@ -29,9 +29,8 @@ limitations under the License.
class TrexStatelessCpToDpMsgBase;
class TrexStatelessDpStart;
class CFlowGenListPerThread;
-class CGenNode;
-class TrexStreamsCompiledObj;
class CGenNodeStateless;
+class TrexStreamsCompiledObj;
class TrexStatelessDpCore {
@@ -52,13 +51,6 @@ public:
void start();
/**
- * handle pkt event
- *
- * @author imarom (27-Oct-15)
- */
- void handle_pkt_event(CGenNode *node);
-
- /**
* dummy traffic creator
*
* @author imarom (27-Oct-15)
diff --git a/src/stateless/dp/trex_stream_node.h b/src/stateless/dp/trex_stream_node.h
new file mode 100644
index 00000000..49481a5c
--- /dev/null
+++ b/src/stateless/dp/trex_stream_node.h
@@ -0,0 +1,104 @@
+/*
+ Itay Marom
+ Cisco Systems, Inc.
+*/
+
+/*
+Copyright (c) 2015-2015 Cisco Systems, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+#ifndef __TREX_STREAM_NODE_H__
+#define __TREX_STREAM_NODE_H__
+
+#include <bp_sim.h>
+
+class TrexStatelessDpCore;
+
+/* this is a event for stateless */
+struct CGenNodeStateless : public CGenNodeBase {
+friend class TrexStatelessDpCore;
+
+private:
+ void * m_cache_mbuf;
+
+ double m_next_time_offset;
+ uint8_t m_is_stream_active;
+
+ /* pad to match the size of CGenNode */
+ uint8_t m_pad_end[39];
+
+
+public:
+
+ inline bool is_active() {
+ return m_is_stream_active;
+ }
+
+
+ /**
+ * main function to handle an event of a packet tx
+ *
+ */
+ inline void handle(CFlowGenListPerThread *thread) {
+
+ thread->m_node_gen.m_v_if->send_node( (CGenNode *)this);
+
+ /* in case of continues */
+ m_time += m_next_time_offset;
+
+ /* insert a new event */
+ thread->m_node_gen.m_p_queue.push( (CGenNode *)this);
+ }
+
+ void set_socket_id(socket_id_t socket){
+ m_socket_id=socket;
+ }
+
+ socket_id_t get_socket_id(){
+ return ( m_socket_id );
+ }
+
+ inline void set_mbuf_cache_dir(pkt_dir_t dir){
+ if (dir) {
+ m_flags |=NODE_FLAGS_DIR;
+ }else{
+ m_flags &=~NODE_FLAGS_DIR;
+ }
+ }
+
+ inline pkt_dir_t get_mbuf_cache_dir(){
+ return ((pkt_dir_t)( m_flags &1));
+ }
+
+
+
+ inline void set_cache_mbuf(rte_mbuf_t * m){
+ m_cache_mbuf=(void *)m;
+ m_flags |= NODE_FLAGS_MBUF_CACHE;
+ }
+
+ inline rte_mbuf_t * get_cache_mbuf(){
+ if ( m_flags &NODE_FLAGS_MBUF_CACHE ) {
+ return ((rte_mbuf_t *)m_cache_mbuf);
+ }else{
+ return ((rte_mbuf_t *)0);
+ }
+ }
+
+
+} __rte_cache_aligned; ;
+
+static_assert(sizeof(CGenNodeStateless) == sizeof(CGenNode), "sizeof(CGenNodeStateless) != sizeof(CGenNode)");
+
+#endif /* __TREX_STREAM_NODE_H__ */