From a326463160669807197011436e65ca7789546e31 Mon Sep 17 00:00:00 2001 From: Matias Fontanini Date: Sun, 5 Apr 2015 11:53:12 -0700 Subject: [PATCH] Add one integer field for all flags on TCP. --- include/tins/tcp.h | 56 ++++++++++++++++++++++++++++------------------ src/tcp.cpp | 52 ++++++++++++++++-------------------------- 2 files changed, 53 insertions(+), 55 deletions(-) diff --git a/include/tins/tcp.h b/include/tins/tcp.h index c60f87a..877f501 100644 --- a/include/tins/tcp.h +++ b/include/tins/tcp.h @@ -507,6 +507,32 @@ namespace Tins { return new TCP(*this); } private: + #if TINS_IS_LITTLE_ENDIAN + TINS_BEGIN_PACK + struct flags_type { + uint8_t fin:1, + syn:1, + rst:1, + psh:1, + ack:1, + urg:1, + ece:1, + cwr:1; + } TINS_END_PACK; + #else + TINS_BEGIN_PACK + struct flags_type { + uint8_t cwr:1, + ece:1, + urg:1, + ack:1, + psh:1, + rst:1, + syn:1, + fin:1; + } TINS_END_PACK; + #endif + TINS_BEGIN_PACK struct tcphdr { uint16_t sport; @@ -514,30 +540,16 @@ namespace Tins { uint32_t seq; uint32_t ack_seq; #if TINS_IS_LITTLE_ENDIAN - uint16_t res1:4, - doff:4, - fin:1, - syn:1, - rst:1, - psh:1, - ack:1, - urg:1, - ece:1, - cwr:1; - #elif TINS_IS_BIG_ENDIAN - uint16_t doff:4, - res1:4, - cwr:1, - ece:1, - urg:1, - ack:1, - psh:1, - rst:1, - syn:1, - fin:1; + uint8_t res1:4, + doff:4; #else - #error "Endian is not LE nor BE..." + uint8_t doff:4, + res1:4; #endif + union { + flags_type flags; + uint8_t flags_8; + }; uint16_t window; uint16_t check; uint16_t urg_ptr; diff --git a/src/tcp.cpp b/src/tcp.cpp index 9a3d8b0..3a9065b 100644 --- a/src/tcp.cpp +++ b/src/tcp.cpp @@ -200,28 +200,28 @@ TCP::AltChecksums TCP::altchecksum() const { small_uint<1> TCP::get_flag(Flags tcp_flag) const { switch(tcp_flag) { case FIN: - return _tcp.fin; + return _tcp.flags.fin; break; case SYN: - return _tcp.syn; + return _tcp.flags.syn; break; case RST: - return _tcp.rst; + return _tcp.flags.rst; break; case PSH: - return _tcp.psh; + return _tcp.flags.psh; break; case ACK: - return _tcp.ack; + return _tcp.flags.ack; break; case URG: - return _tcp.urg; + return _tcp.flags.urg; break; case ECE: - return _tcp.ece; + return _tcp.flags.ece; break; case CWR: - return _tcp.cwr; + return _tcp.flags.cwr; break; default: return 0; @@ -230,55 +230,41 @@ small_uint<1> TCP::get_flag(Flags tcp_flag) const { } small_uint<12> TCP::flags() const { - return (_tcp.res1 << 8) | - (_tcp.cwr << 7) | - (_tcp.ece << 6) | - (_tcp.urg << 5) | - (_tcp.ack << 4) | - (_tcp.psh << 3) | - (_tcp.rst << 2) | - (_tcp.syn << 1) | - _tcp.fin; + return (_tcp.res1 << 8) | _tcp.flags_8; } void TCP::set_flag(Flags tcp_flag, small_uint<1> value) { switch(tcp_flag) { case FIN: - _tcp.fin = value; + _tcp.flags.fin = value; break; case SYN: - _tcp.syn = value; + _tcp.flags.syn = value; break; case RST: - _tcp.rst = value; + _tcp.flags.rst = value; break; case PSH: - _tcp.psh = value; + _tcp.flags.psh = value; break; case ACK: - _tcp.ack = value; + _tcp.flags.ack = value; break; case URG: - _tcp.urg = value; + _tcp.flags.urg = value; break; case ECE: - _tcp.ece = value; + _tcp.flags.ece = value; break; case CWR: - _tcp.cwr = value; + _tcp.flags.cwr = value; break; }; } void TCP::flags(small_uint<12> value) { - _tcp.fin = (value & FIN) ? 1 : 0; - _tcp.syn = (value & SYN) ? 1 : 0; - _tcp.rst = (value & RST) ? 1 : 0; - _tcp.psh = (value & PSH) ? 1 : 0; - _tcp.ack = (value & ACK) ? 1 : 0; - _tcp.urg = (value & URG) ? 1 : 0; - _tcp.ece = (value & ECE) ? 1 : 0; - _tcp.cwr = (value & CWR) ? 1 : 0; + _tcp.res1 = (value >> 8) & 0x0f; + _tcp.flags_8 = value & 0xff; } void TCP::add_option(const option &opt) {