summaryrefslogtreecommitdiffstats
path: root/src/stateless/dp
diff options
context:
space:
mode:
authorHanoh Haim <hhaim@cisco.com>2015-12-28 23:03:06 +0200
committerHanoh Haim <hhaim@cisco.com>2015-12-28 23:03:06 +0200
commita1364603328fc8295216038c495f929573855a90 (patch)
tree7bad267533bf73344f54d9576f021dd917c2e85f /src/stateless/dp
parent97e5e483633ed4263822a625374131f258f6f377 (diff)
maximum packet size support 9k - simulation
Diffstat (limited to 'src/stateless/dp')
-rw-r--r--src/stateless/dp/trex_stateless_dp_core.cpp34
-rw-r--r--src/stateless/dp/trex_stream_node.h12
2 files changed, 43 insertions, 3 deletions
diff --git a/src/stateless/dp/trex_stateless_dp_core.cpp b/src/stateless/dp/trex_stateless_dp_core.cpp
index c211b9f5..6e936fc8 100644
--- a/src/stateless/dp/trex_stateless_dp_core.cpp
+++ b/src/stateless/dp/trex_stateless_dp_core.cpp
@@ -149,10 +149,34 @@ rte_mbuf_t * CGenNodeStateless::alloc_node_with_vm(){
m_vm_flow_var,
(uint8_t*)p);
+ uint16_t pkt_new_size=runner.get_new_pkt_size();
+ if ( likely( pkt_new_size == 0) ) {
+ /* no packet size change */
+ rte_mbuf_t * m_const = get_const_mbuf();
+ if ( m_const != NULL) {
+ utl_rte_pktmbuf_add_after(m,m_const);
+ }
+ return (m);
+ }
+ /* packet size change there are a few changes */
rte_mbuf_t * m_const = get_const_mbuf();
- if ( m_const != NULL) {
- utl_rte_pktmbuf_add_after(m,m_const);
+ if ( (m_const == 0 ) || (pkt_new_size<=prefix_size) ) {
+ /* one mbuf , just trim it */
+ m->data_len = pkt_new_size;
+ m->pkt_len = pkt_new_size;
+ return (m);
+ }
+
+ rte_mbuf_t * mi= CGlobalInfo::pktmbuf_alloc_small(get_socket_id());
+ assert(mi);
+ rte_pktmbuf_attach(mi,m_const);
+ utl_rte_pktmbuf_add_after(m,mi);
+
+ if ( pkt_new_size < m->pkt_len) {
+ /* need to trim it */
+ mi->data_len = (pkt_new_size - prefix_size);
+ m->pkt_len = pkt_new_size;
}
return (m);
}
@@ -614,6 +638,12 @@ TrexStatelessDpCore::add_stream(TrexStatelessDpPerPort * lp_port,
}
+ if ( lpDpVm->is_pkt_size_var() ) {
+ // mark the node as varible size
+ node->set_var_pkt_size();
+ }
+
+
if (lpDpVm->get_prefix_size() > pkt_size ) {
lpDpVm->set_prefix_size(pkt_size);
}
diff --git a/src/stateless/dp/trex_stream_node.h b/src/stateless/dp/trex_stream_node.h
index 70a66e6a..dfa4cc13 100644
--- a/src/stateless/dp/trex_stream_node.h
+++ b/src/stateless/dp/trex_stream_node.h
@@ -60,7 +60,9 @@ public:
SL_NODE_FLAGS_DIR =1, //USED by master
SL_NODE_FLAGS_MBUF_CACHE =2, //USED by master
- SL_NODE_CONST_MBUF =4
+ SL_NODE_CONST_MBUF =4,
+
+ SL_NODE_VAR_PKT_SIZE =8
};
@@ -282,6 +284,14 @@ public:
}
}
+ inline void set_var_pkt_size(){
+ m_flags |= SL_NODE_VAR_PKT_SIZE;
+ }
+
+ inline bool is_var_pkt_size(){
+ return ( ( m_flags &SL_NODE_VAR_PKT_SIZE )?true:false);
+ }
+
inline void set_const_mbuf(rte_mbuf_t * m){
m_cache_mbuf=(void *)m;
m_flags |= SL_NODE_CONST_MBUF;