From a1364603328fc8295216038c495f929573855a90 Mon Sep 17 00:00:00 2001 From: Hanoh Haim Date: Mon, 28 Dec 2015 23:03:06 +0200 Subject: maximum packet size support 9k - simulation --- src/stateless/dp/trex_stateless_dp_core.cpp | 34 +++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) (limited to 'src/stateless/dp/trex_stateless_dp_core.cpp') 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); } -- cgit 1.2.3-korg From 9e16960d1502524ae00df83e3d1c05ddbb2487c7 Mon Sep 17 00:00:00 2001 From: Hanoh Haim Date: Tue, 29 Dec 2015 00:30:09 +0200 Subject: trim packet size command works --- VERSION | 2 +- .../trex_control_plane/common/trex_streams.py | 13 +++++-------- src/main_dpdk.cpp | 9 ++++++--- src/rpc-server/commands/trex_rpc_cmd_stream.cpp | 17 +++++++++++++++-- src/rpc-server/commands/trex_rpc_cmds.h | 2 ++ src/stateless/dp/trex_stateless_dp_core.cpp | 2 +- 6 files changed, 30 insertions(+), 15 deletions(-) (limited to 'src/stateless/dp/trex_stateless_dp_core.cpp') diff --git a/VERSION b/VERSION index 5a80abed..ab5cfc9e 100755 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -v1.84 +v1.84-rand-pkt diff --git a/scripts/automation/trex_control_plane/common/trex_streams.py b/scripts/automation/trex_control_plane/common/trex_streams.py index 86eee1f4..007e2464 100755 --- a/scripts/automation/trex_control_plane/common/trex_streams.py +++ b/scripts/automation/trex_control_plane/common/trex_streams.py @@ -271,15 +271,12 @@ class CStreamsDB(object): stream_list = CStreamList() loaded_obj = stream_list.load_yaml(filename) - try: - compiled_streams = stream_list.compile_streams() - rc = self.load_streams(stream_pack_name, - LoadedStreamList(loaded_obj, - [StreamPack(v.stream_id, v.stream.dump()) - for k, v in compiled_streams.items()])) + compiled_streams = stream_list.compile_streams() + rc = self.load_streams(stream_pack_name, + LoadedStreamList(loaded_obj, + [StreamPack(v.stream_id, v.stream.dump()) + for k, v in compiled_streams.items()])) - except Exception as e: - return None return self.get_stream_pack(stream_pack_name) diff --git a/src/main_dpdk.cpp b/src/main_dpdk.cpp index 93161074..acee54bf 100755 --- a/src/main_dpdk.cpp +++ b/src/main_dpdk.cpp @@ -2076,10 +2076,12 @@ int CCoreEthIF::send_pkt(CCorePerPort * lp_port, CVirtualIFPerSideStats * lp_stats ){ + //printf(" %lu \n",(ulong)rte_pktmbuf_pkt_len(m)); //rte_pktmbuf_dump(stdout,m, rte_pktmbuf_pkt_len(m)); - lp_stats->m_tx_pkt +=1; - lp_stats->m_tx_bytes += (rte_pktmbuf_pkt_len(m)+4); + /* too expensive remove this for now */ + //lp_stats->m_tx_pkt +=1; + //lp_stats->m_tx_bytes += (rte_pktmbuf_pkt_len(m)+4); uint16_t len = lp_port->m_len; lp_port->m_table[len]=m; @@ -2144,6 +2146,7 @@ int CCoreEthIFStateless::send_node(CGenNode * no){ m=node_sl->alloc_node_with_vm(); assert(m); } + send_pkt(lp_port,m,lp_stats); return (0); @@ -4737,7 +4740,7 @@ int main_test(int argc , char * argv[]){ /* TBD_FDIR */ -#if 1 +#if 0 printf(" test_send \n"); g_trex.test_send(); exit(1); diff --git a/src/rpc-server/commands/trex_rpc_cmd_stream.cpp b/src/rpc-server/commands/trex_rpc_cmd_stream.cpp index 51db0b20..95cd895b 100644 --- a/src/rpc-server/commands/trex_rpc_cmd_stream.cpp +++ b/src/rpc-server/commands/trex_rpc_cmd_stream.cpp @@ -175,6 +175,16 @@ TrexRpcCmdAddStream::parse_vm_instr_checksum(const Json::Value &inst, TrexStream stream->m_vm.add_instruction(new StreamVmInstructionFixChecksumIpv4(pkt_offset)); } + +void +TrexRpcCmdAddStream::parse_vm_instr_trim_pkt_size(const Json::Value &inst, TrexStream *stream, Json::Value &result){ + + std::string flow_var_name = parse_string(inst, "name", result); + + stream->m_vm.add_instruction(new StreamVmInstructionChangePktSize(flow_var_name)); +} + + void TrexRpcCmdAddStream::parse_vm_instr_tuple_flow_var(const Json::Value &inst, TrexStream *stream, Json::Value &result){ @@ -255,7 +265,7 @@ TrexRpcCmdAddStream::parse_vm(const Json::Value &vm, TrexStream *stream, Json::V for (int i = 0; i < instructions.size(); i++) { const Json::Value & inst = parse_object(instructions, i, result); - auto vm_types = {"fix_checksum_ipv4", "flow_var", "write_flow_var","tuple_flow_var"}; + auto vm_types = {"fix_checksum_ipv4", "flow_var", "write_flow_var","tuple_flow_var","trim_pkt_size"}; std::string vm_type = parse_choice(inst, "type", vm_types, result); // checksum instruction @@ -269,7 +279,10 @@ TrexRpcCmdAddStream::parse_vm(const Json::Value &vm, TrexStream *stream, Json::V parse_vm_instr_write_flow_var(inst, stream, result); } else if (vm_type == "tuple_flow_var") { - parse_vm_instr_tuple_flow_var(inst, stream, result); + parse_vm_instr_tuple_flow_var(inst, stream, result); + + } else if (vm_type == "trim_pkt_size") { + parse_vm_instr_trim_pkt_size(inst, stream, result); } else { /* internal error */ throw TrexRpcException("internal error"); diff --git a/src/rpc-server/commands/trex_rpc_cmds.h b/src/rpc-server/commands/trex_rpc_cmds.h index f4651d7b..b1750053 100644 --- a/src/rpc-server/commands/trex_rpc_cmds.h +++ b/src/rpc-server/commands/trex_rpc_cmds.h @@ -96,6 +96,8 @@ void parse_vm(const Json::Value &vm, TrexStream *stream, Json::Value &result); void parse_vm_instr_checksum(const Json::Value &inst, TrexStream *stream, Json::Value &result); void parse_vm_instr_flow_var(const Json::Value &inst, TrexStream *stream, Json::Value &result); void parse_vm_instr_tuple_flow_var(const Json::Value &inst, TrexStream *stream, Json::Value &result); +void parse_vm_instr_trim_pkt_size(const Json::Value &inst, TrexStream *stream, Json::Value &result); + void parse_vm_instr_write_flow_var(const Json::Value &inst, TrexStream *stream, Json::Value &result); ); diff --git a/src/stateless/dp/trex_stateless_dp_core.cpp b/src/stateless/dp/trex_stateless_dp_core.cpp index 6e936fc8..4e814d4c 100644 --- a/src/stateless/dp/trex_stateless_dp_core.cpp +++ b/src/stateless/dp/trex_stateless_dp_core.cpp @@ -171,7 +171,7 @@ rte_mbuf_t * CGenNodeStateless::alloc_node_with_vm(){ 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); + utl_rte_pktmbuf_add_after2(m,mi); if ( pkt_new_size < m->pkt_len) { /* need to trim it */ -- cgit 1.2.3-korg