summaryrefslogtreecommitdiffstats
path: root/src/stateless/dp/trex_stateless_dp_core.cpp
diff options
context:
space:
mode:
authorIdo Barnea <ibarnea@cisco.com>2016-06-20 10:58:10 +0300
committerIdo Barnea <ibarnea@cisco.com>2016-06-20 10:58:10 +0300
commitd49f3784270f142825fa4bd4ae96730401a2b871 (patch)
tree351e0ad1e6f8eeebba0ebcdff7afdd1220d087f0 /src/stateless/dp/trex_stateless_dp_core.cpp
parent512d1ebdab4e78acb1bd94f034d0d3fa0a55a462 (diff)
better support for latency with field engine + some order with mbuf functions
Diffstat (limited to 'src/stateless/dp/trex_stateless_dp_core.cpp')
-rw-r--r--src/stateless/dp/trex_stateless_dp_core.cpp35
1 files changed, 18 insertions, 17 deletions
diff --git a/src/stateless/dp/trex_stateless_dp_core.cpp b/src/stateless/dp/trex_stateless_dp_core.cpp
index fe78c5b2..58d8f21a 100644
--- a/src/stateless/dp/trex_stateless_dp_core.cpp
+++ b/src/stateless/dp/trex_stateless_dp_core.cpp
@@ -258,23 +258,20 @@ rte_mbuf_t * CGenNodeStateless::alloc_flow_stat_mbuf(rte_mbuf_t *m, struct flow_
fsp_head = (struct flow_stat_payload_header *)(p + rte_pktmbuf_data_len(m) - fsp_head_size);
return m;
} else {
- // r/w --> read only. Should do something like:
- // Alloc indirect,. make r/w->indirect point to read_only) -> new fsp_header
- // for the mean time, just copy the entire packet.
- m_ret = CGlobalInfo::pktmbuf_alloc( get_socket_id(), rte_pktmbuf_pkt_len(m) );
- assert(m_ret);
- char *p_new = rte_pktmbuf_append(m_ret, rte_pktmbuf_pkt_len(m));
- rte_mbuf_t *m_free = m;
- while (m != NULL) {
- char *p = rte_pktmbuf_mtod(m, char*);
- memcpy(p_new, p, m->data_len);
- p_new += m->data_len;
- m = m->next;
- }
- p_new = rte_pktmbuf_mtod(m_ret, char*);
- fsp_head = (struct flow_stat_payload_header *)(p_new + rte_pktmbuf_data_len(m_ret) - fsp_head_size);
- rte_pktmbuf_free(m_free);
- return m_ret;
+ // We have: r/w --> read only.
+ // Changing to:
+ // (original) r/w -> (new) indirect (direct is original read_only, after trimming last bytes) -> (new) latency info
+ rte_mbuf_t *m_read_only = m->next, *m_indirect;
+
+ m_indirect = CGlobalInfo::pktmbuf_alloc_small(get_socket_id());
+ assert(m_indirect);
+ // alloc mbuf just for the latency header
+ m_lat = CGlobalInfo::pktmbuf_alloc( get_socket_id(), fsp_head_size);
+ assert(m_lat);
+ fsp_head = (struct flow_stat_payload_header *)rte_pktmbuf_append(m_lat, fsp_head_size);
+ utl_rte_pktmbuf_chain_with_indirect(m, m_indirect, m_read_only, m_lat);
+ m_indirect->data_len = (uint16_t)(m_indirect->data_len - fsp_head_size);
+ return m;
}
}
}
@@ -910,6 +907,10 @@ TrexStatelessDpCore::add_stream(TrexStatelessDpPerPort * lp_port,
uint8_t hw_id = stream->m_rx_check.m_hw_id;
assert (hw_id < MAX_FLOW_STATS + MAX_FLOW_STATS_PAYLOAD);
node->set_stat_hw_id(hw_id);
+ // no support for cache with flow stat payload rules
+ if ((TrexPlatformApi::driver_stat_cap_e)stream->m_rx_check.m_rule_type == TrexPlatformApi::IF_STAT_PAYLOAD) {
+ stream->m_cache_size = 0;
+ }
}
/* set socket id */