summaryrefslogtreecommitdiffstats
path: root/src/stateless/cp/trex_stream_vm.cpp
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/stateless/cp/trex_stream_vm.cpp
parentee91690697d026c168de223f0b6b61c2e59e76ad (diff)
parent36cc1ecef32dcee3640e6ddf96422c07d89777b3 (diff)
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'src/stateless/cp/trex_stream_vm.cpp')
-rw-r--r--src/stateless/cp/trex_stream_vm.cpp22
1 files changed, 20 insertions, 2 deletions
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;