summaryrefslogtreecommitdiffstats
path: root/src/stateless/dp/trex_stateless_dp_core.cpp
diff options
context:
space:
mode:
authorHanoh Haim <hhaim@cisco.com>2016-01-05 20:51:47 +0200
committerHanoh Haim <hhaim@cisco.com>2016-01-05 20:51:47 +0200
commit5f07d1062309eea31e47a6d9ab23bb1c94de5c83 (patch)
tree667326ce482b79d9626badb80d8562a9ecf7551b /src/stateless/dp/trex_stateless_dp_core.cpp
parentc905d6b0845e79dbc5d5d37eee560d1dbc58b6ff (diff)
parentd6be4b0e8a2cd92b5e6c455532431897f76331fe (diff)
Merge branch 'random_pkt'
Diffstat (limited to 'src/stateless/dp/trex_stateless_dp_core.cpp')
-rw-r--r--src/stateless/dp/trex_stateless_dp_core.cpp34
1 files changed, 32 insertions, 2 deletions
diff --git a/src/stateless/dp/trex_stateless_dp_core.cpp b/src/stateless/dp/trex_stateless_dp_core.cpp
index 0a9a88ab..a80efc08 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_after2(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);
}
@@ -617,6 +641,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);
}