summaryrefslogtreecommitdiffstats
path: root/src/common
diff options
context:
space:
mode:
authorIdo Barnea <ibarnea@cisco.com>2015-11-29 07:20:23 +0200
committerIdo Barnea <ibarnea@cisco.com>2015-12-01 08:15:12 +0200
commitc181e882312206254ec0c50d5a1cd049780e75ea (patch)
treeb7a52bc63810b22e0de92f30bf0324a29d1c0fd5 /src/common
parenta48cd6471a2d82e5d78e8abe85b065f66a388e11 (diff)
Added ICMP latency packet modes
Diffstat (limited to 'src/common')
-rw-r--r--src/common/Network/Packet/IcmpHeader.h89
-rw-r--r--src/common/Network/Packet/IcmpHeader.inl87
-rwxr-xr-xsrc/common/bitMan.h4
3 files changed, 178 insertions, 2 deletions
diff --git a/src/common/Network/Packet/IcmpHeader.h b/src/common/Network/Packet/IcmpHeader.h
new file mode 100644
index 00000000..99d89329
--- /dev/null
+++ b/src/common/Network/Packet/IcmpHeader.h
@@ -0,0 +1,89 @@
+/*
+Copyright (c) 2015-2015 Cisco Systems, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+#ifndef _ICMP_HEADER_H_
+#define _ICMP_HEADER_H_
+
+#include "PacketHeaderBase.h"
+#include "IPHeader.h"
+
+class ICMPHeader
+{
+
+public:
+ ICMPHeader()
+ {
+ setCode(0);
+ setType(0);
+ setSeqNum(0xDEAD);
+ setId(0xBEEF);
+ setChecksum(0);
+ }
+
+ ICMPHeader(uint8_t argType,
+ uint8_t argCode,
+ uint16_t argId,
+ uint16_t argSeqNum)
+ {
+ setType(argType);
+ setCode(argCode);
+ setId(argId);
+ setSeqNum(argSeqNum);
+ }
+
+
+ inline void setCode(uint8_t data);
+ inline uint8_t getCode();
+
+ inline void setType(uint8_t data);
+ inline uint8_t getType();
+
+ inline void setSeqNum(uint16_t data);
+ inline uint16_t getSeqNum();
+
+ inline void setId(uint16_t data);
+ inline uint16_t getId();
+
+ inline void setChecksum(uint16_t data);
+ inline uint16_t getChecksum();
+
+ inline void updateCheckSum(uint16_t len);
+ inline bool isCheckSumOk(uint16_t len);
+ inline uint16_t calcCheckSum(uint16_t len);
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Common Header Interface
+////////////////////////////////////////////////////////////////////////////////////////
+
+public:
+ inline uint8_t* getPointer (){return (uint8_t*)this;}
+ inline uint32_t getSize (){return 8;}
+
+ void dump (FILE* fd);
+
+private:
+ uint8_t myType;
+ uint8_t myCode;
+ uint16_t myChecksum;
+ uint16_t myId;
+ uint16_t mySeqNum;
+};
+
+
+#include "IcmpHeader.inl"
+
+#endif
diff --git a/src/common/Network/Packet/IcmpHeader.inl b/src/common/Network/Packet/IcmpHeader.inl
new file mode 100644
index 00000000..0e6806f8
--- /dev/null
+++ b/src/common/Network/Packet/IcmpHeader.inl
@@ -0,0 +1,87 @@
+/*
+Copyright (c) 2015-2015 Cisco Systems, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+inline void ICMPHeader::setCode(uint8_t argCode)
+{
+ myCode = argCode;
+}
+
+inline uint8_t ICMPHeader::getCode()
+{
+ return myCode;
+}
+
+inline void ICMPHeader::setType(uint8_t argType)
+{
+ myType = argType;
+}
+
+inline uint8_t ICMPHeader::getType()
+{
+ return myType;
+}
+
+inline void ICMPHeader::setSeqNum(uint16_t argSeqNum)
+{
+ mySeqNum = PKT_NTOHS(argSeqNum);
+}
+
+inline uint16_t ICMPHeader::getSeqNum()
+{
+ return PKT_NTOHS(mySeqNum);
+}
+
+inline void ICMPHeader::setId(uint16_t argId)
+{
+ myId = PKT_NTOHS(argId);
+}
+
+inline uint16_t ICMPHeader::getId()
+{
+ return PKT_NTOHS(myId);
+}
+
+inline void ICMPHeader::setChecksum(uint16_t argNewChecksum)
+{
+ myChecksum = PKT_NTOHS(argNewChecksum);
+}
+
+inline uint16_t ICMPHeader::getChecksum()
+{
+ return PKT_NTOHS(myChecksum);
+}
+
+inline void ICMPHeader::updateCheckSum(uint16_t len)
+{
+ setChecksum(0);// must be here
+
+ myChecksum =calcCheckSum(len);
+}
+
+inline bool ICMPHeader::isCheckSumOk(uint16_t len)
+{
+ uint16_t theChecksum= PKT_NTOHS(calcCheckSum(len));
+
+ return(theChecksum == 0);
+}
+
+// len is in bytes. Including ICMP header + data.
+inline uint16_t ICMPHeader::calcCheckSum(uint16_t len)
+{
+ uint16_t theChecksum = pkt_InetChecksum((uint8_t*)this, len);
+
+ return(theChecksum);
+}
diff --git a/src/common/bitMan.h b/src/common/bitMan.h
index ffa05598..8019b3f7 100755
--- a/src/common/bitMan.h
+++ b/src/common/bitMan.h
@@ -160,8 +160,8 @@ inline void btSetMaskBit32(unsigned int & a,
btSetMaskBit<unsigned int>(a,startbit,stopbit,newVal);
}
-/* start > stop startbit = 10 ,
- stop = 8
+/* Notice:
+ startbit should be bigger (or equal) than stopbit
count like big E