* simplify tcp flag checks, fix stream_follower
On various places was used simple comparison for checking state of flags.
tcp.flags() == (TCP::SYN | TCP::ACK)
This is not what you want usually, because this check is false
in case that another flag is set also. Correct check for syn-ack
packet should be:
(tcp.flags() & (TCP::SYN | TCP::ACK)) == (TCP::SYN | TCP::ACK)
To simplify this kind of check, add new has_flags method:
bool TCP::has_flags(small_uint<12> check_flags) const
* remove duplicate TCP::SYN flag check
When reading TCP packets with esoteric (or corrupt) values for option types, the asan fsanitize=enum will trigger if the read value is not in range of the enum. The range of a classic (pre-C++11) enum with no negative enumerators is determined by the highest bit set in any of its enumerators, so if `TCP::OptionTypes` has highest enumerator `ALTCHK = 14` it cannot take values above 15.
Define enumerators (per IANA) with bit 7 set to ensure that `TCP::OptionTypes` can take any 8-bit value.
An alternative (C++11 only) would be to give `TCP::OptionTypes` underlying type `uint8_t`.
* Remove option size memers on IP/TCP and instead calculate
these when they're needed
* Reorder members on IP/TCP so as to remove/decrease padding
* Move most memory helpers impl into header file so they
can be inlined
* Make PDUOption's move ctor/assignment operator noexcept