summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYaroslav Brustinov <ybrustin@cisco.com>2016-02-23 08:35:10 -0500
committerYaroslav Brustinov <ybrustin@cisco.com>2016-02-23 08:35:10 -0500
commit66bebea92f15db3ccf055814ab48cda24477fa9d (patch)
treeeb53bc0137f4bca3beb9237fd37bd09ec4f240fa /src
parentee91690697d026c168de223f0b6b61c2e59e76ad (diff)
parent36cc1ecef32dcee3640e6ddf96422c07d89777b3 (diff)
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'src')
-rw-r--r--src/sim/trex_sim.h5
-rw-r--r--src/stateless/cp/trex_stateless_port.cpp4
-rw-r--r--src/stateless/cp/trex_stateless_port.h8
-rw-r--r--src/stateless/cp/trex_stream.cpp2
-rw-r--r--src/stateless/cp/trex_stream.h12
-rw-r--r--src/stateless/cp/trex_stream_vm.cpp22
-rw-r--r--src/stateless/cp/trex_stream_vm.h6
7 files changed, 46 insertions, 13 deletions
diff --git a/src/sim/trex_sim.h b/src/sim/trex_sim.h
index 99bfb28e..21498978 100644
--- a/src/sim/trex_sim.h
+++ b/src/sim/trex_sim.h
@@ -111,14 +111,15 @@ public:
int run(int argc, char **argv) {
TrexStatelessCfg cfg;
- cfg.m_port_count = 1;
+ cfg.m_port_count = 2;
cfg.m_rpc_req_resp_cfg = NULL;
cfg.m_rpc_async_cfg = NULL;
cfg.m_rpc_server_verbose = false;
- cfg.m_platform_api = new SimPlatformApi(1);;
+ cfg.m_platform_api = new SimPlatformApi(1);
cfg.m_publisher = NULL;
set_stateless_obj(new TrexStateless(cfg));
+
assert( CMsgIns::Ins()->Create(4) );
int rc = gtest_main(argc, argv);
diff --git a/src/stateless/cp/trex_stateless_port.cpp b/src/stateless/cp/trex_stateless_port.cpp
index 75f77cf7..99b6565c 100644
--- a/src/stateless/cp/trex_stateless_port.cpp
+++ b/src/stateless/cp/trex_stateless_port.cpp
@@ -657,7 +657,7 @@ TrexPortOwner::TrexPortOwner() {
m_is_free = true;
/* for handlers random generation */
- srand(time(NULL));
+ m_seed = time(NULL);
}
/**
@@ -675,7 +675,7 @@ TrexPortOwner::generate_handler() {
/* generate 8 bytes of random handler */
for (int i = 0; i < 8; ++i) {
- ss << alphanum[rand() % (sizeof(alphanum) - 1)];
+ ss << alphanum[rand_r(&m_seed) % (sizeof(alphanum) - 1)];
}
return (ss.str());
diff --git a/src/stateless/cp/trex_stateless_port.h b/src/stateless/cp/trex_stateless_port.h
index a101cef0..49e69757 100644
--- a/src/stateless/cp/trex_stateless_port.h
+++ b/src/stateless/cp/trex_stateless_port.h
@@ -93,6 +93,8 @@ private:
/* handler genereated internally */
std::string m_handler;
+ /* seed for generating random values */
+ unsigned int m_seed;
/* just references defaults... */
static const std::string g_unowned_name;
@@ -442,9 +444,9 @@ public:
static const std::initializer_list<std::string> g_types;
static const std::initializer_list<std::string> g_ops;
- mul_type_e m_type;
- mul_op_e m_op;
- double m_value;
+ mul_type_e m_type;
+ mul_op_e m_op;
+ double m_value;
};
#endif /* __TREX_STATELESS_PORT_H__ */
diff --git a/src/stateless/cp/trex_stream.cpp b/src/stateless/cp/trex_stream.cpp
index 357a2885..f1c93a11 100644
--- a/src/stateless/cp/trex_stream.cpp
+++ b/src/stateless/cp/trex_stream.cpp
@@ -63,7 +63,9 @@ TrexStream::vm_compile() {
}
/* compile */
+ m_vm.set_pkt(m_pkt.binary);
m_vm.compile(m_pkt.len);
+ m_vm.set_pkt(0);
/* create DP object */
m_vm_dp = m_vm.generate_dp_object();
diff --git a/src/stateless/cp/trex_stream.h b/src/stateless/cp/trex_stream.h
index 66f05b16..cc05c198 100644
--- a/src/stateless/cp/trex_stream.h
+++ b/src/stateless/cp/trex_stream.h
@@ -68,22 +68,26 @@ static inline uint16_t get_log2_size(uint16_t size){
* ==>62
*
*/
+
static inline uint16_t calc_writable_mbuf_size(uint16_t max_offset_writable,
uint16_t pkt_size){
- if ( pkt_size<=64 ){
- return (pkt_size);
- }
if (pkt_size<=128) {
return (pkt_size);
}
//pkt_size> 128
+ // if reside is less than 64 keep it as a single packet
uint16_t non_writable = pkt_size - (max_offset_writable +1) ;
if ( non_writable<64 ) {
return (pkt_size);
}
- return(max_offset_writable+1);
+
+ // keep the r/w at least 60 byte
+ if ((max_offset_writable+1)<=60) {
+ return 60;
+ }
+ return max_offset_writable+1;
}
diff --git a/src/stateless/cp/trex_stream_vm.cpp b/src/stateless/cp/trex_stream_vm.cpp
index f83025dd..b0cadfb6 100644
--- a/src/stateless/cp/trex_stream_vm.cpp
+++ b/src/stateless/cp/trex_stream_vm.cpp
@@ -396,8 +396,6 @@ void StreamVm::build_program(){
if (ins_type == StreamVmInstruction::itFIX_IPV4_CS) {
StreamVmInstructionFixChecksumIpv4 *lpFix =(StreamVmInstructionFixChecksumIpv4 *)inst;
- add_field_cnt(lpFix->m_pkt_offset +12);
-
if ( (lpFix->m_pkt_offset + IPV4_HDR_LEN) > m_pkt_size ) {
std::stringstream ss;
@@ -405,6 +403,26 @@ void StreamVm::build_program(){
err(ss.str());
}
+ uint16_t offset_next_layer = IPV4_HDR_LEN;
+
+ if ( m_pkt ){
+ IPHeader * ipv4= (IPHeader *)(m_pkt+lpFix->m_pkt_offset);
+ offset_next_layer = ipv4->getSize();
+ }
+
+ if (offset_next_layer<IPV4_HDR_LEN) {
+ offset_next_layer=IPV4_HDR_LEN;
+ }
+
+ if ( (lpFix->m_pkt_offset + offset_next_layer) > m_pkt_size ) {
+
+ std::stringstream ss;
+ ss << "instruction id '" << ins_id << "' fix ipv4 command offset " << lpFix->m_pkt_offset << "plus "<<offset_next_layer<< " is too high relative to packet size "<< m_pkt_size;
+ err(ss.str());
+ }
+ /* calculate this offset from the packet */
+ add_field_cnt(lpFix->m_pkt_offset + offset_next_layer);
+
StreamDPOpIpv4Fix ipv_fix;
ipv_fix.m_offset = lpFix->m_pkt_offset;
ipv_fix.m_op = StreamDPVmInstructions::ditFIX_IPV4_CS;
diff --git a/src/stateless/cp/trex_stream_vm.h b/src/stateless/cp/trex_stream_vm.h
index 023286d0..0bd00711 100644
--- a/src/stateless/cp/trex_stream_vm.h
+++ b/src/stateless/cp/trex_stream_vm.h
@@ -1408,6 +1408,7 @@ public:
m_split_instr=NULL;
m_is_compiled = false;
+ m_pkt=0;
}
@@ -1511,6 +1512,10 @@ public:
/* raise exception */
void err(const std::string &err);
+ void set_pkt(uint8_t *pkt){
+ m_pkt=pkt;
+ }
+
/**
* return a pointer to a flow var / client var
@@ -1565,6 +1570,7 @@ private:
StreamDPVmInstructions m_instructions;
StreamVmInstructionVar *m_split_instr;
+ uint8_t *m_pkt;