##### v4.5 - Sun Aug 20 04:46:53 PM UTC 2023

- Add VXLAN support (#501)

- Add `FileSniffer` constructor taking a `FILE*` (#499).

- Remove use of deprecated `std::iterator` (#481).

- Add missing `algorithm` header include (#497).

- Validate high order two bits of first dns label octet (#494).

- Use `CMAKE_INSTALL_LIBDIR` in `CONF_CMAKE_INSTALL_DIR` (#472).

- Ignore IPv6 packets with payload after one with no Next Header (#500).

- Fix unqualified `std::move` call warnings on clang (#488).

- Fix incorrect IP address range calculation when using /0 prefix (#484) (#486).

- Fall back to system GTest if available (#473).

- Fix compilation issue on android (#471).

- Fix DNS parser reading garbage on misreported packet size (#468).

- Fix DNS parser misinterpreting bad label size (#466).

##### v4.4 - Thu Feb 17 14:41:59 UTC 2022

- Add RFC8335 extended echo types to `ICMP` and `ICMPv6` (#426)

- Handle loops in DNS name decompression (#444)

- Fix Windows' `interface` macro colliding with uses of that identifier in the code (#458)

- Sending IPv6 packets to a link-scope destination address now uses the right interface index (#448)

- Fix incorrect endian being used for ICMP's `gateway` and `address_mask` (#437)

- Socket in `PacketSender::open_l3_socket` is now closed if `setsockopt` fails (#433)

- Fix various incorrect doxygen documentation comments (#439).

- Fix infinite loop when querying the routing table in \*BSD (#427)

##### v4.3 - Fri Sep 18 03:08:33 UTC 2020

- Assign a PDUType to `Dot11ControlTA` (#420)

- Don't consider IPv6 ESP header a normal extension header (#374)

- Don't include non-existing headers when installed without libpcap (#382)

- Add `IPv6Address::is_local_unicast` (#369)

- Fix memory leak in `PacketWriter` (#343)

- Fix memory leaks in `OfflinePacketFilter` (#343)

- Fix detection of new TCP stream (#335)

- Introduce `TCP::has_flags` (#334)

- Fix padding calculations in RadioTapWriter (#333)

##### v4.2 - Fri Mar  8 04:15:13 UTC 2019

- Updated location of installed CMake files in unix systems (#331)

- Fix check to detect cross compilation (#330)

- Allow getting a PDU's advertised size and use it in `PacketWriter` (#324)

- Install DLLs in right directory (#326)

- Add missing Dot11 tagged option types (#305)

- Add support for DLT_RAW (#313)

- Fix potential invalid memory accesses when parsing RadioTap (#322)

##### v4.1 - Tue Dec 11 02:08:48 UTC 2018

- Fix serialization for QinQ (#316)

- Added base class access specifier for socket_close_error (#306)

- Rewrote hw_address_to_string to not require a stringstream (#299)

- Make RadioTapParser::skip_to_field check for end of buffer (#296)

- Ensure local include directory comes before system. (#293)

- Calculate IP option sizes properly (#288)

- Add parsing of well known IPv6 extension headers (#287)

- Add missing operators to address classes (#275)

- Add version macros in config.h

- Don't assume IPv6 uses ICMPv6 underneath

- Allow users to specify library install dir

- Use Sleep windows function passing milliseconds as parameter

- Implement IPv6::recv_response

- Don't use nullptr in non C++11 code

- Ignore (possibly malformed) options after EOL (#281)

- Don't include dot11.h in tins.h if it is not configured in the library (#277)

- Fix memory leak in PDU's move assignment operator

- Append padding to IPv6 options

##### v4.0 - Mon Dec  4 00:04:30 UTC 2017

- Add parent PDU to each PDU.

- Removed parent PDU parameter on `PDU::write_serialization`.

- Split `utils.h` into multiple files under the `utils` directory.

- Split `internals.h` into multiple files under the `detail` directory.

- Improve compilation times by removing useless include directives.

- Refactor `PDUOption` conversions so that heavy headers are not included in source file.

- Use `std::vector` instead of `std::list` in `TCP`, `IP`, `IPv6`, `DHCP`, `DHCPv6`, `DNS`, `LLC`, `Dot11` and `PPPoE`.

- Improve performance on `IP`, `IPv6` and `TCP` by compiting option sizes during serialization.

- Minor performance improvements in `DNS`.

- Fix `IPv6` next header handling. Now each one contains its own type and the next type is only set during serialization for ease of use.

- Refactor `RadioTap` parsing and serialization using a generic parser/writer.

- Add `BaseSniffer::set_pcap_sniffing_method` to specify whether `pcap_loop` or `pcap_dispatch` should be used when sniffing.

- Use `IFF_POINTOPOINT` on BSD when getting broadcast address for an interface.

- Added cipher and akm suites from 802.11-2016.

- Add IPv6 layer parsing on `Loopback` packets.

- Allow serializing `Loopback` on Windows.

- Use the right flag on `Loopback` for `IPv6`.

- Use the first fragment as a base when reassembling `IP` packets in `IPv4Reassembler`.

- Restructure CMake files removing useless `CMakeLists.txt` in `include` paths.

- Add getter/setter for "more data" field in `Dot11Base`.

- Implemented matching for ND protocol related ICMPv6 messages.

- Ensure TCP::OptionTypes has 8-bit range.

- Add header files into CMake sources so IDE can pick them up.

- Add MPLS "experimental" field.

- Fix dhcpv6::duid_type constructor from duid_ll.

##### v3.5 - Sat Apr  1 09:11:58 PDT 2017

- Added Utils::route6_entries

- Allow masking IPv4/6 and hardware addresses via `operator&`

- Add IPv4Address::from_prefix_length

- Move `stream_id` into a new file and rename it `StreamIdentifier`

- Allow disabling TCPIP classes

- Properly handle out of order SACKs on `AckTracker`

- Move TCP data tracking into a separate class

- Allow constructing `StreamIdentifier` from a `Stream`

- Allow configuring pcap timestamp precision

- Allow building libtins using MinGW

- Allow including libtins using `add_subdirectory` via CMake

- Allow setting customer user data to each TCP stream

- Allow skipping data forward in TCP streams

- Allow attaching to already existing TCP streams

- Fix: AddressRange masks first address as well

- Fix: Add TINS_API to `IPv4Address::operator<<`, `DataTracker` and `AckTracker`

- Fix: Don't always set `key_t` to 0 on `RSNEAPOL`

- Fix: Handle MLDv1 properly on ICMP

- Fix: Make Utils::resolve_hwaddress work on Windows

- Fix: Interface was sometimes considered down when it was up (BSD/Linux)

- Fix: Don't set `Dot1Q`'s payload type if next protocol type is unknown

- Fix: Use recvfrom on BSD/OSX when capturing layer 3 packets

- Fix: Make `Timestamp::current_time` work on Windows

- Fix: Forward `NetworkInterface` argument when calling `PacketSender::send_l2`

- Fix: `Timestamp` overflow issue

- Fix: boost's include directories variable incorrectly used on build system

- Fix: Configuring auto cleanup of `Stream`'s server data not working

- Fix: Set `EthernetII` payload type to `UNKNOWN` if there's no inner PDU

- Fix: Set payload type to 0 if there's no inner PDU in `IP`, `Dot1Q` and `IPv6`

- Fix: Buffer length check issues on `Dot11QosData`

- Fix: Use AF_INET6 flag when opening L3 IPv6 socket

- Fix: Check expecter size properly on `DNS::extract_metadata`

- Fix: several unused parameter warnings

- Fix: CCMP decryption issue when `Dot11QoSData` has a TID != 0

##### v3.4 - Wed Mar  9 20:24:54 PST 2016

- Check the secure bit on HandshakeCapturer to detect 2nd packet

- Add info members directly into NetworkInterface

- Add IPv6 addresses to NetworkInterface::Info

- Make *MemoryStream use size_t rather than uint32_t

- Add WPA2Decrypter callback interface

- Set MACOSX_RPATH to ON

- Don't fail configuration if openssl is missing

- Build layer 5 as RawPDU if IPv6 has fragment header

- Fix examples so they build on gcc 4.6

- Fix flag value for sniffer's immediate mode

- Fix IP fragment reassemble when packet has flags DF+MF

- Add extract_metadata to main PDU classes

- Fix examples to make them work on Windows

- Use timercmp/sub and std::chrono to subtract timevals on PacketSender

- Build examples against local libtins build

- Add uninstall target

- Prefix HAVE_ config.h macros with TINS_

- Use compiler intrinsics to swap bytes

- Use C++11 mode by default

- Add missing TINS_API to PDU classes.

- Extend/fix ICMPv6 enum values and unify naming

- Return an empty string for dot11 ssid, if ssid is present but empty

- Implement new TCP stream follower mechanism

- Use ExternalProject_Add rather than including the gtest directory

- Fix invalid endian on IP fragment offset on OSX

##### v3.3 - Sun Jan 31 21:06:04 PST 2016

- Add TCP connection close example

- Move implementations on utils.h to utils.cpp

- Add ICMPv6 Multicast Listener Query Messages support

- Add ICMPv6 Multicast Listener Report Message support

- Make DNS::Query and DNS::Resource lowercase and deprecate the old names

- Change DNS::query/resource::type to query_type and deprecate old name

- Add DNS Start Of Authority parsing and serialization

- Parse and serialize MX preference field correctly

- Add NetworkInterface::friendly_name to get Windows friendly names

- Mask 16 bits on random number generated on traceroute example

- Fix TCP sequence number addition/subtraction when wrapping around

- Use 802.1ad protocol flag when seralizing stacked Dot1Q

- Code cleanup and use same syntax on the entire project

- Correctly serialize PPPoE session packets

- Fix IPv6 extension headers parsing/serialization

- Include examples before src to avoid duplicate tins target issue

- Add MPLS PDU and hook it up with ICMP extensions

- Set UDP checksum to 0xffff if it's 0

- Don't define TINS_STATIC in config.h

- Fix invalid RSNEAPOL parsing issue

- Remove special clang on OSX case when building gtest

- Update pseudoheader_checksum signature

- Fix overall checksum calculation

- Set ICMP payload length without padding if no extensions are present

- Export classes on Windows shared lib builds

- Use google/googletest submodule and update to HEAD

- Remove unused cassert header inclusions

- Add input/output memory stream classes port PDU classes to use them

- Add extensions for ICMP/ICMPv6

- Fix RSNInformation issues on big endian architectures

- Add IP::fragment_offset and IP::flags

- Don't set Ethernet type if inner PDU type is unknown

- Don't run IP source address overwrite tests on OSX

- Always calculate IP/IPv6 checksum

- Fix invalid constant value on PPPoE

- Define default constructor for PKTAP

- Guard 802.11 parsing code on PPI around HAVE_DOT11

- Fix parsing of Dot11 packets encapsulated on PPI having FCS-at-end

- Fix DataLinkType typo on doxygen docs

- Update docs on sniff_loop handle persistency

- Use uint32_t for DNS resource TTL setter

- Erase streams when they're reassembed on IPv4Reassembler

- Make all exceptions derive from exception_base

- Add remove_option member to IP, TCP, Dot11, ICMPv6, DHCP and DHCPv6

- Allow HW addresses to be 00:00:00:00:00 on NetworkInterface::info

- Increment option size when adding a new DHCPv6 option

- Use NOMINMAX on examples

- Add metric field to RouteEntry

- Allow setting immediate mode on Sniffer

- Use one flags field for all flags on SnifferConfiguration

- Add ICMP responses example

- Add interfaces_info example

- Fix bug on SessionKeys::SessionKeys

- Fix compilation errors on android platform

- Fix example compilation on Windows

- Add PacketWriter::write overload that takes a Packet

- Use different IP addresses on IP tests depending on OS

- Allow retrieving keys on WPA2Decrypter

- Add NetworkInterface::is_up and NetworkInterface::info

- Add NetworkInterface::Info::is_up

- Fix compilation warnings on Windows x64

- Fix FindPCAP.cmake to find winpcap on x64

- Fix more tests warnings triggered on Windows

- Fix tests compilation warnings on Windows

- Fix error on VC triggered by pcap redefining the "inline" keyword

- Soften DNS parsing rules

- Replace WIN32 macro with _WIN32

- Fix IPv6Address::to_string on Windows

- Fix DNS issues triggered on VC

- Add google test as git submodule

- Perserve IP protocol when using RawPDU

- Use pcap_sendpacket by default to send packets on Windows

- Don't allow receiving l2 packets on windows

- Added RadioTap channel map type

- Made rsn_information() a const member function to make Dot11ManagementFrame
immutable

- Ensure HAVE_CXX11 is checked when defining TINS_IS_CXX11

- Use one integer field for all flags on TCP

- Fix invalid DNS IPv4 address parsing on big endian arch

- Don't compile WPA2 test if LIBTINS_ENABLE_WPA2=0

- Add Dot11 radio measurement name corresponding to IEEE 802.11-2012

-------------------------------------------------------------------------------

##### v3.2 - Fri Mar 20 22:12:23 PST 2015

- Added include guard for config.h.

- The functor used on BaseSniffer::sniff_loop can now take a Packet.

- Added mcs, tx_flags, ext and data_retries options to RadioTap.

- Fixed big endian representation of RadioTap header.

- RadioTap's dbm_signal and dbm_noise are now signed.

- RadioTap now throws if an option is not present when getting
its value.

- TKIP decryption now works correctly on packets from AP to STA.

- Added support for PKTAP header.

- Fixed endian issue on IPv4Address::ip_to_int on Windows.

- Fixed IP parsing when total length is 0 due to TCP segmentation offload.

- Re-added support for pkg-config.

- TCPStreamFollower now calls PDU::find_pdu instead of PDU::rfind_pdu.

- Fixed assertion throw caused by DNS parsing on Windows on debug mode.

- Added throw on BSD when trying to send_recv L3 packets.

- Added Loopback::matches_response.

- Removed obsolete autotools files.

- Fixed exception thrown when an interface didn't have an IP address
on NetworkInterface.

- Added NetworkInterface::is_loopback.

- Moved all headers to the directory include/tins.

- Fixed compilation warning on TCPStramFollower due to signed to unsigned
conversion on integral constant.

- BaseSniffer::get_pcap_handle is now public.

- PPPoE session packets are now parsed correctly.

- Fixed invalid Loopback protocol detection on FreeBSD/OSX.

- Fixed OSX IP packet sending issue.

- Added useful constructors to RawPDU.

- Fixed compilation errors on FreeBSD.

- Improved documentation on several classes.

- Fixed parsing bug when allocating IP over IP packets.

- Fixed Windows network interface naming.

- Utils::network_interface returns pcap compatible names on Windows.

- NetworkInterface::name now works on Windows.

- Added documentation generation through the build system.

- Added SnifferConfiguration class.

- Fixed bug on Dot3 serialization.

- Added OfflinePacketFilter class.

- Renamed NOEXCEPT macro to TINS_NOEXCEPT.

- Added DataLinkType class.

- IPv4Address now uses inet_pton when constructing from string.

-------------------------------------------------------------------------------

##### v3.1 - Sun Aug 24 21:39:43 ART 2014

- Fixed ICMPv6 checksum error on serialization.

- Fixed empty domain name encoding on DNS.

- Changed the build system to CMake.

-------------------------------------------------------------------------------

##### v3.0 - Thu Aug  7 21:39:09 ART 2014

- Timestamps can now be constructed from std::chrono::duration.

- Packets can now be constructed from a PDU pointer and take ownership
of it.

- All protocols now set the next layer protocol flag, regardless if
it was already set. This was not done in some protocols,
like EthernetII, and as a consequence if the network layer protocol
was replaced by other, the packet would be serialized incorrectly.

- Fixed invalid parsing of some unknown DNS records.

- Fixed unaligned memory accesses that were not supported under
ARMv4 and ARMv5.

- Added BaseSniffer::set_extract_raw_pdus.

- Reduced minimum automake version to 1.11.

- Added Utils::to_string(PDU::PDUType).

- Fixed error compilations on Windows.

- Fixed ICMPv6 checksum calculation.

- Added method in IP and TCP to emplace an option (C++11 only).

- Added small option optimization to PDUOption.

- Fixed error compilation on RSNInformation.

- Renamed ICMP::check to ICMP::checksum.

- Added Sniffer support to set interface to promiscuous mode.

- TCPStreamFollower now handles overlapping fragments correctly.

- Fixed bugs in TCPStreamFollower which didn't allow it to follow
stream correctly.

- TCPStreamFollower now doesn't clear its state after every call to
TCPStreamFollower::follow_streams.

- Added IPv6 flag check to pdu_flag_to_ip_type.

- Added DHCP::hostname to extract the hostname options.

- Removed extra qualifier on SessionKeys::decrypt_unicast which
produced compilation errors on some platforms.

- PacketSender::send now uses PDU::matches_flag to match specific
PDU types.

- Removed 'no newline at end of file' warnings.

- Fixed bug when calling BIOCIMMEDIATE on *BSD.

- Fixed bug on PacketSender::send_recv which didn't work under *BSD.

- Fixed bug triggered by not including the string header.

-------------------------------------------------------------------------------

##### v2.0 - Thu Jan 23 11:09:38 ART 2014

- DNSResourceRecord was removed. Now DNS records are added using
DNS::Resource.

- tins.h now includes ppi.h.

- Done significant improvements in the speed of DNS parsing.

- Added PDUOption<>::to<> which converts a PDUOption to a specific type.

- Layer 3 packets sent using PacketSender::send_recv for which the
answer is a different PDU type.

- ICMP::gateway now uses IPv4Address.

- Added support for ICMP address mask request/reply.

- Fixed bug in PacketSender when using send_recv and a layer 2 PDU. The
interface in which the packet was sent was not the default_interface
set when the sender was constructed.

- IP packets sent using PacketSender::send_recv now match ICMP
responses.

- Added support for ICMP timestamp request/reply packets.
ICMP::matches_response now works with these types of packets as well.

- Added support for reassembling of fragmented IP packets via the
IPv4Reassembler class.

- Fragmented IP packet's inner_pdu PDUs are not decoded now.

- Added 1000ms as the default read timeout used when calling
pcap_open_live. Added BaseSniffer::set_timeout to modify this parameter.

- Added the --disable-dot11 configure switch.

- Added support for IPSec.

- Fixed bug triggered when ifaddrs::ifa_addr was null in
NetworkInterface::addresses.

- Added another overload of Utils::route_entries which returns the
result either than storing it in a parameter.

- Added ARP monitor, WPS detector, DNS queries sniffer and DNS spoofer
examples.

- Added another Sniffer constructor which doesn't expect the maximum
capture size.

- Added tins_cast as a replacement for dynamic_cast on PDUs.

-------------------------------------------------------------------------------

##### v1.2 - Mon oct  7 23:33:49 ART 2013

- Added BaseSniffer::begin and BaseSniffer::end.

- BaseSniffer::next_packet uses pcap_loop instead of pcap_next, which
doesn't work well on some linux distributions.

- Added PPI PDU class.

- Fixed a bug in EthernetII triggered when the size of the whole frame
was lower than 60 bytes.

- Added AddressRange class and IPv4Address, IPv6Address and
HWAddress<>::operator/.

- Added is_broadcast, is_multicast and is_unicast to IPv4, IPv6
and HWAddress.

- Added is_private and is_loopback methods to IPv4 and IPv6 addresses.

- Done some optimizations on TCP's constructor from buffer.

- Added helper functions to Dot11Data to retrieve the source,
destination and BSSID addresses.

- Fixed bugs in DNS triggered when parsing MX and unknown records.

- BaseSniffer::next_packet now iterates until a valid packet is found.

- TCP::get_flag is now const.

- The --disable-wpa2 now works as expected.

v1.1 - Wed Jun  5 09:03:37 ART 2013

- Implemented std::hash specialization for IPv4, IPv6 and HWAddress<>
types.

- Added a RSNHandshakeCapturer class.

- Added WPA2Decrypter class.

- IEEE 802.11 frames are not parsed if the RadioTap FAILED_FCS flag
is on.

- RadioTap now calculates its size everytime it's serialized.

- Splitted the dot11.h and dot11.cpp files into several files to
speed up compilation times.

- Added HWAddress<>::is_broadcast and HWAddress::operator[].

- Fixed a bug triggered when parsing Dot11QoSData frames.

v1.0 - Tue Apr 23 20:40:57 ART 2013

- Link layer protocol PDUs now don't hold a NetworkInterface. This led
to changes in their constructors.

- Removed the obsolete PDU* parameter taken by several classes'
constructors.

- IP now sets the sender's address automatically when no link layer
PDU is used.

- IP, TCP and UDP now calculate the checksum everytime they're
serialized.

- Added PDU::rfind_pdu.

- Defined several exception types.

- Implemented matches_response on several protocols.

- PacketSender is now movable.

- Added an overload of add_option that takes an rvalue-reference in IP,
TCP, DHCP, ICMPv6 and Dot11.

- Added support for GNU/kFreeBSD.

- Removed several deprecated methods, such as PDU::clone_packet.

- Added PacketSender::send(PDU&, NetworkInterface).

- Normalized the TLV options naming conventions in all of the classes
that used them.

- Added support for Dot1Q, STP, PPPoE protocols.

- Made some important optimizations on PDUOption<>'s constructors.

- Added Utils::resolve_domain and Utils::resolve_domain6

-------------------------------------------------------------------------------

##### v0.3 - Thu Jan 31 16:47:27 ART 2013

- Added IPv6, ICMPv6 and DHCPv6 classes.

- Added support for Loopback interfaces and the Linux Crooked Capture
pseudo protocol.

- Added support for IPv6 records in DNS.

- Added Packet/RefPacket class.

- Added support for FreeBSD, OSX and Windows.

- Added C++11 move semantics to several classes.

- Done a complete rewrite of the build system; it now uses libtool.

- Fixed several bugs in DNS.

-------------------------------------------------------------------------------

##### v0.2 - Sat Oct 20 11:26:40 2012

- Added support for big endian architectures.

- Simplified several interfaces.

- Added IPv4Address and HWAddress class to simplify handling IP and hardware addresses.

- Added NetworkInterface class to abstract network interfaces.

- Added TCPStreamFollower class to follow TCP streams on the fly.

- Added WEPDecrypter class to decrypt WEP-encrypted 802.11 data frames on the fly.

- Added several new PDUs: Loopback, IEEE802_3, LLC, DNS.

- Added support for reading and writing pcap files.

- Moved to BSD-2 license.
