TcpHeader.h 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. /*
  2. * Copyright (c) 2021 The Linux Foundation. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions are
  6. * met:
  7. * * Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * * Redistributions in binary form must reproduce the above
  10. * copyright notice, this list of conditions and the following
  11. * disclaimer in the documentation and/or other materials provided
  12. * with the distribution.
  13. * * Neither the name of The Linux Foundation nor the names of its
  14. * contributors may be used to endorse or promote products derived
  15. * from this software without specific prior written permission.
  16. *
  17. * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
  18. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  19. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
  20. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
  21. * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  22. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  23. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  24. * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  25. * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  26. * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  27. * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28. */
  29. #ifndef NETWORK_TRAFFIC_TCPHEADER_H
  30. #define NETWORK_TRAFFIC_TCPHEADER_H
  31. #include "TransportHeader.h"
  32. class TcpHeader: public TransportHeader {
  33. public:
  34. const static unsigned int mSizeBits {160};
  35. const static unsigned int mSize {20};
  36. DECLARE_BITSET(SourcePort, 16, 56789);
  37. DECLARE_BITSET(DestPort, 16, 64886);
  38. DECLARE_BITSET(SequenceNumber, 32, 1077280711);
  39. DECLARE_BITSET(AckNumber, 32, 3090542765);
  40. DECLARE_BITSET(DataOffset, 4, 5);
  41. DECLARE_BITSET(Reserved, 3, 0);
  42. DECLARE_BITSET(NS, 1, 0);
  43. DECLARE_BITSET(CWR, 1, 0);
  44. DECLARE_BITSET(ECE, 1, 0);
  45. DECLARE_BITSET(URG, 1, 0);
  46. DECLARE_BITSET(ACK, 1, 1);
  47. DECLARE_BITSET(PSH, 1, 1);
  48. DECLARE_BITSET(RST, 1, 0);
  49. DECLARE_BITSET(SYN, 1, 0);
  50. DECLARE_BITSET(FIN, 1, 0);
  51. DECLARE_BITSET(WindowSize, 16, 473);
  52. DECLARE_BITSET(Checksum, 16, 0);
  53. DECLARE_BITSET(UrgentPtr, 16, 0);
  54. TcpHeader() = default;
  55. explicit TcpHeader(const uint8_t *start) {
  56. unsigned int bufIndex = 0;
  57. setBitsFromArray<uint8_t, 16>(mSourcePort, start, bufIndex);
  58. setBitsFromArray<uint8_t, 16>(mDestPort, start, bufIndex);
  59. setBitsFromArray<uint8_t, 32>(mSequenceNumber, start, bufIndex);
  60. setBitsFromArray<uint8_t, 32>(mAckNumber, start, bufIndex);
  61. setBitsFromArray<uint8_t, 4>(mDataOffset, start, bufIndex);
  62. setBitsFromArray<uint8_t, 3>(mReserved, start, bufIndex);
  63. setBitsFromArray<uint8_t, 1>(mNS, start, bufIndex);
  64. setBitsFromArray<uint8_t, 1>(mCWR, start, bufIndex);
  65. setBitsFromArray<uint8_t, 1>(mECE, start, bufIndex);
  66. setBitsFromArray<uint8_t, 1>(mURG, start, bufIndex);
  67. setBitsFromArray<uint8_t, 1>(mACK, start, bufIndex);
  68. setBitsFromArray<uint8_t, 1>(mPSH, start, bufIndex);
  69. setBitsFromArray<uint8_t, 1>(mRST, start, bufIndex);
  70. setBitsFromArray<uint8_t, 1>(mSYN, start, bufIndex);
  71. setBitsFromArray<uint8_t, 1>(mFIN, start, bufIndex);
  72. setBitsFromArray<uint8_t, 16>(mWindowSize, start, bufIndex);
  73. setBitsFromArray<uint8_t, 16>(mChecksum, start, bufIndex);
  74. setBitsFromArray<uint8_t, 16>(mUrgentPtr, start, bufIndex);
  75. }
  76. vector<bool> asVector() const override {
  77. vector<bool> outVec;
  78. auto inserter = [](vector<bool>& vec, auto val){
  79. vector<bool> valAsVector = bitsetToVector<val.size()>(val);
  80. vec.insert(vec.end(), valAsVector.begin(), valAsVector.end());};
  81. auto inserter2 = [](vector<bool>& vec, auto val){
  82. vector<bool> valAsVector = bitsetToVector<val.size()>(val);
  83. toggleLsbMsb(valAsVector, CHAR_BIT);
  84. vec.insert(vec.end(), valAsVector.begin(), valAsVector.end());};
  85. inserter2(outVec, mSourcePort);
  86. inserter2(outVec, mDestPort);
  87. inserter2(outVec, mSequenceNumber);
  88. inserter2(outVec, mAckNumber);
  89. vector<bool> v = bitsetToVector<4>(mDataOffset);
  90. vector<bool> v2 = bitsetToVector<3>(mReserved);
  91. v.insert(v.end(), v2.begin(), v2.end());
  92. v2 = bitsetToVector<1>(mNS);
  93. v.insert(v.end(), v2.begin(), v2.end());
  94. outVec.insert(outVec.end(), v.rbegin(), v.rend());
  95. v = bitsetToVector<1>(mCWR);
  96. v2 = bitsetToVector<1>(mECE);
  97. v.insert(v.end(), v2.begin(), v2.end());
  98. v2 = bitsetToVector<1>(mURG);
  99. v.insert(v.end(), v2.begin(), v2.end());
  100. v2 = bitsetToVector<1>(mACK);
  101. v.insert(v.end(), v2.begin(), v2.end());
  102. v2 = bitsetToVector<1>(mPSH);
  103. v.insert(v.end(), v2.begin(), v2.end());
  104. v2 = bitsetToVector<1>(mRST);
  105. v.insert(v.end(), v2.begin(), v2.end());
  106. v2 = bitsetToVector<1>(mSYN);
  107. v.insert(v.end(), v2.begin(), v2.end());
  108. v2 = bitsetToVector<1>(mFIN);
  109. v.insert(v.end(), v2.begin(), v2.end());
  110. outVec.insert(outVec.end(), v.rbegin(), v.rend());
  111. inserter2(outVec, mWindowSize);
  112. inserter2(outVec, mChecksum);
  113. inserter(outVec, mUrgentPtr);
  114. return outVec;
  115. }
  116. uint32_t getSeqNum() const {
  117. return static_cast<uint32_t>(mSequenceNumber.to_ulong());
  118. }
  119. size_t size() const override {
  120. return TcpHeader::mSize;
  121. }
  122. static uint8_t protocolNum(){
  123. return 6;
  124. }
  125. void adjust(uint8_t *checksumBuf, size_t count){
  126. fixChecksum(checksumBuf, count);
  127. }
  128. void zeroChecksum(){
  129. mChecksum = 0;
  130. }
  131. string name() const override {
  132. return string("TCP");
  133. }
  134. void streamFields(std::ostream &out) const override {
  135. out << "Source Port: " << mSourcePort.to_ulong() << ", "
  136. << "Dest Port: " << mDestPort.to_ulong() << ", "
  137. << "Sequence Number: " << mSequenceNumber.to_ulong() << ", "
  138. << "Ack Number: " << mAckNumber.to_ulong() << ", "
  139. << "Data Offset: " << mDataOffset.to_ulong() << ", "
  140. << "Reserved: " << mReserved.to_ulong() << ", "
  141. << "NS: " << mNS.to_ulong() << ", "
  142. << "CWR: " << mCWR.to_ulong() << ", "
  143. << "URG: " << mURG.to_ulong() << ", "
  144. << "ACK: " << mACK.to_ulong() << ", "
  145. << "PSH: " << mPSH.to_ulong() << ", "
  146. << "RST: " << mRST.to_ulong() << ", "
  147. << "SYN: " << mSYN.to_ulong() << ", "
  148. << "FIN: " << mFIN.to_ulong() << ", "
  149. << "Window Size: " << mWindowSize.to_ulong() << ", "
  150. << "Checksum: " << mChecksum.to_ulong() << ", "
  151. << "Urgent Ptr: " << mUrgentPtr << std::endl;
  152. }
  153. struct flags {
  154. bool ns;
  155. bool cwr;
  156. bool ece;
  157. bool urg;
  158. bool ack;
  159. bool psh;
  160. bool rst;
  161. bool syn;
  162. bool fin;
  163. };
  164. flags getFlags() const {
  165. return flags {
  166. .ns = mNS.test(0),
  167. .cwr = mCWR.test(0),
  168. .ece = mECE.test(0),
  169. .urg = mURG.test(0),
  170. .ack = mACK.test(0),
  171. .psh = mPSH.test(0),
  172. .rst = mRST.test(0),
  173. .syn = mSYN.test(0),
  174. .fin = mFIN.test(0)
  175. };
  176. }
  177. private:
  178. void fixChecksum(uint8_t *checksumBuf, size_t count){
  179. mChecksum = 0;
  180. mChecksum = computeChecksum(reinterpret_cast<uint16_t*>(checksumBuf), count);
  181. }
  182. };
  183. #endif //NETWORK_TRAFFIC_TCPHEADER_H