_ZN4pcpp5alignILi4EEEii:
   51|  29.8k|	{
   52|       |		// Only works for alignment with power of 2
   53|  29.8k|		constexpr bool isPowerOfTwo = alignment && ((alignment & (alignment - 1)) == 0);
  ------------------
  |  Branch (53:33): [True: 0, Folded]
  |  Branch (53:46): [True: 0, Folded]
  ------------------
   54|  29.8k|		static_assert(isPowerOfTwo, "Alignment must be a power of 2");
   55|  29.8k|		int mask = alignment - 1;
   56|  29.8k|		return (number + mask) & ~mask;
   57|  29.8k|	}
_ZNK4pcpp13EnumClassHashINS_12Asn1TagClassELb0EEclES1_:
  123|      8|		{
  124|      8|			return static_cast<std::underlying_type_t<EnumClass>>(value);
  125|      8|		}
_ZNK4pcpp13EnumClassHashINS_20Asn1UniversalTagTypeELb0EEclES1_:
  123|     76|		{
  124|     76|			return static_cast<std::underlying_type_t<EnumClass>>(value);
  125|     76|		}
_ZNK4pcpp13EnumClassHashINS_17LdapOperationType5ValueELb0EEclES2_:
  123|     86|		{
  124|     86|			return static_cast<std::underlying_type_t<EnumClass>>(value);
  125|     86|		}
_ZNK4pcpp13EnumClassHashINS_14LdapResultCode5ValueELb0EEclES2_:
  123|    118|		{
  124|    118|			return static_cast<std::underlying_type_t<EnumClass>>(value);
  125|    118|		}
_ZNK4pcpp13EnumClassHashINS_22LdapSearchRequestLayer18SearchRequestScope5ValueELb0EEclES3_:
  123|      8|		{
  124|      8|			return static_cast<std::underlying_type_t<EnumClass>>(value);
  125|      8|		}
_ZNK4pcpp13EnumClassHashINS_22LdapSearchRequestLayer12DerefAliases5ValueELb0EEclES3_:
  123|     10|		{
  124|     10|			return static_cast<std::underlying_type_t<EnumClass>>(value);
  125|     10|		}

_ZN4pcpp11IPv4AddressC2Ej:
   38|   811k|		{
   39|   811k|			memcpy(m_Bytes.data(), &addrAsInt, sizeof(addrAsInt));
   40|   811k|		}
_ZN4pcpp11IPv4AddressC2EPKh:
   46|  3.00k|		IPv4Address(const uint8_t bytes[4]) : IPv4Address(bytes, 4)
   47|  3.00k|		{}
_ZNK4pcpp11IPv4Address7toBytesEv:
   71|   594k|		{
   72|   594k|			return m_Bytes.data();
   73|   594k|		}
_ZN4pcpp11IPv6AddressC2EPKh:
  174|   141k|		IPv6Address(const uint8_t bytes[16]) : IPv6Address(bytes, 16)
  175|   141k|		{}
_ZNK4pcpp11IPv6Address7toBytesEv:
  197|  93.4k|		{
  198|  93.4k|			return m_Bytes.data();
  199|  93.4k|		}
_ZNK4pcpp11IPv6Address6copyToEPh:
  255|  44.5k|		{
  256|  44.5k|			copyTo(arr, 16);
  257|  44.5k|		}
_ZN4pcpp9IPAddressC2ERKNS_11IPv4AddressE:
  335|   241k|		IPAddress(const IPv4Address& addr) : m_Type(IPv4AddressType), m_IPv4(addr)
  336|   241k|		{}
_ZN4pcpp9IPAddressC2ERKNS_11IPv6AddressE:
  340|  43.1k|		IPAddress(const IPv6Address& addr) : m_Type(IPv6AddressType), m_IPv6(addr)
  341|  43.1k|		{}
_ZNK4pcpp9IPAddress7getIPv4Ev:
  394|   233k|		{
  395|   233k|			return m_IPv4;
  396|   233k|		}
_ZNK4pcpp9IPAddress7getIPv6Ev:
  401|  40.1k|		{
  402|  40.1k|			return m_IPv6;
  403|  40.1k|		}
_ZNK4pcpp11IPv4Address5toIntEv:
  156|   233k|	{
  157|   233k|		uint32_t addr = 0;
  158|   233k|		memcpy(&addr, m_Bytes.data(), m_Bytes.size() * sizeof(uint8_t));
  159|   233k|		return addr;
  160|   233k|	}
_ZN4pcpp11IPv4AddressC2Ev:
   33|  43.1k|		IPv4Address() = default;
_ZN4pcpp11IPv6AddressC2Ev:
  168|   241k|		IPv6Address() = default;

_ZN4pcpp6Logger11getInstanceEv:
  369|  23.8M|		{
  370|  23.8M|			static Logger instance;
  371|  23.8M|			return instance;
  372|  23.8M|		}
_ZN4pcpp6Logger12suppressLogsEv:
  321|  2.25k|		{
  322|  2.25k|			m_LogsEnabled = false;
  323|  2.25k|		}
_ZN4pcpp9LogSourceC2ENS_9LogModuleEPKcS3_i:
  139|   117k|		    : file(file), function(function), line(line), logModule(logModule)
  140|   117k|		{}
_ZN4pcpp8internal10LogContext4initENS_8LogLevelERKNS_9LogSourceE:
  189|   117k|			{
  190|   117k|				m_Source = source;
  191|   117k|				m_Level = level;
  192|   117k|				m_Stream.clear();
  193|   117k|				m_Stream.str({});
  194|   117k|			}
_ZNK4pcpp6Logger14isDebugEnabledENS_9LogModuleE:
  280|  62.9k|		{
  281|  62.9k|			return m_LogModulesArray[module] == LogLevel::Debug;
  282|  62.9k|		}
_ZNK4pcpp6Logger9shouldLogENS_8LogLevelENS_9LogModuleE:
  289|  23.7M|		{
  290|  23.7M|			return level != LogLevel::Off && m_LogModulesArray[module] >= level;
  ------------------
  |  Branch (290:11): [True: 23.7M, False: 0]
  |  Branch (290:37): [True: 117k, False: 23.6M]
  ------------------
  291|  23.7M|		}
_ZN4pcpp8internal10LogContextlsIA52_cEERS1_RKT_:
  200|    440|			{
  201|    440|				m_Stream << value;
  202|    440|				return *this;
  203|    440|			}
_ZN4pcpp8internal10LogContextlsINSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEEERS1_RKT_:
  200|    764|			{
  201|    764|				m_Stream << value;
  202|    764|				return *this;
  203|    764|			}
_ZN4pcpp8internal10LogContextlsIA2_cEERS1_RKT_:
  200|    627|			{
  201|    627|				m_Stream << value;
  202|    627|				return *this;
  203|    627|			}
_ZN4pcpp8internal10LogContextlsIPKcEERS1_RKT_:
  200|      4|			{
  201|      4|				m_Stream << value;
  202|      4|				return *this;
  203|      4|			}
_ZN4pcpp8internal10LogContextlsIA20_cEERS1_RKT_:
  200|    627|			{
  201|    627|				m_Stream << value;
  202|    627|				return *this;
  203|    627|			}
_ZN4pcpp8internal10LogContextlsIA46_cEERS1_RKT_:
  200|  1.13k|			{
  201|  1.13k|				m_Stream << value;
  202|  1.13k|				return *this;
  203|  1.13k|			}
_ZN4pcpp8internal10LogContextlsIA86_cEERS1_RKT_:
  200|    349|			{
  201|    349|				m_Stream << value;
  202|    349|				return *this;
  203|    349|			}
_ZN4pcpp8internal10LogContextlsIjEERS1_RKT_:
  200|  10.4k|			{
  201|  10.4k|				m_Stream << value;
  202|  10.4k|				return *this;
  203|  10.4k|			}
_ZN4pcpp8internal10LogContextlsIA32_cEERS1_RKT_:
  200|    110|			{
  201|    110|				m_Stream << value;
  202|    110|				return *this;
  203|    110|			}
_ZN4pcpp8internal10LogContextlsIA26_cEERS1_RKT_:
  200|    951|			{
  201|    951|				m_Stream << value;
  202|    951|				return *this;
  203|    951|			}
_ZN4pcpp8internal10LogContextlsIA31_cEERS1_RKT_:
  200|  13.6k|			{
  201|  13.6k|				m_Stream << value;
  202|  13.6k|				return *this;
  203|  13.6k|			}
_ZN4pcpp8internal10LogContextlsIA24_cEERS1_RKT_:
  200|  6.11k|			{
  201|  6.11k|				m_Stream << value;
  202|  6.11k|				return *this;
  203|  6.11k|			}
_ZN4pcpp8internal10LogContextlsIA23_cEERS1_RKT_:
  200|    420|			{
  201|    420|				m_Stream << value;
  202|    420|				return *this;
  203|    420|			}
_ZN4pcpp8internal10LogContextlsIA27_cEERS1_RKT_:
  200|    310|			{
  201|    310|				m_Stream << value;
  202|    310|				return *this;
  203|    310|			}
_ZN4pcpp8internal10LogContextlsIA25_cEERS1_RKT_:
  200|  52.4k|			{
  201|  52.4k|				m_Stream << value;
  202|  52.4k|				return *this;
  203|  52.4k|			}
_ZN4pcpp8internal10LogContextlsIA50_cEERS1_RKT_:
  200|    982|			{
  201|    982|				m_Stream << value;
  202|    982|				return *this;
  203|    982|			}
_ZN4pcpp8internal10LogContextlsIA77_cEERS1_RKT_:
  200|     14|			{
  201|     14|				m_Stream << value;
  202|     14|				return *this;
  203|     14|			}
_ZN4pcpp8internal10LogContextlsIA70_cEERS1_RKT_:
  200|    272|			{
  201|    272|				m_Stream << value;
  202|    272|				return *this;
  203|    272|			}
_ZN4pcpp8internal10LogContextlsIA39_cEERS1_RKT_:
  200|    428|			{
  201|    428|				m_Stream << value;
  202|    428|				return *this;
  203|    428|			}
_ZN4pcpp8internal10LogContextlsIA48_cEERS1_RKT_:
  200|      4|			{
  201|      4|				m_Stream << value;
  202|      4|				return *this;
  203|      4|			}
_ZN4pcpp8internal10LogContextlsIA21_cEERS1_RKT_:
  200|    160|			{
  201|    160|				m_Stream << value;
  202|    160|				return *this;
  203|    160|			}
_ZN4pcpp8internal10LogContextlsIA44_cEERS1_RKT_:
  200|  1.58k|			{
  201|  1.58k|				m_Stream << value;
  202|  1.58k|				return *this;
  203|  1.58k|			}
_ZN4pcpp8internal10LogContextlsIA33_cEERS1_RKT_:
  200|      6|			{
  201|      6|				m_Stream << value;
  202|      6|				return *this;
  203|      6|			}
_ZN4pcpp8internal10LogContextlsIA59_cEERS1_RKT_:
  200|    378|			{
  201|    378|				m_Stream << value;
  202|    378|				return *this;
  203|    378|			}
_ZN4pcpp8internal10LogContextlsIA45_cEERS1_RKT_:
  200|  3.45k|			{
  201|  3.45k|				m_Stream << value;
  202|  3.45k|				return *this;
  203|  3.45k|			}
_ZN4pcpp8internal10LogContextlsIA36_cEERS1_RKT_:
  200|    593|			{
  201|    593|				m_Stream << value;
  202|    593|				return *this;
  203|    593|			}
_ZN4pcpp8internal10LogContextlsIA72_cEERS1_RKT_:
  200|    334|			{
  201|    334|				m_Stream << value;
  202|    334|				return *this;
  203|    334|			}
_ZN4pcpp8internal10LogContextlsIiEERS1_RKT_:
  200|  58.8k|			{
  201|  58.8k|				m_Stream << value;
  202|  58.8k|				return *this;
  203|  58.8k|			}
_ZN4pcpp8internal10LogContextlsIA142_cEERS1_RKT_:
  200|    990|			{
  201|    990|				m_Stream << value;
  202|    990|				return *this;
  203|    990|			}
_ZN4pcpp8internal10LogContextlsIA76_cEERS1_RKT_:
  200|     63|			{
  201|     63|				m_Stream << value;
  202|     63|				return *this;
  203|     63|			}
_ZN4pcpp8internal10LogContextlsIA85_cEERS1_RKT_:
  200|  2.45k|			{
  201|  2.45k|				m_Stream << value;
  202|  2.45k|				return *this;
  203|  2.45k|			}
_ZN4pcpp8internal10LogContextlsIA75_cEERS1_RKT_:
  200|    700|			{
  201|    700|				m_Stream << value;
  202|    700|				return *this;
  203|    700|			}
_ZN4pcpp8internal10LogContextlsIA84_cEERS1_RKT_:
  200|  1.17k|			{
  201|  1.17k|				m_Stream << value;
  202|  1.17k|				return *this;
  203|  1.17k|			}
_ZN4pcpp8internal10LogContextlsIA69_cEERS1_RKT_:
  200|    689|			{
  201|    689|				m_Stream << value;
  202|    689|				return *this;
  203|    689|			}
_ZN4pcpp8internal10LogContextlsIA73_cEERS1_RKT_:
  200|     18|			{
  201|     18|				m_Stream << value;
  202|     18|				return *this;
  203|     18|			}
_ZN4pcpp8internal10LogContextlsIA98_cEERS1_RKT_:
  200|  9.55k|			{
  201|  9.55k|				m_Stream << value;
  202|  9.55k|				return *this;
  203|  9.55k|			}
_ZN4pcpp8internal10LogContextlsIA43_cEERS1_RKT_:
  200|  18.6k|			{
  201|  18.6k|				m_Stream << value;
  202|  18.6k|				return *this;
  203|  18.6k|			}
_ZN4pcpp8internal10LogContextlsIA64_cEERS1_RKT_:
  200|    381|			{
  201|    381|				m_Stream << value;
  202|    381|				return *this;
  203|    381|			}
_ZN4pcpp8internal10LogContextlsIA38_cEERS1_RKT_:
  200|  1.00k|			{
  201|  1.00k|				m_Stream << value;
  202|  1.00k|				return *this;
  203|  1.00k|			}
_ZN4pcpp8internal10LogContextlsIA40_cEERS1_RKT_:
  200|  52.4k|			{
  201|  52.4k|				m_Stream << value;
  202|  52.4k|				return *this;
  203|  52.4k|			}
_ZN4pcpp8internal10LogContextlsIA41_cEERS1_RKT_:
  200|  1.58k|			{
  201|  1.58k|				m_Stream << value;
  202|  1.58k|				return *this;
  203|  1.58k|			}
_ZN4pcpp8internal10LogContextlsIA141_cEERS1_RKT_:
  200|    561|			{
  201|    561|				m_Stream << value;
  202|    561|				return *this;
  203|    561|			}
_ZN4pcpp8internal10LogContextlsIA67_cEERS1_RKT_:
  200|    638|			{
  201|    638|				m_Stream << value;
  202|    638|				return *this;
  203|    638|			}
_ZN4pcpp9LogSourceC2Ev:
  126|      2|		constexpr LogSource() = default;
_ZN4pcpp8internal10LogContextC2Ev:
  177|      2|			LogContext() = default;

_ZN4pcpp10MacAddressC2EPKh:
   36|   624k|		explicit MacAddress(const uint8_t addr[6]) : MacAddress(addr, 6)
   37|   624k|		{}
_ZN4pcpp10MacAddressC2Ehhhhhh:
   83|      4|		    : m_Address{ firstOctet, secondOctet, thirdOctet, fourthOctet, fifthOctet, sixthOctet }
   84|      4|		{}
_ZNK4pcpp10MacAddresseqERKS0_:
  103|  31.0k|		{
  104|  31.0k|			return m_Address == other.m_Address;
  105|  31.0k|		}
_ZNK4pcpp10MacAddressneERKS0_:
  111|  31.0k|		{
  112|  31.0k|			return !operator==(other);
  113|  31.0k|		}
_ZN4pcpp10MacAddressC2ILm18EEERAT__Kc:
   71|      4|		MacAddress(const char (&addr)[N]) : MacAddress(std::string(addr, std::find(addr, addr + N, '\0')))
   72|      4|		{}

_ZN4pcpp8internal17DynamicObjectPoolINS0_10LogContextELb1EED2Ev:
   57|      1|			{
   58|      1|				clear();
   59|      1|			}
_ZN4pcpp8internal17DynamicObjectPoolINS0_10LogContextELb1EE5clearEv:
  175|      1|			{
  176|      1|				std::unique_lock<std::mutex> lock(m_Mutex);
  177|      3|				while (!m_Pool.empty())
  ------------------
  |  Branch (177:12): [True: 2, False: 1]
  ------------------
  178|      2|				{
  179|      2|					delete m_Pool.top();
  180|      2|					m_Pool.pop();
  181|      2|				}
  182|      1|			}
_ZN4pcpp8internal17DynamicObjectPoolINS0_10LogContextELb1EE11preallocateEm:
  158|      1|			{
  159|      1|				std::unique_lock<std::mutex> lock(m_Mutex);
  160|       |
  161|      1|				if (m_MaxPoolSize < count)
  ------------------
  |  Branch (161:9): [True: 0, False: 1]
  ------------------
  162|      0|				{
  163|      0|					throw std::invalid_argument("Preallocated objects cannot exceed the maximum pool size");
  164|      0|				}
  165|       |
  166|       |				// If the pool is already larger than the requested count, we don't need to do anything.
  167|      3|				for (std::size_t i = m_Pool.size(); i < count; i++)
  ------------------
  |  Branch (167:41): [True: 2, False: 1]
  ------------------
  168|      2|				{
  169|      2|					m_Pool.push(new T());
  170|      2|				}
  171|      1|			}
_ZN4pcpp8internal17DynamicObjectPoolINS0_10LogContextELb1EEC2Emm:
   36|      1|			    : m_MaxPoolSize(maxPoolSize)
   37|      1|			{
   38|      1|				if (initialSize > maxPoolSize)
  ------------------
  |  Branch (38:9): [True: 0, False: 1]
  ------------------
   39|      0|				{
   40|      0|					throw std::invalid_argument("Preallocated objects cannot exceed the maximum pool size");
   41|      0|				}
   42|       |
   43|      1|				if (initialSize > 0)
  ------------------
  |  Branch (43:9): [True: 1, False: 0]
  ------------------
   44|      1|				{
   45|      1|					this->preallocate(initialSize);
   46|      1|				}
   47|      1|			}
_ZN4pcpp8internal17DynamicObjectPoolINS0_10LogContextELb1EE13acquireObjectEv:
   68|   117k|			{
   69|   117k|				return std::unique_ptr<T>(acquireObjectRaw());
   70|   117k|			}
_ZN4pcpp8internal17DynamicObjectPoolINS0_10LogContextELb1EE16acquireObjectRawEv:
   79|   117k|			{
   80|   117k|				std::unique_lock<std::mutex> lock(m_Mutex);
   81|       |
   82|   117k|				if (m_Pool.empty())
  ------------------
  |  Branch (82:9): [True: 0, False: 117k]
  ------------------
   83|      0|				{
   84|       |					// We don't need the lock anymore, so release it.
   85|      0|					lock.unlock();
   86|      0|					return new T();
   87|      0|				}
   88|       |
   89|   117k|				T* obj = m_Pool.top();
   90|   117k|				m_Pool.pop();
   91|   117k|				return obj;
   92|   117k|			}
_ZN4pcpp8internal17DynamicObjectPoolINS0_10LogContextELb1EE13releaseObjectENSt3__110unique_ptrIS2_NS4_14default_deleteIS2_EEEE:
  101|   117k|			{
  102|   117k|				releaseObjectRaw(obj.release());
  103|   117k|			}
_ZN4pcpp8internal17DynamicObjectPoolINS0_10LogContextELb1EE16releaseObjectRawEPS2_:
  112|   117k|			{
  113|   117k|				std::unique_lock<std::mutex> lock(m_Mutex);
  114|       |
  115|   117k|				if (m_MaxPoolSize == INFINITE_POOL_SIZE || m_Pool.size() < m_MaxPoolSize)
  ------------------
  |  Branch (115:9): [True: 0, False: 117k]
  |  Branch (115:48): [True: 117k, False: 0]
  ------------------
  116|   117k|				{
  117|   117k|					m_Pool.push(obj);
  118|   117k|				}
  119|      0|				else
  120|      0|				{
  121|       |					// We don't need the lock anymore, so release it.
  122|      0|					lock.unlock();
  123|      0|					delete obj;
  124|      0|				}
  125|   117k|			}

_ZN4pcpp13PointerVectorINS_9RawPacketENSt3__114default_deleteIS1_EEEC2Ev:
   59|  2.23k|		PointerVector() = default;
_ZNK4pcpp13PointerVectorINS_19SSLHandshakeMessageENSt3__114default_deleteIS1_EEE4sizeEv:
  216|   102k|		{
  217|   102k|			return m_Vector.size();
  218|   102k|		}
_ZNK4pcpp13PointerVectorINS_19SSLHandshakeMessageENSt3__114default_deleteIS1_EEE2atEi:
  319|  66.2k|		{
  320|  66.2k|			return m_Vector.at(index);
  321|  66.2k|		}
_ZNK4pcpp13PointerVectorINS_12SSLExtensionENSt3__114default_deleteIS1_EEE4sizeEv:
  216|  71.9k|		{
  217|  71.9k|			return m_Vector.size();
  218|  71.9k|		}
_ZNK4pcpp13PointerVectorINS_12SSLExtensionENSt3__114default_deleteIS1_EEE2atEi:
  319|   160k|		{
  320|   160k|			return m_Vector.at(index);
  321|   160k|		}
_ZN4pcpp13PointerVectorINS_9RawPacketENSt3__114default_deleteIS1_EEED2Ev:
   78|  2.23k|		{
   79|  2.23k|			freeVectorUnsafe(m_Vector);
   80|  2.23k|		}
_ZN4pcpp13PointerVectorINS_9RawPacketENSt3__114default_deleteIS1_EEE16freeVectorUnsafeERKNS2_6vectorIPS1_NS2_9allocatorIS7_EEEE:
  362|  2.23k|		{
  363|  2.23k|			for (auto& obj : origin)
  ------------------
  |  Branch (363:19): [True: 2.23k, False: 2.23k]
  ------------------
  364|  2.23k|			{
  365|  2.23k|				Deleter{}(obj);
  366|  2.23k|			}
  367|  2.23k|		}
_ZNK4pcpp13PointerVectorINS_9RawPacketENSt3__114default_deleteIS1_EEE5frontEv:
  238|  2.23k|		{
  239|  2.23k|			return m_Vector.front();
  240|  2.23k|		}
_ZN4pcpp13PointerVectorINS_9RawPacketENSt3__114default_deleteIS1_EEE8pushBackEPS1_b:
  147|  2.23k|		{
  148|  2.23k|			if (element == nullptr)
  ------------------
  |  Branch (148:8): [True: 0, False: 2.23k]
  ------------------
  149|      0|			{
  150|      0|				throw std::invalid_argument("Element is nullptr");
  151|      0|			}
  152|       |
  153|  2.23k|			try
  154|  2.23k|			{
  155|  2.23k|				m_Vector.push_back(element);
  156|  2.23k|			}
  157|  2.23k|			catch (const std::exception&)
  158|  2.23k|			{
  159|      0|				if (freeElementOnError)
  ------------------
  |  Branch (159:9): [True: 0, False: 0]
  ------------------
  160|      0|				{
  161|      0|					Deleter{}(element);
  162|      0|				}
  163|      0|				throw;
  164|      0|			}
  165|  2.23k|		}
_ZN4pcpp13PointerVectorINS_12SSLExtensionENSt3__114default_deleteIS1_EEEC2Ev:
   59|  73.9k|		PointerVector() = default;
_ZN4pcpp13PointerVectorINS_18SSLx509CertificateENSt3__114default_deleteIS1_EEEC2Ev:
   59|  2.01k|		PointerVector() = default;
_ZN4pcpp13PointerVectorINS_12SSLExtensionENSt3__114default_deleteIS1_EEED2Ev:
   78|  73.9k|		{
   79|  73.9k|			freeVectorUnsafe(m_Vector);
   80|  73.9k|		}
_ZN4pcpp13PointerVectorINS_12SSLExtensionENSt3__114default_deleteIS1_EEE16freeVectorUnsafeERKNS2_6vectorIPS1_NS2_9allocatorIS7_EEEE:
  362|  73.9k|		{
  363|  73.9k|			for (auto& obj : origin)
  ------------------
  |  Branch (363:19): [True: 225k, False: 73.9k]
  ------------------
  364|   225k|			{
  365|   225k|				Deleter{}(obj);
  366|   225k|			}
  367|  73.9k|		}
_ZN4pcpp13PointerVectorINS_12SSLExtensionENSt3__114default_deleteIS1_EEE8pushBackENS2_10unique_ptrIS1_S4_EE:
  172|   225k|		{
  173|   225k|			if (!element)
  ------------------
  |  Branch (173:8): [True: 0, False: 225k]
  ------------------
  174|      0|			{
  175|      0|				throw std::invalid_argument("Element is nullptr");
  176|      0|			}
  177|       |
  178|       |			// Release is called after the raw pointer is already inserted into the vector to prevent
  179|       |			// a memory leak if push_back throws.
  180|       |			// cppcheck-suppress danglingLifetime
  181|   225k|			m_Vector.push_back(element.get());
  182|   225k|			element.release();
  183|   225k|		}
_ZN4pcpp13PointerVectorINS_18SSLx509CertificateENSt3__114default_deleteIS1_EEED2Ev:
   78|  2.01k|		{
   79|  2.01k|			freeVectorUnsafe(m_Vector);
   80|  2.01k|		}
_ZN4pcpp13PointerVectorINS_18SSLx509CertificateENSt3__114default_deleteIS1_EEE16freeVectorUnsafeERKNS2_6vectorIPS1_NS2_9allocatorIS7_EEEE:
  362|  2.01k|		{
  363|  2.01k|			for (auto& obj : origin)
  ------------------
  |  Branch (363:19): [True: 2.15k, False: 2.01k]
  ------------------
  364|  2.15k|			{
  365|  2.15k|				Deleter{}(obj);
  366|  2.15k|			}
  367|  2.01k|		}
_ZN4pcpp13PointerVectorINS_18SSLx509CertificateENSt3__114default_deleteIS1_EEE8pushBackEPS1_b:
  147|  2.15k|		{
  148|  2.15k|			if (element == nullptr)
  ------------------
  |  Branch (148:8): [True: 0, False: 2.15k]
  ------------------
  149|      0|			{
  150|      0|				throw std::invalid_argument("Element is nullptr");
  151|      0|			}
  152|       |
  153|  2.15k|			try
  154|  2.15k|			{
  155|  2.15k|				m_Vector.push_back(element);
  156|  2.15k|			}
  157|  2.15k|			catch (const std::exception&)
  158|  2.15k|			{
  159|      0|				if (freeElementOnError)
  ------------------
  |  Branch (159:9): [True: 0, False: 0]
  ------------------
  160|      0|				{
  161|      0|					Deleter{}(element);
  162|      0|				}
  163|      0|				throw;
  164|      0|			}
  165|  2.15k|		}
_ZN4pcpp13PointerVectorINS_19SSLHandshakeMessageENSt3__114default_deleteIS1_EEEC2Ev:
   59|   125k|		PointerVector() = default;
_ZN4pcpp13PointerVectorINS_19SSLHandshakeMessageENSt3__114default_deleteIS1_EEED2Ev:
   78|   125k|		{
   79|   125k|			freeVectorUnsafe(m_Vector);
   80|   125k|		}
_ZN4pcpp13PointerVectorINS_19SSLHandshakeMessageENSt3__114default_deleteIS1_EEE16freeVectorUnsafeERKNS2_6vectorIPS1_NS2_9allocatorIS7_EEEE:
  362|   125k|		{
  363|   125k|			for (auto& obj : origin)
  ------------------
  |  Branch (363:19): [True: 119k, False: 125k]
  ------------------
  364|   119k|			{
  365|   119k|				Deleter{}(obj);
  366|   119k|			}
  367|   125k|		}
_ZN4pcpp13PointerVectorINS_19SSLHandshakeMessageENSt3__114default_deleteIS1_EEE8pushBackEPS1_b:
  147|   119k|		{
  148|   119k|			if (element == nullptr)
  ------------------
  |  Branch (148:8): [True: 0, False: 119k]
  ------------------
  149|      0|			{
  150|      0|				throw std::invalid_argument("Element is nullptr");
  151|      0|			}
  152|       |
  153|   119k|			try
  154|   119k|			{
  155|   119k|				m_Vector.push_back(element);
  156|   119k|			}
  157|   119k|			catch (const std::exception&)
  158|   119k|			{
  159|      0|				if (freeElementOnError)
  ------------------
  |  Branch (159:9): [True: 0, False: 0]
  ------------------
  160|      0|				{
  161|      0|					Deleter{}(element);
  162|      0|				}
  163|      0|				throw;
  164|      0|			}
  165|   119k|		}
_ZN4pcpp13PointerVectorINS_15PostgresMessageENSt3__114default_deleteIS1_EEE16freeVectorUnsafeERKNS2_6vectorIPS1_NS2_9allocatorIS7_EEEE:
  362|  2.11k|		{
  363|  2.11k|			for (auto& obj : origin)
  ------------------
  |  Branch (363:19): [True: 390, False: 2.11k]
  ------------------
  364|    390|			{
  365|    390|				Deleter{}(obj);
  366|    390|			}
  367|  2.11k|		}
_ZN4pcpp13PointerVectorINS_12MySqlMessageENSt3__114default_deleteIS1_EEE16freeVectorUnsafeERKNS2_6vectorIPS1_NS2_9allocatorIS7_EEEE:
  362|  15.5k|		{
  363|  15.5k|			for (auto& obj : origin)
  ------------------
  |  Branch (363:19): [True: 1.95k, False: 15.5k]
  ------------------
  364|  1.95k|			{
  365|  1.95k|				Deleter{}(obj);
  366|  1.95k|			}
  367|  15.5k|		}
_ZNK4pcpp13PointerVectorINS_10Asn1RecordENSt3__114default_deleteIS1_EEE2atEi:
  319|    241|		{
  320|    241|			return m_Vector.at(index);
  321|    241|		}
_ZNK4pcpp13PointerVectorINS_10Asn1RecordENSt3__114default_deleteIS1_EEE4sizeEv:
  216|      2|		{
  217|      2|			return m_Vector.size();
  218|      2|		}
_ZN4pcpp13PointerVectorINS_10Asn1RecordENSt3__114default_deleteIS1_EEEC2Ev:
   59|  12.0k|		PointerVector() = default;
_ZN4pcpp13PointerVectorINS_10Asn1RecordENSt3__114default_deleteIS1_EEED2Ev:
   78|  12.0k|		{
   79|  12.0k|			freeVectorUnsafe(m_Vector);
   80|  12.0k|		}
_ZN4pcpp13PointerVectorINS_10Asn1RecordENSt3__114default_deleteIS1_EEE16freeVectorUnsafeERKNS2_6vectorIPS1_NS2_9allocatorIS7_EEEE:
  362|  12.0k|		{
  363|  12.0k|			for (auto& obj : origin)
  ------------------
  |  Branch (363:19): [True: 18.7k, False: 12.0k]
  ------------------
  364|  18.7k|			{
  365|  18.7k|				Deleter{}(obj);
  366|  18.7k|			}
  367|  12.0k|		}
_ZN4pcpp13PointerVectorINS_10Asn1RecordENSt3__114default_deleteIS1_EEE8pushBackENS2_10unique_ptrIS1_S4_EE:
  172|  18.7k|		{
  173|  18.7k|			if (!element)
  ------------------
  |  Branch (173:8): [True: 0, False: 18.7k]
  ------------------
  174|      0|			{
  175|      0|				throw std::invalid_argument("Element is nullptr");
  176|      0|			}
  177|       |
  178|       |			// Release is called after the raw pointer is already inserted into the vector to prevent
  179|       |			// a memory leak if push_back throws.
  180|       |			// cppcheck-suppress danglingLifetime
  181|  18.7k|			m_Vector.push_back(element.get());
  182|  18.7k|			element.release();
  183|  18.7k|		}
_ZN4pcpp13PointerVectorINS_12MySqlMessageENSt3__114default_deleteIS1_EEEC2Ev:
   59|  15.5k|		PointerVector() = default;
_ZN4pcpp13PointerVectorINS_12MySqlMessageENSt3__114default_deleteIS1_EEED2Ev:
   78|  15.5k|		{
   79|  15.5k|			freeVectorUnsafe(m_Vector);
   80|  15.5k|		}
_ZN4pcpp13PointerVectorINS_12MySqlMessageENSt3__114default_deleteIS1_EEE8pushBackENS2_10unique_ptrIS1_S4_EE:
  172|  1.95k|		{
  173|  1.95k|			if (!element)
  ------------------
  |  Branch (173:8): [True: 0, False: 1.95k]
  ------------------
  174|      0|			{
  175|      0|				throw std::invalid_argument("Element is nullptr");
  176|      0|			}
  177|       |
  178|       |			// Release is called after the raw pointer is already inserted into the vector to prevent
  179|       |			// a memory leak if push_back throws.
  180|       |			// cppcheck-suppress danglingLifetime
  181|  1.95k|			m_Vector.push_back(element.get());
  182|  1.95k|			element.release();
  183|  1.95k|		}
_ZNK4pcpp13PointerVectorINS_12MySqlMessageENSt3__114default_deleteIS1_EEE4sizeEv:
  216|  5.81k|		{
  217|  5.81k|			return m_Vector.size();
  218|  5.81k|		}
_ZN4pcpp13PointerVectorINS_15PostgresMessageENSt3__114default_deleteIS1_EEEC2Ev:
   59|  2.11k|		PointerVector() = default;
_ZN4pcpp13PointerVectorINS_15PostgresMessageENSt3__114default_deleteIS1_EEED2Ev:
   78|  2.11k|		{
   79|  2.11k|			freeVectorUnsafe(m_Vector);
   80|  2.11k|		}
_ZN4pcpp13PointerVectorINS_15PostgresMessageENSt3__114default_deleteIS1_EEE8pushBackENS2_10unique_ptrIS1_S4_EE:
  172|    390|		{
  173|    390|			if (!element)
  ------------------
  |  Branch (173:8): [True: 0, False: 390]
  ------------------
  174|      0|			{
  175|      0|				throw std::invalid_argument("Element is nullptr");
  176|      0|			}
  177|       |
  178|       |			// Release is called after the raw pointer is already inserted into the vector to prevent
  179|       |			// a memory leak if push_back throws.
  180|       |			// cppcheck-suppress danglingLifetime
  181|    390|			m_Vector.push_back(element.get());
  182|    390|			element.release();
  183|    390|		}
_ZNK4pcpp13PointerVectorINS_15PostgresMessageENSt3__114default_deleteIS1_EEE4sizeEv:
  216|    778|		{
  217|    778|			return m_Vector.size();
  218|    778|		}

_ZN4pcpp15FieldDescriptorC2EtNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPFNS1_6vectorIS0_NS5_IS0_EEEEvE:
   35|    814|		    : id(fieldId), name(std::move(fieldName)), getChildren(fieldChildren)
   36|    814|		{}
_ZN4pcpp21ObjectFieldDescriptorINS_8DnsLayer16SerializedFields11QueryObjectEEC2EtNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE:
   54|      2|		    : FieldDescriptor(fieldId, std::move(fieldName), &Derived::all)
   55|      2|		{}
_ZN4pcpp21ObjectFieldDescriptorINS_8DnsLayer16SerializedFields14ResourceObjectEEC2EtNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE:
   54|      2|		    : FieldDescriptor(fieldId, std::move(fieldName), &Derived::all)
   55|      2|		{}
_ZN4pcpp21ObjectFieldDescriptorINS_9IPv6Layer16SerializedFields19IPv6ExtensionObjectEEC2EtNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE:
   54|      2|		    : FieldDescriptor(fieldId, std::move(fieldName), &Derived::all)
   55|      2|		{}
_ZN4pcpp21ObjectFieldDescriptorINS_6Packet16SerializedFields15TimestampObjectEEC2EtNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE:
   54|      2|		    : FieldDescriptor(fieldId, std::move(fieldName), &Derived::all)
   55|      2|		{}
_ZN4pcpp21ObjectFieldDescriptorINS_13SomeIpSdLayer16SerializedFields11EntryObjectEEC2EtNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE:
   54|      2|		    : FieldDescriptor(fieldId, std::move(fieldName), &Derived::all)
   55|      2|		{}
_ZN4pcpp21ObjectFieldDescriptorINS_13SomeIpSdLayer16SerializedFields12OptionObjectEEC2EtNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE:
   54|      2|		    : FieldDescriptor(fieldId, std::move(fieldName), &Derived::all)
   55|      2|		{}
_ZN4pcpp21ObjectFieldDescriptorINS_11GeneveLayer16SerializedFields12OptionObjectEEC2EtNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE:
   54|      2|		    : FieldDescriptor(fieldId, std::move(fieldName), &Derived::all)
   55|      2|		{}
_ZN4pcpp21ObjectFieldDescriptorINS_11HttpMessage16SerializedFields17HeaderFieldObjectEEC2EtNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE:
   54|      2|		    : FieldDescriptor(fieldId, std::move(fieldName), &Derived::all)
   55|      2|		{}
_ZN4pcpp21ObjectFieldDescriptorINS_25StpConfigurationBPDULayer24BridgeIdSerializedFieldsEEC2EtNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEE:
   54|      6|		    : FieldDescriptor(fieldId, std::move(fieldName), &Derived::all)
   55|      6|		{}

_ZN4pcpp20byteArrayToHexStringEPKhmi:
   17|  43.2k|	{
   18|  43.2k|		if (stringSizeLimit <= 0)
  ------------------
  |  Branch (18:7): [True: 6.63k, False: 36.6k]
  ------------------
   19|  6.63k|		{
   20|  6.63k|			stringSizeLimit = static_cast<int>(byteArrSize);
   21|  6.63k|		}
   22|       |
   23|  43.2k|		std::stringstream dataStream;
   24|  43.2k|		dataStream << std::hex;
   25|   648k|		for (size_t i = 0; i < byteArrSize; ++i)
  ------------------
  |  Branch (25:22): [True: 619k, False: 29.1k]
  ------------------
   26|   619k|		{
   27|   619k|			if (i >= static_cast<size_t>(stringSizeLimit))
  ------------------
  |  Branch (27:8): [True: 14.1k, False: 604k]
  ------------------
   28|  14.1k|			{
   29|  14.1k|				break;
   30|  14.1k|			}
   31|       |
   32|   604k|			dataStream << std::setw(2) << std::setfill('0') << static_cast<int>(byteArr[i]);
   33|   604k|		}
   34|       |
   35|  43.2k|		return dataStream.str();
   36|  43.2k|	}
_ZN4pcpp20hexStringToByteArrayERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEPhm:
   56|  36.0k|	{
   57|  36.0k|		if (hexString.size() % 2 != 0)
  ------------------
  |  Branch (57:7): [True: 0, False: 36.0k]
  ------------------
   58|      0|		{
   59|      0|			PCPP_LOG_ERROR("Input string is in odd size");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE CommonLogModuleGenericUtils
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE CommonLogModuleGenericUtils
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   60|      0|			return 0;
   61|      0|		}
   62|       |
   63|  36.0k|		memset(resultByteArr, 0, resultByteArrSize);
   64|   278k|		for (size_t i = 0; i < hexString.length(); i += 2)
  ------------------
  |  Branch (64:22): [True: 242k, False: 36.0k]
  ------------------
   65|   242k|		{
   66|   242k|			if (i >= resultByteArrSize * 2)
  ------------------
  |  Branch (66:8): [True: 0, False: 242k]
  ------------------
   67|      0|			{
   68|      0|				return resultByteArrSize;
   69|      0|			}
   70|       |
   71|   242k|			const int firstChar = char2int(hexString[i]);
   72|   242k|			const int secondChar = char2int(hexString[i + 1]);
   73|   242k|			if (firstChar < 0 || secondChar < 0)
  ------------------
  |  Branch (73:8): [True: 0, False: 242k]
  |  Branch (73:25): [True: 0, False: 242k]
  ------------------
   74|      0|			{
   75|      0|				PCPP_LOG_ERROR("Input string has an illegal character");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE CommonLogModuleGenericUtils
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE CommonLogModuleGenericUtils
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   76|      0|				resultByteArr[0] = '\0';
   77|      0|				return 0;
   78|      0|			}
   79|       |
   80|   242k|			resultByteArr[i / 2] = (firstChar << 4) | secondChar;
   81|   242k|		}
   82|       |
   83|  36.0k|		return hexString.length() / 2;
   84|  36.0k|	}
_ZN4pcpp21cross_platform_memmemEPKcmS1_m:
   87|  49.9k|	{
   88|  49.9k|		char* ptr = const_cast<char*>(haystack);
   89|   154k|		while (needleLen <= (haystackLen - (ptr - haystack)))
  ------------------
  |  Branch (89:10): [True: 154k, False: 51]
  ------------------
   90|   154k|		{
   91|   154k|			if (nullptr !=
  ------------------
  |  Branch (91:8): [True: 143k, False: 11.3k]
  ------------------
   92|   154k|			    (ptr = static_cast<char*>(memchr(ptr, static_cast<int>(*needle), haystackLen - (ptr - haystack)))))
   93|   143k|			{
   94|       |				// check if there is room to do a memcmp
   95|   143k|				if (needleLen > (haystackLen - (ptr - haystack)))
  ------------------
  |  Branch (95:9): [True: 236, False: 142k]
  ------------------
   96|    236|				{
   97|    236|					return nullptr;
   98|    236|				}
   99|       |
  100|   142k|				if (0 == memcmp(ptr, needle, needleLen))
  ------------------
  |  Branch (100:9): [True: 38.3k, False: 104k]
  ------------------
  101|  38.3k|				{
  102|  38.3k|					return ptr;
  103|  38.3k|				}
  104|   104k|				++ptr;
  105|   104k|			}
  106|  11.3k|			else
  107|  11.3k|			{
  108|  11.3k|				break;
  109|  11.3k|			}
  110|   154k|		}
  111|       |
  112|  11.3k|		return nullptr;
  113|  49.9k|	}
GeneralUtils.cpp:_ZN4pcppL8char2intEc:
   39|   485k|	{
   40|   485k|		if (input >= '0' && input <= '9')
  ------------------
  |  Branch (40:7): [True: 485k, False: 0]
  |  Branch (40:23): [True: 403k, False: 82.1k]
  ------------------
   41|   403k|		{
   42|   403k|			return input - '0';
   43|   403k|		}
   44|  82.1k|		if (input >= 'A' && input <= 'F')
  ------------------
  |  Branch (44:7): [True: 82.1k, False: 0]
  |  Branch (44:23): [True: 0, False: 82.1k]
  ------------------
   45|      0|		{
   46|      0|			return input - 'A' + 10;
   47|      0|		}
   48|  82.1k|		if (input >= 'a' && input <= 'f')
  ------------------
  |  Branch (48:7): [True: 82.1k, False: 0]
  |  Branch (48:23): [True: 82.1k, False: 0]
  ------------------
   49|  82.1k|		{
   50|  82.1k|			return input - 'a' + 10;
   51|  82.1k|		}
   52|      0|		return -1;
   53|  82.1k|	}

_ZNK4pcpp11IPv4Address8toStringEv:
   32|   547k|	{
   33|   547k|		char addrBuffer[INET_ADDRSTRLEN];
   34|       |
   35|   547k|		if (inet_ntop(AF_INET, toBytes(), addrBuffer, sizeof(addrBuffer)) != nullptr)
  ------------------
  |  Branch (35:7): [True: 547k, False: 0]
  ------------------
   36|   547k|		{
   37|   547k|			return addrBuffer;
   38|   547k|		}
   39|       |
   40|      0|		return {};
   41|   547k|	}
_ZN4pcpp11IPv4AddressC2EPKhm:
   50|  3.00k|	{
   51|  3.00k|		if (bytes == nullptr)
  ------------------
  |  Branch (51:7): [True: 0, False: 3.00k]
  ------------------
   52|      0|		{
   53|      0|			throw std::invalid_argument("Buffer pointer is null");
   54|      0|		}
   55|       |
   56|  3.00k|		if (size < 4)
  ------------------
  |  Branch (56:7): [True: 0, False: 3.00k]
  ------------------
   57|      0|		{
   58|      0|			throw std::out_of_range("Buffer size is smaller than IPv4 address size");
   59|      0|		}
   60|  3.00k|		memcpy(m_Bytes.data(), bytes, 4 * sizeof(uint8_t));
   61|  3.00k|	}
_ZN4pcpp11IPv4AddressC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   64|  35.0k|	{
   65|  35.0k|		if (inet_pton(AF_INET, addrAsString.data(), m_Bytes.data()) <= 0)
  ------------------
  |  Branch (65:7): [True: 34, False: 34.9k]
  ------------------
   66|     34|		{
   67|     34|			throw std::invalid_argument("Not a valid IPv4 address: " + addrAsString);
   68|     34|		}
   69|  35.0k|	}
_ZNK4pcpp11IPv6Address8toStringEv:
  102|  93.4k|	{
  103|  93.4k|		char addrBuffer[INET6_ADDRSTRLEN];
  104|       |
  105|  93.4k|		if (inet_ntop(AF_INET6, toBytes(), addrBuffer, sizeof(addrBuffer)) != nullptr)
  ------------------
  |  Branch (105:7): [True: 93.4k, False: 0]
  ------------------
  106|  93.4k|		{
  107|  93.4k|			return addrBuffer;
  108|  93.4k|		}
  109|       |
  110|      0|		return {};
  111|  93.4k|	}
_ZN4pcpp11IPv6AddressC2EPKhm:
  119|   141k|	{
  120|   141k|		if (bytes == nullptr)
  ------------------
  |  Branch (120:7): [True: 0, False: 141k]
  ------------------
  121|      0|		{
  122|      0|			throw std::invalid_argument("Buffer pointer is null");
  123|      0|		}
  124|       |
  125|   141k|		if (size < 16)
  ------------------
  |  Branch (125:7): [True: 0, False: 141k]
  ------------------
  126|      0|		{
  127|      0|			throw std::out_of_range("Buffer size is smaller than IPv6 address size");
  128|      0|		}
  129|   141k|		std::memcpy(m_Bytes.data(), bytes, 16 * sizeof(uint8_t));
  130|   141k|	}
_ZN4pcpp11IPv6AddressC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  133|      2|	{
  134|      2|		if (inet_pton(AF_INET6, addrAsString.data(), m_Bytes.data()) <= 0)
  ------------------
  |  Branch (134:7): [True: 0, False: 2]
  ------------------
  135|      0|		{
  136|      0|			throw std::invalid_argument("Not a valid IPv6 address: " + addrAsString);
  137|      0|		}
  138|      2|	}
_ZNK4pcpp11IPv6Address6copyToEPhm:
  150|  44.5k|	{
  151|  44.5k|		const size_t requiredSize = m_Bytes.size();
  152|       |
  153|  44.5k|		if (buffer == nullptr)
  ------------------
  |  Branch (153:7): [True: 0, False: 44.5k]
  ------------------
  154|      0|		{
  155|      0|			if (size != 0)
  ------------------
  |  Branch (155:8): [True: 0, False: 0]
  ------------------
  156|      0|			{
  157|      0|				throw std::invalid_argument("Buffer is null but size is not zero");
  158|      0|			}
  159|       |
  160|      0|			return requiredSize;
  161|      0|		}
  162|       |
  163|  44.5k|		if (size < requiredSize)
  ------------------
  |  Branch (163:7): [True: 0, False: 44.5k]
  ------------------
  164|      0|		{
  165|      0|			return requiredSize;
  166|      0|		}
  167|       |
  168|  44.5k|		std::memcpy(buffer, m_Bytes.data(), requiredSize);
  169|  44.5k|		return requiredSize;
  170|  44.5k|	}

_ZN4pcpp6LoggerC2Ev:
   55|      1|	Logger::Logger() : m_LogsEnabled(true), m_LogPrinter(&printToCerr)
   56|      1|	{
   57|      1|		m_LogModulesArray.fill(LogLevel::Info);
   58|      1|	}
_ZN4pcpp6Logger16createLogContextENS_8LogLevelERKNS_9LogSourceE:
   89|   117k|	{
   90|   117k|		if (m_UseContextPooling)
  ------------------
  |  Branch (90:7): [True: 117k, False: 0]
  ------------------
   91|   117k|		{
   92|   117k|			auto ctx = m_LogContextPool.acquireObject();
   93|   117k|			ctx->init(level, source);
   94|   117k|			return ctx;
   95|   117k|		}
   96|      0|		return std::make_unique<internal::LogContext>(level, source);
   97|   117k|	}
_ZN4pcpp6Logger4emitENSt3__110unique_ptrINS_8internal10LogContextENS1_14default_deleteIS4_EEEE:
  100|   117k|	{
  101|   117k|		emit(message->m_Source, message->m_Level, message->m_Stream.str());
  102|       |		// Pushes the message back to the pool if pooling is enabled. Otherwise, the message is deleted.
  103|   117k|		if (m_UseContextPooling)
  ------------------
  |  Branch (103:7): [True: 117k, False: 0]
  ------------------
  104|   117k|		{
  105|   117k|			m_LogContextPool.releaseObject(std::move(message));
  106|   117k|		}
  107|   117k|	}
_ZN4pcpp6Logger4emitERKNS_9LogSourceENS_8LogLevelERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE:
  110|   117k|	{
  111|       |		// If the log level is an error, save the error to the last error message variable.
  112|   117k|		if (logLevel == LogLevel::Error)
  ------------------
  |  Branch (112:7): [True: 112k, False: 5.41k]
  ------------------
  113|   112k|		{
  114|   112k|			static_assert(m_LastError.size() >= 1,
  115|   112k|			              "Last error buffer size must be at least 1 to hold a null terminator");
  116|       |
  117|       |			// Copy the message to the last error buffer, leaving space for null terminator
  118|   112k|			auto const copied = message.copy(m_LastError.data(), m_LastError.size() - 1);
  119|   112k|			m_LastError[copied] = '\0';
  120|   112k|		}
  121|   117k|		if (m_LogsEnabled)
  ------------------
  |  Branch (121:7): [True: 0, False: 117k]
  ------------------
  122|      0|		{
  123|      0|			m_LogPrinter(logLevel, message, source.file, source.function, source.line);
  124|      0|		}
  125|   117k|	}

_ZNK4pcpp10MacAddress8toStringEv:
   11|   588k|	{
   12|   588k|		char str[19];
   13|   588k|		if (snprintf(str, sizeof str, "%02x:%02x:%02x:%02x:%02x:%02x", m_Address[0], m_Address[1], m_Address[2],
  ------------------
  |  Branch (13:7): [True: 0, False: 588k]
  ------------------
   14|   588k|		             m_Address[3], m_Address[4], m_Address[5]) < 0)
   15|      0|		{
   16|      0|			throw std::runtime_error("Conversion of MAC address to string failed");
   17|      0|		}
   18|   588k|		return str;
   19|   588k|	}
_ZN4pcpp10MacAddressC2EPKhm:
   22|   624k|	{
   23|   624k|		if (addr == nullptr)
  ------------------
  |  Branch (23:7): [True: 0, False: 624k]
  ------------------
   24|      0|		{
   25|      0|			throw std::invalid_argument("Address pointer is null");
   26|      0|		}
   27|       |
   28|   624k|		if (size < 6)
  ------------------
  |  Branch (28:7): [True: 0, False: 624k]
  ------------------
   29|      0|		{
   30|      0|			throw std::out_of_range("Buffer size is smaller than MAC address size (6 bytes)");
   31|      0|		}
   32|       |
   33|   624k|		std::copy(addr, addr + 6, m_Address.begin());
   34|   624k|	}
_ZN4pcpp10MacAddressC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   37|      4|	{
   38|      4|		constexpr size_t validMacAddressLength = 17;
   39|      4|		unsigned int values[6];
   40|      4|		if (address.size() != validMacAddressLength ||
  ------------------
  |  Branch (40:7): [True: 0, False: 4]
  ------------------
   41|       |		    // NOLINTNEXTLINE(cert-err34-c)
   42|      4|		    sscanf(address.c_str(), "%x:%x:%x:%x:%x:%x", &values[0], &values[1], &values[2], &values[3], &values[4],
  ------------------
  |  Branch (42:7): [True: 0, False: 4]
  ------------------
   43|      4|		           &values[5]) != 6)
   44|      0|		{
   45|      0|			throw std::invalid_argument("Invalid MAC address format, should be xx:xx:xx:xx:xx:xx");
   46|      0|		}
   47|     28|		for (int i = 0; i < 6; ++i)
  ------------------
  |  Branch (47:19): [True: 24, False: 4]
  ------------------
   48|     24|		{
   49|     24|			m_Address[i] = values[i];
   50|     24|		}
   51|      4|	}

_ZN4pcpp11hostToNet16Et:
  241|  3.17k|	{
  242|       |		return htobe16(host);
  243|  3.17k|	}
_ZN4pcpp11netToHost16Et:
  246|  18.3k|	{
  247|       |		return be16toh(net);
  248|  18.3k|	}
_ZN4pcpp11hostToNet32Ej:
  251|  2.46k|	{
  252|       |		return htobe32(host);
  253|  2.46k|	}
_ZN4pcpp11netToHost32Ej:
  256|  20.3k|	{
  257|       |		return be32toh(net);
  258|  20.3k|	}

_ZN4pcpp8ArpLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  152|  17.9k|		    : Layer(data, dataLen, prevLayer, packet, ARP)
  153|  17.9k|		{
  154|  17.9k|			m_DataLen = sizeof(arphdr);
  155|  17.9k|		}
_ZNK4pcpp8ArpLayer12getArpHeaderEv:
  202|  40.7k|		{
  203|  40.7k|			return reinterpret_cast<arphdr*>(m_Data);
  204|  40.7k|		}
_ZNK4pcpp8ArpLayer19getSenderMacAddressEv:
  214|  1.59k|		{
  215|  1.59k|			return MacAddress(getArpHeader()->senderMacAddr);
  216|  1.59k|		}
_ZNK4pcpp8ArpLayer15getSenderIpAddrEv:
  228|  8.88k|		{
  229|  8.88k|			return getArpHeader()->senderIpAddr;
  230|  8.88k|		}
_ZNK4pcpp8ArpLayer15getTargetIpAddrEv:
  235|  7.28k|		{
  236|  7.28k|			return getArpHeader()->targetIpAddr;
  237|  7.28k|		}
_ZN4pcpp8ArpLayer14parseNextLayerEv:
  243|  17.9k|		{}
_ZNK4pcpp8ArpLayer12getHeaderLenEv:
  247|  4.55k|		{
  248|  4.55k|			return sizeof(arphdr);
  249|  4.55k|		}
_ZNK4pcpp8ArpLayer16getOsiModelLayerEv:
  271|  4.55k|		{
  272|  4.55k|			return OsiModelNetworkLayer;
  273|  4.55k|		}
_ZN4pcpp8ArpLayer11isDataValidEPKhm:
  280|  18.1k|		{
  281|  18.1k|			return canReinterpretAs<arphdr>(data, dataLen);
  282|  18.1k|		}

_ZNK4pcpp10Asn1Record10getTagTypeEv:
  164|    157|		{
  165|    157|			return m_TagType;
  166|    157|		}
_ZNK4pcpp10Asn1Record14getTotalLengthEv:
  176|  37.5k|		{
  177|  37.5k|			return m_TotalLength;
  178|  37.5k|		}
_ZN4pcpp21Asn1ConstructedRecord13getSubRecordsEv:
  313|  1.98k|		{
  314|  1.98k|			decodeValueIfNeeded();
  315|  1.98k|			return m_SubRecords;
  316|  1.98k|		};
_ZNK4pcpp14Asn1NullRecord11decodeValueEPKh:
  688|     48|		{}
_ZNK4pcpp16Asn1StringRecordILNS_20Asn1UniversalTagTypeE4EE11decodeValueEPKh:
  553|    116|		{
  554|    116|			m_Value = std::string(reinterpret_cast<char const*>(data), m_ValueLength);
  555|    116|		}
_ZNK4pcpp16Asn1StringRecordILNS_20Asn1UniversalTagTypeE19EE11decodeValueEPKh:
  553|      5|		{
  554|      5|			m_Value = std::string(reinterpret_cast<char const*>(data), m_ValueLength);
  555|      5|		}
_ZN4pcpp10Asn1Record6castAsINS_18Asn1SequenceRecordEEEPT_v:
  188|  1.97k|		{
  189|  1.97k|			auto result = dynamic_cast<Asn1RecordType*>(this);
  190|  1.97k|			if (result == nullptr)
  ------------------
  |  Branch (190:8): [True: 30, False: 1.94k]
  ------------------
  191|     30|			{
  192|     30|				throw std::bad_cast();
  193|     30|			}
  194|  1.94k|			return result;
  195|  1.97k|		}
_ZNK4pcpp17Asn1IntegerRecord11getIntValueIhTnNSt3__19enable_ifIXaasr3std11is_integralIT_EE5valuesr3std11is_unsignedIS4_EE5valueEiE4typeELi0EEES4_v:
  425|     40|		{
  426|     40|			decodeValueIfNeeded();
  427|     40|			return m_Value.getInt<T>();
  428|     40|		}
_ZNK4pcpp17Asn1IntegerRecord6BigInt6getIntIhTnNSt3__19enable_ifIXaasr3std11is_integralIT_EE5valuesr3std11is_unsignedIS5_EE5valueEiE4typeELi0EEES5_v:
  476|     40|			{
  477|     40|				if (!canFit<T>())
  ------------------
  |  Branch (477:9): [True: 0, False: 40]
  ------------------
  478|      0|				{
  479|      0|					throw std::overflow_error("Value cannot fit into requested int type");
  480|      0|				}
  481|       |
  482|     40|				std::stringstream sstream;
  483|     40|				sstream << std::hex << m_Value;
  484|       |
  485|     40|				uint64_t result;
  486|     40|				sstream >> result;
  487|     40|				return static_cast<T>(result);
  488|     40|			}
_ZNK4pcpp17Asn1IntegerRecord6BigInt6canFitIhTnNSt3__19enable_ifIXaasr3std11is_integralIT_EE5valuesr3std11is_unsignedIS5_EE5valueEiE4typeELi0EEEbv:
  491|     40|			{
  492|     40|				return sizeof(T) >= (m_Value.size() + 1) / 2;
  493|     40|			}
_ZN4pcpp10Asn1Record6castAsINS_21Asn1ConstructedRecordEEEPT_v:
  188|     86|		{
  189|     86|			auto result = dynamic_cast<Asn1RecordType*>(this);
  190|     86|			if (result == nullptr)
  ------------------
  |  Branch (190:8): [True: 0, False: 86]
  ------------------
  191|      0|			{
  192|      0|				throw std::bad_cast();
  193|      0|			}
  194|     86|			return result;
  195|     86|		}
_ZN4pcpp18Asn1SequenceRecordC2Ev:
  368|  3.65k|		Asn1SequenceRecord() = default;
_ZN4pcpp21Asn1ConstructedRecordC2Ev:
  319|  12.0k|		Asn1ConstructedRecord() = default;
_ZN4pcpp13Asn1SetRecordC2Ev:
  387|     28|		Asn1SetRecord() = default;
_ZN4pcpp17Asn1IntegerRecordC2Ev:
  447|  3.68k|		Asn1IntegerRecord() = default;
_ZN4pcpp19Asn1PrimitiveRecordC2Ev:
  398|  5.26k|		Asn1PrimitiveRecord() = default;
_ZN4pcpp20Asn1EnumeratedRecordC2Ev:
  526|  1.71k|		Asn1EnumeratedRecord() = default;
_ZN4pcpp21Asn1OctetStringRecordC2Ev:
  593|  1.72k|		Asn1OctetStringRecord() = default;
_ZN4pcpp25Asn1PrintableStringRecordC2Ev:
  627|      5|		Asn1PrintableStringRecord() = default;
_ZN4pcpp16Asn1StringRecordILNS_20Asn1UniversalTagTypeE19EEC2Ev:
  543|      5|		Asn1StringRecord() : Asn1PrimitiveRecord(TagType)
  544|      5|		{}
_ZN4pcpp17Asn1BooleanRecordC2Ev:
  671|      6|		Asn1BooleanRecord() = default;
_ZN4pcpp19Asn1BitStringRecordC2Ev:
  924|     20|		Asn1BitStringRecord() = default;
_ZN4pcpp26Asn1ObjectIdentifierRecordC2Ev:
  779|  1.54k|		Asn1ObjectIdentifierRecord() = default;
_ZN4pcpp17Asn1UtcTimeRecordC2Ev:
  839|      5|		Asn1UtcTimeRecord() = default;
_ZN4pcpp14Asn1TimeRecordC2Ev:
  808|      5|		Asn1TimeRecord() = default;
_ZN4pcpp17Asn1GenericRecordC2Ev:
  278|  3.78k|		Asn1GenericRecord() = default;
_ZN4pcpp10Asn1RecordC2Ev:
  207|  22.8k|		Asn1Record() = default;
_ZN4pcpp10Asn1RecordD2Ev:
  197|  22.8k|		virtual ~Asn1Record() = default;
_ZN4pcpp17Asn1IntegerRecord6BigIntC2Ev:
  458|  3.68k|			BigInt() = default;
_ZN4pcpp20Asn1ObjectIdentifierC2Ev:
  746|  1.54k|		Asn1ObjectIdentifier() = default;
_ZN4pcpp19Asn1BitStringRecord6BitSetC2Ev:
  903|     20|			BitSet() = default;
_ZN4pcpp17Asn1GenericRecordD2Ev:
  268|  3.78k|		~Asn1GenericRecord() override = default;
_ZN4pcpp16Asn1StringRecordILNS_20Asn1UniversalTagTypeE4EEC2Ev:
  543|  1.72k|		Asn1StringRecord() : Asn1PrimitiveRecord(TagType)
  544|  1.72k|		{}
_ZN4pcpp10Asn1Record6castAsINS_20Asn1EnumeratedRecordEEEPT_v:
  188|     40|		{
  189|     40|			auto result = dynamic_cast<Asn1RecordType*>(this);
  190|     40|			if (result == nullptr)
  ------------------
  |  Branch (190:8): [True: 0, False: 40]
  ------------------
  191|      0|			{
  192|      0|				throw std::bad_cast();
  193|      0|			}
  194|     40|			return result;
  195|     40|		}

_ZN4pcpp21BgpUpdateMessageLayer13prefix_and_ipC2EhRKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  269|  26.6k|			prefix_and_ip(uint8_t prefixVal, const std::string& ipAddrVal) : prefix(prefixVal), ipAddr(ipAddrVal)
  270|  26.6k|			{}
_ZN4pcpp8BgpLayer9isBgpPortEtt:
   66|   218k|		{
   67|   218k|			return portSrc == 179 || portDst == 179;
  ------------------
  |  Branch (67:11): [True: 8.30k, False: 210k]
  |  Branch (67:29): [True: 26.0k, False: 184k]
  ------------------
   68|   218k|		}
_ZNK4pcpp8BgpLayer16getOsiModelLayerEv:
   92|  8.52k|		{
   93|  8.52k|			return OsiModelApplicationLayer;
   94|  8.52k|		}
_ZN4pcpp8BgpLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  107|  58.1k|		    : Layer(data, dataLen, prevLayer, packet, BGP)
  108|  58.1k|		{}
_ZNK4pcpp8BgpLayer14getBasicHeaderEv:
  111|   542k|		{
  112|   542k|			return reinterpret_cast<bgp_common_header*>(m_Data);
  113|   542k|		}
_ZN4pcpp19BgpOpenMessageLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  172|  13.5k|		    : BgpLayer(data, dataLen, prevLayer, packet)
  173|  13.5k|		{}
_ZNK4pcpp19BgpOpenMessageLayer16getOpenMsgHeaderEv:
  195|  22.8k|		{
  196|  22.8k|			return reinterpret_cast<bgp_open_message*>(m_Data);
  197|  22.8k|		}
_ZNK4pcpp19BgpOpenMessageLayer17getBgpMessageTypeEv:
  235|  9.39k|		{
  236|  9.39k|			return BgpLayer::Open;
  237|  9.39k|		}
_ZN4pcpp21BgpUpdateMessageLayer13prefix_and_ipC2Ev:
  263|  6.54k|			prefix_and_ip() : prefix(0), ipAddr(IPv4Address::Zero)
  264|  6.54k|			{}
_ZN4pcpp21BgpUpdateMessageLayer14path_attributeC2Ev:
  289|  20.1k|			{}
_ZN4pcpp21BgpUpdateMessageLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  306|  40.5k|		    : BgpLayer(data, dataLen, prevLayer, packet)
  307|  40.5k|		{}
_ZNK4pcpp21BgpUpdateMessageLayer17getBgpMessageTypeEv:
  401|  21.5k|		{
  402|  21.5k|			return BgpLayer::Update;
  403|  21.5k|		}
_ZN4pcpp27BgpNotificationMessageLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  438|    525|		    : BgpLayer(data, dataLen, prevLayer, packet)
  439|    525|		{}
_ZNK4pcpp27BgpNotificationMessageLayer17getBgpMessageTypeEv:
  503|    416|		{
  504|    416|			return BgpLayer::Notification;
  505|    416|		}
_ZN4pcpp24BgpKeepaliveMessageLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  527|  2.98k|		    : BgpLayer(data, dataLen, prevLayer, packet)
  528|  2.98k|		{}
_ZNK4pcpp24BgpKeepaliveMessageLayer17getBgpMessageTypeEv:
  544|  2.29k|		{
  545|  2.29k|			return BgpLayer::Keepalive;
  546|  2.29k|		}
_ZN4pcpp27BgpRouteRefreshMessageLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  574|    517|		    : BgpLayer(data, dataLen, prevLayer, packet)
  575|    517|		{}
_ZNK4pcpp27BgpRouteRefreshMessageLayer17getBgpMessageTypeEv:
  593|    408|		{
  594|    408|			return BgpLayer::RouteRefresh;
  595|    408|		}
_ZN4pcpp19BgpOpenMessageLayer18optional_parameterC2Ev:
  157|  9.25k|			optional_parameter() = default;

_ZN4pcpp14CiscoHdlcLayer11isDataValidEPKhm:
   60|    691|		{
   61|    691|			return data && dataLen >= sizeof(cisco_hdlc_header);
  ------------------
  |  Branch (61:11): [True: 691, False: 0]
  |  Branch (61:19): [True: 531, False: 160]
  ------------------
   62|    691|		}
_ZN4pcpp14CiscoHdlcLayerC2EPhmPNS_6PacketE:
   28|    531|		CiscoHdlcLayer(uint8_t* data, size_t dataLen, Packet* packet) : Layer(data, dataLen, nullptr, packet, CiscoHDLC)
   29|    531|		{}
_ZNK4pcpp14CiscoHdlcLayer12getHeaderLenEv:
   68|    166|		{
   69|    166|			return sizeof(cisco_hdlc_header);
   70|    166|		}
_ZNK4pcpp14CiscoHdlcLayer16getOsiModelLayerEv:
   81|    166|		{
   82|    166|			return OsiModelDataLinkLayer;
   83|    166|		}
_ZNK4pcpp14CiscoHdlcLayer18getCiscoHdlcHeaderEv:
  121|    563|		{
  122|    563|			return reinterpret_cast<cisco_hdlc_header*>(m_Data);
  123|    563|		}

_ZN4pcpp9CotpLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   38|  13.1k|		    : Layer(data, dataLen, prevLayer, packet, COTP)
   39|  13.1k|		{}
_ZNK4pcpp9CotpLayer12getHeaderLenEv:
   58|  15.0k|		{
   59|  15.0k|			return sizeof(cotphdr);
   60|  15.0k|		}
_ZN4pcpp9CotpLayer22computeCalculateFieldsEv:
   76|  1.94k|		{}
_ZNK4pcpp9CotpLayer16getOsiModelLayerEv:
   90|  1.94k|		{
   91|  1.94k|			return OsiModelTransportLayer;
   92|  1.94k|		}

_ZNK4pcpp9DhcpLayer9getOpCodeEv:
  609|  3.73k|		{
  610|  3.73k|			return static_cast<BootpOpCodes>(getDhcpHeader()->opCode);
  611|  3.73k|		}
_ZNK4pcpp9DhcpLayer13getDhcpHeaderEv:
  603|  29.9k|		{
  604|  29.9k|			return reinterpret_cast<dhcp_header*>(m_Data);
  605|  29.9k|		}
_ZNK4pcpp9DhcpLayer18getClientIpAddressEv:
  616|  3.73k|		{
  617|  3.73k|			return getDhcpHeader()->clientIpAddress;
  618|  3.73k|		}
_ZNK4pcpp9DhcpLayer16getYourIpAddressEv:
  643|  3.73k|		{
  644|  3.73k|			return getDhcpHeader()->yourIpAddress;
  645|  3.73k|		}
_ZNK4pcpp9DhcpLayer18getServerIpAddressEv:
  630|  3.73k|		{
  631|  3.73k|			return getDhcpHeader()->serverIpAddress;
  632|  3.73k|		}
_ZNK4pcpp9DhcpLayer19getGatewayIpAddressEv:
  657|  3.73k|		{
  658|  3.73k|			return getDhcpHeader()->gatewayIpAddress;
  659|  3.73k|		}
_ZNK4pcpp10DhcpOption16getValueAsIpAddrEv:
  400|  3.69k|		{
  401|  3.69k|			return getValueAs<uint32_t>();
  402|  3.69k|		}
_ZNK4pcpp10DhcpOption16getValueAsStringEi:
  420|  3.69k|		{
  421|       |			// TODO: This will burn if valueOffset is negative.
  422|       |			// Should negative offsets even be allowed? Potentially change it to size_t?
  423|  3.69k|			if (m_Data == nullptr || getDataSize() < static_cast<size_t>(valueOffset) + 1)
  ------------------
  |  Branch (423:8): [True: 0, False: 3.69k]
  |  Branch (423:29): [True: 1.31k, False: 2.38k]
  ------------------
  424|  1.31k|				return "";
  425|       |
  426|  2.38k|			return std::string(reinterpret_cast<const char*>(m_Data->recordValue) + valueOffset,
  427|  2.38k|			                   static_cast<int>(m_Data->recordLen) - valueOffset);
  428|  3.69k|		}
_ZNK4pcpp10DhcpOption12getTotalSizeEv:
  471|  4.20M|		{
  472|  4.20M|			if (m_Data == nullptr)
  ------------------
  |  Branch (472:8): [True: 0, False: 4.20M]
  ------------------
  473|      0|				return 0;
  474|       |
  475|  4.20M|			if (m_Data->recordType == static_cast<uint8_t>(DHCPOPT_END) ||
  ------------------
  |  Branch (475:8): [True: 126k, False: 4.08M]
  ------------------
  476|  4.08M|			    m_Data->recordType == static_cast<uint8_t>(DHCPOPT_PAD))
  ------------------
  |  Branch (476:8): [True: 3.68M, False: 391k]
  ------------------
  477|  3.81M|				return sizeof(uint8_t);
  478|       |
  479|   391k|			return sizeof(uint8_t) * 2 + static_cast<size_t>(m_Data->recordLen);
  480|  4.20M|		}
_ZNK4pcpp10DhcpOption11getDataSizeEv:
  483|  16.6k|		{
  484|  16.6k|			if (m_Data == nullptr)
  ------------------
  |  Branch (484:8): [True: 0, False: 16.6k]
  ------------------
  485|      0|				return 0;
  486|       |
  487|  16.6k|			if (m_Data->recordType == static_cast<uint8_t>(DHCPOPT_END) ||
  ------------------
  |  Branch (487:8): [True: 1.22k, False: 15.4k]
  ------------------
  488|  15.4k|			    m_Data->recordType == static_cast<uint8_t>(DHCPOPT_PAD))
  ------------------
  |  Branch (488:8): [True: 1.38k, False: 14.0k]
  ------------------
  489|  2.60k|				return 0;
  490|       |
  491|  14.0k|			return m_Data->recordLen;
  492|  16.6k|		}
_ZN4pcpp10DhcpOptionC2EPh:
  391|   859k|		explicit DhcpOption(uint8_t* optionRawData) : TLVRecord(optionRawData)
  392|   859k|		{}
_ZN4pcpp10DhcpOption9canAssignEPKhm:
  453|   859k|		{
  454|   859k|			auto data = reinterpret_cast<TLVRawData const*>(recordRawData);
  455|   859k|			if (data == nullptr)
  ------------------
  |  Branch (455:8): [True: 0, False: 859k]
  ------------------
  456|      0|				return false;
  457|       |
  458|   859k|			if (tlvDataLen < sizeof(TLVRawData::recordType))
  ------------------
  |  Branch (458:8): [True: 5.88k, False: 853k]
  ------------------
  459|  5.88k|				return false;
  460|       |
  461|   853k|			if (data->recordType == static_cast<uint8_t>(DHCPOPT_END) ||
  ------------------
  |  Branch (461:8): [True: 25.8k, False: 827k]
  ------------------
  462|   827k|			    data->recordType == static_cast<uint8_t>(DHCPOPT_PAD))
  ------------------
  |  Branch (462:8): [True: 738k, False: 89.1k]
  ------------------
  463|   764k|				return true;
  464|       |
  465|  89.1k|			return TLVRecord<uint8_t, uint8_t>::canAssign(recordRawData, tlvDataLen);
  466|   853k|		}
_ZN4pcpp9DhcpLayer11isDataValidEPKhm:
  595|  21.8k|		{
  596|  21.8k|			return canReinterpretAs<dhcp_header>(data, dataLen);
  597|  21.8k|		}
_ZN4pcpp9DhcpLayer14parseNextLayerEv:
  744|  20.9k|		{}
_ZNK4pcpp9DhcpLayer12getHeaderLenEv:
  748|   521k|		{
  749|   521k|			return m_DataLen;
  750|   521k|		}
_ZNK4pcpp9DhcpLayer16getOsiModelLayerEv:
  822|  3.73k|		{
  823|  3.73k|			return OsiModelApplicationLayer;
  824|  3.73k|		}
_ZNK4pcpp9DhcpLayer17getOptionsBasePtrEv:
  831|   517k|		{
  832|   517k|			return m_Data + sizeof(dhcp_header);
  833|   517k|		}
_ZN4pcpp9DhcpLayer11isDhcpPortsEtt:
  845|   249k|	{
  846|   249k|		return ((portSrc == 68 && portDst == 67) || (portSrc == 67 && portDst == 68) ||
  ------------------
  |  Branch (846:12): [True: 17.2k, False: 232k]
  |  Branch (846:29): [True: 16.6k, False: 595]
  |  Branch (846:48): [True: 5.16k, False: 227k]
  |  Branch (846:65): [True: 2.12k, False: 3.03k]
  ------------------
  847|   230k|		        (portSrc == 67 && portDst == 67));
  ------------------
  |  Branch (847:12): [True: 3.03k, False: 227k]
  |  Branch (847:29): [True: 3.02k, False: 10]
  ------------------
  848|   249k|	}
_ZN4pcpp9DhcpLayerD2Ev:
  592|  20.9k|		~DhcpLayer() override = default;

_ZN4pcpp12DhcpV6OptionC2EPh:
  192|  15.3k|		explicit DhcpV6Option(uint8_t* optionRawData) : TLVRecord(optionRawData)
  193|  15.3k|		{}
_ZN4pcpp11DhcpV6Layer14parseNextLayerEv:
  353|  5.70k|		{}
_ZNK4pcpp11DhcpV6Layer12getHeaderLenEv:
  357|  13.8k|		{
  358|  13.8k|			return m_DataLen;
  359|  13.8k|		}
_ZN4pcpp11DhcpV6Layer22computeCalculateFieldsEv:
  363|  1.19k|		{}
_ZNK4pcpp11DhcpV6Layer16getOsiModelLayerEv:
  390|  1.19k|		{
  391|  1.19k|			return OsiModelApplicationLayer;
  392|  1.19k|		}
_ZNK4pcpp11DhcpV6Layer17getOptionsBasePtrEv:
  399|  12.6k|		{
  400|  12.6k|			return m_Data + sizeof(dhcpv6_header);
  401|  12.6k|		}
_ZNK4pcpp11DhcpV6Layer13getDhcpHeaderEv:
  403|  3.57k|		{
  404|  3.57k|			return reinterpret_cast<dhcpv6_header*>(m_Data);
  405|  3.57k|		}
_ZN4pcpp11DhcpV6Layer12isDhcpV6PortEt:
  414|   219k|	{
  415|   219k|		return (port == 546) || (port == 547);
  ------------------
  |  Branch (415:10): [True: 2.63k, False: 216k]
  |  Branch (415:27): [True: 3.06k, False: 213k]
  ------------------
  416|   219k|	}
_ZN4pcpp11DhcpV6Layer11isDataValidEPKhm:
  419|  5.70k|	{
  420|  5.70k|		return data && dataLen >= sizeof(dhcpv6_header);
  ------------------
  |  Branch (420:10): [True: 5.70k, False: 0]
  |  Branch (420:18): [True: 5.70k, False: 0]
  ------------------
  421|  5.70k|	}

_ZN4pcpp8DnsLayer14parseNextLayerEv:
  354|  40.2k|		{}
_ZNK4pcpp8DnsLayer12getHeaderLenEv:
  359|   117k|		{
  360|   117k|			return m_DataLen;
  361|   117k|		}  // No layer above DNS
_ZN4pcpp8DnsLayer22computeCalculateFieldsEv:
  365|  7.70k|		{}
_ZNK4pcpp8DnsLayer16getOsiModelLayerEv:
  370|  8.26k|		{
  371|  8.26k|			return OsiModelApplicationLayer;
  372|  8.26k|		}
_ZN4pcpp15DnsOverTcpLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  570|  2.77k|		    : DnsLayer(data, dataLen, prevLayer, packet, sizeof(uint16_t))
  571|  2.77k|		{}
_ZN4pcpp8DnsLayer9isDnsPortEt:
  619|   624k|	{
  620|   624k|		switch (port)
  621|   624k|		{
  622|  29.5k|		case 53:
  ------------------
  |  Branch (622:3): [True: 29.5k, False: 595k]
  ------------------
  623|  35.3k|		case 5353:
  ------------------
  |  Branch (623:3): [True: 5.79k, False: 619k]
  ------------------
  624|  40.2k|		case 5355:
  ------------------
  |  Branch (624:3): [True: 4.85k, False: 620k]
  ------------------
  625|  40.2k|			return true;
  626|   584k|		default:
  ------------------
  |  Branch (626:3): [True: 584k, False: 40.2k]
  ------------------
  627|   584k|			return false;
  628|   624k|		}
  629|   624k|	}
_ZN4pcpp8DnsLayer11isDataValidEPKhmb:
  632|   383k|	{
  633|   383k|		size_t minSize = sizeof(dnshdr) + (dnsOverTcp ? sizeof(uint16_t) : 0);
  ------------------
  |  Branch (633:38): [True: 166k, False: 216k]
  ------------------
  634|   383k|		return data && dataLen >= minSize;
  ------------------
  |  Branch (634:10): [True: 383k, False: 0]
  |  Branch (634:18): [True: 328k, False: 55.0k]
  ------------------
  635|   383k|	}

_ZNK4pcpp12IDnsResource15getNextResourceEv:
   47|   500k|		{
   48|   500k|			return m_NextResource;
   49|   500k|		}
_ZN4pcpp12IDnsResource15setNextResourceEPS0_:
   51|   132k|		{
   52|   132k|			m_NextResource = next;
   53|   132k|		}
_ZNK4pcpp12IDnsResource7getNameEv:
   78|  85.0k|		{
   79|  85.0k|			return m_DecodedName;
   80|  85.0k|		}
_ZN4pcpp8DnsQueryC2EPNS_8DnsLayerEm:
  117|  69.5k|		DnsQuery(DnsLayer* dnsLayer, size_t offsetInLayer) : IDnsResource(dnsLayer, offsetInLayer)
  118|  69.5k|		{}
_ZN4pcpp8DnsQueryC2EPh:
  120|  8.26k|		explicit DnsQuery(uint8_t* emptyRawData) : IDnsResource(emptyRawData)
  121|  8.26k|		{}
_ZNK4pcpp8DnsQuery7getSizeEv:
  128|   138k|		{
  129|   138k|			return m_NameLength + 2 * sizeof(uint16_t);
  130|   138k|		}
_ZNK4pcpp8DnsQuery7getTypeEv:
  132|  96.6k|		{
  133|  96.6k|			return DnsQueryType;
  134|  96.6k|		}
_ZN4pcpp11DnsResourceC2EPNS_8DnsLayerEmNS_15DnsResourceTypeE:
  147|  54.6k|		    : IDnsResource(dnsLayer, offsetInLayer)
  148|  54.6k|		{
  149|  54.6k|			m_ResourceType = resourceType;
  150|  54.6k|		}
_ZN4pcpp11DnsResourceC2EPhNS_15DnsResourceTypeE:
  153|  24.7k|		    : IDnsResource(emptyRawData), m_ResourceType(resType)
  154|  24.7k|		{}
_ZNK4pcpp11DnsResource7getSizeEv:
  219|   159k|		{
  220|   159k|			return m_NameLength + 3 * sizeof(uint16_t) + sizeof(uint32_t) + getDataLength();
  221|   159k|		}
_ZNK4pcpp11DnsResource7getTypeEv:
  223|   134k|		{
  224|   134k|			return m_ResourceType;
  225|   134k|		}
_ZN4pcpp12IDnsResourceD2Ev:
   60|   157k|		virtual ~IDnsResource() = default;

_ZN4pcpp19IPv4DnsResourceDataC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  168|  8.26k|		explicit IPv4DnsResourceData(const std::string& addrAsString) : m_Data(addrAsString)
  169|  8.26k|		{}
_ZN4pcpp16IDnsResourceDataC2Ev:
   31|  16.5k|		{}
_ZN4pcpp16IDnsResourceDataD2Ev:
   39|  8.26k|		virtual ~IDnsResourceData() = default;
_ZN4pcpp22GenericDnsResourceDataD2Ev:
  327|  8.26k|		{
  328|  8.26k|			if (m_Data != nullptr)
  ------------------
  |  Branch (328:8): [True: 8.26k, False: 0]
  ------------------
  329|  8.26k|				delete[] m_Data;
  330|  8.26k|		}
_ZNK4pcpp16IDnsResourceData8isTypeOfINS_19IPv4DnsResourceDataEEEbv:
   45|  15.0k|		{
   46|  15.0k|			return dynamic_cast<const IDnsResourceDataType*>(this) != nullptr;
   47|  15.0k|		}

_ZN4pcpp9DoIpLayer10isDoIpPortEt:
  667|   461k|	{
  668|   461k|		auto portAsEnum = static_cast<DoIpPorts>(port);
  669|   461k|		return (portAsEnum == DoIpPorts::TCP_UDP_PORT || portAsEnum == DoIpPorts::TLS_PORT);
  ------------------
  |  Branch (669:11): [True: 5, False: 461k]
  |  Branch (669:52): [True: 0, False: 461k]
  ------------------
  670|   461k|	}
_ZN4pcpp9DoIpLayer18isPayloadTypeValidEt:
  714|      5|	{
  715|      5|		const DoIpPayloadTypes payloadType = static_cast<DoIpPayloadTypes>(type);
  716|       |
  717|      5|		switch (payloadType)
  718|      5|		{
  719|      0|		case DoIpPayloadTypes::GENERIC_HEADER_NACK:
  ------------------
  |  Branch (719:3): [True: 0, False: 5]
  ------------------
  720|      0|		case DoIpPayloadTypes::VEHICLE_IDENTIFICATION_REQUEST:
  ------------------
  |  Branch (720:3): [True: 0, False: 5]
  ------------------
  721|      0|		case DoIpPayloadTypes::VEHICLE_IDENTIFICATION_REQUEST_WITH_EID:
  ------------------
  |  Branch (721:3): [True: 0, False: 5]
  ------------------
  722|      0|		case DoIpPayloadTypes::VEHICLE_IDENTIFICATION_REQUEST_WITH_VIN:
  ------------------
  |  Branch (722:3): [True: 0, False: 5]
  ------------------
  723|      0|		case DoIpPayloadTypes::VEHICLE_ANNOUNCEMENT_MESSAGE:
  ------------------
  |  Branch (723:3): [True: 0, False: 5]
  ------------------
  724|      0|		case DoIpPayloadTypes::ROUTING_ACTIVATION_REQUEST:
  ------------------
  |  Branch (724:3): [True: 0, False: 5]
  ------------------
  725|      0|		case DoIpPayloadTypes::ROUTING_ACTIVATION_RESPONSE:
  ------------------
  |  Branch (725:3): [True: 0, False: 5]
  ------------------
  726|      0|		case DoIpPayloadTypes::ALIVE_CHECK_REQUEST:
  ------------------
  |  Branch (726:3): [True: 0, False: 5]
  ------------------
  727|      0|		case DoIpPayloadTypes::ALIVE_CHECK_RESPONSE:
  ------------------
  |  Branch (727:3): [True: 0, False: 5]
  ------------------
  728|      0|		case DoIpPayloadTypes::ENTITY_STATUS_REQUEST:
  ------------------
  |  Branch (728:3): [True: 0, False: 5]
  ------------------
  729|      0|		case DoIpPayloadTypes::ENTITY_STATUS_RESPONSE:
  ------------------
  |  Branch (729:3): [True: 0, False: 5]
  ------------------
  730|      0|		case DoIpPayloadTypes::DIAGNOSTIC_POWER_MODE_REQUEST:
  ------------------
  |  Branch (730:3): [True: 0, False: 5]
  ------------------
  731|      0|		case DoIpPayloadTypes::DIAGNOSTIC_POWER_MODE_RESPONSE:
  ------------------
  |  Branch (731:3): [True: 0, False: 5]
  ------------------
  732|      0|		case DoIpPayloadTypes::DIAGNOSTIC_MESSAGE:
  ------------------
  |  Branch (732:3): [True: 0, False: 5]
  ------------------
  733|      0|		case DoIpPayloadTypes::DIAGNOSTIC_MESSAGE_ACK:
  ------------------
  |  Branch (733:3): [True: 0, False: 5]
  ------------------
  734|      0|		case DoIpPayloadTypes::DIAGNOSTIC_MESSAGE_NACK:
  ------------------
  |  Branch (734:3): [True: 0, False: 5]
  ------------------
  735|      0|			return true;
  736|       |
  737|      5|		default:
  ------------------
  |  Branch (737:3): [True: 5, False: 0]
  ------------------
  738|      5|			PCPP_LOG_DEBUG("[Malformed doip packet]: Invalid DoIP payload type: 0x" << std::hex << type);
  ------------------
  |  |  427|      5|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      5|	do                                                                                                                 \
  |  |  |  |  415|      5|	{                                                                                                                  \
  |  |  |  |  416|      5|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      5|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      5|#define LOG_MODULE PacketLogModuleDoIpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 5]
  |  |  |  |  ------------------
  |  |  |  |  418|      5|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDoIpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      5|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 5]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  739|      5|			return false;
  740|      5|		}
  741|      5|	}

_ZN4pcpp12EthDot3LayerC2EPhmPNS_5LayerEPNS_6PacketE:
   47|     32|		    : Layer(data, dataLen, prevLayer, packet, EthernetDot3)
   48|     32|		{}
_ZN4pcpp12EthDot3LayerC2EPhmPNS_6PacketE:
   38|  8.17k|		    : Layer(data, dataLen, nullptr, packet, EthernetDot3)
   39|  8.17k|		{}
_ZNK4pcpp12EthDot3Layer12getEthHeaderEv:
   62|  7.09k|		{
   63|  7.09k|			return reinterpret_cast<ether_dot3_header*>(m_Data);
   64|  7.09k|		}
_ZNK4pcpp12EthDot3Layer12getSourceMacEv:
   69|  3.54k|		{
   70|  3.54k|			return MacAddress(getEthHeader()->srcMac);
   71|  3.54k|		}
_ZNK4pcpp12EthDot3Layer10getDestMacEv:
   83|  3.54k|		{
   84|  3.54k|			return MacAddress(getEthHeader()->dstMac);
   85|  3.54k|		}
_ZNK4pcpp12EthDot3Layer12getHeaderLenEv:
  101|  1.77k|		{
  102|  1.77k|			return sizeof(ether_dot3_header);
  103|  1.77k|		}
_ZN4pcpp12EthDot3Layer22computeCalculateFieldsEv:
  107|  1.77k|		{}
_ZNK4pcpp12EthDot3Layer16getOsiModelLayerEv:
  112|  1.77k|		{
  113|  1.77k|			return OsiModelDataLinkLayer;
  114|  1.77k|		}

_ZN4pcpp8EthLayerC2EPhmPNS_6PacketE:
   76|   754k|		EthLayer(uint8_t* data, size_t dataLen, Packet* packet) : Layer(data, dataLen, nullptr, packet, Ethernet)
   77|   754k|		{}
_ZN4pcpp8EthLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   85|  11.4k|		    : Layer(data, dataLen, prevLayer, packet, Ethernet)
   86|  11.4k|		{}
_ZNK4pcpp8EthLayer12getEthHeaderEv:
  101|  1.48M|		{
  102|  1.48M|			return reinterpret_cast<ether_header*>(m_Data);
  103|  1.48M|		}
_ZNK4pcpp8EthLayer12getSourceMacEv:
  108|   289k|		{
  109|   289k|			return MacAddress(getEthHeader()->srcMac);
  110|   289k|		}
_ZNK4pcpp8EthLayer10getDestMacEv:
  122|   289k|		{
  123|   289k|			return MacAddress(getEthHeader()->dstMac);
  124|   289k|		}
_ZNK4pcpp8EthLayer12getHeaderLenEv:
  141|   248k|		{
  142|   248k|			return sizeof(ether_header);
  143|   248k|		}
_ZNK4pcpp8EthLayer16getOsiModelLayerEv:
  151|   144k|		{
  152|   144k|			return OsiModelDataLinkLayer;
  153|   144k|		}

_ZN4pcpp8FtpLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   17|  19.4k|		    : SingleCommandTextProtocol(data, dataLen, prevLayer, packet, FTPControl) {};
_ZN4pcpp8FtpLayer9isFtpPortEt:
   25|   295k|		{
   26|   295k|			return port == 21;
   27|   295k|		}
_ZN4pcpp8FtpLayer13isFtpDataPortEt:
   32|   269k|		{
   33|   269k|			return port == 20;
   34|   269k|		}
_ZN4pcpp8FtpLayer14parseNextLayerEv:
   40|  19.4k|		{}
_ZNK4pcpp8FtpLayer12getHeaderLenEv:
   44|  3.67k|		{
   45|  3.67k|			return m_DataLen;
   46|  3.67k|		}
_ZN4pcpp8FtpLayer22computeCalculateFieldsEv:
   50|  3.67k|		{}
_ZNK4pcpp8FtpLayer16getOsiModelLayerEv:
   54|  3.67k|		{
   55|  3.67k|			return OsiModelApplicationLayer;
   56|  3.67k|		}
_ZN4pcpp15FtpRequestLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  220|  6.65k|		    : FtpLayer(data, dataLen, prevLayer, packet) {};
_ZN4pcpp16FtpResponseLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  422|  12.8k|		    : FtpLayer(data, dataLen, prevLayer, packet) {};
_ZN4pcpp12FtpDataLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  507|  1.43k|		    : PayloadLayer(data, dataLen, prevLayer, packet)
  508|  1.43k|		{
  509|  1.43k|			m_Protocol = FTPData;
  510|  1.43k|		};

_ZN4pcpp11GeneveLayer12isGenevePortEt:
  152|   221k|		{
  153|   221k|			return port == DefaultPort;
  154|   221k|		}
_ZN4pcpp11GeneveLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  129|  5.66k|		    : Layer(data, dataLen, prevLayer, packet, Geneve)
  130|  5.66k|		{}
_ZN4pcpp12GeneveOptionC2EPh:
   47|    292|		explicit GeneveOption(uint8_t* optionData) : m_Data(reinterpret_cast<geneve_option_header*>(optionData))
   48|    292|		{}
_ZN4pcpp12GeneveOptionC2Ev:
   73|    383|		GeneveOption() : m_Data(nullptr)
   74|    383|		{}
_ZNK4pcpp12GeneveOption6isNullEv:
   78|    967|		{
   79|    967|			return m_Data == nullptr;
   80|    967|		}
_ZNK4pcpp11GeneveLayer16getOsiModelLayerEv:
  235|    675|		{
  236|    675|			return OsiModelDataLinkLayer;
  237|    675|		}
_ZNK4pcpp11GeneveLayer15getGeneveHeaderEv:
  333|  16.9k|		{
  334|  16.9k|			return reinterpret_cast<geneve_header*>(m_Data);
  335|  16.9k|		}

_ZNK4pcpp8GreLayer16getOsiModelLayerEv:
  137|  5.17k|		{
  138|  5.17k|			return OsiModelNetworkLayer;
  139|  5.17k|		}
_ZN4pcpp8GreLayerC2EPhmPNS_5LayerEPNS_6PacketEh:
  197|  29.6k|		    : Layer(data, dataLen, prevLayer, packet, protocol)
  198|  29.6k|		{}
_ZN4pcpp10GREv0LayerC2EPhmPNS_5LayerEPNS_6PacketE:
  229|  14.3k|		    : GreLayer(data, dataLen, prevLayer, packet, GREv0)
  230|  14.3k|		{}
_ZNK4pcpp10GREv0Layer12getGreHeaderEv:
  245|  19.4k|		{
  246|  19.4k|			return reinterpret_cast<gre_basic_header*>(m_Data);
  247|  19.4k|		}
_ZN4pcpp10GREv0Layer11isDataValidEPKhm:
  302|  14.3k|		{
  303|  14.3k|			return data && dataLen >= sizeof(gre_basic_header);
  ------------------
  |  Branch (303:11): [True: 14.3k, False: 0]
  |  Branch (303:19): [True: 14.3k, False: 0]
  ------------------
  304|  14.3k|		}
_ZN4pcpp10GREv1LayerC2EPhmPNS_5LayerEPNS_6PacketE:
  359|  15.3k|		    : GreLayer(data, dataLen, prevLayer, packet, GREv1)
  360|  15.3k|		{}
_ZNK4pcpp10GREv1Layer12getGreHeaderEv:
  377|  4.46k|		{
  378|  4.46k|			return reinterpret_cast<gre1_header*>(m_Data);
  379|  4.46k|		}
_ZN4pcpp10GREv1Layer11isDataValidEPKhm:
  404|  15.3k|		{
  405|  15.3k|			return data && dataLen >= sizeof(gre1_header);
  ------------------
  |  Branch (405:11): [True: 15.3k, False: 0]
  |  Branch (405:19): [True: 15.3k, False: 11]
  ------------------
  406|  15.3k|		}
_ZN4pcpp13PPP_PPTPLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  465|  5.76k|		    : Layer(data, dataLen, prevLayer, packet, PPP_PPTP)
  466|  5.76k|		{}
_ZNK4pcpp13PPP_PPTPLayer17getPPP_PPTPHeaderEv:
  479|  6.40k|		{
  480|  6.40k|			return reinterpret_cast<ppp_pptp_header*>(m_Data);
  481|  6.40k|		}
_ZNK4pcpp13PPP_PPTPLayer12getHeaderLenEv:
  496|  6.40k|		{
  497|  6.40k|			return sizeof(ppp_pptp_header);
  498|  6.40k|		}
_ZNK4pcpp13PPP_PPTPLayer8toStringEv:
  505|  1.29k|		{
  506|  1.29k|			return "PPP for PPTP Layer";
  507|  1.29k|		}
_ZNK4pcpp13PPP_PPTPLayer16getOsiModelLayerEv:
  510|    646|		{
  511|    646|			return OsiModelSessionLayer;
  512|    646|		}
_ZN4pcpp13PPP_PPTPLayer11isDataValidEPKhm:
  547|  6.15k|	{
  548|  6.15k|		return data && dataLen >= sizeof(ppp_pptp_header);
  ------------------
  |  Branch (548:10): [True: 6.15k, False: 0]
  |  Branch (548:18): [True: 5.76k, False: 392]
  ------------------
  549|  6.15k|	}

_ZN4pcpp10GtpV1LayerC2EPhmPNS_5LayerEPNS_6PacketE:
  291|  23.8k|		    : Layer(data, dataLen, prevLayer, packet, GTPv1)
  292|  23.8k|		{}
_ZNK4pcpp10GtpV1Layer9getHeaderEv:
  322|   103k|		{
  323|   103k|			return reinterpret_cast<gtpv1_header*>(m_Data);
  324|   103k|		}
_ZN4pcpp10GtpV1Layer11isGTPv1PortEt:
  387|   261k|		{
  388|   261k|			return port == 2152 /* GTP-U */ || port == 2123 /* GTP-C */;
  ------------------
  |  Branch (388:11): [True: 25.4k, False: 236k]
  |  Branch (388:39): [True: 10.8k, False: 225k]
  ------------------
  389|   261k|		}
_ZNK4pcpp10GtpV1Layer16getOsiModelLayerEv:
  409|  3.58k|		{
  410|  3.58k|			return OsiModelTransportLayer;
  411|  3.58k|		}
_ZN4pcpp16GtpV2MessageTypeC2ENS0_5ValueE:
  635|  13.2k|		constexpr GtpV2MessageType(Value value) : m_Value(value)
  636|  13.2k|		{}
_ZNK4pcpp16GtpV2MessageTypecvNS0_5ValueEEv:
  649|  6.74k|		{
  650|  6.74k|			return m_Value;
  651|  6.74k|		}
_ZN4pcpp10GtpV2LayerC2EPhmPNS_5LayerEPNS_6PacketE:
 1020|  20.6k|		    : Layer(data, dataLen, prevLayer, packet, GTPv2)
 1021|  20.6k|		{}
_ZN4pcpp10GtpV2Layer11isGTPv2PortEt:
 1037|   396k|		{
 1038|   396k|			return port == 2123;
 1039|   396k|		}
_ZNK4pcpp10GtpV2Layer16getOsiModelLayerEv:
 1153|  3.28k|		{
 1154|  3.28k|			return OsiModelTransportLayer;
 1155|  3.28k|		}
_ZNK4pcpp10GtpV2Layer9getHeaderEv:
 1213|  45.1k|		{
 1214|  45.1k|			return reinterpret_cast<gtpv2_basic_header*>(m_Data);
 1215|  45.1k|		}
_ZN4pcpp10GtpV2LayerD2Ev:
 1012|  20.6k|		~GtpV2Layer() override = default;

_ZN4pcpp9GvcpLayer10isGvcpPortEt:
   94|  90.7k|		{
   95|  90.7k|			return port == 3956;
   96|  90.7k|		}
_ZNK4pcpp9GvcpLayer16getOsiModelLayerEv:
  123|     62|		{
  124|     62|			return OsiModelApplicationLayer;
  125|     62|		}
_ZN4pcpp9GvcpLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  158|    310|		    : Layer(data, dataLen, prevLayer, packet, GVCP)
  159|    310|		{}
_ZN4pcpp20GvcpAcknowledgeLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  388|    310|		    : GvcpLayer(data, dataLen, prevLayer, packet)
  389|    310|		{}
_ZNK4pcpp20GvcpAcknowledgeLayer12getHeaderLenEv:
  432|    372|		{
  433|    372|			return sizeof(gvcp_ack_header);
  434|    372|		}
_ZNK4pcpp20GvcpAcknowledgeLayer13getGvcpHeaderEv:
  503|    434|		{
  504|    434|			return reinterpret_cast<gvcp_ack_header*>(m_Data);
  505|    434|		}

_ZN4pcpp11HttpMessage10isHttpPortEt:
   75|   780k|		{
   76|   780k|			return port == 80 || port == 8080;
  ------------------
  |  Branch (76:11): [True: 28.5k, False: 752k]
  |  Branch (76:25): [True: 46.1k, False: 706k]
  ------------------
   77|   780k|		}
_ZNK4pcpp22HttpResponseStatusCode17isUnsupportedCodeEv:
  518|  11.4k|		{
  519|  11.4k|			return m_Value > 599;
  520|  11.4k|		}
_ZNK4pcpp11HttpMessage16getOsiModelLayerEv:
   88|  10.5k|		{
   89|  10.5k|			return OsiModelApplicationLayer;
   90|  10.5k|		}
_ZN4pcpp11HttpMessageC2EPhmPNS_5LayerEPNS_6PacketEh:
  127|  55.2k|		    : TextBasedProtocolMessage(data, dataLen, prevLayer, packet, protocol)
  128|  55.2k|		{}
_ZNK4pcpp11HttpMessage32getHeaderFieldNameValueSeparatorEv:
  141|  55.2k|		{
  142|  55.2k|			return ':';
  143|  55.2k|		}
_ZNK4pcpp11HttpMessage43spacesAllowedBetweenHeaderFieldNameAndValueEv:
  145|  55.2k|		{
  146|  55.2k|			return true;
  147|  55.2k|		}
_ZN4pcpp22HttpResponseStatusCodeC2ENS0_5ValueE:
  480|    364|		HttpResponseStatusCode(Value statusCode) : m_Value(statusCode)
  481|    364|		{}
_ZNK4pcpp22HttpResponseStatusCodecvNS0_5ValueEEv:
  495|  22.9k|		{
  496|  22.9k|			return m_Value;
  497|  22.9k|		}
_ZNK4pcpp20HttpRequestFirstLine7getSizeEv:
  708|  60.9k|		{
  709|  60.9k|			return m_FirstLineEndOffset;
  710|  60.9k|		}
_ZN4pcpp20HttpRequestFirstLine29HttpRequestFirstLineExceptionD2Ev:
  729|  43.9k|			{}
_ZNK4pcpp21HttpResponseFirstLine7getSizeEv:
  828|  15.3k|		{
  829|  15.3k|			return m_FirstLineEndOffset;
  830|  15.3k|		}
_ZN4pcpp21HttpResponseFirstLine30HttpResponseFirstLineExceptionD2Ev:
  850|  11.3k|			{}
_ZN4pcpp22HttpResponseStatusCodeC2Ev:
  475|  11.3k|		HttpResponseStatusCode() = default;

_ZN4pcpp7IPLayerC2Ev:
   20|   834k|		IPLayer() = default;
_ZN4pcpp7IPLayerD2Ev:
   32|   834k|		virtual ~IPLayer() = default;

_ZN4pcpp25AuthenticationHeaderLayer11isDataValidEPKhm:
  228|  1.17k|	{
  229|  1.17k|		if (dataLen < sizeof(ipsec_authentication_header))
  ------------------
  |  Branch (229:7): [True: 0, False: 1.17k]
  ------------------
  230|      0|			return false;
  231|       |
  232|  1.17k|		size_t payloadLen = 4 * (data[1] + 2);
  233|  1.17k|		if (payloadLen < sizeof(ipsec_authentication_header) || payloadLen > dataLen)
  ------------------
  |  Branch (233:7): [True: 0, False: 1.17k]
  |  Branch (233:59): [True: 3, False: 1.17k]
  ------------------
  234|      3|			return false;
  235|       |
  236|  1.17k|		return true;
  237|  1.17k|	}
_ZN4pcpp25AuthenticationHeaderLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   54|  1.17k|		    : Layer(data, dataLen, prevLayer, packet, AuthenticationHeader)
   55|  1.17k|		{}
_ZN4pcpp8ESPLayer11isDataValidEPKhm:
  240|    100|	{
  241|    100|		return data && dataLen >= sizeof(ipsec_esp);
  ------------------
  |  Branch (241:10): [True: 100, False: 0]
  |  Branch (241:18): [True: 100, False: 0]
  ------------------
  242|    100|	}
_ZN4pcpp8ESPLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  153|    100|		    : Layer(data, dataLen, prevLayer, packet, ESP)
  154|    100|		{}
_ZNK4pcpp25AuthenticationHeaderLayer11getAHHeaderEv:
   61|  2.58k|		{
   62|  2.58k|			return reinterpret_cast<ipsec_authentication_header*>(m_Data);
   63|  2.58k|		}
_ZNK4pcpp25AuthenticationHeaderLayer12getHeaderLenEv:
   90|  1.40k|		{
   91|  1.40k|			return static_cast<size_t>(4) * (getAHHeader()->payloadLen + 2);
   92|  1.40k|		}
_ZN4pcpp25AuthenticationHeaderLayer22computeCalculateFieldsEv:
  100|    235|		{}
_ZNK4pcpp25AuthenticationHeaderLayer16getOsiModelLayerEv:
  105|    235|		{
  106|    235|			return OsiModelNetworkLayer;
  107|    235|		}
_ZNK4pcpp8ESPLayer12getESPHeaderEv:
  157|     40|		{
  158|     40|			return reinterpret_cast<ipsec_esp*>(m_Data);
  159|     40|		}
_ZNK4pcpp8ESPLayer12getHeaderLenEv:
  177|    120|		{
  178|    120|			return sizeof(ipsec_esp);
  179|    120|		}
_ZN4pcpp8ESPLayer22computeCalculateFieldsEv:
  186|     20|		{}
_ZNK4pcpp8ESPLayer16getOsiModelLayerEv:
  191|     20|		{
  192|     20|			return OsiModelTransportLayer;
  193|     20|		}

_ZNK4pcpp9IPv4Layer13getIPv4HeaderEv:
  450|  5.36M|		{
  451|  5.36M|			return reinterpret_cast<iphdr*>(m_Data);
  452|  5.36M|		}
_ZNK4pcpp9IPv4Layer15getSrcIPAddressEv:
  458|  1.30k|		{
  459|  1.30k|			return getSrcIPv4Address();
  460|  1.30k|		}
_ZNK4pcpp9IPv4Layer17getSrcIPv4AddressEv:
  465|   382k|		{
  466|   382k|			return getIPv4Header()->ipSrc;
  467|   382k|		}
_ZNK4pcpp9IPv4Layer15getDstIPAddressEv:
  480|  1.30k|		{
  481|  1.30k|			return getDstIPv4Address();
  482|  1.30k|		}
_ZNK4pcpp9IPv4Layer17getDstIPv4AddressEv:
  487|   382k|		{
  488|   382k|			return getIPv4Header()->ipDst;
  489|   382k|		}
_ZNK4pcpp9IPv4Layer12getHeaderLenEv:
  584|  1.05M|		{
  585|  1.05M|			return static_cast<size_t>(static_cast<uint16_t>(getIPv4Header()->internetHeaderLength) * 4) +
  586|  1.05M|			       m_TempHeaderExtension;
  587|  1.05M|		}
_ZNK4pcpp9IPv4Layer16getOsiModelLayerEv:
  600|   132k|		{
  601|   132k|			return OsiModelNetworkLayer;
  602|   132k|		}
_ZN4pcpp9IPv4Layer11isDataValidEPKhm:
  675|   719k|	{
  676|   719k|		const iphdr* hdr = reinterpret_cast<const iphdr*>(data);
  677|   719k|		return canReinterpretAs<iphdr>(data, dataLen) && hdr->ipVersion == 4 && hdr->internetHeaderLength >= 5;
  ------------------
  |  Branch (677:10): [True: 716k, False: 2.77k]
  |  Branch (677:52): [True: 714k, False: 2.14k]
  |  Branch (677:75): [True: 714k, False: 288]
  ------------------
  678|   719k|	}

_ZNK4pcpp13IPv6Extension15getExtensionLenEv:
   41|  24.8k|		{
   42|  24.8k|			return 8 * (getBaseHeader()->headerLen + 1);
   43|  24.8k|		}
_ZNK4pcpp13IPv6Extension16getExtensionTypeEv:
   47|  8.11k|		{
   48|  8.11k|			return m_ExtType;
   49|  8.11k|		}
_ZNK4pcpp13IPv6Extension13getNextHeaderEv:
   58|  19.9k|		{
   59|  19.9k|			return m_NextHeader;
   60|  19.9k|		}
_ZN4pcpp13IPv6ExtensionC2EPNS_14IDataContainerEm:
   71|  13.0k|		    : m_NextHeader(nullptr), m_ExtType(IPv6ExtensionUnknown), m_DataContainer(dataContainer), m_Offset(offset),
   72|  13.0k|		      m_ShadowData(nullptr)
   73|  13.0k|		{}
_ZNK4pcpp13IPv6Extension13getBaseHeaderEv:
   89|  47.1k|		{
   90|  47.1k|			return reinterpret_cast<ipv6_ext_base_header*>(getDataPtr());
   91|  47.1k|		}
_ZN4pcpp13IPv6Extension13setNextHeaderEPS0_:
   94|  4.16k|		{
   95|  4.16k|			m_NextHeader = nextHeader;
   96|  4.16k|		}
_ZN4pcpp23IPv6FragmentationHeaderC2EPNS_14IDataContainerEm:
  157|    959|		IPv6FragmentationHeader(IDataContainer* dataContainer, size_t offset) : IPv6Extension(dataContainer, offset)
  158|    959|		{
  159|    959|			m_ExtType = IPv6Fragmentation;
  160|    959|		}
_ZN4pcpp18IPv6HopByHopHeaderC2EPNS_14IDataContainerEm:
  328|  11.4k|		IPv6HopByHopHeader(IDataContainer* dataContainer, size_t offset) : IPv6TLVOptionHeader(dataContainer, offset)
  329|  11.4k|		{
  330|  11.4k|			m_ExtType = IPv6HopByHop;
  331|  11.4k|		}
_ZNK4pcpp24IPv6AuthenticationHeader15getExtensionLenEv:
  483|  1.29k|		{
  484|  1.29k|			return 4 * (getBaseHeader()->headerLen + 2);
  485|  1.29k|		}
_ZN4pcpp24IPv6AuthenticationHeaderC2EPNS_14IDataContainerEm:
  488|    649|		IPv6AuthenticationHeader(IDataContainer* dataContainer, size_t offset) : IPv6Extension(dataContainer, offset)
  489|    649|		{
  490|    649|			m_ExtType = IPv6AuthenticationHdr;
  491|    649|		}

_ZN4pcpp9IPv6Layer11isDataValidEPKhm:
  304|   120k|	{
  305|   120k|		auto ip6Header = reinterpret_cast<const ip6_hdr*>(data);
  306|   120k|		return canReinterpretAs<ip6_hdr>(data, dataLen) && ip6Header->ipVersion == 6;
  ------------------
  |  Branch (306:10): [True: 120k, False: 404]
  |  Branch (306:54): [True: 119k, False: 194]
  ------------------
  307|   120k|	}
_ZNK4pcpp9IPv6Layer13getIPv6HeaderEv:
   83|   507k|		{
   84|   507k|			return reinterpret_cast<ip6_hdr*>(m_Data);
   85|   507k|		}
_ZNK4pcpp9IPv6Layer15getSrcIPAddressEv:
   91|  1.73k|		{
   92|  1.73k|			return getSrcIPv6Address();
   93|  1.73k|		}
_ZNK4pcpp9IPv6Layer17getSrcIPv6AddressEv:
   98|  68.2k|		{
   99|  68.2k|			return getIPv6Header()->ipSrc;
  100|  68.2k|		}
_ZNK4pcpp9IPv6Layer15getDstIPAddressEv:
  120|  1.73k|		{
  121|  1.73k|			return getDstIPv6Address();
  122|  1.73k|		}
_ZNK4pcpp9IPv6Layer17getDstIPv6AddressEv:
  127|  68.2k|		{
  128|  68.2k|			return getIPv6Header()->ipDst;
  129|  68.2k|		}
_ZNK4pcpp9IPv6Layer12getHeaderLenEv:
  177|   271k|		{
  178|   271k|			return sizeof(ip6_hdr) + m_ExtensionsLen;
  179|   271k|		}
_ZNK4pcpp9IPv6Layer16getOsiModelLayerEv:
  191|  22.9k|		{
  192|  22.9k|			return OsiModelNetworkLayer;
  193|  22.9k|		}

_ZNK4pcpp9IcmpLayer15isMessageOfTypeENS_15IcmpMessageTypeE:
  373|  28.6k|		{
  374|  28.6k|			return getMessageType() == type;
  375|  28.6k|		}
_ZN4pcpp9IcmpLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  350|  20.9k|		    : Layer(data, dataLen, prevLayer, packet, ICMP)
  351|  20.9k|		{}
_ZNK4pcpp9IcmpLayer13getIcmpHeaderEv:
  363|   113k|		{
  364|   113k|			return reinterpret_cast<icmphdr*>(m_Data);
  365|   113k|		}
_ZNK4pcpp9IcmpLayer16getOsiModelLayerEv:
  616|  3.84k|		{
  617|  3.84k|			return OsiModelNetworkLayer;
  618|  3.84k|		}
_ZN4pcpp9IcmpLayer11isDataValidEPKhm:
  724|  21.1k|	{
  725|  21.1k|		if (dataLen < sizeof(icmphdr))
  ------------------
  |  Branch (725:7): [True: 0, False: 21.1k]
  ------------------
  726|      0|			return false;
  727|       |
  728|  21.1k|		uint8_t type = data[0];
  729|       |
  730|       |		// ICMP_ECHO_REQUEST, ICMP_ECHO_REPLY, ICMP_ROUTER_SOL
  731|  21.1k|		if (type == 8 || type == 0 || type == 10)
  ------------------
  |  Branch (731:7): [True: 3.35k, False: 17.8k]
  |  Branch (731:20): [True: 3.95k, False: 13.8k]
  |  Branch (731:33): [True: 0, False: 13.8k]
  ------------------
  732|  7.30k|			return true;
  733|       |
  734|       |		// ICMP_INFO_REQUEST, ICMP_INFO_REPLY
  735|  13.8k|		if (type == 15 || type == 16)
  ------------------
  |  Branch (735:7): [True: 0, False: 13.8k]
  |  Branch (735:21): [True: 5.65k, False: 8.21k]
  ------------------
  736|  5.65k|			return dataLen >= sizeof(icmp_info_request);
  737|       |
  738|       |		// ICMP_TIMESTAMP_REQUEST, ICMP_TIMESTAMP_REPLY
  739|  8.21k|		if (type == 13 || type == 14)
  ------------------
  |  Branch (739:7): [True: 248, False: 7.96k]
  |  Branch (739:21): [True: 796, False: 7.17k]
  ------------------
  740|  1.04k|			return dataLen >= sizeof(icmp_timestamp_request);
  741|       |
  742|       |		// ICMP_ADDRESS_MASK_REPLY, ICMP_ADDRESS_MASK_REQUEST
  743|  7.17k|		if (type == 17 || type == 18)
  ------------------
  |  Branch (743:7): [True: 156, False: 7.01k]
  |  Branch (743:21): [True: 2.04k, False: 4.97k]
  ------------------
  744|  2.19k|			return dataLen >= sizeof(icmp_address_mask_request);
  745|       |
  746|       |		// ICMP_DEST_UNREACHABLE
  747|  4.97k|		if (type == 3)
  ------------------
  |  Branch (747:7): [True: 2.44k, False: 2.53k]
  ------------------
  748|  2.44k|			return dataLen >= sizeof(icmp_destination_unreachable);
  749|       |
  750|       |		// ICMP_REDIRECT
  751|  2.53k|		if (type == 5)
  ------------------
  |  Branch (751:7): [True: 948, False: 1.58k]
  ------------------
  752|    948|			return dataLen >= sizeof(icmp_redirect);
  753|       |
  754|       |		// ICMP_TIME_EXCEEDED, ICMP_SOURCE_QUENCH
  755|  1.58k|		if (type == 4 || type == 11)
  ------------------
  |  Branch (755:7): [True: 272, False: 1.31k]
  |  Branch (755:20): [True: 667, False: 644]
  ------------------
  756|    939|			return dataLen >= sizeof(icmp_time_exceeded);
  757|       |
  758|       |		// ICMP_PARAM_PROBLEM
  759|    644|		if (type == 12)
  ------------------
  |  Branch (759:7): [True: 386, False: 258]
  ------------------
  760|    386|			return dataLen >= sizeof(icmp_param_problem);
  761|       |
  762|       |		// ICMP_ROUTER_ADV
  763|    258|		if (type == 9)
  ------------------
  |  Branch (763:7): [True: 138, False: 120]
  ------------------
  764|    138|		{
  765|    138|			if (dataLen < sizeof(icmp_router_advertisement_hdr))
  ------------------
  |  Branch (765:8): [True: 0, False: 138]
  ------------------
  766|      0|				return false;
  767|       |
  768|    138|			const auto* routerAdv = reinterpret_cast<const icmp_router_advertisement_hdr*>(data);
  769|    138|			return routerAdv->advertisementCount <=
  770|    138|			       (dataLen - sizeof(icmp_router_advertisement_hdr)) / sizeof(icmp_router_address_structure);
  771|    138|		}
  772|       |
  773|    120|		return false;
  774|    258|	}

_ZN4pcpp11IcmpV6LayerC2EPhmPNS_5LayerEPNS_6PacketE:
  132|  8.59k|		    : Layer(data, dataLen, prevLayer, packet, ICMPv6)
  133|  8.59k|		{}
_ZN4pcpp11IcmpV6Layer14parseNextLayerEv:
  170|  8.59k|		{}
_ZNK4pcpp11IcmpV6Layer12getHeaderLenEv:
  174|  4.49k|		{
  175|  4.49k|			return m_DataLen;
  176|  4.49k|		}
_ZNK4pcpp11IcmpV6Layer16getOsiModelLayerEv:
  182|  2.21k|		{
  183|  2.21k|			return OsiModelNetworkLayer;
  184|  2.21k|		}
_ZNK4pcpp11IcmpV6Layer15getIcmpv6HeaderEv:
  226|  7.22k|		{
  227|  7.22k|			return reinterpret_cast<icmpv6hdr*>(m_Data);
  228|  7.22k|		}
_ZN4pcpp15ICMPv6EchoLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  251|    628|		    : IcmpV6Layer(data, dataLen, prevLayer, packet)
  252|    628|		{}

_ZN4pcpp11IgmpV1Layer11isDataValidEPKhm:
  244|  2.82k|		{
  245|  2.82k|			return canReinterpretAs<igmp_header>(data, dataLen);
  246|  2.82k|		}
_ZN4pcpp11IgmpV1LayerC2EPhmPNS_5LayerEPNS_6PacketE:
  220|  2.82k|		    : IgmpLayer(data, dataLen, prevLayer, packet, IGMPv1)
  221|  2.82k|		{}
_ZN4pcpp9IgmpLayerC2EPhmPNS_5LayerEPNS_6PacketEh:
  142|  9.60k|		    : Layer(data, dataLen, prevLayer, packet, igmpVer)
  143|  9.60k|		{}
_ZN4pcpp11IgmpV2Layer11isDataValidEPKhm:
  287|  4.37k|		{
  288|  4.37k|			return canReinterpretAs<igmp_header>(data, dataLen);
  289|  4.37k|		}
_ZN4pcpp11IgmpV2LayerC2EPhmPNS_5LayerEPNS_6PacketE:
  261|  4.37k|		    : IgmpLayer(data, dataLen, prevLayer, packet, IGMPv2)
  262|  4.37k|		{}
_ZN4pcpp17IgmpV3ReportLayer11isDataValidEPKhm:
  477|  2.40k|		{
  478|  2.40k|			return canReinterpretAs<igmpv3_report_header>(data, dataLen);
  479|  2.40k|		}
_ZN4pcpp17IgmpV3ReportLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  394|  2.40k|		    : IgmpLayer(data, dataLen, prevLayer, packet, IGMPv3)
  395|  2.40k|		{}
_ZNK4pcpp9IgmpLayer13getIgmpHeaderEv:
  158|  7.61k|		{
  159|  7.61k|			return reinterpret_cast<igmp_header*>(m_Data);
  160|  7.61k|		}
_ZN4pcpp9IgmpLayer14parseNextLayerEv:
  192|  9.60k|		{}
_ZNK4pcpp9IgmpLayer12getHeaderLenEv:
  196|  2.91k|		{
  197|  2.91k|			return sizeof(igmp_header);
  198|  2.91k|		}
_ZNK4pcpp9IgmpLayer16getOsiModelLayerEv:
  203|  2.05k|		{
  204|  2.05k|			return OsiModelNetworkLayer;
  205|  2.05k|		}
_ZNK4pcpp17IgmpV3ReportLayer15getReportHeaderEv:
  405|    597|		{
  406|    597|			return reinterpret_cast<igmpv3_report_header*>(m_Data);
  407|    597|		}
_ZNK4pcpp17IgmpV3ReportLayer12getHeaderLenEv:
  468|  1.19k|		{
  469|  1.19k|			return m_DataLen;
  470|  1.19k|		}

_ZN4pcpp8LLCLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   37|  10.4k|		    : Layer(data, dataLen, prevLayer, packet, LLC)
   38|  10.4k|		{}
_ZNK4pcpp8LLCLayer12getLlcHeaderEv:
   49|  10.4k|		{
   50|  10.4k|			return reinterpret_cast<llc_header*>(m_Data);
   51|  10.4k|		};
_ZN4pcpp8LLCLayer22computeCalculateFieldsEv:
   60|  2.04k|		{}
_ZNK4pcpp8LLCLayer12getHeaderLenEv:
   64|  2.04k|		{
   65|  2.04k|			return sizeof(llc_header);
   66|  2.04k|		}
_ZNK4pcpp8LLCLayer16getOsiModelLayerEv:
   73|  2.04k|		{
   74|  2.04k|			return OsiModelDataLinkLayer;
   75|  2.04k|		}

_ZNK4pcpp5Layer12getNextLayerEv:
  127|   139M|		{
  128|   139M|			return m_NextLayer;
  129|   139M|		}
_ZNK4pcpp5Layer12getPrevLayerEv:
  133|  1.26M|		{
  134|  1.26M|			return m_PrevLayer;
  135|  1.26M|		}
_ZNK4pcpp5Layer11getProtocolEv:
  139|   101M|		{
  140|   101M|			return m_Protocol;
  141|   101M|		}
_ZNK4pcpp5Layer7getDataEv:
  150|   212k|		{
  151|   212k|			return m_Data;
  152|   212k|		}
_ZNK4pcpp5Layer10getDataLenEv:
  156|  1.73M|		{
  157|  1.73M|			return m_DataLen;
  158|  1.73M|		}
_ZNK4pcpp5Layer19getLayerPayloadSizeEv:
  168|  16.7k|		{
  169|  16.7k|			return m_DataLen - getHeaderLen();
  170|  16.7k|		}
_ZNK4pcpp5Layer19isAllocatedToPacketEv:
  182|  6.75M|		{
  183|  6.75M|			return m_AllocationInfo.attachedPacket != nullptr;
  184|  6.75M|		}
_ZNK4pcpp5Layer10getDataPtrEm:
  239|   133k|		{
  240|   133k|			return static_cast<uint8_t*>(m_Data + offset);
  241|   133k|		}
_ZN4pcpp5LayerC2EPhmPS0_PNS_6PacketEh:
  276|  6.64M|		    : m_Data(data), m_DataLen(dataLen), m_Protocol(protocol), m_NextLayer(nullptr), m_PrevLayer(prevLayer),
  277|  6.64M|		      m_AllocationInfo{ packet, false }
  278|  6.64M|		{}
_ZN4pcpp5Layer17getAttachedPacketEv:
  287|  6.38M|		{
  288|  6.38M|			return m_AllocationInfo.attachedPacket;
  289|  6.38M|		}
_ZNK4pcpp5Layer17getAttachedPacketEv:
  294|  3.03k|		{
  295|  3.03k|			return m_AllocationInfo.attachedPacket;
  296|  3.03k|		}
_ZN4pcpp5Layer12setNextLayerEPS0_:
  299|  5.86M|		{
  300|  5.86M|			m_NextLayer = nextLayer;
  301|  5.86M|		}
_ZNK4pcpp5Layer12hasNextLayerEv:
  327|  8.28M|		{
  328|  8.28M|			return m_NextLayer != nullptr;
  329|  8.28M|		}
_ZN4pcpp5Layer16canReinterpretAsINS_6arphdrEEEbPKhm:
  587|  18.1k|		{
  588|  18.1k|			return data != nullptr && dataLen >= sizeof(T);
  ------------------
  |  Branch (588:11): [True: 18.1k, False: 0]
  |  Branch (588:30): [True: 17.9k, False: 132]
  ------------------
  589|  18.1k|		}
_ZN4pcpp5Layer16canReinterpretAsINS_5iphdrEEEbPKhm:
  587|   719k|		{
  588|   719k|			return data != nullptr && dataLen >= sizeof(T);
  ------------------
  |  Branch (588:11): [True: 719k, False: 0]
  |  Branch (588:30): [True: 716k, False: 2.77k]
  ------------------
  589|   719k|		}
_ZN4pcpp5Layer16canReinterpretAsINS_11dhcp_headerEEEbPKhm:
  587|  21.8k|		{
  588|  21.8k|			return data != nullptr && dataLen >= sizeof(T);
  ------------------
  |  Branch (588:11): [True: 21.8k, False: 0]
  |  Branch (588:30): [True: 20.9k, False: 905]
  ------------------
  589|  21.8k|		}
_ZN4pcpp5Layer16canReinterpretAsINS_11vrrp_headerEEEbPKhm:
  587|  8.27k|		{
  588|  8.27k|			return data != nullptr && dataLen >= sizeof(T);
  ------------------
  |  Branch (588:11): [True: 8.27k, False: 0]
  |  Branch (588:30): [True: 8.27k, False: 0]
  ------------------
  589|  8.27k|		}
_ZN4pcpp14IDataContainerD2Ev:
   30|  6.75M|		virtual ~IDataContainer() = default;
_ZN4pcpp5Layer29constructNextLayerFromFactoryIPFPNS_8BgpLayerEPhmPS0_PNS_6PacketEEJEEES5_T_S4_mDpOT0_:
  387|  42.1k|		{
  388|  42.1k|			return constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, getAttachedPacket(),
  389|  42.1k|			                                               std::forward<Args>(extraArgs)...);
  390|  42.1k|		}
_ZN4pcpp5Layer29constructNextLayerFromFactoryIPFPNS_8BgpLayerEPhmPS0_PNS_6PacketEEJEEES5_T_S4_mS7_DpOT0_:
  411|  76.4k|		{
  412|  76.4k|			if (hasNextLayer())
  ------------------
  |  Branch (412:8): [True: 0, False: 76.4k]
  ------------------
  413|      0|			{
  414|      0|				throw std::runtime_error("Next layer already exists");
  415|      0|			}
  416|       |
  417|       |			// cppcheck-suppress redundantInitialization
  418|  76.4k|			Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  419|  76.4k|			setNextLayer(newLayer);
  420|  76.4k|			return newLayer;
  421|  76.4k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_9IPv4LayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|   680k|		{
  483|   680k|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|   680k|			                                                       std::forward<Args>(extraArgs)...);
  485|   680k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_9IPv4LayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|   680k|		{
  505|   680k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 675k, False: 4.87k]
  ------------------
  506|   675k|			{
  507|   675k|				return m_NextLayer;
  508|   675k|			}
  509|       |
  510|  4.87k|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|   680k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_9IPv4LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|   680k|		{
  457|   680k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 675k, False: 4.87k]
  ------------------
  458|   675k|			{
  459|   675k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|   675k|			}
  461|  4.87k|			return nullptr;
  462|   680k|		}
_ZN4pcpp5Layer18constructNextLayerINS_9IPv4LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|   675k|		{
  358|   675k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 675k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|   675k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|   675k|			setNextLayer(newLayer);
  365|   675k|			return newLayer;
  366|   675k|		}
_ZN4pcpp5Layer18constructNextLayerINS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|   232k|		{
  358|   232k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 232k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|   232k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|   232k|			setNextLayer(newLayer);
  365|   232k|			return newLayer;
  366|   232k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_9IPv6LayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|   110k|		{
  483|   110k|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|   110k|			                                                       std::forward<Args>(extraArgs)...);
  485|   110k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_9IPv6LayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|   117k|		{
  505|   117k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 117k, False: 342]
  ------------------
  506|   117k|			{
  507|   117k|				return m_NextLayer;
  508|   117k|			}
  509|       |
  510|    342|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|   117k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_9IPv6LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|   117k|		{
  457|   117k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 117k, False: 342]
  ------------------
  458|   117k|			{
  459|   117k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|   117k|			}
  461|    342|			return nullptr;
  462|   117k|		}
_ZN4pcpp5Layer16canReinterpretAsINS_7ip6_hdrEEEbPKhm:
  587|   120k|		{
  588|   120k|			return data != nullptr && dataLen >= sizeof(T);
  ------------------
  |  Branch (588:11): [True: 120k, False: 0]
  |  Branch (588:30): [True: 120k, False: 404]
  ------------------
  589|   120k|		}
_ZN4pcpp5Layer18constructNextLayerINS_9IPv6LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|   117k|		{
  358|   117k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 117k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|   117k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|   117k|			setNextLayer(newLayer);
  365|   117k|			return newLayer;
  366|   117k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_9VlanLayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|  73.9k|		{
  483|  73.9k|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|  73.9k|			                                                       std::forward<Args>(extraArgs)...);
  485|  73.9k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_9VlanLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  73.9k|		{
  505|  73.9k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 73.8k, False: 140]
  ------------------
  506|  73.8k|			{
  507|  73.8k|				return m_NextLayer;
  508|  73.8k|			}
  509|       |
  510|    140|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  73.9k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_9VlanLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  73.9k|		{
  457|  73.9k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 73.8k, False: 140]
  ------------------
  458|  73.8k|			{
  459|  73.8k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  73.8k|			}
  461|    140|			return nullptr;
  462|  73.9k|		}
_ZN4pcpp5Layer16canReinterpretAsINS_11vlan_headerEEEbPKhm:
  587|  73.9k|		{
  588|  73.9k|			return data != nullptr && dataLen >= sizeof(T);
  ------------------
  |  Branch (588:11): [True: 73.9k, False: 0]
  |  Branch (588:30): [True: 73.8k, False: 140]
  ------------------
  589|  73.9k|		}
_ZN4pcpp5Layer18constructNextLayerINS_9VlanLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  73.8k|		{
  358|  73.8k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 73.8k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  73.8k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  73.8k|			setNextLayer(newLayer);
  365|  73.8k|			return newLayer;
  366|  73.8k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_9MplsLayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|  3.08M|		{
  483|  3.08M|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|  3.08M|			                                                       std::forward<Args>(extraArgs)...);
  485|  3.08M|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_9MplsLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  3.08M|		{
  505|  3.08M|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 3.08M, False: 0]
  ------------------
  506|  3.08M|			{
  507|  3.08M|				return m_NextLayer;
  508|  3.08M|			}
  509|       |
  510|      0|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  3.08M|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_9MplsLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  3.08M|		{
  457|  3.08M|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 3.08M, False: 0]
  ------------------
  458|  3.08M|			{
  459|  3.08M|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  3.08M|			}
  461|      0|			return nullptr;
  462|  3.08M|		}
_ZN4pcpp5Layer16canReinterpretAsINS_9MplsLayer11mpls_headerEEEbPKhm:
  587|  3.08M|		{
  588|  3.08M|			return data != nullptr && dataLen >= sizeof(T);
  ------------------
  |  Branch (588:11): [True: 3.08M, False: 0]
  |  Branch (588:30): [True: 3.08M, False: 0]
  ------------------
  589|  3.08M|		}
_ZN4pcpp5Layer18constructNextLayerINS_9MplsLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  3.08M|		{
  358|  3.08M|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 3.08M]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  3.08M|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  3.08M|			setNextLayer(newLayer);
  365|  3.08M|			return newLayer;
  366|  3.08M|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_13PPP_PPTPLayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|  6.15k|		{
  483|  6.15k|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|  6.15k|			                                                       std::forward<Args>(extraArgs)...);
  485|  6.15k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_13PPP_PPTPLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  6.15k|		{
  505|  6.15k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 5.76k, False: 392]
  ------------------
  506|  5.76k|			{
  507|  5.76k|				return m_NextLayer;
  508|  5.76k|			}
  509|       |
  510|    392|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  6.15k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_13PPP_PPTPLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  6.15k|		{
  457|  6.15k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 5.76k, False: 392]
  ------------------
  458|  5.76k|			{
  459|  5.76k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  5.76k|			}
  461|    392|			return nullptr;
  462|  6.15k|		}
_ZN4pcpp5Layer18constructNextLayerINS_13PPP_PPTPLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  5.76k|		{
  358|  5.76k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 5.76k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  5.76k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  5.76k|			setNextLayer(newLayer);
  365|  5.76k|			return newLayer;
  366|  5.76k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_8EthLayerEJEEEPS0_PhmDpOT0_:
  438|  5.46k|		{
  439|  5.46k|			return tryConstructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  440|  5.46k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_8EthLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  11.5k|		{
  457|  11.5k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 11.4k, False: 135]
  ------------------
  458|  11.4k|			{
  459|  11.4k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  11.4k|			}
  461|    135|			return nullptr;
  462|  11.5k|		}
_ZN4pcpp5Layer18constructNextLayerINS_8EthLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  11.4k|		{
  358|  11.4k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 11.4k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  11.4k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  11.4k|			setNextLayer(newLayer);
  365|  11.4k|			return newLayer;
  366|  11.4k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_12EthDot3LayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|     32|		{
  483|     32|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|     32|			                                                       std::forward<Args>(extraArgs)...);
  485|     32|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_12EthDot3LayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|     32|		{
  505|     32|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 32, False: 0]
  ------------------
  506|     32|			{
  507|     32|				return m_NextLayer;
  508|     32|			}
  509|       |
  510|      0|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|     32|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_12EthDot3LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|     32|		{
  457|     32|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 32, False: 0]
  ------------------
  458|     32|			{
  459|     32|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|     32|			}
  461|      0|			return nullptr;
  462|     32|		}
_ZN4pcpp5Layer18constructNextLayerINS_12EthDot3LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|     32|		{
  358|     32|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 32]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|     32|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|     32|			setNextLayer(newLayer);
  365|     32|			return newLayer;
  366|     32|		}
_ZN4pcpp5Layer18constructNextLayerINS_12PayloadLayerEJEEEPS0_PhmDpOT0_:
  343|  73.8k|		{
  344|  73.8k|			return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  345|  73.8k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_10GtpV2LayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|  12.6k|		{
  483|  12.6k|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|  12.6k|			                                                       std::forward<Args>(extraArgs)...);
  485|  12.6k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_10GtpV2LayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  12.6k|		{
  505|  12.6k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 10.4k, False: 2.23k]
  ------------------
  506|  10.4k|			{
  507|  10.4k|				return m_NextLayer;
  508|  10.4k|			}
  509|       |
  510|  2.23k|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  12.6k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_10GtpV2LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  12.6k|		{
  457|  12.6k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 10.4k, False: 2.23k]
  ------------------
  458|  10.4k|			{
  459|  10.4k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  10.4k|			}
  461|  2.23k|			return nullptr;
  462|  12.6k|		}
_ZN4pcpp5Layer18constructNextLayerINS_10GtpV2LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  20.6k|		{
  358|  20.6k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 20.6k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  20.6k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  20.6k|			setNextLayer(newLayer);
  365|  20.6k|			return newLayer;
  366|  20.6k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_8UdpLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|   250k|		{
  505|   250k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 250k, False: 150]
  ------------------
  506|   250k|			{
  507|   250k|				return m_NextLayer;
  508|   250k|			}
  509|       |
  510|    150|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|   250k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_8UdpLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|   250k|		{
  457|   250k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 250k, False: 150]
  ------------------
  458|   250k|			{
  459|   250k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|   250k|			}
  461|    150|			return nullptr;
  462|   250k|		}
_ZN4pcpp5Layer18constructNextLayerINS_8UdpLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|   250k|		{
  358|   250k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 250k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|   250k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|   250k|			setNextLayer(newLayer);
  365|   250k|			return newLayer;
  366|   250k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_8TcpLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|   474k|		{
  505|   474k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 471k, False: 2.97k]
  ------------------
  506|   471k|			{
  507|   471k|				return m_NextLayer;
  508|   471k|			}
  509|       |
  510|  2.97k|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|   474k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_8TcpLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|   474k|		{
  457|   474k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 471k, False: 2.97k]
  ------------------
  458|   471k|			{
  459|   471k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|   471k|			}
  461|  2.97k|			return nullptr;
  462|   474k|		}
_ZN4pcpp5Layer18constructNextLayerINS_8TcpLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|   471k|		{
  358|   471k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 471k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|   471k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|   471k|			setNextLayer(newLayer);
  365|   471k|			return newLayer;
  366|   471k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_9IcmpLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  21.1k|		{
  505|  21.1k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 20.9k, False: 249]
  ------------------
  506|  20.9k|			{
  507|  20.9k|				return m_NextLayer;
  508|  20.9k|			}
  509|       |
  510|    249|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  21.1k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_9IcmpLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  21.1k|		{
  457|  21.1k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 20.9k, False: 249]
  ------------------
  458|  20.9k|			{
  459|  20.9k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  20.9k|			}
  461|    249|			return nullptr;
  462|  21.1k|		}
_ZN4pcpp5Layer18constructNextLayerINS_9IcmpLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  20.9k|		{
  358|  20.9k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 20.9k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  20.9k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  20.9k|			setNextLayer(newLayer);
  365|  20.9k|			return newLayer;
  366|  20.9k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_10GREv0LayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  14.3k|		{
  505|  14.3k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 14.3k, False: 0]
  ------------------
  506|  14.3k|			{
  507|  14.3k|				return m_NextLayer;
  508|  14.3k|			}
  509|       |
  510|      0|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  14.3k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_10GREv0LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  14.3k|		{
  457|  14.3k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 14.3k, False: 0]
  ------------------
  458|  14.3k|			{
  459|  14.3k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  14.3k|			}
  461|      0|			return nullptr;
  462|  14.3k|		}
_ZN4pcpp5Layer18constructNextLayerINS_10GREv0LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  14.3k|		{
  358|  14.3k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 14.3k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  14.3k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  14.3k|			setNextLayer(newLayer);
  365|  14.3k|			return newLayer;
  366|  14.3k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_10GREv1LayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  15.3k|		{
  505|  15.3k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 15.3k, False: 11]
  ------------------
  506|  15.3k|			{
  507|  15.3k|				return m_NextLayer;
  508|  15.3k|			}
  509|       |
  510|     11|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  15.3k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_10GREv1LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  15.3k|		{
  457|  15.3k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 15.3k, False: 11]
  ------------------
  458|  15.3k|			{
  459|  15.3k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  15.3k|			}
  461|     11|			return nullptr;
  462|  15.3k|		}
_ZN4pcpp5Layer18constructNextLayerINS_10GREv1LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  15.3k|		{
  358|  15.3k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 15.3k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  15.3k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  15.3k|			setNextLayer(newLayer);
  365|  15.3k|			return newLayer;
  366|  15.3k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_11IgmpV1LayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  2.82k|		{
  505|  2.82k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 2.82k, False: 0]
  ------------------
  506|  2.82k|			{
  507|  2.82k|				return m_NextLayer;
  508|  2.82k|			}
  509|       |
  510|      0|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  2.82k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_11IgmpV1LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  2.82k|		{
  457|  2.82k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 2.82k, False: 0]
  ------------------
  458|  2.82k|			{
  459|  2.82k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  2.82k|			}
  461|      0|			return nullptr;
  462|  2.82k|		}
_ZN4pcpp5Layer16canReinterpretAsINS_11igmp_headerEEEbPKhm:
  587|  7.19k|		{
  588|  7.19k|			return data != nullptr && dataLen >= sizeof(T);
  ------------------
  |  Branch (588:11): [True: 7.19k, False: 0]
  |  Branch (588:30): [True: 7.19k, False: 0]
  ------------------
  589|  7.19k|		}
_ZN4pcpp5Layer18constructNextLayerINS_11IgmpV1LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  2.82k|		{
  358|  2.82k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 2.82k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  2.82k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  2.82k|			setNextLayer(newLayer);
  365|  2.82k|			return newLayer;
  366|  2.82k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_11IgmpV2LayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  4.37k|		{
  505|  4.37k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 4.37k, False: 0]
  ------------------
  506|  4.37k|			{
  507|  4.37k|				return m_NextLayer;
  508|  4.37k|			}
  509|       |
  510|      0|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  4.37k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_11IgmpV2LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  4.37k|		{
  457|  4.37k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 4.37k, False: 0]
  ------------------
  458|  4.37k|			{
  459|  4.37k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  4.37k|			}
  461|      0|			return nullptr;
  462|  4.37k|		}
_ZN4pcpp5Layer18constructNextLayerINS_11IgmpV2LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  4.37k|		{
  358|  4.37k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 4.37k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  4.37k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  4.37k|			setNextLayer(newLayer);
  365|  4.37k|			return newLayer;
  366|  4.37k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_17IgmpV3ReportLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  2.40k|		{
  505|  2.40k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 2.40k, False: 0]
  ------------------
  506|  2.40k|			{
  507|  2.40k|				return m_NextLayer;
  508|  2.40k|			}
  509|       |
  510|      0|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  2.40k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_17IgmpV3ReportLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  2.40k|		{
  457|  2.40k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 2.40k, False: 0]
  ------------------
  458|  2.40k|			{
  459|  2.40k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  2.40k|			}
  461|      0|			return nullptr;
  462|  2.40k|		}
_ZN4pcpp5Layer16canReinterpretAsINS_20igmpv3_report_headerEEEbPKhm:
  587|  2.40k|		{
  588|  2.40k|			return data != nullptr && dataLen >= sizeof(T);
  ------------------
  |  Branch (588:11): [True: 2.40k, False: 0]
  |  Branch (588:30): [True: 2.40k, False: 0]
  ------------------
  589|  2.40k|		}
_ZN4pcpp5Layer18constructNextLayerINS_17IgmpV3ReportLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  2.40k|		{
  358|  2.40k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 2.40k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  2.40k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  2.40k|			setNextLayer(newLayer);
  365|  2.40k|			return newLayer;
  366|  2.40k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_25AuthenticationHeaderLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  1.17k|		{
  505|  1.17k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 1.17k, False: 3]
  ------------------
  506|  1.17k|			{
  507|  1.17k|				return m_NextLayer;
  508|  1.17k|			}
  509|       |
  510|      3|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  1.17k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_25AuthenticationHeaderLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  1.17k|		{
  457|  1.17k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 1.17k, False: 3]
  ------------------
  458|  1.17k|			{
  459|  1.17k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  1.17k|			}
  461|      3|			return nullptr;
  462|  1.17k|		}
_ZN4pcpp5Layer18constructNextLayerINS_25AuthenticationHeaderLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  1.17k|		{
  358|  1.17k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 1.17k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  1.17k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  1.17k|			setNextLayer(newLayer);
  365|  1.17k|			return newLayer;
  366|  1.17k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_8ESPLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|    100|		{
  505|    100|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 100, False: 0]
  ------------------
  506|    100|			{
  507|    100|				return m_NextLayer;
  508|    100|			}
  509|       |
  510|      0|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|    100|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_8ESPLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|    100|		{
  457|    100|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 100, False: 0]
  ------------------
  458|    100|			{
  459|    100|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|    100|			}
  461|      0|			return nullptr;
  462|    100|		}
_ZN4pcpp5Layer18constructNextLayerINS_8ESPLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|    100|		{
  358|    100|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 100]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|    100|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|    100|			setNextLayer(newLayer);
  365|    100|			return newLayer;
  366|    100|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_11VrrpV2LayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  5.62k|		{
  505|  5.62k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 5.62k, False: 0]
  ------------------
  506|  5.62k|			{
  507|  5.62k|				return m_NextLayer;
  508|  5.62k|			}
  509|       |
  510|      0|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  5.62k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_11VrrpV2LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  5.62k|		{
  457|  5.62k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 5.62k, False: 0]
  ------------------
  458|  5.62k|			{
  459|  5.62k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  5.62k|			}
  461|      0|			return nullptr;
  462|  5.62k|		}
_ZN4pcpp5Layer18constructNextLayerINS_11VrrpV2LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  5.62k|		{
  358|  5.62k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 5.62k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  5.62k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  5.62k|			setNextLayer(newLayer);
  365|  5.62k|			return newLayer;
  366|  5.62k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_11VrrpV3LayerENS_12PayloadLayerEJNS_9IPAddress11AddressTypeEEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  2.64k|		{
  505|  2.64k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 2.64k, False: 0]
  ------------------
  506|  2.64k|			{
  507|  2.64k|				return m_NextLayer;
  508|  2.64k|			}
  509|       |
  510|      0|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  2.64k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_11VrrpV3LayerEJNS_9IPAddress11AddressTypeEEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  2.64k|		{
  457|  2.64k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 2.64k, False: 0]
  ------------------
  458|  2.64k|			{
  459|  2.64k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  2.64k|			}
  461|      0|			return nullptr;
  462|  2.64k|		}
_ZN4pcpp5Layer18constructNextLayerINS_11VrrpV3LayerEJNS_9IPAddress11AddressTypeEEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  6.12k|		{
  358|  6.12k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 6.12k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  6.12k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  6.12k|			setNextLayer(newLayer);
  365|  6.12k|			return newLayer;
  366|  6.12k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_8UdpLayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|  10.2k|		{
  483|  10.2k|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|  10.2k|			                                                       std::forward<Args>(extraArgs)...);
  485|  10.2k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_8TcpLayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|  89.7k|		{
  483|  89.7k|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|  89.7k|			                                                       std::forward<Args>(extraArgs)...);
  485|  89.7k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_10GREv0LayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|  2.97k|		{
  483|  2.97k|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|  2.97k|			                                                       std::forward<Args>(extraArgs)...);
  485|  2.97k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_10GREv1LayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|      4|		{
  483|      4|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|      4|			                                                       std::forward<Args>(extraArgs)...);
  485|      4|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_8ESPLayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|     10|		{
  483|     10|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|     10|			                                                       std::forward<Args>(extraArgs)...);
  485|     10|		}
_ZN4pcpp5Layer29constructNextLayerFromFactoryIPFPS0_PhmS2_PNS_6PacketEEJEEES2_T_S3_mDpOT0_:
  387|  66.1k|		{
  388|  66.1k|			return constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, getAttachedPacket(),
  389|  66.1k|			                                               std::forward<Args>(extraArgs)...);
  390|  66.1k|		}
_ZN4pcpp5Layer29constructNextLayerFromFactoryIPFPS0_PhmS2_PNS_6PacketEEJEEES2_T_S3_mS5_DpOT0_:
  411|  66.1k|		{
  412|  66.1k|			if (hasNextLayer())
  ------------------
  |  Branch (412:8): [True: 0, False: 66.1k]
  ------------------
  413|      0|			{
  414|      0|				throw std::runtime_error("Next layer already exists");
  415|      0|			}
  416|       |
  417|       |			// cppcheck-suppress redundantInitialization
  418|  66.1k|			Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  419|  66.1k|			setNextLayer(newLayer);
  420|  66.1k|			return newLayer;
  421|  66.1k|		}
_ZN4pcpp5Layer18constructNextLayerINS_11VrrpV3LayerEJNS_9IPAddress11AddressTypeEEEEPS0_PhmDpOT0_:
  343|  3.47k|		{
  344|  3.47k|			return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  345|  3.47k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_8ArpLayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|  18.1k|		{
  483|  18.1k|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|  18.1k|			                                                       std::forward<Args>(extraArgs)...);
  485|  18.1k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_8ArpLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  18.1k|		{
  505|  18.1k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 17.9k, False: 132]
  ------------------
  506|  17.9k|			{
  507|  17.9k|				return m_NextLayer;
  508|  17.9k|			}
  509|       |
  510|    132|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  18.1k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_8ArpLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  18.1k|		{
  457|  18.1k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 17.9k, False: 132]
  ------------------
  458|  17.9k|			{
  459|  17.9k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  17.9k|			}
  461|    132|			return nullptr;
  462|  18.1k|		}
_ZN4pcpp5Layer18constructNextLayerINS_8ArpLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  17.9k|		{
  358|  17.9k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 17.9k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  17.9k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  17.9k|			setNextLayer(newLayer);
  365|  17.9k|			return newLayer;
  366|  17.9k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_17PPPoESessionLayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|  22.2k|		{
  483|  22.2k|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|  22.2k|			                                                       std::forward<Args>(extraArgs)...);
  485|  22.2k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_17PPPoESessionLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  22.2k|		{
  505|  22.2k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 22.1k, False: 128]
  ------------------
  506|  22.1k|			{
  507|  22.1k|				return m_NextLayer;
  508|  22.1k|			}
  509|       |
  510|    128|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  22.2k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_17PPPoESessionLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  22.2k|		{
  457|  22.2k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 22.1k, False: 128]
  ------------------
  458|  22.1k|			{
  459|  22.1k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  22.1k|			}
  461|    128|			return nullptr;
  462|  22.2k|		}
_ZN4pcpp5Layer18constructNextLayerINS_17PPPoESessionLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  22.1k|		{
  358|  22.1k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 22.1k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  22.1k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  22.1k|			setNextLayer(newLayer);
  365|  22.1k|			return newLayer;
  366|  22.1k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_19PPPoEDiscoveryLayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|  3.36k|		{
  483|  3.36k|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|  3.36k|			                                                       std::forward<Args>(extraArgs)...);
  485|  3.36k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_19PPPoEDiscoveryLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  3.36k|		{
  505|  3.36k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 3.36k, False: 0]
  ------------------
  506|  3.36k|			{
  507|  3.36k|				return m_NextLayer;
  508|  3.36k|			}
  509|       |
  510|      0|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  3.36k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_19PPPoEDiscoveryLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  3.36k|		{
  457|  3.36k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 3.36k, False: 0]
  ------------------
  458|  3.36k|			{
  459|  3.36k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  3.36k|			}
  461|      0|			return nullptr;
  462|  3.36k|		}
_ZN4pcpp5Layer18constructNextLayerINS_19PPPoEDiscoveryLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  3.36k|		{
  358|  3.36k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 3.36k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  3.36k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  3.36k|			setNextLayer(newLayer);
  365|  3.36k|			return newLayer;
  366|  3.36k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_8LLCLayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|  11.7k|		{
  483|  11.7k|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|  11.7k|			                                                       std::forward<Args>(extraArgs)...);
  485|  11.7k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_8LLCLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  11.7k|		{
  505|  11.7k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 10.4k, False: 1.32k]
  ------------------
  506|  10.4k|			{
  507|  10.4k|				return m_NextLayer;
  508|  10.4k|			}
  509|       |
  510|  1.32k|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  11.7k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_8LLCLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  11.7k|		{
  457|  11.7k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 10.4k, False: 1.32k]
  ------------------
  458|  10.4k|			{
  459|  10.4k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  10.4k|			}
  461|  1.32k|			return nullptr;
  462|  11.7k|		}
_ZN4pcpp5Layer18constructNextLayerINS_8LLCLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  10.4k|		{
  358|  10.4k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 10.4k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  10.4k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  10.4k|			setNextLayer(newLayer);
  365|  10.4k|			return newLayer;
  366|  10.4k|		}
_ZN4pcpp5Layer16canReinterpretAsINS_20ssl_tls_record_layerEEEbPKhm:
  587|   253k|		{
  588|   253k|			return data != nullptr && dataLen >= sizeof(T);
  ------------------
  |  Branch (588:11): [True: 253k, False: 0]
  |  Branch (588:30): [True: 253k, False: 0]
  ------------------
  589|   253k|		}
_ZN4pcpp5Layer29constructNextLayerFromFactoryIPFPNS_8SSLLayerEPhmPS0_PNS_6PacketEEJEEES5_T_S4_mDpOT0_:
  387|   253k|		{
  388|   253k|			return constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, getAttachedPacket(),
  389|   253k|			                                               std::forward<Args>(extraArgs)...);
  390|   253k|		}
_ZN4pcpp5Layer29constructNextLayerFromFactoryIPFPNS_8SSLLayerEPhmPS0_PNS_6PacketEEJEEES5_T_S4_mS7_DpOT0_:
  411|   253k|		{
  412|   253k|			if (hasNextLayer())
  ------------------
  |  Branch (412:8): [True: 0, False: 253k]
  ------------------
  413|      0|			{
  414|      0|				throw std::runtime_error("Next layer already exists");
  415|      0|			}
  416|       |
  417|       |			// cppcheck-suppress redundantInitialization
  418|   253k|			Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  419|   253k|			setNextLayer(newLayer);
  420|   253k|			return newLayer;
  421|   253k|		}
_ZN4pcpp5Layer16canReinterpretAsINS_7tpkthdrEEEbPKhm:
  587|   133k|		{
  588|   133k|			return data != nullptr && dataLen >= sizeof(T);
  ------------------
  |  Branch (588:11): [True: 133k, False: 0]
  |  Branch (588:30): [True: 127k, False: 5.28k]
  ------------------
  589|   133k|		}
_ZN4pcpp5Layer18constructNextLayerINS_16HttpRequestLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  43.9k|		{
  358|  43.9k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 43.9k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  43.9k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  43.9k|			setNextLayer(newLayer);
  365|  43.9k|			return newLayer;
  366|  43.9k|		}
_ZN4pcpp5Layer18constructNextLayerINS_17HttpResponseLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  11.3k|		{
  358|  11.3k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 11.3k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  11.3k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  11.3k|			setNextLayer(newLayer);
  365|  11.3k|			return newLayer;
  366|  11.3k|		}
_ZN4pcpp5Layer18constructNextLayerINS_16SipResponseLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  2.72k|		{
  358|  2.72k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 2.72k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  2.72k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  2.72k|			setNextLayer(newLayer);
  365|  2.72k|			return newLayer;
  366|  2.72k|		}
_ZN4pcpp5Layer44tryConstructNextLayerFromFactoryWithFallbackINS_12PayloadLayerEPFPNS_8BgpLayerEPhmPS0_PNS_6PacketEEJEEES6_T0_S5_mDpOT1_:
  537|  34.3k|		{
  538|       |			// Note that the fallback is first to allow template argument deduction of the factory type.
  539|  34.3k|			return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>(
  540|  34.3k|			    factoryFn, data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  541|  34.3k|		}
_ZN4pcpp5Layer44tryConstructNextLayerFromFactoryWithFallbackINS_12PayloadLayerEPFPNS_8BgpLayerEPhmPS0_PNS_6PacketEEJEEES6_T0_S5_mS8_DpOT1_:
  566|  34.3k|		{
  567|  34.3k|			auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet,
  568|  34.3k|			                                                         std::forward<Args>(extraArgs)...);
  569|  34.3k|			if (nextLayer != nullptr)
  ------------------
  |  Branch (569:8): [True: 32.9k, False: 1.33k]
  ------------------
  570|  32.9k|			{
  571|  32.9k|				return nextLayer;
  572|  32.9k|			}
  573|       |
  574|       |			// factory failed, construct fallback layer
  575|  1.33k|			return constructNextLayer<TFallback>(data, dataLen, packet);
  576|  34.3k|		}
_ZN4pcpp5Layer29constructNextLayerFromFactoryIPFPNS_8SSHLayerEPhmPS0_PNS_6PacketEEJEEES5_T_S4_mDpOT0_:
  387|  18.1k|		{
  388|  18.1k|			return constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, getAttachedPacket(),
  389|  18.1k|			                                               std::forward<Args>(extraArgs)...);
  390|  18.1k|		}
_ZN4pcpp5Layer29constructNextLayerFromFactoryIPFPNS_8SSHLayerEPhmPS0_PNS_6PacketEEJEEES5_T_S4_mS7_DpOT0_:
  411|  18.1k|		{
  412|  18.1k|			if (hasNextLayer())
  ------------------
  |  Branch (412:8): [True: 0, False: 18.1k]
  ------------------
  413|      0|			{
  414|      0|				throw std::runtime_error("Next layer already exists");
  415|      0|			}
  416|       |
  417|       |			// cppcheck-suppress redundantInitialization
  418|  18.1k|			Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  419|  18.1k|			setNextLayer(newLayer);
  420|  18.1k|			return newLayer;
  421|  18.1k|		}
_ZN4pcpp5Layer18constructNextLayerINS_15DnsOverTcpLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  2.77k|		{
  358|  2.77k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 2.77k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  2.77k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  2.77k|			setNextLayer(newLayer);
  365|  2.77k|			return newLayer;
  366|  2.77k|		}
_ZN4pcpp5Layer18constructNextLayerINS_11TelnetLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  9.82k|		{
  358|  9.82k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 9.82k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  9.82k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  9.82k|			setNextLayer(newLayer);
  365|  9.82k|			return newLayer;
  366|  9.82k|		}
_ZN4pcpp5Layer18constructNextLayerINS_16FtpResponseLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  12.8k|		{
  358|  12.8k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 12.8k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  12.8k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  12.8k|			setNextLayer(newLayer);
  365|  12.8k|			return newLayer;
  366|  12.8k|		}
_ZN4pcpp5Layer18constructNextLayerINS_15FtpRequestLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  6.65k|		{
  358|  6.65k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 6.65k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  6.65k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  6.65k|			setNextLayer(newLayer);
  365|  6.65k|			return newLayer;
  366|  6.65k|		}
_ZN4pcpp5Layer18constructNextLayerINS_12FtpDataLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  1.43k|		{
  358|  1.43k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 1.43k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  1.43k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  1.43k|			setNextLayer(newLayer);
  365|  1.43k|			return newLayer;
  366|  1.43k|		}
_ZN4pcpp5Layer18constructNextLayerINS_9TpktLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  14.8k|		{
  358|  14.8k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 14.8k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  14.8k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  14.8k|			setNextLayer(newLayer);
  365|  14.8k|			return newLayer;
  366|  14.8k|		}
_ZN4pcpp5Layer18constructNextLayerINS_17SmtpResponseLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  5.60k|		{
  358|  5.60k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 5.60k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  5.60k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  5.60k|			setNextLayer(newLayer);
  365|  5.60k|			return newLayer;
  366|  5.60k|		}
_ZN4pcpp5Layer18constructNextLayerINS_16SmtpRequestLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  10.3k|		{
  358|  10.3k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 10.3k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  10.3k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  10.3k|			setNextLayer(newLayer);
  365|  10.3k|			return newLayer;
  366|  10.3k|		}
_ZN4pcpp5Layer44tryConstructNextLayerFromFactoryWithFallbackINS_12PayloadLayerEPFPNS_9LdapLayerEPhmPS0_PNS_6PacketEEJEEES6_T0_S5_mDpOT1_:
  537|  2.00k|		{
  538|       |			// Note that the fallback is first to allow template argument deduction of the factory type.
  539|  2.00k|			return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>(
  540|  2.00k|			    factoryFn, data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  541|  2.00k|		}
_ZN4pcpp5Layer44tryConstructNextLayerFromFactoryWithFallbackINS_12PayloadLayerEPFPNS_9LdapLayerEPhmPS0_PNS_6PacketEEJEEES6_T0_S5_mS8_DpOT1_:
  566|  2.00k|		{
  567|  2.00k|			auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet,
  568|  2.00k|			                                                         std::forward<Args>(extraArgs)...);
  569|  2.00k|			if (nextLayer != nullptr)
  ------------------
  |  Branch (569:8): [True: 113, False: 1.88k]
  ------------------
  570|    113|			{
  571|    113|				return nextLayer;
  572|    113|			}
  573|       |
  574|       |			// factory failed, construct fallback layer
  575|  1.88k|			return constructNextLayer<TFallback>(data, dataLen, packet);
  576|  2.00k|		}
_ZN4pcpp5Layer29constructNextLayerFromFactoryIPFPNS_9LdapLayerEPhmPS0_PNS_6PacketEEJEEES5_T_S4_mS7_DpOT0_:
  411|  2.04k|		{
  412|  2.04k|			if (hasNextLayer())
  ------------------
  |  Branch (412:8): [True: 0, False: 2.04k]
  ------------------
  413|      0|			{
  414|      0|				throw std::runtime_error("Next layer already exists");
  415|      0|			}
  416|       |
  417|       |			// cppcheck-suppress redundantInitialization
  418|  2.04k|			Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  419|  2.04k|			setNextLayer(newLayer);
  420|  2.04k|			return newLayer;
  421|  2.04k|		}
_ZN4pcpp5Layer44tryConstructNextLayerFromFactoryWithFallbackINS_12PayloadLayerEPFPNS_13PostgresLayerEPhmPS0_PNS_6PacketEEJEEES6_T0_S5_mDpOT1_:
  537|  2.11k|		{
  538|       |			// Note that the fallback is first to allow template argument deduction of the factory type.
  539|  2.11k|			return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>(
  540|  2.11k|			    factoryFn, data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  541|  2.11k|		}
_ZN4pcpp5Layer44tryConstructNextLayerFromFactoryWithFallbackINS_12PayloadLayerEPFPNS_13PostgresLayerEPhmPS0_PNS_6PacketEEJEEES6_T0_S5_mS8_DpOT1_:
  566|  2.11k|		{
  567|  2.11k|			auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet,
  568|  2.11k|			                                                         std::forward<Args>(extraArgs)...);
  569|  2.11k|			if (nextLayer != nullptr)
  ------------------
  |  Branch (569:8): [True: 2.11k, False: 0]
  ------------------
  570|  2.11k|			{
  571|  2.11k|				return nextLayer;
  572|  2.11k|			}
  573|       |
  574|       |			// factory failed, construct fallback layer
  575|      0|			return constructNextLayer<TFallback>(data, dataLen, packet);
  576|  2.11k|		}
_ZN4pcpp5Layer29constructNextLayerFromFactoryIPFPNS_13PostgresLayerEPhmPS0_PNS_6PacketEEJEEES5_T_S4_mS7_DpOT0_:
  411|  2.11k|		{
  412|  2.11k|			if (hasNextLayer())
  ------------------
  |  Branch (412:8): [True: 0, False: 2.11k]
  ------------------
  413|      0|			{
  414|      0|				throw std::runtime_error("Next layer already exists");
  415|      0|			}
  416|       |
  417|       |			// cppcheck-suppress redundantInitialization
  418|  2.11k|			Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  419|  2.11k|			setNextLayer(newLayer);
  420|  2.11k|			return newLayer;
  421|  2.11k|		}
_ZN4pcpp5Layer44tryConstructNextLayerFromFactoryWithFallbackINS_12PayloadLayerEPFPNS_10MySqlLayerEPhmPS0_PNS_6PacketEEJEEES6_T0_S5_mDpOT1_:
  537|  15.5k|		{
  538|       |			// Note that the fallback is first to allow template argument deduction of the factory type.
  539|  15.5k|			return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>(
  540|  15.5k|			    factoryFn, data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  541|  15.5k|		}
_ZN4pcpp5Layer44tryConstructNextLayerFromFactoryWithFallbackINS_12PayloadLayerEPFPNS_10MySqlLayerEPhmPS0_PNS_6PacketEEJEEES6_T0_S5_mS8_DpOT1_:
  566|  15.5k|		{
  567|  15.5k|			auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet,
  568|  15.5k|			                                                         std::forward<Args>(extraArgs)...);
  569|  15.5k|			if (nextLayer != nullptr)
  ------------------
  |  Branch (569:8): [True: 15.5k, False: 0]
  ------------------
  570|  15.5k|			{
  571|  15.5k|				return nextLayer;
  572|  15.5k|			}
  573|       |
  574|       |			// factory failed, construct fallback layer
  575|      0|			return constructNextLayer<TFallback>(data, dataLen, packet);
  576|  15.5k|		}
_ZN4pcpp5Layer29constructNextLayerFromFactoryIPFPNS_10MySqlLayerEPhmPS0_PNS_6PacketEEJEEES5_T_S4_mS7_DpOT0_:
  411|  15.5k|		{
  412|  15.5k|			if (hasNextLayer())
  ------------------
  |  Branch (412:8): [True: 0, False: 15.5k]
  ------------------
  413|      0|			{
  414|      0|				throw std::runtime_error("Next layer already exists");
  415|      0|			}
  416|       |
  417|       |			// cppcheck-suppress redundantInitialization
  418|  15.5k|			Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  419|  15.5k|			setNextLayer(newLayer);
  420|  15.5k|			return newLayer;
  421|  15.5k|		}
_ZN4pcpp5Layer18constructNextLayerINS_11ModbusLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  1.68k|		{
  358|  1.68k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 1.68k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  1.68k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  1.68k|			setNextLayer(newLayer);
  365|  1.68k|			return newLayer;
  366|  1.68k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_9CotpLayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|  14.7k|		{
  483|  14.7k|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|  14.7k|			                                                       std::forward<Args>(extraArgs)...);
  485|  14.7k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_9CotpLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  14.7k|		{
  505|  14.7k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 13.1k, False: 1.63k]
  ------------------
  506|  13.1k|			{
  507|  13.1k|				return m_NextLayer;
  508|  13.1k|			}
  509|       |
  510|  1.63k|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  14.7k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_9CotpLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  14.7k|		{
  457|  14.7k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 13.1k, False: 1.63k]
  ------------------
  458|  13.1k|			{
  459|  13.1k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  13.1k|			}
  461|  1.63k|			return nullptr;
  462|  14.7k|		}
_ZN4pcpp5Layer18constructNextLayerINS_9CotpLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  13.1k|		{
  358|  13.1k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 13.1k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  13.1k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  13.1k|			setNextLayer(newLayer);
  365|  13.1k|			return newLayer;
  366|  13.1k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_9DhcpLayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|  21.8k|		{
  483|  21.8k|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|  21.8k|			                                                       std::forward<Args>(extraArgs)...);
  485|  21.8k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_9DhcpLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  21.8k|		{
  505|  21.8k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 20.9k, False: 905]
  ------------------
  506|  20.9k|			{
  507|  20.9k|				return m_NextLayer;
  508|  20.9k|			}
  509|       |
  510|    905|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  21.8k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_9DhcpLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  21.8k|		{
  457|  21.8k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 20.9k, False: 905]
  ------------------
  458|  20.9k|			{
  459|  20.9k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  20.9k|			}
  461|    905|			return nullptr;
  462|  21.8k|		}
_ZN4pcpp5Layer18constructNextLayerINS_9DhcpLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  20.9k|		{
  358|  20.9k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 20.9k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  20.9k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  20.9k|			setNextLayer(newLayer);
  365|  20.9k|			return newLayer;
  366|  20.9k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_10VxlanLayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|  6.11k|		{
  483|  6.11k|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|  6.11k|			                                                       std::forward<Args>(extraArgs)...);
  485|  6.11k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_10VxlanLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  6.11k|		{
  505|  6.11k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 6.11k, False: 0]
  ------------------
  506|  6.11k|			{
  507|  6.11k|				return m_NextLayer;
  508|  6.11k|			}
  509|       |
  510|      0|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  6.11k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_10VxlanLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  6.11k|		{
  457|  6.11k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 6.11k, False: 0]
  ------------------
  458|  6.11k|			{
  459|  6.11k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  6.11k|			}
  461|      0|			return nullptr;
  462|  6.11k|		}
_ZN4pcpp5Layer16canReinterpretAsINS_12vxlan_headerEEEbPKhm:
  587|  6.11k|		{
  588|  6.11k|			return data != nullptr && dataLen >= sizeof(T);
  ------------------
  |  Branch (588:11): [True: 6.11k, False: 0]
  |  Branch (588:30): [True: 6.11k, False: 0]
  ------------------
  589|  6.11k|		}
_ZN4pcpp5Layer18constructNextLayerINS_10VxlanLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  6.11k|		{
  358|  6.11k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 6.11k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  6.11k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  6.11k|			setNextLayer(newLayer);
  365|  6.11k|			return newLayer;
  366|  6.11k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_11GeneveLayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|  5.71k|		{
  483|  5.71k|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|  5.71k|			                                                       std::forward<Args>(extraArgs)...);
  485|  5.71k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_11GeneveLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  5.71k|		{
  505|  5.71k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 5.66k, False: 50]
  ------------------
  506|  5.66k|			{
  507|  5.66k|				return m_NextLayer;
  508|  5.66k|			}
  509|       |
  510|     50|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  5.71k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_11GeneveLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  5.71k|		{
  457|  5.71k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 5.66k, False: 50]
  ------------------
  458|  5.66k|			{
  459|  5.66k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  5.66k|			}
  461|     50|			return nullptr;
  462|  5.71k|		}
_ZN4pcpp5Layer18constructNextLayerINS_11GeneveLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  5.66k|		{
  358|  5.66k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 5.66k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  5.66k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  5.66k|			setNextLayer(newLayer);
  365|  5.66k|			return newLayer;
  366|  5.66k|		}
_ZN4pcpp5Layer18constructNextLayerINS_8DnsLayerEJEEEPS0_PhmDpOT0_:
  343|  37.4k|		{
  344|  37.4k|			return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  345|  37.4k|		}
_ZN4pcpp5Layer18constructNextLayerINS_8DnsLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  37.4k|		{
  358|  37.4k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 37.4k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  37.4k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  37.4k|			setNextLayer(newLayer);
  365|  37.4k|			return newLayer;
  366|  37.4k|		}
_ZN4pcpp5Layer44tryConstructNextLayerFromFactoryWithFallbackINS_12PayloadLayerEPFPNS_11QuicV1LayerEPhmPS0_PNS_6PacketEEJEEES6_T0_S5_mDpOT1_:
  537|  1.36k|		{
  538|       |			// Note that the fallback is first to allow template argument deduction of the factory type.
  539|  1.36k|			return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>(
  540|  1.36k|			    factoryFn, data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  541|  1.36k|		}
_ZN4pcpp5Layer44tryConstructNextLayerFromFactoryWithFallbackINS_12PayloadLayerEPFPNS_11QuicV1LayerEPhmPS0_PNS_6PacketEEJEEES6_T0_S5_mS8_DpOT1_:
  566|  1.36k|		{
  567|  1.36k|			auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet,
  568|  1.36k|			                                                         std::forward<Args>(extraArgs)...);
  569|  1.36k|			if (nextLayer != nullptr)
  ------------------
  |  Branch (569:8): [True: 1.32k, False: 40]
  ------------------
  570|  1.32k|			{
  571|  1.32k|				return nextLayer;
  572|  1.32k|			}
  573|       |
  574|       |			// factory failed, construct fallback layer
  575|     40|			return constructNextLayer<TFallback>(data, dataLen, packet);
  576|  1.36k|		}
_ZN4pcpp5Layer29constructNextLayerFromFactoryIPFPNS_11QuicV1LayerEPhmPS0_PNS_6PacketEEJEEES5_T_S4_mS7_DpOT0_:
  411|  1.36k|		{
  412|  1.36k|			if (hasNextLayer())
  ------------------
  |  Branch (412:8): [True: 0, False: 1.36k]
  ------------------
  413|      0|			{
  414|      0|				throw std::runtime_error("Next layer already exists");
  415|      0|			}
  416|       |
  417|       |			// cppcheck-suppress redundantInitialization
  418|  1.36k|			Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  419|  1.36k|			setNextLayer(newLayer);
  420|  1.36k|			return newLayer;
  421|  1.36k|		}
_ZN4pcpp5Layer44tryConstructNextLayerFromFactoryWithFallbackINS_12PayloadLayerEPFPNS_8SipLayerEPhmPS0_PNS_6PacketEttEJRtSB_EEES6_T0_S5_mDpOT1_:
  537|  10.7k|		{
  538|       |			// Note that the fallback is first to allow template argument deduction of the factory type.
  539|  10.7k|			return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>(
  540|  10.7k|			    factoryFn, data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  541|  10.7k|		}
_ZN4pcpp5Layer44tryConstructNextLayerFromFactoryWithFallbackINS_12PayloadLayerEPFPNS_8SipLayerEPhmPS0_PNS_6PacketEttEJRtSB_EEES6_T0_S5_mS8_DpOT1_:
  566|  10.7k|		{
  567|  10.7k|			auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet,
  568|  10.7k|			                                                         std::forward<Args>(extraArgs)...);
  569|  10.7k|			if (nextLayer != nullptr)
  ------------------
  |  Branch (569:8): [True: 10.0k, False: 671]
  ------------------
  570|  10.0k|			{
  571|  10.0k|				return nextLayer;
  572|  10.0k|			}
  573|       |
  574|       |			// factory failed, construct fallback layer
  575|    671|			return constructNextLayer<TFallback>(data, dataLen, packet);
  576|  10.7k|		}
_ZN4pcpp5Layer29constructNextLayerFromFactoryIPFPNS_8SipLayerEPhmPS0_PNS_6PacketEttEJRtSA_EEES5_T_S4_mS7_DpOT0_:
  411|  10.7k|		{
  412|  10.7k|			if (hasNextLayer())
  ------------------
  |  Branch (412:8): [True: 0, False: 10.7k]
  ------------------
  413|      0|			{
  414|      0|				throw std::runtime_error("Next layer already exists");
  415|      0|			}
  416|       |
  417|       |			// cppcheck-suppress redundantInitialization
  418|  10.7k|			Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  419|  10.7k|			setNextLayer(newLayer);
  420|  10.7k|			return newLayer;
  421|  10.7k|		}
_ZN4pcpp5Layer18constructNextLayerINS_11RadiusLayerEJEEEPS0_PhmDpOT0_:
  343|  21.9k|		{
  344|  21.9k|			return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  345|  21.9k|		}
_ZN4pcpp5Layer18constructNextLayerINS_11RadiusLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  21.9k|		{
  358|  21.9k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 21.9k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  21.9k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  21.9k|			setNextLayer(newLayer);
  365|  21.9k|			return newLayer;
  366|  21.9k|		}
_ZN4pcpp5Layer18constructNextLayerINS_10GtpV1LayerEJEEEPS0_PhmDpOT0_:
  343|  23.8k|		{
  344|  23.8k|			return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  345|  23.8k|		}
_ZN4pcpp5Layer18constructNextLayerINS_10GtpV1LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  23.8k|		{
  358|  23.8k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 23.8k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  23.8k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  23.8k|			setNextLayer(newLayer);
  365|  23.8k|			return newLayer;
  366|  23.8k|		}
_ZN4pcpp5Layer18constructNextLayerINS_10GtpV2LayerEJEEEPS0_PhmDpOT0_:
  343|  10.2k|		{
  344|  10.2k|			return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  345|  10.2k|		}
_ZN4pcpp5Layer18constructNextLayerINS_11DhcpV6LayerEJEEEPS0_PhmDpOT0_:
  343|  5.70k|		{
  344|  5.70k|			return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  345|  5.70k|		}
_ZN4pcpp5Layer18constructNextLayerINS_11DhcpV6LayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  5.70k|		{
  358|  5.70k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 5.70k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  5.70k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  5.70k|			setNextLayer(newLayer);
  365|  5.70k|			return newLayer;
  366|  5.70k|		}
_ZN4pcpp5Layer18constructNextLayerINS_8NtpLayerEJEEEPS0_PhmDpOT0_:
  343|  7.39k|		{
  344|  7.39k|			return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  345|  7.39k|		}
_ZN4pcpp5Layer18constructNextLayerINS_8NtpLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  7.39k|		{
  358|  7.39k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 7.39k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  7.39k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  7.39k|			setNextLayer(newLayer);
  365|  7.39k|			return newLayer;
  366|  7.39k|		}
_ZN4pcpp5Layer18constructNextLayerINS_14WakeOnLanLayerEJEEEPS0_PhmDpOT0_:
  343|    623|		{
  344|    623|			return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  345|    623|		}
_ZN4pcpp5Layer18constructNextLayerINS_14WakeOnLanLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|    686|		{
  358|    686|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 686]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|    686|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|    686|			setNextLayer(newLayer);
  365|    686|			return newLayer;
  366|    686|		}
_ZN4pcpp5Layer44tryConstructNextLayerFromFactoryWithFallbackINS_12PayloadLayerEPFPNS_14WireGuardLayerEPhmPS0_PNS_6PacketEEJEEES6_T0_S5_mDpOT1_:
  537|  1.80k|		{
  538|       |			// Note that the fallback is first to allow template argument deduction of the factory type.
  539|  1.80k|			return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>(
  540|  1.80k|			    factoryFn, data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  541|  1.80k|		}
_ZN4pcpp5Layer44tryConstructNextLayerFromFactoryWithFallbackINS_12PayloadLayerEPFPNS_14WireGuardLayerEPhmPS0_PNS_6PacketEEJEEES6_T0_S5_mS8_DpOT1_:
  566|  1.80k|		{
  567|  1.80k|			auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet,
  568|  1.80k|			                                                         std::forward<Args>(extraArgs)...);
  569|  1.80k|			if (nextLayer != nullptr)
  ------------------
  |  Branch (569:8): [True: 1.76k, False: 35]
  ------------------
  570|  1.76k|			{
  571|  1.76k|				return nextLayer;
  572|  1.76k|			}
  573|       |
  574|       |			// factory failed, construct fallback layer
  575|     35|			return constructNextLayer<TFallback>(data, dataLen, packet);
  576|  1.80k|		}
_ZN4pcpp5Layer29constructNextLayerFromFactoryIPFPNS_14WireGuardLayerEPhmPS0_PNS_6PacketEEJEEES5_T_S4_mS7_DpOT0_:
  411|  1.80k|		{
  412|  1.80k|			if (hasNextLayer())
  ------------------
  |  Branch (412:8): [True: 0, False: 1.80k]
  ------------------
  413|      0|			{
  414|      0|				throw std::runtime_error("Next layer already exists");
  415|      0|			}
  416|       |
  417|       |			// cppcheck-suppress redundantInitialization
  418|  1.80k|			Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  419|  1.80k|			setNextLayer(newLayer);
  420|  1.80k|			return newLayer;
  421|  1.80k|		}
_ZN4pcpp5Layer44tryConstructNextLayerFromFactoryWithFallbackINS_12PayloadLayerEPFPNS_9GvcpLayerEPhmPS0_PNS_6PacketEEJEEES6_T0_S5_mDpOT1_:
  537|    310|		{
  538|       |			// Note that the fallback is first to allow template argument deduction of the factory type.
  539|    310|			return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>(
  540|    310|			    factoryFn, data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  541|    310|		}
_ZN4pcpp5Layer44tryConstructNextLayerFromFactoryWithFallbackINS_12PayloadLayerEPFPNS_9GvcpLayerEPhmPS0_PNS_6PacketEEJEEES6_T0_S5_mS8_DpOT1_:
  566|    310|		{
  567|    310|			auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet,
  568|    310|			                                                         std::forward<Args>(extraArgs)...);
  569|    310|			if (nextLayer != nullptr)
  ------------------
  |  Branch (569:8): [True: 310, False: 0]
  ------------------
  570|    310|			{
  571|    310|				return nextLayer;
  572|    310|			}
  573|       |
  574|       |			// factory failed, construct fallback layer
  575|      0|			return constructNextLayer<TFallback>(data, dataLen, packet);
  576|    310|		}
_ZN4pcpp5Layer29constructNextLayerFromFactoryIPFPNS_9GvcpLayerEPhmPS0_PNS_6PacketEEJEEES5_T_S4_mS7_DpOT0_:
  411|    310|		{
  412|    310|			if (hasNextLayer())
  ------------------
  |  Branch (412:8): [True: 0, False: 310]
  ------------------
  413|      0|			{
  414|      0|				throw std::runtime_error("Next layer already exists");
  415|      0|			}
  416|       |
  417|       |			// cppcheck-suppress redundantInitialization
  418|    310|			Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  419|    310|			setNextLayer(newLayer);
  420|    310|			return newLayer;
  421|    310|		}
_ZN4pcpp5Layer44tryConstructNextLayerFromFactoryWithFallbackINS_12PayloadLayerEPFPNS_8SipLayerEPhmPS0_PNS_6PacketEEJEEES6_T0_S5_mDpOT1_:
  537|  45.2k|		{
  538|       |			// Note that the fallback is first to allow template argument deduction of the factory type.
  539|  45.2k|			return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>(
  540|  45.2k|			    factoryFn, data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  541|  45.2k|		}
_ZN4pcpp5Layer44tryConstructNextLayerFromFactoryWithFallbackINS_12PayloadLayerEPFPNS_8SipLayerEPhmPS0_PNS_6PacketEEJEEES6_T0_S5_mS8_DpOT1_:
  566|  45.2k|		{
  567|  45.2k|			auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet,
  568|  45.2k|			                                                         std::forward<Args>(extraArgs)...);
  569|  45.2k|			if (nextLayer != nullptr)
  ------------------
  |  Branch (569:8): [True: 4.01k, False: 41.2k]
  ------------------
  570|  4.01k|			{
  571|  4.01k|				return nextLayer;
  572|  4.01k|			}
  573|       |
  574|       |			// factory failed, construct fallback layer
  575|  41.2k|			return constructNextLayer<TFallback>(data, dataLen, packet);
  576|  45.2k|		}
_ZN4pcpp5Layer29constructNextLayerFromFactoryIPFPNS_8SipLayerEPhmPS0_PNS_6PacketEEJEEES5_T_S4_mS7_DpOT0_:
  411|  45.2k|		{
  412|  45.2k|			if (hasNextLayer())
  ------------------
  |  Branch (412:8): [True: 0, False: 45.2k]
  ------------------
  413|      0|			{
  414|      0|				throw std::runtime_error("Next layer already exists");
  415|      0|			}
  416|       |
  417|       |			// cppcheck-suppress redundantInitialization
  418|  45.2k|			Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  419|  45.2k|			setNextLayer(newLayer);
  420|  45.2k|			return newLayer;
  421|  45.2k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_8EthLayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|  6.11k|		{
  483|  6.11k|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|  6.11k|			                                                       std::forward<Args>(extraArgs)...);
  485|  6.11k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_8EthLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  6.11k|		{
  505|  6.11k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 6.00k, False: 103]
  ------------------
  506|  6.00k|			{
  507|  6.00k|				return m_NextLayer;
  508|  6.00k|			}
  509|       |
  510|    103|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  6.11k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_11S7CommLayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|  10.2k|		{
  483|  10.2k|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|  10.2k|			                                                       std::forward<Args>(extraArgs)...);
  485|  10.2k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_11S7CommLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|  10.2k|		{
  505|  10.2k|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 8.67k, False: 1.60k]
  ------------------
  506|  8.67k|			{
  507|  8.67k|				return m_NextLayer;
  508|  8.67k|			}
  509|       |
  510|  1.60k|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|  10.2k|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_11S7CommLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|  10.2k|		{
  457|  10.2k|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 8.67k, False: 1.60k]
  ------------------
  458|  8.67k|			{
  459|  8.67k|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|  8.67k|			}
  461|  1.60k|			return nullptr;
  462|  10.2k|		}
_ZN4pcpp5Layer18constructNextLayerINS_11S7CommLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  8.67k|		{
  358|  8.67k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 8.67k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  8.67k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  8.67k|			setNextLayer(newLayer);
  365|  8.67k|			return newLayer;
  366|  8.67k|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_14WakeOnLanLayerENS_12PayloadLayerEJEEEPS0_PhmDpOT1_:
  482|    342|		{
  483|    342|			return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(),
  484|    342|			                                                       std::forward<Args>(extraArgs)...);
  485|    342|		}
_ZN4pcpp5Layer33tryConstructNextLayerWithFallbackINS_14WakeOnLanLayerENS_12PayloadLayerEJEEEPS0_PhmPNS_6PacketEDpOT1_:
  504|    342|		{
  505|    342|			if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
  ------------------
  |  Branch (505:8): [True: 63, False: 279]
  ------------------
  506|     63|			{
  507|     63|				return m_NextLayer;
  508|     63|			}
  509|       |
  510|    279|			return constructNextLayer<TFallback>(data, dataLen, packet);
  511|    342|		}
_ZN4pcpp5Layer21tryConstructNextLayerINS_14WakeOnLanLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  456|    342|		{
  457|    342|			if (T::isDataValid(data, dataLen))
  ------------------
  |  Branch (457:8): [True: 63, False: 279]
  ------------------
  458|     63|			{
  459|     63|				return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
  460|     63|			}
  461|    279|			return nullptr;
  462|    342|		}
_ZN4pcpp5Layer16canReinterpretAsINS_11GeneveLayer13geneve_headerEEEbPKhm:
  587|  5.71k|		{
  588|  5.71k|			return data != nullptr && dataLen >= sizeof(T);
  ------------------
  |  Branch (588:11): [True: 5.71k, False: 0]
  |  Branch (588:30): [True: 5.71k, False: 0]
  ------------------
  589|  5.71k|		}
_ZN4pcpp5Layer16canReinterpretAsINS_16GvcpRequestLayer19gvcp_request_headerEEEbPKhm:
  587|    310|		{
  588|    310|			return data != nullptr && dataLen >= sizeof(T);
  ------------------
  |  Branch (588:11): [True: 310, False: 0]
  |  Branch (588:30): [True: 310, False: 0]
  ------------------
  589|    310|		}
_ZN4pcpp5Layer16canReinterpretAsINS_20GvcpAcknowledgeLayer15gvcp_ack_headerEEEbPKhm:
  587|    310|		{
  588|    310|			return data != nullptr && dataLen >= sizeof(T);
  ------------------
  |  Branch (588:11): [True: 310, False: 0]
  |  Branch (588:30): [True: 310, False: 0]
  ------------------
  589|    310|		}
_ZN4pcpp5Layer29constructNextLayerFromFactoryIPFPNS_9LdapLayerEPhmPS0_PNS_6PacketEEJEEES5_T_S4_mDpOT0_:
  387|     45|		{
  388|     45|			return constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, getAttachedPacket(),
  389|     45|			                                               std::forward<Args>(extraArgs)...);
  390|     45|		}
_ZN4pcpp5Layer29constructNextLayerFromFactoryIPFPNS_8StpLayerEPhmPS0_PNS_6PacketEEJEEES5_T_S4_mDpOT0_:
  387|  4.76k|		{
  388|  4.76k|			return constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, getAttachedPacket(),
  389|  4.76k|			                                               std::forward<Args>(extraArgs)...);
  390|  4.76k|		}
_ZN4pcpp5Layer29constructNextLayerFromFactoryIPFPNS_8StpLayerEPhmPS0_PNS_6PacketEEJEEES5_T_S4_mS7_DpOT0_:
  411|  4.76k|		{
  412|  4.76k|			if (hasNextLayer())
  ------------------
  |  Branch (412:8): [True: 0, False: 4.76k]
  ------------------
  413|      0|			{
  414|      0|				throw std::runtime_error("Next layer already exists");
  415|      0|			}
  416|       |
  417|       |			// cppcheck-suppress redundantInitialization
  418|  4.76k|			Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  419|  4.76k|			setNextLayer(newLayer);
  420|  4.76k|			return newLayer;
  421|  4.76k|		}
_ZN4pcpp5Layer16canReinterpretAsINS_12stp_tcn_bpduEEEbPKhm:
  587|  1.60k|		{
  588|  1.60k|			return data != nullptr && dataLen >= sizeof(T);
  ------------------
  |  Branch (588:11): [True: 1.60k, False: 0]
  |  Branch (588:30): [True: 1.60k, False: 0]
  ------------------
  589|  1.60k|		}
_ZN4pcpp5Layer16canReinterpretAsINS_13stp_conf_bpduEEEbPKhm:
  587|  1.88k|		{
  588|  1.88k|			return data != nullptr && dataLen >= sizeof(T);
  ------------------
  |  Branch (588:11): [True: 1.88k, False: 0]
  |  Branch (588:30): [True: 1.88k, False: 0]
  ------------------
  589|  1.88k|		}
_ZN4pcpp5Layer16canReinterpretAsINS_14rstp_conf_bpduEEEbPKhm:
  587|  1.08k|		{
  588|  1.08k|			return data != nullptr && dataLen >= sizeof(T);
  ------------------
  |  Branch (588:11): [True: 1.08k, False: 0]
  |  Branch (588:30): [True: 1.08k, False: 0]
  ------------------
  589|  1.08k|		}
_ZN4pcpp5Layer16canReinterpretAsINS_14mstp_conf_bpduEEEbPKhm:
  587|     68|		{
  588|     68|			return data != nullptr && dataLen >= sizeof(T);
  ------------------
  |  Branch (588:11): [True: 68, False: 0]
  |  Branch (588:30): [True: 64, False: 4]
  ------------------
  589|     68|		}
_ZN4pcpp5Layer18constructNextLayerINS_8SdpLayerEJEEEPS0_PhmDpOT0_:
  343|  9.47k|		{
  344|  9.47k|			return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...);
  345|  9.47k|		}
_ZN4pcpp5Layer18constructNextLayerINS_8SdpLayerEJEEEPS0_PhmPNS_6PacketEDpOT0_:
  357|  9.47k|		{
  358|  9.47k|			if (hasNextLayer())
  ------------------
  |  Branch (358:8): [True: 0, False: 9.47k]
  ------------------
  359|      0|			{
  360|      0|				throw std::runtime_error("Next layer already exists");
  361|      0|			}
  362|       |
  363|  9.47k|			Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...);
  364|  9.47k|			setNextLayer(newLayer);
  365|  9.47k|			return newLayer;
  366|  9.47k|		}

_ZN4pcpp9LdapLayer10isLdapPortEt:
  347|   204k|		{
  348|   204k|			return port == 389;
  349|   204k|		}
_ZNK4pcpp17LdapOperationTypecvNS0_5ValueEEv:
   88|    113|		{
   89|    113|			return m_Value;
   90|    113|		}
_ZNK4pcpp9LdapLayer12getHeaderLenEv:
  366|    134|		{
  367|    134|			return m_Asn1Record->getTotalLength();
  368|    134|		}
_ZN4pcpp9LdapLayer22computeCalculateFieldsEv:
  371|     21|		{}
_ZNK4pcpp9LdapLayer16getOsiModelLayerEv:
  374|     21|		{
  375|     21|			return OsiModelApplicationLayer;
  376|     21|		}
_ZN4pcpp17LdapResponseLayerC2ENSt3__110unique_ptrINS_10Asn1RecordENS1_14default_deleteIS3_EEEEPhmPNS_5LayerEPNS_6PacketE:
  447|    108|		    : LdapLayer(std::move(asn1Record), data, dataLen, prevLayer, packet)
  448|    108|		{}
_ZN4pcpp20LdapBindRequestLayerC2ENSt3__110unique_ptrINS_10Asn1RecordENS1_14default_deleteIS3_EEEEPhmPNS_5LayerEPNS_6PacketE:
  555|      5|		    : LdapLayer(std::move(asn1Record), data, dataLen, prevLayer, packet)
  556|      5|		{}
_ZN4pcpp21LdapBindResponseLayerC2ENSt3__110unique_ptrINS_10Asn1RecordENS1_14default_deleteIS3_EEEEPhmPNS_5LayerEPNS_6PacketE:
  602|     73|		    : LdapResponseLayer(std::move(asn1Record), data, dataLen, prevLayer, packet)
  603|     73|		{}
_ZN4pcpp25LdapSearchResultDoneLayerC2ENSt3__110unique_ptrINS_10Asn1RecordENS1_14default_deleteIS3_EEEEPhmPNS_5LayerEPNS_6PacketE:
  895|      5|		    : LdapResponseLayer(std::move(asn1Record), data, dataLen, prevLayer, packet)
  896|      5|		{}
_ZN4pcpp23LdapModifyResponseLayerC2ENSt3__110unique_ptrINS_10Asn1RecordENS1_14default_deleteIS3_EEEEPhmPNS_5LayerEPNS_6PacketE:
  928|      5|		    : LdapResponseLayer(std::move(asn1Record), data, dataLen, prevLayer, packet)
  929|      5|		{}
_ZN4pcpp23LdapDeleteResponseLayerC2ENSt3__110unique_ptrINS_10Asn1RecordENS1_14default_deleteIS3_EEEEPhmPNS_5LayerEPNS_6PacketE:
  994|      5|		    : LdapResponseLayer(std::move(asn1Record), data, dataLen, prevLayer, packet)
  995|      5|		{}
_ZN4pcpp25LdapModifyDNResponseLayerC2ENSt3__110unique_ptrINS_10Asn1RecordENS1_14default_deleteIS3_EEEEPhmPNS_5LayerEPNS_6PacketE:
 1027|     15|		    : LdapResponseLayer(std::move(asn1Record), data, dataLen, prevLayer, packet)
 1028|     15|		{}
_ZN4pcpp24LdapCompareResponseLayerC2ENSt3__110unique_ptrINS_10Asn1RecordENS1_14default_deleteIS3_EEEEPhmPNS_5LayerEPNS_6PacketE:
 1060|      5|		    : LdapResponseLayer(std::move(asn1Record), data, dataLen, prevLayer, packet)
 1061|      5|		{}
_ZN4pcpp9LdapLayerD2Ev:
  299|    113|		~LdapLayer() override = default;

_ZN4pcpp11ModbusLayer12isModbusPortEt:
  100|  82.6k|		{
  101|  82.6k|			return port == 502;
  102|  82.6k|		}
_ZN4pcpp11ModbusLayer11isDataValidEPKhm:
  109|  1.68k|		{
  110|  1.68k|			return data != nullptr && dataSize >= sizeof(modbus_header);
  ------------------
  |  Branch (110:11): [True: 1.68k, False: 0]
  |  Branch (110:30): [True: 1.68k, False: 0]
  ------------------
  111|  1.68k|		}
_ZN4pcpp11ModbusLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   87|  1.68k|		    : Layer(data, dataLen, prevLayer, packet, Modbus)
   88|  1.68k|		{}
_ZN4pcpp11ModbusLayer14parseNextLayerEv:
  145|  1.68k|		{}
_ZNK4pcpp11ModbusLayer12getHeaderLenEv:
  150|    329|		{
  151|    329|			return sizeof(modbus_header);
  152|    329|		}
_ZN4pcpp11ModbusLayer22computeCalculateFieldsEv:
  156|    329|		{}
_ZNK4pcpp11ModbusLayer16getOsiModelLayerEv:
  164|    329|		{
  165|    329|			return OsiModelApplicationLayer;
  166|    329|		}

_ZN4pcpp9MplsLayer11isDataValidEPKhm:
  115|  3.08M|		{
  116|  3.08M|			return canReinterpretAs<mpls_header>(data, dataLen);
  117|  3.08M|		}
_ZN4pcpp9MplsLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   38|  3.08M|		    : Layer(data, dataLen, prevLayer, packet, MPLS)
   39|  3.08M|		{}
_ZNK4pcpp9MplsLayer13getMplsHeaderEv:
   27|  3.23M|		{
   28|  3.23M|			return reinterpret_cast<mpls_header*>(m_Data);
   29|  3.23M|		}
_ZNK4pcpp9MplsLayer6getTTLEv:
   53|  28.3k|		{
   54|  28.3k|			return getMplsHeader()->ttl;
   55|  28.3k|		}
_ZNK4pcpp9MplsLayer12getHeaderLenEv:
   95|  3.10M|		{
   96|  3.10M|			return sizeof(mpls_header);
   97|  3.10M|		}
_ZNK4pcpp9MplsLayer16getOsiModelLayerEv:
  106|  14.1k|		{
  107|  14.1k|			return OsiModelNetworkLayer;
  108|  14.1k|		}

_ZN4pcpp10MySqlLayer11isMySqlPortEt:
  307|   192k|		{
  308|   192k|			return port == 3306;
  309|   192k|		}
_ZN4pcpp16MySqlMessageTypeC2ENS0_5ValueE:
  126|  3.90k|		constexpr MySqlMessageType(Value value) : m_Value(value)
  127|  3.90k|		{}
_ZNK4pcpp12MySqlMessage21getTotalMessageLengthEv:
  205|  3.90k|		{
  206|  3.90k|			return m_DataLen;
  207|  3.90k|		}
_ZN4pcpp12MySqlMessageC2EPKhmRKNS_16MySqlMessageTypeENS_18MySqlMessageOriginE:
  216|  1.95k|		    : m_Data(data), m_DataLen(dataLen), m_MessageType(messageType), m_MessageOrigin(origin)
  217|  1.95k|		{}
_ZN4pcpp19MySqlCommandMessageC2EPKhmRKNS_16MySqlMessageTypeENS_18MySqlMessageOriginE:
  244|    122|		    : MySqlMessage(data, dataLen, messageType, origin)
  245|    122|		{}
_ZN4pcpp17MySqlQueryMessageC2EPKhm:
  260|     16|		    : MySqlCommandMessage(data, dataLen, MySqlMessageType::Client_Query, MySqlMessageOrigin::Client)
  261|     16|		{}
_ZNK4pcpp10MySqlLayer12getHeaderLenEv:
  363|  2.90k|		{
  364|  2.90k|			return m_DataLen;
  365|  2.90k|		}
_ZN4pcpp10MySqlLayer14parseNextLayerEv:
  369|  15.5k|		{}
_ZN4pcpp10MySqlLayer22computeCalculateFieldsEv:
  373|  2.90k|		{}
_ZNK4pcpp10MySqlLayer16getOsiModelLayerEv:
  377|  2.90k|		{
  378|  2.90k|			return OsiModelApplicationLayer;
  379|  2.90k|		}
_ZN4pcpp10MySqlLayerC2EPhmPNS_5LayerEPNS_6PacketENS_18MySqlMessageOriginE:
  390|  15.5k|		    : Layer(data, dataLen, prevLayer, packet, MySQL), m_MessageOrigin(origin)
  391|  15.5k|		{}
_ZN4pcpp12MySqlMessageD2Ev:
  172|  1.95k|		virtual ~MySqlMessage() = default;
_ZN4pcpp10MySqlLayerD2Ev:
  301|  15.5k|		~MySqlLayer() override = default;

_ZN4pcpp28NDPNeighborSolicitationLayer11isDataValidEPKhm:
  211|  2.80k|		{
  212|  2.80k|			return data != nullptr && dataLen >= sizeof(ndpneighborsolicitationhdr);
  ------------------
  |  Branch (212:11): [True: 2.80k, False: 0]
  |  Branch (212:30): [True: 2.80k, False: 0]
  ------------------
  213|  2.80k|		}
_ZN4pcpp28NDPNeighborSolicitationLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  203|  2.80k|		    : NDPLayerBase(data, dataLen, prevLayer, packet)
  204|  2.80k|		{}
_ZN4pcpp12NDPLayerBaseC2EPhmPNS_5LayerEPNS_6PacketE:
  164|  3.32k|		    : IcmpV6Layer(data, dataLen, prevLayer, packet)
  165|  3.32k|		{}
_ZN4pcpp12NDPLayerBaseD2Ev:
  102|  3.32k|		~NDPLayerBase() override = default;
_ZNK4pcpp12NDPLayerBase20getNdpOptionsBasePtrEv:
  174|  2.27k|		{
  175|  2.27k|			return m_Data + getNdpHeaderLen();
  176|  2.27k|		};
_ZN4pcpp29NDPNeighborAdvertisementLayer11isDataValidEPKhm:
  334|    520|		{
  335|    520|			return data != nullptr && dataLen >= sizeof(ndpneighboradvertisementhdr);
  ------------------
  |  Branch (335:11): [True: 520, False: 0]
  |  Branch (335:30): [True: 520, False: 0]
  ------------------
  336|    520|		}
_ZN4pcpp29NDPNeighborAdvertisementLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  326|    520|		    : NDPLayerBase(data, dataLen, prevLayer, packet)
  327|    520|		{}
_ZN4pcpp9NdpOptionC2EPh:
   37|  2.42k|		explicit NdpOption(uint8_t* optionRawData) : TLVRecord(optionRawData)
   38|  2.42k|		{}
_ZNK4pcpp9NdpOption12getTotalSizeEv:
   56|  4.73k|		{
   57|  4.73k|			if (m_Data == nullptr)
  ------------------
  |  Branch (57:8): [True: 0, False: 4.73k]
  ------------------
   58|      0|				return 0;
   59|       |
   60|  4.73k|			return static_cast<size_t>(m_Data->recordLen) * 8;
   61|  4.73k|		}
_ZNK4pcpp28NDPNeighborSolicitationLayer11getTargetIPEv:
  230|  1.38k|		{
  231|  1.38k|			return IPv6Address(getNdpHeader()->targetIP);
  232|  1.38k|		};
_ZNK4pcpp28NDPNeighborSolicitationLayer12getNdpHeaderEv:
  271|  1.38k|		{
  272|  1.38k|			return reinterpret_cast<ndpneighborsolicitationhdr*>(m_Data);
  273|  1.38k|		}
_ZNK4pcpp28NDPNeighborSolicitationLayer15getNdpHeaderLenEv:
  275|  3.52k|		{
  276|  3.52k|			return sizeof(ndpneighborsolicitationhdr);
  277|  3.52k|		};
_ZNK4pcpp29NDPNeighborAdvertisementLayer11getTargetIPEv:
  366|    260|		{
  367|    260|			return IPv6Address(getNdpHeader()->targetIP);
  368|    260|		}
_ZNK4pcpp29NDPNeighborAdvertisementLayer12getNdpHeaderEv:
  430|    260|		{
  431|    260|			return reinterpret_cast<ndpneighboradvertisementhdr*>(m_Data);
  432|    260|		}
_ZNK4pcpp29NDPNeighborAdvertisementLayer15getNdpHeaderLenEv:
  434|  1.02k|		{
  435|  1.02k|			return sizeof(ndpneighboradvertisementhdr);
  436|  1.02k|		};

_ZN4pcpp10NflogLayerC2EPhmPNS_6PacketE:
  151|  2.27k|		NflogLayer(uint8_t* data, size_t dataLen, Packet* packet) : Layer(data, dataLen, nullptr, packet, NFLOG)
  152|  2.27k|		{}
_ZN4pcpp8NflogTlvC2EPh:
   89|  8.11k|		{
   90|  8.11k|			assign(recordRawData);
   91|  8.11k|		}
_ZNK4pcpp8NflogTlv12getTotalSizeEv:
   95|  29.8k|		{
   96|       |			// as in
   97|       |			// https://github.com/the-tcpdump-group/libpcap/blob/766b607d60d8038087b49fc4cf433dac3dcdb49c/pcap-util.c#L371-L374
   98|  29.8k|			return align<4>(m_Data->recordLen);
   99|  29.8k|		}
_ZN4pcpp8NflogTlv6assignEPh:
  104|  21.6k|		{
  105|  21.6k|			m_Data = reinterpret_cast<NflogTLVRawData*>(recordRawData);
  106|  21.6k|		}
_ZN4pcpp8NflogTlv9canAssignEPKhm:
  113|  8.11k|		{
  114|  8.11k|			return recordRawData != nullptr && tlvDataLen >= sizeof(NflogTLVRawData::recordLen);
  ------------------
  |  Branch (114:11): [True: 8.11k, False: 0]
  |  Branch (114:39): [True: 7.90k, False: 209]
  ------------------
  115|  8.11k|		}
_ZNK4pcpp8NflogTlv6isNullEv:
  119|  24.1k|		{
  120|  24.1k|			return (m_Data == nullptr);
  121|  24.1k|		}
_ZNK4pcpp8NflogTlv7getTypeEv:
  125|  5.10k|		{
  126|  5.10k|			return m_Data->recordType;
  127|  5.10k|		}
_ZNK4pcpp8NflogTlv16getRecordBasePtrEv:
  131|  26.2k|		{
  132|  26.2k|			return reinterpret_cast<uint8_t*>(m_Data);
  133|  26.2k|		}
_ZNK4pcpp8NflogTlv8getValueEv:
  137|    141|		{
  138|    141|			return m_Data->recordValue;
  139|    141|		}
_ZNK4pcpp10NflogLayer14getNflogHeaderEv:
  159|    141|		{
  160|    141|			return reinterpret_cast<nflog_header*>(m_Data);
  161|    141|		}
_ZN4pcpp10NflogLayer22computeCalculateFieldsEv:
  193|  1.09k|		void computeCalculateFields() override {};
_ZNK4pcpp10NflogLayer16getOsiModelLayerEv:
  198|  1.09k|		{
  199|  1.09k|			return OsiModelDataLinkLayer;
  200|  1.09k|		}
_ZNK4pcpp10NflogLayer14getTlvsBasePtrEv:
  244|  4.85k|		{
  245|  4.85k|			return m_Data + sizeof(nflog_header);
  246|  4.85k|		}
_ZN4pcpp10NflogLayerD2Ev:
  154|  2.27k|		~NflogLayer() override = default;

_ZNK4pcpp8NtpLayer12getNtpHeaderEv:
  150|  50.8k|		{
  151|  50.8k|			return reinterpret_cast<ntp_header*>(m_Data);
  152|  50.8k|		}
_ZN4pcpp8NtpLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  318|  7.39k|		    : Layer(data, dataLen, prevLayer, packet, NTP)
  319|  7.39k|		{}
_ZN4pcpp8NtpLayer9isNTPPortEt:
  532|   208k|		{
  533|   208k|			return port == 123;
  534|   208k|		}
_ZN4pcpp8NtpLayer14parseNextLayerEv:
  540|  7.39k|		{}
_ZNK4pcpp8NtpLayer12getHeaderLenEv:
  544|  2.46k|		{
  545|  2.46k|			return m_DataLen;
  546|  2.46k|		}
_ZN4pcpp8NtpLayer22computeCalculateFieldsEv:
  550|  1.23k|		{}
_ZNK4pcpp8NtpLayer16getOsiModelLayerEv:
  554|  1.23k|		{
  555|  1.23k|			return OsiModelApplicationLayer;
  556|  1.23k|		}

_ZN4pcpp17NullLoopbackLayer11isDataValidEPKhm:
   87|  14.5k|		{
   88|  14.5k|			return data != nullptr && dataLen >= sizeof(uint32_t);
  ------------------
  |  Branch (88:11): [True: 14.5k, False: 0]
  |  Branch (88:30): [True: 14.2k, False: 268]
  ------------------
   89|  14.5k|		}
_ZN4pcpp17NullLoopbackLayerC2EPhmPNS_6PacketE:
   39|  14.2k|		    : Layer(data, dataLen, nullptr, packet, NULL_LOOPBACK)
   40|  14.2k|		{}
_ZNK4pcpp17NullLoopbackLayer12getHeaderLenEv:
   67|  2.76k|		{
   68|  2.76k|			return sizeof(uint32_t);
   69|  2.76k|		}
_ZN4pcpp17NullLoopbackLayer22computeCalculateFieldsEv:
   73|  2.76k|		{}
_ZNK4pcpp17NullLoopbackLayer16getOsiModelLayerEv:
   78|  2.76k|		{
   79|  2.76k|			return OsiModelDataLinkLayer;
   80|  2.76k|		}

_ZNK4pcpp10PPPoELayer14getPPPoEHeaderEv:
   83|  9.68k|		{
   84|  9.68k|			return reinterpret_cast<pppoe_header*>(m_Data);
   85|  9.68k|		}
_ZNK4pcpp10PPPoELayer16getOsiModelLayerEv:
   93|  3.59k|		{
   94|  3.59k|			return OsiModelDataLinkLayer;
   95|  3.59k|		}
_ZN4pcpp10PPPoELayerC2EPhmPNS_5LayerEPNS_6PacketEh:
  130|  25.4k|		    : Layer(data, dataLen, prevLayer, packet, protocol)
  131|  25.4k|		{}
_ZN4pcpp17PPPoESessionLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  151|  22.1k|		    : PPPoELayer(data, dataLen, prevLayer, packet, PPPoESession)
  152|  22.1k|		{}
_ZNK4pcpp17PPPoESessionLayer12getHeaderLenEv:
  190|  52.1k|		{
  191|  52.1k|			return sizeof(pppoe_header) + sizeof(uint16_t);
  192|  52.1k|		}
_ZN4pcpp19PPPoEDiscoveryLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  318|  3.36k|		    : PPPoELayer(data, dataLen, prevLayer, packet, PPPoEDiscovery)
  319|  3.36k|		{
  320|  3.36k|			m_DataLen = getHeaderLen();
  321|  3.36k|		}
_ZN4pcpp19PPPoEDiscoveryLayer14parseNextLayerEv:
  388|  3.36k|		{}
_ZNK4pcpp19PPPoEDiscoveryLayer8toStringEv:
  394|  1.81k|		{
  395|  1.81k|			return "PPP-over-Ethernet Discovery (" + codeToString((PPPoELayer::PPPoECode)getPPPoEHeader()->code) + ")";
  396|  1.81k|		}
_ZN4pcpp17PPPoESessionLayer11isDataValidEPKhm:
  439|  22.2k|	{
  440|  22.2k|		return data && dataLen >= sizeof(pppoe_header) + sizeof(uint16_t);
  ------------------
  |  Branch (440:10): [True: 22.2k, False: 0]
  |  Branch (440:18): [True: 22.1k, False: 128]
  ------------------
  441|  22.2k|	}
_ZN4pcpp19PPPoEDiscoveryLayer11isDataValidEPKhm:
  444|  3.36k|	{
  445|  3.36k|		return data && dataLen >= sizeof(pppoe_header);
  ------------------
  |  Branch (445:10): [True: 3.36k, False: 0]
  |  Branch (445:18): [True: 3.36k, False: 0]
  ------------------
  446|  3.36k|	}

_ZNK4pcpp6Packet13getFirstLayerEv:
  209|  14.3M|		{
  210|  14.3M|			return m_FirstLayer;
  211|  14.3M|		}
_ZN4pcpp6PacketC2ERKS0_:
  150|   677k|		{
  151|   677k|			copyDataFrom(other);
  152|   677k|		}
_ZN4pcpp6PacketD2Ev:
  142|   844k|		{
  143|   844k|			destructPacketData();
  144|   844k|		}
_ZNK4pcpp6Packet12getRawPacketEv:
  165|  84.1k|		{
  166|  84.1k|			return m_RawPacket;
  167|  84.1k|		}
_ZNK4pcpp6Packet14getLayerOfTypeINS_7IPLayerEEEPT_b:
  439|  3.03k|	{
  440|  3.03k|		if (!reverse)
  ------------------
  |  Branch (440:7): [True: 3.03k, False: 0]
  ------------------
  441|  3.03k|		{
  442|  3.03k|			return searchLayerStackForType<TLayer>(
  443|  3.03k|			    m_FirstLayer, [](Layer* layer) { return layer->getNextLayer(); }, false);
  444|  3.03k|		}
  445|       |
  446|       |		// lookup in reverse order
  447|      0|		return searchLayerStackForType<TLayer>(m_LastLayer, [](Layer* layer) { return layer->getPrevLayer(); }, false);
  448|  3.03k|	}
_ZN4pcpp6Packet23searchLayerStackForTypeINS_7IPLayerEZNKS0_14getLayerOfTypeIS2_EEPT_bEUlPNS_5LayerEE_EES5_S7_T0_b:
  462|  3.03k|	{
  463|  3.03k|		if (curLayer == nullptr)
  ------------------
  |  Branch (463:7): [True: 0, False: 3.03k]
  ------------------
  464|      0|			return nullptr;
  465|       |
  466|  3.03k|		if (skipFirst)
  ------------------
  |  Branch (466:7): [True: 0, False: 3.03k]
  ------------------
  467|      0|		{
  468|      0|			curLayer = nextLayerFn(curLayer);
  469|      0|		}
  470|       |
  471|  5.64k|		while (curLayer != nullptr)
  ------------------
  |  Branch (471:10): [True: 5.64k, False: 0]
  ------------------
  472|  5.64k|		{
  473|  5.64k|			auto* curLayerCasted = dynamic_cast<TLayer*>(curLayer);
  474|  5.64k|			if (curLayerCasted != nullptr)
  ------------------
  |  Branch (474:8): [True: 3.03k, False: 2.61k]
  ------------------
  475|  3.03k|				return curLayerCasted;
  476|       |
  477|  2.61k|			curLayer = nextLayerFn(curLayer);
  478|  2.61k|		}
  479|       |
  480|      0|		return nullptr;
  481|  3.03k|	}
_ZZNK4pcpp6Packet14getLayerOfTypeINS_7IPLayerEEEPT_bENKUlPNS_5LayerEE_clES6_:
  443|  2.61k|			    m_FirstLayer, [](Layer* layer) { return layer->getNextLayer(); }, false);

_ZN4pcpp18PacketTrailerLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   40|  18.3k|		    : Layer(data, dataLen, prevLayer, packet, PacketTrailer)
   41|  18.3k|		{}
_ZNK4pcpp18PacketTrailerLayer12getHeaderLenEv:
   70|  29.0k|		{
   71|  29.0k|			return m_DataLen;
   72|  29.0k|		}
_ZN4pcpp18PacketTrailerLayer22computeCalculateFieldsEv:
   76|  18.3k|		{}

_ZN4pcpp12PayloadLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   22|   244k|		    : Layer(data, dataLen, prevLayer, packet, GenericPayload)
   23|   244k|		{}
_ZN4pcpp12PayloadLayer14parseNextLayerEv:
   59|   244k|		{}
_ZNK4pcpp12PayloadLayer12getHeaderLenEv:
   63|  50.4k|		{
   64|  50.4k|			return m_DataLen;
   65|  50.4k|		}
_ZN4pcpp12PayloadLayer22computeCalculateFieldsEv:
   69|  47.1k|		{}
_ZNK4pcpp12PayloadLayer16getOsiModelLayerEv:
   81|  47.1k|		{
   82|  47.1k|			return OsiModelApplicationLayer;
   83|  47.1k|		}

_ZN4pcpp13PostgresLayer14isPostgresPortEt:
  509|   198k|		{
  510|   198k|			return port == 5432;
  511|   198k|		}
_ZN4pcpp19PostgresMessageTypeC2ENS0_5ValueE:
  151|    390|		constexpr PostgresMessageType(Value value) : m_Value(value)
  152|    390|		{}
_ZNK4pcpp15PostgresMessage21getTotalMessageLengthEv:
  234|    780|		{
  235|    780|			return m_DataLen;
  236|    780|		}
_ZN4pcpp15PostgresMessageC2EPKhmRKNS_19PostgresMessageTypeE:
  244|    390|		    : m_Data(data), m_DataLen(dataLen), m_MessageType(messageType)
  245|    390|		{}
_ZNK4pcpp13PostgresLayer12getHeaderLenEv:
  567|    389|		{
  568|    389|			return m_DataLen;
  569|    389|		}
_ZN4pcpp13PostgresLayer14parseNextLayerEv:
  573|  2.11k|		{}
_ZN4pcpp13PostgresLayer22computeCalculateFieldsEv:
  577|    389|		{}
_ZNK4pcpp13PostgresLayer16getOsiModelLayerEv:
  581|    389|		{
  582|    389|			return OsiModelApplicationLayer;
  583|    389|		}
_ZN4pcpp13PostgresLayerC2EPhmPNS_5LayerEPNS_6PacketENS_21PostgresMessageOriginE:
  595|  2.11k|		    : Layer(data, dataLen, prevLayer, packet, Postgres), m_MessageOrigin(messageOrigin)
  596|  2.11k|		{}
_ZN4pcpp15PostgresMessageD2Ev:
  201|    390|		virtual ~PostgresMessage() = default;
_ZN4pcpp13PostgresLayerD2Ev:
  504|  2.11k|		~PostgresLayer() override = default;

_ZN4pcpp8internal27protoFamilyContainsProtocolEjh:
  454|  24.4M|		{
  455|  24.4M|			auto const protocolToFamily = static_cast<ProtocolTypeFamily>(protocol);
  456|  24.4M|			return (protocolToFamily == (family & 0xff) || protocolToFamily << 8 == (family & 0xff00) ||
  ------------------
  |  Branch (456:12): [True: 39.7k, False: 24.4M]
  |  Branch (456:51): [True: 35.1k, False: 24.3M]
  ------------------
  457|  24.3M|			        protocolToFamily << 16 == (family & 0xff0000) || protocolToFamily << 24 == (family & 0xff000000));
  ------------------
  |  Branch (457:12): [True: 0, False: 24.3M]
  |  Branch (457:61): [True: 0, False: 24.3M]
  ------------------
  458|  24.4M|		}

_ZN4pcpp11QuicV1Layer10isQuicPortEt:
   87|   356k|		{
   88|   356k|			return port == 443;
   89|   356k|		}
_ZN4pcpp11QuicV1Layer22computeCalculateFieldsEv:
  101|    217|		{}
_ZNK4pcpp11QuicV1Layer16getOsiModelLayerEv:
  108|    217|		{
  109|    217|			return OsiModelTransportLayer;
  110|    217|		}
_ZN4pcpp11QuicV1LayerC2EPhmPNS_5LayerEPNS_6PacketE:
  114|  1.32k|		    : Layer(data, dataLen, prevLayer, packet, QUICv1)
  115|  1.32k|		{}
_ZN4pcpp21QuicV1LongHeaderLayer15OffsetAndLengthC2Emm:
  221|  1.18k|			OffsetAndLength(size_t length, size_t offset) : length(length), offset(offset)
  222|  1.18k|			{}
_ZNK4pcpp21QuicV1LongHeaderLayer13getLongHeaderEv:
  235|    849|		{
  236|    849|			return reinterpret_cast<quic_long_header*>(m_Data);
  237|    849|		}
_ZN4pcpp24QuicV1EstablishmentLayer18VarintValueAndSizeC2Emm:
  283|    941|			VarintValueAndSize(uint64_t value, size_t size) : value(value), size(size)
  284|    941|			{}
_ZNK4pcpp16QuicV1RetryLayer12getHeaderLenEv:
  371|     30|		{
  372|     30|			return m_DataLen;
  373|     30|		}
_ZNK4pcpp29QuicV1VersionNegotiationLayer13getPacketTypeEv:
  395|      6|		{
  396|      6|			return QuicPacketType::VersionNegotiation;
  397|      6|		}
_ZNK4pcpp29QuicV1VersionNegotiationLayer12getHeaderLenEv:
  408|     18|		{
  409|     18|			return m_DataLen;
  410|     18|		}
_ZNK4pcpp17QuicV1OneRttLayer13getPacketTypeEv:
  427|    210|		{
  428|    210|			return QuicPacketType::OneRtt;
  429|    210|		}
_ZNK4pcpp17QuicV1OneRttLayer12getHeaderLenEv:
  455|    955|		{
  456|    955|			return m_DataLen;
  457|    955|		}

_ZN4pcpp11RadiusLayer12isRadiusPortEt:
  310|   318k|	{
  311|   318k|		switch (port)
  312|   318k|		{
  313|  15.3k|		case 1812:
  ------------------
  |  Branch (313:3): [True: 15.3k, False: 303k]
  ------------------
  314|  16.2k|		case 1813:
  ------------------
  |  Branch (314:3): [True: 937, False: 317k]
  ------------------
  315|  28.8k|		case 3799:
  ------------------
  |  Branch (315:3): [True: 12.5k, False: 305k]
  ------------------
  316|  28.8k|			return true;
  317|   289k|		default:
  ------------------
  |  Branch (317:3): [True: 289k, False: 28.8k]
  ------------------
  318|   289k|			return false;
  319|   318k|		}
  320|   318k|	}  // isRadiusPort
_ZN4pcpp11RadiusLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  152|  21.9k|		    : Layer(data, dataLen, prevLayer, packet, Radius)
  153|  21.9k|		{}
_ZNK4pcpp11RadiusLayer15getRadiusHeaderEv:
  181|  43.8k|		{
  182|  43.8k|			return reinterpret_cast<radius_header*>(m_Data);
  183|  43.8k|		}
_ZN4pcpp11RadiusLayer14parseNextLayerEv:
  258|  21.9k|		{}
_ZNK4pcpp11RadiusLayer16getOsiModelLayerEv:
  266|  4.38k|		{
  267|  4.38k|			return OsiModelApplicationLayer;
  268|  4.38k|		}
_ZN4pcpp11RadiusLayerD2Ev:
  175|  21.9k|		~RadiusLayer() override = default;

_ZNK4pcpp9RawPacket10getRawDataEv:
  694|  1.89M|		{
  695|  1.89M|			return m_RawData;
  696|  1.89M|		}
_ZNK4pcpp9RawPacket16getLinkLayerTypeEv:
  701|   844k|		{
  702|   844k|			return m_LinkLayerType;
  703|   844k|		}
_ZNK4pcpp9RawPacket13getRawDataLenEv:
  713|  2.05M|		{
  714|  2.05M|			return m_RawDataLen;
  715|  2.05M|		}
_ZNK4pcpp9RawPacket18getPacketTimeStampEv:
  726|   166k|		{
  727|   166k|			return m_TimeStamp;
  728|   166k|		}
_ZN4pcpp9RawPacketC2Ev:
  544|  2.23k|		RawPacket() = default;

_ZN4pcpp11S7CommLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   95|  8.67k|		    : Layer(data, dataLen, prevLayer, packet, S7COMM)
   96|  8.67k|		{}
_ZNK4pcpp11S7CommLayer12getHeaderLenEv:
  145|  1.23k|		{
  146|  1.23k|			return m_DataLen;
  147|  1.23k|		}
_ZN4pcpp11S7CommLayer22computeCalculateFieldsEv:
  151|  1.23k|		{}
_ZN4pcpp11S7CommLayer14parseNextLayerEv:
  155|  8.67k|		{}
_ZNK4pcpp11S7CommLayer16getOsiModelLayerEv:
  166|  1.23k|		{
  167|  1.23k|			return OsiModelApplicationLayer;
  168|  1.23k|		}
_ZNK4pcpp11S7CommLayer15getS7commHeaderEv:
  214|  2.47k|		{
  215|  2.47k|			return reinterpret_cast<s7commhdr*>(m_Data);
  216|  2.47k|		}
_ZN4pcpp11S7CommLayerD2Ev:
   98|  8.67k|		~S7CommLayer() override = default;

_ZN4pcpp8SSHLayer9isSSHPortEtt:
   93|   184k|		{
   94|   184k|			return portSrc == 22 || portDst == 22;
  ------------------
  |  Branch (94:11): [True: 4.81k, False: 179k]
  |  Branch (94:28): [True: 12.3k, False: 166k]
  ------------------
   95|   184k|		}
_ZN4pcpp8SSHLayer22computeCalculateFieldsEv:
  105|  3.26k|		{}
_ZNK4pcpp8SSHLayer16getOsiModelLayerEv:
  108|  3.26k|		{
  109|  3.26k|			return OsiModelApplicationLayer;
  110|  3.26k|		}
_ZN4pcpp8SSHLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  115|  18.1k|		    : Layer(data, dataLen, prevLayer, packet, SSH)
  116|  18.1k|		{}
_ZNK4pcpp24SSHIdentificationMessage12getHeaderLenEv:
  149|  1.74k|		{
  150|  1.74k|			return m_DataLen;
  151|  1.74k|		}
_ZN4pcpp24SSHIdentificationMessageC2EPhmPNS_5LayerEPNS_6PacketE:
  161|  1.48k|		    : SSHLayer(data, dataLen, prevLayer, packet)
  162|  1.48k|		{}
_ZN4pcpp19SSHHandshakeMessageC2EPhmPNS_5LayerEPNS_6PacketE:
  261|  3.64k|		    : SSHLayer(data, dataLen, prevLayer, packet)
  262|  3.64k|		{}
_ZNK4pcpp19SSHHandshakeMessage16getMsgBaseHeaderEv:
  265|  5.33k|		{
  266|  5.33k|			return reinterpret_cast<ssh_message_base*>(m_Data);
  267|  5.33k|		}
_ZN4pcpp19SSHEncryptedMessageC2EPhmPNS_5LayerEPNS_6PacketE:
  395|  13.0k|		    : SSHLayer(data, dataLen, prevLayer, packet)
  396|  13.0k|		{}
_ZNK4pcpp19SSHEncryptedMessage12getHeaderLenEv:
  402|  15.4k|		{
  403|  15.4k|			return m_DataLen;
  404|  15.4k|		}

_ZN4pcpp10SSLVersionC2Et:
  157|   349k|		{
  158|   349k|			m_SSLVersionValue = sslVersionValue;
  159|   349k|		}
_ZN4pcpp10SSLVersion6asUIntEv:
  170|  9.94k|		{
  171|  9.94k|			return m_SSLVersionValue;
  172|  9.94k|		}

_ZNK4pcpp21SSLClientHelloMessage18getExtensionOfTypeINS_32SSLServerNameIndicationExtensionEEEPT_v:
  946|  6.33k|	{
  947|  6.33k|		size_t vecSize = m_ExtensionList.size();
  948|  11.6k|		for (size_t i = 0; i < vecSize; i++)
  ------------------
  |  Branch (948:22): [True: 8.72k, False: 2.89k]
  ------------------
  949|  8.72k|		{
  950|  8.72k|			SSLExtension* curElem = const_cast<SSLExtension*>(m_ExtensionList.at(i));
  951|  8.72k|			if (dynamic_cast<TExtension*>(curElem) != nullptr)
  ------------------
  |  Branch (951:8): [True: 3.44k, False: 5.28k]
  ------------------
  952|  3.44k|				return static_cast<TExtension*>(curElem);
  953|  8.72k|		}
  954|       |
  955|  2.89k|		return nullptr;
  956|  6.33k|	}
_ZNK4pcpp21SSLClientHelloMessage18getExtensionOfTypeINS_29SSLSupportedVersionsExtensionEEEPT_v:
  946|  6.33k|	{
  947|  6.33k|		size_t vecSize = m_ExtensionList.size();
  948|  34.8k|		for (size_t i = 0; i < vecSize; i++)
  ------------------
  |  Branch (948:22): [True: 29.5k, False: 5.30k]
  ------------------
  949|  29.5k|		{
  950|  29.5k|			SSLExtension* curElem = const_cast<SSLExtension*>(m_ExtensionList.at(i));
  951|  29.5k|			if (dynamic_cast<TExtension*>(curElem) != nullptr)
  ------------------
  |  Branch (951:8): [True: 1.03k, False: 28.5k]
  ------------------
  952|  1.03k|				return static_cast<TExtension*>(curElem);
  953|  29.5k|		}
  954|       |
  955|  5.30k|		return nullptr;
  956|  6.33k|	}
_ZNK4pcpp21SSLServerHelloMessage18getExtensionOfTypeINS_32SSLServerNameIndicationExtensionEEEPT_v:
  959|  3.61k|	{
  960|  3.61k|		size_t vecSize = m_ExtensionList.size();
  961|  5.58k|		for (size_t i = 0; i < vecSize; i++)
  ------------------
  |  Branch (961:22): [True: 2.45k, False: 3.13k]
  ------------------
  962|  2.45k|		{
  963|  2.45k|			SSLExtension* curElem = const_cast<SSLExtension*>(m_ExtensionList.at(i));
  964|  2.45k|			if (dynamic_cast<TExtension*>(curElem) != nullptr)
  ------------------
  |  Branch (964:8): [True: 481, False: 1.97k]
  ------------------
  965|    481|				return static_cast<TExtension*>(curElem);
  966|  2.45k|		}
  967|       |
  968|  3.13k|		return nullptr;
  969|  3.61k|	}
_ZN4pcpp14SSLCipherSuiteC2EtNS_23SSLKeyExchangeAlgorithmENS_26SSLAuthenticationAlgorithmENS_31SSLSymmetricEncryptionAlgorithmENS_19SSLHashingAlgorithmEPKc:
   36|    658|		    : m_Id(id), m_KeyExAlg(keyExAlg), m_AuthAlg(authAlg), m_SymKeyAlg(symKeyAlg), m_MACAlg(MACAlg), m_Name(name)
   37|    658|		{}
_ZNK4pcpp12SSLExtension18getExtensionStructEv:
  187|   551k|		{
  188|   551k|			return reinterpret_cast<SSLExtensionStruct*>(m_RawData);
  189|   551k|		}
_ZN4pcpp18SSLx509CertificateC2EPhmb:
  255|  2.15k|		    : m_Data(data), m_DataLen(dataLen), m_AllDataExists(allDataExists)
  256|  2.15k|		{}
_ZNK4pcpp21SSLClientHelloMessage20getClientHelloHeaderEv:
  402|  12.2k|		{
  403|  12.2k|			return reinterpret_cast<ssl_tls_client_server_hello*>(m_Data);
  404|  12.2k|		}
_ZNK4pcpp21SSLServerHelloMessage20getServerHelloHeaderEv:
  538|  6.27k|		{
  539|  6.27k|			return reinterpret_cast<ssl_tls_client_server_hello*>(m_Data);
  540|  6.27k|		}
_ZN4pcpp22SSLHelloRequestMessageC2EPhmPNS_17SSLHandshakeLayerE:
  676|  6.96k|		    : SSLHandshakeMessage(data, dataLen, container)
  677|  6.96k|		{}
_ZN4pcpp27SSLServerKeyExchangeMessageC2EPhmPNS_17SSLHandshakeLayerE:
  699|     48|		    : SSLHandshakeMessage(data, dataLen, container)
  700|     48|		{}
_ZN4pcpp27SSLClientKeyExchangeMessageC2EPhmPNS_17SSLHandshakeLayerE:
  733|  3.28k|		    : SSLHandshakeMessage(data, dataLen, container)
  734|  3.28k|		{}
_ZN4pcpp25SSLServerHelloDoneMessageC2EPhmPNS_17SSLHandshakeLayerE:
  803|  8.37k|		    : SSLHandshakeMessage(data, dataLen, container)
  804|  8.37k|		{}
_ZN4pcpp18SSLFinishedMessageC2EPhmPNS_17SSLHandshakeLayerE:
  860|  2.01k|		    : SSLHandshakeMessage(data, dataLen, container)
  861|  2.01k|		{}
_ZN4pcpp26SSLNewSessionTicketMessageC2EPhmPNS_17SSLHandshakeLayerE:
  893|    646|		    : SSLHandshakeMessage(data, dataLen, container)
  894|    646|		{}
_ZN4pcpp17SSLUnknownMessageC2EPhmPNS_17SSLHandshakeLayerE:
  927|  21.0k|		    : SSLHandshakeMessage(data, dataLen, container)
  928|  21.0k|		{}
_ZN4pcpp19SSLHandshakeMessageD2Ev:
  306|   119k|		virtual ~SSLHandshakeMessage() = default;
_ZN4pcpp21SSLClientHelloMessageD2Ev:
  397|  39.7k|		~SSLClientHelloMessage() override = default;
_ZN4pcpp21SSLServerHelloMessageD2Ev:
  533|  34.2k|		~SSLServerHelloMessage() override = default;
_ZN4pcpp21SSLCertificateMessageD2Ev:
  641|  2.01k|		~SSLCertificateMessage() override = default;
_ZN4pcpp28SSLCertificateRequestMessageD2Ev:
  767|  1.33k|		~SSLCertificateRequestMessage() override = default;
_ZN4pcpp12SSLExtension18tryCreateExtensionINS_32SSLServerNameIndicationExtensionETnNSt3__19enable_ifIXsr3std10is_base_ofIS0_T_EE5valueEbE4typeELb1EEENS3_10unique_ptrIS5_NS3_14default_deleteIS5_EEEEPhm:
  152|  39.4k|		{
  153|  39.4k|			if (data == nullptr || dataLen < sizeof(SSLExtensionStruct))
  ------------------
  |  Branch (153:8): [True: 0, False: 39.4k]
  |  Branch (153:27): [True: 0, False: 39.4k]
  ------------------
  154|      0|			{
  155|      0|				return nullptr;
  156|      0|			}
  157|       |
  158|  39.4k|			auto* extStruct = reinterpret_cast<SSLExtensionStruct*>(data);
  159|  39.4k|			if (dataLen < sizeof(SSLExtensionStruct) + extStruct->getDataLength())
  ------------------
  |  Branch (159:8): [True: 1.12k, False: 38.2k]
  ------------------
  160|  1.12k|			{
  161|  1.12k|				return nullptr;
  162|  1.12k|			}
  163|       |
  164|  38.2k|			return std::make_unique<T>(data, dataLen);
  165|  39.4k|		}
_ZN4pcpp12SSLExtensionD2Ev:
  123|   225k|		virtual ~SSLExtension() = default;
_ZN4pcpp12SSLExtension18tryCreateExtensionINS_29SSLSupportedVersionsExtensionETnNSt3__19enable_ifIXsr3std10is_base_ofIS0_T_EE5valueEbE4typeELb1EEENS3_10unique_ptrIS5_NS3_14default_deleteIS5_EEEEPhm:
  152|  8.98k|		{
  153|  8.98k|			if (data == nullptr || dataLen < sizeof(SSLExtensionStruct))
  ------------------
  |  Branch (153:8): [True: 0, False: 8.98k]
  |  Branch (153:27): [True: 0, False: 8.98k]
  ------------------
  154|      0|			{
  155|      0|				return nullptr;
  156|      0|			}
  157|       |
  158|  8.98k|			auto* extStruct = reinterpret_cast<SSLExtensionStruct*>(data);
  159|  8.98k|			if (dataLen < sizeof(SSLExtensionStruct) + extStruct->getDataLength())
  ------------------
  |  Branch (159:8): [True: 15, False: 8.96k]
  ------------------
  160|     15|			{
  161|     15|				return nullptr;
  162|     15|			}
  163|       |
  164|  8.96k|			return std::make_unique<T>(data, dataLen);
  165|  8.98k|		}
_ZN4pcpp12SSLExtension18tryCreateExtensionINS_27TLSSupportedGroupsExtensionETnNSt3__19enable_ifIXsr3std10is_base_ofIS0_T_EE5valueEbE4typeELb1EEENS3_10unique_ptrIS5_NS3_14default_deleteIS5_EEEEPhm:
  152|  15.0k|		{
  153|  15.0k|			if (data == nullptr || dataLen < sizeof(SSLExtensionStruct))
  ------------------
  |  Branch (153:8): [True: 0, False: 15.0k]
  |  Branch (153:27): [True: 0, False: 15.0k]
  ------------------
  154|      0|			{
  155|      0|				return nullptr;
  156|      0|			}
  157|       |
  158|  15.0k|			auto* extStruct = reinterpret_cast<SSLExtensionStruct*>(data);
  159|  15.0k|			if (dataLen < sizeof(SSLExtensionStruct) + extStruct->getDataLength())
  ------------------
  |  Branch (159:8): [True: 40, False: 15.0k]
  ------------------
  160|     40|			{
  161|     40|				return nullptr;
  162|     40|			}
  163|       |
  164|  15.0k|			return std::make_unique<T>(data, dataLen);
  165|  15.0k|		}
_ZN4pcpp12SSLExtension18tryCreateExtensionINS_25TLSECPointFormatExtensionETnNSt3__19enable_ifIXsr3std10is_base_ofIS0_T_EE5valueEbE4typeELb1EEENS3_10unique_ptrIS5_NS3_14default_deleteIS5_EEEEPhm:
  152|  9.32k|		{
  153|  9.32k|			if (data == nullptr || dataLen < sizeof(SSLExtensionStruct))
  ------------------
  |  Branch (153:8): [True: 0, False: 9.32k]
  |  Branch (153:27): [True: 0, False: 9.32k]
  ------------------
  154|      0|			{
  155|      0|				return nullptr;
  156|      0|			}
  157|       |
  158|  9.32k|			auto* extStruct = reinterpret_cast<SSLExtensionStruct*>(data);
  159|  9.32k|			if (dataLen < sizeof(SSLExtensionStruct) + extStruct->getDataLength())
  ------------------
  |  Branch (159:8): [True: 20, False: 9.30k]
  ------------------
  160|     20|			{
  161|     20|				return nullptr;
  162|     20|			}
  163|       |
  164|  9.30k|			return std::make_unique<T>(data, dataLen);
  165|  9.32k|		}
_ZN4pcpp12SSLExtension18tryCreateExtensionIS0_TnNSt3__19enable_ifIXsr3std10is_base_ofIS0_T_EE5valueEbE4typeELb1EEENS2_10unique_ptrIS4_NS2_14default_deleteIS4_EEEEPhm:
  152|   164k|		{
  153|   164k|			if (data == nullptr || dataLen < sizeof(SSLExtensionStruct))
  ------------------
  |  Branch (153:8): [True: 0, False: 164k]
  |  Branch (153:27): [True: 0, False: 164k]
  ------------------
  154|      0|			{
  155|      0|				return nullptr;
  156|      0|			}
  157|       |
  158|   164k|			auto* extStruct = reinterpret_cast<SSLExtensionStruct*>(data);
  159|   164k|			if (dataLen < sizeof(SSLExtensionStruct) + extStruct->getDataLength())
  ------------------
  |  Branch (159:8): [True: 10.6k, False: 153k]
  ------------------
  160|  10.6k|			{
  161|  10.6k|				return nullptr;
  162|  10.6k|			}
  163|       |
  164|   153k|			return std::make_unique<T>(data, dataLen);
  165|   164k|		}
_ZNK4pcpp21SSLClientHelloMessage18getExtensionOfTypeINS_27TLSSupportedGroupsExtensionEEEPT_v:
  946|  6.33k|	{
  947|  6.33k|		size_t vecSize = m_ExtensionList.size();
  948|  26.3k|		for (size_t i = 0; i < vecSize; i++)
  ------------------
  |  Branch (948:22): [True: 23.0k, False: 3.33k]
  ------------------
  949|  23.0k|		{
  950|  23.0k|			SSLExtension* curElem = const_cast<SSLExtension*>(m_ExtensionList.at(i));
  951|  23.0k|			if (dynamic_cast<TExtension*>(curElem) != nullptr)
  ------------------
  |  Branch (951:8): [True: 2.99k, False: 20.0k]
  ------------------
  952|  2.99k|				return static_cast<TExtension*>(curElem);
  953|  23.0k|		}
  954|       |
  955|  3.33k|		return nullptr;
  956|  6.33k|	}
_ZNK4pcpp21SSLClientHelloMessage18getExtensionOfTypeINS_25TLSECPointFormatExtensionEEEPT_v:
  946|  6.33k|	{
  947|  6.33k|		size_t vecSize = m_ExtensionList.size();
  948|  28.3k|		for (size_t i = 0; i < vecSize; i++)
  ------------------
  |  Branch (948:22): [True: 23.4k, False: 4.84k]
  ------------------
  949|  23.4k|		{
  950|  23.4k|			SSLExtension* curElem = const_cast<SSLExtension*>(m_ExtensionList.at(i));
  951|  23.4k|			if (dynamic_cast<TExtension*>(curElem) != nullptr)
  ------------------
  |  Branch (951:8): [True: 1.49k, False: 21.9k]
  ------------------
  952|  1.49k|				return static_cast<TExtension*>(curElem);
  953|  23.4k|		}
  954|       |
  955|  4.84k|		return nullptr;
  956|  6.33k|	}
_ZNK4pcpp21SSLServerHelloMessage18getExtensionOfTypeINS_29SSLSupportedVersionsExtensionEEEPT_v:
  959|  7.22k|	{
  960|  7.22k|		size_t vecSize = m_ExtensionList.size();
  961|  17.6k|		for (size_t i = 0; i < vecSize; i++)
  ------------------
  |  Branch (961:22): [True: 11.4k, False: 6.25k]
  ------------------
  962|  11.4k|		{
  963|  11.4k|			SSLExtension* curElem = const_cast<SSLExtension*>(m_ExtensionList.at(i));
  964|  11.4k|			if (dynamic_cast<TExtension*>(curElem) != nullptr)
  ------------------
  |  Branch (964:8): [True: 976, False: 10.4k]
  ------------------
  965|    976|				return static_cast<TExtension*>(curElem);
  966|  11.4k|		}
  967|       |
  968|  6.25k|		return nullptr;
  969|  7.22k|	}

_ZNK4pcpp17SSLHandshakeLayer25getHandshakeMessageOfTypeINS_21SSLClientHelloMessageEEEPT_v:
  446|  14.5k|	{
  447|  14.5k|		size_t vecSize = m_MessageList.size();
  448|  22.4k|		for (size_t i = 0; i < vecSize; i++)
  ------------------
  |  Branch (448:22): [True: 14.2k, False: 8.20k]
  ------------------
  449|  14.2k|		{
  450|  14.2k|			SSLHandshakeMessage* curElem = const_cast<SSLHandshakeMessage*>(m_MessageList.at(i));
  451|  14.2k|			if (dynamic_cast<THandshakeMessage*>(curElem) != nullptr)
  ------------------
  |  Branch (451:8): [True: 6.33k, False: 7.88k]
  ------------------
  452|  6.33k|				return (THandshakeMessage*)curElem;
  453|  14.2k|		}
  454|       |
  455|       |		// element not found
  456|  8.20k|		return nullptr;
  457|  14.5k|	}  // getHandshakeMessageOfType
_ZNK4pcpp17SSLHandshakeLayer25getHandshakeMessageOfTypeINS_21SSLServerHelloMessageEEEPT_v:
  446|  14.5k|	{
  447|  14.5k|		size_t vecSize = m_MessageList.size();
  448|  22.3k|		for (size_t i = 0; i < vecSize; i++)
  ------------------
  |  Branch (448:22): [True: 11.4k, False: 10.9k]
  ------------------
  449|  11.4k|		{
  450|  11.4k|			SSLHandshakeMessage* curElem = const_cast<SSLHandshakeMessage*>(m_MessageList.at(i));
  451|  11.4k|			if (dynamic_cast<THandshakeMessage*>(curElem) != nullptr)
  ------------------
  |  Branch (451:8): [True: 3.61k, False: 7.81k]
  ------------------
  452|  3.61k|				return (THandshakeMessage*)curElem;
  453|  11.4k|		}
  454|       |
  455|       |		// element not found
  456|  10.9k|		return nullptr;
  457|  14.5k|	}  // getHandshakeMessageOfType
_ZNK4pcpp17SSLHandshakeLayer25getHandshakeMessageOfTypeINS_19SSLHandshakeMessageEEEPT_v:
  446|  14.5k|	{
  447|  14.5k|		size_t vecSize = m_MessageList.size();
  448|  14.5k|		for (size_t i = 0; i < vecSize; i++)
  ------------------
  |  Branch (448:22): [True: 11.0k, False: 3.53k]
  ------------------
  449|  11.0k|		{
  450|  11.0k|			SSLHandshakeMessage* curElem = const_cast<SSLHandshakeMessage*>(m_MessageList.at(i));
  451|  11.0k|			if (dynamic_cast<THandshakeMessage*>(curElem) != nullptr)
  ------------------
  |  Branch (451:8): [True: 11.0k, False: 0]
  ------------------
  452|  11.0k|				return (THandshakeMessage*)curElem;
  453|  11.0k|		}
  454|       |
  455|       |		// element not found
  456|  3.53k|		return nullptr;
  457|  14.5k|	}  // getHandshakeMessageOfType
_ZNK4pcpp8SSLLayer14getRecordLayerEv:
  227|   487k|		{
  228|   487k|			return reinterpret_cast<ssl_tls_record_layer*>(m_Data);
  229|   487k|		}
_ZNK4pcpp8SSLLayer16getOsiModelLayerEv:
  247|  35.9k|		{
  248|  35.9k|			return OsiModelPresentationLayer;
  249|  35.9k|		}
_ZN4pcpp8SSLLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  253|   253k|		    : Layer(data, dataLen, prevLayer, packet, SSL)
  254|   253k|		{}
_ZN4pcpp17SSLHandshakeLayer22computeCalculateFieldsEv:
  346|  14.5k|		{}
_ZN4pcpp24SSLChangeCipherSpecLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  364|  24.1k|		    : SSLLayer(data, dataLen, prevLayer, packet)
  365|  24.1k|		{}
_ZN4pcpp24SSLChangeCipherSpecLayer22computeCalculateFieldsEv:
  375|  3.02k|		{}
_ZN4pcpp13SSLAlertLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  390|  5.94k|		    : SSLLayer(data, dataLen, prevLayer, packet)
  391|  5.94k|		{}
_ZN4pcpp13SSLAlertLayer22computeCalculateFieldsEv:
  409|    832|		{}
_ZN4pcpp23SSLApplicationDataLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  424|  97.7k|		    : SSLLayer(data, dataLen, prevLayer, packet)
  425|  97.7k|		{}
_ZN4pcpp23SSLApplicationDataLayer22computeCalculateFieldsEv:
  442|  17.5k|		{}
_ZN4pcpp8SSLLayer9isSSLPortEt:
  491|   629k|	{
  492|   629k|		if (port == 443)  // HTTPS, this is likely case
  ------------------
  |  Branch (492:7): [True: 143k, False: 485k]
  ------------------
  493|   143k|			return true;
  494|       |
  495|   485k|		switch (port)
  496|   485k|		{
  497|  7.95k|		case 261:  // NSIIOPS
  ------------------
  |  Branch (497:3): [True: 7.95k, False: 477k]
  ------------------
  498|  8.68k|		case 448:  // DDM-SSL
  ------------------
  |  Branch (498:3): [True: 725, False: 484k]
  ------------------
  499|  9.51k|		case 465:  // SMTPS
  ------------------
  |  Branch (499:3): [True: 830, False: 484k]
  ------------------
  500|  9.67k|		case 563:  // NNTPS
  ------------------
  |  Branch (500:3): [True: 163, False: 485k]
  ------------------
  501|  9.93k|		case 614:  // SSHELL
  ------------------
  |  Branch (501:3): [True: 256, False: 484k]
  ------------------
  502|  9.93k|		case 636:  // LDAPS
  ------------------
  |  Branch (502:3): [True: 0, False: 485k]
  ------------------
  503|  9.93k|		case 989:  // FTPS - data
  ------------------
  |  Branch (503:3): [True: 0, False: 485k]
  ------------------
  504|  13.5k|		case 990:  // FTPS - control
  ------------------
  |  Branch (504:3): [True: 3.65k, False: 481k]
  ------------------
  505|  13.5k|		case 992:  // Telnet over TLS/SSL
  ------------------
  |  Branch (505:3): [True: 0, False: 485k]
  ------------------
  506|  13.6k|		case 993:  // IMAPS
  ------------------
  |  Branch (506:3): [True: 15, False: 485k]
  ------------------
  507|  13.6k|		case 994:  // IRCS
  ------------------
  |  Branch (507:3): [True: 0, False: 485k]
  ------------------
  508|  13.8k|		case 995:  // POP3S
  ------------------
  |  Branch (508:3): [True: 197, False: 485k]
  ------------------
  509|  13.8k|			return true;
  510|   471k|		default:
  ------------------
  |  Branch (510:3): [True: 471k, False: 13.8k]
  ------------------
  511|   471k|			return false;
  512|   485k|		}
  513|   485k|	}  // isSSLPort

_ZN4pcpp8SdpLayerC2ERKS0_:
   94|  1.33k|		SdpLayer(const SdpLayer& other) : TextBasedProtocolMessage(other)
   95|  1.33k|		{}
_ZNK4pcpp8SdpLayer16getOsiModelLayerEv:
  148|  1.33k|		{
  149|  1.33k|			return OsiModelSessionLayer;
  150|  1.33k|		}
_ZNK4pcpp8SdpLayer32getHeaderFieldNameValueSeparatorEv:
  157|  12.4k|		{
  158|  12.4k|			return '=';
  159|  12.4k|		}
_ZNK4pcpp8SdpLayer43spacesAllowedBetweenHeaderFieldNameAndValueEv:
  161|  12.4k|		{
  162|  12.4k|			return false;
  163|  12.4k|		}

_ZN4pcpp25SingleCommandTextProtocolC2EPhmPNS_5LayerEPNS_6PacketEh:
   23|  35.4k|		    : Layer(data, dataLen, prevLayer, packet, protocol) {};

_ZN4pcpp8SipLayer9isSipPortEt:
  113|   797k|		{
  114|   797k|			return port == 5060 || port == 5061;
  ------------------
  |  Branch (114:11): [True: 19.5k, False: 778k]
  |  Branch (114:27): [True: 4.96k, False: 773k]
  ------------------
  115|   797k|		}
_ZNK4pcpp8SipLayer16getOsiModelLayerEv:
   97|  2.58k|		{
   98|  2.58k|			return OsiModelSessionLayer;
   99|  2.58k|		}
_ZN4pcpp8SipLayerC2EPhmPNS_5LayerEPNS_6PacketEh:
  141|  16.7k|		    : TextBasedProtocolMessage(data, dataLen, prevLayer, packet, protocol)
  142|  16.7k|		{}
_ZNK4pcpp8SipLayer32getHeaderFieldNameValueSeparatorEv:
  155|  16.7k|		{
  156|  16.7k|			return ':';
  157|  16.7k|		}
_ZNK4pcpp8SipLayer43spacesAllowedBetweenHeaderFieldNameAndValueEv:
  159|  16.7k|		{
  160|  16.7k|			return true;
  161|  16.7k|		}
_ZNK4pcpp19SipRequestFirstLine7getSizeEv:
  584|  7.83k|		{
  585|  7.83k|			return m_FirstLineEndOffset;
  586|  7.83k|		}
_ZN4pcpp19SipRequestFirstLine28SipRequestFirstLineExceptionD2Ev:
  605|  6.08k|			{}
_ZNK4pcpp20SipResponseFirstLine7getSizeEv:
  709|  14.1k|		{
  710|  14.1k|			return m_FirstLineEndOffset;
  711|  14.1k|		}
_ZN4pcpp20SipResponseFirstLine29SipResponseFirstLineExceptionD2Ev:
  730|  10.7k|			{}

_ZN4pcpp9Sll2LayerC2EPhmPNS_6PacketE:
   48|  7.20k|		Sll2Layer(uint8_t* data, size_t dataLen, Packet* packet) : Layer(data, dataLen, nullptr, packet, SLL2)
   49|  7.20k|		{}
_ZNK4pcpp9Sll2Layer13getSll2HeaderEv:
   63|  20.1k|		{
   64|  20.1k|			return reinterpret_cast<sll2_header*>(m_Data);
   65|  20.1k|		}
_ZNK4pcpp9Sll2Layer12getHeaderLenEv:
  140|  1.92k|		{
  141|  1.92k|			return sizeof(sll2_header);
  142|  1.92k|		}
_ZNK4pcpp9Sll2Layer16getOsiModelLayerEv:
  147|  1.92k|		{
  148|  1.92k|			return OsiModelDataLinkLayer;
  149|  1.92k|		}

_ZN4pcpp8SllLayerC2EPhmPNS_6PacketE:
   43|  12.5k|		SllLayer(uint8_t* data, size_t dataLen, Packet* packet) : Layer(data, dataLen, nullptr, packet, SLL)
   44|  12.5k|		{}
_ZNK4pcpp8SllLayer12getSllHeaderEv:
   57|  15.1k|		{
   58|  15.1k|			return reinterpret_cast<sll_header*>(m_Data);
   59|  15.1k|		}
_ZNK4pcpp8SllLayer12getHeaderLenEv:
   78|  9.30k|		{
   79|  9.30k|			return sizeof(sll_header);
   80|  9.30k|		}
_ZNK4pcpp8SllLayer16getOsiModelLayerEv:
   88|  3.13k|		{
   89|  3.13k|			return OsiModelDataLinkLayer;
   90|  3.13k|		}

_ZN4pcpp9SmtpLayer10isSmtpPortEt:
   28|   231k|		{
   29|   231k|			return port == 25 || port == 587;
  ------------------
  |  Branch (29:11): [True: 6.36k, False: 224k]
  |  Branch (29:25): [True: 13.3k, False: 211k]
  ------------------
   30|   231k|		}
_ZN4pcpp17SmtpResponseLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  277|  5.60k|		    : SmtpLayer(data, dataLen, prevLayer, packet) {};
_ZN4pcpp9SmtpLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   18|  15.9k|		    : SingleCommandTextProtocol(data, dataLen, prevLayer, packet, SMTP) {};
_ZN4pcpp9SmtpLayer14parseNextLayerEv:
   36|  15.9k|		{}
_ZNK4pcpp9SmtpLayer12getHeaderLenEv:
   40|  3.18k|		{
   41|  3.18k|			return m_DataLen;
   42|  3.18k|		}
_ZN4pcpp9SmtpLayer22computeCalculateFieldsEv:
   46|  3.18k|		{}
_ZNK4pcpp9SmtpLayer16getOsiModelLayerEv:
   50|  3.18k|		{
   51|  3.18k|			return OsiModelApplicationLayer;
   52|  3.18k|		}
_ZN4pcpp16SmtpRequestLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  121|  10.3k|		    : SmtpLayer(data, dataLen, prevLayer, packet) {};

_ZN4pcpp11SomeIpLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   85|  48.9k|		    : Layer(data, dataLen, prevLayer, packet, SomeIP)
   86|  48.9k|		{}
_ZNK4pcpp11SomeIpLayer15getSomeIpHeaderEv:
  120|  73.4k|		{
  121|  73.4k|			return reinterpret_cast<someiphdr*>(m_Data);
  122|  73.4k|		}
_ZNK4pcpp11SomeIpLayer12getHeaderLenEv:
  252|  58.4k|		{
  253|  58.4k|			return sizeof(uint32_t) * 2 + getLengthField();
  254|  58.4k|		}
_ZN4pcpp11SomeIpLayer22computeCalculateFieldsEv:
  258|  2.43k|		{}
_ZNK4pcpp11SomeIpLayer16getOsiModelLayerEv:
  268|  9.56k|		{
  269|  9.56k|			return OsiModelApplicationLayer;
  270|  9.56k|		}
_ZN4pcpp13SomeIpTpLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  360|    250|		    : SomeIpLayer(data, dataLen, prevLayer, packet)
  361|    250|		{}

_ZN4pcpp14SomeIpSdOptionC2EPKNS_14IDataContainerEm:
  107|  8.57k|		    : m_DataContainer(dataContainer), m_Offset(offset), m_ShadowData(nullptr), m_DataLen(0)
  108|  8.57k|		{}
_ZN4pcpp18SomeIpSdIPv4Option11isDataValidEPKNS_14IDataContainerEm:
  161|  8.14k|		{
  162|  8.14k|			return data && dataLen >= sizeof(someipsdhdroptionsipv4);
  ------------------
  |  Branch (162:11): [True: 8.14k, False: 0]
  |  Branch (162:19): [True: 8.14k, False: 0]
  ------------------
  163|  8.14k|		}
_ZN4pcpp18SomeIpSdIPv6Option11isDataValidEPKNS_14IDataContainerEm:
  230|    318|		{
  231|    318|			return data && dataLen >= sizeof(someipsdhdroptionsipv6);
  ------------------
  |  Branch (231:11): [True: 318, False: 0]
  |  Branch (231:19): [True: 121, False: 197]
  ------------------
  232|    318|		}
_ZN4pcpp27SomeIpSdConfigurationOption11isDataValidEPKNS_14IDataContainerEm:
  277|    276|		{
  278|    276|			return data && dataLen >= (sizeof(someipsdhdroptionsbase) - 1);
  ------------------
  |  Branch (278:11): [True: 276, False: 0]
  |  Branch (278:19): [True: 276, False: 0]
  ------------------
  279|    276|		}
_ZN4pcpp27SomeIpSdLoadBalancingOption11isDataValidEPKNS_14IDataContainerEm:
  310|     32|		{
  311|     32|			return data && dataLen >= sizeof(someipsdhdroptionsload);
  ------------------
  |  Branch (311:11): [True: 32, False: 0]
  |  Branch (311:19): [True: 32, False: 0]
  ------------------
  312|     32|		}
_ZNK4pcpp13SomeIpSdEntry9getLengthEv:
  440|  7.50k|		{
  441|  7.50k|			return sizeof(someipsdhdrentry);
  442|  7.50k|		}
_ZN4pcpp13SomeIpSdLayer14isSomeIpSdPortEt:
  570|   454k|		{
  571|   454k|			return port == 30490;
  572|   454k|		}
_ZN4pcpp13SomeIpSdLayer22computeCalculateFieldsEv:
  623|  7.08k|		void computeCalculateFields() override {};

_ZN4pcpp8StpLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  123|  4.63k|		    : Layer(data, dataLen, prevLayer, packet, STP)
  124|  4.63k|		{}
_ZN4pcpp8StpLayer22computeCalculateFieldsEv:
  228|    777|		{}
_ZNK4pcpp8StpLayer16getOsiModelLayerEv:
  232|    777|		{
  233|    777|			return OsiModelDataLinkLayer;
  234|    777|		}
_ZN4pcpp26StpTopologyChangeBPDULayerC2EPhmPNS_5LayerEPNS_6PacketE:
  267|  4.63k|		    : StpLayer(data, dataLen, prevLayer, packet)
  268|  4.63k|		{}
_ZNK4pcpp26StpTopologyChangeBPDULayer12getHeaderLenEv:
  285|    267|		{
  286|    267|			return sizeof(stp_tcn_bpdu);
  287|    267|		}
_ZNK4pcpp26StpTopologyChangeBPDULayer8toStringEv:
  294|    534|		{
  295|    534|			return "Spanning Tree Topology Change Notification";
  296|    534|		}
_ZN4pcpp26StpTopologyChangeBPDULayer11isDataValidEPKhm:
  304|  1.60k|		{
  305|  1.60k|			return canReinterpretAs<stp_tcn_bpdu>(data, dataLen);
  306|  1.60k|		}
_ZN4pcpp25StpConfigurationBPDULayerC2EPhmPNS_5LayerEPNS_6PacketE:
  326|  3.02k|		    : StpTopologyChangeBPDULayer(data, dataLen, prevLayer, packet)
  327|  3.02k|		{}
_ZNK4pcpp25StpConfigurationBPDULayer12getHeaderLenEv:
  540|    314|		{
  541|    314|			return sizeof(stp_conf_bpdu);
  542|    314|		}
_ZNK4pcpp25StpConfigurationBPDULayer8toStringEv:
  549|    628|		{
  550|    628|			return "Spanning Tree Configuration";
  551|    628|		}
_ZN4pcpp25StpConfigurationBPDULayer11isDataValidEPKhm:
  558|  1.88k|		{
  559|  1.88k|			return canReinterpretAs<stp_conf_bpdu>(data, dataLen);
  560|  1.88k|		}
_ZN4pcpp13RapidStpLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  580|  1.14k|		    : StpConfigurationBPDULayer(data, dataLen, prevLayer, packet)
  581|  1.14k|		{}
_ZNK4pcpp13RapidStpLayer12getHeaderLenEv:
  632|    196|		{
  633|    196|			return sizeof(rstp_conf_bpdu);
  634|    196|		}
_ZNK4pcpp13RapidStpLayer8toStringEv:
  641|    360|		{
  642|    360|			return "Rapid Spanning Tree";
  643|    360|		}
_ZN4pcpp13RapidStpLayer11isDataValidEPKhm:
  650|  1.08k|		{
  651|  1.08k|			return canReinterpretAs<rstp_conf_bpdu>(data, dataLen);
  652|  1.08k|		}
_ZN4pcpp16MultipleStpLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  670|     64|		    : RapidStpLayer(data, dataLen, prevLayer, packet)
  671|     64|		{}
_ZN4pcpp16MultipleStpLayer14parseNextLayerEv:
  851|     64|		{}
_ZNK4pcpp16MultipleStpLayer8toStringEv:
  855|     32|		{
  856|     32|			return "Multiple Spanning Tree";
  857|     32|		}
_ZN4pcpp16MultipleStpLayer11isDataValidEPKhm:
  864|     68|		{
  865|     68|			return canReinterpretAs<mstp_conf_bpdu>(data, dataLen);
  866|     68|		}

_ZN4pcpp9TLVRecordIhhED2Ev:
   54|  1.33M|		virtual ~TLVRecord() = default;
_ZN4pcpp15TLVRecordReaderINS_9TcpOptionEED2Ev:
  237|   560k|		virtual ~TLVRecordReader() = default;
_ZN4pcpp9TLVRecordIttEC2ERKS1_:
   49|  4.43k|		{
   50|  4.43k|			m_Data = other.m_Data;
   51|  4.43k|		}
_ZN4pcpp9TLVRecordIttED2Ev:
   54|  17.7k|		virtual ~TLVRecord() = default;
_ZN4pcpp9TLVRecordIttEaSERKS1_:
   78|  12.4k|		{
   79|  12.4k|			m_Data = other.m_Data;
   80|  12.4k|			return *this;
   81|  12.4k|		}
_ZNK4pcpp9TLVRecordIhhE10getValueAsIjEET_m:
  164|  3.69k|		{
  165|  3.69k|			static_assert(std::is_trivially_copyable<T>::value && std::is_default_constructible<T>::value &&
  166|  3.69k|			                  !std::is_pointer<T>::value,
  167|  3.69k|			              "TLVRecord::getValueAs<T>() requires T to be a non-pointer, "
  168|  3.69k|			              "default-constructible, trivially copyable type");
  169|       |
  170|  3.69k|			if (getDataSize() < sizeof(T) + offset)
  ------------------
  |  Branch (170:8): [True: 3.57k, False: 121]
  ------------------
  171|  3.57k|			{
  172|  3.57k|				return T{};
  173|  3.57k|			}
  174|       |
  175|    121|			T result;
  176|    121|			memcpy(&result, m_Data->recordValue + getValueOffset() + offset, sizeof(T));
  177|    121|			return result;
  178|  3.69k|		}
_ZN4pcpp9TLVRecordIhhEC2ERKS1_:
   49|   385k|		{
   50|   385k|			m_Data = other.m_Data;
   51|   385k|		}
_ZNK4pcpp9TLVRecordIhhE14getValueOffsetEv:
  210|  8.80k|		{
  211|  8.80k|			return 0;
  212|  8.80k|		}
_ZN4pcpp9TLVRecordIhhEaSERKS1_:
   78|   999k|		{
   79|   999k|			m_Data = other.m_Data;
   80|   999k|			return *this;
   81|   999k|		}
_ZN4pcpp9TLVRecordIhhE6assignEPh:
   59|  2.40M|		{
   60|  2.40M|			m_Data = reinterpret_cast<TLVRawData*>(recordRawData);
   61|  2.40M|		}
_ZN4pcpp9TLVRecordIhhE9canAssignEPKhm:
   68|   156k|		{
   69|   156k|			return recordRawData != nullptr &&
  ------------------
  |  Branch (69:11): [True: 156k, False: 0]
  ------------------
   70|   156k|			       tlvDataLen >= (sizeof(TLVRawData::recordType) + sizeof(TLVRawData::recordLen));
  ------------------
  |  Branch (70:11): [True: 154k, False: 2.44k]
  ------------------
   71|   156k|		}
_ZN4pcpp9TLVRecordIttE6assignEPh:
   59|  31.1k|		{
   60|  31.1k|			m_Data = reinterpret_cast<TLVRawData*>(recordRawData);
   61|  31.1k|		}
_ZN4pcpp9TLVRecordIhhEC2EPh:
   41|  1.27M|		{
   42|  1.27M|			assign(recordRawData);
   43|  1.27M|		}
_ZN4pcpp15TLVRecordReaderINS_10DhcpOptionEED2Ev:
  237|  20.9k|		virtual ~TLVRecordReader() = default;
_ZN4pcpp15TLVRecordReaderINS_10DhcpOptionEEC2Ev:
  226|  20.9k|		{
  227|  20.9k|			m_RecordCount = static_cast<size_t>(-1);
  228|  20.9k|		}
_ZNK4pcpp9TLVRecordIhhE6isNullEv:
  129|  3.13M|		{
  130|  3.13M|			return (m_Data == nullptr);
  131|  3.13M|		}
_ZNK4pcpp9TLVRecordIhhE10getValueAsIhEET_m:
  164|  9.27k|		{
  165|  9.27k|			static_assert(std::is_trivially_copyable<T>::value && std::is_default_constructible<T>::value &&
  166|  9.27k|			                  !std::is_pointer<T>::value,
  167|  9.27k|			              "TLVRecord::getValueAs<T>() requires T to be a non-pointer, "
  168|  9.27k|			              "default-constructible, trivially copyable type");
  169|       |
  170|  9.27k|			if (getDataSize() < sizeof(T) + offset)
  ------------------
  |  Branch (170:8): [True: 585, False: 8.68k]
  ------------------
  171|    585|			{
  172|    585|				return T{};
  173|    585|			}
  174|       |
  175|  8.68k|			T result;
  176|  8.68k|			memcpy(&result, m_Data->recordValue + getValueOffset() + offset, sizeof(T));
  177|  8.68k|			return result;
  178|  9.27k|		}
_ZNK4pcpp15TLVRecordReaderINS_10DhcpOptionEE12getTLVRecordEjPhm:
  315|  14.9k|		{
  316|  14.9k|			TLVRecordType curRec = getFirstTLVRecord(tlvDataBasePtr, tlvDataLen);
  317|   360k|			while (!curRec.isNull())
  ------------------
  |  Branch (317:11): [True: 355k, False: 5.06k]
  ------------------
  318|   355k|			{
  319|   355k|				if (curRec.getType() == recordType)
  ------------------
  |  Branch (319:9): [True: 9.89k, False: 345k]
  ------------------
  320|  9.89k|				{
  321|  9.89k|					return curRec;
  322|  9.89k|				}
  323|       |
  324|   345k|				curRec = getNextTLVRecord(curRec, tlvDataBasePtr, tlvDataLen);
  325|   345k|			}
  326|       |
  327|  5.06k|			curRec.assign(nullptr);
  328|  5.06k|			return curRec;  // for NRVO optimization
  329|  14.9k|		}
_ZNK4pcpp15TLVRecordReaderINS_10DhcpOptionEE17getFirstTLVRecordEPhm:
  255|  22.3k|		{
  256|  22.3k|			TLVRecordType resRec(nullptr);  // for NRVO optimization
  257|  22.3k|			if (!TLVRecordType::canAssign(tlvDataBasePtr, tlvDataLen))
  ------------------
  |  Branch (257:8): [True: 0, False: 22.3k]
  ------------------
  258|      0|				return resRec;
  259|       |
  260|  22.3k|			resRec.assign(tlvDataBasePtr);
  261|       |			// resRec pointer is out-bounds of the TLV records memory
  262|  22.3k|			if (resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
  ------------------
  |  Branch (262:8): [True: 235, False: 22.1k]
  ------------------
  263|    235|				resRec.assign(nullptr);
  264|       |
  265|       |			// check if there are records at all and the total size is not zero
  266|  22.3k|			if (!resRec.isNull() && (tlvDataLen == 0 || resRec.getTotalSize() == 0))
  ------------------
  |  Branch (266:8): [True: 22.1k, False: 235]
  |  Branch (266:29): [True: 0, False: 22.1k]
  |  Branch (266:48): [True: 0, False: 22.1k]
  ------------------
  267|      0|				resRec.assign(nullptr);
  268|       |
  269|  22.3k|			return resRec;
  270|  22.3k|		}
_ZNK4pcpp15TLVRecordReaderINS_10DhcpOptionEE16getNextTLVRecordERS1_PKhm:
  281|   837k|		{
  282|   837k|			TLVRecordType resRec(nullptr);  // for NRVO optimization
  283|       |
  284|   837k|			if (record.isNull())
  ------------------
  |  Branch (284:8): [True: 0, False: 837k]
  ------------------
  285|      0|				return resRec;
  286|       |
  287|   837k|			if (!TLVRecordType::canAssign(record.getRecordBasePtr() + record.getTotalSize(),
  ------------------
  |  Branch (287:8): [True: 7.83k, False: 829k]
  ------------------
  288|   837k|			                              tlvDataBasePtr - record.getRecordBasePtr() + tlvDataLen -
  289|   837k|			                                  record.getTotalSize()))
  290|  7.83k|				return resRec;
  291|       |
  292|   829k|			resRec.assign(record.getRecordBasePtr() + record.getTotalSize());
  293|       |
  294|   829k|			if (resRec.getTotalSize() == 0)
  ------------------
  |  Branch (294:8): [True: 0, False: 829k]
  ------------------
  295|      0|				resRec.assign(nullptr);
  296|       |
  297|       |			// resRec pointer is out-bounds of the TLV records memory
  298|   829k|			if ((resRec.getRecordBasePtr() - tlvDataBasePtr) < 0)
  ------------------
  |  Branch (298:8): [True: 0, False: 829k]
  ------------------
  299|      0|				resRec.assign(nullptr);
  300|       |
  301|       |			// resRec pointer is out-bounds of the TLV records memory
  302|   829k|			if (!resRec.isNull() && resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
  ------------------
  |  Branch (302:8): [True: 829k, False: 0]
  |  Branch (302:28): [True: 4.42k, False: 824k]
  ------------------
  303|  4.42k|				resRec.assign(nullptr);
  304|       |
  305|   829k|			return resRec;
  306|   837k|		}
_ZNK4pcpp15TLVRecordReaderINS_10DhcpOptionEE17getTLVRecordCountEPhm:
  339|   253k|		{
  340|   253k|			if (m_RecordCount != static_cast<size_t>(-1))
  ------------------
  |  Branch (340:8): [True: 249k, False: 3.73k]
  ------------------
  341|   249k|				return m_RecordCount;
  342|       |
  343|  3.73k|			m_RecordCount = 0;
  344|  3.73k|			TLVRecordType curRec = getFirstTLVRecord(tlvDataBasePtr, tlvDataLen);
  345|   249k|			while (!curRec.isNull())
  ------------------
  |  Branch (345:11): [True: 245k, False: 3.73k]
  ------------------
  346|   245k|			{
  347|   245k|				m_RecordCount++;
  348|   245k|				curRec = getNextTLVRecord(curRec, tlvDataBasePtr, tlvDataLen);
  349|   245k|			}
  350|       |
  351|  3.73k|			return m_RecordCount;
  352|   253k|		}
_ZNK4pcpp9TLVRecordIhhE7getTypeEv:
  111|   519k|		{
  112|   519k|			if (m_Data == nullptr)
  ------------------
  |  Branch (112:8): [True: 0, False: 519k]
  ------------------
  113|      0|				return 0;
  114|       |
  115|   519k|			return m_Data->recordType;
  116|   519k|		}
_ZN4pcpp9TLVRecordIhhE15purgeRecordDataEv:
  147|  36.5k|		{
  148|  36.5k|			if (!isNull())
  ------------------
  |  Branch (148:8): [True: 36.5k, False: 0]
  ------------------
  149|  36.5k|			{
  150|  36.5k|				delete[] m_Data;
  151|  36.5k|				m_Data = nullptr;
  152|  36.5k|			}
  153|  36.5k|		}
_ZNK4pcpp9TLVRecordIhhE16getRecordBasePtrEv:
  141|  5.04M|		{
  142|  5.04M|			return reinterpret_cast<uint8_t*>(m_Data);
  143|  5.04M|		}
_ZNK4pcpp9TLVRecordIhhE9isNotNullEv:
  135|   140k|		{
  136|   140k|			return (m_Data != nullptr);
  137|   140k|		}
_ZN4pcpp9TLVRecordIttEC2EPh:
   41|  15.3k|		{
   42|  15.3k|			assign(recordRawData);
   43|  15.3k|		}
_ZN4pcpp15TLVRecordReaderINS_12DhcpV6OptionEED2Ev:
  237|  5.70k|		virtual ~TLVRecordReader() = default;
_ZN4pcpp15TLVRecordReaderINS_12DhcpV6OptionEEC2Ev:
  226|  5.70k|		{
  227|  5.70k|			m_RecordCount = static_cast<size_t>(-1);
  228|  5.70k|		}
_ZNK4pcpp15TLVRecordReaderINS_12DhcpV6OptionEE17getFirstTLVRecordEPhm:
  255|  2.89k|		{
  256|  2.89k|			TLVRecordType resRec(nullptr);  // for NRVO optimization
  257|  2.89k|			if (!TLVRecordType::canAssign(tlvDataBasePtr, tlvDataLen))
  ------------------
  |  Branch (257:8): [True: 0, False: 2.89k]
  ------------------
  258|      0|				return resRec;
  259|       |
  260|  2.89k|			resRec.assign(tlvDataBasePtr);
  261|       |			// resRec pointer is out-bounds of the TLV records memory
  262|  2.89k|			if (resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
  ------------------
  |  Branch (262:8): [True: 343, False: 2.55k]
  ------------------
  263|    343|				resRec.assign(nullptr);
  264|       |
  265|       |			// check if there are records at all and the total size is not zero
  266|  2.89k|			if (!resRec.isNull() && (tlvDataLen == 0 || resRec.getTotalSize() == 0))
  ------------------
  |  Branch (266:8): [True: 2.55k, False: 343]
  |  Branch (266:29): [True: 0, False: 2.55k]
  |  Branch (266:48): [True: 0, False: 2.55k]
  ------------------
  267|      0|				resRec.assign(nullptr);
  268|       |
  269|  2.89k|			return resRec;
  270|  2.89k|		}
_ZN4pcpp9TLVRecordIttE9canAssignEPKhm:
   68|  15.3k|		{
   69|  15.3k|			return recordRawData != nullptr &&
  ------------------
  |  Branch (69:11): [True: 15.3k, False: 0]
  ------------------
   70|  15.3k|			       tlvDataLen >= (sizeof(TLVRawData::recordType) + sizeof(TLVRawData::recordLen));
  ------------------
  |  Branch (70:11): [True: 13.8k, False: 1.50k]
  ------------------
   71|  15.3k|		}
_ZNK4pcpp15TLVRecordReaderINS_12DhcpV6OptionEE16getNextTLVRecordERS1_PKhm:
  281|  12.4k|		{
  282|  12.4k|			TLVRecordType resRec(nullptr);  // for NRVO optimization
  283|       |
  284|  12.4k|			if (record.isNull())
  ------------------
  |  Branch (284:8): [True: 0, False: 12.4k]
  ------------------
  285|      0|				return resRec;
  286|       |
  287|  12.4k|			if (!TLVRecordType::canAssign(record.getRecordBasePtr() + record.getTotalSize(),
  ------------------
  |  Branch (287:8): [True: 1.50k, False: 10.9k]
  ------------------
  288|  12.4k|			                              tlvDataBasePtr - record.getRecordBasePtr() + tlvDataLen -
  289|  12.4k|			                                  record.getTotalSize()))
  290|  1.50k|				return resRec;
  291|       |
  292|  10.9k|			resRec.assign(record.getRecordBasePtr() + record.getTotalSize());
  293|       |
  294|  10.9k|			if (resRec.getTotalSize() == 0)
  ------------------
  |  Branch (294:8): [True: 0, False: 10.9k]
  ------------------
  295|      0|				resRec.assign(nullptr);
  296|       |
  297|       |			// resRec pointer is out-bounds of the TLV records memory
  298|  10.9k|			if ((resRec.getRecordBasePtr() - tlvDataBasePtr) < 0)
  ------------------
  |  Branch (298:8): [True: 0, False: 10.9k]
  ------------------
  299|      0|				resRec.assign(nullptr);
  300|       |
  301|       |			// resRec pointer is out-bounds of the TLV records memory
  302|  10.9k|			if (!resRec.isNull() && resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
  ------------------
  |  Branch (302:8): [True: 10.9k, False: 0]
  |  Branch (302:28): [True: 898, False: 10.0k]
  ------------------
  303|    898|				resRec.assign(nullptr);
  304|       |
  305|  10.9k|			return resRec;
  306|  12.4k|		}
_ZNK4pcpp15TLVRecordReaderINS_12DhcpV6OptionEE12getTLVRecordEjPhm:
  315|    850|		{
  316|    850|			TLVRecordType curRec = getFirstTLVRecord(tlvDataBasePtr, tlvDataLen);
  317|  4.46k|			while (!curRec.isNull())
  ------------------
  |  Branch (317:11): [True: 3.75k, False: 702]
  ------------------
  318|  3.75k|			{
  319|  3.75k|				if (curRec.getType() == recordType)
  ------------------
  |  Branch (319:9): [True: 148, False: 3.61k]
  ------------------
  320|    148|				{
  321|    148|					return curRec;
  322|    148|				}
  323|       |
  324|  3.61k|				curRec = getNextTLVRecord(curRec, tlvDataBasePtr, tlvDataLen);
  325|  3.61k|			}
  326|       |
  327|    702|			curRec.assign(nullptr);
  328|    702|			return curRec;  // for NRVO optimization
  329|    850|		}
_ZNK4pcpp15TLVRecordReaderINS_12DhcpV6OptionEE17getTLVRecordCountEPhm:
  339|  6.47k|		{
  340|  6.47k|			if (m_RecordCount != static_cast<size_t>(-1))
  ------------------
  |  Branch (340:8): [True: 5.28k, False: 1.19k]
  ------------------
  341|  5.28k|				return m_RecordCount;
  342|       |
  343|  1.19k|			m_RecordCount = 0;
  344|  1.19k|			TLVRecordType curRec = getFirstTLVRecord(tlvDataBasePtr, tlvDataLen);
  345|  5.62k|			while (!curRec.isNull())
  ------------------
  |  Branch (345:11): [True: 4.43k, False: 1.19k]
  ------------------
  346|  4.43k|			{
  347|  4.43k|				m_RecordCount++;
  348|  4.43k|				curRec = getNextTLVRecord(curRec, tlvDataBasePtr, tlvDataLen);
  349|  4.43k|			}
  350|       |
  351|  1.19k|			return m_RecordCount;
  352|  6.47k|		}
_ZNK4pcpp9TLVRecordIttE6isNullEv:
  129|  36.4k|		{
  130|  36.4k|			return (m_Data == nullptr);
  131|  36.4k|		}
_ZNK4pcpp9TLVRecordIttE16getRecordBasePtrEv:
  141|  60.7k|		{
  142|  60.7k|			return reinterpret_cast<uint8_t*>(m_Data);
  143|  60.7k|		}
_ZN4pcpp15TLVRecordReaderINS_23GtpV2InformationElementEED2Ev:
  237|  20.6k|		virtual ~TLVRecordReader() = default;
_ZN4pcpp15TLVRecordReaderINS_23GtpV2InformationElementEEC2Ev:
  226|  20.6k|		{
  227|  20.6k|			m_RecordCount = static_cast<size_t>(-1);
  228|  20.6k|		}
_ZN4pcpp15TLVRecordReaderINS_10IPv4OptionEED2Ev:
  237|   714k|		virtual ~TLVRecordReader() = default;
_ZN4pcpp15TLVRecordReaderINS_10IPv4OptionEEC2Ev:
  226|   714k|		{
  227|   714k|			m_RecordCount = static_cast<size_t>(-1);
  228|   714k|		}
_ZN4pcpp15TLVRecordReaderINS_19IPv6TLVOptionHeader10IPv6OptionEED2Ev:
  237|  11.4k|		virtual ~TLVRecordReader() = default;
_ZN4pcpp15TLVRecordReaderINS_8NflogTlvEEC2Ev:
  226|  2.27k|		{
  227|  2.27k|			m_RecordCount = static_cast<size_t>(-1);
  228|  2.27k|		}
_ZN4pcpp15TLVRecordReaderINS_8NflogTlvEED2Ev:
  237|  2.27k|		virtual ~TLVRecordReader() = default;
_ZN4pcpp15TLVRecordReaderINS_19PPPoEDiscoveryLayer8PPPoETagEEC2Ev:
  226|  3.36k|		{
  227|  3.36k|			m_RecordCount = static_cast<size_t>(-1);
  228|  3.36k|		}
_ZN4pcpp15TLVRecordReaderINS_19PPPoEDiscoveryLayer8PPPoETagEED2Ev:
  237|  3.36k|		virtual ~TLVRecordReader() = default;
_ZNK4pcpp15TLVRecordReaderINS_9TcpOptionEE12getTLVRecordEjPhm:
  315|  88.9k|		{
  316|  88.9k|			TLVRecordType curRec = getFirstTLVRecord(tlvDataBasePtr, tlvDataLen);
  317|   111k|			while (!curRec.isNull())
  ------------------
  |  Branch (317:11): [True: 59.0k, False: 52.4k]
  ------------------
  318|  59.0k|			{
  319|  59.0k|				if (curRec.getType() == recordType)
  ------------------
  |  Branch (319:9): [True: 36.5k, False: 22.4k]
  ------------------
  320|  36.5k|				{
  321|  36.5k|					return curRec;
  322|  36.5k|				}
  323|       |
  324|  22.4k|				curRec = getNextTLVRecord(curRec, tlvDataBasePtr, tlvDataLen);
  325|  22.4k|			}
  326|       |
  327|  52.4k|			curRec.assign(nullptr);
  328|  52.4k|			return curRec;  // for NRVO optimization
  329|  88.9k|		}
_ZNK4pcpp15TLVRecordReaderINS_9TcpOptionEE17getFirstTLVRecordEPhm:
  255|   125k|		{
  256|   125k|			TLVRecordType resRec(nullptr);  // for NRVO optimization
  257|   125k|			if (!TLVRecordType::canAssign(tlvDataBasePtr, tlvDataLen))
  ------------------
  |  Branch (257:8): [True: 45.6k, False: 79.9k]
  ------------------
  258|  45.6k|				return resRec;
  259|       |
  260|  79.9k|			resRec.assign(tlvDataBasePtr);
  261|       |			// resRec pointer is out-bounds of the TLV records memory
  262|  79.9k|			if (resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
  ------------------
  |  Branch (262:8): [True: 2.51k, False: 77.3k]
  ------------------
  263|  2.51k|				resRec.assign(nullptr);
  264|       |
  265|       |			// check if there are records at all and the total size is not zero
  266|  79.9k|			if (!resRec.isNull() && (tlvDataLen == 0 || resRec.getTotalSize() == 0))
  ------------------
  |  Branch (266:8): [True: 77.3k, False: 2.51k]
  |  Branch (266:29): [True: 0, False: 77.3k]
  |  Branch (266:48): [True: 91, False: 77.3k]
  ------------------
  267|     91|				resRec.assign(nullptr);
  268|       |
  269|  79.9k|			return resRec;
  270|   125k|		}
_ZNK4pcpp15TLVRecordReaderINS_9TcpOptionEE16getNextTLVRecordERS1_PKhm:
  281|   162k|		{
  282|   162k|			TLVRecordType resRec(nullptr);  // for NRVO optimization
  283|       |
  284|   162k|			if (record.isNull())
  ------------------
  |  Branch (284:8): [True: 0, False: 162k]
  ------------------
  285|      0|				return resRec;
  286|       |
  287|   162k|			if (!TLVRecordType::canAssign(record.getRecordBasePtr() + record.getTotalSize(),
  ------------------
  |  Branch (287:8): [True: 36.1k, False: 126k]
  ------------------
  288|   162k|			                              tlvDataBasePtr - record.getRecordBasePtr() + tlvDataLen -
  289|   162k|			                                  record.getTotalSize()))
  290|  36.1k|				return resRec;
  291|       |
  292|   126k|			resRec.assign(record.getRecordBasePtr() + record.getTotalSize());
  293|       |
  294|   126k|			if (resRec.getTotalSize() == 0)
  ------------------
  |  Branch (294:8): [True: 756, False: 125k]
  ------------------
  295|    756|				resRec.assign(nullptr);
  296|       |
  297|       |			// resRec pointer is out-bounds of the TLV records memory
  298|   126k|			if ((resRec.getRecordBasePtr() - tlvDataBasePtr) < 0)
  ------------------
  |  Branch (298:8): [True: 756, False: 125k]
  ------------------
  299|    756|				resRec.assign(nullptr);
  300|       |
  301|       |			// resRec pointer is out-bounds of the TLV records memory
  302|   126k|			if (!resRec.isNull() && resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
  ------------------
  |  Branch (302:8): [True: 125k, False: 756]
  |  Branch (302:28): [True: 3.72k, False: 121k]
  ------------------
  303|  3.72k|				resRec.assign(nullptr);
  304|       |
  305|   126k|			return resRec;
  306|   162k|		}
_ZN4pcpp15TLVRecordReaderINS_9TcpOptionEE20changeTLVRecordCountEi:
  360|  36.5k|		{
  361|  36.5k|			if (m_RecordCount != static_cast<size_t>(-1))
  ------------------
  |  Branch (361:8): [True: 0, False: 36.5k]
  ------------------
  362|      0|				m_RecordCount += changedBy;
  363|  36.5k|		}
_ZN4pcpp15TLVRecordReaderINS_9TcpOptionEEC2Ev:
  226|   560k|		{
  227|   560k|			m_RecordCount = static_cast<size_t>(-1);
  228|   560k|		}
_ZN4pcpp15TLVRecordReaderINS_9TcpOptionEEaSERKS2_:
  242|  88.9k|		{
  243|  88.9k|			m_RecordCount = other.m_RecordCount;
  244|  88.9k|			return *this;
  245|  88.9k|		}
_ZN4pcpp15TLVRecordReaderINS_15RadiusAttributeEEC2Ev:
  226|  21.9k|		{
  227|  21.9k|			m_RecordCount = static_cast<size_t>(-1);
  228|  21.9k|		}
_ZN4pcpp15TLVRecordReaderINS_15RadiusAttributeEED2Ev:
  237|  21.9k|		virtual ~TLVRecordReader() = default;
_ZN4pcpp15TLVRecordReaderINS_9NdpOptionEEC2Ev:
  226|  3.32k|		{
  227|  3.32k|			m_RecordCount = static_cast<size_t>(-1);
  228|  3.32k|		}
_ZN4pcpp15TLVRecordReaderINS_9NdpOptionEED2Ev:
  237|  3.32k|		virtual ~TLVRecordReader() = default;
_ZN4pcpp15TLVRecordReaderINS_19IPv6TLVOptionHeader10IPv6OptionEEC2Ev:
  226|  11.4k|		{
  227|  11.4k|			m_RecordCount = static_cast<size_t>(-1);
  228|  11.4k|		}
_ZNK4pcpp15TLVRecordReaderINS_9NdpOptionEE17getFirstTLVRecordEPhm:
  255|  2.27k|		{
  256|  2.27k|			TLVRecordType resRec(nullptr);  // for NRVO optimization
  257|  2.27k|			if (!TLVRecordType::canAssign(tlvDataBasePtr, tlvDataLen))
  ------------------
  |  Branch (257:8): [True: 266, False: 2.00k]
  ------------------
  258|    266|				return resRec;
  259|       |
  260|  2.00k|			resRec.assign(tlvDataBasePtr);
  261|       |			// resRec pointer is out-bounds of the TLV records memory
  262|  2.00k|			if (resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
  ------------------
  |  Branch (262:8): [True: 34, False: 1.97k]
  ------------------
  263|     34|				resRec.assign(nullptr);
  264|       |
  265|       |			// check if there are records at all and the total size is not zero
  266|  2.00k|			if (!resRec.isNull() && (tlvDataLen == 0 || resRec.getTotalSize() == 0))
  ------------------
  |  Branch (266:8): [True: 1.97k, False: 34]
  |  Branch (266:29): [True: 0, False: 1.97k]
  |  Branch (266:48): [True: 632, False: 1.34k]
  ------------------
  267|    632|				resRec.assign(nullptr);
  268|       |
  269|  2.00k|			return resRec;
  270|  2.27k|		}
_ZNK4pcpp15TLVRecordReaderINS_9NdpOptionEE16getNextTLVRecordERS1_PKhm:
  281|    150|		{
  282|    150|			TLVRecordType resRec(nullptr);  // for NRVO optimization
  283|       |
  284|    150|			if (record.isNull())
  ------------------
  |  Branch (284:8): [True: 0, False: 150]
  ------------------
  285|      0|				return resRec;
  286|       |
  287|    150|			if (!TLVRecordType::canAssign(record.getRecordBasePtr() + record.getTotalSize(),
  ------------------
  |  Branch (287:8): [True: 0, False: 150]
  ------------------
  288|    150|			                              tlvDataBasePtr - record.getRecordBasePtr() + tlvDataLen -
  289|    150|			                                  record.getTotalSize()))
  290|      0|				return resRec;
  291|       |
  292|    150|			resRec.assign(record.getRecordBasePtr() + record.getTotalSize());
  293|       |
  294|    150|			if (resRec.getTotalSize() == 0)
  ------------------
  |  Branch (294:8): [True: 0, False: 150]
  ------------------
  295|      0|				resRec.assign(nullptr);
  296|       |
  297|       |			// resRec pointer is out-bounds of the TLV records memory
  298|    150|			if ((resRec.getRecordBasePtr() - tlvDataBasePtr) < 0)
  ------------------
  |  Branch (298:8): [True: 0, False: 150]
  ------------------
  299|      0|				resRec.assign(nullptr);
  300|       |
  301|       |			// resRec pointer is out-bounds of the TLV records memory
  302|    150|			if (!resRec.isNull() && resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
  ------------------
  |  Branch (302:8): [True: 150, False: 0]
  |  Branch (302:28): [True: 74, False: 76]
  ------------------
  303|     74|				resRec.assign(nullptr);
  304|       |
  305|    150|			return resRec;
  306|    150|		}
_ZNK4pcpp15TLVRecordReaderINS_9NdpOptionEE12getTLVRecordEjPhm:
  315|  2.27k|		{
  316|  2.27k|			TLVRecordType curRec = getFirstTLVRecord(tlvDataBasePtr, tlvDataLen);
  317|  2.42k|			while (!curRec.isNull())
  ------------------
  |  Branch (317:11): [True: 1.41k, False: 1.00k]
  ------------------
  318|  1.41k|			{
  319|  1.41k|				if (curRec.getType() == recordType)
  ------------------
  |  Branch (319:9): [True: 1.26k, False: 150]
  ------------------
  320|  1.26k|				{
  321|  1.26k|					return curRec;
  322|  1.26k|				}
  323|       |
  324|    150|				curRec = getNextTLVRecord(curRec, tlvDataBasePtr, tlvDataLen);
  325|    150|			}
  326|       |
  327|  1.00k|			curRec.assign(nullptr);
  328|  1.00k|			return curRec;  // for NRVO optimization
  329|  2.27k|		}
_ZNK4pcpp9TLVRecordIhhE8getValueEv:
  120|    634|		{
  121|    634|			if (m_Data == nullptr)
  ------------------
  |  Branch (121:8): [True: 0, False: 634]
  ------------------
  122|      0|				return nullptr;
  123|       |
  124|    634|			return m_Data->recordValue;
  125|    634|		}
_ZNK4pcpp15TLVRecordReaderINS_8NflogTlvEE12getTLVRecordEjPhm:
  315|  2.14k|		{
  316|  2.14k|			TLVRecordType curRec = getFirstTLVRecord(tlvDataBasePtr, tlvDataLen);
  317|  5.40k|			while (!curRec.isNull())
  ------------------
  |  Branch (317:11): [True: 3.40k, False: 2.00k]
  ------------------
  318|  3.40k|			{
  319|  3.40k|				if (curRec.getType() == recordType)
  ------------------
  |  Branch (319:9): [True: 141, False: 3.25k]
  ------------------
  320|    141|				{
  321|    141|					return curRec;
  322|    141|				}
  323|       |
  324|  3.25k|				curRec = getNextTLVRecord(curRec, tlvDataBasePtr, tlvDataLen);
  325|  3.25k|			}
  326|       |
  327|  2.00k|			curRec.assign(nullptr);
  328|  2.00k|			return curRec;  // for NRVO optimization
  329|  2.14k|		}
_ZNK4pcpp15TLVRecordReaderINS_8NflogTlvEE17getFirstTLVRecordEPhm:
  255|  3.28k|		{
  256|  3.28k|			TLVRecordType resRec(nullptr);  // for NRVO optimization
  257|  3.28k|			if (!TLVRecordType::canAssign(tlvDataBasePtr, tlvDataLen))
  ------------------
  |  Branch (257:8): [True: 65, False: 3.22k]
  ------------------
  258|     65|				return resRec;
  259|       |
  260|  3.22k|			resRec.assign(tlvDataBasePtr);
  261|       |			// resRec pointer is out-bounds of the TLV records memory
  262|  3.22k|			if (resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
  ------------------
  |  Branch (262:8): [True: 1.32k, False: 1.90k]
  ------------------
  263|  1.32k|				resRec.assign(nullptr);
  264|       |
  265|       |			// check if there are records at all and the total size is not zero
  266|  3.22k|			if (!resRec.isNull() && (tlvDataLen == 0 || resRec.getTotalSize() == 0))
  ------------------
  |  Branch (266:8): [True: 1.90k, False: 1.32k]
  |  Branch (266:29): [True: 0, False: 1.90k]
  |  Branch (266:48): [True: 693, False: 1.20k]
  ------------------
  267|    693|				resRec.assign(nullptr);
  268|       |
  269|  3.22k|			return resRec;
  270|  3.28k|		}
_ZNK4pcpp15TLVRecordReaderINS_8NflogTlvEE16getNextTLVRecordERS1_PKhm:
  281|  4.82k|		{
  282|  4.82k|			TLVRecordType resRec(nullptr);  // for NRVO optimization
  283|       |
  284|  4.82k|			if (record.isNull())
  ------------------
  |  Branch (284:8): [True: 0, False: 4.82k]
  ------------------
  285|      0|				return resRec;
  286|       |
  287|  4.82k|			if (!TLVRecordType::canAssign(record.getRecordBasePtr() + record.getTotalSize(),
  ------------------
  |  Branch (287:8): [True: 144, False: 4.68k]
  ------------------
  288|  4.82k|			                              tlvDataBasePtr - record.getRecordBasePtr() + tlvDataLen -
  289|  4.82k|			                                  record.getTotalSize()))
  290|    144|				return resRec;
  291|       |
  292|  4.68k|			resRec.assign(record.getRecordBasePtr() + record.getTotalSize());
  293|       |
  294|  4.68k|			if (resRec.getTotalSize() == 0)
  ------------------
  |  Branch (294:8): [True: 720, False: 3.96k]
  ------------------
  295|    720|				resRec.assign(nullptr);
  296|       |
  297|       |			// resRec pointer is out-bounds of the TLV records memory
  298|  4.68k|			if ((resRec.getRecordBasePtr() - tlvDataBasePtr) < 0)
  ------------------
  |  Branch (298:8): [True: 720, False: 3.96k]
  ------------------
  299|    720|				resRec.assign(nullptr);
  300|       |
  301|       |			// resRec pointer is out-bounds of the TLV records memory
  302|  4.68k|			if (!resRec.isNull() && resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen)
  ------------------
  |  Branch (302:8): [True: 3.96k, False: 720]
  |  Branch (302:28): [True: 132, False: 3.83k]
  ------------------
  303|    132|				resRec.assign(nullptr);
  304|       |
  305|  4.68k|			return resRec;
  306|  4.82k|		}

_ZN4pcpp8TcpLayerD2Ev:
  461|   560k|		~TcpLayer() override = default;
_ZN4pcpp9TcpOptionC2EPh:
  259|   413k|		explicit TcpOption(uint8_t* optionRawData) : TLVRecord(optionRawData)
  260|   413k|		{}
_ZN4pcpp9TcpOption9canAssignEPKhm:
  284|   288k|		{
  285|   288k|			const auto* data = reinterpret_cast<const TLVRawData*>(recordRawData);
  286|   288k|			if (data == nullptr)
  ------------------
  |  Branch (286:8): [True: 0, False: 288k]
  ------------------
  287|      0|				return false;
  288|       |
  289|   288k|			if (tlvDataLen < sizeof(TLVRawData::recordType))
  ------------------
  |  Branch (289:8): [True: 81.5k, False: 206k]
  ------------------
  290|  81.5k|				return false;
  291|       |
  292|   206k|			const auto recordType = getTcpOptionEnumType(data);
  293|   206k|			if (recordType == TcpOptionEnumType::Nop || recordType == TcpOptionEnumType::Eol)
  ------------------
  |  Branch (293:8): [True: 127k, False: 78.9k]
  |  Branch (293:48): [True: 13.6k, False: 65.3k]
  ------------------
  294|   141k|				return true;
  295|       |
  296|  65.3k|			return TLVRecord<uint8_t, uint8_t>::canAssign(recordRawData, tlvDataLen);
  297|   206k|		}
_ZNK4pcpp9TcpOption12getTotalSizeEv:
  302|  1.14M|		{
  303|  1.14M|			if (m_Data == nullptr)
  ------------------
  |  Branch (303:8): [True: 0, False: 1.14M]
  ------------------
  304|      0|				return 0;
  305|       |
  306|  1.14M|			const auto recordType = getTcpOptionEnumType(m_Data);
  307|  1.14M|			if (recordType == TcpOptionEnumType::Nop || recordType == TcpOptionEnumType::Eol)
  ------------------
  |  Branch (307:8): [True: 766k, False: 381k]
  |  Branch (307:48): [True: 69.5k, False: 311k]
  ------------------
  308|   835k|				return sizeof(uint8_t);
  309|       |
  310|   311k|			return static_cast<size_t>(m_Data->recordLen);
  311|  1.14M|		}
_ZN4pcpp9TcpOption20getTcpOptionEnumTypeEPKNS_9TLVRecordIhhE10TLVRawDataE:
  335|  1.35M|		{
  336|  1.35M|			if (optionRawData == nullptr)
  ------------------
  |  Branch (336:8): [True: 0, False: 1.35M]
  ------------------
  337|      0|				return TcpOptionEnumType::Unknown;
  338|       |
  339|  1.35M|			return static_cast<TcpOptionEnumType>(optionRawData->recordType);
  340|  1.35M|		}
_ZNK4pcpp8TcpLayer12getTcpHeaderEv:
  474|  2.62M|		{
  475|  2.62M|			return reinterpret_cast<tcphdr*>(m_Data);
  476|  2.62M|		}
_ZNK4pcpp8TcpLayer12getHeaderLenEv:
  568|  1.05M|		{
  569|  1.05M|			return getTcpHeader()->dataOffset * 4;
  570|  1.05M|		}
_ZNK4pcpp8TcpLayer16getOsiModelLayerEv:
  578|  88.9k|		{
  579|  88.9k|			return OsiModelTransportLayer;
  580|  88.9k|		}
_ZNK4pcpp8TcpLayer17getOptionsBasePtrEv:
  635|   265k|		{
  636|   265k|			return m_Data + sizeof(tcphdr);
  637|   265k|		}
_ZN4pcpp8TcpLayer11isDataValidEPKhm:
  646|   474k|	{
  647|   474k|		const tcphdr* hdr = reinterpret_cast<const tcphdr*>(data);
  648|   474k|		return dataLen >= sizeof(tcphdr) && hdr->dataOffset >= 5 /* the minimum TCP header size */
  ------------------
  |  Branch (648:10): [True: 474k, False: 494]
  |  Branch (648:39): [True: 472k, False: 1.71k]
  ------------------
  649|   472k|		       && dataLen >= hdr->dataOffset * sizeof(uint32_t);
  ------------------
  |  Branch (649:13): [True: 471k, False: 766]
  ------------------
  650|   474k|	}

_ZN4pcpp11TelnetLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  215|  9.82k|		    : Layer(data, dataLen, prevLayer, packet, Telnet)
  216|  9.82k|		{
  217|       |			lastPositionOffset = SIZE_MAX;
  218|  9.82k|		};
_ZN4pcpp11TelnetLayer12isTelnetPortEt:
  277|   318k|		{
  278|   318k|			return port == 23;
  279|   318k|		}
_ZN4pcpp11TelnetLayer11isDataValidEPKhm:
  286|   164k|		{
  287|   164k|			return data && dataSize;
  ------------------
  |  Branch (287:11): [True: 164k, False: 0]
  |  Branch (287:19): [True: 164k, False: 0]
  ------------------
  288|   164k|		}
_ZN4pcpp11TelnetLayer14parseNextLayerEv:
  294|  9.82k|		{}
_ZNK4pcpp11TelnetLayer12getHeaderLenEv:
  298|  1.79k|		{
  299|  1.79k|			return m_DataLen;
  300|  1.79k|		}
_ZN4pcpp11TelnetLayer22computeCalculateFieldsEv:
  304|  1.79k|		{}
_ZNK4pcpp11TelnetLayer16getOsiModelLayerEv:
  308|  1.79k|		{
  309|  1.79k|			return OsiModelApplicationLayer;
  310|  1.79k|		}

_ZNK4pcpp11HeaderField12getFieldSizeEv:
   49|  1.39M|		{
   50|  1.39M|			return m_FieldSize;
   51|  1.39M|		}
_ZNK4pcpp11HeaderField13isEndOfHeaderEv:
   70|   547k|		{
   71|   547k|			return m_IsEndOfHeaderField;
   72|   547k|		}
_ZNK4pcpp24TextBasedProtocolMessage13getFirstFieldEv:
  123|  1.33k|		{
  124|  1.33k|			return m_FieldList;
  125|  1.33k|		}

_ZN4pcpp9TpktLayer11isDataValidEPKhm:
   92|   133k|		{
   93|   133k|			return canReinterpretAs<tpkthdr>(data, dataSize);
   94|   133k|		}
_ZN4pcpp9TpktLayer10isTpktPortEtt:
   83|   127k|		{
   84|   127k|			return portSrc == 102 || portDst == 102;
  ------------------
  |  Branch (84:11): [True: 7.20k, False: 120k]
  |  Branch (84:29): [True: 7.68k, False: 113k]
  ------------------
   85|   127k|		}
_ZN4pcpp9TpktLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   38|  14.8k|		    : Layer(data, dataLen, prevLayer, packet, TPKT)
   39|  14.8k|		{}
_ZNK4pcpp9TpktLayer12getHeaderLenEv:
   67|  17.0k|		{
   68|  17.0k|			return sizeof(tpkthdr);
   69|  17.0k|		}
_ZN4pcpp9TpktLayer22computeCalculateFieldsEv:
   73|  2.15k|		{}
_ZNK4pcpp9TpktLayer16getOsiModelLayerEv:
   99|  2.15k|		{
  100|  2.15k|			return OsiModelTransportLayer;
  101|  2.15k|		}
_ZNK4pcpp9TpktLayer13getTpktHeaderEv:
  130|  8.62k|		{
  131|  8.62k|			return reinterpret_cast<tpkthdr*>(m_Data);
  132|  8.62k|		}

_ZN4pcpp8UdpLayer11isDataValidEPKhm:
  126|   250k|	{
  127|   250k|		return data && dataLen >= sizeof(udphdr);
  ------------------
  |  Branch (127:10): [True: 250k, False: 0]
  |  Branch (127:18): [True: 250k, False: 150]
  ------------------
  128|   250k|	}
_ZN4pcpp8UdpLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   41|   250k|		    : Layer(data, dataLen, prevLayer, packet, UDP)
   42|   250k|		{}
_ZNK4pcpp8UdpLayer12getUdpHeaderEv:
   53|   679k|		{
   54|   679k|			return reinterpret_cast<udphdr*>(m_Data);
   55|   679k|		}
_ZNK4pcpp8UdpLayer12getHeaderLenEv:
   83|   132k|		{
   84|   132k|			return sizeof(udphdr);
   85|   132k|		}
_ZNK4pcpp8UdpLayer16getOsiModelLayerEv:
   93|  45.0k|		{
   94|  45.0k|			return OsiModelTransportLayer;
   95|  45.0k|		}

_ZN4pcpp9VlanLayer11isDataValidEPKhm:
  120|  73.9k|		{
  121|  73.9k|			return canReinterpretAs<vlan_header>(data, dataLen);
  122|  73.9k|		}
_ZN4pcpp9VlanLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   42|  73.8k|		    : Layer(data, dataLen, prevLayer, packet, VLAN)
   43|  73.8k|		{}
_ZNK4pcpp9VlanLayer13getVlanHeaderEv:
   59|   123k|		{
   60|   123k|			return reinterpret_cast<vlan_header*>(m_Data);
   61|   123k|		}
_ZNK4pcpp9VlanLayer12getHeaderLenEv:
  101|  7.62k|		{
  102|  7.62k|			return sizeof(vlan_header);
  103|  7.62k|		}
_ZNK4pcpp9VlanLayer16getOsiModelLayerEv:
  111|  7.48k|		{
  112|  7.48k|			return OsiModelDataLinkLayer;
  113|  7.48k|		}

_ZN4pcpp9VrrpLayerC2EPhmPNS_5LayerEPNS_6PacketEhNS_9IPAddress11AddressTypeE:
  129|  11.7k|		    : Layer(data, dataLen, prevLayer, packet, vrrpVer), m_AddressType(addressType)
  130|  11.7k|		{}
_ZNK4pcpp9VrrpLayer13getVrrpHeaderEv:
  135|  41.5k|		{
  136|  41.5k|			return reinterpret_cast<vrrp_header*>(m_Data);
  137|  41.5k|		}
_ZN4pcpp9VrrpLayer14parseNextLayerEv:
  252|  11.7k|		{}
_ZNK4pcpp9VrrpLayer12getHeaderLenEv:
  260|  18.2k|		{
  261|  18.2k|			return m_DataLen;
  262|  18.2k|		}
_ZNK4pcpp9VrrpLayer16getOsiModelLayerEv:
  267|  2.69k|		{
  268|  2.69k|			return OsiModelNetworkLayer;
  269|  2.69k|		}
_ZN4pcpp11VrrpV2LayerC2EPhmPNS_5LayerEPNS_6PacketE:
  346|  5.62k|		    : VrrpLayer(data, dataLen, prevLayer, packet, VRRPv2, IPAddress::IPv4AddressType)
  347|  5.62k|		{}
_ZN4pcpp11VrrpV2Layer11isDataValidEPKhm:
  387|  5.62k|		{
  388|  5.62k|			return canReinterpretAs<vrrp_header>(data, dataLen);
  389|  5.62k|		}
_ZN4pcpp11VrrpV3LayerC2EPhmPNS_5LayerEPNS_6PacketENS_9IPAddress11AddressTypeE:
  436|  6.12k|		    : VrrpLayer(data, dataLen, prevLayer, packet, VRRPv3, addressType)
  437|  6.12k|		{}
_ZN4pcpp11VrrpV3Layer11isDataValidEPKhm:
  468|  2.64k|		{
  469|  2.64k|			return canReinterpretAs<vrrp_header>(data, dataLen);
  470|  2.64k|		}

_ZN4pcpp10VxlanLayer11isVxlanPortEt:
  120|   227k|		{
  121|   227k|			return port == 4789;
  122|   227k|		}
_ZN4pcpp10VxlanLayer11isDataValidEPKhm:
   98|  6.11k|		{
   99|  6.11k|			return canReinterpretAs<vxlan_header>(data, dataLen);
  100|  6.11k|		}
_ZN4pcpp10VxlanLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   78|  6.11k|		    : Layer(data, dataLen, prevLayer, packet, VXLAN)
   79|  6.11k|		{}
_ZNK4pcpp10VxlanLayer12getHeaderLenEv:
  131|    716|		{
  132|    716|			return sizeof(vxlan_header);
  133|    716|		}
_ZN4pcpp10VxlanLayer22computeCalculateFieldsEv:
  137|    716|		{}
_ZNK4pcpp10VxlanLayer16getOsiModelLayerEv:
  142|    716|		{
  143|    716|			return OsiModelDataLinkLayer;
  144|    716|		}

_ZN4pcpp14WakeOnLanLayer15isWakeOnLanPortEt:
  106|  47.9k|		{
  107|  47.9k|			return (port == 0) || (port == 7) || (port == 9);
  ------------------
  |  Branch (107:11): [True: 3.25k, False: 44.7k]
  |  Branch (107:26): [True: 5, False: 44.7k]
  |  Branch (107:41): [True: 729, False: 43.9k]
  ------------------
  108|  47.9k|		}
_ZN4pcpp14WakeOnLanLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   39|    686|		    : Layer(data, dataLen, prevLayer, packet, WakeOnLan)
   40|    686|		{}
_ZNK4pcpp14WakeOnLanLayer18getWakeOnLanHeaderEv:
   66|    190|		{
   67|    190|			return reinterpret_cast<wol_header*>(m_Data);
   68|    190|		}
_ZN4pcpp14WakeOnLanLayer14parseNextLayerEv:
  120|    686|		{}
_ZNK4pcpp14WakeOnLanLayer12getHeaderLenEv:
  124|     95|		{
  125|     95|			return m_DataLen;
  126|     95|		}
_ZN4pcpp14WakeOnLanLayer22computeCalculateFieldsEv:
  130|     95|		{}
_ZNK4pcpp14WakeOnLanLayer16getOsiModelLayerEv:
  134|     95|		{
  135|     95|			return OsiModelDataLinkLayer;
  136|     95|		}

_ZN4pcpp14WireGuardLayer16isWireGuardPortsEtt:
   68|  47.3k|		{
   69|  47.3k|			return (portSrc == 51820 || portDst == 51820);
  ------------------
  |  Branch (69:12): [True: 850, False: 46.4k]
  |  Branch (69:32): [True: 995, False: 45.4k]
  ------------------
   70|  47.3k|		}
_ZNK4pcpp14WireGuardLayer14getBasicHeaderEv:
   32|    706|		{
   33|    706|			return reinterpret_cast<wg_common_header*>(m_Data);
   34|    706|		}
_ZN4pcpp14WireGuardLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   60|  1.76k|		    : Layer(data, dataLen, prevLayer, packet, WireGuard)
   61|  1.76k|		{}
_ZN4pcpp14WireGuardLayer14parseNextLayerEv:
  100|  1.76k|		{}
_ZN4pcpp14WireGuardLayer22computeCalculateFieldsEv:
  107|    353|		{}
_ZNK4pcpp14WireGuardLayer16getOsiModelLayerEv:
  115|    353|		{
  116|    353|			return OsiModelNetworkLayer;
  117|    353|		}
_ZN4pcpp33WireGuardHandshakeInitiationLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  190|    230|		    : WireGuardLayer(data, dataLen, prevLayer, packet)
  191|    230|		{}
_ZN4pcpp33WireGuardHandshakeInitiationLayer11isDataValidEPKhm:
  199|    230|		{
  200|    230|			return data != nullptr && dataLen >= sizeof(wg_handshake_initiation);
  ------------------
  |  Branch (200:11): [True: 230, False: 0]
  |  Branch (200:30): [True: 230, False: 0]
  ------------------
  201|    230|		}
_ZN4pcpp31WireGuardHandshakeResponseLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  337|    535|		    : WireGuardLayer(data, dataLen, prevLayer, packet)
  338|    535|		{}
_ZN4pcpp31WireGuardHandshakeResponseLayer11isDataValidEPKhm:
  346|    570|		{
  347|    570|			return data != nullptr && dataLen >= sizeof(wg_handshake_response);
  ------------------
  |  Branch (347:11): [True: 570, False: 0]
  |  Branch (347:30): [True: 535, False: 35]
  ------------------
  348|    570|		}
_ZN4pcpp25WireGuardCookieReplyLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  476|    130|		    : WireGuardLayer(data, dataLen, prevLayer, packet)
  477|    130|		{}
_ZN4pcpp25WireGuardCookieReplyLayer11isDataValidEPKhm:
  484|    130|		{
  485|    130|			return data != nullptr && dataLen >= sizeof(wg_cookie_reply);
  ------------------
  |  Branch (485:11): [True: 130, False: 0]
  |  Branch (485:30): [True: 130, False: 0]
  ------------------
  486|    130|		}
_ZN4pcpp27WireGuardTransportDataLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  579|    870|		    : WireGuardLayer(data, dataLen, prevLayer, packet)
  580|    870|		{}
_ZN4pcpp27WireGuardTransportDataLayer11isDataValidEPKhm:
  587|    870|		{
  588|    870|			return data != nullptr && dataLen >= sizeof(wg_transport_data);
  ------------------
  |  Branch (588:11): [True: 870, False: 0]
  |  Branch (588:30): [True: 870, False: 0]
  ------------------
  589|    870|		}

_ZNK4pcpp8ArpLayer9getOpcodeEv:
   52|  18.4k|	{
   53|       |		return static_cast<ArpOpcode>(be16toh(getArpHeader()->opcode));
   54|  18.4k|	}
_ZN4pcpp8ArpLayer22computeCalculateFieldsEv:
   57|  4.55k|	{
   58|  4.55k|		arphdr* arpHeader = getArpHeader();
   59|  4.55k|		arpHeader->hardwareType = htobe16(1);  // Ethernet
   60|  4.55k|		arpHeader->hardwareSize = 6;
   61|       |		arpHeader->protocolType = htobe16(PCPP_ETHERTYPE_IP);  // assume IPv4 over ARP
   62|  4.55k|		arpHeader->protocolSize = 4;                           // assume IPv4 over ARP
   63|  4.55k|	}
_ZNK4pcpp8ArpLayer9isRequestEv:
   91|  4.55k|	{
   92|  4.55k|		return getOpcode() == pcpp::ArpOpcode::ARP_REQUEST;
   93|  4.55k|	}
_ZNK4pcpp8ArpLayer7isReplyEv:
   96|  4.55k|	{
   97|  4.55k|		return getOpcode() == pcpp::ArpOpcode::ARP_REPLY;
   98|  4.55k|	}
_ZNK4pcpp8ArpLayer8toStringEv:
  101|  9.10k|	{
  102|  9.10k|		switch (getOpcode())
  103|  9.10k|		{
  104|  7.28k|		case ArpOpcode::ARP_REQUEST:
  ------------------
  |  Branch (104:3): [True: 7.28k, False: 1.81k]
  ------------------
  105|  7.28k|			return "ARP Layer, ARP request, who has " + getTargetIpAddr().toString() + " ? Tell " +
  106|  7.28k|			       getSenderIpAddr().toString();
  107|  1.59k|		case ArpOpcode::ARP_REPLY:
  ------------------
  |  Branch (107:3): [True: 1.59k, False: 7.50k]
  ------------------
  108|  1.59k|			return "ARP Layer, ARP reply, " + getSenderIpAddr().toString() + " is at " +
  109|  1.59k|			       getSenderMacAddress().toString();
  110|    220|		default:
  ------------------
  |  Branch (110:3): [True: 220, False: 8.88k]
  ------------------
  111|    220|			return "ARP Layer, unknown opcode (" + std::to_string(getOpcode()) + ")";
  112|  9.10k|		}
  113|  9.10k|	}

_ZN4pcpp10Asn1Record6decodeEPKhmb:
   93|  22.8k|	{
   94|  22.8k|		uint8_t tagLen;
   95|  22.8k|		auto decodedRecord = decodeTagAndCreateRecord(data, dataLen, tagLen);
   96|       |
   97|  22.8k|		uint8_t lengthLen;
   98|  22.8k|		lengthLen = decodedRecord->decodeLength(data + tagLen, dataLen - tagLen);
   99|       |
  100|  22.8k|		decodedRecord->m_TotalLength = tagLen + lengthLen + decodedRecord->m_ValueLength;
  101|  22.8k|		if (decodedRecord->m_TotalLength < decodedRecord->m_ValueLength ||  // check for overflow
  ------------------
  |  Branch (101:7): [True: 1.69k, False: 21.1k]
  ------------------
  102|  21.1k|		    decodedRecord->m_TotalLength > dataLen)
  ------------------
  |  Branch (102:7): [True: 200, False: 20.9k]
  ------------------
  103|    200|		{
  104|    200|			throw std::invalid_argument("Cannot decode ASN.1 record, data doesn't contain the entire record");
  105|    200|		}
  106|       |
  107|  22.6k|		uint8_t const* startOfData = data + tagLen + lengthLen;
  108|  22.6k|		internal::Asn1LoadPolicy policy = lazy ? internal::Asn1LoadPolicy::Lazy : internal::Asn1LoadPolicy::Eager;
  ------------------
  |  Branch (108:37): [True: 1.88k, False: 20.7k]
  ------------------
  109|  22.6k|		decodedRecord->setEncodedValue(startOfData, policy);
  110|       |
  111|  22.6k|		return decodedRecord;
  112|  22.8k|	}
_ZN4pcpp10Asn1Record24decodeTagAndCreateRecordEPKhmRh:
  207|  22.8k|	{
  208|  22.8k|		if (dataLen < 1)
  ------------------
  |  Branch (208:7): [True: 0, False: 22.8k]
  ------------------
  209|      0|		{
  210|      0|			throw std::invalid_argument("Cannot decode ASN.1 record tag");
  211|      0|		}
  212|       |
  213|  22.8k|		tagLen = 1;
  214|       |
  215|  22.8k|		Asn1TagClass tagClass = Asn1TagClass::Universal;
  216|       |
  217|       |		// Check first 2 bits
  218|  22.8k|		auto tagClassBits = data[0] & 0xc0;
  219|  22.8k|		if (tagClassBits == 0)
  ------------------
  |  Branch (219:7): [True: 12.6k, False: 10.2k]
  ------------------
  220|  12.6k|		{
  221|  12.6k|			tagClass = Asn1TagClass::Universal;
  222|  12.6k|		}
  223|  10.2k|		else if ((tagClassBits & 0xc0) == 0xc0)
  ------------------
  |  Branch (223:12): [True: 1.78k, False: 8.43k]
  ------------------
  224|  1.78k|		{
  225|  1.78k|			tagClass = Asn1TagClass::Private;
  226|  1.78k|		}
  227|  8.43k|		else if ((tagClassBits & 0x80) == 0x80)
  ------------------
  |  Branch (227:12): [True: 8.29k, False: 145]
  ------------------
  228|  8.29k|		{
  229|  8.29k|			tagClass = Asn1TagClass::ContextSpecific;
  230|  8.29k|		}
  231|    145|		else if ((tagClassBits & 0x40) == 0x40)
  ------------------
  |  Branch (231:12): [True: 145, False: 0]
  ------------------
  232|    145|		{
  233|    145|			tagClass = Asn1TagClass::Application;
  234|    145|		}
  235|       |
  236|       |		// Check bit 6
  237|  22.8k|		auto tagTypeBits = data[0] & 0x20;
  238|  22.8k|		bool isConstructed = (tagTypeBits != 0);
  239|       |
  240|       |		// Check last 5 bits
  241|  22.8k|		auto tagType = data[0] & 0x1f;
  242|  22.8k|		if (tagType == 0x1f)
  ------------------
  |  Branch (242:7): [True: 15, False: 22.8k]
  ------------------
  243|     15|		{
  244|     15|			if (dataLen < 2)
  ------------------
  |  Branch (244:8): [True: 0, False: 15]
  ------------------
  245|      0|			{
  246|      0|				throw std::invalid_argument("Cannot decode ASN.1 record tag");
  247|      0|			}
  248|       |
  249|     15|			if ((data[1] & 0x80) != 0)
  ------------------
  |  Branch (249:8): [True: 15, False: 0]
  ------------------
  250|     15|			{
  251|     15|				throw std::invalid_argument("ASN.1 tags with value larger than 127 are not supported");
  252|     15|			}
  253|       |
  254|      0|			tagType = data[1] & 0x7f;
  255|      0|			tagLen = 2;
  256|      0|		}
  257|       |
  258|  22.8k|		std::unique_ptr<Asn1Record> newRecord;
  259|       |
  260|  22.8k|		if (isConstructed)
  ------------------
  |  Branch (260:7): [True: 12.0k, False: 10.8k]
  ------------------
  261|  12.0k|		{
  262|  12.0k|			if (tagClass == Asn1TagClass::Universal)
  ------------------
  |  Branch (262:8): [True: 3.71k, False: 8.30k]
  ------------------
  263|  3.71k|			{
  264|  3.71k|				switch (static_cast<Asn1UniversalTagType>(tagType))
  265|  3.71k|				{
  266|  3.65k|				case Asn1UniversalTagType::Sequence:
  ------------------
  |  Branch (266:5): [True: 3.65k, False: 68]
  ------------------
  267|  3.65k|				{
  268|  3.65k|					newRecord.reset(new Asn1SequenceRecord());
  269|  3.65k|					break;
  270|      0|				}
  271|     28|				case Asn1UniversalTagType::Set:
  ------------------
  |  Branch (271:5): [True: 28, False: 3.69k]
  ------------------
  272|     28|				{
  273|     28|					newRecord.reset(new Asn1SetRecord());
  274|     28|					break;
  275|      0|				}
  276|     40|				default:
  ------------------
  |  Branch (276:5): [True: 40, False: 3.67k]
  ------------------
  277|     40|				{
  278|     40|					newRecord.reset(new Asn1ConstructedRecord());
  279|     40|				}
  280|  3.71k|				}
  281|  3.71k|			}
  282|  8.30k|			else
  283|  8.30k|			{
  284|  8.30k|				newRecord.reset(new Asn1ConstructedRecord());
  285|  8.30k|			}
  286|  12.0k|		}
  287|  10.8k|		else
  288|  10.8k|		{
  289|  10.8k|			if (tagClass == Asn1TagClass::Universal)
  ------------------
  |  Branch (289:8): [True: 8.92k, False: 1.91k]
  ------------------
  290|  8.92k|			{
  291|  8.92k|				auto asn1UniversalTagType = static_cast<Asn1UniversalTagType>(tagType);
  292|  8.92k|				switch (asn1UniversalTagType)
  293|  8.92k|				{
  294|  1.96k|				case Asn1UniversalTagType::Integer:
  ------------------
  |  Branch (294:5): [True: 1.96k, False: 6.95k]
  ------------------
  295|  1.96k|				{
  296|  1.96k|					newRecord.reset(new Asn1IntegerRecord());
  297|  1.96k|					break;
  298|      0|				}
  299|  1.71k|				case Asn1UniversalTagType::Enumerated:
  ------------------
  |  Branch (299:5): [True: 1.71k, False: 7.20k]
  ------------------
  300|  1.71k|				{
  301|  1.71k|					newRecord.reset(new Asn1EnumeratedRecord());
  302|  1.71k|					break;
  303|      0|				}
  304|  1.72k|				case Asn1UniversalTagType::OctetString:
  ------------------
  |  Branch (304:5): [True: 1.72k, False: 7.19k]
  ------------------
  305|  1.72k|				{
  306|  1.72k|					newRecord.reset(new Asn1OctetStringRecord());
  307|  1.72k|					break;
  308|      0|				}
  309|      0|				case Asn1UniversalTagType::UTF8String:
  ------------------
  |  Branch (309:5): [True: 0, False: 8.92k]
  ------------------
  310|      0|				{
  311|      0|					newRecord.reset(new Asn1UTF8StringRecord());
  312|      0|					break;
  313|      0|				}
  314|      5|				case Asn1UniversalTagType::PrintableString:
  ------------------
  |  Branch (314:5): [True: 5, False: 8.91k]
  ------------------
  315|      5|				{
  316|      5|					newRecord.reset(new Asn1PrintableStringRecord());
  317|      5|					break;
  318|      0|				}
  319|      0|				case Asn1UniversalTagType::IA5String:
  ------------------
  |  Branch (319:5): [True: 0, False: 8.92k]
  ------------------
  320|      0|				{
  321|      0|					newRecord.reset(new Asn1IA5StringRecord());
  322|      0|					break;
  323|      0|				}
  324|      6|				case Asn1UniversalTagType::Boolean:
  ------------------
  |  Branch (324:5): [True: 6, False: 8.91k]
  ------------------
  325|      6|				{
  326|      6|					newRecord.reset(new Asn1BooleanRecord());
  327|      6|					break;
  328|      0|				}
  329|     20|				case Asn1UniversalTagType::BitString:
  ------------------
  |  Branch (329:5): [True: 20, False: 8.90k]
  ------------------
  330|     20|				{
  331|     20|					newRecord.reset(new Asn1BitStringRecord());
  332|     20|					break;
  333|      0|				}
  334|     53|				case Asn1UniversalTagType::Null:
  ------------------
  |  Branch (334:5): [True: 53, False: 8.87k]
  ------------------
  335|     53|				{
  336|     53|					newRecord.reset(new Asn1NullRecord());
  337|     53|					break;
  338|      0|				}
  339|  1.54k|				case Asn1UniversalTagType::ObjectIdentifier:
  ------------------
  |  Branch (339:5): [True: 1.54k, False: 7.37k]
  ------------------
  340|  1.54k|				{
  341|  1.54k|					newRecord.reset(new Asn1ObjectIdentifierRecord());
  342|  1.54k|					break;
  343|      0|				}
  344|      5|				case Asn1UniversalTagType::UTCTime:
  ------------------
  |  Branch (344:5): [True: 5, False: 8.91k]
  ------------------
  345|      5|				{
  346|      5|					newRecord.reset(new Asn1UtcTimeRecord());
  347|      5|					break;
  348|      0|				}
  349|      0|				case Asn1UniversalTagType::GeneralizedTime:
  ------------------
  |  Branch (349:5): [True: 0, False: 8.92k]
  ------------------
  350|      0|				{
  351|      0|					newRecord.reset(new Asn1GeneralizedTimeRecord());
  352|      0|					break;
  353|      0|				}
  354|  1.87k|				default:
  ------------------
  |  Branch (354:5): [True: 1.87k, False: 7.05k]
  ------------------
  355|  1.87k|				{
  356|  1.87k|					newRecord.reset(new Asn1GenericRecord());
  357|  1.87k|				}
  358|  8.92k|				}
  359|  8.92k|			}
  360|  1.91k|			else
  361|  1.91k|			{
  362|  1.91k|				newRecord.reset(new Asn1GenericRecord());
  363|  1.91k|			}
  364|  10.8k|		}
  365|       |
  366|  22.8k|		newRecord->m_TagClass = tagClass;
  367|  22.8k|		newRecord->m_IsConstructed = isConstructed;
  368|  22.8k|		newRecord->m_TagType = tagType;
  369|       |
  370|  22.8k|		return newRecord;
  371|  22.8k|	}
_ZN4pcpp10Asn1Record12decodeLengthEPKhm:
  374|  22.8k|	{
  375|  22.8k|		if (dataLen < 1)
  ------------------
  |  Branch (375:7): [True: 1.54k, False: 21.3k]
  ------------------
  376|  1.54k|		{
  377|  1.54k|			throw std::invalid_argument("Cannot decode ASN.1 record length");
  378|  1.54k|		}
  379|       |
  380|       |		// Check 8th bit
  381|  21.3k|		auto lengthForm = data[0] & 0x80;
  382|       |
  383|       |		// Check if the tag is using more than one byte
  384|       |		// 8th bit at 0 means the length only uses one byte
  385|       |		// 8th bit at 1 means the length uses more than one byte. The number of bytes is encoded in the other 7 bits
  386|  21.3k|		if (lengthForm == 0)
  ------------------
  |  Branch (386:7): [True: 12.5k, False: 8.71k]
  ------------------
  387|  12.5k|		{
  388|  12.5k|			m_ValueLength = data[0];
  389|  12.5k|			return 1;
  390|  12.5k|		}
  391|       |
  392|  8.71k|		uint8_t actualLengthBytes = data[0] & 0x7F;
  393|  8.71k|		const uint8_t* actualLengthData = data + 1;
  394|       |
  395|  8.71k|		if (dataLen < static_cast<size_t>(actualLengthBytes) + 1)
  ------------------
  |  Branch (395:7): [True: 54, False: 8.66k]
  ------------------
  396|     54|		{
  397|     54|			throw std::invalid_argument("Cannot decode ASN.1 record length");
  398|     54|		}
  399|       |
  400|  24.2k|		for (int i = 0; i < actualLengthBytes; i++)
  ------------------
  |  Branch (400:19): [True: 15.7k, False: 8.58k]
  ------------------
  401|  15.7k|		{
  402|  15.7k|			size_t partialValueLength = m_ValueLength << 8;
  403|  15.7k|			if (partialValueLength < m_ValueLength)  // check for overflow
  ------------------
  |  Branch (403:8): [True: 79, False: 15.6k]
  ------------------
  404|     79|			{
  405|     79|				throw std::invalid_argument("Cannot decode ASN.1 record length");
  406|     79|			}
  407|       |
  408|  15.6k|			m_ValueLength = partialValueLength | actualLengthData[i];
  409|  15.6k|		}
  410|       |
  411|  8.58k|		return 1 + actualLengthBytes;
  412|  8.66k|	}
_ZNK4pcpp10Asn1Record19decodeValueIfNeededEv:
  415|  21.1k|	{
  416|       |		// TODO: This is not thread-safe and can cause issues in a multiple reader scenario.
  417|  21.1k|		if (m_EncodedValue != nullptr)
  ------------------
  |  Branch (417:7): [True: 20.9k, False: 170]
  ------------------
  418|  20.9k|		{
  419|  20.9k|			decodeValue(m_EncodedValue);
  420|  20.9k|			m_EncodedValue = nullptr;  // Clear the encoded value after decoding
  421|  20.9k|		}
  422|  21.1k|	}
_ZN4pcpp10Asn1Record15setEncodedValueEPKhNS_8internal14Asn1LoadPolicyE:
  462|  20.9k|	{
  463|  20.9k|		m_EncodedValue = dataSource;
  464|       |
  465|  20.9k|		if (loadPolicy == internal::Asn1LoadPolicy::Eager)
  ------------------
  |  Branch (465:7): [True: 19.0k, False: 1.88k]
  ------------------
  466|  19.0k|		{
  467|  19.0k|			decodeValueIfNeeded();
  468|  19.0k|		}
  469|  20.9k|	}
_ZNK4pcpp17Asn1GenericRecord11decodeValueEPKh:
  484|  3.64k|	{
  485|  3.64k|		m_Value = std::make_unique<uint8_t[]>(m_ValueLength);
  486|  3.64k|		std::memcpy(m_Value.get(), data, m_ValueLength);
  487|  3.64k|	}
_ZNK4pcpp21Asn1ConstructedRecord11decodeValueEPKh:
  519|  10.2k|	{
  520|  10.2k|		if (!(data || m_ValueLength))
  ------------------
  |  Branch (520:9): [True: 10.2k, False: 0]
  |  Branch (520:17): [True: 0, False: 0]
  ------------------
  521|      0|		{
  522|      0|			return;
  523|      0|		}
  524|       |
  525|  10.2k|		auto value = data;
  526|  10.2k|		auto valueLen = m_ValueLength;
  527|       |
  528|  31.1k|		while (valueLen > 0)
  ------------------
  |  Branch (528:10): [True: 20.8k, False: 10.2k]
  ------------------
  529|  20.8k|		{
  530|  20.8k|			auto subRecord = Asn1Record::decode(value, valueLen, LazySubRecordDecoding);
  531|  20.8k|			value += subRecord->getTotalLength();
  532|  20.8k|			valueLen -= subRecord->getTotalLength();
  533|       |
  534|  20.8k|			m_SubRecords.pushBack(std::move(subRecord));
  535|  20.8k|		}
  536|  10.2k|	}
_ZN4pcpp19Asn1PrimitiveRecordC2ENS_20Asn1UniversalTagTypeE:
  583|  1.78k|	Asn1PrimitiveRecord::Asn1PrimitiveRecord(Asn1UniversalTagType tagType) : Asn1Record()
  584|  1.78k|	{
  585|  1.78k|		m_TagType = static_cast<uint8_t>(tagType);
  586|  1.78k|		m_TagClass = Asn1TagClass::Universal;
  587|  1.78k|		m_IsConstructed = false;
  588|  1.78k|	}
_ZN4pcpp17Asn1IntegerRecord6BigInt14initFromStringERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  601|  3.68k|	{
  602|  3.68k|		std::string valueStr = value;
  603|       |
  604|       |		// Optional 0x or 0X prefix
  605|  3.68k|		if (value.size() >= 2 && value[0] == '0' && (value[1] == 'x' || value[1] == 'X'))
  ------------------
  |  Branch (605:7): [True: 3.68k, False: 0]
  |  Branch (605:28): [True: 1.87k, False: 1.81k]
  |  Branch (605:48): [True: 0, False: 1.87k]
  |  Branch (605:67): [True: 0, False: 1.87k]
  ------------------
  606|      0|		{
  607|      0|			valueStr = value.substr(2);
  608|      0|		}
  609|       |
  610|  3.68k|		if (valueStr.empty())
  ------------------
  |  Branch (610:7): [True: 0, False: 3.68k]
  ------------------
  611|      0|		{
  612|      0|			throw std::invalid_argument("Value is not a valid hex stream");
  613|      0|		}
  614|       |
  615|  3.68k|		if (std::any_of(valueStr.begin(), valueStr.end(), [](char c) { return !std::isxdigit(c); }))
  ------------------
  |  Branch (615:7): [True: 0, False: 3.68k]
  ------------------
  616|      0|		{
  617|      0|			throw std::invalid_argument("Value is not a valid hex stream");
  618|      0|		}
  619|       |
  620|  3.68k|		return valueStr;
  621|  3.68k|	}
_ZN4pcpp17Asn1IntegerRecord6BigIntaSERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  624|  3.68k|	{
  625|  3.68k|		m_Value = initFromString(value);
  626|  3.68k|		return *this;
  627|  3.68k|	}
_ZNK4pcpp17Asn1IntegerRecord11decodeValueEPKh:
  692|  3.68k|	{
  693|  3.68k|		m_Value = pcpp::byteArrayToHexString(data, m_ValueLength);
  694|  3.68k|	}
_ZNK4pcpp21Asn1OctetStringRecord11decodeValueEPKh:
  721|  1.72k|	{
  722|  1.72k|		auto value = reinterpret_cast<char const*>(data);
  723|       |
  724|  1.72k|		m_IsPrintable = std::all_of(value, value + m_ValueLength, [](char c) { return isprint(0xff & c); });
  725|       |
  726|  1.72k|		if (m_IsPrintable)
  ------------------
  |  Branch (726:7): [True: 116, False: 1.60k]
  ------------------
  727|    116|		{
  728|    116|			Asn1StringRecord::decodeValue(data);
  729|    116|		}
  730|  1.60k|		else
  731|  1.60k|		{
  732|  1.60k|			m_Value = byteArrayToHexString(data, m_ValueLength);
  733|  1.60k|		}
  734|  1.72k|	}
_ZN4pcpp14Asn1NullRecordC2Ev:
  781|     53|	Asn1NullRecord::Asn1NullRecord() : Asn1PrimitiveRecord(Asn1UniversalTagType::Null)
  782|     53|	{
  783|     53|		m_ValueLength = 0;
  784|     53|		m_TotalLength = 2;
  785|     53|	}
_ZN4pcpp20Asn1ObjectIdentifierC2EPKhm:
  788|  1.54k|	{
  789|       |		// A description of OID encoding can be found here:
  790|       |		// https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-object-identifier?redirectedfrom=MSDN
  791|       |
  792|  1.54k|		if (!data || dataLen == 0)
  ------------------
  |  Branch (792:7): [True: 0, False: 1.54k]
  |  Branch (792:16): [True: 0, False: 1.54k]
  ------------------
  793|      0|		{
  794|      0|			throw std::invalid_argument("Malformed OID: Not enough bytes for the first component");
  795|      0|		}
  796|       |
  797|  1.54k|		size_t currentByteIndex = 0;
  798|  1.54k|		std::vector<uint32_t> components;
  799|       |
  800|  1.54k|		uint8_t firstByte = data[currentByteIndex++];
  801|       |		// Decode the first byte: first_component * 40 + second_component
  802|  1.54k|		components.push_back(static_cast<uint32_t>(firstByte / 40));
  803|  1.54k|		components.push_back(static_cast<uint32_t>(firstByte % 40));
  804|       |
  805|  1.54k|		uint32_t currentComponentValue = 0;
  806|  1.54k|		bool componentStarted = false;
  807|       |
  808|       |		// Process remaining bytes using base-128 encoding
  809|  13.9k|		while (currentByteIndex < dataLen)
  ------------------
  |  Branch (809:10): [True: 12.3k, False: 1.54k]
  ------------------
  810|  12.3k|		{
  811|  12.3k|			uint8_t byte = data[currentByteIndex++];
  812|       |
  813|       |			// Shift previous bits left by 7 and append lower 7 bits
  814|  12.3k|			currentComponentValue = (currentComponentValue << 7) | (byte & 0x7f);
  815|  12.3k|			componentStarted = true;
  816|       |
  817|       |			// If the MSB is 0, this is the final byte of the current value
  818|  12.3k|			if ((byte & 0x80) == 0)
  ------------------
  |  Branch (818:8): [True: 7.73k, False: 4.65k]
  ------------------
  819|  7.73k|			{
  820|  7.73k|				components.push_back(currentComponentValue);
  821|  7.73k|				currentComponentValue = 0;
  822|  7.73k|				componentStarted = false;
  823|  7.73k|			}
  824|  12.3k|		}
  825|       |
  826|  1.54k|		if (componentStarted)
  ------------------
  |  Branch (826:7): [True: 11, False: 1.53k]
  ------------------
  827|     11|		{
  828|     11|			throw std::invalid_argument("Malformed OID: Incomplete component at end of data");
  829|     11|		}
  830|       |
  831|  1.53k|		m_Components = components;
  832|  1.53k|	}
_ZNK4pcpp26Asn1ObjectIdentifierRecord11decodeValueEPKh:
  955|  1.54k|	{
  956|  1.54k|		m_Value = Asn1ObjectIdentifier(data, m_ValueLength);
  957|  1.54k|	}
_ZN4pcpp19Asn1BitStringRecord6BitSetC2EPKhm:
 1240|     10|	Asn1BitStringRecord::BitSet::BitSet(const uint8_t* data, size_t numBits) : m_NumBits(numBits)
 1241|     10|	{
 1242|     10|		if (!data || !numBits)
  ------------------
  |  Branch (1242:7): [True: 0, False: 10]
  |  Branch (1242:16): [True: 0, False: 10]
  ------------------
 1243|      0|		{
 1244|      0|			throw std::invalid_argument("Provided data is null or num of bits is 0");
 1245|      0|		}
 1246|       |
 1247|     10|		size_t requiredBytes = (m_NumBits + 7) / 8;
 1248|     10|		m_Data.resize(requiredBytes);
 1249|     10|		std::copy_n(data, requiredBytes, m_Data.begin());
 1250|     10|	}
_ZNK4pcpp19Asn1BitStringRecord11decodeValueEPKh:
 1296|     10|	{
 1297|       |		// A BitString value must contain at least the initial octet holding the number of unused bits
 1298|     10|		if (m_ValueLength == 0)
  ------------------
  |  Branch (1298:7): [True: 0, False: 10]
  ------------------
 1299|      0|		{
 1300|      0|			throw std::invalid_argument("Cannot decode ASN.1 BitString record, value is empty");
 1301|      0|		}
 1302|       |
 1303|     10|		auto unusedBits = static_cast<size_t>(data[0]);
 1304|       |
 1305|       |		// The number of unused bits must be in the range 0-7, and must be 0 if the bit string is empty
 1306|     10|		if (unusedBits > 7 || (m_ValueLength == 1 && unusedBits != 0))
  ------------------
  |  Branch (1306:7): [True: 0, False: 10]
  |  Branch (1306:26): [True: 0, False: 10]
  |  Branch (1306:48): [True: 0, False: 0]
  ------------------
 1307|      0|		{
 1308|      0|			throw std::invalid_argument("Cannot decode ASN.1 BitString record, invalid number of unused bits");
 1309|      0|		}
 1310|       |
 1311|     10|		auto numBits = (m_ValueLength - 1) * 8 - unusedBits;
 1312|     10|		if (numBits == 0)
  ------------------
  |  Branch (1312:7): [True: 0, False: 10]
  ------------------
 1313|      0|		{
 1314|      0|			m_Value = BitSet();
 1315|      0|			return;
 1316|      0|		}
 1317|       |
 1318|     10|		m_Value = BitSet(data + 1, numBits);
 1319|     10|	}
Asn1Codec.cpp:_ZZN4pcpp17Asn1IntegerRecord6BigInt14initFromStringERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEENK3$_0clEc:
  615|  15.1k|		if (std::any_of(valueStr.begin(), valueStr.end(), [](char c) { return !std::isxdigit(c); }))
Asn1Codec.cpp:_ZZNK4pcpp21Asn1OctetStringRecord11decodeValueEPKhENK3$_0clEc:
  724|  3.54k|		m_IsPrintable = std::all_of(value, value + m_ValueLength, [](char c) { return isprint(0xff & c); });

_ZNK4pcpp8BgpLayer12getHeaderLenEv:
   27|   442k|	{
   28|   442k|		if (m_DataLen < sizeof(bgp_common_header))
  ------------------
  |  Branch (28:7): [True: 1, False: 442k]
  ------------------
   29|      1|		{
   30|      1|			return m_DataLen;
   31|      1|		}
   32|       |
   33|   442k|		uint16_t messageLen = be16toh(getBasicHeader()->length);
   34|   442k|		if (m_DataLen < messageLen)
  ------------------
  |  Branch (34:7): [True: 11.8k, False: 430k]
  ------------------
   35|  11.8k|		{
   36|  11.8k|			return m_DataLen;
   37|  11.8k|		}
   38|       |
   39|   430k|		return (size_t)messageLen;
   40|   442k|	}
_ZN4pcpp8BgpLayer13parseBgpLayerEPhmPNS_5LayerEPNS_6PacketE:
   43|  76.4k|	{
   44|  76.4k|		if (data == nullptr || dataLen < sizeof(bgp_common_header))
  ------------------
  |  Branch (44:7): [True: 0, False: 76.4k]
  |  Branch (44:26): [True: 15.2k, False: 61.1k]
  ------------------
   45|  15.2k|			return nullptr;
   46|       |
   47|  61.1k|		auto* bgpHeader = reinterpret_cast<bgp_common_header*>(data);
   48|       |
   49|       |		// illegal header data - length is too small
   50|  61.1k|		uint16_t messageLen = be16toh(bgpHeader->length);
   51|  61.1k|		if (dataLen < messageLen || messageLen < static_cast<uint16_t>(sizeof(bgp_common_header)))
  ------------------
  |  Branch (51:7): [True: 1.49k, False: 59.6k]
  |  Branch (51:31): [True: 333, False: 59.3k]
  ------------------
   52|  1.83k|			return nullptr;
   53|       |
   54|  59.3k|		switch (bgpHeader->messageType)
   55|  59.3k|		{
   56|  14.4k|		case 1:  // OPEN
  ------------------
  |  Branch (56:3): [True: 14.4k, False: 44.8k]
  ------------------
   57|  14.4k|			return BgpOpenMessageLayer::isDataValid(data, dataLen)
  ------------------
  |  Branch (57:11): [True: 13.5k, False: 922]
  ------------------
   58|  14.4k|			           ? new BgpOpenMessageLayer(data, dataLen, prevLayer, packet)
   59|  14.4k|			           : nullptr;
   60|  40.7k|		case 2:  // UPDATE
  ------------------
  |  Branch (60:3): [True: 40.7k, False: 18.6k]
  ------------------
   61|  40.7k|			return BgpUpdateMessageLayer::isDataValid(data, dataLen)
  ------------------
  |  Branch (61:11): [True: 40.5k, False: 147]
  ------------------
   62|  40.7k|			           ? new BgpUpdateMessageLayer(data, dataLen, prevLayer, packet)
   63|  40.7k|			           : nullptr;
   64|    525|		case 3:  // NOTIFICATION
  ------------------
  |  Branch (64:3): [True: 525, False: 58.8k]
  ------------------
   65|    525|			return new BgpNotificationMessageLayer(data, dataLen, prevLayer, packet);
   66|  2.98k|		case 4:  // KEEPALIVE
  ------------------
  |  Branch (66:3): [True: 2.98k, False: 56.3k]
  ------------------
   67|  2.98k|			return new BgpKeepaliveMessageLayer(data, dataLen, prevLayer, packet);
   68|    517|		case 5:  // ROUTE-REFRESH
  ------------------
  |  Branch (68:3): [True: 517, False: 58.8k]
  ------------------
   69|    517|			return new BgpRouteRefreshMessageLayer(data, dataLen, prevLayer, packet);
   70|    151|		default:
  ------------------
  |  Branch (70:3): [True: 151, False: 59.1k]
  ------------------
   71|    151|			return nullptr;
   72|  59.3k|		}
   73|  59.3k|	}
_ZNK4pcpp8BgpLayer22getMessageTypeAsStringEv:
   76|  25.5k|	{
   77|  25.5k|		switch (getBgpMessageType())
   78|  25.5k|		{
   79|  7.04k|		case BgpLayer::Open:
  ------------------
  |  Branch (79:3): [True: 7.04k, False: 18.4k]
  ------------------
   80|  7.04k|			return "OPEN";
   81|  16.1k|		case BgpLayer::Update:
  ------------------
  |  Branch (81:3): [True: 16.1k, False: 9.38k]
  ------------------
   82|  16.1k|			return "UPDATE";
   83|    312|		case BgpLayer::Notification:
  ------------------
  |  Branch (83:3): [True: 312, False: 25.2k]
  ------------------
   84|    312|			return "NOTIFICATION";
   85|  1.71k|		case BgpLayer::Keepalive:
  ------------------
  |  Branch (85:3): [True: 1.71k, False: 23.8k]
  ------------------
   86|  1.71k|			return "KEEPALIVE";
   87|    306|		case BgpLayer::RouteRefresh:
  ------------------
  |  Branch (87:3): [True: 306, False: 25.2k]
  ------------------
   88|    306|			return "ROUTE-REFRESH";
   89|      0|		default:
  ------------------
  |  Branch (89:3): [True: 0, False: 25.5k]
  ------------------
   90|      0|			return "Unknown";
   91|  25.5k|		}
   92|  25.5k|	}
_ZN4pcpp8BgpLayer14parseNextLayerEv:
   95|  58.1k|	{
   96|  58.1k|		size_t headerLen = getHeaderLen();
   97|  58.1k|		if (m_DataLen <= headerLen || headerLen == 0)
  ------------------
  |  Branch (97:7): [True: 15.9k, False: 42.1k]
  |  Branch (97:33): [True: 0, False: 42.1k]
  ------------------
   98|  15.9k|			return;
   99|       |
  100|  42.1k|		uint8_t* payload = m_Data + headerLen;
  101|  42.1k|		size_t payloadLen = m_DataLen - headerLen;
  102|       |
  103|  42.1k|		constructNextLayerFromFactory(BgpLayer::parseBgpLayer, payload, payloadLen);
  104|  42.1k|	}
_ZNK4pcpp8BgpLayer8toStringEv:
  107|  17.0k|	{
  108|  17.0k|		return "BGP Layer, " + getMessageTypeAsString() + " message";
  109|  17.0k|	}
_ZN4pcpp8BgpLayer22computeCalculateFieldsEv:
  112|  8.52k|	{
  113|  8.52k|		bgp_common_header* bgpHeader = getBasicHeader();
  114|  8.52k|		memset(bgpHeader->marker, 0xff, 16 * sizeof(uint8_t));
  115|  8.52k|		bgpHeader->messageType = (uint8_t)getBgpMessageType();
  116|       |		bgpHeader->length = htobe16(getHeaderLen());
  117|  8.52k|	}
_ZN4pcpp8BgpLayer11extendLayerEim:
  135|  19.3k|	{
  136|  19.3k|		if (getAttachedPacket() != nullptr)
  ------------------
  |  Branch (136:7): [True: 19.3k, False: 0]
  ------------------
  137|  19.3k|		{
  138|  19.3k|			int rawPacketLen = getAttachedPacket()->getRawPacket()->getRawDataLen();
  139|  19.3k|			const uint8_t* rawPacketPtr = getAttachedPacket()->getRawPacket()->getRawData();
  140|       |
  141|  19.3k|			if (m_Data - rawPacketPtr + static_cast<ptrdiff_t>(offsetInLayer) > static_cast<ptrdiff_t>(rawPacketLen))
  ------------------
  |  Branch (141:8): [True: 440, False: 18.9k]
  ------------------
  142|    440|			{
  143|    440|				PCPP_LOG_ERROR("Requested offset is larger than total packet length");
  ------------------
  |  |  445|    440|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    440|	do                                                                                                                 \
  |  |  |  |  415|    440|	{                                                                                                                  \
  |  |  |  |  416|    440|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    440|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    440|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 440, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    440|		{                                                                                                              \
  |  |  |  |  419|    440|			auto ctx =                                                                                                 \
  |  |  |  |  420|    440|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    440|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    440|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    440|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    440|		}                                                                                                              \
  |  |  |  |  424|    440|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 440]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  144|    440|				return false;
  145|    440|			}
  146|       |
  147|  18.9k|			if (m_NextLayer != nullptr && static_cast<ptrdiff_t>(offsetInLayer) > m_NextLayer->getData() - m_Data)
  ------------------
  |  Branch (147:8): [True: 11.6k, False: 7.25k]
  |  Branch (147:34): [True: 982, False: 10.6k]
  ------------------
  148|    982|			{
  149|    982|				PCPP_LOG_ERROR("Requested offset exceeds current layer's boundary");
  ------------------
  |  |  445|    982|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    982|	do                                                                                                                 \
  |  |  |  |  415|    982|	{                                                                                                                  \
  |  |  |  |  416|    982|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    982|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    982|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 982, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    982|		{                                                                                                              \
  |  |  |  |  419|    982|			auto ctx =                                                                                                 \
  |  |  |  |  420|    982|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    982|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    982|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    982|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    982|		}                                                                                                              \
  |  |  |  |  424|    982|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 982]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  150|    982|				return false;
  151|    982|			}
  152|  18.9k|		}
  153|       |
  154|  17.9k|		return Layer::extendLayer(offsetInLayer, numOfBytesToExtend);
  155|  19.3k|	}
_ZN4pcpp8BgpLayer12shortenLayerEim:
  158|  22.7k|	{
  159|  22.7k|		if (getAttachedPacket() != nullptr)
  ------------------
  |  Branch (159:7): [True: 22.7k, False: 0]
  ------------------
  160|  22.7k|		{
  161|  22.7k|			int rawPacketLen = getAttachedPacket()->getRawPacket()->getRawDataLen();
  162|  22.7k|			const uint8_t* rawPacketPtr = getAttachedPacket()->getRawPacket()->getRawData();
  163|       |
  164|  22.7k|			if (m_Data - rawPacketPtr + static_cast<ptrdiff_t>(offsetInLayer) +
  ------------------
  |  Branch (164:8): [True: 334, False: 22.4k]
  ------------------
  165|  22.7k|			        static_cast<ptrdiff_t>(numOfBytesToShorten) >
  166|  22.7k|			    static_cast<ptrdiff_t>(rawPacketLen))
  167|    334|			{
  168|    334|				PCPP_LOG_ERROR("Requested number of bytes to shorten is larger than total packet length");
  ------------------
  |  |  445|    334|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    334|	do                                                                                                                 \
  |  |  |  |  415|    334|	{                                                                                                                  \
  |  |  |  |  416|    334|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    334|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    334|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 334, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    334|		{                                                                                                              \
  |  |  |  |  419|    334|			auto ctx =                                                                                                 \
  |  |  |  |  420|    334|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    334|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    334|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    334|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    334|		}                                                                                                              \
  |  |  |  |  424|    334|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 334]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  169|    334|				return false;
  170|    334|			}
  171|       |
  172|  22.4k|			if (m_NextLayer != nullptr &&
  ------------------
  |  Branch (172:8): [True: 15.0k, False: 7.30k]
  ------------------
  173|  15.0k|			    static_cast<ptrdiff_t>(offsetInLayer) + static_cast<ptrdiff_t>(numOfBytesToShorten) >
  ------------------
  |  Branch (173:8): [True: 272, False: 14.8k]
  ------------------
  174|  15.0k|			        m_NextLayer->getData() - m_Data)
  175|    272|			{
  176|    272|				PCPP_LOG_ERROR("Requested number of bytes to shorten exceeds current layer's boundary");
  ------------------
  |  |  445|    272|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    272|	do                                                                                                                 \
  |  |  |  |  415|    272|	{                                                                                                                  \
  |  |  |  |  416|    272|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    272|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    272|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 272, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    272|		{                                                                                                              \
  |  |  |  |  419|    272|			auto ctx =                                                                                                 \
  |  |  |  |  420|    272|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    272|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    272|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    272|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    272|		}                                                                                                              \
  |  |  |  |  424|    272|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 272]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  177|    272|				return false;
  178|    272|			}
  179|  22.4k|		}
  180|       |
  181|  22.1k|		return Layer::shortenLayer(offsetInLayer, numOfBytesToShorten);
  182|  22.7k|	}
_ZN4pcpp19BgpOpenMessageLayer18optional_parameterC2EhRKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  189|  11.7k|	{
  190|  11.7k|		type = typeVal;
  191|  11.7k|		length = hexStringToByteArray(valueAsHexString, value, 32);
  192|  11.7k|	}
_ZN4pcpp19BgpOpenMessageLayer11isDataValidEPKhm:
  195|  14.4k|	{
  196|  14.4k|		if (data == nullptr || dataSize < sizeof(bgp_common_header))
  ------------------
  |  Branch (196:7): [True: 0, False: 14.4k]
  |  Branch (196:26): [True: 0, False: 14.4k]
  ------------------
  197|      0|		{
  198|      0|			return false;
  199|      0|		}
  200|       |
  201|  14.4k|		const auto* bgpHeader = reinterpret_cast<const bgp_common_header*>(data);
  202|  14.4k|		uint16_t messageLen = be16toh(bgpHeader->length);
  203|  14.4k|		return messageLen >= sizeof(bgp_open_message) && dataSize >= messageLen;
  ------------------
  |  Branch (203:10): [True: 13.5k, False: 922]
  |  Branch (203:52): [True: 13.5k, False: 0]
  ------------------
  204|  14.4k|	}
_ZN4pcpp19BgpOpenMessageLayer25optionalParamsToByteArrayERKNSt3__16vectorINS0_18optional_parameterENS1_9allocatorIS3_EEEEPhm:
  233|  7.04k|	{
  234|  7.04k|		if (resultByteArr == nullptr || maxByteArrSize == 0)
  ------------------
  |  Branch (234:7): [True: 0, False: 7.04k]
  |  Branch (234:35): [True: 0, False: 7.04k]
  ------------------
  235|      0|		{
  236|      0|			return 0;
  237|      0|		}
  238|       |
  239|  7.04k|		size_t dataLen = 0;
  240|       |
  241|  7.04k|		for (const auto& param : optionalParams)
  ------------------
  |  Branch (241:26): [True: 27.8k, False: 7.04k]
  ------------------
  242|  27.8k|		{
  243|  27.8k|			if (param.length > sizeof(param.value))
  ------------------
  |  Branch (243:8): [True: 4, False: 27.8k]
  ------------------
  244|      4|			{
  245|      4|				throw std::invalid_argument("Illegal BGP OPEN optional parameter length " +
  246|      4|				                            std::to_string(param.length) + ", must be " +
  247|      4|				                            std::to_string(sizeof(param.value)) + " bytes or less");
  248|      4|			}
  249|       |
  250|  27.8k|			size_t curDataSize = 2 * sizeof(uint8_t) + (size_t)param.length;
  251|       |
  252|  27.8k|			if (dataLen + curDataSize > maxByteArrSize)
  ------------------
  |  Branch (252:8): [True: 0, False: 27.8k]
  ------------------
  253|      0|			{
  254|      0|				throw std::invalid_argument("The BGP OPEN optional parameters exceed the maximum length of " +
  255|      0|				                            std::to_string(maxByteArrSize) + " bytes");
  256|      0|			}
  257|       |
  258|  27.8k|			resultByteArr[0] = param.type;
  259|  27.8k|			resultByteArr[1] = param.length;
  260|  27.8k|			if (param.length > 0)
  ------------------
  |  Branch (260:8): [True: 19.1k, False: 8.67k]
  ------------------
  261|  19.1k|			{
  262|  19.1k|				memcpy(resultByteArr + 2 * sizeof(uint8_t), param.value, param.length);
  263|  19.1k|			}
  264|       |
  265|  27.8k|			dataLen += curDataSize;
  266|  27.8k|			resultByteArr += curDataSize;
  267|  27.8k|		}
  268|       |
  269|  7.04k|		return dataLen;
  270|  7.04k|	}
_ZN4pcpp19BgpOpenMessageLayer21getOptionalParametersERNSt3__16vectorINS0_18optional_parameterENS1_9allocatorIS3_EEEE:
  284|  2.34k|	{
  285|  2.34k|		size_t headerLen = getHeaderLen();
  286|  2.34k|		bgp_open_message* msgHdr = getOpenMsgHeader();
  287|       |
  288|       |		// Parentheses around std::min avoid clashes with platform min macros (for example on Windows)
  289|  2.34k|		size_t optionalParamsLen =
  290|  2.34k|		    (std::min)(static_cast<size_t>(msgHdr->optionalParameterLength), headerLen - sizeof(bgp_open_message));
  291|       |
  292|  2.34k|		uint8_t* dataPtr = m_Data + sizeof(bgp_open_message);
  293|  2.34k|		size_t byteCount = 0;
  294|  10.4k|		while (byteCount < optionalParamsLen)
  ------------------
  |  Branch (294:10): [True: 9.85k, False: 564]
  ------------------
  295|  9.85k|		{
  296|  9.85k|			size_t remaining = optionalParamsLen - byteCount;
  297|  9.85k|			constexpr size_t optParamHdrSize = sizeof(optional_parameter::type) + sizeof(optional_parameter::length);
  298|  9.85k|			if (remaining < optParamHdrSize)
  ------------------
  |  Branch (298:8): [True: 593, False: 9.25k]
  ------------------
  299|    593|			{
  300|    593|				PCPP_LOG_ERROR("Truncated optional parameter header");
  ------------------
  |  |  445|    593|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    593|	do                                                                                                                 \
  |  |  |  |  415|    593|	{                                                                                                                  \
  |  |  |  |  416|    593|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    593|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    593|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 593, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    593|		{                                                                                                              \
  |  |  |  |  419|    593|			auto ctx =                                                                                                 \
  |  |  |  |  420|    593|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    593|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    593|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    593|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    593|		}                                                                                                              \
  |  |  |  |  424|    593|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 593]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  301|    593|				break;
  302|    593|			}
  303|       |
  304|  9.25k|			optional_parameter op;
  305|  9.25k|			op.type = dataPtr[0];
  306|  9.25k|			op.length = dataPtr[1];
  307|       |
  308|  9.25k|			size_t totalLen = optParamHdrSize + static_cast<size_t>(op.length);
  309|  9.25k|			if (totalLen > remaining)
  ------------------
  |  Branch (309:8): [True: 1.19k, False: 8.06k]
  ------------------
  310|  1.19k|			{
  311|  1.19k|				PCPP_LOG_ERROR("Optional parameter length is out of bounds: " << static_cast<int>(op.length));
  ------------------
  |  |  445|  1.19k|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|  1.19k|	do                                                                                                                 \
  |  |  |  |  415|  1.19k|	{                                                                                                                  \
  |  |  |  |  416|  1.19k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  1.19k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.19k|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 1.19k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|  1.19k|		{                                                                                                              \
  |  |  |  |  419|  1.19k|			auto ctx =                                                                                                 \
  |  |  |  |  420|  1.19k|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.19k|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|  1.19k|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|  1.19k|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|  1.19k|		}                                                                                                              \
  |  |  |  |  424|  1.19k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 1.19k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  312|  1.19k|				break;
  313|  1.19k|			}
  314|       |
  315|  8.06k|			if (op.length > 0)
  ------------------
  |  Branch (315:8): [True: 3.73k, False: 4.33k]
  ------------------
  316|  3.73k|			{
  317|  3.73k|				memcpy(op.value, dataPtr + optParamHdrSize,
  318|  3.73k|				       (std::min)(static_cast<size_t>(op.length), sizeof(op.value)));
  319|  3.73k|			}
  320|       |
  321|  8.06k|			optionalParameters.push_back(op);
  322|       |
  323|  8.06k|			byteCount += totalLen;
  324|  8.06k|			dataPtr += totalLen;
  325|  8.06k|		}
  326|  2.34k|	}
_ZN4pcpp19BgpOpenMessageLayer27getOptionalParametersLengthEv:
  329|  7.04k|	{
  330|  7.04k|		size_t headerLen = getHeaderLen();
  331|  7.04k|		bgp_open_message* msgHdr = getOpenMsgHeader();
  332|  7.04k|		auto optParamLen = static_cast<size_t>(msgHdr->optionalParameterLength);
  333|       |
  334|  7.04k|		constexpr size_t bgpOpenMsgHeaderSize = sizeof(bgp_open_message);
  335|  7.04k|		if (headerLen < optParamLen + bgpOpenMsgHeaderSize)
  ------------------
  |  Branch (335:7): [True: 990, False: 6.05k]
  ------------------
  336|    990|		{
  337|    990|			PCPP_LOG_WARN("BGP Layer optional param length exceeds total BGP message. "
  ------------------
  |  |  433|    990|#	define PCPP_LOG_WARN(message) PCPP_LOG(pcpp::LogLevel::Warn, message)
  |  |  ------------------
  |  |  |  |  414|    990|	do                                                                                                                 \
  |  |  |  |  415|    990|	{                                                                                                                  \
  |  |  |  |  416|    990|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    990|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    990|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 990, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    990|		{                                                                                                              \
  |  |  |  |  419|    990|			auto ctx =                                                                                                 \
  |  |  |  |  420|    990|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    990|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    990|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    990|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    990|		}                                                                                                              \
  |  |  |  |  424|    990|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 990]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  338|    990|			              "This packet might be malformed! Trimming to maximum allowed by BGP message length.");
  339|    990|			optParamLen = headerLen >= bgpOpenMsgHeaderSize ? headerLen - bgpOpenMsgHeaderSize : 0;
  ------------------
  |  Branch (339:18): [True: 985, False: 5]
  ------------------
  340|    990|		}
  341|       |
  342|  7.04k|		return optParamLen;
  343|  7.04k|	}
_ZN4pcpp19BgpOpenMessageLayer21setOptionalParametersERKNSt3__16vectorINS0_18optional_parameterENS1_9allocatorIS3_EEEE:
  346|  7.04k|	{
  347|  7.04k|		uint8_t newOptionalParamsData[maxOptionalParamsDataLen];
  348|  7.04k|		size_t newOptionalParamsDataLen = 0;
  349|  7.04k|		try
  350|  7.04k|		{
  351|  7.04k|			newOptionalParamsDataLen =
  352|  7.04k|			    optionalParamsToByteArray(optionalParameters, newOptionalParamsData, sizeof(newOptionalParamsData));
  353|  7.04k|		}
  354|  7.04k|		catch (const std::invalid_argument& e)
  355|  7.04k|		{
  356|      4|			PCPP_LOG_ERROR("Couldn't set the BGP OPEN optional parameters: " << e.what());
  ------------------
  |  |  445|      4|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      4|	do                                                                                                                 \
  |  |  |  |  415|      4|	{                                                                                                                  \
  |  |  |  |  416|      4|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      4|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      4|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 4, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      4|		{                                                                                                              \
  |  |  |  |  419|      4|			auto ctx =                                                                                                 \
  |  |  |  |  420|      4|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      4|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      4|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      4|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      4|		}                                                                                                              \
  |  |  |  |  424|      4|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 4]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  357|      4|			return false;
  358|      4|		}
  359|       |
  360|  7.04k|		size_t curOptionalParamsDataLen = getOptionalParametersLength();
  361|  7.04k|		constexpr int offsetInLayer = sizeof(bgp_open_message);
  362|       |
  363|  7.04k|		if (newOptionalParamsDataLen > curOptionalParamsDataLen)
  ------------------
  |  Branch (363:7): [True: 3.43k, False: 3.61k]
  ------------------
  364|  3.43k|		{
  365|  3.43k|			size_t numOfBytesToExtend = newOptionalParamsDataLen - curOptionalParamsDataLen;
  366|       |
  367|  3.43k|			if (!extendLayer(offsetInLayer, numOfBytesToExtend))
  ------------------
  |  Branch (367:8): [True: 14, False: 3.41k]
  ------------------
  368|     14|			{
  369|     14|				PCPP_LOG_ERROR("Couldn't extend BGP open layer to include the additional optional parameters");
  ------------------
  |  |  445|     14|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|     14|	do                                                                                                                 \
  |  |  |  |  415|     14|	{                                                                                                                  \
  |  |  |  |  416|     14|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|     14|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|     14|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 14, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|     14|		{                                                                                                              \
  |  |  |  |  419|     14|			auto ctx =                                                                                                 \
  |  |  |  |  420|     14|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|     14|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|     14|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|     14|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|     14|		}                                                                                                              \
  |  |  |  |  424|     14|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 14]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  370|     14|				return false;
  371|     14|			}
  372|  3.43k|		}
  373|  3.61k|		else if (newOptionalParamsDataLen < curOptionalParamsDataLen)
  ------------------
  |  Branch (373:12): [True: 3.28k, False: 327]
  ------------------
  374|  3.28k|		{
  375|  3.28k|			size_t numOfBytesToShorten = curOptionalParamsDataLen - newOptionalParamsDataLen;
  376|       |
  377|  3.28k|			if (!shortenLayer(offsetInLayer, numOfBytesToShorten))
  ------------------
  |  Branch (377:8): [True: 301, False: 2.98k]
  ------------------
  378|    301|			{
  379|    301|				PCPP_LOG_ERROR("Couldn't shorten BGP open layer to set the right size of the optional parameters data");
  ------------------
  |  |  445|    301|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    301|	do                                                                                                                 \
  |  |  |  |  415|    301|	{                                                                                                                  \
  |  |  |  |  416|    301|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    301|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    301|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 301, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    301|		{                                                                                                              \
  |  |  |  |  419|    301|			auto ctx =                                                                                                 \
  |  |  |  |  420|    301|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    301|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    301|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    301|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    301|		}                                                                                                              \
  |  |  |  |  424|    301|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 301]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  380|    301|				return false;
  381|    301|			}
  382|  3.28k|		}
  383|       |
  384|  6.72k|		if (newOptionalParamsDataLen > 0)
  ------------------
  |  Branch (384:7): [True: 4.20k, False: 2.52k]
  ------------------
  385|  4.20k|		{
  386|  4.20k|			memcpy(m_Data + offsetInLayer, newOptionalParamsData, newOptionalParamsDataLen);
  387|  4.20k|		}
  388|       |
  389|  6.72k|		getOpenMsgHeader()->optionalParameterLength = static_cast<uint8_t>(newOptionalParamsDataLen);
  390|  6.72k|		getOpenMsgHeader()->length = htobe16(sizeof(bgp_open_message) + newOptionalParamsDataLen);
  391|       |
  392|  6.72k|		return true;
  393|  7.04k|	}
_ZN4pcpp19BgpOpenMessageLayer23clearOptionalParametersEv:
  396|  2.34k|	{
  397|  2.34k|		return setOptionalParameters(std::vector<optional_parameter>());
  398|  2.34k|	}
_ZN4pcpp21BgpUpdateMessageLayer14path_attributeC2EhhRKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  406|  16.0k|	{
  407|  16.0k|		flags = flagsVal;
  408|  16.0k|		type = typeVal;
  409|  16.0k|		length = hexStringToByteArray(dataAsHexString, data, 32);
  410|  16.0k|	}
_ZN4pcpp21BgpUpdateMessageLayer20parsePrefixAndIPDataEPhmRNSt3__16vectorINS0_13prefix_and_ipENS2_9allocatorIS4_EEEE:
  461|  4.86k|	{
  462|  4.86k|		size_t byteCount = 0;
  463|  7.86k|		while (byteCount < dataLen)
  ------------------
  |  Branch (463:10): [True: 6.54k, False: 1.32k]
  ------------------
  464|  6.54k|		{
  465|  6.54k|			prefix_and_ip wr;
  466|  6.54k|			wr.prefix = dataPtr[0];
  467|  6.54k|			size_t curByteCount = 1;
  468|  6.54k|			if (wr.prefix == 32)
  ------------------
  |  Branch (468:8): [True: 2.52k, False: 4.01k]
  ------------------
  469|  2.52k|			{
  470|  2.52k|				uint8_t octets[4] = { dataPtr[1], dataPtr[2], dataPtr[3], dataPtr[4] };
  471|  2.52k|				wr.ipAddr = IPv4Address(octets);
  472|  2.52k|				curByteCount += 4;
  473|  2.52k|			}
  474|  4.01k|			else if (wr.prefix == 24)
  ------------------
  |  Branch (474:13): [True: 1, False: 4.01k]
  ------------------
  475|      1|			{
  476|      1|				uint8_t octets[4] = { dataPtr[1], dataPtr[2], dataPtr[3], 0 };
  477|      1|				wr.ipAddr = IPv4Address(octets);
  478|      1|				curByteCount += 3;
  479|      1|			}
  480|  4.01k|			else if (wr.prefix == 16)
  ------------------
  |  Branch (480:13): [True: 0, False: 4.01k]
  ------------------
  481|      0|			{
  482|      0|				uint8_t octets[4] = { dataPtr[1], dataPtr[2], 0, 0 };
  483|      0|				wr.ipAddr = IPv4Address(octets);
  484|      0|				curByteCount += 2;
  485|      0|			}
  486|  4.01k|			else if (wr.prefix == 8)
  ------------------
  |  Branch (486:13): [True: 479, False: 3.53k]
  ------------------
  487|    479|			{
  488|    479|				uint8_t octets[4] = { dataPtr[1], 0, 0, 0 };
  489|    479|				wr.ipAddr = IPv4Address(octets);
  490|    479|				curByteCount += 1;
  491|    479|			}
  492|  3.53k|			else
  493|  3.53k|			{
  494|  3.53k|				PCPP_LOG_DEBUG("Illegal prefix value " << (int)wr.prefix);
  ------------------
  |  |  427|  3.53k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  3.53k|	do                                                                                                                 \
  |  |  |  |  415|  3.53k|	{                                                                                                                  \
  |  |  |  |  416|  3.53k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  3.53k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  3.53k|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 3.53k]
  |  |  |  |  ------------------
  |  |  |  |  418|  3.53k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  3.53k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 3.53k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  495|  3.53k|				break;  // illegal value
  496|  3.53k|			}
  497|       |
  498|  3.00k|			result.push_back(wr);
  499|  3.00k|			dataPtr += curByteCount;
  500|  3.00k|			byteCount += curByteCount;
  501|  3.00k|		}
  502|  4.86k|	}
_ZN4pcpp21BgpUpdateMessageLayer26prefixAndIPDataToByteArrayERKNSt3__16vectorINS0_13prefix_and_ipENS1_9allocatorIS3_EEEEPhm:
  506|  32.0k|	{
  507|  32.0k|		if (resultByteArr == nullptr || maxByteArrSize == 0)
  ------------------
  |  Branch (507:7): [True: 0, False: 32.0k]
  |  Branch (507:35): [True: 0, False: 32.0k]
  ------------------
  508|      0|		{
  509|      0|			return 0;
  510|      0|		}
  511|       |
  512|  32.0k|		size_t dataLen = 0;
  513|       |
  514|  32.0k|		for (const auto& prefixAndIp : prefixAndIpData)
  ------------------
  |  Branch (514:32): [True: 32.7k, False: 32.0k]
  ------------------
  515|  32.7k|		{
  516|  32.7k|			uint8_t curData[5];
  517|  32.7k|			curData[0] = prefixAndIp.prefix;
  518|  32.7k|			size_t curDataSize = 1;
  519|  32.7k|			const uint8_t* octets = prefixAndIp.ipAddr.toBytes();
  520|  32.7k|			if (prefixAndIp.prefix == 32)
  ------------------
  |  Branch (520:8): [True: 5.04k, False: 27.6k]
  ------------------
  521|  5.04k|			{
  522|  5.04k|				curDataSize += 4;
  523|  5.04k|				curData[1] = octets[0];
  524|  5.04k|				curData[2] = octets[1];
  525|  5.04k|				curData[3] = octets[2];
  526|  5.04k|				curData[4] = octets[3];
  527|  5.04k|			}
  528|  27.6k|			else if (prefixAndIp.prefix == 24)
  ------------------
  |  Branch (528:13): [True: 21.3k, False: 6.29k]
  ------------------
  529|  21.3k|			{
  530|  21.3k|				curDataSize += 3;
  531|  21.3k|				curData[1] = octets[0];
  532|  21.3k|				curData[2] = octets[1];
  533|  21.3k|				curData[3] = octets[2];
  534|  21.3k|			}
  535|  6.29k|			else if (prefixAndIp.prefix == 16)
  ------------------
  |  Branch (535:13): [True: 5.33k, False: 958]
  ------------------
  536|  5.33k|			{
  537|  5.33k|				curDataSize += 2;
  538|  5.33k|				curData[1] = octets[0];
  539|  5.33k|				curData[2] = octets[1];
  540|  5.33k|			}
  541|    958|			else if (prefixAndIp.prefix == 8)
  ------------------
  |  Branch (541:13): [True: 958, False: 0]
  ------------------
  542|    958|			{
  543|    958|				curDataSize += 1;
  544|    958|				curData[1] = octets[0];
  545|    958|			}
  546|      0|			else
  547|      0|			{
  548|      0|				PCPP_LOG_ERROR("Illegal prefix value " << (int)prefixAndIp.prefix);
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  549|      0|				break;  // illegal value
  550|      0|			}
  551|       |
  552|  32.7k|			if (dataLen + curDataSize > maxByteArrSize)
  ------------------
  |  Branch (552:8): [True: 0, False: 32.7k]
  ------------------
  553|      0|			{
  554|      0|				break;
  555|      0|			}
  556|       |
  557|  32.7k|			dataLen += curDataSize;
  558|       |
  559|  32.7k|			memcpy(resultByteArr, curData, curDataSize);
  560|  32.7k|			resultByteArr += curDataSize;
  561|  32.7k|		}
  562|       |
  563|  32.0k|		return dataLen;
  564|  32.0k|	}
_ZN4pcpp21BgpUpdateMessageLayer25pathAttributesToByteArrayERKNSt3__16vectorINS0_14path_attributeENS1_9allocatorIS3_EEEEPhm:
  568|  16.0k|	{
  569|  16.0k|		if (resultByteArr == nullptr || maxByteArrSize == 0)
  ------------------
  |  Branch (569:7): [True: 0, False: 16.0k]
  |  Branch (569:35): [True: 0, False: 16.0k]
  ------------------
  570|      0|		{
  571|      0|			return 0;
  572|      0|		}
  573|       |
  574|  16.0k|		size_t dataLen = 0;
  575|       |
  576|  16.0k|		for (const auto& attribute : pathAttributes)
  ------------------
  |  Branch (576:30): [True: 46.2k, False: 10.7k]
  ------------------
  577|  46.2k|		{
  578|  46.2k|			if (attribute.length > 32)
  ------------------
  |  Branch (578:8): [True: 5.22k, False: 41.0k]
  ------------------
  579|  5.22k|			{
  580|  5.22k|				PCPP_LOG_ERROR("Illegal path attribute length " << (int)attribute.length);
  ------------------
  |  |  445|  5.22k|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|  5.22k|	do                                                                                                                 \
  |  |  |  |  415|  5.22k|	{                                                                                                                  \
  |  |  |  |  416|  5.22k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  5.22k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  5.22k|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 5.22k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|  5.22k|		{                                                                                                              \
  |  |  |  |  419|  5.22k|			auto ctx =                                                                                                 \
  |  |  |  |  420|  5.22k|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  5.22k|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|  5.22k|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|  5.22k|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|  5.22k|		}                                                                                                              \
  |  |  |  |  424|  5.22k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 5.22k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  581|  5.22k|				break;  // illegal value
  582|  5.22k|			}
  583|       |
  584|  41.0k|			size_t curDataSize = 3 * sizeof(uint8_t) + (size_t)attribute.length;
  585|       |
  586|  41.0k|			if (dataLen + curDataSize > maxByteArrSize)
  ------------------
  |  Branch (586:8): [True: 0, False: 41.0k]
  ------------------
  587|      0|			{
  588|      0|				break;
  589|      0|			}
  590|       |
  591|  41.0k|			resultByteArr[0] = attribute.flags;
  592|  41.0k|			resultByteArr[1] = attribute.type;
  593|  41.0k|			resultByteArr[2] = attribute.length;
  594|  41.0k|			if (attribute.length > 0)
  ------------------
  |  Branch (594:8): [True: 28.2k, False: 12.8k]
  ------------------
  595|  28.2k|			{
  596|  28.2k|				memcpy(resultByteArr + 3 * sizeof(uint8_t), attribute.data, attribute.length);
  597|  28.2k|			}
  598|       |
  599|  41.0k|			dataLen += curDataSize;
  600|  41.0k|			resultByteArr += curDataSize;
  601|  41.0k|		}
  602|       |
  603|  16.0k|		return dataLen;
  604|  16.0k|	}
_ZNK4pcpp21BgpUpdateMessageLayer24getWithdrawnRoutesLengthEv:
  607|   136k|	{
  608|   136k|		size_t headerLen = getHeaderLen();
  609|   136k|		size_t minLen = sizeof(bgp_common_header) + sizeof(uint16_t);
  610|   136k|		if (headerLen >= minLen)
  ------------------
  |  Branch (610:7): [True: 135k, False: 746]
  ------------------
  611|   135k|		{
  612|   135k|			uint16_t res = be16toh(*(uint16_t*)(m_Data + sizeof(bgp_common_header)));
  613|   135k|			if ((size_t)res > headerLen - minLen)
  ------------------
  |  Branch (613:8): [True: 3.63k, False: 132k]
  ------------------
  614|  3.63k|			{
  615|  3.63k|				return headerLen - minLen;
  616|  3.63k|			}
  617|       |
  618|   132k|			return (size_t)res;
  619|   135k|		}
  620|       |
  621|    746|		return 0;
  622|   136k|	}
_ZN4pcpp21BgpUpdateMessageLayer18getWithdrawnRoutesERNSt3__16vectorINS0_13prefix_and_ipENS1_9allocatorIS3_EEEE:
  625|  5.33k|	{
  626|  5.33k|		size_t withdrawnRouteLen = getWithdrawnRoutesLength();
  627|  5.33k|		if (withdrawnRouteLen == 0)
  ------------------
  |  Branch (627:7): [True: 3.78k, False: 1.55k]
  ------------------
  628|  3.78k|		{
  629|  3.78k|			return;
  630|  3.78k|		}
  631|       |
  632|  1.55k|		uint8_t* dataPtr = m_Data + sizeof(bgp_common_header) + sizeof(uint16_t);
  633|  1.55k|		parsePrefixAndIPData(dataPtr, withdrawnRouteLen, withdrawnRoutes);
  634|  1.55k|	}
_ZNK4pcpp21BgpUpdateMessageLayer23getPathAttributesLengthEv:
  637|  60.0k|	{
  638|  60.0k|		size_t headerLen = getHeaderLen();
  639|  60.0k|		size_t minLen = sizeof(bgp_common_header) + 2 * sizeof(uint16_t);
  640|  60.0k|		if (headerLen >= minLen)
  ------------------
  |  Branch (640:7): [True: 56.6k, False: 3.43k]
  ------------------
  641|  56.6k|		{
  642|  56.6k|			size_t withdrawnRouteLen = getWithdrawnRoutesLength();
  643|       |			// Ensure the memory access is within bounds
  644|  56.6k|			if (sizeof(bgp_common_header) + sizeof(uint16_t) + withdrawnRouteLen + sizeof(uint16_t) > headerLen)
  ------------------
  |  Branch (644:8): [True: 1.97k, False: 54.6k]
  ------------------
  645|  1.97k|			{
  646|  1.97k|				return 0;  // Invalid access, return 0
  647|  1.97k|			}
  648|  54.6k|			uint16_t res =
  649|  54.6k|			    be16toh(*(uint16_t*)(m_Data + sizeof(bgp_common_header) + sizeof(uint16_t) + withdrawnRouteLen));
  650|  54.6k|			if ((size_t)res > headerLen - minLen - withdrawnRouteLen)
  ------------------
  |  Branch (650:8): [True: 3.58k, False: 51.0k]
  ------------------
  651|  3.58k|			{
  652|  3.58k|				return headerLen - minLen - withdrawnRouteLen;
  653|  3.58k|			}
  654|       |
  655|  51.0k|			return (size_t)res;
  656|  54.6k|		}
  657|       |
  658|  3.43k|		return 0;
  659|  60.0k|	}
_ZN4pcpp21BgpUpdateMessageLayer18setWithdrawnRoutesERKNSt3__16vectorINS0_13prefix_and_ipENS1_9allocatorIS3_EEEE:
  662|  16.0k|	{
  663|  16.0k|		uint8_t newWithdrawnRoutesData[1500];
  664|  16.0k|		size_t newWithdrawnRoutesDataLen = prefixAndIPDataToByteArray(withdrawnRoutes, newWithdrawnRoutesData, 1500);
  665|  16.0k|		size_t curWithdrawnRoutesDataLen = getWithdrawnRoutesLength();
  666|  16.0k|		int offsetInLayer = sizeof(bgp_common_header) + sizeof(uint16_t);
  667|       |
  668|  16.0k|		if (newWithdrawnRoutesDataLen > curWithdrawnRoutesDataLen)
  ------------------
  |  Branch (668:7): [True: 5.00k, False: 11.0k]
  ------------------
  669|  5.00k|		{
  670|  5.00k|			size_t numOfBytesToExtend = newWithdrawnRoutesDataLen - curWithdrawnRoutesDataLen;
  671|       |
  672|  5.00k|			if (!extendLayer(offsetInLayer, numOfBytesToExtend))
  ------------------
  |  Branch (672:8): [True: 63, False: 4.94k]
  ------------------
  673|     63|			{
  674|     63|				PCPP_LOG_ERROR("Couldn't extend BGP update layer to include the additional withdrawn routes");
  ------------------
  |  |  445|     63|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|     63|	do                                                                                                                 \
  |  |  |  |  415|     63|	{                                                                                                                  \
  |  |  |  |  416|     63|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|     63|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|     63|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 63, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|     63|		{                                                                                                              \
  |  |  |  |  419|     63|			auto ctx =                                                                                                 \
  |  |  |  |  420|     63|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|     63|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|     63|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|     63|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|     63|		}                                                                                                              \
  |  |  |  |  424|     63|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 63]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  675|     63|				return false;
  676|     63|			}
  677|  5.00k|		}
  678|  11.0k|		else if (newWithdrawnRoutesDataLen < curWithdrawnRoutesDataLen)
  ------------------
  |  Branch (678:12): [True: 6.08k, False: 4.92k]
  ------------------
  679|  6.08k|		{
  680|  6.08k|			size_t numOfBytesToShorten = curWithdrawnRoutesDataLen - newWithdrawnRoutesDataLen;
  681|       |
  682|  6.08k|			if (!shortenLayer(offsetInLayer, numOfBytesToShorten))
  ------------------
  |  Branch (682:8): [True: 566, False: 5.51k]
  ------------------
  683|    566|			{
  684|    566|				PCPP_LOG_ERROR("Couldn't shorten BGP update layer to set the right size of the withdrawn routes data");
  ------------------
  |  |  445|    566|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    566|	do                                                                                                                 \
  |  |  |  |  415|    566|	{                                                                                                                  \
  |  |  |  |  416|    566|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    566|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    566|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 566, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    566|		{                                                                                                              \
  |  |  |  |  419|    566|			auto ctx =                                                                                                 \
  |  |  |  |  420|    566|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    566|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    566|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    566|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    566|		}                                                                                                              \
  |  |  |  |  424|    566|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 566]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  685|    566|				return false;
  686|    566|			}
  687|  6.08k|		}
  688|       |
  689|  15.3k|		if (newWithdrawnRoutesDataLen > 0)
  ------------------
  |  Branch (689:7): [True: 5.42k, False: 9.96k]
  ------------------
  690|  5.42k|		{
  691|  5.42k|			memcpy(m_Data + offsetInLayer, newWithdrawnRoutesData, newWithdrawnRoutesDataLen);
  692|  5.42k|		}
  693|       |
  694|  15.3k|		getBasicHeader()->length =
  695|  15.3k|		    htobe16(be16toh(getBasicHeader()->length) + newWithdrawnRoutesDataLen - curWithdrawnRoutesDataLen);
  696|       |
  697|  15.3k|		uint16_t newWithdrawnRoutesDataLenBE = htobe16(newWithdrawnRoutesDataLen);
  698|  15.3k|		memcpy(m_Data + sizeof(bgp_common_header), &newWithdrawnRoutesDataLenBE, sizeof(uint16_t));
  699|       |
  700|  15.3k|		return true;
  701|  16.0k|	}
_ZN4pcpp21BgpUpdateMessageLayer20clearWithdrawnRoutesEv:
  704|  5.33k|	{
  705|  5.33k|		return setWithdrawnRoutes(std::vector<prefix_and_ip>());
  706|  5.33k|	}
_ZN4pcpp21BgpUpdateMessageLayer17getPathAttributesERNSt3__16vectorINS0_14path_attributeENS1_9allocatorIS3_EEEE:
  709|  5.33k|	{
  710|  5.33k|		size_t pathAttrLen = getPathAttributesLength();
  711|  5.33k|		if (pathAttrLen == 0)
  ------------------
  |  Branch (711:7): [True: 1.59k, False: 3.74k]
  ------------------
  712|  1.59k|		{
  713|  1.59k|			return;
  714|  1.59k|		}
  715|       |
  716|  3.74k|		uint8_t* dataPtr = m_Data + sizeof(bgp_common_header) + 2 * sizeof(uint16_t) + getWithdrawnRoutesLength();
  717|  3.74k|		size_t byteCount = 0;
  718|  23.8k|		while (byteCount < pathAttrLen)
  ------------------
  |  Branch (718:10): [True: 20.1k, False: 3.74k]
  ------------------
  719|  20.1k|		{
  720|  20.1k|			path_attribute pa;
  721|  20.1k|			pa.flags = dataPtr[0];
  722|  20.1k|			pa.type = dataPtr[1];
  723|  20.1k|			pa.length = dataPtr[2];
  724|  20.1k|			size_t curByteCount = 3 + pa.length;
  725|  20.1k|			if (pa.length > 0)
  ------------------
  |  Branch (725:8): [True: 13.2k, False: 6.92k]
  ------------------
  726|  13.2k|			{
  727|  13.2k|				size_t dataLenToCopy = (pa.length <= 32 ? pa.length : 32);
  ------------------
  |  Branch (727:29): [True: 10.2k, False: 2.95k]
  ------------------
  728|  13.2k|				memcpy(pa.data, dataPtr + 3, dataLenToCopy);
  729|  13.2k|			}
  730|       |
  731|  20.1k|			pathAttributes.push_back(pa);
  732|  20.1k|			dataPtr += curByteCount;
  733|  20.1k|			byteCount += curByteCount;
  734|  20.1k|		}
  735|  3.74k|	}
_ZN4pcpp21BgpUpdateMessageLayer17setPathAttributesERKNSt3__16vectorINS0_14path_attributeENS1_9allocatorIS3_EEEE:
  738|  16.0k|	{
  739|  16.0k|		uint8_t newPathAttributesData[1500];
  740|  16.0k|		size_t newPathAttributesDataLen = pathAttributesToByteArray(pathAttributes, newPathAttributesData, 1500);
  741|  16.0k|		size_t curPathAttributesDataLen = getPathAttributesLength();
  742|  16.0k|		size_t curWithdrawnRoutesDataLen = getWithdrawnRoutesLength();
  743|  16.0k|		int offsetInLayer = sizeof(bgp_common_header) + 2 * sizeof(uint16_t) + curWithdrawnRoutesDataLen;
  744|       |
  745|  16.0k|		if (newPathAttributesDataLen > curPathAttributesDataLen)
  ------------------
  |  Branch (745:7): [True: 6.34k, False: 9.67k]
  ------------------
  746|  6.34k|		{
  747|  6.34k|			size_t numOfBytesToExtend = newPathAttributesDataLen - curPathAttributesDataLen;
  748|       |
  749|  6.34k|			if (!extendLayer(offsetInLayer, numOfBytesToExtend))
  ------------------
  |  Branch (749:8): [True: 700, False: 5.64k]
  ------------------
  750|    700|			{
  751|    700|				PCPP_LOG_ERROR("Couldn't extend BGP update layer to include the additional path attributes");
  ------------------
  |  |  445|    700|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    700|	do                                                                                                                 \
  |  |  |  |  415|    700|	{                                                                                                                  \
  |  |  |  |  416|    700|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    700|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    700|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 700, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    700|		{                                                                                                              \
  |  |  |  |  419|    700|			auto ctx =                                                                                                 \
  |  |  |  |  420|    700|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    700|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    700|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    700|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    700|		}                                                                                                              \
  |  |  |  |  424|    700|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 700]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  752|    700|				return false;
  753|    700|			}
  754|  6.34k|		}
  755|  9.67k|		else if (newPathAttributesDataLen < curPathAttributesDataLen)
  ------------------
  |  Branch (755:12): [True: 7.17k, False: 2.49k]
  ------------------
  756|  7.17k|		{
  757|  7.17k|			size_t numOfBytesToShorten = curPathAttributesDataLen - newPathAttributesDataLen;
  758|       |
  759|  7.17k|			if (!shortenLayer(offsetInLayer, numOfBytesToShorten))
  ------------------
  |  Branch (759:8): [True: 53, False: 7.11k]
  ------------------
  760|     53|			{
  761|     53|				PCPP_LOG_ERROR("Couldn't shorten BGP update layer to set the right size of the path attributes data");
  ------------------
  |  |  445|     53|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|     53|	do                                                                                                                 \
  |  |  |  |  415|     53|	{                                                                                                                  \
  |  |  |  |  416|     53|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|     53|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|     53|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 53, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|     53|		{                                                                                                              \
  |  |  |  |  419|     53|			auto ctx =                                                                                                 \
  |  |  |  |  420|     53|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|     53|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|     53|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|     53|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|     53|		}                                                                                                              \
  |  |  |  |  424|     53|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 53]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  762|     53|				return false;
  763|     53|			}
  764|  7.17k|		}
  765|       |
  766|  15.2k|		if (newPathAttributesDataLen > 0)
  ------------------
  |  Branch (766:7): [True: 8.12k, False: 7.13k]
  ------------------
  767|  8.12k|		{
  768|  8.12k|			memcpy(m_Data + offsetInLayer, newPathAttributesData, newPathAttributesDataLen);
  769|  8.12k|		}
  770|       |
  771|  15.2k|		getBasicHeader()->length =
  772|  15.2k|		    htobe16(be16toh(getBasicHeader()->length) + newPathAttributesDataLen - curPathAttributesDataLen);
  773|       |
  774|  15.2k|		uint16_t newWithdrawnRoutesDataLenBE = htobe16(newPathAttributesDataLen);
  775|  15.2k|		memcpy(m_Data + sizeof(bgp_common_header) + sizeof(uint16_t) + curWithdrawnRoutesDataLen,
  776|  15.2k|		       &newWithdrawnRoutesDataLenBE, sizeof(uint16_t));
  777|       |
  778|  15.2k|		return true;
  779|  16.0k|	}
_ZN4pcpp21BgpUpdateMessageLayer19clearPathAttributesEv:
  782|  5.33k|	{
  783|  5.33k|		return setPathAttributes(std::vector<path_attribute>());
  784|  5.33k|	}
_ZNK4pcpp21BgpUpdateMessageLayer37getNetworkLayerReachabilityInfoLengthEv:
  787|  21.3k|	{
  788|  21.3k|		size_t headerLen = getHeaderLen();
  789|  21.3k|		size_t minLen = sizeof(bgp_common_header) + 2 * sizeof(uint16_t);
  790|  21.3k|		if (headerLen >= minLen)
  ------------------
  |  Branch (790:7): [True: 19.3k, False: 1.97k]
  ------------------
  791|  19.3k|		{
  792|  19.3k|			size_t withdrawnRouteLen = getWithdrawnRoutesLength();
  793|  19.3k|			size_t pathAttrLen = getPathAttributesLength();
  794|  19.3k|			int nlriSize = headerLen - minLen - withdrawnRouteLen - pathAttrLen;
  795|  19.3k|			if (nlriSize >= 0)
  ------------------
  |  Branch (795:8): [True: 18.6k, False: 716]
  ------------------
  796|  18.6k|			{
  797|  18.6k|				return (size_t)nlriSize;
  798|  18.6k|			}
  799|       |
  800|    716|			return 0;
  801|  19.3k|		}
  802|       |
  803|  1.97k|		return 0;
  804|  21.3k|	}
_ZN4pcpp21BgpUpdateMessageLayer31getNetworkLayerReachabilityInfoERNSt3__16vectorINS0_13prefix_and_ipENS1_9allocatorIS3_EEEE:
  807|  5.33k|	{
  808|  5.33k|		size_t nlriSize = getNetworkLayerReachabilityInfoLength();
  809|  5.33k|		if (nlriSize == 0)
  ------------------
  |  Branch (809:7): [True: 2.03k, False: 3.30k]
  ------------------
  810|  2.03k|		{
  811|  2.03k|			return;
  812|  2.03k|		}
  813|       |
  814|  3.30k|		uint8_t* dataPtr = m_Data + sizeof(bgp_common_header) + 2 * sizeof(uint16_t) + getWithdrawnRoutesLength() +
  815|  3.30k|		                   getPathAttributesLength();
  816|  3.30k|		parsePrefixAndIPData(dataPtr, nlriSize, nlri);
  817|  3.30k|	}
_ZN4pcpp21BgpUpdateMessageLayer11isDataValidEPKhm:
  820|  40.7k|	{
  821|  40.7k|		if (dataSize < sizeof(bgp_common_header) + 2 * sizeof(uint16_t))
  ------------------
  |  Branch (821:7): [True: 0, False: 40.7k]
  ------------------
  822|      0|			return false;
  823|       |
  824|  40.7k|		uint16_t withdrLen = be16toh(*(uint16_t*)(data + sizeof(bgp_common_header)));
  825|  40.7k|		if (dataSize < sizeof(bgp_common_header) + 2 * sizeof(uint16_t) + withdrLen)
  ------------------
  |  Branch (825:7): [True: 29, False: 40.6k]
  ------------------
  826|     29|			return false;
  827|       |
  828|  40.6k|		uint16_t attrLen = be16toh(*(uint16_t*)(data + sizeof(bgp_common_header) + sizeof(uint16_t) + withdrLen));
  829|  40.6k|		if (dataSize < sizeof(bgp_common_header) + 2 * sizeof(uint16_t) + withdrLen + attrLen)
  ------------------
  |  Branch (829:7): [True: 118, False: 40.5k]
  ------------------
  830|    118|			return false;
  831|       |
  832|  40.5k|		return true;
  833|  40.6k|	}
_ZN4pcpp21BgpUpdateMessageLayer31setNetworkLayerReachabilityInfoERKNSt3__16vectorINS0_13prefix_and_ipENS1_9allocatorIS3_EEEE:
  836|  16.0k|	{
  837|  16.0k|		uint8_t newNlriData[1500];
  838|  16.0k|		size_t newNlriDataLen = prefixAndIPDataToByteArray(nlri, newNlriData, 1500);
  839|  16.0k|		size_t curNlriDataLen = getNetworkLayerReachabilityInfoLength();
  840|  16.0k|		size_t curPathAttributesDataLen = getPathAttributesLength();
  841|  16.0k|		size_t curWithdrawnRoutesDataLen = getWithdrawnRoutesLength();
  842|  16.0k|		int offsetInLayer =
  843|  16.0k|		    sizeof(bgp_common_header) + 2 * sizeof(uint16_t) + curWithdrawnRoutesDataLen + curPathAttributesDataLen;
  844|       |
  845|  16.0k|		if (newNlriDataLen > curNlriDataLen)
  ------------------
  |  Branch (845:7): [True: 4.56k, False: 11.4k]
  ------------------
  846|  4.56k|		{
  847|  4.56k|			size_t numOfBytesToExtend = newNlriDataLen - curNlriDataLen;
  848|       |
  849|  4.56k|			if (!extendLayer(offsetInLayer, numOfBytesToExtend))
  ------------------
  |  Branch (849:8): [True: 689, False: 3.87k]
  ------------------
  850|    689|			{
  851|    689|				PCPP_LOG_ERROR("Couldn't extend BGP update layer to include the additional NLRI data");
  ------------------
  |  |  445|    689|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    689|	do                                                                                                                 \
  |  |  |  |  415|    689|	{                                                                                                                  \
  |  |  |  |  416|    689|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    689|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    689|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 689, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    689|		{                                                                                                              \
  |  |  |  |  419|    689|			auto ctx =                                                                                                 \
  |  |  |  |  420|    689|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    689|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    689|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    689|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    689|		}                                                                                                              \
  |  |  |  |  424|    689|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 689]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  852|    689|				return false;
  853|    689|			}
  854|  4.56k|		}
  855|  11.4k|		else if (newNlriDataLen < curNlriDataLen)
  ------------------
  |  Branch (855:12): [True: 6.19k, False: 5.26k]
  ------------------
  856|  6.19k|		{
  857|  6.19k|			size_t numOfBytesToShorten = curNlriDataLen - newNlriDataLen;
  858|       |
  859|  6.19k|			if (!shortenLayer(offsetInLayer, numOfBytesToShorten))
  ------------------
  |  Branch (859:8): [True: 18, False: 6.17k]
  ------------------
  860|     18|			{
  861|     18|				PCPP_LOG_ERROR("Couldn't shorten BGP update layer to set the right size of the NLRI data");
  ------------------
  |  |  445|     18|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|     18|	do                                                                                                                 \
  |  |  |  |  415|     18|	{                                                                                                                  \
  |  |  |  |  416|     18|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|     18|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|     18|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 18, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|     18|		{                                                                                                              \
  |  |  |  |  419|     18|			auto ctx =                                                                                                 \
  |  |  |  |  420|     18|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|     18|#define LOG_MODULE PacketLogModuleBgpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|     18|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|     18|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|     18|		}                                                                                                              \
  |  |  |  |  424|     18|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 18]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  862|     18|				return false;
  863|     18|			}
  864|  6.19k|		}
  865|       |
  866|  15.3k|		if (newNlriDataLen > 0)
  ------------------
  |  Branch (866:7): [True: 6.13k, False: 9.17k]
  ------------------
  867|  6.13k|		{
  868|  6.13k|			memcpy(m_Data + offsetInLayer, newNlriData, newNlriDataLen);
  869|  6.13k|		}
  870|       |
  871|  15.3k|		getBasicHeader()->length = htobe16(be16toh(getBasicHeader()->length) + newNlriDataLen - curNlriDataLen);
  872|       |
  873|  15.3k|		return true;
  874|  16.0k|	}
_ZN4pcpp21BgpUpdateMessageLayer33clearNetworkLayerReachabilityInfoEv:
  877|  5.33k|	{
  878|  5.33k|		return setNetworkLayerReachabilityInfo(std::vector<prefix_and_ip>());
  879|  5.33k|	}
_ZNK4pcpp27BgpNotificationMessageLayer22getNotificationDataLenEv:
  927|    200|	{
  928|    200|		size_t headerLen = getHeaderLen();
  929|    200|		if (headerLen > sizeof(bgp_notification_message))
  ------------------
  |  Branch (929:7): [True: 192, False: 8]
  ------------------
  930|    192|		{
  931|    192|			return headerLen - sizeof(bgp_notification_message);
  932|    192|		}
  933|       |
  934|      8|		return 0;
  935|    200|	}
_ZNK4pcpp27BgpNotificationMessageLayer19getNotificationDataEv:
  938|    104|	{
  939|    104|		if (getNotificationDataLen() > 0)
  ------------------
  |  Branch (939:7): [True: 96, False: 8]
  ------------------
  940|     96|		{
  941|     96|			return m_Data + sizeof(bgp_notification_message);
  942|     96|		}
  943|       |
  944|      8|		return nullptr;
  945|    104|	}
_ZNK4pcpp27BgpNotificationMessageLayer30getNotificationDataAsHexStringEv:
  948|    104|	{
  949|    104|		uint8_t* notificationData = getNotificationData();
  950|    104|		if (notificationData == nullptr)
  ------------------
  |  Branch (950:7): [True: 8, False: 96]
  ------------------
  951|      8|		{
  952|      8|			return "";
  953|      8|		}
  954|       |
  955|     96|		return byteArrayToHexString(notificationData, getNotificationDataLen());
  956|    104|	}

_ZN4pcpp14CiscoHdlcLayer22computeCalculateFieldsEv:
   26|    166|	{
   27|    166|		if (m_NextLayer != nullptr)
  ------------------
  |  Branch (27:7): [True: 166, False: 0]
  ------------------
   28|    166|		{
   29|    166|			switch (m_NextLayer->getProtocol())
  ------------------
  |  Branch (29:12): [True: 32, False: 134]
  ------------------
   30|    166|			{
   31|     32|			case IPv4:
  ------------------
  |  Branch (31:4): [True: 32, False: 134]
  ------------------
   32|     32|			{
   33|     32|				setNextProtocol(CiscoHdlcTypeIp);
   34|     32|				break;
   35|      0|			}
   36|      0|			case IPv6:
  ------------------
  |  Branch (36:4): [True: 0, False: 166]
  ------------------
   37|      0|			{
   38|      0|				setNextProtocol(CiscoHdlcTypeIpv6);
   39|      0|				break;
   40|      0|			}
   41|    166|			}
   42|    166|		}
   43|    166|	}
_ZN4pcpp14CiscoHdlcLayer14parseNextLayerEv:
   46|    531|	{
   47|    531|		auto payload = m_Data + sizeof(cisco_hdlc_header);
   48|    531|		auto payloadLen = m_DataLen - sizeof(cisco_hdlc_header);
   49|       |
   50|    531|		auto nextProtocol = be16toh(getCiscoHdlcHeader()->protocol);
   51|       |
   52|    531|		switch (nextProtocol)
   53|    531|		{
   54|    129|		case CiscoHdlcTypeIp:
  ------------------
  |  Branch (54:3): [True: 129, False: 402]
  ------------------
   55|    129|		{
   56|    129|			tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen);
   57|    129|			break;
   58|      0|		}
   59|      0|		case CiscoHdlcTypeIpv6:
  ------------------
  |  Branch (59:3): [True: 0, False: 531]
  ------------------
   60|      0|		{
   61|      0|			tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen);
   62|      0|			break;
   63|      0|		}
   64|    402|		default:
  ------------------
  |  Branch (64:3): [True: 402, False: 129]
  ------------------
   65|    402|		{
   66|    402|			constructNextLayer<PayloadLayer>(payload, payloadLen);
   67|    402|			break;
   68|      0|		}
   69|    531|		}
   70|    531|	}
_ZNK4pcpp14CiscoHdlcLayer8toStringEv:
   73|    332|	{
   74|    332|		return "Cisco HDLC Layer";
   75|    332|	}
_ZN4pcpp14CiscoHdlcLayer15setNextProtocolEt:
  119|     32|	{
  120|       |		getCiscoHdlcHeader()->protocol = htobe16(protocol);
  121|     32|	}

_ZNK4pcpp9CotpLayer8toStringEv:
   22|  3.88k|	{
   23|  3.88k|		return "Cotp Layer";
   24|  3.88k|	}
_ZN4pcpp9CotpLayer11isDataValidEPKhm:
   57|  14.7k|	{
   58|  14.7k|		if (!data || dataSize < sizeof(cotphdr))
  ------------------
  |  Branch (58:7): [True: 0, False: 14.7k]
  |  Branch (58:16): [True: 1.36k, False: 13.4k]
  ------------------
   59|  1.36k|			return false;
   60|       |
   61|  13.4k|		return data[1] == 0xf0 && data[0] == 2;
  ------------------
  |  Branch (61:10): [True: 13.1k, False: 207]
  |  Branch (61:29): [True: 13.1k, False: 60]
  ------------------
   62|  14.7k|	}
_ZN4pcpp9CotpLayer14parseNextLayerEv:
   65|  13.1k|	{
   66|  13.1k|		size_t headerLen = getHeaderLen();
   67|  13.1k|		if (m_DataLen <= headerLen)
  ------------------
  |  Branch (67:7): [True: 2.85k, False: 10.2k]
  ------------------
   68|  2.85k|			return;
   69|       |
   70|  10.2k|		uint8_t* payload = m_Data + headerLen;
   71|  10.2k|		size_t payloadLen = m_DataLen - headerLen;
   72|       |
   73|  10.2k|		tryConstructNextLayerWithFallback<S7CommLayer, PayloadLayer>(payload, payloadLen);
   74|  10.2k|	}

_ZN4pcpp9DhcpLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   48|  20.9k|	    : Layer(data, dataLen, prevLayer, packet, DHCP)
   49|  20.9k|	{}
_ZNK4pcpp9DhcpLayer24getClientHardwareAddressEv:
   77|  3.73k|	{
   78|  3.73k|		dhcp_header* hdr = getDhcpHeader();
   79|  3.73k|		if (hdr != nullptr && hdr->hardwareType == 1 && hdr->hardwareAddressLength == 6)
  ------------------
  |  Branch (79:7): [True: 3.73k, False: 0]
  |  Branch (79:25): [True: 3.60k, False: 133]
  |  Branch (79:51): [True: 2.36k, False: 1.24k]
  ------------------
   80|  2.36k|			return MacAddress(hdr->clientHardwareAddress);
   81|       |
   82|  1.37k|		PCPP_LOG_DEBUG("Hardware type isn't Ethernet or hardware addr len != 6, returning MacAddress:Zero");
  ------------------
  |  |  427|  1.37k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  1.37k|	do                                                                                                                 \
  |  |  |  |  415|  1.37k|	{                                                                                                                  \
  |  |  |  |  416|  1.37k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  1.37k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.37k|#define LOG_MODULE PacketLogModuleDhcpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 1.37k]
  |  |  |  |  ------------------
  |  |  |  |  418|  1.37k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDhcpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  1.37k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 1.37k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   83|       |
   84|  1.37k|		return MacAddress::Zero;
   85|  3.73k|	}
_ZN4pcpp9DhcpLayer22computeCalculateFieldsEv:
   96|  3.73k|	{
   97|  3.73k|		dhcp_header* hdr = getDhcpHeader();
   98|       |
   99|  3.73k|		hdr->magicNumber = DhcpMagicNumber;
  100|       |
  101|  3.73k|		DhcpMessageType msgType = getMessageType();
  102|  3.73k|		switch (msgType)
  103|  3.73k|		{
  104|  1.80k|		case DHCP_DISCOVER:
  ------------------
  |  Branch (104:3): [True: 1.80k, False: 1.93k]
  ------------------
  105|  2.13k|		case DHCP_REQUEST:
  ------------------
  |  Branch (105:3): [True: 328, False: 3.41k]
  ------------------
  106|  2.13k|		case DHCP_DECLINE:
  ------------------
  |  Branch (106:3): [True: 0, False: 3.73k]
  ------------------
  107|  2.13k|		case DHCP_RELEASE:
  ------------------
  |  Branch (107:3): [True: 0, False: 3.73k]
  ------------------
  108|  2.15k|		case DHCP_INFORM:
  ------------------
  |  Branch (108:3): [True: 14, False: 3.72k]
  ------------------
  109|  3.01k|		case DHCP_UNKNOWN_MSG_TYPE:
  ------------------
  |  Branch (109:3): [True: 869, False: 2.87k]
  ------------------
  110|  3.01k|			hdr->opCode = DHCP_BOOTREQUEST;
  111|  3.01k|			break;
  112|    277|		case DHCP_OFFER:
  ------------------
  |  Branch (112:3): [True: 277, False: 3.46k]
  ------------------
  113|    388|		case DHCP_ACK:
  ------------------
  |  Branch (113:3): [True: 111, False: 3.62k]
  ------------------
  114|    461|		case DHCP_NAK:
  ------------------
  |  Branch (114:3): [True: 73, False: 3.66k]
  ------------------
  115|    461|			hdr->opCode = DHCP_BOOTREPLY;
  116|    461|			break;
  117|    259|		default:
  ------------------
  |  Branch (117:3): [True: 259, False: 3.48k]
  ------------------
  118|    259|			break;
  119|  3.73k|		}
  120|       |
  121|  3.73k|		hdr->hardwareType = 1;           // Ethernet
  122|  3.73k|		hdr->hardwareAddressLength = 6;  // MAC address length
  123|  3.73k|	}
_ZNK4pcpp9DhcpLayer8toStringEv:
  126|  7.47k|	{
  127|  7.47k|		std::string msgType = "Unknown";
  128|  7.47k|		switch (getMessageType())
  129|  7.47k|		{
  130|  3.61k|		case DHCP_DISCOVER:
  ------------------
  |  Branch (130:3): [True: 3.61k, False: 3.86k]
  ------------------
  131|  3.61k|		{
  132|  3.61k|			msgType = "Discover";
  133|  3.61k|			break;
  134|      0|		}
  135|    554|		case DHCP_OFFER:
  ------------------
  |  Branch (135:3): [True: 554, False: 6.92k]
  ------------------
  136|    554|		{
  137|    554|			msgType = "Offer";
  138|    554|			break;
  139|      0|		}
  140|    656|		case DHCP_REQUEST:
  ------------------
  |  Branch (140:3): [True: 656, False: 6.82k]
  ------------------
  141|    656|		{
  142|    656|			msgType = "Request";
  143|    656|			break;
  144|      0|		}
  145|      0|		case DHCP_DECLINE:
  ------------------
  |  Branch (145:3): [True: 0, False: 7.47k]
  ------------------
  146|      0|		{
  147|      0|			msgType = "Decline";
  148|      0|			break;
  149|      0|		}
  150|    222|		case DHCP_ACK:
  ------------------
  |  Branch (150:3): [True: 222, False: 7.25k]
  ------------------
  151|    222|		{
  152|    222|			msgType = "Acknowledge";
  153|    222|			break;
  154|      0|		}
  155|    146|		case DHCP_NAK:
  ------------------
  |  Branch (155:3): [True: 146, False: 7.33k]
  ------------------
  156|    146|		{
  157|    146|			msgType = "Negative Acknowledge";
  158|    146|			break;
  159|      0|		}
  160|      0|		case DHCP_RELEASE:
  ------------------
  |  Branch (160:3): [True: 0, False: 7.47k]
  ------------------
  161|      0|		{
  162|      0|			msgType = "Release";
  163|      0|			break;
  164|      0|		}
  165|     28|		case DHCP_INFORM:
  ------------------
  |  Branch (165:3): [True: 28, False: 7.45k]
  ------------------
  166|     28|		{
  167|     28|			msgType = "Inform";
  168|     28|			break;
  169|      0|		}
  170|  2.25k|		default:
  ------------------
  |  Branch (170:3): [True: 2.25k, False: 5.22k]
  ------------------
  171|  2.25k|			break;
  172|  7.47k|		}
  173|       |
  174|  7.47k|		return "DHCP layer (" + msgType + ")";
  175|  7.47k|	}
_ZNK4pcpp9DhcpLayer14getMessageTypeEv:
  178|  11.2k|	{
  179|  11.2k|		DhcpOption opt = getOptionData(DHCPOPT_DHCP_MESSAGE_TYPE);
  180|  11.2k|		if (opt.isNull())
  ------------------
  |  Branch (180:7): [True: 1.94k, False: 9.27k]
  ------------------
  181|  1.94k|			return DHCP_UNKNOWN_MSG_TYPE;
  182|       |
  183|  9.27k|		return (DhcpMessageType)opt.getValueAs<uint8_t>();
  184|  11.2k|	}
_ZNK4pcpp9DhcpLayer13getOptionDataENS_15DhcpOptionTypesE:
  204|  14.9k|	{
  205|  14.9k|		return m_OptionReader.getTLVRecord((uint8_t)option, getOptionsBasePtr(), getHeaderLen() - sizeof(dhcp_header));
  206|  14.9k|	}
_ZNK4pcpp9DhcpLayer18getFirstOptionDataEv:
  209|  3.69k|	{
  210|  3.69k|		return m_OptionReader.getFirstTLVRecord(getOptionsBasePtr(), getHeaderLen() - sizeof(dhcp_header));
  211|  3.69k|	}
_ZNK4pcpp9DhcpLayer17getNextOptionDataENS_10DhcpOptionE:
  214|   245k|	{
  215|   245k|		return m_OptionReader.getNextTLVRecord(dhcpOption, getOptionsBasePtr(), getHeaderLen() - sizeof(dhcp_header));
  216|   245k|	}
_ZNK4pcpp9DhcpLayer15getOptionsCountEv:
  219|   253k|	{
  220|   253k|		return m_OptionReader.getTLVRecordCount(getOptionsBasePtr(), getHeaderLen() - sizeof(dhcp_header));
  221|   253k|	}

_ZNK4pcpp12DhcpV6Option7getTypeEv:
   13|  4.60k|	{
   14|  4.60k|		if (m_Data == nullptr)
  ------------------
  |  Branch (14:7): [True: 0, False: 4.60k]
  ------------------
   15|      0|			return DhcpV6OptionType::DHCPV6_OPT_UNKNOWN;
   16|       |
   17|  4.60k|		uint16_t optionType = be16toh(m_Data->recordType);
   18|  4.60k|		if (optionType <= 62 && optionType != 10 && optionType != 35 && optionType != 57 && optionType != 58)
  ------------------
  |  Branch (18:7): [True: 3.29k, False: 1.31k]
  |  Branch (18:27): [True: 3.27k, False: 17]
  |  Branch (18:47): [True: 3.27k, False: 0]
  |  Branch (18:67): [True: 3.27k, False: 0]
  |  Branch (18:87): [True: 3.27k, False: 0]
  ------------------
   19|  3.27k|		{
   20|  3.27k|			return static_cast<DhcpV6OptionType>(optionType);
   21|  3.27k|		}
   22|  1.33k|		if (optionType == 65 || optionType == 66 || optionType == 68 || optionType == 79 || optionType == 112)
  ------------------
  |  Branch (22:7): [True: 32, False: 1.29k]
  |  Branch (22:27): [True: 0, False: 1.29k]
  |  Branch (22:47): [True: 222, False: 1.07k]
  |  Branch (22:67): [True: 0, False: 1.07k]
  |  Branch (22:87): [True: 96, False: 980]
  ------------------
   23|    350|		{
   24|    350|			return static_cast<DhcpV6OptionType>(optionType);
   25|    350|		}
   26|       |
   27|    980|		return DHCPV6_OPT_UNKNOWN;
   28|  1.33k|	}
_ZNK4pcpp12DhcpV6Option19getValueAsHexStringEv:
   31|    850|	{
   32|    850|		if (m_Data == nullptr)
  ------------------
  |  Branch (32:7): [True: 0, False: 850]
  ------------------
   33|      0|			return "";
   34|       |
   35|    850|		return byteArrayToHexString(m_Data->recordValue, getDataSize());
   36|    850|	}
_ZNK4pcpp12DhcpV6Option12getTotalSizeEv:
   39|  64.1k|	{
   40|  64.1k|		if (m_Data == nullptr)
  ------------------
  |  Branch (40:7): [True: 0, False: 64.1k]
  ------------------
   41|      0|			return 0;
   42|       |
   43|  64.1k|		return 2 * sizeof(uint16_t) + be16toh(m_Data->recordLen);
   44|  64.1k|	}
_ZNK4pcpp12DhcpV6Option11getDataSizeEv:
   47|    850|	{
   48|    850|		if (m_Data == nullptr)
  ------------------
  |  Branch (48:7): [True: 0, False: 850]
  ------------------
   49|      0|			return 0;
   50|       |
   51|    850|		return static_cast<size_t>(be16toh(m_Data->recordLen));
   52|    850|	}
_ZN4pcpp11DhcpV6LayerC2EPhmPNS_5LayerEPNS_6PacketE:
   72|  5.70k|	    : Layer(data, dataLen, prevLayer, packet, DHCPv6)
   73|  5.70k|	{}
_ZNK4pcpp11DhcpV6Layer14getMessageTypeEv:
   85|  2.38k|	{
   86|  2.38k|		uint8_t messageType = getDhcpHeader()->messageType;
   87|  2.38k|		if (messageType > 13)
  ------------------
  |  Branch (87:7): [True: 736, False: 1.65k]
  ------------------
   88|    736|		{
   89|    736|			return DHCPV6_UNKNOWN_MSG_TYPE;
   90|    736|		}
   91|       |
   92|  1.65k|		return static_cast<DhcpV6MessageType>(messageType);
   93|  2.38k|	}
_ZNK4pcpp11DhcpV6Layer22getMessageTypeAsStringEv:
   96|  2.38k|	{
   97|  2.38k|		DhcpV6MessageType messageType = getMessageType();
   98|  2.38k|		switch (messageType)
   99|  2.38k|		{
  100|    204|		case DHCPV6_SOLICIT:
  ------------------
  |  Branch (100:3): [True: 204, False: 2.18k]
  ------------------
  101|    204|			return "Solicit";
  102|    224|		case DHCPV6_ADVERTISE:
  ------------------
  |  Branch (102:3): [True: 224, False: 2.16k]
  ------------------
  103|    224|			return "Advertise";
  104|     94|		case DHCPV6_REQUEST:
  ------------------
  |  Branch (104:3): [True: 94, False: 2.29k]
  ------------------
  105|     94|			return "Request";
  106|     32|		case DHCPV6_CONFIRM:
  ------------------
  |  Branch (106:3): [True: 32, False: 2.35k]
  ------------------
  107|     32|			return "Confirm";
  108|     32|		case DHCPV6_RENEW:
  ------------------
  |  Branch (108:3): [True: 32, False: 2.35k]
  ------------------
  109|     32|			return "Renew";
  110|     48|		case DHCPV6_REBIND:
  ------------------
  |  Branch (110:3): [True: 48, False: 2.33k]
  ------------------
  111|     48|			return "Rebind";
  112|     64|		case DHCPV6_REPLY:
  ------------------
  |  Branch (112:3): [True: 64, False: 2.32k]
  ------------------
  113|     64|			return "Reply";
  114|      0|		case DHCPV6_RELEASE:
  ------------------
  |  Branch (114:3): [True: 0, False: 2.38k]
  ------------------
  115|      0|			return "Release";
  116|    648|		case DHCPV6_DECLINE:
  ------------------
  |  Branch (116:3): [True: 648, False: 1.73k]
  ------------------
  117|    648|			return "Decline";
  118|     32|		case DHCPV6_RECONFIGURE:
  ------------------
  |  Branch (118:3): [True: 32, False: 2.35k]
  ------------------
  119|     32|			return "Reconfigure";
  120|     14|		case DHCPV6_INFORMATION_REQUEST:
  ------------------
  |  Branch (120:3): [True: 14, False: 2.37k]
  ------------------
  121|     14|			return "Information-Request";
  122|      0|		case DHCPV6_RELAY_FORWARD:
  ------------------
  |  Branch (122:3): [True: 0, False: 2.38k]
  ------------------
  123|      0|			return "Relay-Forward";
  124|      0|		case DHCPV6_RELAY_REPLY:
  ------------------
  |  Branch (124:3): [True: 0, False: 2.38k]
  ------------------
  125|      0|			return "Relay-Reply";
  126|    994|		default:
  ------------------
  |  Branch (126:3): [True: 994, False: 1.39k]
  ------------------
  127|    994|			return "Unknown";
  128|  2.38k|		}
  129|  2.38k|	}
_ZNK4pcpp11DhcpV6Layer16getTransactionIDEv:
  137|  1.19k|	{
  138|  1.19k|		dhcpv6_header* hdr = getDhcpHeader();
  139|  1.19k|		uint32_t result = hdr->transactionId1 << 16 | hdr->transactionId2 << 8 | hdr->transactionId3;
  140|  1.19k|		return result;
  141|  1.19k|	}
_ZNK4pcpp11DhcpV6Layer18getFirstOptionDataEv:
  152|    850|	{
  153|    850|		return m_OptionReader.getFirstTLVRecord(getOptionsBasePtr(), getHeaderLen() - sizeof(dhcpv6_header));
  154|    850|	}
_ZNK4pcpp11DhcpV6Layer17getNextOptionDataENS_12DhcpV6OptionE:
  157|  4.43k|	{
  158|  4.43k|		return m_OptionReader.getNextTLVRecord(dhcpv6Option, getOptionsBasePtr(),
  159|  4.43k|		                                       getHeaderLen() - sizeof(dhcpv6_header));
  160|  4.43k|	}
_ZNK4pcpp11DhcpV6Layer13getOptionDataENS_16DhcpV6OptionTypeE:
  163|    850|	{
  164|    850|		return m_OptionReader.getTLVRecord(static_cast<uint32_t>(option), getOptionsBasePtr(),
  165|    850|		                                   getHeaderLen() - sizeof(dhcpv6_header));
  166|    850|	}
_ZNK4pcpp11DhcpV6Layer14getOptionCountEv:
  169|  6.47k|	{
  170|  6.47k|		return m_OptionReader.getTLVRecordCount(getOptionsBasePtr(), getHeaderLen() - sizeof(dhcpv6_header));
  171|  6.47k|	}
_ZNK4pcpp11DhcpV6Layer8toStringEv:
  269|  2.38k|	{
  270|  2.38k|		return "DHCPv6 Layer, " + getMessageTypeAsString() + " message";
  271|  2.38k|	}

_ZN4pcpp8DnsLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   17|  37.4k|	    : Layer(data, dataLen, prevLayer, packet)
   18|  37.4k|	{
   19|  37.4k|		init(0, true);
   20|  37.4k|	}
_ZN4pcpp8DnsLayerC2ERKS0_:
   27|  8.26k|	DnsLayer::DnsLayer(const DnsLayer& other) : Layer(other)
   28|  8.26k|	{
   29|  8.26k|		init(other.m_OffsetAdjustment, true);
   30|  8.26k|	}
_ZN4pcpp8DnsLayerC2EPhmPNS_5LayerEPNS_6PacketEm:
   33|  2.77k|	    : Layer(data, dataLen, prevLayer, packet)
   34|  2.77k|	{
   35|  2.77k|		init(offsetAdjustment, true);
   36|  2.77k|	}
_ZN4pcpp8DnsLayeraSERKS0_:
   44|  8.26k|	{
   45|  8.26k|		Layer::operator=(other);
   46|       |
   47|  8.26k|		IDnsResource* curResource = m_ResourceList;
   48|  22.9k|		while (curResource != nullptr)
  ------------------
  |  Branch (48:10): [True: 14.6k, False: 8.26k]
  ------------------
   49|  14.6k|		{
   50|  14.6k|			IDnsResource* temp = curResource->getNextResource();
   51|  14.6k|			delete curResource;
   52|  14.6k|			curResource = temp;
   53|  14.6k|		}
   54|       |
   55|  8.26k|		init(other.m_OffsetAdjustment, true);
   56|       |
   57|  8.26k|		return (*this);
   58|  8.26k|	}
_ZN4pcpp8DnsLayerD2Ev:
   61|  48.4k|	{
   62|  48.4k|		IDnsResource* curResource = m_ResourceList;
   63|   133k|		while (curResource != nullptr)
  ------------------
  |  Branch (63:10): [True: 85.5k, False: 48.4k]
  ------------------
   64|  85.5k|		{
   65|  85.5k|			IDnsResource* nextResource = curResource->getNextResource();
   66|  85.5k|			delete curResource;
   67|  85.5k|			curResource = nextResource;
   68|  85.5k|		}
   69|  48.4k|	}
_ZN4pcpp8DnsLayer4initEmb:
   72|  56.7k|	{
   73|  56.7k|		m_OffsetAdjustment = offsetAdjustment;
   74|  56.7k|		m_Protocol = DNS;
   75|  56.7k|		m_ResourceList = nullptr;
   76|       |
   77|  56.7k|		m_FirstQuery = nullptr;
   78|  56.7k|		m_FirstAnswer = nullptr;
   79|  56.7k|		m_FirstAuthority = nullptr;
   80|  56.7k|		m_FirstAdditional = nullptr;
   81|       |
   82|  56.7k|		if (callParseResource)
  ------------------
  |  Branch (82:7): [True: 56.7k, False: 0]
  ------------------
   83|  56.7k|			parseResources();
   84|  56.7k|	}
_ZN4pcpp8DnsLayer18getBasicHeaderSizeEv:
   96|  89.7k|	{
   97|  89.7k|		return sizeof(dnshdr) + m_OffsetAdjustment;
   98|  89.7k|	}
_ZNK4pcpp8DnsLayer12getDnsHeaderEv:
  101|   524k|	{
  102|   524k|		uint8_t* ptr = m_Data + m_OffsetAdjustment;
  103|   524k|		return reinterpret_cast<dnshdr*>(ptr);
  104|   524k|	}
_ZN4pcpp8DnsLayer11extendLayerEimPNS_12IDnsResourceE:
  107|  54.4k|	{
  108|  54.4k|		if (!Layer::extendLayer(offsetInLayer, numOfBytesToExtend))
  ------------------
  |  Branch (108:7): [True: 1.89k, False: 52.5k]
  ------------------
  109|  1.89k|			return false;
  110|       |
  111|  52.5k|		IDnsResource* curResource = resource->getNextResource();
  112|  61.3k|		while (curResource != nullptr)
  ------------------
  |  Branch (112:10): [True: 8.77k, False: 52.5k]
  ------------------
  113|  8.77k|		{
  114|  8.77k|			curResource->m_OffsetInLayer += numOfBytesToExtend;
  115|  8.77k|			curResource = curResource->getNextResource();
  116|  8.77k|		}
  117|  52.5k|		return true;
  118|  54.4k|	}
_ZN4pcpp8DnsLayer12shortenLayerEimPNS_12IDnsResourceE:
  121|  29.5k|	{
  122|  29.5k|		if (!Layer::shortenLayer(offsetInLayer, numOfBytesToShorten))
  ------------------
  |  Branch (122:7): [True: 378, False: 29.2k]
  ------------------
  123|    378|			return false;
  124|       |
  125|  29.2k|		IDnsResource* curResource = resource->getNextResource();
  126|  36.1k|		while (curResource != nullptr)
  ------------------
  |  Branch (126:10): [True: 6.96k, False: 29.2k]
  ------------------
  127|  6.96k|		{
  128|  6.96k|			curResource->m_OffsetInLayer -= numOfBytesToShorten;
  129|  6.96k|			curResource = curResource->getNextResource();
  130|  6.96k|		}
  131|  29.2k|		return true;
  132|  29.5k|	}
_ZN4pcpp8DnsLayer14parseResourcesEv:
  135|  56.7k|	{
  136|  56.7k|		size_t offsetInPacket = getBasicHeaderSize();
  137|  56.7k|		IDnsResource* curResource = m_ResourceList;
  138|       |
  139|  56.7k|		uint16_t numOfQuestions = be16toh(getDnsHeader()->numberOfQuestions);
  140|  56.7k|		uint16_t numOfAnswers = be16toh(getDnsHeader()->numberOfAnswers);
  141|  56.7k|		uint16_t numOfAuthority = be16toh(getDnsHeader()->numberOfAuthority);
  142|  56.7k|		uint16_t numOfAdditional = be16toh(getDnsHeader()->numberOfAdditional);
  143|       |
  144|  56.7k|		uint32_t numOfOtherResources = numOfQuestions + numOfAnswers + numOfAuthority + numOfAdditional;
  145|       |
  146|  56.7k|		if (numOfOtherResources > 300)
  ------------------
  |  Branch (146:7): [True: 9.55k, False: 47.1k]
  ------------------
  147|  9.55k|		{
  148|  9.55k|			PCPP_LOG_ERROR(
  ------------------
  |  |  445|  9.55k|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|  9.55k|	do                                                                                                                 \
  |  |  |  |  415|  9.55k|	{                                                                                                                  \
  |  |  |  |  416|  9.55k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  9.55k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  9.55k|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 9.55k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|  9.55k|		{                                                                                                              \
  |  |  |  |  419|  9.55k|			auto ctx =                                                                                                 \
  |  |  |  |  420|  9.55k|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  9.55k|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|  9.55k|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|  9.55k|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|  9.55k|		}                                                                                                              \
  |  |  |  |  424|  9.55k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 9.55k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  149|  9.55k|			    "DNS layer contains more than 300 resources, probably a bad packet. Skipping parsing DNS resources");
  150|  9.55k|			return;
  151|  9.55k|		}
  152|       |
  153|   146k|		for (uint32_t i = 0; i < numOfOtherResources; i++)
  ------------------
  |  Branch (153:24): [True: 124k, False: 22.3k]
  ------------------
  154|   124k|		{
  155|   124k|			DnsResourceType resType;
  156|   124k|			if (numOfQuestions > 0)
  ------------------
  |  Branch (156:8): [True: 69.5k, False: 54.6k]
  ------------------
  157|  69.5k|			{
  158|  69.5k|				resType = DnsQueryType;
  159|  69.5k|				numOfQuestions--;
  160|  69.5k|			}
  161|  54.6k|			else if (numOfAnswers > 0)
  ------------------
  |  Branch (161:13): [True: 21.4k, False: 33.1k]
  ------------------
  162|  21.4k|			{
  163|  21.4k|				resType = DnsAnswerType;
  164|  21.4k|				numOfAnswers--;
  165|  21.4k|			}
  166|  33.1k|			else if (numOfAuthority > 0)
  ------------------
  |  Branch (166:13): [True: 7.39k, False: 25.7k]
  ------------------
  167|  7.39k|			{
  168|  7.39k|				resType = DnsAuthorityType;
  169|  7.39k|				numOfAuthority--;
  170|  7.39k|			}
  171|  25.7k|			else
  172|  25.7k|			{
  173|  25.7k|				resType = DnsAdditionalType;
  174|  25.7k|				numOfAdditional--;
  175|  25.7k|			}
  176|       |
  177|   124k|			DnsResource* newResource = nullptr;
  178|   124k|			DnsQuery* newQuery = nullptr;
  179|   124k|			IDnsResource* newGenResource = nullptr;
  180|   124k|			if (resType == DnsQueryType)
  ------------------
  |  Branch (180:8): [True: 69.5k, False: 54.6k]
  ------------------
  181|  69.5k|			{
  182|  69.5k|				newQuery = new DnsQuery(this, offsetInPacket);
  183|  69.5k|				newGenResource = newQuery;
  184|  69.5k|				offsetInPacket += newQuery->getSize();
  185|  69.5k|			}
  186|  54.6k|			else
  187|  54.6k|			{
  188|  54.6k|				newResource = new DnsResource(this, offsetInPacket, resType);
  189|  54.6k|				newGenResource = newResource;
  190|  54.6k|				offsetInPacket += newResource->getSize();
  191|  54.6k|			}
  192|       |
  193|   124k|			if (offsetInPacket > m_DataLen)
  ------------------
  |  Branch (193:8): [True: 24.8k, False: 99.3k]
  ------------------
  194|  24.8k|			{
  195|       |				// Parse packet failed, DNS resource is out of bounds. Probably a bad packet
  196|  24.8k|				delete newGenResource;
  197|  24.8k|				return;
  198|  24.8k|			}
  199|       |
  200|       |			// this resource is the first resource
  201|  99.3k|			if (m_ResourceList == nullptr)
  ------------------
  |  Branch (201:8): [True: 38.4k, False: 60.9k]
  ------------------
  202|  38.4k|			{
  203|  38.4k|				m_ResourceList = newGenResource;
  204|  38.4k|				curResource = m_ResourceList;
  205|  38.4k|			}
  206|  60.9k|			else
  207|  60.9k|			{
  208|  60.9k|				curResource->setNextResource(newGenResource);
  209|  60.9k|				curResource = curResource->getNextResource();
  210|  60.9k|			}
  211|       |
  212|  99.3k|			if (resType == DnsQueryType && m_FirstQuery == nullptr)
  ------------------
  |  Branch (212:8): [True: 68.4k, False: 30.9k]
  |  Branch (212:35): [True: 37.5k, False: 30.8k]
  ------------------
  213|  37.5k|				m_FirstQuery = newQuery;
  214|  61.7k|			else if (resType == DnsAnswerType && m_FirstAnswer == nullptr)
  ------------------
  |  Branch (214:13): [True: 19.6k, False: 42.1k]
  |  Branch (214:41): [True: 6.63k, False: 13.0k]
  ------------------
  215|  6.63k|				m_FirstAnswer = newResource;
  216|  55.1k|			else if (resType == DnsAuthorityType && m_FirstAuthority == nullptr)
  ------------------
  |  Branch (216:13): [True: 4.31k, False: 50.8k]
  |  Branch (216:44): [True: 2.23k, False: 2.07k]
  ------------------
  217|  2.23k|				m_FirstAuthority = newResource;
  218|  52.9k|			else if (resType == DnsAdditionalType && m_FirstAdditional == nullptr)
  ------------------
  |  Branch (218:13): [True: 6.95k, False: 45.9k]
  |  Branch (218:45): [True: 3.19k, False: 3.75k]
  ------------------
  219|  3.19k|				m_FirstAdditional = newResource;
  220|  99.3k|		}
  221|  47.1k|	}
_ZNK4pcpp8DnsLayer17getResourceByNameEPNS_12IDnsResourceEmRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEb:
  225|  66.0k|	{
  226|  66.0k|		size_t index = 0;
  227|   121k|		while (index < resourceCount)
  ------------------
  |  Branch (227:10): [True: 93.3k, False: 28.2k]
  ------------------
  228|  93.3k|		{
  229|  93.3k|			if (startFrom == nullptr)
  ------------------
  |  Branch (229:8): [True: 8.29k, False: 85.0k]
  ------------------
  230|  8.29k|				return nullptr;
  231|       |
  232|  85.0k|			std::string resourceName = startFrom->getName();
  233|  85.0k|			if (exactMatch && resourceName == name)
  ------------------
  |  Branch (233:8): [True: 42.8k, False: 42.2k]
  |  Branch (233:22): [True: 379, False: 42.4k]
  ------------------
  234|    379|				return startFrom;
  235|  84.7k|			else if (!exactMatch && resourceName.find(name) != std::string::npos)
  ------------------
  |  Branch (235:13): [True: 42.2k, False: 42.4k]
  |  Branch (235:28): [True: 29.2k, False: 13.0k]
  ------------------
  236|  29.2k|				return startFrom;
  237|       |
  238|  55.5k|			startFrom = startFrom->getNextResource();
  239|       |
  240|  55.5k|			index++;
  241|  55.5k|		}
  242|       |
  243|  28.2k|		return nullptr;
  244|  66.0k|	}
_ZNK4pcpp8DnsLayer8getQueryERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEb:
  247|  16.5k|	{
  248|  16.5k|		uint16_t numOfQueries = be16toh(getDnsHeader()->numberOfQuestions);
  249|  16.5k|		IDnsResource* res = getResourceByName(m_FirstQuery, numOfQueries, name, exactMatch);
  250|  16.5k|		if (res != nullptr)
  ------------------
  |  Branch (250:7): [True: 7.38k, False: 9.13k]
  ------------------
  251|  7.38k|			return dynamic_cast<DnsQuery*>(res);
  252|  9.13k|		return nullptr;
  253|  16.5k|	}
_ZNK4pcpp8DnsLayer13getFirstQueryEv:
  256|  8.26k|	{
  257|  8.26k|		return m_FirstQuery;
  258|  8.26k|	}
_ZNK4pcpp8DnsLayer12getNextQueryEPNS_8DnsQueryE:
  261|  9.36k|	{
  262|  9.36k|		if (query == nullptr || query->getNextResource() == nullptr || query->getType() != DnsQueryType ||
  ------------------
  |  Branch (262:7): [True: 0, False: 9.36k]
  |  Branch (262:27): [True: 3.89k, False: 5.46k]
  |  Branch (262:66): [True: 0, False: 5.46k]
  ------------------
  263|  5.46k|		    query->getNextResource()->getType() != DnsQueryType)
  ------------------
  |  Branch (263:7): [True: 1.40k, False: 4.05k]
  ------------------
  264|  5.30k|			return nullptr;
  265|       |
  266|  4.05k|		return (DnsQuery*)(query->getNextResource());
  267|  9.36k|	}
_ZNK4pcpp8DnsLayer13getQueryCountEv:
  270|  31.4k|	{
  271|       |		return be16toh(getDnsHeader()->numberOfQuestions);
  272|  31.4k|	}
_ZNK4pcpp8DnsLayer9getAnswerERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEb:
  275|  16.5k|	{
  276|  16.5k|		uint16_t numOfAnswers = be16toh(getDnsHeader()->numberOfAnswers);
  277|  16.5k|		IDnsResource* res = getResourceByName(m_FirstAnswer, numOfAnswers, name, exactMatch);
  278|  16.5k|		if (res != nullptr)
  ------------------
  |  Branch (278:7): [True: 7.41k, False: 9.10k]
  ------------------
  279|  7.41k|			return dynamic_cast<DnsResource*>(res);
  280|  9.10k|		return nullptr;
  281|  16.5k|	}
_ZNK4pcpp8DnsLayer14getFirstAnswerEv:
  284|  8.26k|	{
  285|  8.26k|		return m_FirstAnswer;
  286|  8.26k|	}
_ZNK4pcpp8DnsLayer13getNextAnswerEPNS_11DnsResourceE:
  289|  3.25k|	{
  290|  3.25k|		if (answer == nullptr || answer->getNextResource() == nullptr || answer->getType() != DnsAnswerType ||
  ------------------
  |  Branch (290:7): [True: 0, False: 3.25k]
  |  Branch (290:28): [True: 1.20k, False: 2.05k]
  |  Branch (290:68): [True: 0, False: 2.05k]
  ------------------
  291|  2.05k|		    answer->getNextResource()->getType() != DnsAnswerType)
  ------------------
  |  Branch (291:7): [True: 256, False: 1.79k]
  ------------------
  292|  1.46k|			return nullptr;
  293|       |
  294|  1.79k|		return (DnsResource*)(answer->getNextResource());
  295|  3.25k|	}
_ZNK4pcpp8DnsLayer14getAnswerCountEv:
  298|  31.0k|	{
  299|       |		return be16toh(getDnsHeader()->numberOfAnswers);
  300|  31.0k|	}
_ZNK4pcpp8DnsLayer12getAuthorityERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEb:
  303|  16.5k|	{
  304|  16.5k|		uint16_t numOfAuthorities = be16toh(getDnsHeader()->numberOfAuthority);
  305|  16.5k|		IDnsResource* res = getResourceByName(m_FirstAuthority, numOfAuthorities, name, exactMatch);
  306|  16.5k|		if (res != nullptr)
  ------------------
  |  Branch (306:7): [True: 7.34k, False: 9.18k]
  ------------------
  307|  7.34k|			return dynamic_cast<DnsResource*>(res);
  308|  9.18k|		return nullptr;
  309|  16.5k|	}
_ZNK4pcpp8DnsLayer17getFirstAuthorityEv:
  312|  8.26k|	{
  313|  8.26k|		return m_FirstAuthority;
  314|  8.26k|	}
_ZNK4pcpp8DnsLayer16getNextAuthorityEPNS_11DnsResourceE:
  317|    680|	{
  318|    680|		if (authority == nullptr || authority->getNextResource() == nullptr ||
  ------------------
  |  Branch (318:7): [True: 0, False: 680]
  |  Branch (318:31): [True: 211, False: 469]
  ------------------
  319|    469|		    authority->getType() != DnsAuthorityType || authority->getNextResource()->getType() != DnsAuthorityType)
  ------------------
  |  Branch (319:7): [True: 0, False: 469]
  |  Branch (319:51): [True: 190, False: 279]
  ------------------
  320|    401|			return nullptr;
  321|       |
  322|    279|		return (DnsResource*)(authority->getNextResource());
  323|    680|	}
_ZNK4pcpp8DnsLayer17getAuthorityCountEv:
  326|  31.3k|	{
  327|       |		return be16toh(getDnsHeader()->numberOfAuthority);
  328|  31.3k|	}
_ZNK4pcpp8DnsLayer19getAdditionalRecordERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEb:
  331|  16.5k|	{
  332|  16.5k|		uint16_t numOfAdditionalRecords = be16toh(getDnsHeader()->numberOfAdditional);
  333|  16.5k|		IDnsResource* res = getResourceByName(m_FirstAdditional, numOfAdditionalRecords, name, exactMatch);
  334|  16.5k|		if (res != nullptr)
  ------------------
  |  Branch (334:7): [True: 7.44k, False: 9.08k]
  ------------------
  335|  7.44k|			return dynamic_cast<DnsResource*>(res);
  336|  9.08k|		return nullptr;
  337|  16.5k|	}
_ZNK4pcpp8DnsLayer24getFirstAdditionalRecordEv:
  340|  8.26k|	{
  341|  8.26k|		return m_FirstAdditional;
  342|  8.26k|	}
_ZNK4pcpp8DnsLayer23getNextAdditionalRecordEPNS_11DnsResourceE:
  345|  1.05k|	{
  346|  1.05k|		if (additionalRecord == nullptr || additionalRecord->getNextResource() == nullptr ||
  ------------------
  |  Branch (346:7): [True: 0, False: 1.05k]
  |  Branch (346:38): [True: 530, False: 529]
  ------------------
  347|    529|		    additionalRecord->getType() != DnsAdditionalType ||
  ------------------
  |  Branch (347:7): [True: 0, False: 529]
  ------------------
  348|    529|		    additionalRecord->getNextResource()->getType() != DnsAdditionalType)
  ------------------
  |  Branch (348:7): [True: 0, False: 529]
  ------------------
  349|    530|			return nullptr;
  350|       |
  351|    529|		return (DnsResource*)(additionalRecord->getNextResource());
  352|  1.05k|	}
_ZNK4pcpp8DnsLayer24getAdditionalRecordCountEv:
  355|  31.4k|	{
  356|       |		return be16toh(getDnsHeader()->numberOfAdditional);
  357|  31.4k|	}
_ZNK4pcpp8DnsLayer8toStringEv:
  360|  16.5k|	{
  361|  16.5k|		std::ostringstream tidAsString;
  362|  16.5k|		tidAsString << be16toh(getDnsHeader()->transactionID);
  363|       |
  364|  16.5k|		std::ostringstream queryCount;
  365|  16.5k|		queryCount << getQueryCount();
  366|       |
  367|  16.5k|		std::ostringstream answerCount;
  368|  16.5k|		answerCount << getAnswerCount();
  369|       |
  370|  16.5k|		std::ostringstream authorityCount;
  371|  16.5k|		authorityCount << getAuthorityCount();
  372|       |
  373|  16.5k|		std::ostringstream additionalCount;
  374|  16.5k|		additionalCount << getAdditionalRecordCount();
  375|       |
  376|  16.5k|		if (getDnsHeader()->queryOrResponse == 1)
  ------------------
  |  Branch (376:7): [True: 2.52k, False: 13.9k]
  ------------------
  377|  2.52k|		{
  378|  2.52k|			return "DNS query response, ID: " + tidAsString.str() + ";" + " queries: " + queryCount.str() +
  379|  2.52k|			       ", answers: " + answerCount.str() + ", authorities: " + authorityCount.str() +
  380|  2.52k|			       ", additional record: " + additionalCount.str();
  381|  2.52k|		}
  382|  13.9k|		else if (getDnsHeader()->queryOrResponse == 0)
  ------------------
  |  Branch (382:12): [True: 13.9k, False: 0]
  ------------------
  383|  13.9k|		{
  384|  13.9k|			return "DNS query, ID: " + tidAsString.str() + ";" + " queries: " + queryCount.str() +
  385|  13.9k|			       ", answers: " + answerCount.str() + ", authorities: " + authorityCount.str() +
  386|  13.9k|			       ", additional record: " + additionalCount.str();
  387|  13.9k|		}
  388|      0|		else  // not likely - a DNS with no answers and no queries
  389|      0|		{
  390|      0|			return "DNS record without queries and answers, ID: " + tidAsString.str() + ";" +
  391|      0|			       " queries: " + queryCount.str() + ", answers: " + answerCount.str() +
  392|      0|			       ", authorities: " + authorityCount.str() + ", additional record: " + additionalCount.str();
  393|      0|		}
  394|  16.5k|	}
_ZNK4pcpp8DnsLayer16getFirstResourceENS_15DnsResourceTypeE:
  618|  29.2k|	{
  619|  29.2k|		switch (resType)
  620|  29.2k|		{
  621|  7.38k|		case DnsQueryType:
  ------------------
  |  Branch (621:3): [True: 7.38k, False: 21.8k]
  ------------------
  622|  7.38k|		{
  623|  7.38k|			return m_FirstQuery;
  624|      0|		}
  625|  7.05k|		case DnsAnswerType:
  ------------------
  |  Branch (625:3): [True: 7.05k, False: 22.1k]
  ------------------
  626|  7.05k|		{
  627|  7.05k|			return m_FirstAnswer;
  628|      0|		}
  629|  7.32k|		case DnsAuthorityType:
  ------------------
  |  Branch (629:3): [True: 7.32k, False: 21.8k]
  ------------------
  630|  7.32k|		{
  631|  7.32k|			return m_FirstAuthority;
  632|      0|		}
  633|  7.44k|		case DnsAdditionalType:
  ------------------
  |  Branch (633:3): [True: 7.44k, False: 21.7k]
  ------------------
  634|  7.44k|		{
  635|  7.44k|			return m_FirstAdditional;
  636|      0|		}
  637|      0|		default:
  ------------------
  |  Branch (637:3): [True: 0, False: 29.2k]
  ------------------
  638|      0|			return nullptr;
  639|  29.2k|		}
  640|  29.2k|	}
_ZN4pcpp8DnsLayer16setFirstResourceENS_15DnsResourceTypeEPNS_12IDnsResourceE:
  643|  44.4k|	{
  644|  44.4k|		switch (resType)
  645|  44.4k|		{
  646|  2.64k|		case DnsQueryType:
  ------------------
  |  Branch (646:3): [True: 2.64k, False: 41.8k]
  ------------------
  647|  2.64k|		{
  648|  2.64k|			m_FirstQuery = dynamic_cast<DnsQuery*>(resource);
  649|  2.64k|			break;
  650|      0|		}
  651|  13.2k|		case DnsAnswerType:
  ------------------
  |  Branch (651:3): [True: 13.2k, False: 31.2k]
  ------------------
  652|  13.2k|		{
  653|  13.2k|			m_FirstAnswer = dynamic_cast<DnsResource*>(resource);
  654|  13.2k|			break;
  655|      0|		}
  656|  14.5k|		case DnsAuthorityType:
  ------------------
  |  Branch (656:3): [True: 14.5k, False: 29.9k]
  ------------------
  657|  14.5k|		{
  658|  14.5k|			m_FirstAuthority = dynamic_cast<DnsResource*>(resource);
  659|  14.5k|			break;
  660|      0|		}
  661|  14.0k|		case DnsAdditionalType:
  ------------------
  |  Branch (661:3): [True: 14.0k, False: 30.4k]
  ------------------
  662|  14.0k|		{
  663|  14.0k|			m_FirstAdditional = dynamic_cast<DnsResource*>(resource);
  664|  14.0k|			break;
  665|      0|		}
  666|      0|		default:
  ------------------
  |  Branch (666:3): [True: 0, False: 44.4k]
  ------------------
  667|      0|			return;
  668|  44.4k|		}
  669|  44.4k|	}
_ZN4pcpp8DnsLayer11addResourceENS_15DnsResourceTypeERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_7DnsTypeENS_8DnsClassEjPNS_16IDnsResourceDataE:
  673|  24.7k|	{
  674|  24.7k|		if (data == nullptr)
  ------------------
  |  Branch (674:7): [True: 0, False: 24.7k]
  ------------------
  675|      0|		{
  676|      0|			PCPP_LOG_ERROR("Given data is nullptr");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  677|      0|			return nullptr;
  678|      0|		}
  679|       |
  680|       |		// The temporary buffer holds the encoded name and the fixed RR header. The encoded name is at most the decoded
  681|       |		// name plus 2 bytes and the fixed RR header is 10 bytes long. The RDATA is added by setData() after the new
  682|       |		// resource is attached to the layer, so the buffer doesn't need to leave room for it
  683|  24.7k|		std::vector<uint8_t> newResourceRawData(name.size() + 2 + 10, 0);
  684|       |
  685|  24.7k|		DnsResource* newResource = new DnsResource(newResourceRawData.data(), resType);
  686|       |
  687|  24.7k|		newResource->setDnsClass(dnsClass);
  688|       |
  689|  24.7k|		newResource->setDnsType(dnsType);
  690|       |
  691|       |		// cannot return false since layer shouldn't be extended or shortened in this stage
  692|  24.7k|		newResource->setName(name);
  693|       |
  694|  24.7k|		newResource->setTTL(ttl);
  695|       |
  696|  24.7k|		size_t newResourceOffsetInLayer = getBasicHeaderSize();
  697|  24.7k|		IDnsResource* curResource = m_ResourceList;
  698|  47.6k|		while (curResource != nullptr && curResource->getType() <= resType)
  ------------------
  |  Branch (698:10): [True: 39.9k, False: 7.71k]
  |  Branch (698:36): [True: 39.8k, False: 10]
  ------------------
  699|  39.8k|		{
  700|  39.8k|			newResourceOffsetInLayer += curResource->getSize();
  701|       |
  702|  39.8k|			if (newResourceOffsetInLayer > m_DataLen)
  ------------------
  |  Branch (702:8): [True: 1.12k, False: 38.7k]
  ------------------
  703|  1.12k|			{
  704|       |				// This possibly means that the DNS layer has been created from a malformed packet.
  705|  1.12k|				PCPP_LOG_ERROR("Couldn't add resource! DNS Layer is malformed and contains out of bounds resources.");
  ------------------
  |  |  445|  1.12k|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|  1.12k|	do                                                                                                                 \
  |  |  |  |  415|  1.12k|	{                                                                                                                  \
  |  |  |  |  416|  1.12k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  1.12k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.12k|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 1.12k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|  1.12k|		{                                                                                                              \
  |  |  |  |  419|  1.12k|			auto ctx =                                                                                                 \
  |  |  |  |  420|  1.12k|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.12k|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|  1.12k|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|  1.12k|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|  1.12k|		}                                                                                                              \
  |  |  |  |  424|  1.12k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 1.12k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  706|  1.12k|				delete newResource;
  707|  1.12k|				return nullptr;
  708|  1.12k|			}
  709|       |
  710|  38.7k|			IDnsResource* nextResource = curResource->getNextResource();
  711|  38.7k|			if (nextResource == nullptr || nextResource->getType() > resType)
  ------------------
  |  Branch (711:8): [True: 14.9k, False: 23.8k]
  |  Branch (711:35): [True: 995, False: 22.8k]
  ------------------
  712|  15.9k|				break;
  713|  22.8k|			curResource = nextResource;
  714|  22.8k|		}
  715|       |
  716|       |		// set next resource for new resource. This must happen here for extendLayer to succeed
  717|  23.6k|		if (curResource != nullptr)
  ------------------
  |  Branch (717:7): [True: 15.9k, False: 7.71k]
  ------------------
  718|  15.9k|		{
  719|  15.9k|			if (curResource->getType() > newResource->getType())
  ------------------
  |  Branch (719:8): [True: 10, False: 15.9k]
  ------------------
  720|     10|				newResource->setNextResource(m_ResourceList);
  721|  15.9k|			else
  722|  15.9k|				newResource->setNextResource(curResource->getNextResource());
  723|  15.9k|		}
  724|  7.71k|		else
  725|  7.71k|		{
  726|       |			// curResource != nullptr
  727|  7.71k|			newResource->setNextResource(m_ResourceList);
  728|  7.71k|		}
  729|       |
  730|       |		// extend layer to make room for the new resource
  731|  23.6k|		if (!extendLayer(newResourceOffsetInLayer, newResource->getSize(), newResource))
  ------------------
  |  Branch (731:7): [True: 1.13k, False: 22.5k]
  ------------------
  732|  1.13k|		{
  733|  1.13k|			PCPP_LOG_ERROR("Couldn't extend DNS layer, addResource failed");
  ------------------
  |  |  445|  1.13k|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|  1.13k|	do                                                                                                                 \
  |  |  |  |  415|  1.13k|	{                                                                                                                  \
  |  |  |  |  416|  1.13k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  1.13k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.13k|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 1.13k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|  1.13k|		{                                                                                                              \
  |  |  |  |  419|  1.13k|			auto ctx =                                                                                                 \
  |  |  |  |  420|  1.13k|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.13k|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|  1.13k|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|  1.13k|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|  1.13k|		}                                                                                                              \
  |  |  |  |  424|  1.13k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 1.13k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  734|  1.13k|			delete newResource;
  735|  1.13k|			return nullptr;
  736|  1.13k|		}
  737|       |
  738|       |		// connect the new resource to layer
  739|  22.5k|		newResource->setDnsLayer(this, newResourceOffsetInLayer);
  740|       |
  741|       |		// connect the new resource to the layer's resource list
  742|  22.5k|		if (curResource != nullptr)
  ------------------
  |  Branch (742:7): [True: 15.3k, False: 7.16k]
  ------------------
  743|  15.3k|		{
  744|       |			// if the new resource should be the first resource in the packet, its next resource is already the current
  745|       |			// first resource, which must not point back to it
  746|  15.3k|			if (curResource->getType() <= newResource->getType())
  ------------------
  |  Branch (746:8): [True: 15.3k, False: 2]
  ------------------
  747|  15.3k|			{
  748|  15.3k|				curResource->setNextResource(newResource);
  749|  15.3k|			}
  750|       |			// this means the new resource is the first of it's type
  751|  15.3k|			if (curResource->getType() < newResource->getType())
  ------------------
  |  Branch (751:8): [True: 14.0k, False: 1.30k]
  ------------------
  752|  14.0k|			{
  753|  14.0k|				setFirstResource(resType, newResource);
  754|  14.0k|			}
  755|       |			// this means the new resource should be the first resource in the packet
  756|  1.30k|			else if (curResource->getType() > newResource->getType())
  ------------------
  |  Branch (756:13): [True: 2, False: 1.30k]
  ------------------
  757|      2|			{
  758|      2|				m_ResourceList = newResource;
  759|       |
  760|      2|				setFirstResource(resType, newResource);
  761|      2|			}
  762|  15.3k|		}
  763|  7.16k|		else  // curResource != nullptr, meaning this is the first resource in layer
  764|  7.16k|		{
  765|  7.16k|			m_ResourceList = newResource;
  766|       |
  767|  7.16k|			setFirstResource(resType, newResource);
  768|  7.16k|		}
  769|       |
  770|       |		// set the resource data after the resource is attached to the layer, so setData() can extend the layer
  771|       |		// by the size of the serialized RDATA
  772|  22.5k|		if (!newResource->setData(data))
  ------------------
  |  Branch (772:7): [True: 0, False: 22.5k]
  ------------------
  773|      0|		{
  774|      0|			PCPP_LOG_ERROR("Couldn't set new resource data");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  775|      0|			if (!removeResource(newResource))
  ------------------
  |  Branch (775:8): [True: 0, False: 0]
  ------------------
  776|      0|				PCPP_LOG_ERROR("Couldn't remove the new resource from the DNS layer");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  777|      0|			return nullptr;
  778|      0|		}
  779|       |
  780|  22.5k|		return newResource;
  781|  22.5k|	}
_ZN4pcpp8DnsLayer8addQueryERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_7DnsTypeENS_8DnsClassE:
  784|  8.26k|	{
  785|       |		// create new query on temporary buffer
  786|  8.26k|		uint8_t newQueryRawData[256];
  787|  8.26k|		DnsQuery* newQuery = new DnsQuery(newQueryRawData);
  788|       |
  789|  8.26k|		newQuery->setDnsClass(dnsClass);
  790|  8.26k|		newQuery->setDnsType(dnsType);
  791|       |
  792|       |		// cannot return false since layer shouldn't be extended or shortened in this stage
  793|  8.26k|		newQuery->setName(name);
  794|       |
  795|       |		// find the offset in the layer to insert the new query
  796|  8.26k|		size_t newQueryOffsetInLayer = getBasicHeaderSize();
  797|  8.26k|		DnsQuery* curQuery = getFirstQuery();
  798|  12.3k|		while (curQuery != nullptr)
  ------------------
  |  Branch (798:10): [True: 9.36k, False: 2.95k]
  ------------------
  799|  9.36k|		{
  800|  9.36k|			newQueryOffsetInLayer += curQuery->getSize();
  801|  9.36k|			DnsQuery* nextQuery = getNextQuery(curQuery);
  802|  9.36k|			if (nextQuery == nullptr)
  ------------------
  |  Branch (802:8): [True: 5.30k, False: 4.05k]
  ------------------
  803|  5.30k|				break;
  804|  4.05k|			curQuery = nextQuery;
  805|  4.05k|		}
  806|       |
  807|       |		// set next resource for new query. This must happen here for extendLayer to succeed
  808|  8.26k|		if (curQuery != nullptr)
  ------------------
  |  Branch (808:7): [True: 5.30k, False: 2.95k]
  ------------------
  809|  5.30k|			newQuery->setNextResource(curQuery->getNextResource());
  810|  2.95k|		else
  811|  2.95k|			newQuery->setNextResource(m_ResourceList);
  812|       |
  813|       |		// extend layer to make room for the new query
  814|  8.26k|		if (!extendLayer(newQueryOffsetInLayer, newQuery->getSize(), newQuery))
  ------------------
  |  Branch (814:7): [True: 767, False: 7.49k]
  ------------------
  815|    767|		{
  816|    767|			PCPP_LOG_ERROR("Couldn't extend DNS layer, addQuery failed");
  ------------------
  |  |  445|    767|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    767|	do                                                                                                                 \
  |  |  |  |  415|    767|	{                                                                                                                  \
  |  |  |  |  416|    767|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    767|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    767|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 767, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    767|		{                                                                                                              \
  |  |  |  |  419|    767|			auto ctx =                                                                                                 \
  |  |  |  |  420|    767|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    767|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    767|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    767|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    767|		}                                                                                                              \
  |  |  |  |  424|    767|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 767]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  817|    767|			delete newQuery;
  818|    767|			return nullptr;
  819|    767|		}
  820|       |
  821|       |		// connect the new query to layer
  822|  7.49k|		newQuery->setDnsLayer(this, newQueryOffsetInLayer);
  823|       |
  824|       |		// connect the new query to the layer's resource list
  825|  7.49k|		if (curQuery != nullptr)
  ------------------
  |  Branch (825:7): [True: 4.74k, False: 2.75k]
  ------------------
  826|  4.74k|			curQuery->setNextResource(newQuery);
  827|  2.75k|		else  // curQuery == nullptr, meaning this is the first query
  828|  2.75k|		{
  829|  2.75k|			m_ResourceList = newQuery;
  830|  2.75k|			m_FirstQuery = newQuery;
  831|  2.75k|		}
  832|       |
  833|       |		// increase number of queries
  834|  7.49k|		getDnsHeader()->numberOfQuestions = htobe16(getQueryCount() + 1);
  835|       |
  836|  7.49k|		return newQuery;
  837|  8.26k|	}
_ZN4pcpp8DnsLayer11removeQueryERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEb:
  848|  16.5k|	{
  849|  16.5k|		DnsQuery* queryToRemove = getQuery(queryNameToRemove, exactMatch);
  850|  16.5k|		if (queryToRemove == nullptr)
  ------------------
  |  Branch (850:7): [True: 9.13k, False: 7.38k]
  ------------------
  851|  9.13k|		{
  852|  9.13k|			PCPP_LOG_DEBUG("Query not found");
  ------------------
  |  |  427|  9.13k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  9.13k|	do                                                                                                                 \
  |  |  |  |  415|  9.13k|	{                                                                                                                  \
  |  |  |  |  416|  9.13k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  9.13k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  9.13k|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 9.13k]
  |  |  |  |  ------------------
  |  |  |  |  418|  9.13k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  9.13k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 9.13k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  853|  9.13k|			return false;
  854|  9.13k|		}
  855|       |
  856|  7.38k|		return removeQuery(queryToRemove);
  857|  16.5k|	}
_ZN4pcpp8DnsLayer11removeQueryEPNS_8DnsQueryE:
  860|  7.38k|	{
  861|  7.38k|		bool res = removeResource(queryToRemove);
  862|  7.38k|		if (res)
  ------------------
  |  Branch (862:7): [True: 7.38k, False: 0]
  ------------------
  863|  7.38k|		{
  864|       |			// decrease number of query records
  865|  7.38k|			getDnsHeader()->numberOfQuestions = htobe16(getQueryCount() - 1);
  866|  7.38k|		}
  867|       |
  868|  7.38k|		return res;
  869|  7.38k|	}
_ZN4pcpp8DnsLayer9addAnswerERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_7DnsTypeENS_8DnsClassEjPNS_16IDnsResourceDataE:
  873|  8.26k|	{
  874|  8.26k|		DnsResource* res = addResource(DnsAnswerType, name, dnsType, dnsClass, ttl, data);
  875|  8.26k|		if (res != nullptr)
  ------------------
  |  Branch (875:7): [True: 7.49k, False: 767]
  ------------------
  876|  7.49k|		{
  877|       |			// increase number of answer records
  878|  7.49k|			getDnsHeader()->numberOfAnswers = htobe16(getAnswerCount() + 1);
  879|  7.49k|		}
  880|       |
  881|  8.26k|		return res;
  882|  8.26k|	}
_ZN4pcpp8DnsLayer12removeAnswerERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEb:
  894|  16.5k|	{
  895|  16.5k|		DnsResource* answerToRemove = getAnswer(answerNameToRemove, exactMatch);
  896|  16.5k|		if (answerToRemove == nullptr)
  ------------------
  |  Branch (896:7): [True: 9.10k, False: 7.41k]
  ------------------
  897|  9.10k|		{
  898|  9.10k|			PCPP_LOG_DEBUG("Answer record not found");
  ------------------
  |  |  427|  9.10k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  9.10k|	do                                                                                                                 \
  |  |  |  |  415|  9.10k|	{                                                                                                                  \
  |  |  |  |  416|  9.10k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  9.10k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  9.10k|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 9.10k]
  |  |  |  |  ------------------
  |  |  |  |  418|  9.10k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  9.10k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 9.10k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  899|  9.10k|			return false;
  900|  9.10k|		}
  901|       |
  902|  7.41k|		return removeAnswer(answerToRemove);
  903|  16.5k|	}
_ZN4pcpp8DnsLayer12removeAnswerEPNS_11DnsResourceE:
  906|  7.41k|	{
  907|  7.41k|		bool res = removeResource(answerToRemove);
  908|  7.41k|		if (res)
  ------------------
  |  Branch (908:7): [True: 7.05k, False: 366]
  ------------------
  909|  7.05k|		{
  910|       |			// decrease number of answer records
  911|  7.05k|			getDnsHeader()->numberOfAnswers = htobe16(getAnswerCount() - 1);
  912|  7.05k|		}
  913|       |
  914|  7.41k|		return res;
  915|  7.41k|	}
_ZN4pcpp8DnsLayer12addAuthorityERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_7DnsTypeENS_8DnsClassEjPNS_16IDnsResourceDataE:
  919|  8.26k|	{
  920|  8.26k|		DnsResource* res = addResource(DnsAuthorityType, name, dnsType, dnsClass, ttl, data);
  921|  8.26k|		if (res != nullptr)
  ------------------
  |  Branch (921:7): [True: 7.51k, False: 745]
  ------------------
  922|  7.51k|		{
  923|       |			// increase number of authority records
  924|  7.51k|			getDnsHeader()->numberOfAuthority = htobe16(getAuthorityCount() + 1);
  925|  7.51k|		}
  926|       |
  927|  8.26k|		return res;
  928|  8.26k|	}
_ZN4pcpp8DnsLayer15removeAuthorityERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEb:
  940|  16.5k|	{
  941|  16.5k|		DnsResource* authorityToRemove = getAuthority(authorityNameToRemove, exactMatch);
  942|  16.5k|		if (authorityToRemove == nullptr)
  ------------------
  |  Branch (942:7): [True: 9.18k, False: 7.34k]
  ------------------
  943|  9.18k|		{
  944|  9.18k|			PCPP_LOG_DEBUG("Authority not found");
  ------------------
  |  |  427|  9.18k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  9.18k|	do                                                                                                                 \
  |  |  |  |  415|  9.18k|	{                                                                                                                  \
  |  |  |  |  416|  9.18k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  9.18k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  9.18k|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 9.18k]
  |  |  |  |  ------------------
  |  |  |  |  418|  9.18k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  9.18k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 9.18k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  945|  9.18k|			return false;
  946|  9.18k|		}
  947|       |
  948|  7.34k|		return removeAuthority(authorityToRemove);
  949|  16.5k|	}
_ZN4pcpp8DnsLayer15removeAuthorityEPNS_11DnsResourceE:
  952|  7.34k|	{
  953|  7.34k|		bool res = removeResource(authorityToRemove);
  954|  7.34k|		if (res)
  ------------------
  |  Branch (954:7): [True: 7.32k, False: 12]
  ------------------
  955|  7.32k|		{
  956|       |			// decrease number of authority records
  957|  7.32k|			getDnsHeader()->numberOfAuthority = htobe16(getAuthorityCount() - 1);
  958|  7.32k|		}
  959|       |
  960|  7.34k|		return res;
  961|  7.34k|	}
_ZN4pcpp8DnsLayer19addAdditionalRecordERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_7DnsTypeENS_8DnsClassEjPNS_16IDnsResourceDataE:
  965|  8.26k|	{
  966|  8.26k|		DnsResource* res = addResource(DnsAdditionalType, name, dnsType, dnsClass, ttl, data);
  967|  8.26k|		if (res != nullptr)
  ------------------
  |  Branch (967:7): [True: 7.51k, False: 743]
  ------------------
  968|  7.51k|		{
  969|       |			// increase number of authority records
  970|  7.51k|			getDnsHeader()->numberOfAdditional = htobe16(getAdditionalRecordCount() + 1);
  971|  7.51k|		}
  972|       |
  973|  8.26k|		return res;
  974|  8.26k|	}
_ZN4pcpp8DnsLayer19addAdditionalRecordERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_7DnsTypeEtjPNS_16IDnsResourceDataE:
  978|  8.26k|	{
  979|  8.26k|		DnsResource* res = addAdditionalRecord(name, dnsType, DNS_CLASS_ANY, customData2, data);
  980|  8.26k|		if (res != nullptr)
  ------------------
  |  Branch (980:7): [True: 7.51k, False: 743]
  ------------------
  981|  7.51k|		{
  982|  7.51k|			res->setCustomDnsClass(customData1);
  983|  7.51k|		}
  984|       |
  985|  8.26k|		return res;
  986|  8.26k|	}
_ZN4pcpp8DnsLayer22removeAdditionalRecordERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEb:
  999|  16.5k|	{
 1000|  16.5k|		DnsResource* additionalRecordToRemove = getAdditionalRecord(additionalRecordNameToRemove, exactMatch);
 1001|  16.5k|		if (additionalRecordToRemove == nullptr)
  ------------------
  |  Branch (1001:7): [True: 9.08k, False: 7.44k]
  ------------------
 1002|  9.08k|		{
 1003|  9.08k|			PCPP_LOG_DEBUG("Additional record not found");
  ------------------
  |  |  427|  9.08k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  9.08k|	do                                                                                                                 \
  |  |  |  |  415|  9.08k|	{                                                                                                                  \
  |  |  |  |  416|  9.08k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  9.08k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  9.08k|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 9.08k]
  |  |  |  |  ------------------
  |  |  |  |  418|  9.08k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  9.08k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 9.08k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1004|  9.08k|			return false;
 1005|  9.08k|		}
 1006|       |
 1007|  7.44k|		return removeAdditionalRecord(additionalRecordToRemove);
 1008|  16.5k|	}
_ZN4pcpp8DnsLayer22removeAdditionalRecordEPNS_11DnsResourceE:
 1011|  7.44k|	{
 1012|  7.44k|		bool res = removeResource(additionalRecordToRemove);
 1013|  7.44k|		if (res)
  ------------------
  |  Branch (1013:7): [True: 7.44k, False: 0]
  ------------------
 1014|  7.44k|		{
 1015|       |			// decrease number of additional records
 1016|  7.44k|			getDnsHeader()->numberOfAdditional = htobe16(getAdditionalRecordCount() - 1);
 1017|  7.44k|		}
 1018|       |
 1019|  7.44k|		return res;
 1020|  7.44k|	}
_ZN4pcpp8DnsLayer14removeResourceEPNS_12IDnsResourceE:
 1023|  29.5k|	{
 1024|  29.5k|		if (resourceToRemove == nullptr)
  ------------------
  |  Branch (1024:7): [True: 0, False: 29.5k]
  ------------------
 1025|      0|		{
 1026|      0|			PCPP_LOG_DEBUG("resourceToRemove cannot be nullptr");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1027|      0|			return false;
 1028|      0|		}
 1029|       |
 1030|       |		// find the resource preceding resourceToRemove
 1031|  29.5k|		IDnsResource* prevResource = m_ResourceList;
 1032|       |
 1033|  29.5k|		if (m_ResourceList != resourceToRemove)
  ------------------
  |  Branch (1033:7): [True: 20.1k, False: 9.41k]
  ------------------
 1034|  20.1k|		{
 1035|  44.2k|			while (prevResource != nullptr)
  ------------------
  |  Branch (1035:11): [True: 44.2k, False: 0]
  ------------------
 1036|  44.2k|			{
 1037|  44.2k|				IDnsResource* temp = prevResource->getNextResource();
 1038|  44.2k|				if (temp == resourceToRemove)
  ------------------
  |  Branch (1038:9): [True: 20.1k, False: 24.1k]
  ------------------
 1039|  20.1k|					break;
 1040|       |
 1041|  24.1k|				prevResource = temp;
 1042|  24.1k|			}
 1043|  20.1k|		}
 1044|       |
 1045|  29.5k|		if (prevResource == nullptr)
  ------------------
  |  Branch (1045:7): [True: 0, False: 29.5k]
  ------------------
 1046|      0|		{
 1047|      0|			PCPP_LOG_DEBUG("Resource not found");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1048|      0|			return false;
 1049|      0|		}
 1050|       |
 1051|       |		// shorten the layer and fix offset in layer for all next DNS resources in the packet
 1052|  29.5k|		if (!shortenLayer(resourceToRemove->m_OffsetInLayer, resourceToRemove->getSize(), resourceToRemove))
  ------------------
  |  Branch (1052:7): [True: 378, False: 29.2k]
  ------------------
 1053|    378|		{
 1054|    378|			PCPP_LOG_ERROR("Couldn't shorten the DNS layer, resource cannot be removed");
  ------------------
  |  |  445|    378|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    378|	do                                                                                                                 \
  |  |  |  |  415|    378|	{                                                                                                                  \
  |  |  |  |  416|    378|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    378|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    378|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 378, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    378|		{                                                                                                              \
  |  |  |  |  419|    378|			auto ctx =                                                                                                 \
  |  |  |  |  420|    378|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    378|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    378|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    378|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    378|		}                                                                                                              \
  |  |  |  |  424|    378|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 378]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1055|    378|			return false;
 1056|    378|		}
 1057|       |
 1058|       |		// remove resourceToRemove from the resources linked list
 1059|  29.2k|		if (m_ResourceList != resourceToRemove)
  ------------------
  |  Branch (1059:7): [True: 19.7k, False: 9.41k]
  ------------------
 1060|  19.7k|		{
 1061|  19.7k|			prevResource->setNextResource(resourceToRemove->getNextResource());
 1062|  19.7k|		}
 1063|  9.41k|		else
 1064|  9.41k|		{
 1065|  9.41k|			m_ResourceList = resourceToRemove->getNextResource();
 1066|  9.41k|		}
 1067|       |
 1068|       |		// check whether resourceToRemove was the first of its type
 1069|  29.2k|		if (getFirstResource(resourceToRemove->getType()) == resourceToRemove)
  ------------------
  |  Branch (1069:7): [True: 23.2k, False: 5.97k]
  ------------------
 1070|  23.2k|		{
 1071|  23.2k|			IDnsResource* nextResource = resourceToRemove->getNextResource();
 1072|  23.2k|			if (nextResource != nullptr && nextResource->getType() == resourceToRemove->getType())
  ------------------
  |  Branch (1072:8): [True: 833, False: 22.4k]
  |  Branch (1072:35): [True: 72, False: 761]
  ------------------
 1073|     72|				setFirstResource(resourceToRemove->getType(), nextResource);
 1074|  23.1k|			else
 1075|  23.1k|				setFirstResource(resourceToRemove->getType(), nullptr);
 1076|  23.2k|		}
 1077|       |
 1078|       |		// free resourceToRemove memory
 1079|  29.2k|		delete resourceToRemove;
 1080|       |
 1081|  29.2k|		return true;
 1082|  29.5k|	}
_ZN4pcpp15DnsOverTcpLayer19setTcpMessageLengthEt:
 1094|    554|	{
 1095|       |		((uint16_t*)m_Data)[0] = htobe16(value);
 1096|    554|	}
_ZN4pcpp15DnsOverTcpLayer22computeCalculateFieldsEv:
 1099|    554|	{
 1100|    554|		setTcpMessageLength(m_DataLen - sizeof(uint16_t));
 1101|    554|	}

_ZN4pcpp12IDnsResourceC2EPNS_8DnsLayerEm:
   14|   124k|	    : m_DnsLayer(dnsLayer), m_OffsetInLayer(offsetInLayer), m_NextResource(nullptr), m_ExternalRawData(nullptr)
   15|   124k|	{
   16|   124k|		char decodedName[4096];
   17|   124k|		m_NameLength = decodeName((const char*)getRawData(), decodedName);
   18|   124k|		if (m_NameLength > 0)
  ------------------
  |  Branch (18:7): [True: 106k, False: 17.9k]
  ------------------
   19|   106k|			m_DecodedName = decodedName;
   20|   124k|	}
_ZN4pcpp12IDnsResourceC2EPh:
   23|  33.0k|	    : m_DnsLayer(nullptr), m_OffsetInLayer(0), m_NextResource(nullptr), m_DecodedName(""), m_NameLength(0),
   24|  33.0k|	      m_ExternalRawData(emptyRawData)
   25|  33.0k|	{}
_ZNK4pcpp12IDnsResource10getRawDataEv:
   28|   495k|	{
   29|   495k|		if (m_DnsLayer == nullptr)
  ------------------
  |  Branch (29:7): [True: 194k, False: 300k]
  ------------------
   30|   194k|			return m_ExternalRawData;
   31|       |
   32|   300k|		return m_DnsLayer->m_Data + m_OffsetInLayer;
   33|   495k|	}
_ZN4pcpp12IDnsResource10decodeNameEPKcPci:
   54|   226k|	{
   55|   226k|		size_t encodedNameLength = 0;
   56|   226k|		size_t decodedNameLength = 0;
   57|   226k|		char* resultPtr = result;
   58|   226k|		resultPtr[0] = 0;
   59|       |
   60|   226k|		size_t curOffsetInLayer = (uint8_t*)encodedName - m_DnsLayer->m_Data;
   61|   226k|		if (curOffsetInLayer + 1 > m_DnsLayer->m_DataLen)
  ------------------
  |  Branch (61:7): [True: 1.11k, False: 224k]
  ------------------
   62|  1.11k|			return encodedNameLength;
   63|       |
   64|   224k|		if (iteration > 20)
  ------------------
  |  Branch (64:7): [True: 2.41k, False: 222k]
  ------------------
   65|  2.41k|		{
   66|  2.41k|			return encodedNameLength;
   67|  2.41k|		}
   68|       |
   69|   222k|		uint8_t wordLength = encodedName[0];
   70|       |
   71|       |		// A string to parse
   72|   455k|		while (wordLength != 0)
  ------------------
  |  Branch (72:10): [True: 363k, False: 92.0k]
  ------------------
   73|   363k|		{
   74|       |			// A pointer to another place in the packet
   75|   363k|			if ((wordLength & 0xc0) == 0xc0)
  ------------------
  |  Branch (75:8): [True: 119k, False: 243k]
  ------------------
   76|   119k|			{
   77|   119k|				if (curOffsetInLayer + 2 > m_DnsLayer->m_DataLen || encodedNameLength > 255)
  ------------------
  |  Branch (77:9): [True: 58, False: 119k]
  |  Branch (77:57): [True: 7, False: 119k]
  ------------------
   78|     65|					return cleanup(resultPtr, result, encodedNameLength);
   79|       |
   80|   119k|				uint16_t offsetInLayer =
   81|   119k|				    (wordLength & 0x3f) * 256 + (0xFF & encodedName[1]) + m_DnsLayer->m_OffsetAdjustment;
   82|   119k|				if (offsetInLayer < sizeof(dnshdr) || offsetInLayer >= m_DnsLayer->m_DataLen)
  ------------------
  |  Branch (82:9): [True: 14, False: 119k]
  |  Branch (82:43): [True: 17.8k, False: 101k]
  ------------------
   83|  17.8k|				{
   84|  17.8k|					PCPP_LOG_ERROR("DNS parsing error: name pointer is illegal");
  ------------------
  |  |  445|  17.8k|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|  17.8k|	do                                                                                                                 \
  |  |  |  |  415|  17.8k|	{                                                                                                                  \
  |  |  |  |  416|  17.8k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  17.8k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  17.8k|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 17.8k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|  17.8k|		{                                                                                                              \
  |  |  |  |  419|  17.8k|			auto ctx =                                                                                                 \
  |  |  |  |  420|  17.8k|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  17.8k|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|  17.8k|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|  17.8k|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|  17.8k|		}                                                                                                              \
  |  |  |  |  424|  17.8k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 17.8k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   85|  17.8k|					return 0;
   86|  17.8k|				}
   87|       |
   88|   101k|				char tempResult[4096];
   89|   101k|				memset(tempResult, 0, sizeof(tempResult));
   90|   101k|				int i = 0;
   91|   101k|				decodeName((const char*)(m_DnsLayer->m_Data + offsetInLayer), tempResult, iteration + 1);
   92|  1.65M|				while (tempResult[i] != 0 && decodedNameLength < 255)
  ------------------
  |  Branch (92:12): [True: 1.55M, False: 99.8k]
  |  Branch (92:34): [True: 1.54M, False: 1.93k]
  ------------------
   93|  1.54M|				{
   94|  1.54M|					resultPtr[0] = tempResult[i++];
   95|  1.54M|					resultPtr++;
   96|  1.54M|					decodedNameLength++;
   97|  1.54M|				}
   98|       |
   99|   101k|				resultPtr[0] = 0;
  100|       |
  101|       |				// in this case the length of the pointer is: 1 byte for 0xc0 + 1 byte for the offset itself
  102|   101k|				return encodedNameLength + sizeof(uint16_t);
  103|   119k|			}
  104|   243k|			else
  105|   243k|			{
  106|       |				// return if next word would be outside of the DNS layer or overflow the buffer behind resultPtr
  107|   243k|				if (curOffsetInLayer + wordLength + 1 > m_DnsLayer->m_DataLen || encodedNameLength + wordLength > 255)
  ------------------
  |  Branch (107:9): [True: 3.92k, False: 239k]
  |  Branch (107:70): [True: 6.65k, False: 233k]
  ------------------
  108|  10.5k|				{
  109|       |					// add the last '\0' to the decoded string
  110|  10.5k|					if (encodedNameLength == 256)
  ------------------
  |  Branch (110:10): [True: 24, False: 10.5k]
  ------------------
  111|     24|					{
  112|     24|						resultPtr--;
  113|       |						// cppcheck-suppress unreadVariable
  114|     24|						decodedNameLength--;
  115|     24|					}
  116|  10.5k|					else
  117|  10.5k|					{
  118|  10.5k|						encodedNameLength++;
  119|  10.5k|					}
  120|       |
  121|  10.5k|					resultPtr[0] = 0;
  122|  10.5k|					return encodedNameLength;
  123|  10.5k|				}
  124|       |
  125|   233k|				memcpy(resultPtr, encodedName + 1, wordLength);
  126|   233k|				resultPtr += wordLength;
  127|   233k|				resultPtr[0] = '.';
  128|   233k|				resultPtr++;
  129|   233k|				decodedNameLength += wordLength + 1;
  130|   233k|				encodedName += wordLength + 1;
  131|   233k|				encodedNameLength += wordLength + 1;
  132|       |
  133|   233k|				curOffsetInLayer = (uint8_t*)encodedName - m_DnsLayer->m_Data;
  134|   233k|				if (curOffsetInLayer + 1 > m_DnsLayer->m_DataLen)
  ------------------
  |  Branch (134:9): [True: 180, False: 232k]
  ------------------
  135|    180|				{
  136|       |					// add the last '\0' to the decoded string
  137|    180|					if (encodedNameLength == 256)
  ------------------
  |  Branch (137:10): [True: 147, False: 33]
  ------------------
  138|    147|					{
  139|       |						// cppcheck-suppress unreadVariable
  140|    147|						decodedNameLength--;
  141|    147|						resultPtr--;
  142|    147|					}
  143|     33|					else
  144|     33|					{
  145|     33|						encodedNameLength++;
  146|     33|					}
  147|       |
  148|    180|					resultPtr[0] = 0;
  149|    180|					return encodedNameLength;
  150|    180|				}
  151|       |
  152|   232k|				wordLength = encodedName[0];
  153|   232k|			}
  154|   363k|		}
  155|       |
  156|  92.0k|		return cleanup(resultPtr, result, encodedNameLength);
  157|   222k|	}
_ZN4pcpp12IDnsResource10encodeNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPcRm:
  160|  33.0k|	{
  161|  33.0k|		resultLen = 0;
  162|  33.0k|		std::stringstream strstream(decodedName);
  163|  33.0k|		std::string word;
  164|   123k|		while (getline(strstream, word, '.'))
  ------------------
  |  Branch (164:10): [True: 90.8k, False: 33.0k]
  ------------------
  165|  90.8k|		{
  166|       |			// pointer to a different hostname in the packet
  167|  90.8k|			if (word[0] == '#')
  ------------------
  |  Branch (167:8): [True: 0, False: 90.8k]
  ------------------
  168|      0|			{
  169|       |				// convert the number from string to int
  170|      0|				std::stringstream stream(word.substr(1));
  171|      0|				int pointerInPacket = 0;
  172|      0|				stream >> pointerInPacket;
  173|       |
  174|       |				// verify it's indeed a number and that is in the range of [0-255]
  175|      0|				if (stream.fail() || pointerInPacket < 0 || pointerInPacket > 0xff)
  ------------------
  |  Branch (175:9): [True: 0, False: 0]
  |  Branch (175:26): [True: 0, False: 0]
  |  Branch (175:49): [True: 0, False: 0]
  ------------------
  176|      0|				{
  177|      0|					PCPP_LOG_ERROR("Error encoding the string '" << decodedName << "'");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  178|      0|					return;
  179|      0|				}
  180|       |
  181|       |				// set the pointer to the encoded string result
  182|      0|				result[0] = (uint8_t)0xc0;
  183|      0|				result[1] = (uint8_t)pointerInPacket;
  184|      0|				resultLen += 2;
  185|      0|				return;  // pointer always comes last
  186|      0|			}
  187|       |
  188|  90.8k|			result[0] = word.length();
  189|  90.8k|			result++;
  190|  90.8k|			memcpy(result, word.c_str(), word.length());
  191|  90.8k|			result += word.length();
  192|  90.8k|			resultLen += word.length() + 1;
  193|  90.8k|		}
  194|       |
  195|  33.0k|		result[0] = 0;
  196|  33.0k|		resultLen++;
  197|  33.0k|	}
_ZNK4pcpp12IDnsResource10getDnsTypeEv:
  200|  22.5k|	{
  201|  22.5k|		uint16_t dnsType = *reinterpret_cast<uint16_t*>(getRawData() + m_NameLength);
  202|       |		return static_cast<DnsType>(be16toh(dnsType));
  203|  22.5k|	}
_ZN4pcpp12IDnsResource10setDnsTypeENS_7DnsTypeE:
  206|  33.0k|	{
  207|       |		uint16_t newTypeAsInt = htobe16((uint16_t)newType);
  208|  33.0k|		memcpy(getRawData() + m_NameLength, &newTypeAsInt, sizeof(uint16_t));
  209|  33.0k|	}
_ZN4pcpp12IDnsResource11setDnsClassENS_8DnsClassE:
  218|  33.0k|	{
  219|       |		uint16_t newClassAsInt = htobe16((uint16_t)newClass);
  220|  33.0k|		memcpy(getRawData() + m_NameLength + sizeof(uint16_t), &newClassAsInt, sizeof(uint16_t));
  221|  33.0k|	}
_ZN4pcpp12IDnsResource7setNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  224|  33.0k|	{
  225|  33.0k|		char encodedName[4096];
  226|  33.0k|		size_t encodedNameLen = 0;
  227|  33.0k|		encodeName(newName, encodedName, encodedNameLen);
  228|  33.0k|		if (m_DnsLayer != nullptr)
  ------------------
  |  Branch (228:7): [True: 0, False: 33.0k]
  ------------------
  229|      0|		{
  230|      0|			if (encodedNameLen > m_NameLength)
  ------------------
  |  Branch (230:8): [True: 0, False: 0]
  ------------------
  231|      0|			{
  232|      0|				if (!m_DnsLayer->extendLayer(m_OffsetInLayer, encodedNameLen - m_NameLength, this))
  ------------------
  |  Branch (232:9): [True: 0, False: 0]
  ------------------
  233|      0|				{
  234|      0|					PCPP_LOG_ERROR("Couldn't set name for DNS query, unable to extend layer");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  235|      0|					return false;
  236|      0|				}
  237|      0|			}
  238|      0|			else if (encodedNameLen < m_NameLength)
  ------------------
  |  Branch (238:13): [True: 0, False: 0]
  ------------------
  239|      0|			{
  240|      0|				if (!m_DnsLayer->shortenLayer(m_OffsetInLayer, m_NameLength - encodedNameLen, this))
  ------------------
  |  Branch (240:9): [True: 0, False: 0]
  ------------------
  241|      0|				{
  242|      0|					PCPP_LOG_ERROR("Couldn't set name for DNS query, unable to shorten layer");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  243|      0|					return false;
  244|      0|				}
  245|      0|			}
  246|      0|		}
  247|  33.0k|		else
  248|  33.0k|		{
  249|  33.0k|			size_t size = getSize();
  250|  33.0k|			char* tempData = new char[size];
  251|  33.0k|			memcpy(tempData, m_ExternalRawData, size);
  252|  33.0k|			memcpy(m_ExternalRawData + encodedNameLen, tempData, size);
  253|  33.0k|			delete[] tempData;
  254|  33.0k|		}
  255|       |
  256|  33.0k|		memcpy(getRawData(), encodedName, encodedNameLen);
  257|  33.0k|		m_NameLength = encodedNameLen;
  258|  33.0k|		m_DecodedName = newName;
  259|       |
  260|  33.0k|		return true;
  261|  33.0k|	}
_ZN4pcpp12IDnsResource11setDnsLayerEPNS_8DnsLayerEm:
  264|  30.0k|	{
  265|  30.0k|		memcpy(dnsLayer->m_Data + offsetInLayer, m_ExternalRawData, getSize());
  266|  30.0k|		m_DnsLayer = dnsLayer;
  267|  30.0k|		m_OffsetInLayer = offsetInLayer;
  268|  30.0k|		m_ExternalRawData = nullptr;
  269|  30.0k|	}
_ZN4pcpp11DnsResource6setTTLEj:
  278|  24.7k|	{
  279|       |		newTTL = htobe32(newTTL);
  280|  24.7k|		memcpy(getRawData() + m_NameLength + 2 * sizeof(uint16_t), &newTTL, sizeof(uint32_t));
  281|  24.7k|	}
_ZNK4pcpp11DnsResource13getDataLengthEv:
  284|   181k|	{
  285|       |
  286|   181k|		size_t sizeToRead = m_NameLength + 2 * sizeof(uint16_t) + sizeof(uint32_t);
  287|       |
  288|       |		// Heap buffer overflow may occur here, check boundary of m_DnsLayer->m_Data first
  289|       |		// Due to dataLength which is uint16_t, here m_DnsLayer->m_Data must have at least 2 bytes to read
  290|   181k|		if (m_DnsLayer && m_OffsetInLayer + sizeToRead >= m_DnsLayer->m_DataLen - 1)
  ------------------
  |  Branch (290:7): [True: 110k, False: 70.9k]
  |  Branch (290:21): [True: 9.54k, False: 101k]
  ------------------
  291|  9.54k|		{
  292|  9.54k|			return 0;
  293|  9.54k|		}
  294|       |
  295|   172k|		uint16_t dataLength = *reinterpret_cast<uint16_t*>(getRawData() + sizeToRead);
  296|       |		return be16toh(dataLength);
  297|   181k|	}
_ZN4pcpp11DnsResource7setDataEPNS_16IDnsResourceDataE:
  344|  22.5k|	{
  345|  22.5k|		if (data == nullptr)
  ------------------
  |  Branch (345:7): [True: 0, False: 22.5k]
  ------------------
  346|      0|		{
  347|      0|			PCPP_LOG_ERROR("Given data is nullptr");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  348|      0|			return false;
  349|      0|		}
  350|       |
  351|  22.5k|		switch (getDnsType())
  352|  22.5k|		{
  353|  15.0k|		case DNS_TYPE_A:
  ------------------
  |  Branch (353:3): [True: 15.0k, False: 7.51k]
  ------------------
  354|  15.0k|		{
  355|  15.0k|			if (!data->isTypeOf<IPv4DnsResourceData>())
  ------------------
  |  Branch (355:8): [True: 0, False: 15.0k]
  ------------------
  356|      0|			{
  357|      0|				PCPP_LOG_ERROR("DNS record is of type A but given data isn't of type IPv4DnsResourceData");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  358|      0|				return false;
  359|      0|			}
  360|  15.0k|			break;
  361|  15.0k|		}
  362|       |
  363|  15.0k|		case DNS_TYPE_AAAA:
  ------------------
  |  Branch (363:3): [True: 0, False: 22.5k]
  ------------------
  364|      0|		{
  365|      0|			if (!data->isTypeOf<IPv6DnsResourceData>())
  ------------------
  |  Branch (365:8): [True: 0, False: 0]
  ------------------
  366|      0|			{
  367|      0|				PCPP_LOG_ERROR("DNS record is of type AAAA but given data isn't of type IPv6DnsResourceData");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  368|      0|				return false;
  369|      0|			}
  370|      0|			break;
  371|      0|		}
  372|       |
  373|      0|		case DNS_TYPE_NS:
  ------------------
  |  Branch (373:3): [True: 0, False: 22.5k]
  ------------------
  374|      0|		case DNS_TYPE_CNAME:
  ------------------
  |  Branch (374:3): [True: 0, False: 22.5k]
  ------------------
  375|      0|		case DNS_TYPE_DNAM:
  ------------------
  |  Branch (375:3): [True: 0, False: 22.5k]
  ------------------
  376|      0|		case DNS_TYPE_PTR:
  ------------------
  |  Branch (376:3): [True: 0, False: 22.5k]
  ------------------
  377|      0|		{
  378|      0|			if (!data->isTypeOf<StringDnsResourceData>())
  ------------------
  |  Branch (378:8): [True: 0, False: 0]
  ------------------
  379|      0|			{
  380|      0|				PCPP_LOG_ERROR(
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  381|      0|				    "DNS record is of type NS, CNAME, DNAM or PTR but given data isn't of type StringDnsResourceData");
  382|      0|				return false;
  383|      0|			}
  384|      0|			break;
  385|      0|		}
  386|       |
  387|      0|		case DNS_TYPE_MX:
  ------------------
  |  Branch (387:3): [True: 0, False: 22.5k]
  ------------------
  388|      0|		{
  389|      0|			if (!data->isTypeOf<MxDnsResourceData>())
  ------------------
  |  Branch (389:8): [True: 0, False: 0]
  ------------------
  390|      0|			{
  391|      0|				PCPP_LOG_ERROR("DNS record is of type MX but given data isn't of type MxDnsResourceData");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  392|      0|				return false;
  393|      0|			}
  394|      0|			break;
  395|      0|		}
  396|       |
  397|  7.51k|		default:
  ------------------
  |  Branch (397:3): [True: 7.51k, False: 15.0k]
  ------------------
  398|  7.51k|		{
  399|       |			// do nothing
  400|  7.51k|		}
  401|  22.5k|		}
  402|       |
  403|       |		// convert the IDnsResourceData to a byte array
  404|  22.5k|		std::vector<uint8_t> dataAsByteArr = data->toBytes(this);
  405|  22.5k|		if (dataAsByteArr.empty())
  ------------------
  |  Branch (405:7): [True: 0, False: 22.5k]
  ------------------
  406|      0|		{
  407|      0|			PCPP_LOG_ERROR("Cannot convert DNS resource data to byte array, data is probably invalid");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  408|      0|			return false;
  409|      0|		}
  410|       |
  411|  22.5k|		size_t dataLength = dataAsByteArr.size();
  412|       |
  413|       |		// DNS RR data length is encoded in a 16-bit field. Parentheses around max avoid a clash with the
  414|       |		// Windows max macro
  415|  22.5k|		if (dataLength > (std::numeric_limits<uint16_t>::max)())
  ------------------
  |  Branch (415:7): [True: 0, False: 22.5k]
  ------------------
  416|      0|		{
  417|      0|			PCPP_LOG_ERROR("DNS resource data is too large: " << dataLength);
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  418|      0|			return false;
  419|      0|		}
  420|       |
  421|  22.5k|		size_t dataLengthOffset = m_NameLength + (2 * sizeof(uint16_t)) + sizeof(uint32_t);
  422|  22.5k|		size_t dataOffset = dataLengthOffset + sizeof(uint16_t);
  423|       |
  424|  22.5k|		if (m_DnsLayer != nullptr)
  ------------------
  |  Branch (424:7): [True: 22.5k, False: 0]
  ------------------
  425|  22.5k|		{
  426|  22.5k|			size_t curLength = getDataLength();
  427|  22.5k|			if (dataLength > curLength)
  ------------------
  |  Branch (427:8): [True: 22.5k, False: 0]
  ------------------
  428|  22.5k|			{
  429|  22.5k|				if (!m_DnsLayer->extendLayer(m_OffsetInLayer + dataOffset, dataLength - curLength, this))
  ------------------
  |  Branch (429:9): [True: 0, False: 22.5k]
  ------------------
  430|      0|				{
  431|      0|					PCPP_LOG_ERROR("Couldn't set data for DNS query, unable to extend layer");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  432|      0|					return false;
  433|      0|				}
  434|  22.5k|			}
  435|      0|			else if (dataLength < curLength)
  ------------------
  |  Branch (435:13): [True: 0, False: 0]
  ------------------
  436|      0|			{
  437|      0|				if (!m_DnsLayer->shortenLayer(m_OffsetInLayer + dataOffset, curLength - dataLength, this))
  ------------------
  |  Branch (437:9): [True: 0, False: 0]
  ------------------
  438|      0|				{
  439|      0|					PCPP_LOG_ERROR("Couldn't set data for DNS query, unable to shorten layer");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  440|      0|					return false;
  441|      0|				}
  442|      0|			}
  443|  22.5k|		}
  444|       |
  445|       |		// write data to resource
  446|  22.5k|		memcpy(getRawData() + dataOffset, dataAsByteArr.data(), dataLength);
  447|       |		// update data length in resource
  448|  22.5k|		dataLength = htobe16((uint16_t)dataLength);
  449|  22.5k|		memcpy(getRawData() + dataLengthOffset, &dataLength, sizeof(uint16_t));
  450|       |
  451|  22.5k|		return true;
  452|  22.5k|	}
_ZN4pcpp11DnsResource17setCustomDnsClassEt:
  461|  7.51k|	{
  462|  7.51k|		memcpy(getRawData() + m_NameLength + sizeof(uint16_t), &customValue, sizeof(uint16_t));
  463|  7.51k|	}
DnsResource.cpp:_ZN4pcppL7cleanupEPcS0_m:
   36|  92.0k|	{
   37|       |		// remove the last "."
   38|  92.0k|		if (resultPtr > result)
  ------------------
  |  Branch (38:7): [True: 63.0k, False: 29.0k]
  ------------------
   39|  63.0k|		{
   40|  63.0k|			result[resultPtr - result - 1] = 0;
   41|  63.0k|		}
   42|       |
   43|  92.0k|		if (resultPtr - result < 256)
  ------------------
  |  Branch (43:7): [True: 92.0k, False: 7]
  ------------------
   44|  92.0k|		{
   45|       |			// add the last '\0' to encodedNameLength
   46|  92.0k|			resultPtr[0] = 0;
   47|  92.0k|			encodedNameLength++;
   48|  92.0k|		}
   49|       |
   50|  92.0k|		return encodedNameLength;
   51|  92.0k|	}

_ZNK4pcpp19IPv4DnsResourceData7toBytesEPNS_12IDnsResourceE:
   86|  15.0k|	{
   87|  15.0k|		std::vector<uint8_t> result(sizeof(uint32_t));
   88|  15.0k|		memcpy(result.data(), m_Data.toBytes(), sizeof(uint32_t));
   89|  15.0k|		return result;
   90|  15.0k|	}
_ZN4pcpp22GenericDnsResourceDataC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  176|  8.26k|	{
  177|  8.26k|		m_Data = nullptr;
  178|  8.26k|		uint8_t tempDataArr[2048];
  179|  8.26k|		m_DataLen = hexStringToByteArray(dataAsHexString, tempDataArr, 2048);
  180|  8.26k|		if (m_DataLen != 0)
  ------------------
  |  Branch (180:7): [True: 8.26k, False: 0]
  ------------------
  181|  8.26k|		{
  182|  8.26k|			m_Data = new uint8_t[m_DataLen];
  183|  8.26k|			memcpy(m_Data, tempDataArr, m_DataLen);
  184|  8.26k|		}
  185|  8.26k|	}
_ZNK4pcpp22GenericDnsResourceData7toBytesEPNS_12IDnsResourceE:
  233|  7.51k|	{
  234|  7.51k|		if (m_DataLen == 0 || m_Data == nullptr)
  ------------------
  |  Branch (234:7): [True: 0, False: 7.51k]
  |  Branch (234:25): [True: 0, False: 7.51k]
  ------------------
  235|      0|		{
  236|      0|			PCPP_LOG_ERROR("Input data is null or illegal" << "|m_DataLen:" << m_DataLen);
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleDnsLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  237|      0|			return {};
  238|      0|		}
  239|       |
  240|  7.51k|		return std::vector<uint8_t>(m_Data, m_Data + m_DataLen);
  241|  7.51k|	}

_ZN4pcpp9DoIpLayer11isDataValidEPhm:
  203|      5|	{
  204|      5|		if (data == nullptr || dataLen < DOIP_HEADER_LEN)
  ------------------
  |  Branch (204:7): [True: 0, False: 5]
  |  Branch (204:26): [True: 0, False: 5]
  ------------------
  205|      0|			return false;
  206|       |
  207|      5|		auto* doipHeader = reinterpret_cast<doiphdr*>(data);
  208|      5|		const uint8_t version = doipHeader->protocolVersion;
  209|      5|		const uint8_t inVersion = doipHeader->invertProtocolVersion;
  210|      5|		const uint16_t payloadTypeRaw = doipHeader->payloadType;
  211|      5|		const uint32_t lengthRaw = doipHeader->payloadLength;
  212|       |
  213|      5|		if (!isPayloadTypeValid(be16toh(payloadTypeRaw)))
  ------------------
  |  Branch (213:7): [True: 5, False: 0]
  ------------------
  214|      5|			return false;
  215|       |		// if payload type is validated, we ensure passing a valid type to isProtocolVersionValid()
  216|      0|		const DoIpPayloadTypes payloadType = static_cast<DoIpPayloadTypes>(be16toh(payloadTypeRaw));
  217|      0|		if (!isProtocolVersionValid(version, inVersion, payloadType))
  ------------------
  |  Branch (217:7): [True: 0, False: 0]
  ------------------
  218|      0|			return false;
  219|       |
  220|      0|		if (!isPayloadLengthValid(be32toh(lengthRaw), dataLen))
  ------------------
  |  Branch (220:7): [True: 0, False: 0]
  ------------------
  221|      0|			return false;
  222|       |
  223|      0|		return true;
  224|      0|	}

_ZN4pcpp12EthDot3Layer14parseNextLayerEv:
   23|  8.20k|	{
   24|  8.20k|		if (m_DataLen <= sizeof(ether_dot3_header))
  ------------------
  |  Branch (24:7): [True: 0, False: 8.20k]
  ------------------
   25|      0|			return;
   26|       |
   27|  8.20k|		uint8_t* payload = m_Data + sizeof(ether_dot3_header);
   28|  8.20k|		size_t payloadLen = m_DataLen - sizeof(ether_dot3_header);
   29|       |
   30|  8.20k|		tryConstructNextLayerWithFallback<LLCLayer, PayloadLayer>(payload, payloadLen);
   31|  8.20k|	}
_ZNK4pcpp12EthDot3Layer8toStringEv:
   34|  3.54k|	{
   35|  3.54k|		return "IEEE 802.3 Ethernet, Src: " + getSourceMac().toString() + ", Dst: " + getDestMac().toString();
   36|  3.54k|	}
_ZN4pcpp12EthDot3Layer11isDataValidEPKhm:
   39|  8.54k|	{
   40|  8.54k|		if (dataLen >= sizeof(ether_dot3_header))
  ------------------
  |  Branch (40:7): [True: 8.22k, False: 324]
  ------------------
   41|  8.22k|		{
   42|       |			// LSAPs: ... Such a length must, when considered as an
   43|       |			// unsigned integer, be less than 0x5DC or it could be mistaken as
   44|       |			// an Ethertype...
   45|       |			//
   46|       |			// From: https://tools.ietf.org/html/rfc5342#section-2.3.2.1
   47|       |			// More: IEEE Std 802.3 Clause 3.2.6
   48|  8.22k|			return be16toh(*reinterpret_cast<const uint16_t*>(data + 12)) <= static_cast<uint16_t>(0x05DC);
   49|  8.22k|		}
   50|    324|		else
   51|    324|		{
   52|    324|			return false;
   53|    324|		}
   54|  8.54k|	}

_ZN4pcpp8EthLayer14parseNextLayerEv:
   29|   765k|	{
   30|   765k|		if (m_DataLen <= sizeof(ether_header))
  ------------------
  |  Branch (30:7): [True: 258, False: 765k]
  ------------------
   31|    258|			return;
   32|       |
   33|   765k|		ether_header* hdr = getEthHeader();
   34|   765k|		uint8_t* payload = m_Data + sizeof(ether_header);
   35|   765k|		size_t payloadLen = m_DataLen - sizeof(ether_header);
   36|       |
   37|   765k|		switch (be16toh(hdr->etherType))
  ------------------
  |  Branch (37:11): [True: 762k, False: 3.20k]
  ------------------
   38|   765k|		{
   39|   599k|		case PCPP_ETHERTYPE_IP:
  ------------------
  |  |   33|   599k|#define PCPP_ETHERTYPE_IP 0x0800
  ------------------
  |  Branch (39:3): [True: 599k, False: 166k]
  ------------------
   40|   599k|			tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen);
   41|   599k|			break;
   42|  95.1k|		case PCPP_ETHERTYPE_IPV6:
  ------------------
  |  |   49|  95.1k|#define PCPP_ETHERTYPE_IPV6 0x86dd
  ------------------
  |  Branch (42:3): [True: 95.1k, False: 670k]
  ------------------
   43|  95.1k|			tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen);
   44|  95.1k|			break;
   45|  10.9k|		case PCPP_ETHERTYPE_ARP:
  ------------------
  |  |   35|  10.9k|#define PCPP_ETHERTYPE_ARP 0x0806
  ------------------
  |  Branch (45:3): [True: 10.9k, False: 754k]
  ------------------
   46|  10.9k|			tryConstructNextLayerWithFallback<ArpLayer, PayloadLayer>(payload, payloadLen);
   47|  10.9k|			break;
   48|  34.1k|		case PCPP_ETHERTYPE_VLAN:
  ------------------
  |  |   45|  34.1k|#define PCPP_ETHERTYPE_VLAN 0x8100
  ------------------
  |  Branch (48:3): [True: 34.1k, False: 731k]
  ------------------
   49|  46.8k|		case PCPP_ETHERTYPE_IEEE_802_1AD:
  ------------------
  |  |   63|  46.8k|#define PCPP_ETHERTYPE_IEEE_802_1AD 0x88A8
  ------------------
  |  Branch (49:3): [True: 12.7k, False: 752k]
  ------------------
   50|  46.8k|			tryConstructNextLayerWithFallback<VlanLayer, PayloadLayer>(payload, payloadLen);
   51|  46.8k|			break;
   52|  3.49k|		case PCPP_ETHERTYPE_PPPOES:
  ------------------
  |  |   55|  3.49k|#define PCPP_ETHERTYPE_PPPOES 0x8864
  ------------------
  |  Branch (52:3): [True: 3.49k, False: 762k]
  ------------------
   53|  3.49k|			tryConstructNextLayerWithFallback<PPPoESessionLayer, PayloadLayer>(payload, payloadLen);
   54|  3.49k|			break;
   55|  2.73k|		case PCPP_ETHERTYPE_PPPOED:
  ------------------
  |  |   53|  2.73k|#define PCPP_ETHERTYPE_PPPOED 0x8863
  ------------------
  |  Branch (55:3): [True: 2.73k, False: 762k]
  ------------------
   56|  2.73k|			tryConstructNextLayerWithFallback<PPPoEDiscoveryLayer, PayloadLayer>(payload, payloadLen);
   57|  2.73k|			break;
   58|  3.24k|		case PCPP_ETHERTYPE_MPLS:
  ------------------
  |  |   57|  3.24k|#define PCPP_ETHERTYPE_MPLS 0x8847
  ------------------
  |  Branch (58:3): [True: 3.24k, False: 762k]
  ------------------
   59|  3.24k|			tryConstructNextLayerWithFallback<MplsLayer, PayloadLayer>(payload, payloadLen);
   60|  3.24k|			break;
   61|    342|		case PCPP_ETHERTYPE_WAKE_ON_LAN:
  ------------------
  |  |   65|    342|#define PCPP_ETHERTYPE_WAKE_ON_LAN 0x0842
  ------------------
  |  Branch (61:3): [True: 342, False: 765k]
  ------------------
   62|    342|			tryConstructNextLayerWithFallback<WakeOnLanLayer, PayloadLayer>(payload, payloadLen);
   63|    342|			break;
   64|   765k|		}
   65|       |
   66|       |		// If no next layer was constructed, assume it's a payload layer
   67|   765k|		if (!hasNextLayer())
  ------------------
  |  Branch (67:7): [True: 3.20k, False: 762k]
  ------------------
   68|  3.20k|			constructNextLayer<PayloadLayer>(payload, payloadLen);
   69|   765k|	}
_ZN4pcpp8EthLayer22computeCalculateFieldsEv:
   72|   144k|	{
   73|   144k|		if (m_NextLayer == nullptr)
  ------------------
  |  Branch (73:7): [True: 129, False: 144k]
  ------------------
   74|    129|			return;
   75|       |
   76|   144k|		switch (m_NextLayer->getProtocol())
   77|   144k|		{
   78|   113k|		case IPv4:
  ------------------
  |  Branch (78:3): [True: 113k, False: 30.7k]
  ------------------
   79|   113k|			getEthHeader()->etherType = htobe16(PCPP_ETHERTYPE_IP);
   80|   113k|			break;
   81|  19.3k|		case IPv6:
  ------------------
  |  Branch (81:3): [True: 19.3k, False: 125k]
  ------------------
   82|  19.3k|			getEthHeader()->etherType = htobe16(PCPP_ETHERTYPE_IPV6);
   83|  19.3k|			break;
   84|  3.02k|		case ARP:
  ------------------
  |  Branch (84:3): [True: 3.02k, False: 141k]
  ------------------
   85|  3.02k|			getEthHeader()->etherType = htobe16(PCPP_ETHERTYPE_ARP);
   86|  3.02k|			break;
   87|  5.20k|		case VLAN:
  ------------------
  |  Branch (87:3): [True: 5.20k, False: 139k]
  ------------------
   88|  5.20k|			getEthHeader()->etherType = htobe16(PCPP_ETHERTYPE_VLAN);
   89|  5.20k|			break;
   90|  3.16k|		default:
  ------------------
  |  Branch (90:3): [True: 3.16k, False: 141k]
  ------------------
   91|  3.16k|			return;
   92|   144k|		}
   93|   144k|	}
_ZNK4pcpp8EthLayer8toStringEv:
   96|   289k|	{
   97|   289k|		return "Ethernet II Layer, Src: " + getSourceMac().toString() + ", Dst: " + getDestMac().toString();
   98|   289k|	}
_ZN4pcpp8EthLayer11isDataValidEPKhm:
  101|   774k|	{
  102|   774k|		if (dataLen >= sizeof(ether_header))
  ------------------
  |  Branch (102:7): [True: 774k, False: 331]
  ------------------
  103|   774k|		{
  104|       |			// Ethertypes: These are 16-bit identifiers appearing as the initial
  105|       |			// two octets after the MAC destination and source (or after a
  106|       |			// tag) which, when considered as an unsigned integer, are equal
  107|       |			// to or larger than 0x0600.
  108|       |			//
  109|       |			// From: https://tools.ietf.org/html/rfc5342#section-2.3.2.1
  110|       |			// More: IEEE Std 802.3 Clause 3.2.6
  111|   774k|			return be16toh(*reinterpret_cast<const uint16_t*>(data + 12)) >= static_cast<uint16_t>(0x0600);
  112|   774k|		}
  113|    331|		else
  114|    331|		{
  115|    331|			return false;
  116|    331|		}
  117|   774k|	}

_ZNK4pcpp15FtpRequestLayer16getCommandStringEv:
   28|  2.62k|	{
   29|  2.62k|		return getCommandInternal();
   30|  2.62k|	}
_ZNK4pcpp15FtpRequestLayer16getCommandOptionEb:
   38|  2.62k|	{
   39|  2.62k|		if (removeEscapeCharacters)
  ------------------
  |  Branch (39:7): [True: 1.31k, False: 1.31k]
  ------------------
   40|  1.31k|		{
   41|  1.31k|			std::stringstream ss;
   42|  1.31k|			std::string field = getCommandOptionInternal();
   43|   284k|			for (size_t idx = 0; idx < field.size(); ++idx)
  ------------------
  |  Branch (43:25): [True: 283k, False: 1.31k]
  ------------------
   44|   283k|			{
   45|   283k|				if (int(field.c_str()[idx]) < 127 && int(field.c_str()[idx]) > 31)  // From SPACE to ~
  ------------------
  |  Branch (45:9): [True: 282k, False: 848]
  |  Branch (45:42): [True: 113k, False: 169k]
  ------------------
   46|   113k|					ss << field.c_str()[idx];
   47|   283k|			}
   48|  1.31k|			return ss.str();
   49|  1.31k|		}
   50|  1.31k|		return getCommandOptionInternal();
   51|  2.62k|	}
_ZNK4pcpp15FtpRequestLayer8toStringEv:
  217|  2.62k|	{
  218|  2.62k|		return "FTP Request: " + getCommandString();
  219|  2.62k|	}
_ZNK4pcpp16FtpResponseLayer13getStatusCodeEv:
  240|  2.36k|	{
  241|  2.36k|		return static_cast<FtpStatusCode>(atoi(getCommandInternal().c_str()));
  242|  2.36k|	}
_ZNK4pcpp16FtpResponseLayer19getStatusCodeStringEv:
  245|  4.73k|	{
  246|  4.73k|		return getCommandInternal();
  247|  4.73k|	}
_ZNK4pcpp16FtpResponseLayer15getStatusOptionEb:
  255|  4.73k|	{
  256|  4.73k|		if (removeEscapeCharacters)
  ------------------
  |  Branch (256:7): [True: 2.36k, False: 2.36k]
  ------------------
  257|  2.36k|		{
  258|  2.36k|			std::stringstream ss;
  259|  2.36k|			std::string field = getCommandOptionInternal();
  260|   759k|			for (size_t idx = 0; idx < field.size(); ++idx)
  ------------------
  |  Branch (260:25): [True: 756k, False: 2.36k]
  ------------------
  261|   756k|			{
  262|   756k|				if (int(field.c_str()[idx]) < 127 && int(field.c_str()[idx]) > 31)  // From SPACE to ~
  ------------------
  |  Branch (262:9): [True: 754k, False: 2.51k]
  |  Branch (262:42): [True: 329k, False: 424k]
  ------------------
  263|   329k|					ss << field.c_str()[idx];
  264|   756k|			}
  265|  2.36k|			return ss.str();
  266|  2.36k|		}
  267|  2.36k|		return getCommandOptionInternal();
  268|  4.73k|	}
_ZNK4pcpp16FtpResponseLayer8toStringEv:
  392|  4.73k|	{
  393|  4.73k|		return "FTP Response: " + getStatusCodeString();
  394|  4.73k|	}
_ZNK4pcpp12FtpDataLayer8toStringEv:
  414|    506|	{
  415|    506|		return "FTP Data";
  416|    506|	}

_ZN4pcpp12GeneveOption9canAssignEPKhm:
   38|    675|	{
   39|    675|		if (optionRawData == nullptr || optionDataLen < HeaderLength)
  ------------------
  |  Branch (39:7): [True: 0, False: 675]
  |  Branch (39:35): [True: 352, False: 323]
  ------------------
   40|    352|			return false;
   41|       |
   42|    323|		const auto* header = reinterpret_cast<const geneve_option_header*>(optionRawData);
   43|    323|		const auto totalSize = HeaderLength + static_cast<size_t>(header->length) * DataLengthUnit;
   44|    323|		return totalSize <= optionDataLen;
   45|    675|	}
_ZNK4pcpp12GeneveOption10isCriticalEv:
   62|    292|	{
   63|    292|		if (isNull())
  ------------------
  |  Branch (63:7): [True: 0, False: 292]
  ------------------
   64|      0|			return false;
   65|    292|		return (m_Data->type & CriticalBitMask) != 0;
   66|    292|	}
_ZN4pcpp11GeneveLayer11isDataValidEPKhm:
  115|  5.71k|	{
  116|  5.71k|		if (!canReinterpretAs<geneve_header>(data, dataLen))
  ------------------
  |  Branch (116:7): [True: 0, False: 5.71k]
  ------------------
  117|      0|			return false;
  118|       |
  119|  5.71k|		auto* header = reinterpret_cast<const geneve_header*>(data);
  120|       |		// RFC 8926 defines GENEVE version 0; this implementation supports that version only.
  121|  5.71k|		if (header->version != 0)
  ------------------
  |  Branch (121:7): [True: 5, False: 5.71k]
  ------------------
  122|      5|			return false;
  123|       |		// RFC 8926 Section 3.4 requires Protocol Type to follow the EtherType convention,
  124|       |		// whose valid encodings start at 0x0600.
  125|  5.71k|		if (netToHost16(header->protocolType) < 0x0600)
  ------------------
  |  Branch (125:7): [True: 40, False: 5.67k]
  ------------------
  126|     40|			return false;
  127|       |
  128|  5.67k|		auto optionsLength = static_cast<size_t>(header->optionsLength) * OptionsLengthUnit;
  129|  5.67k|		if (optionsLength > dataLen - HeaderLength)
  ------------------
  |  Branch (129:7): [True: 5, False: 5.66k]
  ------------------
  130|      5|			return false;
  131|       |
  132|  5.66k|		return true;
  133|  5.67k|	}
_ZNK4pcpp11GeneveLayer6getVNIEv:
  136|  1.35k|	{
  137|  1.35k|		const geneve_header* header = getGeneveHeader();
  138|  1.35k|		return (static_cast<uint32_t>(header->vni[0]) << 16) | (static_cast<uint32_t>(header->vni[1]) << 8) |
  139|  1.35k|		       header->vni[2];
  140|  1.35k|	}
_ZNK4pcpp11GeneveLayer15getProtocolTypeEv:
  151|  7.01k|	{
  152|  7.01k|		return netToHost16(getGeneveHeader()->protocolType);
  153|  7.01k|	}
_ZN4pcpp11GeneveLayer15setProtocolTypeEt:
  156|    642|	{
  157|    642|		getGeneveHeader()->protocolType = hostToNet16(protocolType);
  158|    642|	}
_ZNK4pcpp11GeneveLayer16getOptionsLengthEv:
  176|  7.01k|	{
  177|  7.01k|		return static_cast<size_t>(getGeneveHeader()->optionsLength) * OptionsLengthUnit;
  178|  7.01k|	}
_ZNK4pcpp11GeneveLayer12getHeaderLenEv:
  186|  6.34k|	{
  187|  6.34k|		return HeaderLength + getOptionsLength();
  188|  6.34k|	}
_ZNK4pcpp11GeneveLayer14getFirstOptionEv:
  191|    675|	{
  192|    675|		const size_t optionsLength = getOptionsLength();
  193|    675|		uint8_t* options = m_Data + HeaderLength;
  194|    675|		return GeneveOption::canAssign(options, optionsLength) ? GeneveOption{ options } : GeneveOption{};
  ------------------
  |  Branch (194:10): [True: 292, False: 383]
  ------------------
  195|    675|	}
_ZN4pcpp11GeneveLayer18updateCriticalFlagEv:
  322|    675|	{
  323|    675|		getGeneveHeader()->criticalFlag = 0;
  324|    675|		for (GeneveOption option = getFirstOption(); !option.isNull(); option = getNextOption(option))
  ------------------
  |  Branch (324:48): [True: 292, False: 383]
  ------------------
  325|    292|		{
  326|    292|			if (option.isCritical())
  ------------------
  |  Branch (326:8): [True: 292, False: 0]
  ------------------
  327|    292|			{
  328|    292|				getGeneveHeader()->criticalFlag = 1;
  329|    292|				return;
  330|    292|			}
  331|    292|		}
  332|    675|	}
_ZN4pcpp11GeneveLayer14parseNextLayerEv:
  335|  5.66k|	{
  336|  5.66k|		size_t headerLength = getHeaderLen();
  337|  5.66k|		if (m_DataLen <= headerLength)
  ------------------
  |  Branch (337:7): [True: 0, False: 5.66k]
  ------------------
  338|      0|			return;
  339|       |
  340|  5.66k|		uint8_t* payload = m_Data + headerLength;
  341|  5.66k|		size_t payloadLength = m_DataLen - headerLength;
  342|  5.66k|		switch (getProtocolType())
  343|  5.66k|		{
  344|      0|		case PCPP_ETHERTYPE_IP:
  ------------------
  |  |   33|      0|#define PCPP_ETHERTYPE_IP 0x0800
  ------------------
  |  Branch (344:3): [True: 0, False: 5.66k]
  ------------------
  345|      0|			tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLength);
  346|      0|			break;
  347|      0|		case PCPP_ETHERTYPE_ARP:
  ------------------
  |  |   35|      0|#define PCPP_ETHERTYPE_ARP 0x0806
  ------------------
  |  Branch (347:3): [True: 0, False: 5.66k]
  ------------------
  348|      0|			tryConstructNextLayerWithFallback<ArpLayer, PayloadLayer>(payload, payloadLength);
  349|      0|			break;
  350|      0|		case PCPP_ETHERTYPE_IPV6:
  ------------------
  |  |   49|      0|#define PCPP_ETHERTYPE_IPV6 0x86dd
  ------------------
  |  Branch (350:3): [True: 0, False: 5.66k]
  ------------------
  351|      0|			tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLength);
  352|      0|			break;
  353|      8|		case PCPP_ETHERTYPE_VLAN:
  ------------------
  |  |   45|      8|#define PCPP_ETHERTYPE_VLAN 0x8100
  ------------------
  |  Branch (353:3): [True: 8, False: 5.65k]
  ------------------
  354|      8|		case PCPP_ETHERTYPE_IEEE_802_1AD:
  ------------------
  |  |   63|      8|#define PCPP_ETHERTYPE_IEEE_802_1AD 0x88A8
  ------------------
  |  Branch (354:3): [True: 0, False: 5.66k]
  ------------------
  355|      8|			tryConstructNextLayerWithFallback<VlanLayer, PayloadLayer>(payload, payloadLength);
  356|      8|			break;
  357|      0|		case PCPP_ETHERTYPE_MPLS:
  ------------------
  |  |   57|      0|#define PCPP_ETHERTYPE_MPLS 0x8847
  ------------------
  |  Branch (357:3): [True: 0, False: 5.66k]
  ------------------
  358|      0|			tryConstructNextLayerWithFallback<MplsLayer, PayloadLayer>(payload, payloadLength);
  359|      0|			break;
  360|  5.46k|		case PCPP_ETHERTYPE_ETHBRIDGE:
  ------------------
  |  |   37|  5.46k|#define PCPP_ETHERTYPE_ETHBRIDGE 0x6558
  ------------------
  |  Branch (360:3): [True: 5.46k, False: 206]
  ------------------
  361|  5.46k|			if (tryConstructNextLayer<EthLayer>(payload, payloadLength) == nullptr)
  ------------------
  |  Branch (361:8): [True: 32, False: 5.42k]
  ------------------
  362|     32|				tryConstructNextLayerWithFallback<EthDot3Layer, PayloadLayer>(payload, payloadLength);
  363|  5.46k|			break;
  364|    198|		default:
  ------------------
  |  Branch (364:3): [True: 198, False: 5.46k]
  ------------------
  365|    198|			constructNextLayer<PayloadLayer>(payload, payloadLength);
  366|    198|			break;
  367|  5.66k|		}
  368|  5.66k|	}
_ZN4pcpp11GeneveLayer22computeCalculateFieldsEv:
  371|    675|	{
  372|    675|		updateCriticalFlag();
  373|    675|		if (m_NextLayer == nullptr)
  ------------------
  |  Branch (373:7): [True: 0, False: 675]
  ------------------
  374|      0|			return;
  375|       |
  376|    675|		switch (m_NextLayer->getProtocol())
  377|    675|		{
  378|      0|		case IPv4:
  ------------------
  |  Branch (378:3): [True: 0, False: 675]
  ------------------
  379|      0|			setProtocolType(PCPP_ETHERTYPE_IP);
  ------------------
  |  |   33|      0|#define PCPP_ETHERTYPE_IP 0x0800
  ------------------
  380|      0|			break;
  381|      0|		case ARP:
  ------------------
  |  Branch (381:3): [True: 0, False: 675]
  ------------------
  382|      0|			setProtocolType(PCPP_ETHERTYPE_ARP);
  ------------------
  |  |   35|      0|#define PCPP_ETHERTYPE_ARP 0x0806
  ------------------
  383|      0|			break;
  384|      0|		case IPv6:
  ------------------
  |  Branch (384:3): [True: 0, False: 675]
  ------------------
  385|      0|			setProtocolType(PCPP_ETHERTYPE_IPV6);
  ------------------
  |  |   49|      0|#define PCPP_ETHERTYPE_IPV6 0x86dd
  ------------------
  386|      0|			break;
  387|      1|		case VLAN:
  ------------------
  |  Branch (387:3): [True: 1, False: 674]
  ------------------
  388|      1|			setProtocolType(PCPP_ETHERTYPE_VLAN);
  ------------------
  |  |   45|      1|#define PCPP_ETHERTYPE_VLAN 0x8100
  ------------------
  389|      1|			break;
  390|      0|		case MPLS:
  ------------------
  |  Branch (390:3): [True: 0, False: 675]
  ------------------
  391|      0|			setProtocolType(PCPP_ETHERTYPE_MPLS);
  ------------------
  |  |   57|      0|#define PCPP_ETHERTYPE_MPLS 0x8847
  ------------------
  392|      0|			break;
  393|    637|		case Ethernet:
  ------------------
  |  Branch (393:3): [True: 637, False: 38]
  ------------------
  394|    641|		case EthernetDot3:
  ------------------
  |  Branch (394:3): [True: 4, False: 671]
  ------------------
  395|    641|			setProtocolType(PCPP_ETHERTYPE_ETHBRIDGE);
  ------------------
  |  |   37|    641|#define PCPP_ETHERTYPE_ETHBRIDGE 0x6558
  ------------------
  396|    641|			break;
  397|     33|		default:
  ------------------
  |  Branch (397:3): [True: 33, False: 642]
  ------------------
  398|     33|			break;
  399|    675|		}
  400|    675|	}
_ZNK4pcpp11GeneveLayer8toStringEv:
  437|  1.35k|	{
  438|  1.35k|		std::ostringstream result;
  439|  1.35k|		result << "GENEVE Layer, VNI: " << getVNI() << ", Protocol type: 0x" << std::hex << getProtocolType();
  440|  1.35k|		return result.str();
  441|  1.35k|	}

_ZN4pcpp8GreLayer13getGREVersionEPhm:
   24|  29.7k|	{
   25|  29.7k|		if (greDataLen < sizeof(gre_basic_header))
  ------------------
  |  Branch (25:7): [True: 0, False: 29.7k]
  ------------------
   26|      0|			return UnknownProtocol;
   27|       |
   28|  29.7k|		uint8_t version = *(greData + 1);
   29|  29.7k|		version &= 0x07;
   30|  29.7k|		if (version == 0)
  ------------------
  |  Branch (30:7): [True: 14.3k, False: 15.3k]
  ------------------
   31|  14.3k|			return GREv0;
   32|  15.3k|		else if (version == 1)
  ------------------
  |  Branch (32:12): [True: 15.3k, False: 81]
  ------------------
   33|  15.3k|			return GREv1;
   34|     81|		else
   35|     81|			return UnknownProtocol;
   36|  29.7k|	}
_ZNK4pcpp8GreLayer13getFieldValueENS0_8GreFieldEb:
   39|  15.0k|	{
   40|  15.0k|		uint8_t* ptr = m_Data + sizeof(gre_basic_header);
   41|       |
   42|  15.0k|		auto* header = reinterpret_cast<gre_basic_header*>(m_Data);
   43|       |
   44|  15.0k|		constexpr int numGreField = 4;
   45|  29.4k|		for (int curFieldAsInt = static_cast<int>(GreChecksumOrRouting); curFieldAsInt < numGreField; ++curFieldAsInt)
  ------------------
  |  Branch (45:68): [True: 29.4k, False: 0]
  ------------------
   46|  29.4k|		{
   47|  29.4k|			const GreField curField = static_cast<GreField>(curFieldAsInt);
   48|  29.4k|			bool curFieldExists = false;
   49|       |
   50|  29.4k|			uint8_t* origPtr = ptr;
   51|       |
   52|  29.4k|			switch (curField)
   53|  29.4k|			{
   54|  15.0k|			case GreChecksumOrRouting:
  ------------------
  |  Branch (54:4): [True: 15.0k, False: 14.4k]
  ------------------
   55|  15.0k|				if (header->checksumBit == 1 || header->routingBit == 1)
  ------------------
  |  Branch (55:9): [True: 12.0k, False: 3.03k]
  |  Branch (55:37): [True: 1.35k, False: 1.68k]
  ------------------
   56|  13.3k|				{
   57|  13.3k|					curFieldExists = true;
   58|  13.3k|					ptr += sizeof(uint32_t);
   59|  13.3k|				}
   60|  15.0k|				break;
   61|  7.77k|			case GreKey:
  ------------------
  |  Branch (61:4): [True: 7.77k, False: 21.6k]
  ------------------
   62|  7.77k|				if (header->keyBit == 1)
  ------------------
  |  Branch (62:9): [True: 6.40k, False: 1.37k]
  ------------------
   63|  6.40k|				{
   64|  6.40k|					curFieldExists = true;
   65|  6.40k|					ptr += sizeof(uint32_t);
   66|  6.40k|				}
   67|  7.77k|				break;
   68|  5.68k|			case GreSeq:
  ------------------
  |  Branch (68:4): [True: 5.68k, False: 23.7k]
  ------------------
   69|  5.68k|				if (header->sequenceNumBit == 1)
  ------------------
  |  Branch (69:9): [True: 5.67k, False: 4]
  ------------------
   70|  5.67k|				{
   71|  5.67k|					curFieldExists = true;
   72|  5.67k|					ptr += sizeof(uint32_t);
   73|  5.67k|				}
   74|  5.68k|				break;
   75|    953|			case GreAck:
  ------------------
  |  Branch (75:4): [True: 953, False: 28.5k]
  ------------------
   76|    953|				if (header->ackSequenceNumBit == 1)
  ------------------
  |  Branch (76:9): [True: 953, False: 0]
  ------------------
   77|    953|				{
   78|    953|					curFieldExists = true;
   79|    953|					ptr += sizeof(uint32_t);
   80|    953|				}
   81|    953|				break;
   82|      0|			default:  // shouldn't get there
  ------------------
  |  Branch (82:4): [True: 0, False: 29.4k]
  ------------------
   83|      0|				return nullptr;
   84|  29.4k|			}
   85|       |
   86|  29.4k|			if (field == curField)
  ------------------
  |  Branch (86:8): [True: 15.0k, False: 14.4k]
  ------------------
   87|  15.0k|			{
   88|       |				// If the packet is truncated/malformed it might be overflow packet length
   89|  15.0k|				if ((curFieldExists && static_cast<size_t>(std::abs(ptr - m_Data)) <= m_DataLen) ||
  ------------------
  |  Branch (89:10): [True: 15.0k, False: 0]
  |  Branch (89:28): [True: 14.7k, False: 282]
  ------------------
   90|    282|				    returnOffsetEvenIfFieldMissing)
  ------------------
  |  Branch (90:9): [True: 0, False: 282]
  ------------------
   91|  14.7k|					return origPtr;
   92|       |
   93|    282|				return nullptr;
   94|  15.0k|			}
   95|  29.4k|		}  // for
   96|       |
   97|      0|		return nullptr;
   98|  15.0k|	}
_ZN4pcpp8GreLayer27computeCalculateFieldsInnerEv:
  101|  5.17k|	{
  102|  5.17k|		gre_basic_header* header = (gre_basic_header*)m_Data;
  103|  5.17k|		if (m_NextLayer != nullptr)
  ------------------
  |  Branch (103:7): [True: 4.19k, False: 982]
  ------------------
  104|  4.19k|		{
  105|  4.19k|			switch (m_NextLayer->getProtocol())
  106|  4.19k|			{
  107|     25|			case IPv4:
  ------------------
  |  Branch (107:4): [True: 25, False: 4.16k]
  ------------------
  108|     25|				header->protocol = htobe16(PCPP_ETHERTYPE_IP);
  109|     25|				break;
  110|      0|			case IPv6:
  ------------------
  |  Branch (110:4): [True: 0, False: 4.19k]
  ------------------
  111|      0|				header->protocol = htobe16(PCPP_ETHERTYPE_IPV6);
  112|      0|				break;
  113|    515|			case VLAN:
  ------------------
  |  Branch (113:4): [True: 515, False: 3.67k]
  ------------------
  114|    515|				header->protocol = htobe16(PCPP_ETHERTYPE_VLAN);
  115|    515|				break;
  116|      0|			case MPLS:
  ------------------
  |  Branch (116:4): [True: 0, False: 4.19k]
  ------------------
  117|      0|				header->protocol = htobe16(PCPP_ETHERTYPE_MPLS);
  118|      0|				break;
  119|    646|			case PPP_PPTP:
  ------------------
  |  Branch (119:4): [True: 646, False: 3.54k]
  ------------------
  120|    646|				header->protocol = htobe16(PCPP_ETHERTYPE_PPP);
  121|    646|				break;
  122|      0|			case Ethernet:
  ------------------
  |  Branch (122:4): [True: 0, False: 4.19k]
  ------------------
  123|      0|				header->protocol = htobe16(PCPP_ETHERTYPE_ETHBRIDGE);
  124|      0|				break;
  125|  3.00k|			default:
  ------------------
  |  Branch (125:4): [True: 3.00k, False: 1.18k]
  ------------------
  126|  3.00k|				break;
  127|  4.19k|			}
  128|  4.19k|		}
  129|  5.17k|	}
_ZNK4pcpp8GreLayer17getSequenceNumberERj:
  132|  5.17k|	{
  133|  5.17k|		gre_basic_header* header = (gre_basic_header*)m_Data;
  134|       |
  135|  5.17k|		if (header->sequenceNumBit == 0)
  ------------------
  |  Branch (135:7): [True: 445, False: 4.72k]
  ------------------
  136|    445|			return false;
  137|       |
  138|  4.72k|		uint32_t* val = (uint32_t*)getFieldValue(GreSeq, false);
  139|  4.72k|		if (val == nullptr)
  ------------------
  |  Branch (139:7): [True: 282, False: 4.44k]
  ------------------
  140|    282|			return false;
  141|       |
  142|  4.44k|		seqNumber = be32toh(*val);
  143|  4.44k|		return true;
  144|  4.72k|	}
_ZN4pcpp8GreLayer14parseNextLayerEv:
  198|  29.6k|	{
  199|  29.6k|		size_t headerLen = getHeaderLen();
  200|  29.6k|		if (m_DataLen <= headerLen)
  ------------------
  |  Branch (200:7): [True: 4.75k, False: 24.9k]
  ------------------
  201|  4.75k|			return;
  202|       |
  203|  24.9k|		gre_basic_header* header = (gre_basic_header*)m_Data;
  204|  24.9k|		uint8_t* payload = m_Data + headerLen;
  205|  24.9k|		size_t payloadLen = m_DataLen - headerLen;
  206|       |
  207|  24.9k|		switch (be16toh(header->protocol))
  208|  24.9k|		{
  209|    156|		case PCPP_ETHERTYPE_IP:
  ------------------
  |  |   33|    156|#define PCPP_ETHERTYPE_IP 0x0800
  ------------------
  |  Branch (209:3): [True: 156, False: 24.7k]
  ------------------
  210|    156|			tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen);
  211|    156|			break;
  212|      0|		case PCPP_ETHERTYPE_IPV6:
  ------------------
  |  |   49|      0|#define PCPP_ETHERTYPE_IPV6 0x86dd
  ------------------
  |  Branch (212:3): [True: 0, False: 24.9k]
  ------------------
  213|      0|			tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen);
  214|      0|			break;
  215|  5.12k|		case PCPP_ETHERTYPE_VLAN:
  ------------------
  |  |   45|  5.12k|#define PCPP_ETHERTYPE_VLAN 0x8100
  ------------------
  |  Branch (215:3): [True: 5.12k, False: 19.8k]
  ------------------
  216|  5.12k|			tryConstructNextLayerWithFallback<VlanLayer, PayloadLayer>(payload, payloadLen);
  217|  5.12k|			break;
  218|      0|		case PCPP_ETHERTYPE_MPLS:
  ------------------
  |  |   57|      0|#define PCPP_ETHERTYPE_MPLS 0x8847
  ------------------
  |  Branch (218:3): [True: 0, False: 24.9k]
  ------------------
  219|      0|			tryConstructNextLayerWithFallback<MplsLayer, PayloadLayer>(payload, payloadLen);
  220|      0|			break;
  221|  6.15k|		case PCPP_ETHERTYPE_PPP:
  ------------------
  |  |   59|  6.15k|#define PCPP_ETHERTYPE_PPP 0x880B
  ------------------
  |  Branch (221:3): [True: 6.15k, False: 18.7k]
  ------------------
  222|  6.15k|			tryConstructNextLayerWithFallback<PPP_PPTPLayer, PayloadLayer>(payload, payloadLen);
  223|  6.15k|			break;
  224|      0|		case PCPP_ETHERTYPE_ETHBRIDGE:
  ------------------
  |  |   37|      0|#define PCPP_ETHERTYPE_ETHBRIDGE 0x6558
  ------------------
  |  Branch (224:3): [True: 0, False: 24.9k]
  ------------------
  225|      0|		{
  226|      0|			if (tryConstructNextLayer<EthLayer>(payload, payloadLen) != nullptr)
  ------------------
  |  Branch (226:8): [True: 0, False: 0]
  ------------------
  227|      0|			{
  228|      0|				break;
  229|      0|			}
  230|       |
  231|      0|			tryConstructNextLayerWithFallback<EthDot3Layer, PayloadLayer>(payload, payloadLen);
  232|      0|			break;
  233|      0|		}
  234|  13.4k|		default:
  ------------------
  |  Branch (234:3): [True: 13.4k, False: 11.4k]
  ------------------
  235|  13.4k|			constructNextLayer<PayloadLayer>(payload, payloadLen);
  236|  24.9k|		}
  237|  24.9k|	}
_ZNK4pcpp8GreLayer12getHeaderLenEv:
  240|  37.0k|	{
  241|  37.0k|		size_t result = sizeof(gre_basic_header);
  242|       |
  243|  37.0k|		gre_basic_header const* header = reinterpret_cast<gre_basic_header const*>(m_Data);
  244|       |
  245|  37.0k|		if (header->checksumBit == 1 || header->routingBit == 1)
  ------------------
  |  Branch (245:7): [True: 15.7k, False: 21.3k]
  |  Branch (245:35): [True: 2.29k, False: 19.0k]
  ------------------
  246|  18.0k|			result += 4;
  247|  37.0k|		if (header->keyBit == 1)
  ------------------
  |  Branch (247:7): [True: 25.9k, False: 11.1k]
  ------------------
  248|  25.9k|			result += 4;
  249|  37.0k|		if (header->sequenceNumBit == 1)
  ------------------
  |  Branch (249:7): [True: 34.2k, False: 2.88k]
  ------------------
  250|  34.2k|			result += 4;
  251|  37.0k|		if (header->ackSequenceNumBit == 1)
  ------------------
  |  Branch (251:7): [True: 8.76k, False: 28.3k]
  ------------------
  252|  8.76k|			result += 4;
  253|       |
  254|  37.0k|		return result;
  255|  37.0k|	}
_ZNK4pcpp10GREv0Layer11getChecksumERt:
  303|  2.94k|	{
  304|  2.94k|		if (getGreHeader()->checksumBit == 0)
  ------------------
  |  Branch (304:7): [True: 1.01k, False: 1.92k]
  ------------------
  305|  1.01k|			return false;
  306|       |
  307|  1.92k|		uint16_t* val = (uint16_t*)getFieldValue(GreChecksumOrRouting, false);
  308|  1.92k|		if (val == nullptr)
  ------------------
  |  Branch (308:7): [True: 0, False: 1.92k]
  ------------------
  309|      0|			return false;
  310|       |
  311|  1.92k|		checksum = be16toh(*val);
  312|  1.92k|		return true;
  313|  1.92k|	}
_ZN4pcpp10GREv0Layer11setChecksumEt:
  316|  3.84k|	{
  317|  3.84k|		gre_basic_header* header = getGreHeader();
  318|       |
  319|  3.84k|		bool needToExtendLayer = false;
  320|       |
  321|  3.84k|		if (header->routingBit == 0 && header->checksumBit == 0)
  ------------------
  |  Branch (321:7): [True: 1.72k, False: 2.12k]
  |  Branch (321:34): [True: 0, False: 1.72k]
  ------------------
  322|      0|			needToExtendLayer = true;
  323|       |
  324|  3.84k|		uint8_t* offsetPtr = getFieldValue(GreChecksumOrRouting, true);
  325|  3.84k|		int offset = offsetPtr - m_Data;
  326|       |		// extend layer in 4 bytes to keep 4-byte alignment
  327|  3.84k|		if (needToExtendLayer && !extendLayer(offset, sizeof(uint32_t)))
  ------------------
  |  Branch (327:7): [True: 0, False: 3.84k]
  |  Branch (327:28): [True: 0, False: 0]
  ------------------
  328|      0|		{
  329|      0|			PCPP_LOG_ERROR("Couldn't extend layer to set checksum");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleGreLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleGreLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  330|      0|			return false;
  331|      0|		}
  332|       |
  333|  3.84k|		uint16_t* checksumPtr = (uint16_t*)(m_Data + offset);
  334|  3.84k|		*checksumPtr = htobe16(checksum);
  335|       |
  336|       |		// if layer was extended in 4 bytes, make sure the offset field stays 0
  337|  3.84k|		if (needToExtendLayer)
  ------------------
  |  Branch (337:7): [True: 0, False: 3.84k]
  ------------------
  338|      0|		{
  339|      0|			checksumPtr++;
  340|      0|			*checksumPtr = 0;
  341|      0|		}
  342|       |
  343|  3.84k|		header = getGreHeader();
  344|  3.84k|		header->checksumBit = 1;
  345|       |
  346|  3.84k|		return true;
  347|  3.84k|	}
_ZNK4pcpp10GREv0Layer9getOffsetERt:
  383|  2.94k|	{
  384|  2.94k|		if (getGreHeader()->routingBit == 0)
  ------------------
  |  Branch (384:7): [True: 1.42k, False: 1.51k]
  ------------------
  385|  1.42k|			return false;
  386|       |
  387|  1.51k|		uint8_t* val = (uint8_t*)getFieldValue(GreChecksumOrRouting, false);
  388|  1.51k|		if (val == nullptr)
  ------------------
  |  Branch (388:7): [True: 0, False: 1.51k]
  ------------------
  389|      0|			return false;
  390|       |
  391|  1.51k|		offset = be16toh(*(val + 2));
  392|  1.51k|		return true;
  393|  1.51k|	}
_ZNK4pcpp10GREv0Layer6getKeyERj:
  396|  2.94k|	{
  397|  2.94k|		if (getGreHeader()->keyBit == 0)
  ------------------
  |  Branch (397:7): [True: 848, False: 2.09k]
  ------------------
  398|    848|			return false;
  399|       |
  400|  2.09k|		uint32_t* val = (uint32_t*)getFieldValue(GreKey, false);
  401|  2.09k|		if (val == nullptr)
  ------------------
  |  Branch (401:7): [True: 0, False: 2.09k]
  ------------------
  402|      0|			return false;
  403|       |
  404|  2.09k|		key = be32toh(*val);
  405|  2.09k|		return true;
  406|  2.09k|	}
_ZN4pcpp10GREv0Layer22computeCalculateFieldsEv:
  460|  2.94k|	{
  461|  2.94k|		computeCalculateFieldsInner();
  462|       |
  463|  2.94k|		if (getGreHeader()->checksumBit == 0)
  ------------------
  |  Branch (463:7): [True: 1.01k, False: 1.92k]
  ------------------
  464|  1.01k|			return;
  465|       |
  466|       |		// calculate checksum
  467|  1.92k|		setChecksum(0);
  468|       |
  469|  1.92k|		ScalarBuffer<uint16_t> buffer;
  470|  1.92k|		buffer.buffer = (uint16_t*)m_Data;
  471|  1.92k|		buffer.len = m_DataLen;
  472|  1.92k|		size_t checksum = computeChecksum(&buffer, 1);
  473|       |
  474|  1.92k|		setChecksum(checksum);
  475|  1.92k|	}
_ZNK4pcpp10GREv0Layer8toStringEv:
  478|  5.88k|	{
  479|  5.88k|		return "GRE Layer, version 0";
  480|  5.88k|	}
_ZNK4pcpp10GREv1Layer20getAcknowledgmentNumERj:
  525|  2.23k|	{
  526|  2.23k|		if (getGreHeader()->ackSequenceNumBit == 0)
  ------------------
  |  Branch (526:7): [True: 1.27k, False: 953]
  ------------------
  527|  1.27k|			return false;
  528|       |
  529|    953|		uint32_t* val = (uint32_t*)getFieldValue(GreAck, false);
  530|    953|		if (val == nullptr)
  ------------------
  |  Branch (530:7): [True: 0, False: 953]
  ------------------
  531|      0|			return false;
  532|       |
  533|    953|		ackNum = be32toh(*val);
  534|    953|		return true;
  535|    953|	}
_ZN4pcpp10GREv1Layer22computeCalculateFieldsEv:
  586|  2.23k|	{
  587|  2.23k|		computeCalculateFieldsInner();
  588|       |
  589|       |		getGreHeader()->payloadLength = htobe16(m_DataLen - getHeaderLen());
  590|  2.23k|	}
_ZNK4pcpp10GREv1Layer8toStringEv:
  593|  4.46k|	{
  594|  4.46k|		return "GRE Layer, version 1";
  595|  4.46k|	}
_ZN4pcpp13PPP_PPTPLayer14parseNextLayerEv:
  636|  5.76k|	{
  637|  5.76k|		size_t headerLen = getHeaderLen();
  638|  5.76k|		if (m_DataLen <= headerLen)
  ------------------
  |  Branch (638:7): [True: 0, False: 5.76k]
  ------------------
  639|      0|			return;
  640|       |
  641|  5.76k|		uint8_t* payload = m_Data + headerLen;
  642|  5.76k|		size_t payloadLen = m_DataLen - headerLen;
  643|       |
  644|  5.76k|		switch (be16toh(getPPP_PPTPHeader()->protocol))
  645|  5.76k|		{
  646|  5.08k|		case PCPP_PPP_IP:
  ------------------
  |  |  457|  5.08k|#define PCPP_PPP_IP 0x21
  ------------------
  |  Branch (646:3): [True: 5.08k, False: 680]
  ------------------
  647|  5.08k|			tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen);
  648|  5.08k|			break;
  649|      0|		case PCPP_PPP_IPV6:
  ------------------
  |  |  509|      0|#define PCPP_PPP_IPV6 0x57
  ------------------
  |  Branch (649:3): [True: 0, False: 5.76k]
  ------------------
  650|      0|			tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen);
  651|      0|			break;
  652|    680|		default:
  ------------------
  |  Branch (652:3): [True: 680, False: 5.08k]
  ------------------
  653|    680|			constructNextLayer<PayloadLayer>(payload, payloadLen);
  654|    680|			break;
  655|  5.76k|		}
  656|  5.76k|	}
_ZN4pcpp13PPP_PPTPLayer22computeCalculateFieldsEv:
  659|    646|	{
  660|    646|		ppp_pptp_header* header = getPPP_PPTPHeader();
  661|    646|		if (m_NextLayer != nullptr)
  ------------------
  |  Branch (661:7): [True: 646, False: 0]
  ------------------
  662|    646|		{
  663|    646|			switch (m_NextLayer->getProtocol())
  664|    646|			{
  665|    542|			case IPv4:
  ------------------
  |  Branch (665:4): [True: 542, False: 104]
  ------------------
  666|    542|				header->protocol = htobe16(PCPP_PPP_IP);
  667|    542|				break;
  668|      0|			case IPv6:
  ------------------
  |  Branch (668:4): [True: 0, False: 646]
  ------------------
  669|      0|				header->protocol = htobe16(PCPP_PPP_IPV6);
  670|      0|				break;
  671|    104|			default:
  ------------------
  |  Branch (671:4): [True: 104, False: 542]
  ------------------
  672|    104|				break;
  673|    646|			}
  674|    646|		}
  675|      0|		else
  676|      0|			header->protocol = 0;
  677|    646|	}

_ZN4pcpp10GtpV1Layer12GtpExtensionC2Ev:
   22|  19.0k|	{
   23|  19.0k|		m_Data = nullptr;
   24|  19.0k|		m_DataLen = 0;
   25|  19.0k|		m_ExtType = 0;
   26|  19.0k|	}
_ZN4pcpp10GtpV1Layer12GtpExtensionC2EPhmh:
   29|  2.02k|	{
   30|  2.02k|		m_Data = data;
   31|  2.02k|		m_DataLen = dataLen;
   32|  2.02k|		m_ExtType = type;
   33|  2.02k|	}
_ZN4pcpp10GtpV1Layer12GtpExtensionaSERKS1_:
   43|  1.82k|	{
   44|  1.82k|		m_Data = other.m_Data;
   45|  1.82k|		m_DataLen = other.m_DataLen;
   46|  1.82k|		m_ExtType = other.m_ExtType;
   47|  1.82k|		return *this;
   48|  1.82k|	}
_ZNK4pcpp10GtpV1Layer12GtpExtension6isNullEv:
   51|  13.9k|	{
   52|  13.9k|		return m_Data == nullptr;
   53|  13.9k|	}
_ZNK4pcpp10GtpV1Layer12GtpExtension16getExtensionTypeEv:
   56|  3.58k|	{
   57|  3.58k|		return m_ExtType;
   58|  3.58k|	}
_ZNK4pcpp10GtpV1Layer12GtpExtension14getTotalLengthEv:
   61|  14.9k|	{
   62|  14.9k|		if (m_Data == nullptr)
  ------------------
  |  Branch (62:7): [True: 6.80k, False: 8.16k]
  ------------------
   63|  6.80k|		{
   64|  6.80k|			return 0;
   65|  6.80k|		}
   66|       |
   67|  8.16k|		size_t len = (size_t)(m_Data[0] * 4);
   68|  8.16k|		if (len <= m_DataLen)
  ------------------
  |  Branch (68:7): [True: 4.83k, False: 3.33k]
  ------------------
   69|  4.83k|		{
   70|  4.83k|			return len;
   71|  4.83k|		}
   72|       |
   73|  3.33k|		return m_DataLen;
   74|  8.16k|	}
_ZNK4pcpp10GtpV1Layer12GtpExtension16getContentLengthEv:
   77|  5.72k|	{
   78|  5.72k|		size_t res = getTotalLength();
   79|       |
   80|  5.72k|		if (res >= 2 * sizeof(uint8_t))
  ------------------
  |  Branch (80:7): [True: 2.25k, False: 3.46k]
  ------------------
   81|  2.25k|		{
   82|  2.25k|			return (size_t)(res - 2 * sizeof(uint8_t));
   83|  2.25k|		}
   84|       |
   85|  3.46k|		return 0;
   86|  5.72k|	}
_ZNK4pcpp10GtpV1Layer12GtpExtension10getContentEv:
   89|  3.58k|	{
   90|  3.58k|		if (m_Data == nullptr || getContentLength() == 0)
  ------------------
  |  Branch (90:7): [True: 3.40k, False: 187]
  |  Branch (90:28): [True: 33, False: 154]
  ------------------
   91|  3.43k|		{
   92|  3.43k|			return nullptr;
   93|  3.43k|		}
   94|       |
   95|    154|		return m_Data + sizeof(uint8_t);
   96|  3.58k|	}
_ZNK4pcpp10GtpV1Layer12GtpExtension26getNextExtensionHeaderTypeEv:
   99|  5.41k|	{
  100|  5.41k|		if (m_Data == nullptr || getTotalLength() < 4)
  ------------------
  |  Branch (100:7): [True: 3.40k, False: 2.01k]
  |  Branch (100:28): [True: 63, False: 1.94k]
  ------------------
  101|  3.46k|		{
  102|  3.46k|			return 0;
  103|  3.46k|		}
  104|       |
  105|  1.94k|		uint8_t res = *(uint8_t*)(m_Data + sizeof(uint8_t) + getContentLength());
  106|       |
  107|  1.94k|		return res;
  108|  5.41k|	}
_ZNK4pcpp10GtpV1Layer12GtpExtension16getNextExtensionEv:
  111|  5.41k|	{
  112|  5.41k|		size_t totalLength = getTotalLength();
  113|  5.41k|		uint8_t nextExtType = getNextExtensionHeaderType();
  114|  5.41k|		if (nextExtType > 0 && m_DataLen > totalLength + sizeof(uint8_t))
  ------------------
  |  Branch (114:7): [True: 1.73k, False: 3.67k]
  |  Branch (114:26): [True: 1.06k, False: 675]
  ------------------
  115|  1.06k|		{
  116|  1.06k|			return { m_Data + totalLength, m_DataLen - totalLength, nextExtType };
  117|  1.06k|		}
  118|  4.34k|		else
  119|  4.34k|		{
  120|  4.34k|			return {};
  121|  4.34k|		}
  122|  5.41k|	}
_ZN4pcpp10GtpV1Layer7isGTPv1EPKhm:
  200|  36.3k|	{
  201|  36.3k|		if (data != nullptr && dataSize >= sizeof(gtpv1_header) && (data[0] & 0xE0) == 0x20)
  ------------------
  |  Branch (201:7): [True: 36.3k, False: 0]
  |  Branch (201:26): [True: 36.1k, False: 130]
  |  Branch (201:62): [True: 23.8k, False: 12.2k]
  ------------------
  202|  23.8k|		{
  203|  23.8k|			return true;
  204|  23.8k|		}
  205|       |
  206|  12.4k|		return false;
  207|  36.3k|	}
_ZNK4pcpp10GtpV1Layer14getHeaderExtraEv:
  210|  38.5k|	{
  211|  38.5k|		if (m_Data != nullptr && m_DataLen >= sizeof(gtpv1_header) + sizeof(gtpv1_header_extra))
  ------------------
  |  Branch (211:7): [True: 38.5k, False: 0]
  |  Branch (211:28): [True: 38.4k, False: 48]
  ------------------
  212|  38.4k|		{
  213|  38.4k|			return (gtpv1_header_extra*)(m_Data + sizeof(gtpv1_header));
  214|  38.4k|		}
  215|       |
  216|     48|		return nullptr;
  217|  38.5k|	}
_ZNK4pcpp10GtpV1Layer17getSequenceNumberERt:
  220|  3.58k|	{
  221|  3.58k|		gtpv1_header* header = getHeader();
  222|  3.58k|		gtpv1_header_extra* headerExtra = getHeaderExtra();
  223|  3.58k|		if (header != nullptr && headerExtra != nullptr && header->sequenceNumberFlag == 1)
  ------------------
  |  Branch (223:7): [True: 3.58k, False: 0]
  |  Branch (223:28): [True: 3.57k, False: 8]
  |  Branch (223:54): [True: 887, False: 2.69k]
  ------------------
  224|    887|		{
  225|    887|			seqNumber = be16toh(headerExtra->sequenceNumber);
  226|    887|			return true;
  227|    887|		}
  228|       |
  229|  2.70k|		return false;
  230|  3.58k|	}
_ZNK4pcpp10GtpV1Layer13getNpduNumberERh:
  272|  3.58k|	{
  273|  3.58k|		gtpv1_header* header = getHeader();
  274|  3.58k|		gtpv1_header_extra* headerExtra = getHeaderExtra();
  275|  3.58k|		if (header != nullptr && headerExtra != nullptr && header->npduNumberFlag == 1)
  ------------------
  |  Branch (275:7): [True: 3.58k, False: 0]
  |  Branch (275:28): [True: 3.57k, False: 8]
  |  Branch (275:54): [True: 1.69k, False: 1.88k]
  ------------------
  276|  1.69k|		{
  277|  1.69k|			npduNum = headerExtra->npduNumber;
  278|  1.69k|			return true;
  279|  1.69k|		}
  280|       |
  281|  1.88k|		return false;
  282|  3.58k|	}
_ZNK4pcpp10GtpV1Layer26getNextExtensionHeaderTypeERh:
  324|  15.6k|	{
  325|  15.6k|		gtpv1_header* header = getHeader();
  326|  15.6k|		gtpv1_header_extra* headerExtra = getHeaderExtra();
  327|  15.6k|		if (header != nullptr && headerExtra != nullptr && header->extensionHeaderFlag == 1)
  ------------------
  |  Branch (327:7): [True: 15.6k, False: 0]
  |  Branch (327:28): [True: 15.6k, False: 8]
  |  Branch (327:54): [True: 4.95k, False: 10.7k]
  ------------------
  328|  4.95k|		{
  329|  4.95k|			nextExtType = headerExtra->nextExtensionHeader;
  330|  4.95k|			return true;
  331|  4.95k|		}
  332|       |
  333|  10.7k|		return false;
  334|  15.6k|	}
_ZNK4pcpp10GtpV1Layer16getNextExtensionEv:
  337|  15.6k|	{
  338|  15.6k|		uint8_t nextExtType = 0;
  339|  15.6k|		bool nextExtExists = getNextExtensionHeaderType(nextExtType);
  340|  15.6k|		if (!nextExtExists || nextExtType == 0 || m_DataLen <= sizeof(gtpv1_header) + sizeof(gtpv1_header_extra))
  ------------------
  |  Branch (340:7): [True: 10.7k, False: 4.95k]
  |  Branch (340:25): [True: 3.98k, False: 967]
  |  Branch (340:45): [True: 0, False: 967]
  ------------------
  341|  14.7k|		{
  342|  14.7k|			return {};
  343|  14.7k|		}
  344|       |
  345|    967|		return { m_Data + sizeof(gtpv1_header) + sizeof(gtpv1_header_extra),
  346|    967|			     m_DataLen - sizeof(gtpv1_header) - sizeof(gtpv1_header_extra), nextExtType };
  347|  15.6k|	}
_ZNK4pcpp10GtpV1Layer14getMessageTypeEv:
  436|  3.58k|	{
  437|  3.58k|		gtpv1_header* header = getHeader();
  438|       |
  439|  3.58k|		if (header == nullptr)
  ------------------
  |  Branch (439:7): [True: 0, False: 3.58k]
  ------------------
  440|      0|		{
  441|      0|			return GtpV1_MessageTypeUnknown;
  442|      0|		}
  443|       |
  444|  3.58k|		return (GtpV1MessageType)header->messageType;
  445|  3.58k|	}
_ZN4pcpp33createGtpV1MessageTypeToStringMapEv:
  448|      2|	{
  449|      2|		std::unordered_map<uint8_t, std::string> tempMap;
  450|       |
  451|      2|		tempMap[0] = "GTPv1 Message Type Unknown";
  452|      2|		tempMap[1] = "Echo Request";
  453|      2|		tempMap[2] = "Echo Response";
  454|      2|		tempMap[3] = "Version Not Supported";
  455|      2|		tempMap[4] = "Node Alive Request";
  456|      2|		tempMap[5] = "Node Alive Response";
  457|      2|		tempMap[6] = "Redirection Request";
  458|      2|		tempMap[7] = "Create PDP Context Request";
  459|      2|		tempMap[16] = "Create PDP Context Response";
  460|      2|		tempMap[17] = "Update PDP Context Request";
  461|      2|		tempMap[18] = "Update PDP Context Response";
  462|      2|		tempMap[19] = "Delete PDP Context Request";
  463|      2|		tempMap[20] = "Delete PDP Context Response";
  464|      2|		tempMap[22] = "Initiate PDP Context Activation Request";
  465|      2|		tempMap[23] = "Initiate PDP Context Activation Response";
  466|      2|		tempMap[26] = "Error Indication";
  467|      2|		tempMap[27] = "PDU Notification Request";
  468|      2|		tempMap[28] = "PDU Notification Response";
  469|      2|		tempMap[29] = "PDU Notification Reject Request";
  470|      2|		tempMap[30] = "PDU Notification Reject Response";
  471|      2|		tempMap[31] = "Supported Extensions Header Notification";
  472|      2|		tempMap[32] = "Send Routing for GPRS Request";
  473|      2|		tempMap[33] = "Send Routing for GPRS Response";
  474|      2|		tempMap[34] = "Failure Report Request";
  475|      2|		tempMap[35] = "Failure Report Response";
  476|      2|		tempMap[36] = "Note MS Present Request";
  477|      2|		tempMap[37] = "Note MS Present Response";
  478|      2|		tempMap[38] = "Identification Request";
  479|      2|		tempMap[39] = "Identification Response";
  480|      2|		tempMap[50] = "SGSN Context Request";
  481|      2|		tempMap[51] = "SGSN Context Response";
  482|      2|		tempMap[52] = "SGSN Context Acknowledge";
  483|      2|		tempMap[53] = "Forward Relocation Request";
  484|      2|		tempMap[54] = "Forward Relocation Response";
  485|      2|		tempMap[55] = "Forward Relocation Complete";
  486|      2|		tempMap[56] = "Relocation Cancel Request";
  487|      2|		tempMap[57] = "Relocation Cancel Response";
  488|      2|		tempMap[58] = "Forward SRNS Context";
  489|      2|		tempMap[59] = "Forward Relocation Complete Acknowledge";
  490|      2|		tempMap[60] = "Forward SRNS Context Acknowledge";
  491|      2|		tempMap[61] = "UE Registration Request";
  492|      2|		tempMap[62] = "UE Registration Response";
  493|      2|		tempMap[70] = "RAN Information Relay";
  494|      2|		tempMap[96] = "MBMS Notification Request";
  495|      2|		tempMap[97] = "MBMS Notification Response";
  496|      2|		tempMap[98] = "MBMS Notification Reject Request";
  497|      2|		tempMap[99] = "MBMS Notification Reject Response";
  498|      2|		tempMap[100] = "Create MBMS Notification Request";
  499|      2|		tempMap[101] = "Create MBMS Notification Response";
  500|      2|		tempMap[102] = "Update MBMS Notification Request";
  501|      2|		tempMap[103] = "Update MBMS Notification Response";
  502|      2|		tempMap[104] = "Delete MBMS Notification Request";
  503|      2|		tempMap[105] = "Delete MBMS Notification Response";
  504|      2|		tempMap[112] = "MBMS Registration Request";
  505|      2|		tempMap[113] = "MBMS Registration Response";
  506|      2|		tempMap[114] = "MBMS De-Registration Request";
  507|      2|		tempMap[115] = "MBMS De-Registration Response";
  508|      2|		tempMap[116] = "MBMS Session Start Request";
  509|      2|		tempMap[117] = "MBMS Session Start Response";
  510|      2|		tempMap[118] = "MBMS Session Stop Request";
  511|      2|		tempMap[119] = "MBMS Session Stop Response";
  512|      2|		tempMap[120] = "MBMS Session Update Request";
  513|      2|		tempMap[121] = "MBMS Session Update Response";
  514|      2|		tempMap[128] = "MS Info Change Request";
  515|      2|		tempMap[129] = "MS Info Change Response";
  516|      2|		tempMap[240] = "Data Record Transfer Request";
  517|      2|		tempMap[241] = "Data Record Transfer Response";
  518|      2|		tempMap[254] = "End Marker";
  519|      2|		tempMap[255] = "G-PDU";
  520|       |
  521|      2|		return tempMap;
  522|      2|	}
_ZNK4pcpp10GtpV1Layer22getMessageTypeAsStringEv:
  527|  7.34k|	{
  528|  7.34k|		gtpv1_header* header = getHeader();
  529|       |
  530|  7.34k|		if (header == nullptr)
  ------------------
  |  Branch (530:7): [True: 0, False: 7.34k]
  ------------------
  531|      0|		{
  532|      0|			return GTPv1MsgTypeToStringMap.find(0)->second;
  533|      0|		}
  534|       |
  535|  7.34k|		auto iter = GTPv1MsgTypeToStringMap.find(header->messageType);
  536|  7.34k|		if (iter != GTPv1MsgTypeToStringMap.end())
  ------------------
  |  Branch (536:7): [True: 5.91k, False: 1.43k]
  ------------------
  537|  5.91k|		{
  538|  5.91k|			return iter->second;
  539|  5.91k|		}
  540|  1.43k|		else
  541|  1.43k|		{
  542|  1.43k|			return GTPv1MsgTypeToStringMap.find(0)->second;
  543|  1.43k|		}
  544|  7.34k|	}
_ZNK4pcpp10GtpV1Layer13isGTPUMessageEv:
  547|  3.58k|	{
  548|  3.58k|		gtpv1_header* header = getHeader();
  549|  3.58k|		if (header == nullptr)
  ------------------
  |  Branch (549:7): [True: 0, False: 3.58k]
  ------------------
  550|      0|		{
  551|      0|			return false;
  552|      0|		}
  553|       |
  554|  3.58k|		return header->messageType == GtpV1GpduMessageType;
  555|  3.58k|	}
_ZNK4pcpp10GtpV1Layer13isGTPCMessageEv:
  558|  3.58k|	{
  559|  3.58k|		gtpv1_header* header = getHeader();
  560|  3.58k|		if (header == nullptr)
  ------------------
  |  Branch (560:7): [True: 0, False: 3.58k]
  ------------------
  561|      0|		{
  562|      0|			return false;
  563|      0|		}
  564|       |
  565|  3.58k|		return header->messageType != GtpV1GpduMessageType;
  566|  3.58k|	}
_ZN4pcpp10GtpV1Layer14parseNextLayerEv:
  569|  23.8k|	{
  570|  23.8k|		size_t headerLen = getHeaderLen();
  571|  23.8k|		if (headerLen < sizeof(gtpv1_header))
  ------------------
  |  Branch (571:7): [True: 0, False: 23.8k]
  ------------------
  572|      0|		{
  573|       |			// do nothing
  574|      0|			return;
  575|      0|		}
  576|       |
  577|  23.8k|		gtpv1_header* header = getHeader();
  578|  23.8k|		if (header->messageType != GtpV1GpduMessageType)
  ------------------
  |  Branch (578:7): [True: 9.96k, False: 13.9k]
  ------------------
  579|  9.96k|		{
  580|       |			// this is a GTP-C message, hence it is the last layer
  581|  9.96k|			return;
  582|  9.96k|		}
  583|       |
  584|  13.9k|		if (m_DataLen <= headerLen)
  ------------------
  |  Branch (584:7): [True: 556, False: 13.3k]
  ------------------
  585|    556|		{
  586|       |			// no data beyond headerLen, nothing to parse further
  587|    556|			return;
  588|    556|		}
  589|       |
  590|       |		// GTP-U message, try to parse the next layer
  591|       |
  592|  13.3k|		auto* payload = static_cast<uint8_t*>(m_Data + headerLen);
  593|  13.3k|		size_t payloadLen = m_DataLen - headerLen;
  594|       |
  595|  13.3k|		uint8_t subProto = *payload;
  596|  13.3k|		if (subProto >= 0x45 && subProto <= 0x4e)
  ------------------
  |  Branch (596:7): [True: 13.1k, False: 256]
  |  Branch (596:27): [True: 10.0k, False: 3.04k]
  ------------------
  597|  10.0k|		{
  598|  10.0k|			tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen);
  599|  10.0k|		}
  600|  3.30k|		else if ((subProto & 0xf0) == 0x60)
  ------------------
  |  Branch (600:12): [True: 2.68k, False: 622]
  ------------------
  601|  2.68k|		{
  602|  2.68k|			tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen);
  603|  2.68k|		}
  604|    622|		else
  605|    622|		{
  606|    622|			constructNextLayer<PayloadLayer>(payload, payloadLen);
  607|    622|		}
  608|  13.3k|	}
_ZNK4pcpp10GtpV1Layer12getHeaderLenEv:
  611|  27.5k|	{
  612|  27.5k|		gtpv1_header* header = getHeader();
  613|  27.5k|		if (header == nullptr)
  ------------------
  |  Branch (613:7): [True: 0, False: 27.5k]
  ------------------
  614|      0|		{
  615|      0|			return 0;
  616|      0|		}
  617|       |
  618|  27.5k|		size_t res = sizeof(gtpv1_header);
  619|       |
  620|  27.5k|		if (header->messageType != GtpV1GpduMessageType)
  ------------------
  |  Branch (620:7): [True: 11.8k, False: 15.6k]
  ------------------
  621|  11.8k|		{
  622|  11.8k|			size_t msgLen = be16toh(header->messageLength);
  623|  11.8k|			res += (msgLen > m_DataLen - sizeof(gtpv1_header) ? m_DataLen - sizeof(gtpv1_header) : msgLen);
  ------------------
  |  Branch (623:12): [True: 2.61k, False: 9.23k]
  ------------------
  624|  11.8k|		}
  625|  15.6k|		else
  626|  15.6k|		{
  627|  15.6k|			gtpv1_header_extra* headerExtra = getHeaderExtra();
  628|  15.6k|			if (headerExtra != nullptr &&
  ------------------
  |  Branch (628:8): [True: 15.6k, False: 24]
  ------------------
  629|  15.6k|			    (header->extensionHeaderFlag == 1 || header->sequenceNumberFlag == 1 || header->npduNumberFlag == 1))
  ------------------
  |  Branch (629:9): [True: 4.43k, False: 11.2k]
  |  Branch (629:45): [True: 5.92k, False: 5.28k]
  |  Branch (629:80): [True: 1.74k, False: 3.53k]
  ------------------
  630|  12.1k|			{
  631|  12.1k|				res += sizeof(gtpv1_header_extra);
  632|  12.1k|				GtpExtension nextExt = getNextExtension();
  633|  13.9k|				while (!nextExt.isNull())
  ------------------
  |  Branch (633:12): [True: 1.82k, False: 12.1k]
  ------------------
  634|  1.82k|				{
  635|  1.82k|					res += nextExt.getTotalLength();
  636|  1.82k|					nextExt = nextExt.getNextExtension();
  637|  1.82k|				}
  638|  12.1k|			}
  639|  15.6k|		}
  640|       |
  641|  27.5k|		return res;
  642|  27.5k|	}
_ZNK4pcpp10GtpV1Layer8toStringEv:
  694|  7.17k|	{
  695|  7.17k|		std::string res = "GTP v1 Layer";
  696|       |
  697|  7.17k|		gtpv1_header* header = getHeader();
  698|  7.17k|		if (header != nullptr)
  ------------------
  |  Branch (698:7): [True: 7.17k, False: 0]
  ------------------
  699|  7.17k|		{
  700|  7.17k|			std::stringstream teidStream;
  701|  7.17k|			teidStream << be32toh(header->teid);
  702|       |
  703|  7.17k|			std::string gtpu_gtpc;
  704|  7.17k|			if (header->messageType == GtpV1GpduMessageType)
  ------------------
  |  Branch (704:8): [True: 3.41k, False: 3.76k]
  ------------------
  705|  3.41k|			{
  706|  3.41k|				gtpu_gtpc = "GTP-U message";
  707|  3.41k|			}
  708|  3.76k|			else
  709|  3.76k|			{
  710|  3.76k|				gtpu_gtpc = "GTP-C message: " + getMessageTypeAsString();
  711|  3.76k|			}
  712|       |
  713|  7.17k|			res += ", " + gtpu_gtpc + ", TEID: " + teidStream.str();
  714|  7.17k|		}
  715|       |
  716|  7.17k|		return res;
  717|  7.17k|	}
_ZN4pcpp10GtpV1Layer22computeCalculateFieldsEv:
  720|  3.58k|	{
  721|  3.58k|		gtpv1_header* hdr = getHeader();
  722|  3.58k|		if (hdr == nullptr)
  ------------------
  |  Branch (722:7): [True: 0, False: 3.58k]
  ------------------
  723|      0|		{
  724|      0|			return;
  725|      0|		}
  726|       |
  727|  3.58k|		hdr->messageLength = htobe16(m_DataLen - sizeof(gtpv1_header));
  728|  3.58k|	}
_ZNK4pcpp16GtpV2MessageType8toStringEv:
  828|  6.56k|	{
  829|  6.56k|		auto iter = messageTypeMap.find(m_Value);
  830|  6.56k|		if (iter != messageTypeMap.end())
  ------------------
  |  Branch (830:7): [True: 12, False: 6.54k]
  ------------------
  831|     12|		{
  832|     12|			return iter->second;
  833|     12|		}
  834|       |
  835|  6.54k|		return "Unknown GTPv2 Message Type";
  836|  6.56k|	}
_ZN4pcpp16GtpV2MessageType13fromUintValueEh:
  926|  6.56k|	{
  927|  6.56k|		auto iter = uintToValueMap.find(value);
  928|  6.56k|		if (iter != uintToValueMap.end())
  ------------------
  |  Branch (928:7): [True: 12, False: 6.54k]
  ------------------
  929|     12|		{
  930|     12|			return iter->second;
  931|     12|		}
  932|       |
  933|  6.54k|		return Unknown;
  934|  6.56k|	}
_ZN4pcpp10GtpV2Layer11isDataValidEPKhm:
 1074|  23.2k|	{
 1075|  23.2k|		if (!data || dataSize < sizeof(gtpv2_basic_header) + sizeof(uint32_t))
  ------------------
  |  Branch (1075:7): [True: 0, False: 23.2k]
  |  Branch (1075:16): [True: 815, False: 22.4k]
  ------------------
 1076|    815|		{
 1077|    815|			return false;
 1078|    815|		}
 1079|       |
 1080|  22.4k|		auto* header = reinterpret_cast<const gtpv2_basic_header*>(data);
 1081|       |
 1082|  22.4k|		if (header->version != 2)
  ------------------
  |  Branch (1082:7): [True: 1.33k, False: 21.0k]
  ------------------
 1083|  1.33k|		{
 1084|  1.33k|			return false;
 1085|  1.33k|		}
 1086|       |
 1087|       |		// When the TEID-present flag is set, the fixed header carries the 4-byte TEID before
 1088|       |		// the sequence-number word, so the minimum length grows accordingly. Without this
 1089|       |		// check accessors such as getSequenceNumber() would read past the buffer (GH #2171).
 1090|  21.0k|		if (header->teidPresent && dataSize < sizeof(gtpv2_basic_header) + 2 * sizeof(uint32_t))
  ------------------
  |  Branch (1090:7): [True: 21.0k, False: 0]
  |  Branch (1090:30): [True: 427, False: 20.6k]
  ------------------
 1091|    427|		{
 1092|    427|			return false;
 1093|    427|		}
 1094|       |
 1095|  20.6k|		return true;
 1096|  21.0k|	}
_ZNK4pcpp10GtpV2Layer14getMessageTypeEv:
 1099|  6.56k|	{
 1100|  6.56k|		return GtpV2MessageType::fromUintValue(getHeader()->messageType);
 1101|  6.56k|	}
_ZN4pcpp10GtpV2Layer14parseNextLayerEv:
 1362|  20.6k|	{
 1363|  20.6k|		auto headerLen = getHeaderLen();
 1364|  20.6k|		if (m_DataLen <= headerLen)
  ------------------
  |  Branch (1364:7): [True: 7.97k, False: 12.6k]
  ------------------
 1365|  7.97k|		{
 1366|  7.97k|			return;
 1367|  7.97k|		}
 1368|       |
 1369|  12.6k|		auto* nextLayerData = m_Data + headerLen;
 1370|  12.6k|		auto nextLayerDataLen = m_DataLen - headerLen;
 1371|       |
 1372|  12.6k|		if (getHeader()->piggybacking)
  ------------------
  |  Branch (1372:7): [True: 12.6k, False: 7]
  ------------------
 1373|  12.6k|		{
 1374|  12.6k|			tryConstructNextLayerWithFallback<GtpV2Layer, PayloadLayer>(nextLayerData, nextLayerDataLen);
 1375|  12.6k|		}
 1376|      7|		else
 1377|      7|		{
 1378|      7|			constructNextLayer<PayloadLayer>(nextLayerData, nextLayerDataLen);
 1379|      7|		}
 1380|  12.6k|	}
_ZNK4pcpp10GtpV2Layer12getHeaderLenEv:
 1383|  23.9k|	{
 1384|  23.9k|		auto messageLength = be16toh(getHeader()->messageLength) + sizeof(gtpv2_basic_header);
 1385|  23.9k|		if (messageLength > m_DataLen)
  ------------------
  |  Branch (1385:7): [True: 9.26k, False: 14.6k]
  ------------------
 1386|  9.26k|		{
 1387|  9.26k|			return m_DataLen;
 1388|  9.26k|		}
 1389|       |
 1390|  14.6k|		return messageLength;
 1391|  23.9k|	}
_ZN4pcpp10GtpV2Layer22computeCalculateFieldsEv:
 1394|  3.28k|	{
 1395|  3.28k|		if (m_NextLayer == nullptr)
  ------------------
  |  Branch (1395:7): [True: 1.29k, False: 1.98k]
  ------------------
 1396|  1.29k|		{
 1397|  1.29k|			return;
 1398|  1.29k|		}
 1399|       |
 1400|  1.98k|		if (m_NextLayer->getProtocol() == GTPv2)
  ------------------
  |  Branch (1400:7): [True: 1.63k, False: 353]
  ------------------
 1401|  1.63k|		{
 1402|  1.63k|			getHeader()->piggybacking = 1;
 1403|  1.63k|		}
 1404|    353|		else
 1405|    353|		{
 1406|    353|			getHeader()->piggybacking = 0;
 1407|    353|		}
 1408|  1.98k|	}
_ZNK4pcpp10GtpV2Layer8toStringEv:
 1458|  6.56k|	{
 1459|  6.56k|		return "GTPv2 Layer, " + getMessageType().toString() + " message";
 1460|  6.56k|	}
_ZNK4pcpp20GtpV2MessageTypeHashclERKNS_16GtpV2MessageTypeE:
  737|  6.72k|		{
  738|  6.72k|			return static_cast<uint8_t>(messageType);
  739|  6.72k|		}

_ZN4pcpplsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEENS_9GvcpLayer11GvcpCommandE:
  182|    124|	{
  183|    124|		return os << commandToString(command);
  184|    124|	}
_ZN4pcpplsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEENS_20GvcpAcknowledgeLayer18GvcpResponseStatusE:
  187|    124|	{
  188|    124|		return os << statusToString(status);
  189|    124|	}
_ZN4pcpp9GvcpLayer13getRawCommandEPKh:
  194|    310|	{
  195|    310|		static_assert(offsetof(GvcpRequestLayer::gvcp_request_header, command) ==
  196|    310|		                  offsetof(GvcpAcknowledgeLayer::gvcp_ack_header, command),
  197|    310|		              "The command must have the same offset in both GVCP headers");
  198|    310|		return netToHost16(reinterpret_cast<const GvcpRequestLayer::gvcp_request_header*>(data)->command);
  199|    310|	}
_ZN4pcpp9GvcpLayer14parseGvcpLayerEPhmPNS_5LayerEPNS_6PacketE:
  202|    310|	{
  203|    310|		const bool isRequest = GvcpRequestLayer::isDataValid(data, dataLen);
  204|    310|		if (!isRequest && !GvcpAcknowledgeLayer::isDataValid(data, dataLen))
  ------------------
  |  Branch (204:7): [True: 310, False: 0]
  |  Branch (204:21): [True: 0, False: 310]
  ------------------
  205|      0|			return nullptr;
  206|       |
  207|    310|		const GvcpCommand command = toGvcpCommand(getRawCommand(data));
  208|       |
  209|    310|		if (isRequest)
  ------------------
  |  Branch (209:7): [True: 0, False: 310]
  ------------------
  210|      0|		{
  211|      0|			if (command == GvcpCommand::DiscoveredCmd)
  ------------------
  |  Branch (211:8): [True: 0, False: 0]
  ------------------
  212|      0|				return new GvcpDiscoveryRequestLayer(data, dataLen, prevLayer, packet);
  213|      0|			if (command == GvcpCommand::ForceIpCmd && GvcpForceIpRequestLayer::isDataValid(data, dataLen))
  ------------------
  |  Branch (213:8): [True: 0, False: 0]
  |  Branch (213:46): [True: 0, False: 0]
  ------------------
  214|      0|				return new GvcpForceIpRequestLayer(data, dataLen, prevLayer, packet);
  215|      0|			return new GvcpRequestLayer(data, dataLen, prevLayer, packet);
  216|      0|		}
  217|       |
  218|    310|		if (command == GvcpCommand::DiscoveredAck && GvcpDiscoveryAcknowledgeLayer::isDataValid(data, dataLen))
  ------------------
  |  Branch (218:7): [True: 0, False: 310]
  |  Branch (218:48): [True: 0, False: 0]
  ------------------
  219|      0|			return new GvcpDiscoveryAcknowledgeLayer(data, dataLen, prevLayer, packet);
  220|    310|		if (command == GvcpCommand::ForceIpAck)
  ------------------
  |  Branch (220:7): [True: 0, False: 310]
  ------------------
  221|      0|			return new GvcpForceIpAcknowledgeLayer(data, dataLen, prevLayer, packet);
  222|    310|		return new GvcpAcknowledgeLayer(data, dataLen, prevLayer, packet);
  223|    310|	}
_ZN4pcpp9GvcpLayer14parseNextLayerEv:
  232|    310|	{
  233|    310|		const size_t headerLen = getHeaderLen();
  234|    310|		if (m_DataLen <= headerLen)
  ------------------
  |  Branch (234:7): [True: 0, False: 310]
  ------------------
  235|      0|			return;
  236|       |
  237|    310|		constructNextLayer<PayloadLayer>(m_Data + headerLen, m_DataLen - headerLen);
  238|    310|	}
_ZN4pcpp16GvcpRequestLayer11isDataValidEPKhm:
  267|    310|	{
  268|    310|		return canReinterpretAs<gvcp_request_header>(data, dataLen) && data[0] == gvcpMagicNumber;
  ------------------
  |  Branch (268:10): [True: 310, False: 0]
  |  Branch (268:66): [True: 0, False: 310]
  ------------------
  269|    310|	}
_ZN4pcpp20GvcpAcknowledgeLayer11isDataValidEPKhm:
  351|    310|	{
  352|    310|		return canReinterpretAs<gvcp_ack_header>(data, dataLen);
  353|    310|	}
_ZNK4pcpp20GvcpAcknowledgeLayer9getStatusEv:
  356|    124|	{
  357|    124|		return toGvcpResponseStatus(netToHost16(getGvcpHeader()->status));
  358|    124|	}
_ZNK4pcpp20GvcpAcknowledgeLayer8getAckIdEv:
  366|    124|	{
  367|    124|		return netToHost16(getGvcpHeader()->ackId);
  368|    124|	}
_ZNK4pcpp20GvcpAcknowledgeLayer10getCommandEv:
  376|    124|	{
  377|    124|		return toGvcpCommand(netToHost16(getGvcpHeader()->command));
  378|    124|	}
_ZN4pcpp20GvcpAcknowledgeLayer22computeCalculateFieldsEv:
  386|     62|	{
  387|     62|		getGvcpHeader()->dataSize = hostToNet16(static_cast<uint16_t>(m_DataLen - sizeof(gvcp_ack_header)));
  388|     62|	}
_ZNK4pcpp20GvcpAcknowledgeLayer8toStringEv:
  391|    124|	{
  392|    124|		std::ostringstream ss;
  393|    124|		ss << "GVCP Acknowledge Layer, Command: " << getCommand() << ", Acknowledge ID: " << getAckId()
  394|    124|		   << ", Status: " << getStatus();
  395|    124|		return ss.str();
  396|    124|	}
GvcpLayer.cpp:_ZN4pcpp12_GLOBAL__N_115commandToStringENS_9GvcpLayer11GvcpCommandE:
  156|    124|		{
  157|    124|			const char* name = getGvcpCommandName(command);
  158|    124|			return name != nullptr ? name : "Unknown";
  ------------------
  |  Branch (158:11): [True: 122, False: 2]
  ------------------
  159|    124|		}
GvcpLayer.cpp:_ZN4pcpp12_GLOBAL__N_118getGvcpCommandNameENS_9GvcpLayer11GvcpCommandE:
   31|    558|		{
   32|    558|			switch (command)
   33|    558|			{
   34|      0|			case GvcpCommand::DiscoveredCmd:
  ------------------
  |  Branch (34:4): [True: 0, False: 558]
  ------------------
   35|      0|				return "DiscoveredCmd";
   36|      0|			case GvcpCommand::DiscoveredAck:
  ------------------
  |  Branch (36:4): [True: 0, False: 558]
  ------------------
   37|      0|				return "DiscoveredAck";
   38|      0|			case GvcpCommand::ForceIpCmd:
  ------------------
  |  Branch (38:4): [True: 0, False: 558]
  ------------------
   39|      0|				return "ForceIpCmd";
   40|      0|			case GvcpCommand::ForceIpAck:
  ------------------
  |  Branch (40:4): [True: 0, False: 558]
  ------------------
   41|      0|				return "ForceIpAck";
   42|      0|			case GvcpCommand::PacketResendCmd:
  ------------------
  |  Branch (42:4): [True: 0, False: 558]
  ------------------
   43|      0|				return "PacketResendCmd";
   44|      0|			case GvcpCommand::PacketResendAck:
  ------------------
  |  Branch (44:4): [True: 0, False: 558]
  ------------------
   45|      0|				return "PacketResendAck";
   46|    549|			case GvcpCommand::ReadRegCmd:
  ------------------
  |  Branch (46:4): [True: 549, False: 9]
  ------------------
   47|    549|				return "ReadRegCmd";
   48|      0|			case GvcpCommand::ReadRegAck:
  ------------------
  |  Branch (48:4): [True: 0, False: 558]
  ------------------
   49|      0|				return "ReadRegAck";
   50|      0|			case GvcpCommand::WriteRegCmd:
  ------------------
  |  Branch (50:4): [True: 0, False: 558]
  ------------------
   51|      0|				return "WriteRegCmd";
   52|      0|			case GvcpCommand::WriteRegAck:
  ------------------
  |  Branch (52:4): [True: 0, False: 558]
  ------------------
   53|      0|				return "WriteRegAck";
   54|      0|			case GvcpCommand::ReadMemCmd:
  ------------------
  |  Branch (54:4): [True: 0, False: 558]
  ------------------
   55|      0|				return "ReadMemCmd";
   56|      0|			case GvcpCommand::ReadMemAck:
  ------------------
  |  Branch (56:4): [True: 0, False: 558]
  ------------------
   57|      0|				return "ReadMemAck";
   58|      0|			case GvcpCommand::WriteMemCmd:
  ------------------
  |  Branch (58:4): [True: 0, False: 558]
  ------------------
   59|      0|				return "WriteMemCmd";
   60|      0|			case GvcpCommand::WriteMemAck:
  ------------------
  |  Branch (60:4): [True: 0, False: 558]
  ------------------
   61|      0|				return "WriteMemAck";
   62|      0|			case GvcpCommand::PendingAck:
  ------------------
  |  Branch (62:4): [True: 0, False: 558]
  ------------------
   63|      0|				return "PendingAck";
   64|      0|			case GvcpCommand::EventCmd:
  ------------------
  |  Branch (64:4): [True: 0, False: 558]
  ------------------
   65|      0|				return "EventCmd";
   66|      0|			case GvcpCommand::EventAck:
  ------------------
  |  Branch (66:4): [True: 0, False: 558]
  ------------------
   67|      0|				return "EventAck";
   68|      0|			case GvcpCommand::EventDataCmd:
  ------------------
  |  Branch (68:4): [True: 0, False: 558]
  ------------------
   69|      0|				return "EventDataCmd";
   70|      0|			case GvcpCommand::EventDataAck:
  ------------------
  |  Branch (70:4): [True: 0, False: 558]
  ------------------
   71|      0|				return "EventDataAck";
   72|      0|			case GvcpCommand::ActionCmd:
  ------------------
  |  Branch (72:4): [True: 0, False: 558]
  ------------------
   73|      0|				return "ActionCmd";
   74|      0|			case GvcpCommand::ActionAck:
  ------------------
  |  Branch (74:4): [True: 0, False: 558]
  ------------------
   75|      0|				return "ActionAck";
   76|      9|			default:
  ------------------
  |  Branch (76:4): [True: 9, False: 549]
  ------------------
   77|      9|				return nullptr;
   78|    558|			}
   79|    558|		}
GvcpLayer.cpp:_ZN4pcpp12_GLOBAL__N_114statusToStringENS_20GvcpAcknowledgeLayer18GvcpResponseStatusE:
  162|    124|		{
  163|    124|			const char* name = getGvcpResponseStatusName(status);
  164|    124|			return name != nullptr ? name : "Unknown";
  ------------------
  |  Branch (164:11): [True: 0, False: 124]
  ------------------
  165|    124|		}
GvcpLayer.cpp:_ZN4pcpp12_GLOBAL__N_125getGvcpResponseStatusNameENS_20GvcpAcknowledgeLayer18GvcpResponseStatusE:
   83|    248|		{
   84|    248|			switch (status)
   85|    248|			{
   86|      0|			case GvcpResponseStatus::Success:
  ------------------
  |  Branch (86:4): [True: 0, False: 248]
  ------------------
   87|      0|				return "Success";
   88|      0|			case GvcpResponseStatus::PacketResend:
  ------------------
  |  Branch (88:4): [True: 0, False: 248]
  ------------------
   89|      0|				return "PacketResend";
   90|      0|			case GvcpResponseStatus::NotImplemented:
  ------------------
  |  Branch (90:4): [True: 0, False: 248]
  ------------------
   91|      0|				return "NotImplemented";
   92|      0|			case GvcpResponseStatus::InvalidParameter:
  ------------------
  |  Branch (92:4): [True: 0, False: 248]
  ------------------
   93|      0|				return "InvalidParameter";
   94|      0|			case GvcpResponseStatus::InvalidAddress:
  ------------------
  |  Branch (94:4): [True: 0, False: 248]
  ------------------
   95|      0|				return "InvalidAddress";
   96|      0|			case GvcpResponseStatus::WriteProtect:
  ------------------
  |  Branch (96:4): [True: 0, False: 248]
  ------------------
   97|      0|				return "WriteProtect";
   98|      0|			case GvcpResponseStatus::BadAlignment:
  ------------------
  |  Branch (98:4): [True: 0, False: 248]
  ------------------
   99|      0|				return "BadAlignment";
  100|      0|			case GvcpResponseStatus::AccessDenied:
  ------------------
  |  Branch (100:4): [True: 0, False: 248]
  ------------------
  101|      0|				return "AccessDenied";
  102|      0|			case GvcpResponseStatus::Busy:
  ------------------
  |  Branch (102:4): [True: 0, False: 248]
  ------------------
  103|      0|				return "Busy";
  104|      0|			case GvcpResponseStatus::LocalProblem:
  ------------------
  |  Branch (104:4): [True: 0, False: 248]
  ------------------
  105|      0|				return "LocalProblem";
  106|      0|			case GvcpResponseStatus::MsgMismatch:
  ------------------
  |  Branch (106:4): [True: 0, False: 248]
  ------------------
  107|      0|				return "MsgMismatch";
  108|      0|			case GvcpResponseStatus::InvalidProtocol:
  ------------------
  |  Branch (108:4): [True: 0, False: 248]
  ------------------
  109|      0|				return "InvalidProtocol";
  110|      0|			case GvcpResponseStatus::NoMsg:
  ------------------
  |  Branch (110:4): [True: 0, False: 248]
  ------------------
  111|      0|				return "NoMsg";
  112|      0|			case GvcpResponseStatus::PacketUnavailable:
  ------------------
  |  Branch (112:4): [True: 0, False: 248]
  ------------------
  113|      0|				return "PacketUnavailable";
  114|      0|			case GvcpResponseStatus::DataOverrun:
  ------------------
  |  Branch (114:4): [True: 0, False: 248]
  ------------------
  115|      0|				return "DataOverrun";
  116|      0|			case GvcpResponseStatus::InvalidHeader:
  ------------------
  |  Branch (116:4): [True: 0, False: 248]
  ------------------
  117|      0|				return "InvalidHeader";
  118|      0|			case GvcpResponseStatus::WrongConfig:
  ------------------
  |  Branch (118:4): [True: 0, False: 248]
  ------------------
  119|      0|				return "WrongConfig";
  120|      0|			case GvcpResponseStatus::PacketNotYetAvailable:
  ------------------
  |  Branch (120:4): [True: 0, False: 248]
  ------------------
  121|      0|				return "PacketNotYetAvailable";
  122|      0|			case GvcpResponseStatus::PacketAndPrevRemovedFromMemory:
  ------------------
  |  Branch (122:4): [True: 0, False: 248]
  ------------------
  123|      0|				return "PacketAndPrevRemovedFromMemory";
  124|      0|			case GvcpResponseStatus::PacketRemovedFromMemory:
  ------------------
  |  Branch (124:4): [True: 0, False: 248]
  ------------------
  125|      0|				return "PacketRemovedFromMemory";
  126|      0|			case GvcpResponseStatus::NoRefTime:
  ------------------
  |  Branch (126:4): [True: 0, False: 248]
  ------------------
  127|      0|				return "NoRefTime";
  128|      0|			case GvcpResponseStatus::PacketTemporarilyUnavailable:
  ------------------
  |  Branch (128:4): [True: 0, False: 248]
  ------------------
  129|      0|				return "PacketTemporarilyUnavailable";
  130|      0|			case GvcpResponseStatus::Overflow:
  ------------------
  |  Branch (130:4): [True: 0, False: 248]
  ------------------
  131|      0|				return "Overflow";
  132|      0|			case GvcpResponseStatus::ActionLate:
  ------------------
  |  Branch (132:4): [True: 0, False: 248]
  ------------------
  133|      0|				return "ActionLate";
  134|      0|			case GvcpResponseStatus::LeaderTrailerOverflow:
  ------------------
  |  Branch (134:4): [True: 0, False: 248]
  ------------------
  135|      0|				return "LeaderTrailerOverflow";
  136|      0|			case GvcpResponseStatus::Error:
  ------------------
  |  Branch (136:4): [True: 0, False: 248]
  ------------------
  137|      0|				return "Error";
  138|    248|			default:
  ------------------
  |  Branch (138:4): [True: 248, False: 0]
  ------------------
  139|    248|				return nullptr;
  140|    248|			}
  141|    248|		}
GvcpLayer.cpp:_ZN4pcpp12_GLOBAL__N_113toGvcpCommandEt:
  144|    434|		{
  145|    434|			const auto command = static_cast<GvcpCommand>(value);
  146|    434|			return getGvcpCommandName(command) != nullptr ? command : GvcpCommand::Unknown;
  ------------------
  |  Branch (146:11): [True: 427, False: 7]
  ------------------
  147|    434|		}
GvcpLayer.cpp:_ZN4pcpp12_GLOBAL__N_120toGvcpResponseStatusEt:
  150|    124|		{
  151|    124|			const auto status = static_cast<GvcpResponseStatus>(value);
  152|    124|			return getGvcpResponseStatusName(status) != nullptr ? status : GvcpResponseStatus::Unknown;
  ------------------
  |  Branch (152:11): [True: 0, False: 124]
  ------------------
  153|    124|		}

_ZN4pcpp16HttpRequestLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   84|  43.9k|	    : HttpMessage(data, dataLen, prevLayer, packet, HTTPRequest)
   85|  43.9k|	{
   86|  43.9k|		m_FirstLine = new HttpRequestFirstLine(this);
   87|  43.9k|		setFieldsOffset(m_FirstLine->getSize());
   88|  43.9k|		parseFields();
   89|  43.9k|	}
_ZN4pcpp16HttpRequestLayerD2Ev:
  130|  43.9k|	{
  131|  43.9k|		delete m_FirstLine;
  132|  43.9k|	}
_ZNK4pcpp16HttpRequestLayer8toStringEv:
  135|  17.0k|	{
  136|  17.0k|		static const int maxLengthToPrint = 120;
  137|  17.0k|		std::string result = "HTTP request, ";
  138|  17.0k|		int size = m_FirstLine->getSize() - 2;  // the -2 is to remove \r\n at the end of the first line
  139|  17.0k|		if (size <= 0)
  ------------------
  |  Branch (139:7): [True: 0, False: 17.0k]
  ------------------
  140|      0|		{
  141|      0|			result += std::string("CORRUPT DATA");
  142|      0|			return result;
  143|      0|		}
  144|  17.0k|		if (size <= maxLengthToPrint)
  ------------------
  |  Branch (144:7): [True: 12.7k, False: 4.31k]
  ------------------
  145|  12.7k|		{
  146|  12.7k|			char* firstLine = new char[size + 1];
  147|  12.7k|			strncpy(firstLine, reinterpret_cast<char*>(m_Data), size);
  148|  12.7k|			firstLine[size] = 0;
  149|  12.7k|			result += std::string(firstLine);
  150|  12.7k|			delete[] firstLine;
  151|  12.7k|		}
  152|  4.31k|		else
  153|  4.31k|		{
  154|  4.31k|			char firstLine[maxLengthToPrint + 1];
  155|  4.31k|			strncpy(firstLine, reinterpret_cast<char*>(m_Data), maxLengthToPrint - 3);
  156|  4.31k|			firstLine[maxLengthToPrint - 3] = '.';
  157|  4.31k|			firstLine[maxLengthToPrint - 2] = '.';
  158|  4.31k|			firstLine[maxLengthToPrint - 1] = '.';
  159|  4.31k|			firstLine[maxLengthToPrint] = 0;
  160|  4.31k|			result += std::string(firstLine);
  161|  4.31k|		}
  162|       |
  163|  17.0k|		return result;
  164|  17.0k|	}
_ZN4pcpp20HttpRequestFirstLineC2EPNS_16HttpRequestLayerE:
  192|  43.9k|	HttpRequestFirstLine::HttpRequestFirstLine(HttpRequestLayer* httpRequest) : m_HttpRequest(httpRequest)
  193|  43.9k|	{
  194|  43.9k|		m_Method = parseMethod((char*)m_HttpRequest->m_Data, m_HttpRequest->getDataLen());
  195|  43.9k|		if (m_Method == HttpRequestLayer::HttpMethodUnknown)
  ------------------
  |  Branch (195:7): [True: 0, False: 43.9k]
  ------------------
  196|      0|		{
  197|      0|			m_UriOffset = -1;
  198|      0|			PCPP_LOG_DEBUG("Couldn't resolve HTTP request method");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleHttpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleHttpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  199|      0|			m_IsComplete = false;
  200|      0|			m_Version = HttpVersionUnknown;
  201|      0|			m_VersionOffset = -1;
  202|      0|			m_FirstLineEndOffset = m_HttpRequest->getDataLen();
  203|      0|			return;
  204|      0|		}
  205|  43.9k|		else
  206|  43.9k|		{
  207|  43.9k|			m_UriOffset = MethodEnumToString[m_Method].length() + 1;
  208|  43.9k|		}
  209|       |
  210|  43.9k|		parseVersion();
  211|  43.9k|		if (m_VersionOffset < 0)
  ------------------
  |  Branch (211:7): [True: 9.12k, False: 34.7k]
  ------------------
  212|  9.12k|		{
  213|  9.12k|			m_IsComplete = false;
  214|  9.12k|			m_FirstLineEndOffset = m_HttpRequest->getDataLen();
  215|  9.12k|			return;
  216|  9.12k|		}
  217|       |
  218|  34.7k|		char* endOfFirstLine;
  219|  34.7k|		if ((endOfFirstLine = (char*)memchr((char*)(m_HttpRequest->m_Data + m_VersionOffset), '\n',
  ------------------
  |  Branch (219:7): [True: 34.3k, False: 415]
  ------------------
  220|  34.7k|		                                    m_HttpRequest->m_DataLen - (size_t)m_VersionOffset)) != nullptr)
  221|  34.3k|		{
  222|  34.3k|			m_FirstLineEndOffset = endOfFirstLine - (char*)m_HttpRequest->m_Data + 1;
  223|  34.3k|			m_IsComplete = true;
  224|  34.3k|		}
  225|    415|		else
  226|    415|		{
  227|    415|			m_FirstLineEndOffset = m_HttpRequest->getDataLen();
  228|    415|			m_IsComplete = false;
  229|    415|		}
  230|       |
  231|  34.7k|		if (Logger::getInstance().isDebugEnabled(PacketLogModuleHttpLayer))
  ------------------
  |  Branch (231:7): [True: 0, False: 34.7k]
  ------------------
  232|      0|		{
  233|      0|			std::string method =
  234|      0|			    m_Method == HttpRequestLayer::HttpMethodUnknown ? "Unknown" : MethodEnumToString[m_Method];
  ------------------
  |  Branch (234:8): [True: 0, False: 0]
  ------------------
  235|      0|			PCPP_LOG_DEBUG("Method='" << method << "'; "
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleHttpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleHttpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  236|      0|			                          << "HTTP version='" << VersionEnumToString[m_Version] << "'; "
  237|      0|			                          << "URI='" << getUri() << "'");
  238|      0|		}
  239|  34.7k|	}
_ZN4pcpp20HttpRequestFirstLine11parseMethodEPKcm:
  288|  99.3k|	{
  289|  99.3k|		if (!data || dataLen < 4)
  ------------------
  |  Branch (289:7): [True: 0, False: 99.3k]
  |  Branch (289:16): [True: 130, False: 99.2k]
  ------------------
  290|    130|		{
  291|    130|			return HttpRequestLayer::HttpMethodUnknown;
  292|    130|		}
  293|       |
  294|  99.2k|		size_t spaceIndex = 0;
  295|   934k|		while (spaceIndex < dataLen && data[spaceIndex] != ' ')
  ------------------
  |  Branch (295:10): [True: 933k, False: 986]
  |  Branch (295:34): [True: 835k, False: 98.2k]
  ------------------
  296|   835k|		{
  297|   835k|			spaceIndex++;
  298|   835k|		}
  299|       |
  300|  99.2k|		if (spaceIndex == 0 || spaceIndex == dataLen)
  ------------------
  |  Branch (300:7): [True: 80, False: 99.1k]
  |  Branch (300:26): [True: 986, False: 98.1k]
  ------------------
  301|  1.06k|		{
  302|  1.06k|			return HttpRequestLayer::HttpMethodUnknown;
  303|  1.06k|		}
  304|       |
  305|  98.1k|		auto methodAdEnum = HttpMethodStringToEnum.find(std::string(data, data + spaceIndex));
  306|  98.1k|		if (methodAdEnum == HttpMethodStringToEnum.end())
  ------------------
  |  Branch (306:7): [True: 10.3k, False: 87.8k]
  ------------------
  307|  10.3k|		{
  308|  10.3k|			return HttpRequestLayer::HttpMethodUnknown;
  309|  10.3k|		}
  310|  87.8k|		return methodAdEnum->second;
  311|  98.1k|	}
_ZN4pcpp20HttpRequestFirstLine12parseVersionEv:
  314|  43.9k|	{
  315|  43.9k|		char* data = (char*)(m_HttpRequest->m_Data + m_UriOffset);
  316|  43.9k|		char* verPos = cross_platform_memmem(data, m_HttpRequest->getDataLen() - m_UriOffset, " HTTP/", 6);
  317|  43.9k|		if (verPos == nullptr)
  ------------------
  |  Branch (317:7): [True: 9.11k, False: 34.7k]
  ------------------
  318|  9.11k|		{
  319|  9.11k|			m_Version = HttpVersionUnknown;
  320|  9.11k|			m_VersionOffset = -1;
  321|  9.11k|			return;
  322|  9.11k|		}
  323|       |
  324|       |		// verify packet doesn't end before the version, meaning still left place for " HTTP/x.y" (9 chars)
  325|  34.7k|		std::ptrdiff_t actualLen = verPos + 9 - (char*)m_HttpRequest->m_Data;
  326|  34.7k|		if (static_cast<size_t>(actualLen) > m_HttpRequest->getDataLen())
  ------------------
  |  Branch (326:7): [True: 6, False: 34.7k]
  ------------------
  327|      6|		{
  328|      6|			m_Version = HttpVersionUnknown;
  329|      6|			m_VersionOffset = -1;
  330|      6|			return;
  331|      6|		}
  332|       |
  333|       |		// skip " HTTP/" (6 chars)
  334|  34.7k|		verPos += 6;
  335|  34.7k|		auto versionAsEnum = HttpVersionStringToEnum.find(std::string(verPos, verPos + 3));
  336|  34.7k|		if (versionAsEnum == HttpVersionStringToEnum.end())
  ------------------
  |  Branch (336:7): [True: 6.05k, False: 28.7k]
  ------------------
  337|  6.05k|		{
  338|  6.05k|			m_Version = HttpVersionUnknown;
  339|  6.05k|		}
  340|  28.7k|		else
  341|  28.7k|		{
  342|  28.7k|			m_Version = versionAsEnum->second;
  343|  28.7k|		}
  344|       |
  345|  34.7k|		m_VersionOffset = verPos - (char*)m_HttpRequest->m_Data;
  346|  34.7k|	}
_ZN4pcpp22HttpResponseStatusCodeC2ERKiRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE:
  556|  22.8k|	{
  557|  22.8k|		if (statusMessage != "")
  ------------------
  |  Branch (557:7): [True: 22.8k, False: 0]
  ------------------
  558|  22.8k|		{
  559|  22.8k|			m_CustomizedMessage = statusMessage;
  560|  22.8k|		}
  561|       |
  562|  22.8k|		if (intStatusCodeMap.find(statusCodeNumber) != intStatusCodeMap.end())
  ------------------
  |  Branch (562:7): [True: 22.7k, False: 71]
  ------------------
  563|  22.7k|		{
  564|  22.7k|			m_Value = intStatusCodeMap.at(statusCodeNumber);
  565|  22.7k|			return;
  566|  22.7k|		}
  567|       |
  568|     71|		if (statusCodeNumber >= 100 && statusCodeNumber <= 199)
  ------------------
  |  Branch (568:7): [True: 65, False: 6]
  |  Branch (568:34): [True: 10, False: 55]
  ------------------
  569|     10|		{
  570|     10|			m_Value = HttpResponseStatusCode::HttpStatus1xxCodeUnknown;
  571|     10|		}
  572|     61|		else if (statusCodeNumber >= 200 && statusCodeNumber <= 299)
  ------------------
  |  Branch (572:12): [True: 55, False: 6]
  |  Branch (572:39): [True: 15, False: 40]
  ------------------
  573|     15|		{
  574|     15|			m_Value = HttpResponseStatusCode::HttpStatus2xxCodeUnknown;
  575|     15|		}
  576|     46|		else if (statusCodeNumber >= 300 && statusCodeNumber <= 399)
  ------------------
  |  Branch (576:12): [True: 40, False: 6]
  |  Branch (576:39): [True: 0, False: 40]
  ------------------
  577|      0|		{
  578|      0|			m_Value = HttpResponseStatusCode::HttpStatus3xxCodeUnknown;
  579|      0|		}
  580|     46|		else if (statusCodeNumber >= 400 && statusCodeNumber <= 499)
  ------------------
  |  Branch (580:12): [True: 40, False: 6]
  |  Branch (580:39): [True: 0, False: 40]
  ------------------
  581|      0|		{
  582|      0|			m_Value = HttpResponseStatusCode::HttpStatus4xxCodeUnknown;
  583|      0|		}
  584|     46|		else if (statusCodeNumber >= 500 && statusCodeNumber <= 599)
  ------------------
  |  Branch (584:12): [True: 40, False: 6]
  |  Branch (584:39): [True: 0, False: 40]
  ------------------
  585|      0|		{
  586|      0|			m_Value = HttpResponseStatusCode::HttpStatus5xxCodeUnknown;
  587|      0|		}
  588|     71|	}
_ZN4pcpp17HttpResponseLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  712|  11.3k|	    : HttpMessage(data, dataLen, prevLayer, packet, HTTPResponse)
  713|  11.3k|	{
  714|  11.3k|		m_FirstLine = new HttpResponseFirstLine(this);
  715|  11.3k|		setFieldsOffset(m_FirstLine->getSize());
  716|  11.3k|		parseFields();
  717|  11.3k|	}
_ZN4pcpp17HttpResponseLayerD2Ev:
  735|  11.3k|	{
  736|  11.3k|		delete m_FirstLine;
  737|  11.3k|	}
_ZNK4pcpp17HttpResponseLayer8toStringEv:
  790|  3.98k|	{
  791|  3.98k|		static const int maxLengthToPrint = 120;
  792|  3.98k|		std::string result = "HTTP response, ";
  793|  3.98k|		int size = m_FirstLine->getSize() - 2;  // the -2 is to remove \r\n at the end of the first line
  794|  3.98k|		if (size <= maxLengthToPrint)
  ------------------
  |  Branch (794:7): [True: 3.86k, False: 122]
  ------------------
  795|  3.86k|		{
  796|  3.86k|			char* firstLine = new char[size + 1];
  797|  3.86k|			strncpy(firstLine, reinterpret_cast<char*>(m_Data), size);
  798|  3.86k|			firstLine[size] = 0;
  799|  3.86k|			result += std::string(firstLine);
  800|  3.86k|			delete[] firstLine;
  801|  3.86k|		}
  802|    122|		else
  803|    122|		{
  804|    122|			char firstLine[maxLengthToPrint + 1];
  805|    122|			strncpy(firstLine, reinterpret_cast<char*>(m_Data), maxLengthToPrint - 3);
  806|    122|			firstLine[maxLengthToPrint - 3] = '.';
  807|    122|			firstLine[maxLengthToPrint - 2] = '.';
  808|    122|			firstLine[maxLengthToPrint - 1] = '.';
  809|    122|			firstLine[maxLengthToPrint] = 0;
  810|    122|			result += std::string(firstLine);
  811|    122|		}
  812|       |
  813|  3.98k|		return result;
  814|  3.98k|	}
_ZN4pcpp21HttpResponseFirstLine15parseStatusCodeEPKcm:
  917|  22.8k|	{
  918|       |		// minimum data should be 12B long: "HTTP/x.y XXX"
  919|  22.8k|		if (!data || dataLen < 12)
  ------------------
  |  Branch (919:7): [True: 0, False: 22.8k]
  |  Branch (919:16): [True: 0, False: 22.8k]
  ------------------
  920|      0|		{
  921|      0|			return HttpResponseStatusCode::HttpStatusCodeUnknown;
  922|      0|		}
  923|       |
  924|  22.8k|		const std::string codeString = std::string(data + 9, 3);
  925|       |
  926|  22.8k|		if (codeString.empty() || (std::find_if(codeString.begin(), codeString.end(),
  ------------------
  |  Branch (926:7): [True: 0, False: 22.8k]
  |  Branch (926:7): [True: 20, False: 22.8k]
  |  Branch (926:29): [True: 20, False: 22.8k]
  ------------------
  927|  22.8k|		                                        [](unsigned char c) { return !std::isdigit(c); }) != codeString.end()))
  928|     20|		{
  929|     20|			return HttpResponseStatusCode::HttpStatusCodeUnknown;
  930|     20|		}
  931|       |
  932|  22.8k|		constexpr size_t messageOffset = 13;  // expect "HTTP/x.y XXX YYY", YYY starts from 13
  933|  22.8k|		size_t offset = messageOffset;
  934|  22.8k|		bool isMessageFound = false;
  935|   304k|		while (offset < dataLen)
  ------------------
  |  Branch (935:10): [True: 304k, False: 0]
  ------------------
  936|   304k|		{
  937|   304k|			if (data[offset] == '\n')
  ------------------
  |  Branch (937:8): [True: 22.8k, False: 281k]
  ------------------
  938|  22.8k|			{
  939|  22.8k|				isMessageFound = true;
  940|  22.8k|				break;
  941|  22.8k|			}
  942|   281k|			offset++;
  943|   281k|		}
  944|       |
  945|  22.8k|		if (!isMessageFound)
  ------------------
  |  Branch (945:7): [True: 0, False: 22.8k]
  ------------------
  946|      0|		{
  947|      0|			return HttpResponseStatusCode::HttpStatusCodeUnknown;
  948|      0|		}
  949|       |
  950|  22.8k|		std::string messageString(data + messageOffset, offset - messageOffset);
  951|  22.8k|		if (!messageString.empty() && messageString.back() == '\r')
  ------------------
  |  Branch (951:7): [True: 22.8k, False: 0]
  |  Branch (951:33): [True: 22.0k, False: 808]
  ------------------
  952|  22.0k|		{
  953|  22.0k|			messageString.pop_back();
  954|  22.0k|		}
  955|  22.8k|		if (messageString.empty())
  ------------------
  |  Branch (955:7): [True: 0, False: 22.8k]
  ------------------
  956|      0|		{
  957|      0|			return HttpResponseStatusCode::HttpStatusCodeUnknown;
  958|      0|		}
  959|       |
  960|  22.8k|		return HttpResponseStatusCode(std::stoi(codeString), messageString);
  961|  22.8k|	}
_ZN4pcpp21HttpResponseFirstLineC2EPNS_17HttpResponseLayerE:
  963|  11.3k|	HttpResponseFirstLine::HttpResponseFirstLine(HttpResponseLayer* httpResponse) : m_HttpResponse(httpResponse)
  964|  11.3k|	{
  965|  11.3k|		m_Version = parseVersion((char*)m_HttpResponse->m_Data, m_HttpResponse->getDataLen());
  966|  11.3k|		if (m_Version == HttpVersionUnknown)
  ------------------
  |  Branch (966:7): [True: 0, False: 11.3k]
  ------------------
  967|      0|		{
  968|      0|			m_StatusCode = HttpResponseStatusCode::HttpStatusCodeUnknown;
  969|      0|		}
  970|  11.3k|		else
  971|  11.3k|		{
  972|  11.3k|			m_StatusCode = parseStatusCode((char*)m_HttpResponse->m_Data, m_HttpResponse->getDataLen());
  973|  11.3k|		}
  974|       |
  975|  11.3k|		char* endOfFirstLine;
  976|  11.3k|		if ((endOfFirstLine = (char*)memchr((char*)(m_HttpResponse->m_Data), '\n', m_HttpResponse->m_DataLen)) !=
  ------------------
  |  Branch (976:7): [True: 11.3k, False: 0]
  ------------------
  977|  11.3k|		    nullptr)
  978|  11.3k|		{
  979|  11.3k|			m_FirstLineEndOffset = endOfFirstLine - (char*)m_HttpResponse->m_Data + 1;
  980|  11.3k|			m_IsComplete = true;
  981|  11.3k|		}
  982|      0|		else
  983|      0|		{
  984|      0|			m_FirstLineEndOffset = m_HttpResponse->getDataLen();
  985|      0|			m_IsComplete = false;
  986|      0|		}
  987|       |
  988|  11.3k|		if (Logger::getInstance().isDebugEnabled(PacketLogModuleHttpLayer))
  ------------------
  |  Branch (988:7): [True: 0, False: 11.3k]
  ------------------
  989|      0|		{
  990|      0|			std::string version = (m_Version == HttpVersionUnknown ? "Unknown" : VersionEnumToString[m_Version]);
  ------------------
  |  Branch (990:27): [True: 0, False: 0]
  ------------------
  991|      0|			int statusCode = (m_StatusCode == HttpResponseStatusCode::HttpStatusCodeUnknown ? 0 : m_StatusCode.toInt());
  ------------------
  |  Branch (991:22): [True: 0, False: 0]
  ------------------
  992|      0|			PCPP_LOG_DEBUG("Version='" << version << "'; Status code=" << statusCode << " '" << getStatusCodeString()
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleHttpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleHttpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  993|      0|			                           << "'");
  994|      0|		}
  995|  11.3k|	}
_ZN4pcpp21HttpResponseFirstLine12parseVersionEPKcm:
 1031|  30.5k|	{
 1032|  30.5k|		if (!data || dataLen < 8)  // "HTTP/x.y"
  ------------------
  |  Branch (1032:7): [True: 0, False: 30.5k]
  |  Branch (1032:16): [True: 166, False: 30.4k]
  ------------------
 1033|    166|		{
 1034|    166|			PCPP_LOG_DEBUG("HTTP response length < 8, cannot identify version");
  ------------------
  |  |  427|    166|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|    166|	do                                                                                                                 \
  |  |  |  |  415|    166|	{                                                                                                                  \
  |  |  |  |  416|    166|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    166|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    166|#define LOG_MODULE PacketLogModuleHttpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 166]
  |  |  |  |  ------------------
  |  |  |  |  418|    166|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleHttpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|    166|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 166]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1035|    166|			return HttpVersionUnknown;
 1036|    166|		}
 1037|       |
 1038|  30.4k|		if (data[0] != 'H' || data[1] != 'T' || data[2] != 'T' || data[3] != 'P' || data[4] != '/')
  ------------------
  |  Branch (1038:7): [True: 7.41k, False: 22.9k]
  |  Branch (1038:25): [True: 55, False: 22.9k]
  |  Branch (1038:43): [True: 10, False: 22.9k]
  |  Branch (1038:61): [True: 0, False: 22.9k]
  |  Branch (1038:79): [True: 10, False: 22.9k]
  ------------------
 1039|  7.48k|		{
 1040|  7.48k|			PCPP_LOG_DEBUG("HTTP response does not begin with 'HTTP/'");
  ------------------
  |  |  427|  7.48k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  7.48k|	do                                                                                                                 \
  |  |  |  |  415|  7.48k|	{                                                                                                                  \
  |  |  |  |  416|  7.48k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  7.48k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  7.48k|#define LOG_MODULE PacketLogModuleHttpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 7.48k]
  |  |  |  |  ------------------
  |  |  |  |  418|  7.48k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleHttpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  7.48k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 7.48k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1041|  7.48k|			return HttpVersionUnknown;
 1042|  7.48k|		}
 1043|       |
 1044|  22.9k|		const char* verPos = data + 5;
 1045|  22.9k|		auto versionAsEnum = HttpVersionStringToEnum.find(std::string(verPos, verPos + 3));
 1046|  22.9k|		if (versionAsEnum == HttpVersionStringToEnum.end())
  ------------------
  |  Branch (1046:7): [True: 78, False: 22.8k]
  ------------------
 1047|     78|		{
 1048|     78|			return HttpVersionUnknown;
 1049|     78|		}
 1050|  22.8k|		return versionAsEnum->second;
 1051|  22.9k|	}
HttpLayer.cpp:_ZZN4pcpp21HttpResponseFirstLine15parseStatusCodeEPKcmENK3$_0clEh:
  927|  68.5k|		                                        [](unsigned char c) { return !std::isdigit(c); }) != codeString.end()))
_ZNK4pcpp26HttpResponseStatusCodeHashclERKNS_22HttpResponseStatusCodeE:
  595|    178|		{
  596|    178|			return static_cast<int>(status);
  597|    178|		}

_ZN4pcpp7IPLayer12getIPVersionEPKhm:
    6|     12|	{
    7|       |		// The data requires at least 1 byte of valid buffer
    8|     12|		if (data == nullptr || dataLen < 1)
  ------------------
  |  Branch (8:7): [True: 0, False: 12]
  |  Branch (8:26): [True: 0, False: 12]
  ------------------
    9|      0|		{
   10|      0|			return UnknownProtocol;
   11|      0|		}
   12|       |
   13|       |		// The first 4 bits of the first byte of the IP header represent the IP version
   14|     12|		uint8_t version = data[0] >> 4;
   15|       |
   16|     12|		switch (version)
   17|     12|		{
   18|      0|		case 4:
  ------------------
  |  Branch (18:3): [True: 0, False: 12]
  ------------------
   19|      0|			return IPv4;
   20|      0|		case 6:
  ------------------
  |  Branch (20:3): [True: 0, False: 12]
  ------------------
   21|      0|			return IPv6;
   22|     12|		default:
  ------------------
  |  Branch (22:3): [True: 12, False: 0]
  ------------------
   23|     12|			return UnknownProtocol;
   24|     12|		}
   25|     12|	}

_ZN4pcpp25AuthenticationHeaderLayer14parseNextLayerEv:
   55|  1.17k|	{
   56|  1.17k|		size_t headerLen = getHeaderLen();
   57|  1.17k|		if (m_DataLen <= headerLen)
  ------------------
  |  Branch (57:7): [True: 0, False: 1.17k]
  ------------------
   58|      0|			return;
   59|       |
   60|  1.17k|		uint8_t* payload = m_Data + headerLen;
   61|  1.17k|		size_t payloadLen = m_DataLen - headerLen;
   62|       |
   63|  1.17k|		switch (getAHHeader()->nextHeader)
   64|  1.17k|		{
   65|  1.16k|		case PACKETPP_IPPROTO_UDP:
  ------------------
  |  Branch (65:3): [True: 1.16k, False: 14]
  ------------------
   66|  1.16k|		{
   67|  1.16k|			tryConstructNextLayerWithFallback<UdpLayer, PayloadLayer>(payload, payloadLen);
   68|  1.16k|			break;
   69|      0|		}
   70|      0|		case PACKETPP_IPPROTO_TCP:
  ------------------
  |  Branch (70:3): [True: 0, False: 1.17k]
  ------------------
   71|      0|		{
   72|      0|			tryConstructNextLayerWithFallback<TcpLayer, PayloadLayer>(payload, payloadLen);
   73|      0|			break;
   74|      0|		}
   75|      0|		case PACKETPP_IPPROTO_IPIP:
  ------------------
  |  Branch (75:3): [True: 0, False: 1.17k]
  ------------------
   76|      0|		{
   77|      0|			uint8_t ipVersion = *payload >> 4;
   78|      0|			switch (ipVersion)
   79|      0|			{
   80|      0|			case 4:
  ------------------
  |  Branch (80:4): [True: 0, False: 0]
  ------------------
   81|      0|			{
   82|      0|				tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen);
   83|      0|				break;
   84|      0|			}
   85|      0|			case 6:
  ------------------
  |  Branch (85:4): [True: 0, False: 0]
  ------------------
   86|      0|			{
   87|      0|				tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen);
   88|      0|				break;
   89|      0|			}
   90|      0|			default:
  ------------------
  |  Branch (90:4): [True: 0, False: 0]
  ------------------
   91|      0|			{
   92|      0|				constructNextLayer<PayloadLayer>(payload, payloadLen);
   93|      0|				break;
   94|      0|			}
   95|      0|			}
   96|      0|			break;
   97|      0|		}
   98|      0|		case PACKETPP_IPPROTO_ESP:
  ------------------
  |  Branch (98:3): [True: 0, False: 1.17k]
  ------------------
   99|      0|		{
  100|      0|			tryConstructNextLayerWithFallback<ESPLayer, PayloadLayer>(payload, payloadLen);
  101|      0|			break;
  102|      0|		}
  103|     14|		default:
  ------------------
  |  Branch (103:3): [True: 14, False: 1.16k]
  ------------------
  104|     14|			constructNextLayer<PayloadLayer>(payload, payloadLen);
  105|  1.17k|		}
  106|  1.17k|	}
_ZNK4pcpp25AuthenticationHeaderLayer8toStringEv:
  109|    470|	{
  110|    470|		return "Authentication Header Layer";
  111|    470|	}
_ZNK4pcpp8ESPLayer6getSPIEv:
  131|     40|	{
  132|       |		return be32toh(getESPHeader()->spi);
  133|     40|	}
_ZN4pcpp8ESPLayer14parseNextLayerEv:
  141|    100|	{
  142|    100|		size_t headerLen = getHeaderLen();
  143|    100|		if (m_DataLen <= headerLen)
  ------------------
  |  Branch (143:7): [True: 0, False: 100]
  ------------------
  144|      0|			return;
  145|       |
  146|    100|		constructNextLayer<PayloadLayer>(m_Data + headerLen, m_DataLen - headerLen);
  147|    100|	}
_ZNK4pcpp8ESPLayer8toStringEv:
  150|     40|	{
  151|     40|		std::ostringstream stream;
  152|     40|		stream << "ESP Layer, SPI: 0x" << std::hex << getSPI();
  153|     40|		return stream.str();
  154|     40|	}

_ZN4pcpp9IPv4Layer17initLayerInPacketEb:
  231|   714k|	{
  232|   714k|		m_Protocol = IPv4;
  233|   714k|		m_NumOfTrailingBytes = 0;
  234|   714k|		m_TempHeaderExtension = 0;
  235|   714k|		if (setTotalLenAsDataLen)
  ------------------
  |  Branch (235:7): [True: 714k, False: 0]
  ------------------
  236|   714k|		{
  237|   714k|			size_t totalLen = be16toh(getIPv4Header()->totalLength);
  238|       |			// if totalLen == 0 this usually means TCP Segmentation Offload (TSO). In this case we should ignore the
  239|       |			// value of totalLen and look at the data captured on the wire
  240|   714k|			if ((totalLen < m_DataLen) && (totalLen != 0))
  ------------------
  |  Branch (240:8): [True: 91.5k, False: 622k]
  |  Branch (240:34): [True: 74.6k, False: 16.9k]
  ------------------
  241|  74.6k|			{
  242|  74.6k|				auto headerLen = (std::min)(getHeaderLen(), m_DataLen);
  243|       |				// Make sure totalLen is larger than header len, otherwise it's a malformed packet
  244|  74.6k|				m_DataLen = (std::max)(totalLen, headerLen);
  245|  74.6k|			}
  246|   714k|		}
  247|   714k|	}
_ZN4pcpp9IPv4LayerC2EPhmPNS_5LayerEPNS_6PacketE:
  268|   714k|	    : Layer(data, dataLen, prevLayer, packet)
  269|   714k|	{
  270|   714k|		initLayerInPacket(true);
  271|   714k|	}
_ZN4pcpp9IPv4Layer14parseNextLayerEv:
  296|   714k|	{
  297|   714k|		size_t hdrLen = getHeaderLen();
  298|   714k|		if (m_DataLen <= hdrLen || hdrLen == 0)
  ------------------
  |  Branch (298:7): [True: 107, False: 714k]
  |  Branch (298:30): [True: 0, False: 714k]
  ------------------
  299|    107|			return;
  300|       |
  301|   714k|		iphdr* ipHdr = getIPv4Header();
  302|       |
  303|   714k|		uint8_t* payload = m_Data + hdrLen;
  304|   714k|		size_t payloadLen = m_DataLen - hdrLen;
  305|       |
  306|       |		// If it's a fragment don't parse upper layers, unless if it's the first fragment
  307|       |		// TODO: assuming first fragment contains at least L4 header, what if it's not true?
  308|   714k|		if (isFragment())
  ------------------
  |  Branch (308:7): [True: 11.5k, False: 702k]
  ------------------
  309|  11.5k|		{
  310|  11.5k|			constructNextLayer<PayloadLayer>(payload, payloadLen, getAttachedPacket());
  311|  11.5k|			return;
  312|  11.5k|		}
  313|       |
  314|   702k|		switch (ipHdr->protocol)
  ------------------
  |  Branch (314:11): [True: 699k, False: 2.79k]
  ------------------
  315|   702k|		{
  316|   240k|		case PACKETPP_IPPROTO_UDP:
  ------------------
  |  Branch (316:3): [True: 240k, False: 462k]
  ------------------
  317|   240k|			tryConstructNextLayerWithFallback<UdpLayer, PayloadLayer>(payload, payloadLen, getAttachedPacket());
  318|   240k|			break;
  319|   385k|		case PACKETPP_IPPROTO_TCP:
  ------------------
  |  Branch (319:3): [True: 385k, False: 317k]
  ------------------
  320|   385k|			tryConstructNextLayerWithFallback<TcpLayer, PayloadLayer>(payload, payloadLen, getAttachedPacket());
  321|   385k|			break;
  322|  21.1k|		case PACKETPP_IPPROTO_ICMP:
  ------------------
  |  Branch (322:3): [True: 21.1k, False: 681k]
  ------------------
  323|  21.1k|			tryConstructNextLayerWithFallback<IcmpLayer, PayloadLayer>(payload, payloadLen, getAttachedPacket());
  324|  21.1k|			break;
  325|     12|		case PACKETPP_IPPROTO_IPIP:
  ------------------
  |  Branch (325:3): [True: 12, False: 702k]
  ------------------
  326|     12|		{
  327|       |			// todo: no tests for this case
  328|     12|			switch (IPLayer::getIPVersion(payload, payloadLen))
  329|     12|			{
  330|      0|			case IPv4:
  ------------------
  |  Branch (330:4): [True: 0, False: 12]
  ------------------
  331|      0|				tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen, getAttachedPacket());
  332|      0|				break;
  333|      0|			case IPv6:
  ------------------
  |  Branch (333:4): [True: 0, False: 12]
  ------------------
  334|      0|				tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen, getAttachedPacket());
  335|      0|				break;
  336|     12|			default:
  ------------------
  |  Branch (336:4): [True: 12, False: 0]
  ------------------
  337|     12|				constructNextLayer<PayloadLayer>(payload, payloadLen, getAttachedPacket());
  338|     12|				break;
  339|     12|			}
  340|     12|			break;
  341|     12|		}
  342|  26.7k|		case PACKETPP_IPPROTO_GRE:
  ------------------
  |  Branch (342:3): [True: 26.7k, False: 675k]
  ------------------
  343|  26.7k|		{
  344|  26.7k|			switch (GreLayer::getGREVersion(payload, payloadLen))
  345|  26.7k|			{
  346|  11.4k|			case GREv0:
  ------------------
  |  Branch (346:4): [True: 11.4k, False: 15.3k]
  ------------------
  347|  11.4k|				tryConstructNextLayerWithFallback<GREv0Layer, PayloadLayer>(payload, payloadLen, getAttachedPacket());
  348|  11.4k|				break;
  349|  15.3k|			case GREv1:
  ------------------
  |  Branch (349:4): [True: 15.3k, False: 11.4k]
  ------------------
  350|  15.3k|				tryConstructNextLayerWithFallback<GREv1Layer, PayloadLayer>(payload, payloadLen, getAttachedPacket());
  351|  15.3k|				break;
  352|     69|			default:
  ------------------
  |  Branch (352:4): [True: 69, False: 26.7k]
  ------------------
  353|     69|				constructNextLayer<PayloadLayer>(payload, payloadLen, getAttachedPacket());
  354|     69|				break;
  355|  26.7k|			};
  356|  26.7k|			break;
  357|  26.7k|		}
  358|  9.80k|		case PACKETPP_IPPROTO_IGMP:
  ------------------
  |  Branch (358:3): [True: 9.80k, False: 692k]
  ------------------
  359|  9.80k|		{
  360|  9.80k|			bool igmpQuery = false;
  361|  9.80k|			ProtocolType igmpVer = IgmpLayer::getIGMPVerFromData(
  362|  9.80k|			    payload, std::min<size_t>(payloadLen, be16toh(getIPv4Header()->totalLength) - hdrLen), igmpQuery);
  363|       |
  364|  9.80k|			switch (igmpVer)
  365|  9.80k|			{
  366|  2.82k|			case IGMPv1:
  ------------------
  |  Branch (366:4): [True: 2.82k, False: 6.97k]
  ------------------
  367|  2.82k|				tryConstructNextLayerWithFallback<IgmpV1Layer, PayloadLayer>(payload, payloadLen, getAttachedPacket());
  368|  2.82k|				break;
  369|  4.37k|			case IGMPv2:
  ------------------
  |  Branch (369:4): [True: 4.37k, False: 5.42k]
  ------------------
  370|  4.37k|				tryConstructNextLayerWithFallback<IgmpV2Layer, PayloadLayer>(payload, payloadLen, getAttachedPacket());
  371|  4.37k|				break;
  372|  2.40k|			case IGMPv3:
  ------------------
  |  Branch (372:4): [True: 2.40k, False: 7.39k]
  ------------------
  373|  2.40k|			{
  374|  2.40k|				if (igmpQuery)
  ------------------
  |  Branch (374:9): [True: 0, False: 2.40k]
  ------------------
  375|      0|					tryConstructNextLayerWithFallback<IgmpV3QueryLayer, PayloadLayer>(payload, payloadLen,
  376|      0|					                                                                  getAttachedPacket());
  377|  2.40k|				else
  378|  2.40k|					tryConstructNextLayerWithFallback<IgmpV3ReportLayer, PayloadLayer>(payload, payloadLen,
  379|  2.40k|					                                                                   getAttachedPacket());
  380|  2.40k|				break;
  381|      0|			}
  382|    195|			default:
  ------------------
  |  Branch (382:4): [True: 195, False: 9.60k]
  ------------------
  383|    195|				constructNextLayer<PayloadLayer>(payload, payloadLen, getAttachedPacket());
  384|    195|				break;
  385|  9.80k|			}
  386|  9.80k|			break;
  387|  9.80k|		}
  388|  9.80k|		case PACKETPP_IPPROTO_AH:
  ------------------
  |  Branch (388:3): [True: 1.17k, False: 701k]
  ------------------
  389|  1.17k|			tryConstructNextLayerWithFallback<AuthenticationHeaderLayer, PayloadLayer>(payload, payloadLen,
  390|  1.17k|			                                                                           getAttachedPacket());
  391|  1.17k|			break;
  392|     90|		case PACKETPP_IPPROTO_ESP:
  ------------------
  |  Branch (392:3): [True: 90, False: 702k]
  ------------------
  393|     90|			tryConstructNextLayerWithFallback<ESPLayer, PayloadLayer>(payload, payloadLen, getAttachedPacket());
  394|     90|			break;
  395|  7.02k|		case PACKETPP_IPPROTO_IPV6:
  ------------------
  |  Branch (395:3): [True: 7.02k, False: 695k]
  ------------------
  396|  7.02k|			tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen, getAttachedPacket());
  397|  7.02k|			break;
  398|  8.38k|		case PACKETPP_IPPROTO_VRRP:
  ------------------
  |  Branch (398:3): [True: 8.38k, False: 694k]
  ------------------
  399|  8.38k|		{
  400|  8.38k|			switch (VrrpLayer::getVersionFromData(payload, payloadLen))
  401|  8.38k|			{
  402|  5.62k|			case VRRPv2:
  ------------------
  |  Branch (402:4): [True: 5.62k, False: 2.75k]
  ------------------
  403|  5.62k|				tryConstructNextLayerWithFallback<VrrpV2Layer, PayloadLayer>(payload, payloadLen, getAttachedPacket());
  404|  5.62k|				break;
  405|  2.64k|			case VRRPv3:
  ------------------
  |  Branch (405:4): [True: 2.64k, False: 5.73k]
  ------------------
  406|  2.64k|				tryConstructNextLayerWithFallback<VrrpV3Layer, PayloadLayer>(payload, payloadLen, getAttachedPacket(),
  407|  2.64k|				                                                             IPAddress::IPv4AddressType);
  408|  2.64k|				break;
  409|    110|			default:
  ------------------
  |  Branch (409:4): [True: 110, False: 8.27k]
  ------------------
  410|    110|				constructNextLayer<PayloadLayer>(payload, payloadLen, getAttachedPacket());
  411|    110|				break;
  412|  8.38k|			}
  413|  8.38k|			break;
  414|  8.38k|		}
  415|   702k|		}
  416|       |
  417|       |		// If no next layer was constructed, assume it's a payload layer
  418|   702k|		if (!hasNextLayer())
  ------------------
  |  Branch (418:7): [True: 2.79k, False: 699k]
  ------------------
  419|  2.79k|			constructNextLayer<PayloadLayer>(payload, payloadLen, getAttachedPacket());
  420|   702k|	}
_ZN4pcpp9IPv4Layer22computeCalculateFieldsEv:
  423|   132k|	{
  424|   132k|		auto* ipHdr = getIPv4Header();
  425|   132k|		ipHdr->ipVersion = (4 & 0x0f);
  426|   132k|		ipHdr->totalLength = htobe16(m_DataLen);
  427|   132k|		ipHdr->headerChecksum = 0;
  428|       |
  429|   132k|		if (m_NextLayer != nullptr)
  ------------------
  |  Branch (429:7): [True: 132k, False: 2]
  ------------------
  430|   132k|		{
  431|   132k|			switch (m_NextLayer->getProtocol())
  432|   132k|			{
  433|  72.4k|			case TCP:
  ------------------
  |  Branch (433:4): [True: 72.4k, False: 60.2k]
  ------------------
  434|  72.4k|				ipHdr->protocol = PACKETPP_IPPROTO_TCP;
  435|  72.4k|				break;
  436|  43.0k|			case UDP:
  ------------------
  |  Branch (436:4): [True: 43.0k, False: 89.6k]
  ------------------
  437|  43.0k|				ipHdr->protocol = PACKETPP_IPPROTO_UDP;
  438|  43.0k|				break;
  439|  3.84k|			case ICMP:
  ------------------
  |  Branch (439:4): [True: 3.84k, False: 128k]
  ------------------
  440|  3.84k|				ipHdr->protocol = PACKETPP_IPPROTO_ICMP;
  441|  3.84k|				break;
  442|  2.51k|			case GREv0:
  ------------------
  |  Branch (442:4): [True: 2.51k, False: 130k]
  ------------------
  443|  4.74k|			case GREv1:
  ------------------
  |  Branch (443:4): [True: 2.23k, False: 130k]
  ------------------
  444|  4.74k|				ipHdr->protocol = PACKETPP_IPPROTO_GRE;
  445|  4.74k|				break;
  446|    569|			case IGMPv1:
  ------------------
  |  Branch (446:4): [True: 569, False: 132k]
  ------------------
  447|  1.45k|			case IGMPv2:
  ------------------
  |  Branch (447:4): [True: 887, False: 131k]
  ------------------
  448|  2.05k|			case IGMPv3:
  ------------------
  |  Branch (448:4): [True: 597, False: 132k]
  ------------------
  449|  2.05k|				ipHdr->protocol = PACKETPP_IPPROTO_IGMP;
  450|  2.05k|				break;
  451|  1.17k|			case VRRPv2:
  ------------------
  |  Branch (451:4): [True: 1.17k, False: 131k]
  ------------------
  452|  1.82k|			case VRRPv3:
  ------------------
  |  Branch (452:4): [True: 650, False: 132k]
  ------------------
  453|  1.82k|				ipHdr->protocol = PACKETPP_IPPROTO_VRRP;
  454|  1.82k|				break;
  455|  4.74k|			default:
  ------------------
  |  Branch (455:4): [True: 4.74k, False: 127k]
  ------------------
  456|  4.74k|				break;
  457|   132k|			}
  458|   132k|		}
  459|       |
  460|   132k|		auto headerLen = (std::min)(static_cast<size_t>(ipHdr->internetHeaderLength * 4), m_DataLen);
  461|   132k|		ScalarBuffer<uint16_t> scalar = { reinterpret_cast<uint16_t*>(ipHdr), headerLen };
  462|       |		ipHdr->headerChecksum = htobe16(computeChecksum(&scalar, 1));
  463|   132k|	}
_ZNK4pcpp9IPv4Layer10isFragmentEv:
  466|   986k|	{
  467|   986k|		return ((getFragmentFlags() & PCPP_IP_MORE_FRAGMENTS) != 0 || getFragmentOffset() != 0);
  ------------------
  |  |  156|   986k|#define PCPP_IP_MORE_FRAGMENTS 0x20
  ------------------
  |  Branch (467:11): [True: 10.7k, False: 976k]
  |  Branch (467:65): [True: 12.0k, False: 964k]
  ------------------
  468|   986k|	}
_ZNK4pcpp9IPv4Layer15isFirstFragmentEv:
  471|  3.78k|	{
  472|  3.78k|		return isFragment() && (getFragmentOffset() == 0);
  ------------------
  |  Branch (472:10): [True: 3.78k, False: 0]
  |  Branch (472:26): [True: 136, False: 3.64k]
  ------------------
  473|  3.78k|	}
_ZNK4pcpp9IPv4Layer14isLastFragmentEv:
  476|  3.64k|	{
  477|  3.64k|		return isFragment() && ((getFragmentFlags() & PCPP_IP_MORE_FRAGMENTS) == 0);
  ------------------
  |  |  156|  3.64k|#define PCPP_IP_MORE_FRAGMENTS 0x20
  ------------------
  |  Branch (477:10): [True: 3.64k, False: 0]
  |  Branch (477:26): [True: 2.08k, False: 1.56k]
  ------------------
  478|  3.64k|	}
_ZNK4pcpp9IPv4Layer16getFragmentFlagsEv:
  481|   990k|	{
  482|   990k|		return getIPv4Header()->fragmentOffset & 0xE0;
  483|   990k|	}
_ZNK4pcpp9IPv4Layer17getFragmentOffsetEv:
  486|   983k|	{
  487|       |		return be16toh(getIPv4Header()->fragmentOffset & (uint16_t)0xFF1F) * 8;
  488|   983k|	}
_ZNK4pcpp9IPv4Layer8toStringEv:
  491|   265k|	{
  492|   265k|		std::string fragment = "";
  493|   265k|		if (isFragment())
  ------------------
  |  Branch (493:7): [True: 3.78k, False: 261k]
  ------------------
  494|  3.78k|		{
  495|  3.78k|			if (isFirstFragment())
  ------------------
  |  Branch (495:8): [True: 136, False: 3.64k]
  ------------------
  496|    136|				fragment = "First fragment";
  497|  3.64k|			else if (isLastFragment())
  ------------------
  |  Branch (497:13): [True: 2.08k, False: 1.56k]
  ------------------
  498|  2.08k|				fragment = "Last fragment";
  499|  1.56k|			else
  500|  1.56k|				fragment = "Fragment";
  501|       |
  502|  3.78k|			std::stringstream sstm;
  503|  3.78k|			sstm << fragment << " [offset= " << getFragmentOffset() << "], ";
  504|  3.78k|			fragment = sstm.str();
  505|  3.78k|		}
  506|       |
  507|   265k|		return "IPv4 Layer, " + fragment + "Src: " + getSrcIPv4Address().toString() +
  508|   265k|		       ", Dst: " + getDstIPv4Address().toString();
  509|   265k|	}

_ZNK4pcpp13IPv6Extension10getDataPtrEv:
   30|  47.1k|	{
   31|  47.1k|		if (m_DataContainer != nullptr)
  ------------------
  |  Branch (31:7): [True: 47.1k, False: 0]
  ------------------
   32|  47.1k|			return m_DataContainer->getDataPtr(m_Offset);
   33|       |
   34|      0|		return m_ShadowData;
   35|  47.1k|	}
_ZN4pcpp13IPv6ExtensionD2Ev:
   43|  13.0k|	{
   44|  13.0k|		if (m_ShadowData != nullptr)
  ------------------
  |  Branch (44:7): [True: 0, False: 13.0k]
  ------------------
   45|      0|			delete[] m_ShadowData;
   46|  13.0k|	}
_ZNK4pcpp13IPv6Extension24getExtensionTypeAsStringEv:
   49|  2.76k|	{
   50|  2.76k|		switch (m_ExtType)
   51|  2.76k|		{
   52|    556|		case IPv6Fragmentation:
  ------------------
  |  Branch (52:3): [True: 556, False: 2.21k]
  ------------------
   53|    556|			return "Fragment";
   54|  1.88k|		case IPv6HopByHop:
  ------------------
  |  Branch (54:3): [True: 1.88k, False: 880]
  ------------------
   55|  1.88k|			return "Hop-By-Hop";
   56|      0|		case IPv6Destination:
  ------------------
  |  Branch (56:3): [True: 0, False: 2.76k]
  ------------------
   57|      0|			return "Destination";
   58|      0|		case IPv6Routing:
  ------------------
  |  Branch (58:3): [True: 0, False: 2.76k]
  ------------------
   59|      0|			return "Routing";
   60|    324|		case IPv6AuthenticationHdr:
  ------------------
  |  Branch (60:3): [True: 324, False: 2.44k]
  ------------------
   61|    324|			return "Authentication";
   62|      0|		default:
  ------------------
  |  Branch (62:3): [True: 0, False: 2.76k]
  ------------------
   63|      0|			return "Unknown";
   64|  2.76k|		}
   65|  2.76k|	}
_ZN4pcpp19IPv6TLVOptionHeaderC2EPNS_14IDataContainerEm:
  205|  11.4k|	    : IPv6Extension(dataContainer, offset)
  206|  11.4k|	{}

_ZN4pcpp9IPv6LayerC2EPhmPNS_5LayerEPNS_6PacketE:
   30|   119k|	    : Layer(data, dataLen, prevLayer, packet, IPv6)
   31|   119k|	{
   32|   119k|		m_FirstExtension = nullptr;
   33|   119k|		m_LastExtension = nullptr;
   34|   119k|		m_ExtensionsLen = 0;
   35|       |
   36|   119k|		parseExtensions();
   37|       |
   38|   119k|		size_t totalLen = be16toh(getIPv6Header()->payloadLength) + getHeaderLen();
   39|   119k|		if (totalLen < m_DataLen)
  ------------------
  |  Branch (39:7): [True: 5.37k, False: 114k]
  ------------------
   40|  5.37k|			m_DataLen = totalLen;
   41|   119k|	}
_ZN4pcpp9IPv6LayerD2Ev:
   65|   119k|	{
   66|   119k|		deleteExtensions();
   67|   119k|	}
_ZN4pcpp9IPv6Layer15parseExtensionsEv:
   81|   119k|	{
   82|   119k|		uint8_t nextHdr = getIPv6Header()->nextHeader;
   83|   119k|		IPv6Extension* curExt = nullptr;
   84|       |
   85|   119k|		size_t offset = sizeof(ip6_hdr);
   86|       |
   87|   132k|		while (offset <= m_DataLen - 2 * sizeof(uint8_t))  // 2*sizeof(uint8_t) is the min len for IPv6 extensions
  ------------------
  |  Branch (87:10): [True: 129k, False: 3.55k]
  ------------------
   88|   129k|		{
   89|   129k|			IPv6Extension* newExt = nullptr;
   90|       |
   91|   129k|			switch (nextHdr)
   92|   129k|			{
   93|    959|			case PACKETPP_IPPROTO_FRAGMENT:
  ------------------
  |  Branch (93:4): [True: 959, False: 128k]
  ------------------
   94|    959|			{
   95|    959|				newExt = new IPv6FragmentationHeader(this, offset);
   96|    959|				break;
   97|      0|			}
   98|  11.4k|			case PACKETPP_IPPROTO_HOPOPTS:
  ------------------
  |  Branch (98:4): [True: 11.4k, False: 117k]
  ------------------
   99|  11.4k|			{
  100|  11.4k|				newExt = new IPv6HopByHopHeader(this, offset);
  101|  11.4k|				break;
  102|      0|			}
  103|      0|			case PACKETPP_IPPROTO_DSTOPTS:
  ------------------
  |  Branch (103:4): [True: 0, False: 129k]
  ------------------
  104|      0|			{
  105|      0|				newExt = new IPv6DestinationHeader(this, offset);
  106|      0|				break;
  107|      0|			}
  108|      0|			case PACKETPP_IPPROTO_ROUTING:
  ------------------
  |  Branch (108:4): [True: 0, False: 129k]
  ------------------
  109|      0|			{
  110|      0|				newExt = new IPv6RoutingHeader(this, offset);
  111|      0|				break;
  112|      0|			}
  113|    649|			case PACKETPP_IPPROTO_AH:
  ------------------
  |  Branch (113:4): [True: 649, False: 128k]
  ------------------
  114|    649|			{
  115|    649|				newExt = new IPv6AuthenticationHeader(this, offset);
  116|    649|				break;
  117|      0|			}
  118|   116k|			default:
  ------------------
  |  Branch (118:4): [True: 116k, False: 13.0k]
  ------------------
  119|   116k|			{
  120|   116k|				break;
  121|      0|			}
  122|   129k|			}
  123|       |
  124|   129k|			if (newExt == nullptr)
  ------------------
  |  Branch (124:8): [True: 116k, False: 13.0k]
  ------------------
  125|   116k|				break;
  126|       |
  127|  13.0k|			if (m_FirstExtension == nullptr)
  ------------------
  |  Branch (127:8): [True: 8.90k, False: 4.16k]
  ------------------
  128|  8.90k|			{
  129|  8.90k|				m_FirstExtension = newExt;
  130|  8.90k|				curExt = m_FirstExtension;
  131|  8.90k|			}
  132|  4.16k|			else
  133|  4.16k|			{
  134|  4.16k|				if (curExt == nullptr)
  ------------------
  |  Branch (134:9): [True: 0, False: 4.16k]
  ------------------
  135|      0|				{
  136|      0|					throw std::logic_error("curExt is nullptr");
  137|      0|				}
  138|  4.16k|				curExt->setNextHeader(newExt);
  139|  4.16k|				curExt = curExt->getNextHeader();
  140|  4.16k|			}
  141|       |
  142|  13.0k|			offset += newExt->getExtensionLen();
  143|  13.0k|			nextHdr = newExt->getBaseHeader()->nextHeader;
  144|  13.0k|			m_ExtensionsLen += newExt->getExtensionLen();
  145|  13.0k|		}
  146|       |
  147|   119k|		m_LastExtension = curExt;
  148|   119k|	}
_ZN4pcpp9IPv6Layer16deleteExtensionsEv:
  151|   119k|	{
  152|   119k|		IPv6Extension* curExt = m_FirstExtension;
  153|   132k|		while (curExt != nullptr)
  ------------------
  |  Branch (153:10): [True: 13.0k, False: 119k]
  ------------------
  154|  13.0k|		{
  155|  13.0k|			IPv6Extension* tmpExt = curExt->getNextHeader();
  156|  13.0k|			delete curExt;
  157|  13.0k|			curExt = tmpExt;
  158|  13.0k|		}
  159|       |
  160|   119k|		m_FirstExtension = nullptr;
  161|   119k|		m_LastExtension = nullptr;
  162|   119k|		m_ExtensionsLen = 0;
  163|   119k|	}
_ZN4pcpp9IPv6Layer14parseNextLayerEv:
  196|   119k|	{
  197|   119k|		size_t headerLen = getHeaderLen();
  198|       |
  199|   119k|		if (m_DataLen <= headerLen)
  ------------------
  |  Branch (199:7): [True: 3.50k, False: 116k]
  ------------------
  200|  3.50k|			return;
  201|       |
  202|   116k|		uint8_t* payload = m_Data + headerLen;
  203|   116k|		size_t payloadLen = m_DataLen - headerLen;
  204|       |
  205|   116k|		uint8_t nextHdr;
  206|   116k|		if (m_LastExtension != nullptr)
  ------------------
  |  Branch (206:7): [True: 8.11k, False: 108k]
  ------------------
  207|  8.11k|		{
  208|  8.11k|			if (m_LastExtension->getExtensionType() == IPv6Extension::IPv6Fragmentation)
  ------------------
  |  Branch (208:8): [True: 955, False: 7.16k]
  ------------------
  209|    955|			{
  210|    955|				constructNextLayer<PayloadLayer>(payload, payloadLen);
  211|    955|				return;
  212|    955|			}
  213|       |
  214|  7.16k|			nextHdr = m_LastExtension->getBaseHeader()->nextHeader;
  215|  7.16k|		}
  216|   108k|		else
  217|   108k|		{
  218|   108k|			nextHdr = getIPv6Header()->nextHeader;
  219|   108k|		}
  220|       |
  221|   115k|		switch (nextHdr)
  222|   115k|		{
  223|  9.12k|		case PACKETPP_IPPROTO_UDP:
  ------------------
  |  Branch (223:3): [True: 9.12k, False: 106k]
  ------------------
  224|  9.12k|		{
  225|  9.12k|			tryConstructNextLayerWithFallback<UdpLayer, PayloadLayer>(payload, payloadLen);
  226|  9.12k|			break;
  227|      0|		}
  228|  89.7k|		case PACKETPP_IPPROTO_TCP:
  ------------------
  |  Branch (228:3): [True: 89.7k, False: 25.6k]
  ------------------
  229|  89.7k|		{
  230|  89.7k|			tryConstructNextLayerWithFallback<TcpLayer, PayloadLayer>(payload, payloadLen);
  231|  89.7k|			break;
  232|      0|		}
  233|      0|		case PACKETPP_IPPROTO_IPIP:
  ------------------
  |  Branch (233:3): [True: 0, False: 115k]
  ------------------
  234|      0|		{
  235|      0|			uint8_t ipVersion = *payload >> 4;
  236|      0|			switch (ipVersion)
  237|      0|			{
  238|      0|			case 4:
  ------------------
  |  Branch (238:4): [True: 0, False: 0]
  ------------------
  239|      0|			{
  240|      0|				tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen);
  241|      0|				break;
  242|      0|			}
  243|      0|			case 6:
  ------------------
  |  Branch (243:4): [True: 0, False: 0]
  ------------------
  244|      0|			{
  245|      0|				tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen);
  246|      0|				break;
  247|      0|			}
  248|      0|			default:
  ------------------
  |  Branch (248:4): [True: 0, False: 0]
  ------------------
  249|      0|			{
  250|      0|				constructNextLayer<PayloadLayer>(payload, payloadLen);
  251|      0|				break;
  252|      0|			}
  253|      0|			}
  254|      0|			break;
  255|      0|		}
  256|  2.98k|		case PACKETPP_IPPROTO_GRE:
  ------------------
  |  Branch (256:3): [True: 2.98k, False: 112k]
  ------------------
  257|  2.98k|		{
  258|  2.98k|			ProtocolType greVer = GreLayer::getGREVersion(payload, payloadLen);
  259|       |
  260|  2.98k|			switch (greVer)
  261|  2.98k|			{
  262|  2.97k|			case GREv0:
  ------------------
  |  Branch (262:4): [True: 2.97k, False: 16]
  ------------------
  263|  2.97k|			{
  264|  2.97k|				tryConstructNextLayerWithFallback<GREv0Layer, PayloadLayer>(payload, payloadLen);
  265|  2.97k|				break;
  266|      0|			}
  267|      4|			case GREv1:
  ------------------
  |  Branch (267:4): [True: 4, False: 2.98k]
  ------------------
  268|      4|			{
  269|      4|				tryConstructNextLayerWithFallback<GREv1Layer, PayloadLayer>(payload, payloadLen);
  270|      4|				break;
  271|      0|			}
  272|     12|			default:
  ------------------
  |  Branch (272:4): [True: 12, False: 2.97k]
  ------------------
  273|     12|				constructNextLayer<PayloadLayer>(payload, payloadLen);
  274|     12|				break;
  275|  2.98k|			}
  276|  2.98k|			break;
  277|  2.98k|		}
  278|  2.98k|		case PACKETPP_IPPROTO_AH:
  ------------------
  |  Branch (278:3): [True: 0, False: 115k]
  ------------------
  279|      0|		{
  280|      0|			tryConstructNextLayerWithFallback<AuthenticationHeaderLayer, PayloadLayer>(payload, payloadLen);
  281|      0|			break;
  282|  2.98k|		}
  283|     10|		case PACKETPP_IPPROTO_ESP:
  ------------------
  |  Branch (283:3): [True: 10, False: 115k]
  ------------------
  284|     10|		{
  285|     10|			tryConstructNextLayerWithFallback<ESPLayer, PayloadLayer>(payload, payloadLen);
  286|     10|			break;
  287|  2.98k|		}
  288|  9.63k|		case PACKETPP_IPPROTO_ICMPV6:
  ------------------
  |  Branch (288:3): [True: 9.63k, False: 105k]
  ------------------
  289|  9.63k|		{
  290|  9.63k|			constructNextLayerFromFactory(IcmpV6Layer::parseIcmpV6Layer, payload, payloadLen);
  291|  9.63k|			break;
  292|  2.98k|		}
  293|  3.47k|		case PACKETPP_IPPROTO_VRRP:
  ------------------
  |  Branch (293:3): [True: 3.47k, False: 111k]
  ------------------
  294|  3.47k|		{
  295|  3.47k|			auto vrrpVer = VrrpLayer::getVersionFromData(payload, payloadLen);
  296|       |
  297|  3.47k|			if (vrrpVer == VRRPv3)
  ------------------
  |  Branch (297:8): [True: 3.47k, False: 0]
  ------------------
  298|  3.47k|			{
  299|  3.47k|				constructNextLayer<VrrpV3Layer>(payload, payloadLen, IPAddress::IPv6AddressType);
  300|  3.47k|			}
  301|      0|			else
  302|      0|			{
  303|      0|				constructNextLayer<PayloadLayer>(payload, payloadLen);
  304|      0|			}
  305|  3.47k|			break;
  306|  2.98k|		}
  307|    427|		default:
  ------------------
  |  Branch (307:3): [True: 427, False: 114k]
  ------------------
  308|    427|		{
  309|    427|			constructNextLayer<PayloadLayer>(payload, payloadLen);
  310|    427|			break;
  311|  2.98k|		}
  312|   115k|		}
  313|   115k|	}
_ZN4pcpp9IPv6Layer22computeCalculateFieldsEv:
  316|  22.9k|	{
  317|  22.9k|		ip6_hdr* ipHdr = getIPv6Header();
  318|  22.9k|		ipHdr->payloadLength = htobe16(m_DataLen - sizeof(ip6_hdr));
  319|  22.9k|		ipHdr->ipVersion = (6 & 0x0f);
  320|       |
  321|  22.9k|		if (m_NextLayer != nullptr)
  ------------------
  |  Branch (321:7): [True: 22.4k, False: 472]
  ------------------
  322|  22.4k|		{
  323|  22.4k|			uint8_t nextHeader = 0;
  324|  22.4k|			switch (m_NextLayer->getProtocol())
  325|  22.4k|			{
  326|  16.5k|			case TCP:
  ------------------
  |  Branch (326:4): [True: 16.5k, False: 5.94k]
  ------------------
  327|  16.5k|				nextHeader = PACKETPP_IPPROTO_TCP;
  328|  16.5k|				break;
  329|  1.79k|			case UDP:
  ------------------
  |  Branch (329:4): [True: 1.79k, False: 20.6k]
  ------------------
  330|  1.79k|				nextHeader = PACKETPP_IPPROTO_UDP;
  331|  1.79k|				break;
  332|      0|			case ICMP:
  ------------------
  |  Branch (332:4): [True: 0, False: 22.4k]
  ------------------
  333|      0|				nextHeader = PACKETPP_IPPROTO_ICMP;
  334|      0|				break;
  335|  2.21k|			case ICMPv6:
  ------------------
  |  Branch (335:4): [True: 2.21k, False: 20.2k]
  ------------------
  336|  2.21k|				nextHeader = PACKETPP_IPPROTO_ICMPV6;
  337|  2.21k|				break;
  338|    425|			case GREv0:
  ------------------
  |  Branch (338:4): [True: 425, False: 22.0k]
  ------------------
  339|    426|			case GREv1:
  ------------------
  |  Branch (339:4): [True: 1, False: 22.4k]
  ------------------
  340|    426|				nextHeader = PACKETPP_IPPROTO_GRE;
  341|    426|				break;
  342|    868|			case VRRPv3:
  ------------------
  |  Branch (342:4): [True: 868, False: 21.6k]
  ------------------
  343|    868|				nextHeader = PACKETPP_IPPROTO_VRRP;
  344|    868|				break;
  345|    636|			default:
  ------------------
  |  Branch (345:4): [True: 636, False: 21.8k]
  ------------------
  346|    636|				break;
  347|  22.4k|			}
  348|       |
  349|  22.4k|			if (nextHeader != 0)
  ------------------
  |  Branch (349:8): [True: 21.8k, False: 636]
  ------------------
  350|  21.8k|			{
  351|  21.8k|				if (m_LastExtension != nullptr)
  ------------------
  |  Branch (351:9): [True: 806, False: 21.0k]
  ------------------
  352|    806|					m_LastExtension->getBaseHeader()->nextHeader = nextHeader;
  353|  21.0k|				else
  354|  21.0k|					ipHdr->nextHeader = nextHeader;
  355|  21.8k|			}
  356|  22.4k|		}
  357|  22.9k|	}
_ZNK4pcpp9IPv6Layer8toStringEv:
  360|  45.9k|	{
  361|  45.9k|		std::string result =
  362|  45.9k|		    "IPv6 Layer, Src: " + getSrcIPv6Address().toString() + ", Dst: " + getDstIPv6Address().toString();
  363|  45.9k|		if (m_ExtensionsLen > 0)
  ------------------
  |  Branch (363:7): [True: 2.46k, False: 43.4k]
  ------------------
  364|  2.46k|		{
  365|  2.46k|			result += ", Options=[";
  366|  5.22k|			for (auto const* curExt = m_FirstExtension; curExt != nullptr; curExt = curExt->getNextHeader())
  ------------------
  |  Branch (366:48): [True: 2.76k, False: 2.46k]
  ------------------
  367|  2.76k|			{
  368|  2.76k|				result += curExt->getExtensionTypeAsString();
  369|  2.76k|				result += ",";
  370|  2.76k|			}
  371|       |
  372|       |			// replace the last ','
  373|  2.46k|			result[result.size() - 1] = ']';
  374|  2.46k|		}
  375|       |
  376|  45.9k|		return result;
  377|  45.9k|	}

_ZN4pcpp29icmp_router_address_structure16setRouterAddressENS_11IPv4AddressEj:
   29|      1|	{
   30|      1|		routerAddress = addr.toInt();
   31|       |		preferenceLevel = htobe32(preference);
   32|      1|	}
_ZNK4pcpp9IcmpLayer14getMessageTypeEv:
   41|  92.0k|	{
   42|  92.0k|		uint8_t type = getIcmpHeader()->type;
   43|  92.0k|		if (type > 18)
  ------------------
  |  Branch (43:7): [True: 0, False: 92.0k]
  ------------------
   44|      0|			return ICMP_UNSUPPORTED;
   45|       |
   46|  92.0k|		return static_cast<IcmpMessageType>(type);
   47|  92.0k|	}
_ZN4pcpp9IcmpLayer14cleanIcmpLayerEv:
   50|  2.27k|	{
   51|       |		// remove all layers after
   52|       |
   53|  2.27k|		if (getAttachedPacket() != nullptr)
  ------------------
  |  Branch (53:7): [True: 0, False: 2.27k]
  ------------------
   54|      0|		{
   55|      0|			bool res = getAttachedPacket()->removeAllLayersAfter(this);
   56|      0|			if (!res)
  ------------------
  |  Branch (56:8): [True: 0, False: 0]
  ------------------
   57|      0|				return false;
   58|      0|		}
   59|       |
   60|       |		// shorten layer to size of icmphdr
   61|       |
   62|  2.27k|		size_t headerLen = this->getHeaderLen();
   63|  2.27k|		if (headerLen > sizeof(icmphdr))
  ------------------
  |  Branch (63:7): [True: 1.14k, False: 1.13k]
  ------------------
   64|  1.14k|		{
   65|  1.14k|			if (!this->shortenLayer(sizeof(icmphdr), headerLen - sizeof(icmphdr)))
  ------------------
  |  Branch (65:8): [True: 0, False: 1.14k]
  ------------------
   66|      0|				return false;
   67|  1.14k|		}
   68|       |
   69|  2.27k|		return true;
   70|  2.27k|	}
_ZN4pcpp9IcmpLayer16setIpAndL4LayersEPNS_9IPv4LayerEPNS_5LayerE:
  103|    561|	{
  104|    561|		if (getAttachedPacket() == nullptr)
  ------------------
  |  Branch (104:7): [True: 561, False: 0]
  ------------------
  105|    561|		{
  106|    561|			PCPP_LOG_ERROR("Cannot set ICMP data that involves IP and L4 layers on a layer not attached to a packet. "
  ------------------
  |  |  445|    561|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    561|	do                                                                                                                 \
  |  |  |  |  415|    561|	{                                                                                                                  \
  |  |  |  |  416|    561|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    561|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    561|#define LOG_MODULE PacketLogModuleIcmpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 561, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    561|		{                                                                                                              \
  |  |  |  |  419|    561|			auto ctx =                                                                                                 \
  |  |  |  |  420|    561|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    561|#define LOG_MODULE PacketLogModuleIcmpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    561|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    561|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    561|		}                                                                                                              \
  |  |  |  |  424|    561|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 561]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  107|    561|			               "Please add the ICMP layer to a packet and try again");
  108|    561|			return false;
  109|    561|		}
  110|       |
  111|      0|		if (ipLayer != nullptr && !getAttachedPacket()->addLayer(ipLayer))
  ------------------
  |  Branch (111:7): [True: 0, False: 0]
  |  Branch (111:29): [True: 0, False: 0]
  ------------------
  112|      0|		{
  113|      0|			PCPP_LOG_ERROR("Couldn't add IP layer to ICMP packet");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleIcmpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleIcmpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  114|      0|			return false;
  115|      0|		}
  116|       |
  117|      0|		if (l4Layer != nullptr && !getAttachedPacket()->addLayer(l4Layer))
  ------------------
  |  Branch (117:7): [True: 0, False: 0]
  |  Branch (117:29): [True: 0, False: 0]
  ------------------
  118|      0|		{
  119|      0|			PCPP_LOG_ERROR("Couldn't add L4 layer to ICMP packet");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleIcmpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleIcmpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  120|      0|			return false;
  121|      0|		}
  122|       |
  123|      0|		return true;
  124|      0|	}
_ZN4pcpp9IcmpLayer21getTimestampReplyDataEv:
  199|    398|	{
  200|    398|		if (!isMessageOfType(ICMP_TIMESTAMP_REPLY))
  ------------------
  |  Branch (200:7): [True: 0, False: 398]
  ------------------
  201|      0|			return nullptr;
  202|       |
  203|    398|		return reinterpret_cast<icmp_timestamp_reply*>(m_Data);
  204|    398|	}
_ZN4pcpp9IcmpLayer21setTimestampReplyDataEtt7timevalS1_S1_:
  208|    199|	{
  209|    199|		if (!cleanIcmpLayer())
  ------------------
  |  Branch (209:7): [True: 0, False: 199]
  ------------------
  210|      0|			return nullptr;
  211|       |
  212|    199|		if (!this->extendLayer(m_DataLen, sizeof(icmp_timestamp_reply) - sizeof(icmphdr)))
  ------------------
  |  Branch (212:7): [True: 0, False: 199]
  ------------------
  213|      0|			return nullptr;
  214|       |
  215|    199|		getIcmpHeader()->type = static_cast<uint8_t>(ICMP_TIMESTAMP_REPLY);
  216|       |
  217|    199|		icmp_timestamp_reply* header = getTimestampReplyData();
  218|    199|		header->code = 0;
  219|    199|		header->id = htobe16(id);
  220|    199|		header->sequence = htobe16(sequence);
  221|    199|		header->originateTimestamp = htobe32(originateTimestamp.tv_sec * 1000 + originateTimestamp.tv_usec / 1000);
  222|    199|		header->receiveTimestamp = htobe32(receiveTimestamp.tv_sec * 1000 + receiveTimestamp.tv_usec / 1000);
  223|    199|		header->transmitTimestamp = htobe32(transmitTimestamp.tv_sec * 1000 + transmitTimestamp.tv_usec / 1000);
  224|       |
  225|    199|		return header;
  226|    199|	}
_ZN4pcpp9IcmpLayer22getDestUnreachableDataEv:
  229|    718|	{
  230|    718|		if (!isMessageOfType(ICMP_DEST_UNREACHABLE))
  ------------------
  |  Branch (230:7): [True: 0, False: 718]
  ------------------
  231|      0|			return nullptr;
  232|       |
  233|    718|		return reinterpret_cast<icmp_destination_unreachable*>(m_Data);
  234|    718|	}
_ZN4pcpp9IcmpLayer22setDestUnreachableDataENS_24IcmpDestUnreachableCodesEtPNS_9IPv4LayerEPNS_5LayerE:
  238|    359|	{
  239|    359|		if (!cleanIcmpLayer())
  ------------------
  |  Branch (239:7): [True: 0, False: 359]
  ------------------
  240|      0|			return nullptr;
  241|       |
  242|    359|		if (!this->extendLayer(m_DataLen, sizeof(icmp_destination_unreachable) - sizeof(icmphdr)))
  ------------------
  |  Branch (242:7): [True: 0, False: 359]
  ------------------
  243|      0|			return nullptr;
  244|       |
  245|    359|		getIcmpHeader()->type = static_cast<uint8_t>(ICMP_DEST_UNREACHABLE);
  246|       |
  247|    359|		icmp_destination_unreachable* header = getDestUnreachableData();
  248|    359|		header->code = code;
  249|    359|		header->nextHopMTU = htobe16(nextHopMTU);
  250|    359|		header->unused = 0;
  251|       |
  252|    359|		if (!setIpAndL4Layers(ipHeader, l4Header))
  ------------------
  |  Branch (252:7): [True: 359, False: 0]
  ------------------
  253|    359|			return nullptr;
  254|       |
  255|      0|		return header;
  256|    359|	}
_ZNK4pcpp9IcmpLayer26getRouterAdvertisementDataEv:
  321|     15|	{
  322|     15|		if (!isMessageOfType(ICMP_ROUTER_ADV))
  ------------------
  |  Branch (322:7): [True: 0, False: 15]
  ------------------
  323|      0|			return nullptr;
  324|       |
  325|     15|		m_RouterAdvData.header = reinterpret_cast<icmp_router_advertisement_hdr*>(m_Data);
  326|     15|		m_RouterAdvData.dataLen = m_DataLen;
  327|       |
  328|     15|		return &m_RouterAdvData;
  329|     15|	}
_ZN4pcpp9IcmpLayer26setRouterAdvertisementDataEhtRKNSt3__16vectorINS_29icmp_router_address_structureENS1_9allocatorIS3_EEEE:
  333|      1|	{
  334|      1|		if (code != 0 && code != 16)
  ------------------
  |  Branch (334:7): [True: 1, False: 0]
  |  Branch (334:20): [True: 0, False: 1]
  ------------------
  335|      0|		{
  336|      0|			PCPP_LOG_ERROR("Unknown code " << (int)code
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleIcmpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleIcmpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  337|      0|			                               << " for ICMP router advertisement data (only codes 0 and 16 are legal)");
  338|      0|			return nullptr;
  339|      0|		}
  340|       |
  341|      1|		if (!cleanIcmpLayer())
  ------------------
  |  Branch (341:7): [True: 0, False: 1]
  ------------------
  342|      0|			return nullptr;
  343|       |
  344|      1|		if (!this->extendLayer(m_DataLen, sizeof(icmp_router_advertisement_hdr) +
  ------------------
  |  Branch (344:7): [True: 0, False: 1]
  ------------------
  345|      1|		                                      (routerAddresses.size() * sizeof(icmp_router_address_structure)) -
  346|      1|		                                      sizeof(icmphdr)))
  347|      0|			return nullptr;
  348|       |
  349|      1|		getIcmpHeader()->type = static_cast<uint8_t>(ICMP_ROUTER_ADV);
  350|       |
  351|      1|		icmp_router_advertisement* header = getRouterAdvertisementData();
  352|      1|		header->header->code = code;
  353|      1|		header->header->lifetime = htobe16(lifetimeInSeconds);
  354|      1|		header->header->advertisementCount = static_cast<uint8_t>(routerAddresses.size());
  355|      1|		header->header->addressEntrySize = 2;
  356|       |
  357|      1|		icmp_router_address_structure* curPos = reinterpret_cast<icmp_router_address_structure*>(
  358|      1|		    reinterpret_cast<uint8_t*>(header->header) + sizeof(icmp_router_advertisement_hdr));
  359|      1|		for (const auto& iter : routerAddresses)
  ------------------
  |  Branch (359:25): [True: 1, False: 1]
  ------------------
  360|      1|		{
  361|      1|			curPos->routerAddress = iter.routerAddress;
  362|      1|			curPos->preferenceLevel = iter.preferenceLevel;
  363|      1|			curPos += 1;
  364|      1|		}
  365|       |
  366|      1|		return header;
  367|      1|	}
_ZN4pcpp9IcmpLayer19getTimeExceededDataEv:
  391|    212|	{
  392|    212|		if (!isMessageOfType(ICMP_TIME_EXCEEDED))
  ------------------
  |  Branch (392:7): [True: 0, False: 212]
  ------------------
  393|      0|			return nullptr;
  394|       |
  395|    212|		return reinterpret_cast<icmp_time_exceeded*>(m_Data);
  396|    212|	}
_ZN4pcpp9IcmpLayer19setTimeExceededDataEhPNS_9IPv4LayerEPNS_5LayerE:
  399|    106|	{
  400|    106|		if (code > 1)
  ------------------
  |  Branch (400:7): [True: 0, False: 106]
  ------------------
  401|      0|		{
  402|      0|			PCPP_LOG_ERROR("Unknown code " << (int)code << " for ICMP time exceeded data");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleIcmpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleIcmpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  403|      0|			return nullptr;
  404|      0|		}
  405|       |
  406|    106|		if (!cleanIcmpLayer())
  ------------------
  |  Branch (406:7): [True: 0, False: 106]
  ------------------
  407|      0|			return nullptr;
  408|       |
  409|    106|		if (!this->extendLayer(m_DataLen, sizeof(icmp_time_exceeded) - sizeof(icmphdr)))
  ------------------
  |  Branch (409:7): [True: 0, False: 106]
  ------------------
  410|      0|			return nullptr;
  411|       |
  412|    106|		getIcmpHeader()->type = static_cast<uint8_t>(ICMP_TIME_EXCEEDED);
  413|       |
  414|    106|		icmp_time_exceeded* header = getTimeExceededData();
  415|    106|		header->code = code;
  416|    106|		header->unused = 0;
  417|       |
  418|    106|		if (!setIpAndL4Layers(ipHeader, l4Header))
  ------------------
  |  Branch (418:7): [True: 106, False: 0]
  ------------------
  419|    106|			return nullptr;
  420|       |
  421|      0|		return header;
  422|    106|	}
_ZN4pcpp9IcmpLayer19getParamProblemDataEv:
  425|    192|	{
  426|    192|		if (!isMessageOfType(ICMP_PARAM_PROBLEM))
  ------------------
  |  Branch (426:7): [True: 0, False: 192]
  ------------------
  427|      0|			return nullptr;
  428|       |
  429|    192|		return reinterpret_cast<icmp_param_problem*>(m_Data);
  430|    192|	}
_ZN4pcpp9IcmpLayer19setParamProblemDataEhhPNS_9IPv4LayerEPNS_5LayerE:
  434|     96|	{
  435|     96|		if (code > 2)
  ------------------
  |  Branch (435:7): [True: 0, False: 96]
  ------------------
  436|      0|		{
  437|      0|			PCPP_LOG_ERROR("Unknown code " << (int)code << " for ICMP parameter problem data");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleIcmpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleIcmpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  438|      0|			return nullptr;
  439|      0|		}
  440|       |
  441|     96|		if (!cleanIcmpLayer())
  ------------------
  |  Branch (441:7): [True: 0, False: 96]
  ------------------
  442|      0|			return nullptr;
  443|       |
  444|     96|		if (!this->extendLayer(m_DataLen, sizeof(icmp_param_problem) - sizeof(icmphdr)))
  ------------------
  |  Branch (444:7): [True: 0, False: 96]
  ------------------
  445|      0|			return nullptr;
  446|       |
  447|     96|		getIcmpHeader()->type = static_cast<uint8_t>(ICMP_PARAM_PROBLEM);
  448|       |
  449|     96|		icmp_param_problem* header = getParamProblemData();
  450|     96|		header->code = code;
  451|     96|		header->unused1 = 0;
  452|     96|		header->unused2 = 0;
  453|     96|		header->pointer = errorOctetPointer;
  454|       |
  455|     96|		if (!setIpAndL4Layers(ipHeader, l4Header))
  ------------------
  |  Branch (455:7): [True: 96, False: 0]
  ------------------
  456|     96|			return nullptr;
  457|       |
  458|      0|		return header;
  459|     96|	}
_ZN4pcpp9IcmpLayer25getAddressMaskRequestDataEv:
  462|     78|	{
  463|     78|		if (!isMessageOfType(ICMP_ADDRESS_MASK_REQUEST))
  ------------------
  |  Branch (463:7): [True: 0, False: 78]
  ------------------
  464|      0|			return nullptr;
  465|       |
  466|     78|		return reinterpret_cast<icmp_address_mask_request*>(m_Data);
  467|     78|	}
_ZN4pcpp9IcmpLayer25setAddressMaskRequestDataEttNS_11IPv4AddressE:
  470|     39|	{
  471|     39|		if (!cleanIcmpLayer())
  ------------------
  |  Branch (471:7): [True: 0, False: 39]
  ------------------
  472|      0|			return nullptr;
  473|       |
  474|     39|		if (!this->extendLayer(m_DataLen, sizeof(icmp_address_mask_request) - sizeof(icmphdr)))
  ------------------
  |  Branch (474:7): [True: 0, False: 39]
  ------------------
  475|      0|			return nullptr;
  476|       |
  477|     39|		getIcmpHeader()->type = static_cast<uint8_t>(ICMP_ADDRESS_MASK_REQUEST);
  478|       |
  479|     39|		icmp_address_mask_request* header = getAddressMaskRequestData();
  480|     39|		header->code = 0;
  481|     39|		header->id = htobe16(id);
  482|     39|		header->sequence = htobe16(sequence);
  483|     39|		header->addressMask = mask.toInt();
  484|       |
  485|     39|		return header;
  486|     39|	}
_ZN4pcpp9IcmpLayer23getAddressMaskReplyDataEv:
  489|    688|	{
  490|    688|		if (!isMessageOfType(ICMP_ADDRESS_MASK_REPLY))
  ------------------
  |  Branch (490:7): [True: 0, False: 688]
  ------------------
  491|      0|			return nullptr;
  492|       |
  493|    688|		return reinterpret_cast<icmp_address_mask_reply*>(m_Data);
  494|    688|	}
_ZN4pcpp9IcmpLayer23setAddressMaskReplyDataEttNS_11IPv4AddressE:
  497|    344|	{
  498|    344|		if (!cleanIcmpLayer())
  ------------------
  |  Branch (498:7): [True: 0, False: 344]
  ------------------
  499|      0|			return nullptr;
  500|       |
  501|    344|		if (!this->extendLayer(m_DataLen, sizeof(icmp_address_mask_reply) - sizeof(icmphdr)))
  ------------------
  |  Branch (501:7): [True: 0, False: 344]
  ------------------
  502|      0|			return nullptr;
  503|       |
  504|    344|		getIcmpHeader()->type = static_cast<uint8_t>(ICMP_ADDRESS_MASK_REPLY);
  505|       |
  506|    344|		icmp_address_mask_reply* header = getAddressMaskReplyData();
  507|    344|		header->code = 0;
  508|    344|		header->id = htobe16(id);
  509|    344|		header->sequence = htobe16(sequence);
  510|    344|		header->addressMask = htobe32(mask.toInt());
  511|       |
  512|    344|		return header;
  513|    344|	}
_ZN4pcpp9IcmpLayer16getInfoReplyDataEv:
  542|  2.26k|	{
  543|  2.26k|		if (!isMessageOfType(ICMP_INFO_REPLY))
  ------------------
  |  Branch (543:7): [True: 0, False: 2.26k]
  ------------------
  544|      0|			return nullptr;
  545|       |
  546|  2.26k|		return reinterpret_cast<icmp_info_reply*>(m_Data);
  547|  2.26k|	}
_ZN4pcpp9IcmpLayer16setInfoReplyDataEtt:
  550|  1.13k|	{
  551|  1.13k|		if (!cleanIcmpLayer())
  ------------------
  |  Branch (551:7): [True: 0, False: 1.13k]
  ------------------
  552|      0|			return nullptr;
  553|       |
  554|  1.13k|		if (!this->extendLayer(m_DataLen, sizeof(icmp_info_reply) - sizeof(icmphdr)))
  ------------------
  |  Branch (554:7): [True: 0, False: 1.13k]
  ------------------
  555|      0|			return nullptr;
  556|       |
  557|  1.13k|		getIcmpHeader()->type = static_cast<uint8_t>(ICMP_INFO_REPLY);
  558|       |
  559|  1.13k|		icmp_info_reply* header = getInfoReplyData();
  560|  1.13k|		header->code = 0;
  561|  1.13k|		header->id = htobe16(id);
  562|  1.13k|		header->sequence = htobe16(sequence);
  563|       |
  564|  1.13k|		return header;
  565|  1.13k|	}
_ZN4pcpp9IcmpLayer14parseNextLayerEv:
  568|  20.9k|	{
  569|  20.9k|		size_t headerLen = getHeaderLen();
  570|       |
  571|  20.9k|		auto payloadPtr = m_Data + headerLen;
  572|  20.9k|		auto payloadLen = m_DataLen - headerLen;
  573|       |
  574|  20.9k|		switch (getMessageType())
  575|  20.9k|		{
  576|  2.44k|		case ICMP_DEST_UNREACHABLE:
  ------------------
  |  Branch (576:3): [True: 2.44k, False: 18.4k]
  ------------------
  577|  2.71k|		case ICMP_SOURCE_QUENCH:
  ------------------
  |  Branch (577:3): [True: 272, False: 20.6k]
  ------------------
  578|  3.38k|		case ICMP_TIME_EXCEEDED:
  ------------------
  |  Branch (578:3): [True: 667, False: 20.2k]
  ------------------
  579|  4.33k|		case ICMP_REDIRECT:
  ------------------
  |  Branch (579:3): [True: 948, False: 19.9k]
  ------------------
  580|  4.71k|		case ICMP_PARAM_PROBLEM:
  ------------------
  |  Branch (580:3): [True: 386, False: 20.5k]
  ------------------
  581|  4.71k|		{
  582|  4.71k|			tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payloadPtr, payloadLen);
  583|  4.71k|			break;
  584|  4.33k|		}
  585|  16.2k|		default:
  ------------------
  |  Branch (585:3): [True: 16.2k, False: 4.71k]
  ------------------
  586|  16.2k|			if (m_DataLen > headerLen)
  ------------------
  |  Branch (586:8): [True: 8.90k, False: 7.30k]
  ------------------
  587|  8.90k|			{
  588|  8.90k|				constructNextLayer<PayloadLayer>(payloadPtr, payloadLen);
  589|  8.90k|			}
  590|  16.2k|			break;
  591|  20.9k|		}
  592|  20.9k|	}
_ZNK4pcpp9IcmpLayer12getHeaderLenEv:
  595|  34.8k|	{
  596|  34.8k|		IcmpMessageType type = getMessageType();
  597|  34.8k|		size_t routerAdvSize = 0;
  598|  34.8k|		switch (type)
  599|  34.8k|		{
  600|  4.87k|		case ICMP_ECHO_REQUEST:
  ------------------
  |  Branch (600:3): [True: 4.87k, False: 29.9k]
  ------------------
  601|  11.0k|		case ICMP_ECHO_REPLY:
  ------------------
  |  Branch (601:3): [True: 6.15k, False: 28.6k]
  ------------------
  602|  11.0k|			return m_DataLen;
  603|    341|		case ICMP_TIMESTAMP_REQUEST:
  ------------------
  |  Branch (603:3): [True: 341, False: 34.4k]
  ------------------
  604|  1.93k|		case ICMP_TIMESTAMP_REPLY:
  ------------------
  |  Branch (604:3): [True: 1.59k, False: 33.2k]
  ------------------
  605|  1.93k|			return sizeof(icmp_timestamp_request);
  606|      0|		case ICMP_ROUTER_SOL:
  ------------------
  |  Branch (606:3): [True: 0, False: 34.8k]
  ------------------
  607|      0|		case ICMP_INFO_REQUEST:
  ------------------
  |  Branch (607:3): [True: 0, False: 34.8k]
  ------------------
  608|  10.1k|		case ICMP_INFO_REPLY:
  ------------------
  |  Branch (608:3): [True: 10.1k, False: 24.6k]
  ------------------
  609|  10.1k|		case ICMP_UNSUPPORTED:
  ------------------
  |  Branch (609:3): [True: 0, False: 34.8k]
  ------------------
  610|  10.1k|			return sizeof(icmphdr);
  611|  3.41k|		case ICMP_ADDRESS_MASK_REPLY:
  ------------------
  |  Branch (611:3): [True: 3.41k, False: 31.3k]
  ------------------
  612|  3.72k|		case ICMP_ADDRESS_MASK_REQUEST:
  ------------------
  |  Branch (612:3): [True: 312, False: 34.4k]
  ------------------
  613|  3.72k|			return sizeof(icmp_address_mask_request);
  614|  3.92k|		case ICMP_DEST_UNREACHABLE:
  ------------------
  |  Branch (614:3): [True: 3.92k, False: 30.8k]
  ------------------
  615|  3.92k|			return sizeof(icmp_destination_unreachable);
  616|  1.65k|		case ICMP_REDIRECT:
  ------------------
  |  Branch (616:3): [True: 1.65k, False: 33.1k]
  ------------------
  617|  1.65k|			return sizeof(icmp_redirect);
  618|  1.09k|		case ICMP_TIME_EXCEEDED:
  ------------------
  |  Branch (618:3): [True: 1.09k, False: 33.7k]
  ------------------
  619|  1.56k|		case ICMP_SOURCE_QUENCH:
  ------------------
  |  Branch (619:3): [True: 476, False: 34.3k]
  ------------------
  620|  1.56k|			return sizeof(icmp_time_exceeded);
  621|    770|		case ICMP_PARAM_PROBLEM:
  ------------------
  |  Branch (621:3): [True: 770, False: 34.0k]
  ------------------
  622|    770|			return sizeof(icmp_param_problem);
  623|     13|		case ICMP_ROUTER_ADV:
  ------------------
  |  Branch (623:3): [True: 13, False: 34.7k]
  ------------------
  624|       |			// clang-format off
  625|     13|			routerAdvSize = sizeof(icmp_router_advertisement_hdr) + (getRouterAdvertisementData()->header->advertisementCount * sizeof(icmp_router_address_structure));
  626|       |			// clang-format on
  627|     13|			if (routerAdvSize > m_DataLen)
  ------------------
  |  Branch (627:8): [True: 0, False: 13]
  ------------------
  628|      0|				return m_DataLen;
  629|     13|			return routerAdvSize;
  630|      0|		default:
  ------------------
  |  Branch (630:3): [True: 0, False: 34.8k]
  ------------------
  631|      0|			return sizeof(icmphdr);
  632|  34.8k|		}
  633|  34.8k|	}
_ZN4pcpp9IcmpLayer22computeCalculateFieldsEv:
  636|  3.84k|	{
  637|       |		// calculate checksum
  638|  3.84k|		getIcmpHeader()->checksum = 0;
  639|       |
  640|  3.84k|		size_t icmpLen = 0;
  641|  3.84k|		Layer* curLayer = this;
  642|  11.4k|		while (curLayer != nullptr)
  ------------------
  |  Branch (642:10): [True: 7.55k, False: 3.84k]
  ------------------
  643|  7.55k|		{
  644|  7.55k|			icmpLen += curLayer->getHeaderLen();
  645|  7.55k|			curLayer = curLayer->getNextLayer();
  646|  7.55k|		}
  647|       |
  648|  3.84k|		ScalarBuffer<uint16_t> buffer;
  649|  3.84k|		buffer.buffer = reinterpret_cast<uint16_t*>(getIcmpHeader());
  650|  3.84k|		buffer.len = icmpLen;
  651|  3.84k|		size_t checksum = computeChecksum(&buffer, 1);
  652|       |
  653|       |		getIcmpHeader()->checksum = htobe16(checksum);
  654|  3.84k|	}
_ZNK4pcpp9IcmpLayer8toStringEv:
  657|  7.69k|	{
  658|  7.69k|		std::string messageTypeAsString;
  659|  7.69k|		IcmpMessageType type = getMessageType();
  660|  7.69k|		switch (type)
  661|  7.69k|		{
  662|  1.46k|		case ICMP_ECHO_REPLY:
  ------------------
  |  Branch (662:3): [True: 1.46k, False: 6.22k]
  ------------------
  663|  1.46k|			messageTypeAsString = "Echo (ping) reply";
  664|  1.46k|			break;
  665|    718|		case ICMP_DEST_UNREACHABLE:
  ------------------
  |  Branch (665:3): [True: 718, False: 6.97k]
  ------------------
  666|    718|			messageTypeAsString = "Destination unreachable";
  667|    718|			break;
  668|    136|		case ICMP_SOURCE_QUENCH:
  ------------------
  |  Branch (668:3): [True: 136, False: 7.56k]
  ------------------
  669|    136|			messageTypeAsString = "Source quench (flow control)";
  670|    136|			break;
  671|    474|		case ICMP_REDIRECT:
  ------------------
  |  Branch (671:3): [True: 474, False: 7.22k]
  ------------------
  672|    474|			messageTypeAsString = "Redirect";
  673|    474|			break;
  674|  1.00k|		case ICMP_ECHO_REQUEST:
  ------------------
  |  Branch (674:3): [True: 1.00k, False: 6.69k]
  ------------------
  675|  1.00k|			messageTypeAsString = "Echo (ping) request";
  676|  1.00k|			break;
  677|      2|		case ICMP_ROUTER_ADV:
  ------------------
  |  Branch (677:3): [True: 2, False: 7.69k]
  ------------------
  678|      2|			messageTypeAsString = "Router advertisement";
  679|      2|			break;
  680|      0|		case ICMP_ROUTER_SOL:
  ------------------
  |  Branch (680:3): [True: 0, False: 7.69k]
  ------------------
  681|      0|			messageTypeAsString = "Router solicitation";
  682|      0|			break;
  683|    212|		case ICMP_TIME_EXCEEDED:
  ------------------
  |  Branch (683:3): [True: 212, False: 7.48k]
  ------------------
  684|    212|			messageTypeAsString = "Time-to-live exceeded";
  685|    212|			break;
  686|    192|		case ICMP_PARAM_PROBLEM:
  ------------------
  |  Branch (686:3): [True: 192, False: 7.50k]
  ------------------
  687|    192|			messageTypeAsString = "Parameter problem: bad IP header";
  688|    192|			break;
  689|     62|		case ICMP_TIMESTAMP_REQUEST:
  ------------------
  |  Branch (689:3): [True: 62, False: 7.63k]
  ------------------
  690|     62|			messageTypeAsString = "Timestamp request";
  691|     62|			break;
  692|    398|		case ICMP_TIMESTAMP_REPLY:
  ------------------
  |  Branch (692:3): [True: 398, False: 7.29k]
  ------------------
  693|    398|			messageTypeAsString = "Timestamp reply";
  694|    398|			break;
  695|      0|		case ICMP_INFO_REQUEST:
  ------------------
  |  Branch (695:3): [True: 0, False: 7.69k]
  ------------------
  696|      0|			messageTypeAsString = "Information request";
  697|      0|			break;
  698|  2.26k|		case ICMP_INFO_REPLY:
  ------------------
  |  Branch (698:3): [True: 2.26k, False: 5.43k]
  ------------------
  699|  2.26k|			messageTypeAsString = "Information reply";
  700|  2.26k|			break;
  701|     78|		case ICMP_ADDRESS_MASK_REQUEST:
  ------------------
  |  Branch (701:3): [True: 78, False: 7.61k]
  ------------------
  702|     78|			messageTypeAsString = "Address mask request";
  703|     78|			break;
  704|    688|		case ICMP_ADDRESS_MASK_REPLY:
  ------------------
  |  Branch (704:3): [True: 688, False: 7.00k]
  ------------------
  705|    688|			messageTypeAsString = "Address mask reply";
  706|    688|			break;
  707|      0|		default:
  ------------------
  |  Branch (707:3): [True: 0, False: 7.69k]
  ------------------
  708|      0|			messageTypeAsString = "Unknown";
  709|      0|			break;
  710|  7.69k|		}
  711|       |
  712|  7.69k|		std::ostringstream typeStream;
  713|  7.69k|		typeStream << (int)getIcmpHeader()->type;
  714|       |
  715|  7.69k|		return "ICMP Layer, " + messageTypeAsString + " (type: " + typeStream.str() + ")";
  716|  7.69k|	}

_ZN4pcpp11IcmpV6Layer16parseIcmpV6LayerEPhmPNS_5LayerEPNS_6PacketE:
   18|  9.63k|	{
   19|  9.63k|		if (dataLen < sizeof(icmpv6hdr))
  ------------------
  |  Branch (19:7): [True: 458, False: 9.17k]
  ------------------
   20|    458|			return new PayloadLayer(data, dataLen, prevLayer, packet);
   21|       |
   22|  9.17k|		icmpv6hdr* hdr = (icmpv6hdr*)data;
   23|  9.17k|		ICMPv6MessageType messageType = static_cast<ICMPv6MessageType>(hdr->type);
   24|       |
   25|  9.17k|		switch (messageType)
   26|  9.17k|		{
   27|    624|		case ICMPv6MessageType::ICMPv6_ECHO_REQUEST:
  ------------------
  |  Branch (27:3): [True: 624, False: 8.55k]
  ------------------
   28|    628|		case ICMPv6MessageType::ICMPv6_ECHO_REPLY:
  ------------------
  |  Branch (28:3): [True: 4, False: 9.17k]
  ------------------
   29|    628|			return new ICMPv6EchoLayer(data, dataLen, prevLayer, packet);
   30|  2.80k|		case ICMPv6MessageType::ICMPv6_NEIGHBOR_SOLICITATION:
  ------------------
  |  Branch (30:3): [True: 2.80k, False: 6.37k]
  ------------------
   31|  2.80k|			if (!NDPNeighborSolicitationLayer::isDataValid(data, dataLen))
  ------------------
  |  Branch (31:8): [True: 0, False: 2.80k]
  ------------------
   32|      0|				return new IcmpV6Layer(data, dataLen, prevLayer, packet);
   33|  2.80k|			return new NDPNeighborSolicitationLayer(data, dataLen, prevLayer, packet);
   34|    520|		case ICMPv6MessageType::ICMPv6_NEIGHBOR_ADVERTISEMENT:
  ------------------
  |  Branch (34:3): [True: 520, False: 8.65k]
  ------------------
   35|    520|			if (!NDPNeighborAdvertisementLayer::isDataValid(data, dataLen))
  ------------------
  |  Branch (35:8): [True: 0, False: 520]
  ------------------
   36|      0|				return new IcmpV6Layer(data, dataLen, prevLayer, packet);
   37|    520|			return new NDPNeighborAdvertisementLayer(data, dataLen, prevLayer, packet);
   38|    581|		case ICMPv6MessageType::ICMPv6_UNKNOWN_MESSAGE:
  ------------------
  |  Branch (38:3): [True: 581, False: 8.59k]
  ------------------
   39|    581|			return new PayloadLayer(data, dataLen, prevLayer, packet);
   40|  4.64k|		default:
  ------------------
  |  Branch (40:3): [True: 4.64k, False: 4.52k]
  ------------------
   41|  4.64k|			return new IcmpV6Layer(data, dataLen, prevLayer, packet);
   42|  9.17k|		}
   43|  9.17k|	}
_ZNK4pcpp11IcmpV6Layer14getMessageTypeEv:
   59|  2.79k|	{
   60|  2.79k|		return static_cast<ICMPv6MessageType>(getIcmpv6Header()->type);
   61|  2.79k|	}
_ZN4pcpp11IcmpV6Layer22computeCalculateFieldsEv:
   74|  2.21k|	{
   75|  2.21k|		calculateChecksum();
   76|  2.21k|	}
_ZN4pcpp11IcmpV6Layer17calculateChecksumEv:
   79|  2.21k|	{
   80|       |		// Pseudo header of 40 bytes which is composed as follows(in order):
   81|       |		// - 16 bytes for the source address
   82|       |		// - 16 bytes for the destination address
   83|       |		// - 4 bytes big endian payload length(the same value as in the IPv6 header)
   84|       |		// - 3 bytes zero + 1 byte nextheader( 58 decimal) big endian
   85|       |
   86|  2.21k|		getIcmpv6Header()->checksum = 0;
   87|       |
   88|  2.21k|		if (m_PrevLayer != nullptr)
  ------------------
  |  Branch (88:7): [True: 2.21k, False: 0]
  ------------------
   89|  2.21k|		{
   90|  2.21k|			auto prevLayerAsIPv6 = static_cast<IPv6Layer*>(m_PrevLayer);
   91|       |
   92|  2.21k|			ScalarBuffer<uint16_t> vec[2];
   93|       |
   94|  2.21k|			vec[0].buffer = (uint16_t*)m_Data;
   95|  2.21k|			vec[0].len = m_DataLen;
   96|       |
   97|  2.21k|			const unsigned int pseudoHeaderLen = 40;
   98|  2.21k|			const unsigned int bigEndianLen = htobe32(m_DataLen);
   99|  2.21k|			const unsigned int bigEndianNextHeader = htobe32(PACKETPP_IPPROTO_ICMPV6);
  100|       |
  101|  2.21k|			uint16_t pseudoHeader[pseudoHeaderLen / 2];
  102|  2.21k|			prevLayerAsIPv6->getSrcIPv6Address().copyTo(reinterpret_cast<uint8_t*>(pseudoHeader));
  103|  2.21k|			prevLayerAsIPv6->getDstIPv6Address().copyTo(reinterpret_cast<uint8_t*>(pseudoHeader + 8));
  104|  2.21k|			memcpy(&pseudoHeader[16], &bigEndianLen, sizeof(uint32_t));
  105|  2.21k|			memcpy(&pseudoHeader[18], &bigEndianNextHeader, sizeof(uint32_t));
  106|  2.21k|			vec[1].buffer = pseudoHeader;
  107|  2.21k|			vec[1].len = pseudoHeaderLen;
  108|       |
  109|       |			// Calculate and write checksum
  110|       |			getIcmpv6Header()->checksum = htobe16(computeChecksum(vec, 2));
  111|  2.21k|		}
  112|  2.21k|	}
_ZNK4pcpp11IcmpV6Layer8toStringEv:
  115|  2.47k|	{
  116|  2.47k|		std::ostringstream typeStream;
  117|  2.47k|		typeStream << (int)getMessageType();
  118|  2.47k|		return "ICMPv6 Layer, Message type: " + typeStream.str();
  119|  2.47k|	}
_ZNK4pcpp15ICMPv6EchoLayer8toStringEv:
  164|    314|	{
  165|    314|		std::ostringstream typeStream;
  166|    314|		typeStream << (int)getMessageType();
  167|    314|		return "ICMPv6 Layer, Echo Request/Reply Message (type: " + typeStream.str() + ")";
  168|    314|	}

_ZNK4pcpp9IgmpLayer7getTypeEv:
   30|  4.10k|	{
   31|  4.10k|		uint8_t type = getIgmpHeader()->type;
   32|  4.10k|		if (type < (uint8_t)IgmpType_MembershipQuery ||
  ------------------
  |  Branch (32:7): [True: 0, False: 4.10k]
  ------------------
   33|  4.10k|		    (type > (uint8_t)IgmpType_LeaveGroup && type < (uint8_t)IgmpType_MulticastTracerouteResponse) ||
  ------------------
  |  Branch (33:8): [True: 1.19k, False: 2.91k]
  |  Branch (33:47): [True: 0, False: 1.19k]
  ------------------
   34|  4.10k|		    (type > (uint8_t)IgmpType_MulticastTraceroute && type < (uint8_t)IgmpType_MembershipReportV3) ||
  ------------------
  |  Branch (34:8): [True: 1.19k, False: 2.91k]
  |  Branch (34:56): [True: 0, False: 1.19k]
  ------------------
   35|  4.10k|		    (type > (uint8_t)IgmpType_MembershipReportV3 && type < (uint8_t)IgmpType_MulticastRouterAdvertisement) ||
  ------------------
  |  Branch (35:8): [True: 0, False: 4.10k]
  |  Branch (35:55): [True: 0, False: 0]
  ------------------
   36|  4.10k|		    type > IgmpType_MulticastRouterTermination)
  ------------------
  |  Branch (36:7): [True: 0, False: 4.10k]
  ------------------
   37|      0|		{
   38|      0|			return IgmpType_Unknown;
   39|      0|		}
   40|       |
   41|  4.10k|		return (IgmpType)type;
   42|  4.10k|	}
_ZN4pcpp9IgmpLayer18getIGMPVerFromDataEPhmRb:
   54|  9.80k|	{
   55|  9.80k|		isQuery = false;
   56|       |
   57|  9.80k|		if (dataLen < 8 || data == nullptr)
  ------------------
  |  Branch (57:7): [True: 0, False: 9.80k]
  |  Branch (57:22): [True: 0, False: 9.80k]
  ------------------
   58|      0|			return UnknownProtocol;
   59|       |
   60|  9.80k|		switch ((int)data[0])
   61|  9.80k|		{
   62|  2.72k|		case IgmpType_MembershipReportV2:
  ------------------
  |  Branch (62:3): [True: 2.72k, False: 7.07k]
  ------------------
   63|  3.24k|		case IgmpType_LeaveGroup:
  ------------------
  |  Branch (63:3): [True: 518, False: 9.28k]
  ------------------
   64|  3.24k|			return IGMPv2;
   65|  2.37k|		case IgmpType_MembershipReportV1:
  ------------------
  |  Branch (65:3): [True: 2.37k, False: 7.43k]
  ------------------
   66|  2.37k|			return IGMPv1;
   67|  2.40k|		case IgmpType_MembershipReportV3:
  ------------------
  |  Branch (67:3): [True: 2.40k, False: 7.39k]
  ------------------
   68|  2.40k|			return IGMPv3;
   69|  1.58k|		case IgmpType_MembershipQuery:
  ------------------
  |  Branch (69:3): [True: 1.58k, False: 8.21k]
  ------------------
   70|  1.58k|		{
   71|  1.58k|			isQuery = true;
   72|       |
   73|  1.58k|			if (dataLen >= sizeof(igmpv3_query_header))
  ------------------
  |  Branch (73:8): [True: 0, False: 1.58k]
  ------------------
   74|      0|				return IGMPv3;
   75|       |
   76|  1.58k|			if (data[1] == 0)
  ------------------
  |  Branch (76:8): [True: 455, False: 1.13k]
  ------------------
   77|    455|				return IGMPv1;
   78|  1.13k|			else
   79|  1.13k|				return IGMPv2;
   80|  1.58k|		}
   81|    195|		default:
  ------------------
  |  Branch (81:3): [True: 195, False: 9.60k]
  ------------------
   82|    195|			return UnknownProtocol;
   83|  9.80k|		}
   84|  9.80k|	}
_ZN4pcpp9IgmpLayer17calculateChecksumEv:
   87|  2.05k|	{
   88|  2.05k|		ScalarBuffer<uint16_t> buffer;
   89|  2.05k|		buffer.buffer = reinterpret_cast<uint16_t*>(getIgmpHeader());
   90|  2.05k|		buffer.len = getHeaderLen();
   91|  2.05k|		return computeChecksum(&buffer, 1);
   92|  2.05k|	}
_ZNK4pcpp9IgmpLayer8toStringEv:
  111|  4.10k|	{
  112|  4.10k|		std::string igmpVer = "";
  113|  4.10k|		switch (getProtocol())
  114|  4.10k|		{
  115|  1.13k|		case IGMPv1:
  ------------------
  |  Branch (115:3): [True: 1.13k, False: 2.96k]
  ------------------
  116|  1.13k|			igmpVer = "1";
  117|  1.13k|			break;
  118|  1.77k|		case IGMPv2:
  ------------------
  |  Branch (118:3): [True: 1.77k, False: 2.33k]
  ------------------
  119|  1.77k|			igmpVer = "2";
  120|  1.77k|			break;
  121|  1.19k|		default:
  ------------------
  |  Branch (121:3): [True: 1.19k, False: 2.91k]
  ------------------
  122|  1.19k|			igmpVer = "3";
  123|  4.10k|		}
  124|       |
  125|  4.10k|		std::string msgType;
  126|       |
  127|  4.10k|		switch (getType())
  128|  4.10k|		{
  129|    634|		case IgmpType_MembershipQuery:
  ------------------
  |  Branch (129:3): [True: 634, False: 3.47k]
  ------------------
  130|    634|			msgType = "Membership Query";
  131|    634|			break;
  132|    956|		case IgmpType_MembershipReportV1:
  ------------------
  |  Branch (132:3): [True: 956, False: 3.15k]
  ------------------
  133|    956|			msgType = "Membership Report";
  134|    956|			break;
  135|      0|		case IgmpType_DVMRP:
  ------------------
  |  Branch (135:3): [True: 0, False: 4.10k]
  ------------------
  136|      0|			msgType = "DVMRP";
  137|      0|			break;
  138|      0|		case IgmpType_P1Mv1:
  ------------------
  |  Branch (138:3): [True: 0, False: 4.10k]
  ------------------
  139|      0|			msgType = "PIMv1";
  140|      0|			break;
  141|      0|		case IgmpType_CiscoTrace:
  ------------------
  |  Branch (141:3): [True: 0, False: 4.10k]
  ------------------
  142|      0|			msgType = "Cisco Trace";
  143|      0|			break;
  144|  1.11k|		case IgmpType_MembershipReportV2:
  ------------------
  |  Branch (144:3): [True: 1.11k, False: 2.99k]
  ------------------
  145|  1.11k|			msgType = "Membership Report";
  146|  1.11k|			break;
  147|    210|		case IgmpType_LeaveGroup:
  ------------------
  |  Branch (147:3): [True: 210, False: 3.89k]
  ------------------
  148|    210|			msgType = "Leave Group";
  149|    210|			break;
  150|      0|		case IgmpType_MulticastTracerouteResponse:
  ------------------
  |  Branch (150:3): [True: 0, False: 4.10k]
  ------------------
  151|      0|			msgType = "Multicast Traceroute Response";
  152|      0|			break;
  153|      0|		case IgmpType_MulticastTraceroute:
  ------------------
  |  Branch (153:3): [True: 0, False: 4.10k]
  ------------------
  154|      0|			msgType = "Multicast Traceroute";
  155|      0|			break;
  156|  1.19k|		case IgmpType_MembershipReportV3:
  ------------------
  |  Branch (156:3): [True: 1.19k, False: 2.91k]
  ------------------
  157|  1.19k|			msgType = "Membership Report";
  158|  1.19k|			break;
  159|      0|		case IgmpType_MulticastRouterAdvertisement:
  ------------------
  |  Branch (159:3): [True: 0, False: 4.10k]
  ------------------
  160|      0|			msgType = "Multicast Router Advertisement";
  161|      0|			break;
  162|      0|		case IgmpType_MulticastRouterSolicitation:
  ------------------
  |  Branch (162:3): [True: 0, False: 4.10k]
  ------------------
  163|      0|			msgType = "Multicast Router Solicitation";
  164|      0|			break;
  165|      0|		case IgmpType_MulticastRouterTermination:
  ------------------
  |  Branch (165:3): [True: 0, False: 4.10k]
  ------------------
  166|      0|			msgType = "Multicast Router Termination";
  167|      0|			break;
  168|      0|		default:
  ------------------
  |  Branch (168:3): [True: 0, False: 4.10k]
  ------------------
  169|      0|			msgType = "Unknown";
  170|      0|			break;
  171|  4.10k|		}
  172|       |
  173|  4.10k|		std::string result = "IGMPv" + igmpVer + " Layer, " + msgType + " message";
  174|  4.10k|		return result;
  175|  4.10k|	}
_ZN4pcpp11IgmpV1Layer22computeCalculateFieldsEv:
  180|    569|	{
  181|    569|		igmp_header* hdr = getIgmpHeader();
  182|    569|		hdr->checksum = 0;
  183|       |		hdr->checksum = htobe16(calculateChecksum());
  184|    569|		hdr->maxResponseTime = 0;
  185|    569|	}
_ZN4pcpp11IgmpV2Layer22computeCalculateFieldsEv:
  190|    887|	{
  191|    887|		igmp_header* hdr = getIgmpHeader();
  192|    887|		hdr->checksum = 0;
  193|       |		hdr->checksum = htobe16(calculateChecksum());
  194|    887|	}
_ZN4pcpp17IgmpV3ReportLayer22computeCalculateFieldsEv:
  364|    597|	{
  365|    597|		igmpv3_report_header* hdr = getReportHeader();
  366|    597|		hdr->checksum = 0;
  367|       |		hdr->checksum = htobe16(calculateChecksum());
  368|    597|	}

_ZN4pcpp8LLCLayer14parseNextLayerEv:
   25|  10.4k|	{
   26|  10.4k|		if (m_DataLen <= sizeof(llc_header))
  ------------------
  |  Branch (26:7): [True: 0, False: 10.4k]
  ------------------
   27|      0|			return;
   28|       |
   29|  10.4k|		llc_header* hdr = getLlcHeader();
   30|  10.4k|		uint8_t* payload = m_Data + sizeof(llc_header);
   31|  10.4k|		size_t payloadLen = m_DataLen - sizeof(llc_header);
   32|       |
   33|  10.4k|		if (hdr->dsap == 0x42 && hdr->ssap == 0x42 && StpLayer::isDataValid(payload, payloadLen))
  ------------------
  |  Branch (33:7): [True: 4.77k, False: 5.66k]
  |  Branch (33:28): [True: 4.76k, False: 8]
  |  Branch (33:49): [True: 4.76k, False: 0]
  ------------------
   34|  4.76k|		{
   35|  4.76k|			constructNextLayerFromFactory(StpLayer::parseStpLayer, payload, payloadLen);
   36|  4.76k|		}
   37|       |
   38|  10.4k|		if (!hasNextLayer())
  ------------------
  |  Branch (38:7): [True: 5.80k, False: 4.63k]
  ------------------
   39|  5.80k|		{
   40|  5.80k|			constructNextLayer<PayloadLayer>(payload, payloadLen);
   41|  5.80k|		}
   42|  10.4k|	}
_ZNK4pcpp8LLCLayer8toStringEv:
   45|  4.08k|	{
   46|  4.08k|		return "Logical Link Control";
   47|  4.08k|	}
_ZN4pcpp8LLCLayer11isDataValidEPKhm:
   50|  11.7k|	{
   51|  11.7k|		return dataLen >= sizeof(llc_header) && !(data[0] == 0xFF && data[1] == 0xFF);
  ------------------
  |  Branch (51:10): [True: 10.5k, False: 1.16k]
  |  Branch (51:45): [True: 3.28k, False: 7.30k]
  |  Branch (51:64): [True: 153, False: 3.12k]
  ------------------
   52|  11.7k|	}

_ZN4pcpp5LayerD2Ev:
   13|  6.75M|	{
   14|  6.75M|		if (!isAllocatedToPacket())
  ------------------
  |  Branch (14:7): [True: 103k, False: 6.64M]
  ------------------
   15|   103k|			delete[] m_Data;
   16|  6.75M|	}
_ZN4pcpp5LayerC2ERKS0_:
   18|   103k|	Layer::Layer(const Layer& other) : m_Protocol(other.m_Protocol), m_NextLayer(nullptr), m_PrevLayer(nullptr)
   19|   103k|	{
   20|   103k|		m_DataLen = other.getHeaderLen();
   21|   103k|		m_Data = new uint8_t[other.m_DataLen];
   22|   103k|		memcpy(m_Data, other.m_Data, other.m_DataLen);
   23|   103k|	}
_ZN4pcpp5LayeraSERKS0_:
   26|  8.26k|	{
   27|  8.26k|		if (this == &other)
  ------------------
  |  Branch (27:7): [True: 0, False: 8.26k]
  ------------------
   28|      0|			return *this;
   29|       |
   30|       |		// Should this really always delete m_Data? What if the layer is attached to a packet?
   31|  8.26k|		if (m_Data != nullptr)
  ------------------
  |  Branch (31:7): [True: 8.26k, False: 0]
  ------------------
   32|  8.26k|			delete[] m_Data;
   33|       |
   34|       |		// Reset allocation info as the layer is considered copied and not attached to any packet.
   35|  8.26k|		m_AllocationInfo = internal::LayerAllocationInfo{};
   36|       |
   37|  8.26k|		m_DataLen = other.getHeaderLen();
   38|  8.26k|		m_Protocol = other.m_Protocol;
   39|  8.26k|		m_NextLayer = nullptr;
   40|  8.26k|		m_PrevLayer = nullptr;
   41|  8.26k|		m_Data = new uint8_t[other.m_DataLen];
   42|  8.26k|		memcpy(m_Data, other.m_Data, other.m_DataLen);
   43|       |
   44|  8.26k|		return *this;
   45|  8.26k|	}
_ZNK4pcpp5Layer24isMemberOfProtocolFamilyEj:
   48|  24.4M|	{
   49|  24.4M|		return m_Protocol != UnknownProtocol && internal::protoFamilyContainsProtocol(protocolTypeFamily, m_Protocol);
  ------------------
  |  Branch (49:10): [True: 24.4M, False: 0]
  |  Branch (49:43): [True: 74.8k, False: 24.3M]
  ------------------
   50|  24.4M|	}
_ZN4pcpp5Layer11extendLayerEim:
  101|   150k|	{
  102|   150k|		if (m_Data == nullptr)
  ------------------
  |  Branch (102:7): [True: 0, False: 150k]
  ------------------
  103|      0|		{
  104|      0|			PCPP_LOG_ERROR("Layer's data is nullptr");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  105|      0|			return false;
  106|      0|		}
  107|       |
  108|   150k|		if (getAttachedPacket() == nullptr)
  ------------------
  |  Branch (108:7): [True: 77.7k, False: 72.4k]
  ------------------
  109|  77.7k|		{
  110|  77.7k|			if (static_cast<size_t>(offsetInLayer) > m_DataLen)
  ------------------
  |  Branch (110:8): [True: 1.58k, False: 76.1k]
  ------------------
  111|  1.58k|			{
  112|  1.58k|				PCPP_LOG_ERROR("Requested offset is larger than data length");
  ------------------
  |  |  445|  1.58k|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|  1.58k|	do                                                                                                                 \
  |  |  |  |  415|  1.58k|	{                                                                                                                  \
  |  |  |  |  416|  1.58k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  1.58k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.58k|#define LOG_MODULE PacketLogModuleLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 1.58k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|  1.58k|		{                                                                                                              \
  |  |  |  |  419|  1.58k|			auto ctx =                                                                                                 \
  |  |  |  |  420|  1.58k|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.58k|#define LOG_MODULE PacketLogModuleLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|  1.58k|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|  1.58k|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|  1.58k|		}                                                                                                              \
  |  |  |  |  424|  1.58k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 1.58k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  113|  1.58k|				return false;
  114|  1.58k|			}
  115|  76.1k|			uint8_t* newData = new uint8_t[m_DataLen + numOfBytesToExtend];
  116|  76.1k|			memcpy(newData, m_Data, offsetInLayer);
  117|  76.1k|			memcpy(newData + offsetInLayer + numOfBytesToExtend, m_Data + offsetInLayer, m_DataLen - offsetInLayer);
  118|  76.1k|			delete[] m_Data;
  119|  76.1k|			m_Data = newData;
  120|  76.1k|			m_DataLen += numOfBytesToExtend;
  121|  76.1k|			return true;
  122|  77.7k|		}
  123|       |
  124|  72.4k|		return getAttachedPacket()->extendLayer(this, offsetInLayer, numOfBytesToExtend);
  125|   150k|	}
_ZN4pcpp5Layer12shortenLayerEim:
  128|  54.4k|	{
  129|  54.4k|		if (m_Data == nullptr)
  ------------------
  |  Branch (129:7): [True: 0, False: 54.4k]
  ------------------
  130|      0|		{
  131|      0|			PCPP_LOG_ERROR("Layer's data is nullptr");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  132|      0|			return false;
  133|      0|		}
  134|       |
  135|  54.4k|		if (static_cast<size_t>(offsetInLayer) + numOfBytesToShorten > m_DataLen)
  ------------------
  |  Branch (135:7): [True: 381, False: 54.0k]
  ------------------
  136|    381|		{
  137|    381|			PCPP_LOG_ERROR("Requested number of bytes to shorten is larger than data length");
  ------------------
  |  |  445|    381|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    381|	do                                                                                                                 \
  |  |  |  |  415|    381|	{                                                                                                                  \
  |  |  |  |  416|    381|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    381|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    381|#define LOG_MODULE PacketLogModuleLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 381, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    381|		{                                                                                                              \
  |  |  |  |  419|    381|			auto ctx =                                                                                                 \
  |  |  |  |  420|    381|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    381|#define LOG_MODULE PacketLogModuleLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    381|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    381|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    381|		}                                                                                                              \
  |  |  |  |  424|    381|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 381]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  138|    381|			return false;
  139|    381|		}
  140|       |
  141|  54.0k|		if (getAttachedPacket() == nullptr)
  ------------------
  |  Branch (141:7): [True: 1.85k, False: 52.1k]
  ------------------
  142|  1.85k|		{
  143|  1.85k|			if (static_cast<size_t>(offsetInLayer) >= m_DataLen)
  ------------------
  |  Branch (143:8): [True: 0, False: 1.85k]
  ------------------
  144|      0|			{
  145|      0|				PCPP_LOG_ERROR("Requested offset is larger than data length");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  146|      0|				return false;
  147|      0|			}
  148|  1.85k|			uint8_t* newData = new uint8_t[m_DataLen - numOfBytesToShorten];
  149|  1.85k|			memcpy(newData, m_Data, offsetInLayer);
  150|  1.85k|			memcpy(newData + offsetInLayer, m_Data + offsetInLayer + numOfBytesToShorten,
  151|  1.85k|			       m_DataLen - offsetInLayer - numOfBytesToShorten);
  152|  1.85k|			delete[] m_Data;
  153|  1.85k|			m_Data = newData;
  154|  1.85k|			m_DataLen -= numOfBytesToShorten;
  155|  1.85k|			return true;
  156|  1.85k|		}
  157|       |
  158|  52.1k|		return getAttachedPacket()->shortenLayer(this, offsetInLayer, numOfBytesToShorten);
  159|  54.0k|	}

_ZNK4pcpp17LdapOperationType8toStringEv:
   64|     42|	{
   65|     42|		return LdapOperationTypeToString.at(m_Value);
   66|     42|	}
_ZN4pcpp17LdapOperationType13fromUintValueEh:
   69|    155|	{
   70|    155|		auto result = UintToLdapOperationType.find(value);
   71|    155|		if (result != UintToLdapOperationType.end())
  ------------------
  |  Branch (71:7): [True: 155, False: 0]
  ------------------
   72|    155|		{
   73|    155|			return result->second;
   74|    155|		}
   75|       |
   76|      0|		return LdapOperationType::Unknown;
   77|    155|	}
_ZNK4pcpp14LdapResultCode8toStringEv:
  172|     40|	{
  173|     40|		return LdapResultCodeToString.at(m_Value);
  174|     40|	}
_ZN4pcpp14LdapResultCode13fromUintValueEh:
  177|     40|	{
  178|     40|		auto result = UintToLdapResultCode.find(value);
  179|     40|		if (result != UintToLdapResultCode.end())
  ------------------
  |  Branch (179:7): [True: 40, False: 0]
  ------------------
  180|     40|		{
  181|     40|			return result->second;
  182|     40|		}
  183|       |
  184|      0|		return LdapResultCode::Unknown;
  185|     40|	}
_ZN4pcpp9LdapLayerC2ENSt3__110unique_ptrINS_10Asn1RecordENS1_14default_deleteIS3_EEEEPhmPNS_5LayerEPNS_6PacketE:
  199|    113|	    : Layer(data, dataLen, prevLayer, packet, LDAP)
  200|    113|	{
  201|    113|		m_Asn1Record = std::move(asn1Record);
  202|    113|	}
_ZNK4pcpp9LdapLayer8toStringEv:
  258|     42|	{
  259|     42|		auto extendedInfo = getExtendedInfoString();
  260|     42|		return "LDAP Layer, " + getLdapOperationType().toString() + (extendedInfo.empty() ? "" : ", " + extendedInfo);
  ------------------
  |  Branch (260:64): [True: 0, False: 42]
  ------------------
  261|     42|	}
_ZN4pcpp9LdapLayer16parseLdapMessageEPhmPNS_5LayerEPNS_6PacketE:
  264|  2.04k|	{
  265|  2.04k|		try
  266|  2.04k|		{
  267|  2.04k|			auto asn1Record = Asn1Record::decode(data, dataLen, true);
  268|  2.04k|			auto operationType = LdapOperationType::fromUintValue(
  269|  2.04k|			    asn1Record->castAs<Asn1SequenceRecord>()->getSubRecords().at(operationTypeIndex)->getTagType());
  270|  2.04k|			switch (operationType)
  271|  2.04k|			{
  272|      5|			case LdapOperationType::BindRequest:
  ------------------
  |  Branch (272:4): [True: 5, False: 2.04k]
  ------------------
  273|      5|				return new LdapBindRequestLayer(std::move(asn1Record), data, dataLen, prevLayer, packet);
  274|     73|			case LdapOperationType::BindResponse:
  ------------------
  |  Branch (274:4): [True: 73, False: 1.97k]
  ------------------
  275|     73|				return new LdapBindResponseLayer(std::move(asn1Record), data, dataLen, prevLayer, packet);
  276|      0|			case LdapOperationType::UnbindRequest:
  ------------------
  |  Branch (276:4): [True: 0, False: 2.04k]
  ------------------
  277|      0|				return new LdapUnbindRequestLayer(std::move(asn1Record), data, dataLen, prevLayer, packet);
  278|      0|			case LdapOperationType::SearchRequest:
  ------------------
  |  Branch (278:4): [True: 0, False: 2.04k]
  ------------------
  279|      0|				return new LdapSearchRequestLayer(std::move(asn1Record), data, dataLen, prevLayer, packet);
  280|      0|			case LdapOperationType::SearchResultEntry:
  ------------------
  |  Branch (280:4): [True: 0, False: 2.04k]
  ------------------
  281|      0|				return new LdapSearchResultEntryLayer(std::move(asn1Record), data, dataLen, prevLayer, packet);
  282|      5|			case LdapOperationType::SearchResultDone:
  ------------------
  |  Branch (282:4): [True: 5, False: 2.04k]
  ------------------
  283|      5|				return new LdapSearchResultDoneLayer(std::move(asn1Record), data, dataLen, prevLayer, packet);
  284|      5|			case LdapOperationType::ModifyResponse:
  ------------------
  |  Branch (284:4): [True: 5, False: 2.04k]
  ------------------
  285|      5|				return new LdapModifyResponseLayer(std::move(asn1Record), data, dataLen, prevLayer, packet);
  286|      0|			case LdapOperationType::AddResponse:
  ------------------
  |  Branch (286:4): [True: 0, False: 2.04k]
  ------------------
  287|      0|				return new LdapAddResponseLayer(std::move(asn1Record), data, dataLen, prevLayer, packet);
  288|      5|			case LdapOperationType::DeleteResponse:
  ------------------
  |  Branch (288:4): [True: 5, False: 2.04k]
  ------------------
  289|      5|				return new LdapDeleteResponseLayer(std::move(asn1Record), data, dataLen, prevLayer, packet);
  290|     15|			case LdapOperationType::ModifyDNResponse:
  ------------------
  |  Branch (290:4): [True: 15, False: 2.03k]
  ------------------
  291|     15|				return new LdapModifyDNResponseLayer(std::move(asn1Record), data, dataLen, prevLayer, packet);
  292|      5|			case LdapOperationType::CompareResponse:
  ------------------
  |  Branch (292:4): [True: 5, False: 2.04k]
  ------------------
  293|      5|				return new LdapCompareResponseLayer(std::move(asn1Record), data, dataLen, prevLayer, packet);
  294|      0|			case LdapOperationType::Unknown:
  ------------------
  |  Branch (294:4): [True: 0, False: 2.04k]
  ------------------
  295|      0|				return nullptr;
  296|      0|			default:
  ------------------
  |  Branch (296:4): [True: 0, False: 2.04k]
  ------------------
  297|      0|				return new LdapLayer(std::move(asn1Record), data, dataLen, prevLayer, packet);
  298|  2.04k|			}
  299|  2.04k|		}
  300|  2.04k|		catch (...)
  301|  2.04k|		{
  302|  1.93k|			return nullptr;
  303|  1.93k|		}
  304|  2.04k|	}
_ZNK4pcpp9LdapLayer17getRootAsn1RecordEv:
  307|     86|	{
  308|     86|		return m_Asn1Record->castAs<Asn1SequenceRecord>();
  309|     86|	}
_ZNK4pcpp9LdapLayer26getLdapOperationAsn1RecordEv:
  312|     86|	{
  313|     86|		return getRootAsn1Record()->getSubRecords().at(operationTypeIndex)->castAs<Asn1ConstructedRecord>();
  314|     86|	}
_ZNK4pcpp9LdapLayer20getLdapOperationTypeEv:
  352|     42|	{
  353|     42|		uint8_t tagType;
  354|     42|		try
  355|     42|		{
  356|     42|			tagType = getLdapOperationAsn1Record()->getTagType();
  357|     42|		}
  358|     42|		catch (...)
  359|     42|		{
  360|      0|			tagType = LdapOperationType::Unknown;
  361|      0|		}
  362|       |
  363|     42|		return LdapOperationType::fromUintValue(tagType);
  364|     42|	}
_ZN4pcpp9LdapLayer14parseNextLayerEv:
  367|    113|	{
  368|    113|		size_t headerLen = getHeaderLen();
  369|    113|		if (m_DataLen <= headerLen || headerLen == 0)
  ------------------
  |  Branch (369:7): [True: 68, False: 45]
  |  Branch (369:33): [True: 0, False: 45]
  ------------------
  370|     68|			return;
  371|       |
  372|     45|		uint8_t* payload = m_Data + headerLen;
  373|     45|		size_t payloadLen = m_DataLen - headerLen;
  374|       |
  375|     45|		constructNextLayerFromFactory(LdapLayer::parseLdapMessage, payload, payloadLen);
  376|     45|	}
_ZNK4pcpp17LdapResponseLayer13getResultCodeEv:
  427|     40|	{
  428|     40|		return LdapResultCode::fromUintValue(getLdapOperationAsn1Record()
  429|     40|		                                         ->getSubRecords()
  430|     40|		                                         .at(resultCodeIndex)
  431|     40|		                                         ->castAs<Asn1EnumeratedRecord>()
  432|     40|		                                         ->getIntValue<uint8_t>());
  433|     40|	}
_ZNK4pcpp17LdapResponseLayer21getExtendedInfoStringEv:
  477|     40|	{
  478|     40|		return getResultCode().toString();
  479|     40|	}
_ZNK4pcpp20LdapBindRequestLayer21getAuthenticationTypeEv:
  548|      2|	{
  549|      2|		if (getLdapOperationAsn1Record()->getSubRecords().size() <= credentialIndex)
  ------------------
  |  Branch (549:7): [True: 0, False: 2]
  ------------------
  550|      0|		{
  551|      0|			return LdapBindRequestLayer::AuthenticationType::NotApplicable;
  552|      0|		}
  553|       |
  554|      2|		auto authType = getLdapOperationAsn1Record()->getSubRecords().at(credentialIndex)->getTagType();
  555|      2|		switch (authType)
  556|      2|		{
  557|      0|		case 0:
  ------------------
  |  Branch (557:3): [True: 0, False: 2]
  ------------------
  558|      0|			return LdapBindRequestLayer::AuthenticationType::Simple;
  559|      2|		case 3:
  ------------------
  |  Branch (559:3): [True: 2, False: 0]
  ------------------
  560|      2|			return LdapBindRequestLayer::AuthenticationType::Sasl;
  561|      0|		default:
  ------------------
  |  Branch (561:3): [True: 0, False: 2]
  ------------------
  562|      0|			return LdapBindRequestLayer::AuthenticationType::NotApplicable;
  563|      2|		}
  564|      2|	}
_ZNK4pcpp20LdapBindRequestLayer21getExtendedInfoStringEv:
  605|      2|	{
  606|      2|		switch (getAuthenticationType())
  607|      2|		{
  608|      0|		case AuthenticationType::Simple:
  ------------------
  |  Branch (608:3): [True: 0, False: 2]
  ------------------
  609|      0|			return "simple";
  610|      2|		case AuthenticationType::Sasl:
  ------------------
  |  Branch (610:3): [True: 2, False: 0]
  ------------------
  611|      2|			return "sasl";
  612|      0|		default:
  ------------------
  |  Branch (612:3): [True: 0, False: 2]
  ------------------
  613|      0|			return "Unknown";
  614|      2|		}
  615|      2|	}

_ZNK4pcpp11ModbusLayer15getModbusHeaderEv:
   27|  3.29k|	{
   28|  3.29k|		return reinterpret_cast<modbus_header*>(m_Data);
   29|  3.29k|	}
_ZNK4pcpp11ModbusLayer16getTransactionIdEv:
   32|    658|	{
   33|       |		return be16toh(getModbusHeader()->transactionId);
   34|    658|	}
_ZNK4pcpp11ModbusLayer13getProtocolIdEv:
   37|    658|	{
   38|       |		return be16toh(getModbusHeader()->protocolId);
   39|    658|	}
_ZNK4pcpp11ModbusLayer9getLengthEv:
   42|    658|	{
   43|       |		return be16toh(getModbusHeader()->length);
   44|    658|	}
_ZNK4pcpp11ModbusLayer9getUnitIdEv:
   47|    658|	{
   48|    658|		return getModbusHeader()->unitId;
   49|    658|	}
_ZNK4pcpp11ModbusLayer15getFunctionCodeEv:
   52|    658|	{
   53|    658|		switch (getModbusHeader()->functionCode)
   54|    658|		{
   55|     88|		case 1:
  ------------------
  |  Branch (55:3): [True: 88, False: 570]
  ------------------
   56|     88|			return ModbusFunctionCode::ReadCoils;
   57|      0|		case 2:
  ------------------
  |  Branch (57:3): [True: 0, False: 658]
  ------------------
   58|      0|			return ModbusFunctionCode::ReadDiscreteInputs;
   59|    292|		case 3:
  ------------------
  |  Branch (59:3): [True: 292, False: 366]
  ------------------
   60|    292|			return ModbusFunctionCode::ReadHoldingRegisters;
   61|      0|		case 4:
  ------------------
  |  Branch (61:3): [True: 0, False: 658]
  ------------------
   62|      0|			return ModbusFunctionCode::ReadInputRegisters;
   63|      0|		case 5:
  ------------------
  |  Branch (63:3): [True: 0, False: 658]
  ------------------
   64|      0|			return ModbusFunctionCode::WriteSingleCoil;
   65|     34|		case 6:
  ------------------
  |  Branch (65:3): [True: 34, False: 624]
  ------------------
   66|     34|			return ModbusFunctionCode::WriteSingleHoldingRegister;
   67|      0|		case 15:
  ------------------
  |  Branch (67:3): [True: 0, False: 658]
  ------------------
   68|      0|			return ModbusFunctionCode::WriteMultipleCoils;
   69|      0|		case 16:
  ------------------
  |  Branch (69:3): [True: 0, False: 658]
  ------------------
   70|      0|			return ModbusFunctionCode::WriteMultipleHoldingRegisters;
   71|      0|		case 17:
  ------------------
  |  Branch (71:3): [True: 0, False: 658]
  ------------------
   72|      0|			return ModbusFunctionCode::ReadSlaveId;
   73|    244|		default:
  ------------------
  |  Branch (73:3): [True: 244, False: 414]
  ------------------
   74|    244|			return ModbusFunctionCode::UnknownFunction;
   75|    658|		}
   76|    658|	}
_ZNK4pcpp11ModbusLayer8toStringEv:
   94|    658|	{
   95|    658|		return "Modbus Layer, Transaction ID: " + std::to_string(getTransactionId()) +
   96|    658|		       ", Protocol ID: " + std::to_string(getProtocolId()) + ", Length: " + std::to_string(getLength()) +
   97|    658|		       ", Unit ID: " + std::to_string(getUnitId()) +
   98|    658|		       ", Function Code: " + std::to_string(static_cast<uint8_t>(getFunctionCode()));
   99|    658|	}

_ZNK4pcpp9MplsLayer15isBottomOfStackEv:
   26|  3.11M|	{
   27|  3.11M|		return (getMplsHeader()->misc & 0x01);
   28|  3.11M|	}
_ZN4pcpp9MplsLayer16setBottomOfStackEb:
   31|  14.1k|	{
   32|  14.1k|		if (!val)
  ------------------
  |  Branch (32:7): [True: 13.9k, False: 243]
  ------------------
   33|  13.9k|			getMplsHeader()->misc &= 0xFE;
   34|    243|		else
   35|    243|			getMplsHeader()->misc |= 0x1;
   36|  14.1k|	}
_ZNK4pcpp9MplsLayer23getExperimentalUseValueEv:
   39|  28.3k|	{
   40|  28.3k|		return ((getMplsHeader()->misc & 0x0E) >> 1);
   41|  28.3k|	}
_ZNK4pcpp9MplsLayer12getMplsLabelEv:
   67|  28.3k|	{
   68|       |		return (htobe16(getMplsHeader()->hiLabel) << 4) | ((getMplsHeader()->misc & 0xF0) >> 4);
   69|  28.3k|	}
_ZN4pcpp9MplsLayer14parseNextLayerEv:
  102|  3.08M|	{
  103|  3.08M|		size_t headerLen = getHeaderLen();
  104|  3.08M|		if (m_DataLen < headerLen + 1)
  ------------------
  |  Branch (104:7): [True: 0, False: 3.08M]
  ------------------
  105|      0|			return;
  106|       |
  107|  3.08M|		uint8_t* payload = m_Data + sizeof(mpls_header);
  108|  3.08M|		size_t payloadLen = m_DataLen - sizeof(mpls_header);
  109|       |
  110|  3.08M|		if (!isBottomOfStack())
  ------------------
  |  Branch (110:7): [True: 3.06M, False: 15.4k]
  ------------------
  111|  3.06M|		{
  112|  3.06M|			tryConstructNextLayerWithFallback<MplsLayer, PayloadLayer>(payload, payloadLen);
  113|  3.06M|			return;
  114|  3.06M|		}
  115|       |
  116|  15.4k|		uint8_t nextNibble = (*((uint8_t*)(m_Data + headerLen)) & 0xF0) >> 4;
  117|  15.4k|		switch (nextNibble)
  118|  15.4k|		{
  119|  10.3k|		case 4:
  ------------------
  |  Branch (119:3): [True: 10.3k, False: 5.08k]
  ------------------
  120|  10.3k|			tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen);
  121|  10.3k|			break;
  122|  5.06k|		case 6:
  ------------------
  |  Branch (122:3): [True: 5.06k, False: 10.3k]
  ------------------
  123|  5.06k|			tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen);
  124|  5.06k|			break;
  125|     23|		default:
  ------------------
  |  Branch (125:3): [True: 23, False: 15.4k]
  ------------------
  126|     23|			constructNextLayer<PayloadLayer>(payload, payloadLen);
  127|  15.4k|		}
  128|  15.4k|	}
_ZN4pcpp9MplsLayer22computeCalculateFieldsEv:
  131|  14.1k|	{
  132|  14.1k|		Layer* nextLayer = getNextLayer();
  133|  14.1k|		if (nextLayer != nullptr)
  ------------------
  |  Branch (133:7): [True: 14.1k, False: 0]
  ------------------
  134|  14.1k|		{
  135|  14.1k|			setBottomOfStack((nextLayer->getProtocol() != MPLS));
  136|  14.1k|		}
  137|  14.1k|	}
_ZNK4pcpp9MplsLayer8toStringEv:
  140|  28.3k|	{
  141|  28.3k|		std::ostringstream labelStream;
  142|  28.3k|		labelStream << getMplsLabel();
  143|  28.3k|		std::ostringstream expStream;
  144|  28.3k|		expStream << (int)getExperimentalUseValue();
  145|  28.3k|		std::ostringstream ttlStream;
  146|  28.3k|		ttlStream << (int)getTTL();
  147|  28.3k|		std::string bottomOfStack = isBottomOfStack() ? "true" : "false";
  ------------------
  |  Branch (147:31): [True: 486, False: 27.8k]
  ------------------
  148|       |
  149|  28.3k|		return "MPLS Layer, Label: " + labelStream.str() + ", Exp: " + expStream.str() + ", TTL: " + ttlStream.str() +
  150|  28.3k|		       ", Bottom of stack: " + bottomOfStack;
  151|  28.3k|	}

_ZN4pcpp12MySqlMessage17parseMySqlMessageEPKhmNS_18MySqlMessageOriginE:
  202|  3.83k|	{
  203|  3.83k|		if (data == nullptr || dataLen < basicMessageLength)
  ------------------
  |  Branch (203:7): [True: 0, False: 3.83k]
  |  Branch (203:26): [True: 803, False: 3.03k]
  ------------------
  204|    803|		{
  205|    803|			return nullptr;
  206|    803|		}
  207|       |
  208|  3.03k|		auto messageLength = static_cast<uint32_t>(data[0]) | (static_cast<uint32_t>(data[1]) << 8) |
  209|  3.03k|		                     (static_cast<uint32_t>(data[2]) << 16);
  210|  3.03k|		if (dataLen < messageLength + basicMessageLength)
  ------------------
  |  Branch (210:7): [True: 1.08k, False: 1.95k]
  ------------------
  211|  1.08k|		{
  212|  1.08k|			return nullptr;
  213|  1.08k|		}
  214|       |
  215|  1.95k|		MySqlMessageType messageType = MySqlMessageType::Unknown;
  216|       |
  217|  1.95k|		if (origin == MySqlMessageOrigin::Client)
  ------------------
  |  Branch (217:7): [True: 1.15k, False: 801]
  ------------------
  218|  1.15k|		{
  219|  1.15k|			if (data[packetNumberIndex] == 1)
  ------------------
  |  Branch (219:8): [True: 0, False: 1.15k]
  ------------------
  220|      0|			{
  221|      0|				return std::unique_ptr<MySqlMessage>(
  222|      0|				    new MySqlMessage(data, messageLength + 4, MySqlMessageType::Client_HandshakeResponse, origin));
  223|      0|			}
  224|       |
  225|  1.15k|			if (dataLen < commandIndex + 1 || messageLength == 0)
  ------------------
  |  Branch (225:8): [True: 942, False: 210]
  |  Branch (225:38): [True: 88, False: 122]
  ------------------
  226|  1.03k|			{
  227|  1.03k|				return std::unique_ptr<MySqlMessage>(
  228|  1.03k|				    new MySqlMessage(data, messageLength + 4, MySqlMessageType::Unknown, origin));
  229|  1.03k|			}
  230|       |
  231|    122|			auto command = data[commandIndex];
  232|    122|			switch (command)
  233|    122|			{
  234|      0|			case ClientSleepCommand:
  ------------------
  |  Branch (234:4): [True: 0, False: 122]
  ------------------
  235|      0|				messageType = MySqlMessageType::Client_Sleep;
  236|      0|				break;
  237|      0|			case ClientQuitCommand:
  ------------------
  |  Branch (237:4): [True: 0, False: 122]
  ------------------
  238|      0|				messageType = MySqlMessageType::Client_Quit;
  239|      0|				break;
  240|      8|			case ClientInitDbCommand:
  ------------------
  |  Branch (240:4): [True: 8, False: 114]
  ------------------
  241|      8|				messageType = MySqlMessageType::Client_InitDb;
  242|      8|				break;
  243|     16|			case ClientQueryCommand:
  ------------------
  |  Branch (243:4): [True: 16, False: 106]
  ------------------
  244|     16|				return std::unique_ptr<MySqlMessage>(new MySqlQueryMessage(data, messageLength + 4));
  245|      0|			case ClientFieldListCommand:
  ------------------
  |  Branch (245:4): [True: 0, False: 122]
  ------------------
  246|      0|				messageType = MySqlMessageType::Client_FieldList;
  247|      0|				break;
  248|      0|			case ClientCreateDbCommand:
  ------------------
  |  Branch (248:4): [True: 0, False: 122]
  ------------------
  249|      0|				messageType = MySqlMessageType::Client_CreateDb;
  250|      0|				break;
  251|      0|			case ClientDropDbCommand:
  ------------------
  |  Branch (251:4): [True: 0, False: 122]
  ------------------
  252|      0|				messageType = MySqlMessageType::Client_DropDb;
  253|      0|				break;
  254|      0|			case ClientRefreshCommand:
  ------------------
  |  Branch (254:4): [True: 0, False: 122]
  ------------------
  255|      0|				messageType = MySqlMessageType::Client_Refresh;
  256|      0|				break;
  257|     27|			case ClientShutdownCommand:
  ------------------
  |  Branch (257:4): [True: 27, False: 95]
  ------------------
  258|     27|				messageType = MySqlMessageType::Client_Shutdown;
  259|     27|				break;
  260|      0|			case ClientStatisticsCommand:
  ------------------
  |  Branch (260:4): [True: 0, False: 122]
  ------------------
  261|      0|				messageType = MySqlMessageType::Client_Statistics;
  262|      0|				break;
  263|      0|			case ClientProcessInfoCommand:
  ------------------
  |  Branch (263:4): [True: 0, False: 122]
  ------------------
  264|      0|				messageType = MySqlMessageType::Client_ProcessInfo;
  265|      0|				break;
  266|      0|			case ClientConnectCommand:
  ------------------
  |  Branch (266:4): [True: 0, False: 122]
  ------------------
  267|      0|				messageType = MySqlMessageType::Client_Connect;
  268|      0|				break;
  269|      0|			case ClientProcessKillCommand:
  ------------------
  |  Branch (269:4): [True: 0, False: 122]
  ------------------
  270|      0|				messageType = MySqlMessageType::Client_ProcessKill;
  271|      0|				break;
  272|      0|			case ClientDebugCommand:
  ------------------
  |  Branch (272:4): [True: 0, False: 122]
  ------------------
  273|      0|				messageType = MySqlMessageType::Client_Debug;
  274|      0|				break;
  275|      7|			case ClientPingCommand:
  ------------------
  |  Branch (275:4): [True: 7, False: 115]
  ------------------
  276|      7|				messageType = MySqlMessageType::Client_Ping;
  277|      7|				break;
  278|      0|			case ClientTimeCommand:
  ------------------
  |  Branch (278:4): [True: 0, False: 122]
  ------------------
  279|      0|				messageType = MySqlMessageType::Client_Time;
  280|      0|				break;
  281|      0|			case ClientDelayedInsertCommand:
  ------------------
  |  Branch (281:4): [True: 0, False: 122]
  ------------------
  282|      0|				messageType = MySqlMessageType::Client_DelayedInsert;
  283|      0|				break;
  284|      0|			case ClientChangeUserCommand:
  ------------------
  |  Branch (284:4): [True: 0, False: 122]
  ------------------
  285|      0|				messageType = MySqlMessageType::Client_ChangeUser;
  286|      0|				break;
  287|      0|			case ClientBinlogDumpCommand:
  ------------------
  |  Branch (287:4): [True: 0, False: 122]
  ------------------
  288|      0|				messageType = MySqlMessageType::Client_BinlogDump;
  289|      0|				break;
  290|      0|			case ClientTableDumpCommand:
  ------------------
  |  Branch (290:4): [True: 0, False: 122]
  ------------------
  291|      0|				messageType = MySqlMessageType::Client_TableDump;
  292|      0|				break;
  293|      0|			case ClientConnectOutCommand:
  ------------------
  |  Branch (293:4): [True: 0, False: 122]
  ------------------
  294|      0|				messageType = MySqlMessageType::Client_ConnectOut;
  295|      0|				break;
  296|      0|			case ClientRegisterSlaveCommand:
  ------------------
  |  Branch (296:4): [True: 0, False: 122]
  ------------------
  297|      0|				messageType = MySqlMessageType::Client_RegisterSlave;
  298|      0|				break;
  299|      0|			case ClientStmtPrepareCommand:
  ------------------
  |  Branch (299:4): [True: 0, False: 122]
  ------------------
  300|      0|				messageType = MySqlMessageType::Client_StmtPrepare;
  301|      0|				break;
  302|      4|			case ClientStmtExecuteCommand:
  ------------------
  |  Branch (302:4): [True: 4, False: 118]
  ------------------
  303|      4|				messageType = MySqlMessageType::Client_StmtExecute;
  304|      4|				break;
  305|      4|			case ClientStmtSendLongDataCommand:
  ------------------
  |  Branch (305:4): [True: 4, False: 118]
  ------------------
  306|      4|				messageType = MySqlMessageType::Client_StmtSendLongData;
  307|      4|				break;
  308|      0|			case ClientStmtCloseCommand:
  ------------------
  |  Branch (308:4): [True: 0, False: 122]
  ------------------
  309|      0|				messageType = MySqlMessageType::Client_StmtClose;
  310|      0|				break;
  311|     56|			case ClientStmtResetCommand:
  ------------------
  |  Branch (311:4): [True: 56, False: 66]
  ------------------
  312|     56|				messageType = MySqlMessageType::Client_StmtReset;
  313|     56|				break;
  314|      0|			case ClientSetOptionCommand:
  ------------------
  |  Branch (314:4): [True: 0, False: 122]
  ------------------
  315|      0|				messageType = MySqlMessageType::Client_SetOption;
  316|      0|				break;
  317|      0|			case ClientStmtFetchCommand:
  ------------------
  |  Branch (317:4): [True: 0, False: 122]
  ------------------
  318|      0|				messageType = MySqlMessageType::Client_StmtFetch;
  319|      0|				break;
  320|      0|			case ClientDaemonCommand:
  ------------------
  |  Branch (320:4): [True: 0, False: 122]
  ------------------
  321|      0|				messageType = MySqlMessageType::Client_Daemon;
  322|      0|				break;
  323|      0|			case ClientBinlogDumpGtidCommand:
  ------------------
  |  Branch (323:4): [True: 0, False: 122]
  ------------------
  324|      0|				messageType = MySqlMessageType::Client_BinlogDumpGtid;
  325|      0|				break;
  326|      0|			case ClientResetConnectionCommand:
  ------------------
  |  Branch (326:4): [True: 0, False: 122]
  ------------------
  327|      0|				messageType = MySqlMessageType::Client_ResetConnection;
  328|      0|				break;
  329|      0|			case ClientCloneCommand:
  ------------------
  |  Branch (329:4): [True: 0, False: 122]
  ------------------
  330|      0|				messageType = MySqlMessageType::Client_Clone;
  331|      0|				break;
  332|      0|			default:
  ------------------
  |  Branch (332:4): [True: 0, False: 122]
  ------------------
  333|      0|				break;
  334|    122|			}
  335|    122|		}
  336|    801|		else  // Server message
  337|    801|		{
  338|    801|			if (data[packetNumberIndex] == 0)
  ------------------
  |  Branch (338:8): [True: 796, False: 5]
  ------------------
  339|    796|			{
  340|    796|				return std::unique_ptr<MySqlMessage>(
  341|    796|				    new MySqlMessage(data, messageLength + 4, MySqlMessageType::Server_Handshake, origin));
  342|    796|			}
  343|       |
  344|      5|			if (dataLen < commandIndex + 1 || messageLength == 0)
  ------------------
  |  Branch (344:8): [True: 0, False: 5]
  |  Branch (344:38): [True: 5, False: 0]
  ------------------
  345|      5|			{
  346|      5|				return std::unique_ptr<MySqlMessage>(
  347|      5|				    new MySqlMessage(data, messageLength + 4, MySqlMessageType::Unknown, origin));
  348|      5|			}
  349|       |
  350|      0|			auto firstByte = data[commandIndex];
  351|      0|			switch (firstByte)
  352|      0|			{
  353|      0|			case ServerOk:
  ------------------
  |  Branch (353:4): [True: 0, False: 0]
  ------------------
  354|      0|				messageType = MySqlMessageType::Server_Ok;
  355|      0|				break;
  356|      0|			case ServerError:
  ------------------
  |  Branch (356:4): [True: 0, False: 0]
  ------------------
  357|      0|				return std::unique_ptr<MySqlMessage>(new MySqlErrorMessage(data, messageLength + 4));
  358|      0|			case ServerEof_AuthSwitchRequest:
  ------------------
  |  Branch (358:4): [True: 0, False: 0]
  ------------------
  359|      0|			{
  360|      0|				messageLength = dataLen - basicMessageLength;
  361|      0|				if (messageLength < 9)
  ------------------
  |  Branch (361:9): [True: 0, False: 0]
  ------------------
  362|      0|				{
  363|      0|					messageType = MySqlMessageType::Server_EOF;
  364|      0|				}
  365|      0|				else
  366|      0|				{
  367|      0|					messageType = MySqlMessageType::Server_AuthSwitchRequest;
  368|      0|				}
  369|      0|				break;
  370|      0|			}
  371|      0|			default:
  ------------------
  |  Branch (371:4): [True: 0, False: 0]
  ------------------
  372|      0|				return std::unique_ptr<MySqlMessage>(
  373|      0|				    new MySqlMessage(data, messageLength + basicMessageLength, MySqlMessageType::Server_Data, origin));
  374|      0|			}
  375|      0|		}
  376|       |
  377|    106|		return std::unique_ptr<MySqlCommandMessage>(
  378|    106|		    new MySqlCommandMessage(data, messageLength + basicMessageLength, messageType, origin));
  379|  1.95k|	}
_ZN4pcpp10MySqlLayer23parseMySqlClientMessageEPhmPNS_5LayerEPNS_6PacketE:
  451|  11.2k|	{
  452|  11.2k|		return new MySqlLayer(data, dataLen, prevLayer, packet, MySqlMessageOrigin::Client);
  453|  11.2k|	}
_ZN4pcpp10MySqlLayer23parseMySqlServerMessageEPhmPNS_5LayerEPNS_6PacketE:
  456|  4.32k|	{
  457|  4.32k|		return new MySqlLayer(data, dataLen, prevLayer, packet, MySqlMessageOrigin::Server);
  458|  4.32k|	}
_ZNK4pcpp10MySqlLayer16getMySqlMessagesEv:
  461|  5.81k|	{
  462|  5.81k|		if (!m_MessagesInitialized)
  ------------------
  |  Branch (462:7): [True: 2.90k, False: 2.90k]
  ------------------
  463|  2.90k|		{
  464|  2.90k|			auto data = m_Data;
  465|  2.90k|			auto dataLen = m_DataLen;
  466|       |
  467|  4.86k|			while (dataLen > 0)
  ------------------
  |  Branch (467:11): [True: 3.83k, False: 1.02k]
  ------------------
  468|  3.83k|			{
  469|  3.83k|				auto curMessage = MySqlMessage::parseMySqlMessage(data, dataLen, m_MessageOrigin);
  470|  3.83k|				if (curMessage == nullptr)
  ------------------
  |  Branch (470:9): [True: 1.88k, False: 1.95k]
  ------------------
  471|  1.88k|				{
  472|  1.88k|					break;
  473|  1.88k|				}
  474|       |
  475|  1.95k|				dataLen -= curMessage->getTotalMessageLength();
  476|  1.95k|				data += curMessage->getTotalMessageLength();
  477|  1.95k|				m_Messages.pushBack(std::move(curMessage));
  478|  1.95k|			}
  479|       |
  480|  2.90k|			m_MessagesInitialized = true;
  481|  2.90k|		}
  482|       |
  483|  5.81k|		return m_Messages;
  484|  5.81k|	}
_ZNK4pcpp10MySqlLayer8toStringEv:
  497|  5.81k|	{
  498|  5.81k|		const auto& messages = getMySqlMessages();
  499|  5.81k|		return std::string("MySQL ") + (m_MessageOrigin == MySqlMessageOrigin::Client ? "Client" : "Server") +
  ------------------
  |  Branch (499:35): [True: 4.08k, False: 1.72k]
  ------------------
  500|  5.81k|		       " Layer, " + std::to_string(messages.size()) + " message(s)";
  501|  5.81k|	}

_ZNK4pcpp12NDPLayerBase12getNdpOptionENS_22NDPNeighborOptionTypesE:
   45|  2.27k|	{
   46|  2.27k|		return m_OptionReader.getTLVRecord((uint8_t)option, getNdpOptionsBasePtr(), getHeaderLen() - getNdpHeaderLen());
   47|  2.27k|	}
_ZNK4pcpp28NDPNeighborSolicitationLayer19hasLinkLayerAddressEv:
  121|  1.38k|	{
  122|  1.38k|		NdpOption option = this->getNdpOption(NDPNeighborOptionTypes::NDP_OPTION_SOURCE_LINK_LAYER);
  123|  1.38k|		return option.isNull() ? false : true;
  ------------------
  |  Branch (123:10): [True: 998, False: 382]
  ------------------
  124|  1.38k|	}
_ZNK4pcpp28NDPNeighborSolicitationLayer19getLinkLayerAddressEv:
  127|    382|	{
  128|    382|		NdpOption option = this->getNdpOption(NDPNeighborOptionTypes::NDP_OPTION_SOURCE_LINK_LAYER);
  129|       |
  130|    382|		if (option.isNull())
  ------------------
  |  Branch (130:7): [True: 0, False: 382]
  ------------------
  131|      0|		{
  132|      0|			return MacAddress::Zero;
  133|      0|		}
  134|       |
  135|    382|		return MacAddress(option.getValue());
  136|    382|	}
_ZNK4pcpp28NDPNeighborSolicitationLayer8toStringEv:
  139|  1.38k|	{
  140|  1.38k|		std::ostringstream typeStream;
  141|  1.38k|		typeStream << "ICMPv6 Layer, Neighbor Solicitation Message, TargetIP: " + getTargetIP().toString();
  142|  1.38k|		hasLinkLayerAddress() ? typeStream << ", SourceMAC: " + getLinkLayerAddress().toString()
  ------------------
  |  Branch (142:3): [True: 382, False: 998]
  ------------------
  143|  1.38k|		                      : typeStream << ", no Option";
  144|       |
  145|  1.38k|		return typeStream.str();
  146|  1.38k|	}
_ZNK4pcpp29NDPNeighborAdvertisementLayer16hasTargetMacInfoEv:
  182|    260|	{
  183|    260|		NdpOption option = this->getNdpOption(NDPNeighborOptionTypes::NDP_OPTION_TARGET_LINK_LAYER);
  184|    260|		return option.isNull() ? false : true;
  ------------------
  |  Branch (184:10): [True: 8, False: 252]
  ------------------
  185|    260|	}
_ZNK4pcpp29NDPNeighborAdvertisementLayer12getTargetMacEv:
  188|    252|	{
  189|    252|		NdpOption option = this->getNdpOption(NDPNeighborOptionTypes::NDP_OPTION_TARGET_LINK_LAYER);
  190|       |
  191|    252|		if (option.isNull())
  ------------------
  |  Branch (191:7): [True: 0, False: 252]
  ------------------
  192|      0|		{
  193|      0|			return MacAddress::Zero;
  194|      0|		}
  195|       |
  196|    252|		return MacAddress(option.getValue());
  197|    252|	}
_ZNK4pcpp29NDPNeighborAdvertisementLayer8toStringEv:
  200|    260|	{
  201|    260|		std::ostringstream typeStream;
  202|    260|		typeStream << "ICMPv6 Layer, Neighbor Advertisement Message, TargetIP: " << getTargetIP().toString();
  203|    260|		hasTargetMacInfo() ? typeStream << ", TargetMAC: " + getTargetMac().toString() : typeStream << ", no Option";
  ------------------
  |  Branch (203:3): [True: 252, False: 8]
  ------------------
  204|       |
  205|    260|		return typeStream.str();
  206|    260|	}

_ZNK4pcpp10NflogLayer9getFamilyEv:
   18|    141|	{
   19|    141|		return getNflogHeader()->addressFamily;
   20|    141|	}
_ZNK4pcpp10NflogLayer12getTlvByTypeENS_12NflogTlvTypeE:
   33|  2.14k|	{
   34|  2.14k|		const auto typeNum = static_cast<uint32_t>(type);
   35|  2.14k|		NflogTlv tlv = m_TlvReader.getTLVRecord(typeNum, getTlvsBasePtr(), m_DataLen - sizeof(nflog_header));
   36|       |
   37|  2.14k|		return tlv;
   38|  2.14k|	}
_ZN4pcpp10NflogLayer14parseNextLayerEv:
   41|  2.27k|	{
   42|  2.27k|		if (m_DataLen <= sizeof(nflog_header))
  ------------------
  |  Branch (42:7): [True: 130, False: 2.14k]
  ------------------
   43|    130|		{
   44|    130|			return;
   45|    130|		}
   46|  2.14k|		auto payloadInfo = getTlvByType(NflogTlvType::NFULA_PAYLOAD);
   47|  2.14k|		if (payloadInfo.isNull())
  ------------------
  |  Branch (47:7): [True: 2.00k, False: 141]
  ------------------
   48|  2.00k|		{
   49|  2.00k|			return;
   50|  2.00k|		}
   51|       |
   52|    141|		uint8_t* payload = payloadInfo.getValue();
   53|    141|		size_t payloadLen = payloadInfo.getTotalSize() - sizeof(uint16_t) * 2;
   54|       |
   55|    141|		uint8_t family = getFamily();
   56|       |
   57|    141|		switch (family)
   58|    141|		{
   59|    141|		case NflogFamilyIpv4:
  ------------------
  |  Branch (59:3): [True: 141, False: 0]
  ------------------
   60|    141|		{
   61|    141|			tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen);
   62|    141|			break;
   63|      0|		}
   64|      0|		case NflogFamilyIpv6:
  ------------------
  |  Branch (64:3): [True: 0, False: 141]
  ------------------
   65|      0|		{
   66|      0|			tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen);
   67|      0|			break;
   68|      0|		}
   69|      0|		default:
  ------------------
  |  Branch (69:3): [True: 0, False: 141]
  ------------------
   70|      0|		{
   71|      0|			constructNextLayer<PayloadLayer>(payload, payloadLen);
   72|      0|			break;
   73|      0|		}
   74|    141|		}
   75|    141|	}
_ZNK4pcpp10NflogLayer12getHeaderLenEv:
   78|  1.13k|	{
   79|  1.13k|		size_t headerLen = sizeof(nflog_header);
   80|  1.13k|		NflogTlv currentTLV = m_TlvReader.getFirstTLVRecord(getTlvsBasePtr(), m_DataLen - sizeof(nflog_header));
   81|       |
   82|  2.70k|		while (!currentTLV.isNull() && currentTLV.getType() != static_cast<uint16_t>(NflogTlvType::NFULA_PAYLOAD))
  ------------------
  |  Branch (82:10): [True: 1.63k, False: 1.06k]
  |  Branch (82:34): [True: 1.56k, False: 70]
  ------------------
   83|  1.56k|		{
   84|  1.56k|			headerLen += currentTLV.getTotalSize();
   85|  1.56k|			currentTLV = m_TlvReader.getNextTLVRecord(currentTLV, getTlvsBasePtr(), m_DataLen - sizeof(nflog_header));
   86|  1.56k|		}
   87|  1.13k|		if (!currentTLV.isNull() && currentTLV.getType() == static_cast<uint16_t>(NflogTlvType::NFULA_PAYLOAD))
  ------------------
  |  Branch (87:7): [True: 70, False: 1.06k]
  |  Branch (87:31): [True: 70, False: 0]
  ------------------
   88|     70|		{
   89|       |			// for the length and type of the payload TLV
   90|     70|			headerLen += 2 * sizeof(uint16_t);
   91|     70|		}
   92|       |		// nflog_header has not a form of TLV and contains 3 fields (family, resource_id, version)
   93|  1.13k|		return headerLen;
   94|  1.13k|	}
_ZNK4pcpp10NflogLayer8toStringEv:
   97|  2.18k|	{
   98|  2.18k|		return "Linux Netfilter NFLOG";
   99|  2.18k|	}
_ZN4pcpp10NflogLayer11isDataValidEPKhm:
  102|  2.27k|	{
  103|  2.27k|		return data && dataLen >= sizeof(nflog_header);
  ------------------
  |  Branch (103:10): [True: 2.27k, False: 0]
  |  Branch (103:18): [True: 2.27k, False: 0]
  ------------------
  104|  2.27k|	}

_ZNK4pcpp8NtpLayer16getLeapIndicatorEv:
   24|  1.23k|	{
   25|  1.23k|		if (getNtpHeader()->leapIndicator < 4)  // Since leap indicator field is 2bit
  ------------------
  |  Branch (25:7): [True: 1.23k, False: 0]
  ------------------
   26|  1.23k|			return static_cast<LeapIndicator>(getNtpHeader()->leapIndicator);
   27|      0|		PCPP_LOG_ERROR("Unknown NTP Leap Indicator");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleNtpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleNtpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   28|      0|		return Unknown;
   29|  1.23k|	}
_ZNK4pcpp8NtpLayer10getVersionEv:
   37|  6.16k|	{
   38|  6.16k|		return getNtpHeader()->version;
   39|  6.16k|	}
_ZNK4pcpp8NtpLayer7getModeEv:
   47|  4.93k|	{
   48|  4.93k|		if (getNtpHeader()->mode < 8)  // Since mode field 3bit
  ------------------
  |  Branch (48:7): [True: 4.93k, False: 0]
  ------------------
   49|  4.93k|			return static_cast<Mode>(getNtpHeader()->mode);
   50|      0|		PCPP_LOG_ERROR("Unknown NTP Mode");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleNtpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleNtpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   51|      0|		return Reserved;
   52|  4.93k|	}
_ZNK4pcpp8NtpLayer13getModeStringEv:
   55|  3.69k|	{
   56|  3.69k|		switch (getMode())
   57|  3.69k|		{
   58|    351|		case Reserved:
  ------------------
  |  Branch (58:3): [True: 351, False: 3.34k]
  ------------------
   59|    351|			return "Reserved";
   60|    162|		case SymActive:
  ------------------
  |  Branch (60:3): [True: 162, False: 3.53k]
  ------------------
   61|    162|			return "Symmetrically Active";
   62|      3|		case SymPassive:
  ------------------
  |  Branch (62:3): [True: 3, False: 3.69k]
  ------------------
   63|      3|			return "Symmetrically Passive";
   64|  1.50k|		case Client:
  ------------------
  |  Branch (64:3): [True: 1.50k, False: 2.19k]
  ------------------
   65|  1.50k|			return "Client";
   66|    681|		case Server:
  ------------------
  |  Branch (66:3): [True: 681, False: 3.01k]
  ------------------
   67|    681|			return "Server";
   68|    624|		case Broadcast:
  ------------------
  |  Branch (68:3): [True: 624, False: 3.07k]
  ------------------
   69|    624|			return "Broadcast";
   70|     12|		case Control:
  ------------------
  |  Branch (70:3): [True: 12, False: 3.68k]
  ------------------
   71|     12|			return "Control";
   72|    366|		case PrivateUse:
  ------------------
  |  Branch (72:3): [True: 366, False: 3.33k]
  ------------------
   73|    366|			return "Private Use";
   74|      0|		default:
  ------------------
  |  Branch (74:3): [True: 0, False: 3.69k]
  ------------------
   75|      0|			PCPP_LOG_ERROR("Unknown NTP Mode");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleNtpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleNtpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   76|      0|			return std::string();
   77|  3.69k|		}
   78|  3.69k|	}
_ZNK4pcpp8NtpLayer10getStratumEv:
   86|  2.46k|	{
   87|  2.46k|		return getNtpHeader()->stratum;
   88|  2.46k|	}
_ZNK4pcpp8NtpLayer15getPollIntervalEv:
   96|  2.46k|	{
   97|  2.46k|		return getNtpHeader()->pollInterval;
   98|  2.46k|	}
_ZNK4pcpp8NtpLayer21getPollIntervalInSecsEv:
  106|  1.23k|	{
  107|  1.23k|		return pow(2, getPollInterval());
  108|  1.23k|	}
_ZNK4pcpp8NtpLayer12getPrecisionEv:
  111|  2.46k|	{
  112|  2.46k|		return getNtpHeader()->precision;
  113|  2.46k|	}
_ZNK4pcpp8NtpLayer18getPrecisionInSecsEv:
  121|  1.23k|	{
  122|  1.23k|		return pow(2, getPrecision());
  123|  1.23k|	}
_ZNK4pcpp8NtpLayer12getRootDelayEv:
  126|  2.46k|	{
  127|  2.46k|		return getNtpHeader()->rootDelay;
  128|  2.46k|	}
_ZNK4pcpp8NtpLayer18getRootDelayInSecsEv:
  136|  1.23k|	{
  137|  1.23k|		return convertFromShortFormat(getRootDelay());
  138|  1.23k|	}
_ZN4pcpp8NtpLayer18setRootDelayInSecsEd:
  141|  1.23k|	{
  142|  1.23k|		getNtpHeader()->rootDelay = convertToShortFormat(val);
  143|  1.23k|	}
_ZNK4pcpp8NtpLayer17getRootDispersionEv:
  146|  2.46k|	{
  147|  2.46k|		return getNtpHeader()->rootDispersion;
  148|  2.46k|	}
_ZNK4pcpp8NtpLayer23getRootDispersionInSecsEv:
  156|  1.23k|	{
  157|  1.23k|		return convertFromShortFormat(getRootDispersion());
  158|  1.23k|	}
_ZNK4pcpp8NtpLayer22getReferenceIdentifierEv:
  166|  2.78k|	{
  167|  2.78k|		return getNtpHeader()->referenceIdentifier;
  168|  2.78k|	}
_ZNK4pcpp8NtpLayer28getReferenceIdentifierStringEv:
  186|  1.23k|	{
  187|  1.23k|		uint8_t stratum = getStratum();
  188|  1.23k|		uint8_t version = getVersion();
  189|  1.23k|		uint32_t refID = getReferenceIdentifier();
  190|       |
  191|  1.23k|		if (stratum == 0)
  ------------------
  |  Branch (191:7): [True: 604, False: 629]
  ------------------
  192|    604|		{
  193|    604|			switch (version)
  ------------------
  |  Branch (193:12): [True: 465, False: 139]
  ------------------
  194|    604|			{
  195|      8|			case 3:
  ------------------
  |  Branch (195:4): [True: 8, False: 596]
  ------------------
  196|      8|			{
  197|      8|				switch (static_cast<ClockSource>(refID))
  198|      8|				{
  199|      0|				case ClockSource::DCN:
  ------------------
  |  Branch (199:5): [True: 0, False: 8]
  ------------------
  200|      0|					return "DCN routing protocol";
  201|      0|				case ClockSource::NIST:
  ------------------
  |  Branch (201:5): [True: 0, False: 8]
  ------------------
  202|      0|					return "NIST public modem";
  203|      0|				case ClockSource::TSP:
  ------------------
  |  Branch (203:5): [True: 0, False: 8]
  ------------------
  204|      0|					return "TSP time protocol";
  205|      0|				case ClockSource::DTS:
  ------------------
  |  Branch (205:5): [True: 0, False: 8]
  ------------------
  206|      0|					return "Digital Time Service";
  207|      8|				default:
  ------------------
  |  Branch (207:5): [True: 8, False: 0]
  ------------------
  208|      8|					return "Unknown";
  209|      8|				}
  210|      8|			}
  211|    457|			case 4:
  ------------------
  |  Branch (211:4): [True: 457, False: 147]
  ------------------
  212|    457|			{
  213|    457|				switch (static_cast<KissODeath>(refID))
  214|    457|				{
  215|      0|				case KissODeath::ACST:
  ------------------
  |  Branch (215:5): [True: 0, False: 457]
  ------------------
  216|      0|					return "The association belongs to a anycast server";
  217|      0|				case KissODeath::AUTH:
  ------------------
  |  Branch (217:5): [True: 0, False: 457]
  ------------------
  218|      0|					return "Server authentication failed";
  219|      0|				case KissODeath::AUTO:
  ------------------
  |  Branch (219:5): [True: 0, False: 457]
  ------------------
  220|      0|					return "Autokey sequence failed";
  221|      0|				case KissODeath::BCST:
  ------------------
  |  Branch (221:5): [True: 0, False: 457]
  ------------------
  222|      0|					return "The association belongs to a broadcast server";
  223|      0|				case KissODeath::CRYP:
  ------------------
  |  Branch (223:5): [True: 0, False: 457]
  ------------------
  224|      0|					return "Cryptographic authentication or identification failed";
  225|      0|				case KissODeath::DENY:
  ------------------
  |  Branch (225:5): [True: 0, False: 457]
  ------------------
  226|      0|					return "Access denied by remote server";
  227|      0|				case KissODeath::DROP:
  ------------------
  |  Branch (227:5): [True: 0, False: 457]
  ------------------
  228|      0|					return "Lost peer in symmetric mode";
  229|      0|				case KissODeath::RSTR:
  ------------------
  |  Branch (229:5): [True: 0, False: 457]
  ------------------
  230|      0|					return "Access denied due to local policy";
  231|     16|				case KissODeath::INIT:
  ------------------
  |  Branch (231:5): [True: 16, False: 441]
  ------------------
  232|     16|					return "The association has not yet synchronized for the first time";
  233|      0|				case KissODeath::MCST:
  ------------------
  |  Branch (233:5): [True: 0, False: 457]
  ------------------
  234|      0|					return "The association belongs to a manycast server";
  235|      0|				case KissODeath::NKEY:
  ------------------
  |  Branch (235:5): [True: 0, False: 457]
  ------------------
  236|      0|					return "No key found.  Either the key was never installed or is not trusted";
  237|     63|				case KissODeath::RATE:
  ------------------
  |  Branch (237:5): [True: 63, False: 394]
  ------------------
  238|     63|					return "Rate exceeded.  The server has temporarily denied access because the client exceeded the rate "
  239|     63|					       "threshold";
  240|      0|				case KissODeath::RMOT:
  ------------------
  |  Branch (240:5): [True: 0, False: 457]
  ------------------
  241|      0|					return "Somebody is tinkering with the association from a remote host running ntpdc.  Not to worry "
  242|      0|					       "unless some rascal has stolen your keys";
  243|     16|				case KissODeath::STEP:
  ------------------
  |  Branch (243:5): [True: 16, False: 441]
  ------------------
  244|     16|					return "A step change in system time has occurred, but the association has not yet resynchronized";
  245|    362|				default:
  ------------------
  |  Branch (245:5): [True: 362, False: 95]
  ------------------
  246|    362|				{
  247|       |					// clang-format off
  248|    362|					char arrBuff[5] = {
  249|    362|						static_cast<char>((refID >> 24) & 0xFF),
  250|    362|						static_cast<char>((refID >> 16) & 0xFF),
  251|    362|						static_cast<char>((refID >> 8) & 0xFF),
  252|    362|						static_cast<char>((refID) & 0xFF), '\0'
  253|    362|					};
  254|       |					// clang-format on
  255|    362|					return arrBuff;
  256|      0|				}
  257|    457|				}
  258|    457|			}
  259|    604|			}
  260|    604|		}
  261|    629|		else if (stratum == 1)
  ------------------
  |  Branch (261:12): [True: 311, False: 318]
  ------------------
  262|    311|		{
  263|    311|			switch (version)
  ------------------
  |  Branch (263:12): [True: 293, False: 18]
  ------------------
  264|    311|			{
  265|    205|			case 3:
  ------------------
  |  Branch (265:4): [True: 205, False: 106]
  ------------------
  266|    205|			{
  267|    205|				switch (static_cast<ClockSource>(refID))
  268|    205|				{
  269|      0|				case ClockSource::ATOM:
  ------------------
  |  Branch (269:5): [True: 0, False: 205]
  ------------------
  270|      0|					return "Atomic clock";
  271|      0|				case ClockSource::VLF:
  ------------------
  |  Branch (271:5): [True: 0, False: 205]
  ------------------
  272|      0|					return "VLF radio";
  273|      0|				case ClockSource::LORC:
  ------------------
  |  Branch (273:5): [True: 0, False: 205]
  ------------------
  274|      0|					return "LORAN-C radionavigation";
  275|      0|				case ClockSource::GOES:
  ------------------
  |  Branch (275:5): [True: 0, False: 205]
  ------------------
  276|      0|					return "GOES UHF environment satellite";
  277|      0|				case ClockSource::GPS:
  ------------------
  |  Branch (277:5): [True: 0, False: 205]
  ------------------
  278|      0|					return "GPS UHF satellite positioning";
  279|    205|				default:
  ------------------
  |  Branch (279:5): [True: 205, False: 0]
  ------------------
  280|    205|					return "Unknown";
  281|    205|				}
  282|    205|			}
  283|     88|			case 4:
  ------------------
  |  Branch (283:4): [True: 88, False: 223]
  ------------------
  284|     88|			{
  285|     88|				switch (static_cast<ClockSource>(refID))
  286|     88|				{
  287|      0|				case ClockSource::GOES:
  ------------------
  |  Branch (287:5): [True: 0, False: 88]
  ------------------
  288|      0|					return "Geosynchronous Orbit Environment Satellite";
  289|      0|				case ClockSource::GPS:
  ------------------
  |  Branch (289:5): [True: 0, False: 88]
  ------------------
  290|      0|					return "Global Position System";
  291|      0|				case ClockSource::GAL:
  ------------------
  |  Branch (291:5): [True: 0, False: 88]
  ------------------
  292|      0|					return "Galileo Positioning System";
  293|      0|				case ClockSource::PPS:
  ------------------
  |  Branch (293:5): [True: 0, False: 88]
  ------------------
  294|      0|					return "Generic pulse-per-second";
  295|      0|				case ClockSource::IRIG:
  ------------------
  |  Branch (295:5): [True: 0, False: 88]
  ------------------
  296|      0|					return "Inter-Range Instrumentation Group";
  297|      0|				case ClockSource::WWVB:
  ------------------
  |  Branch (297:5): [True: 0, False: 88]
  ------------------
  298|      0|					return "LF Radio WWVB Ft. Collins, CO 60 kHz";
  299|      0|				case ClockSource::DCF:
  ------------------
  |  Branch (299:5): [True: 0, False: 88]
  ------------------
  300|      0|					return "LF Radio DCF77 Mainflingen, DE 77.5 kHz";
  301|      0|				case ClockSource::HBG:
  ------------------
  |  Branch (301:5): [True: 0, False: 88]
  ------------------
  302|      0|					return "LF Radio HBG Prangins, HB 75 kHz";
  303|      0|				case ClockSource::MSF:
  ------------------
  |  Branch (303:5): [True: 0, False: 88]
  ------------------
  304|      0|					return "LF Radio MSF Anthorn, UK 60 kHz";
  305|      0|				case ClockSource::JJY:
  ------------------
  |  Branch (305:5): [True: 0, False: 88]
  ------------------
  306|      0|					return "LF Radio JJY Fukushima, JP 40 kHz, Saga, JP 60 kHz";
  307|      0|				case ClockSource::LORC:
  ------------------
  |  Branch (307:5): [True: 0, False: 88]
  ------------------
  308|      0|					return "MF Radio LORAN C station, 100 kHz";
  309|      0|				case ClockSource::TDF:
  ------------------
  |  Branch (309:5): [True: 0, False: 88]
  ------------------
  310|      0|					return "MF Radio Allouis, FR 162 kHz";
  311|      0|				case ClockSource::CHU:
  ------------------
  |  Branch (311:5): [True: 0, False: 88]
  ------------------
  312|      0|					return "HF Radio CHU Ottawa, Ontario";
  313|      0|				case ClockSource::WWV:
  ------------------
  |  Branch (313:5): [True: 0, False: 88]
  ------------------
  314|      0|					return "HF Radio WWV Ft. Collins, CO";
  315|      0|				case ClockSource::WWVH:
  ------------------
  |  Branch (315:5): [True: 0, False: 88]
  ------------------
  316|      0|					return "HF Radio WWVH Kauai, HI";
  317|      0|				case ClockSource::NIST:
  ------------------
  |  Branch (317:5): [True: 0, False: 88]
  ------------------
  318|      0|					return "NIST telephone modem";
  319|      0|				case ClockSource::ACTS:
  ------------------
  |  Branch (319:5): [True: 0, False: 88]
  ------------------
  320|      0|					return "NIST telephone modem";
  321|      0|				case ClockSource::USNO:
  ------------------
  |  Branch (321:5): [True: 0, False: 88]
  ------------------
  322|      0|					return "USNO telephone modem";
  323|      0|				case ClockSource::PTB:
  ------------------
  |  Branch (323:5): [True: 0, False: 88]
  ------------------
  324|      0|					return "European telephone modem";
  325|      0|				case ClockSource::MRS:
  ------------------
  |  Branch (325:5): [True: 0, False: 88]
  ------------------
  326|      0|					return "Multi Reference Sources";
  327|      0|				case ClockSource::XFAC:
  ------------------
  |  Branch (327:5): [True: 0, False: 88]
  ------------------
  328|      0|					return "Inter Face Association Changed";
  329|     28|				case ClockSource::STEP:
  ------------------
  |  Branch (329:5): [True: 28, False: 60]
  ------------------
  330|     28|					return "Step time change";
  331|      0|				case ClockSource::GOOG:
  ------------------
  |  Branch (331:5): [True: 0, False: 88]
  ------------------
  332|      0|					return "Google NTP servers";
  333|      0|				case ClockSource::DCFa:
  ------------------
  |  Branch (333:5): [True: 0, False: 88]
  ------------------
  334|      0|					return "Meinberg DCF77 with amplitude modulation";
  335|      0|				case ClockSource::DCFp:
  ------------------
  |  Branch (335:5): [True: 0, False: 88]
  ------------------
  336|      0|					return "Meinberg DCF77 with phase modulation)/pseudo random phase modulation";
  337|      0|				case ClockSource::GPSs:
  ------------------
  |  Branch (337:5): [True: 0, False: 88]
  ------------------
  338|      0|					return "Meinberg GPS (with shared memory access)";
  339|      0|				case ClockSource::GPSi:
  ------------------
  |  Branch (339:5): [True: 0, False: 88]
  ------------------
  340|      0|					return "Meinberg GPS (with interrupt based access)";
  341|      0|				case ClockSource::GLNs:
  ------------------
  |  Branch (341:5): [True: 0, False: 88]
  ------------------
  342|      0|					return "Meinberg GPS/GLONASS (with shared memory access)";
  343|     55|				case ClockSource::GLNi:
  ------------------
  |  Branch (343:5): [True: 55, False: 33]
  ------------------
  344|     55|					return "Meinberg GPS/GLONASS (with interrupt based access)";
  345|      0|				case ClockSource::LCL:
  ------------------
  |  Branch (345:5): [True: 0, False: 88]
  ------------------
  346|      0|					return "Meinberg Undisciplined local clock";
  347|      0|				case ClockSource::LOCL:
  ------------------
  |  Branch (347:5): [True: 0, False: 88]
  ------------------
  348|      0|					return "Meinberg Undisciplined local clock";
  349|      5|				default:
  ------------------
  |  Branch (349:5): [True: 5, False: 83]
  ------------------
  350|      5|					return "Unknown";
  351|     88|				}
  352|     88|			}
  353|    311|			}
  354|    311|		}
  355|    318|		else
  356|    318|		{
  357|       |			// TODO: Support IPv6 cases for NTPv4, it equals to MD5 hash of first four octets of IPv6 address
  358|       |
  359|    318|			pcpp::IPv4Address addr(getReferenceIdentifier());
  360|    318|			return addr.toString();
  361|    318|		}
  362|       |
  363|    157|		PCPP_LOG_ERROR("Unknown Stratum type");
  ------------------
  |  |  445|    157|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    157|	do                                                                                                                 \
  |  |  |  |  415|    157|	{                                                                                                                  \
  |  |  |  |  416|    157|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    157|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    157|#define LOG_MODULE PacketLogModuleNtpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 157, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    157|		{                                                                                                              \
  |  |  |  |  419|    157|			auto ctx =                                                                                                 \
  |  |  |  |  420|    157|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    157|#define LOG_MODULE PacketLogModuleNtpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    157|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    157|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    157|		}                                                                                                              \
  |  |  |  |  424|    157|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 157]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  364|    157|		return std::string();
  365|  1.23k|	}
_ZNK4pcpp8NtpLayer21getReferenceTimestampEv:
  368|  3.69k|	{
  369|  3.69k|		return getNtpHeader()->referenceTimestamp;
  370|  3.69k|	}
_ZNK4pcpp8NtpLayer27getReferenceTimestampInSecsEv:
  378|  1.23k|	{
  379|  1.23k|		return convertFromTimestampFormat(getReferenceTimestamp());
  380|  1.23k|	}
_ZN4pcpp8NtpLayer27setReferenceTimestampInSecsEd:
  383|  1.23k|	{
  384|  1.23k|		getNtpHeader()->referenceTimestamp = convertToTimestampFormat(val);
  385|  1.23k|	}
_ZN4pcpp8NtpLayer29getReferenceTimestampAsStringEv:
  388|  1.23k|	{
  389|  1.23k|		return convertToIsoFormat(getReferenceTimestamp());
  390|  1.23k|	}
_ZNK4pcpp8NtpLayer18getOriginTimestampEv:
  393|  3.69k|	{
  394|  3.69k|		return getNtpHeader()->originTimestamp;
  395|  3.69k|	}
_ZNK4pcpp8NtpLayer24getOriginTimestampInSecsEv:
  403|  1.23k|	{
  404|  1.23k|		return convertFromTimestampFormat(getOriginTimestamp());
  405|  1.23k|	}
_ZN4pcpp8NtpLayer26getOriginTimestampAsStringEv:
  413|  1.23k|	{
  414|  1.23k|		return convertToIsoFormat(getOriginTimestamp());
  415|  1.23k|	}
_ZNK4pcpp8NtpLayer19getReceiveTimestampEv:
  418|  3.69k|	{
  419|  3.69k|		return getNtpHeader()->receiveTimestamp;
  420|  3.69k|	}
_ZNK4pcpp8NtpLayer25getReceiveTimestampInSecsEv:
  428|  1.23k|	{
  429|  1.23k|		return convertFromTimestampFormat(getReceiveTimestamp());
  430|  1.23k|	}
_ZN4pcpp8NtpLayer27getReceiveTimestampAsStringEv:
  438|  1.23k|	{
  439|  1.23k|		return convertToIsoFormat(getReceiveTimestamp());
  440|  1.23k|	}
_ZNK4pcpp8NtpLayer20getTransmitTimestampEv:
  443|  3.69k|	{
  444|  3.69k|		return getNtpHeader()->transmitTimestamp;
  445|  3.69k|	}
_ZNK4pcpp8NtpLayer26getTransmitTimestampInSecsEv:
  453|  1.23k|	{
  454|  1.23k|		return convertFromTimestampFormat(getTransmitTimestamp());
  455|  1.23k|	}
_ZN4pcpp8NtpLayer28getTransmitTimestampAsStringEv:
  463|  1.23k|	{
  464|  1.23k|		return convertToIsoFormat(getTransmitTimestamp());
  465|  1.23k|	}
_ZNK4pcpp8NtpLayer8getKeyIDEv:
  468|  1.23k|	{
  469|  1.23k|		switch (getVersion())
  470|  1.23k|		{
  471|    214|		case 3:
  ------------------
  |  Branch (471:3): [True: 214, False: 1.01k]
  ------------------
  472|    214|		{
  473|    214|			if (m_DataLen < (sizeof(ntp_header) + sizeof(ntp_v3_auth)))
  ------------------
  |  Branch (473:8): [True: 52, False: 162]
  ------------------
  474|     52|				return 0;
  475|       |
  476|    162|			ntp_v3_auth* header = (ntp_v3_auth*)(m_Data + sizeof(ntp_header));
  477|    162|			return header->keyID;
  478|    214|		}
  479|    552|		case 4:
  ------------------
  |  Branch (479:3): [True: 552, False: 681]
  ------------------
  480|    552|		{
  481|       |			// TODO: Add support for extension fields
  482|    552|			if (m_DataLen == (sizeof(ntp_header) + sizeof(ntp_v4_auth_md5)))
  ------------------
  |  Branch (482:8): [True: 79, False: 473]
  ------------------
  483|     79|			{
  484|     79|				ntp_v4_auth_md5* header = (ntp_v4_auth_md5*)(m_Data + m_DataLen - sizeof(ntp_v4_auth_md5));
  485|     79|				return header->keyID;
  486|     79|			}
  487|    473|			if (m_DataLen == (sizeof(ntp_header) + sizeof(ntp_v4_auth_sha1)))
  ------------------
  |  Branch (487:8): [True: 154, False: 319]
  ------------------
  488|    154|			{
  489|    154|				ntp_v4_auth_sha1* header = (ntp_v4_auth_sha1*)(m_Data + m_DataLen - sizeof(ntp_v4_auth_sha1));
  490|    154|				return header->keyID;
  491|    154|			}
  492|       |
  493|    319|			PCPP_LOG_ERROR("NTP authentication parsing with extension fields are not supported");
  ------------------
  |  |  445|    319|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    319|	do                                                                                                                 \
  |  |  |  |  415|    319|	{                                                                                                                  \
  |  |  |  |  416|    319|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    319|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    319|#define LOG_MODULE PacketLogModuleNtpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 319, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    319|		{                                                                                                              \
  |  |  |  |  419|    319|			auto ctx =                                                                                                 \
  |  |  |  |  420|    319|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    319|#define LOG_MODULE PacketLogModuleNtpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    319|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    319|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    319|		}                                                                                                              \
  |  |  |  |  424|    319|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 319]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  494|    319|			return 0;
  495|    473|		}
  496|    467|		default:
  ------------------
  |  Branch (496:3): [True: 467, False: 766]
  ------------------
  497|    467|		{
  498|    467|			PCPP_LOG_ERROR("NTP version not supported");
  ------------------
  |  |  445|    467|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    467|	do                                                                                                                 \
  |  |  |  |  415|    467|	{                                                                                                                  \
  |  |  |  |  416|    467|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    467|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    467|#define LOG_MODULE PacketLogModuleNtpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 467, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    467|		{                                                                                                              \
  |  |  |  |  419|    467|			auto ctx =                                                                                                 \
  |  |  |  |  420|    467|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    467|#define LOG_MODULE PacketLogModuleNtpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    467|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    467|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    467|		}                                                                                                              \
  |  |  |  |  424|    467|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 467]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  499|    467|			return 0;
  500|    473|		}
  501|  1.23k|		}
  502|  1.23k|	}
_ZNK4pcpp8NtpLayer9getDigestEv:
  505|  1.23k|	{
  506|  1.23k|		switch (getVersion())
  507|  1.23k|		{
  508|    214|		case 3:
  ------------------
  |  Branch (508:3): [True: 214, False: 1.01k]
  ------------------
  509|    214|		{
  510|    214|			if (m_DataLen < (sizeof(ntp_header) + sizeof(ntp_v3_auth)))
  ------------------
  |  Branch (510:8): [True: 52, False: 162]
  ------------------
  511|     52|				return std::string();
  512|       |
  513|    162|			ntp_v3_auth* header = (ntp_v3_auth*)(m_Data + sizeof(ntp_header));
  514|    162|			return byteArrayToHexString(header->dgst, 8);
  515|    214|		}
  516|    552|		case 4:
  ------------------
  |  Branch (516:3): [True: 552, False: 681]
  ------------------
  517|    552|		{
  518|    552|			if (m_DataLen == (sizeof(ntp_header) + sizeof(ntp_v4_auth_md5)))
  ------------------
  |  Branch (518:8): [True: 79, False: 473]
  ------------------
  519|     79|			{
  520|     79|				ntp_v4_auth_md5* header = (ntp_v4_auth_md5*)(m_Data + m_DataLen - sizeof(ntp_v4_auth_md5));
  521|     79|				return byteArrayToHexString(header->dgst, 16);
  522|     79|			}
  523|    473|			if (m_DataLen == (sizeof(ntp_header) + sizeof(ntp_v4_auth_sha1)))
  ------------------
  |  Branch (523:8): [True: 154, False: 319]
  ------------------
  524|    154|			{
  525|    154|				ntp_v4_auth_sha1* header = (ntp_v4_auth_sha1*)(m_Data + m_DataLen - sizeof(ntp_v4_auth_sha1));
  526|    154|				return byteArrayToHexString(header->dgst, 20);
  527|    154|			}
  528|       |
  529|    319|			PCPP_LOG_ERROR("NTP authentication parsing with extension fields are not supported");
  ------------------
  |  |  445|    319|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    319|	do                                                                                                                 \
  |  |  |  |  415|    319|	{                                                                                                                  \
  |  |  |  |  416|    319|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    319|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    319|#define LOG_MODULE PacketLogModuleNtpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 319, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    319|		{                                                                                                              \
  |  |  |  |  419|    319|			auto ctx =                                                                                                 \
  |  |  |  |  420|    319|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    319|#define LOG_MODULE PacketLogModuleNtpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    319|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    319|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    319|		}                                                                                                              \
  |  |  |  |  424|    319|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 319]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  530|    319|			return std::string();
  531|    473|		}
  532|    467|		default:
  ------------------
  |  Branch (532:3): [True: 467, False: 766]
  ------------------
  533|    467|			PCPP_LOG_ERROR("NTP version not supported");
  ------------------
  |  |  445|    467|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    467|	do                                                                                                                 \
  |  |  |  |  415|    467|	{                                                                                                                  \
  |  |  |  |  416|    467|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    467|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    467|#define LOG_MODULE PacketLogModuleNtpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 467, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    467|		{                                                                                                              \
  |  |  |  |  419|    467|			auto ctx =                                                                                                 \
  |  |  |  |  420|    467|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    467|#define LOG_MODULE PacketLogModuleNtpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    467|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    467|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    467|		}                                                                                                              \
  |  |  |  |  424|    467|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 467]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  534|    467|			return std::string();
  535|  1.23k|		}
  536|  1.23k|	}
_ZN4pcpp8NtpLayer22convertFromShortFormatEj:
  539|  2.46k|	{
  540|  2.46k|		double integerPart = netToHost16(val & 0xFFFF);
  541|  2.46k|		double fractionPart = netToHost16(((val & 0xFFFF0000) >> 16)) / NtpFraction16Scale;
  542|       |
  543|  2.46k|		return integerPart + fractionPart;
  544|  2.46k|	}
_ZN4pcpp8NtpLayer26convertFromTimestampFormatEm:
  547|  9.86k|	{
  548|  9.86k|		double integerPart = netToHost32(val & 0xFFFFFFFF);
  549|  9.86k|		double fractionPart = netToHost32(((val & 0xFFFFFFFF00000000) >> 32)) / NtpFraction32Scale;
  550|       |
  551|       |		// TODO: Return integer and fraction parts as struct to increase precision
  552|       |		// Offset change should be done here because of overflow
  553|  9.86k|		return integerPart + fractionPart - NtpEpochOffset;
  554|  9.86k|	}
_ZN4pcpp8NtpLayer20convertToShortFormatEd:
  557|  1.23k|	{
  558|  1.23k|		double integerPart;
  559|  1.23k|		double fractionPart = modf(val, &integerPart);
  560|       |
  561|       |		// Cast values to 16bit
  562|  1.23k|		uint32_t integerPartInt = hostToNet16(integerPart);
  563|  1.23k|		uint32_t fractionPartInt = hostToNet16(fractionPart * NtpFraction16Scale);
  564|       |
  565|  1.23k|		return integerPartInt | (fractionPartInt << 16);
  566|  1.23k|	}
_ZN4pcpp8NtpLayer24convertToTimestampFormatEd:
  569|  1.23k|	{
  570|  1.23k|		double integerPart;
  571|  1.23k|		double fractionPart = modf(val, &integerPart);
  572|       |
  573|       |		// Cast values to 32bit
  574|  1.23k|		uint64_t integerPartInt = hostToNet32(integerPart + NtpEpochOffset);
  575|  1.23k|		uint64_t fractionPartInt = hostToNet32(fractionPart * NtpFraction32Scale);
  576|       |
  577|  1.23k|		return integerPartInt | (fractionPartInt << 32);
  578|  1.23k|	}
_ZN4pcpp8NtpLayer18convertToIsoFormatEd:
  581|  4.93k|	{
  582|  4.93k|		double integerPart;
  583|  4.93k|		double fractionPart = modf(timestamp, &integerPart);
  584|       |
  585|  4.93k|		struct tm* timer;
  586|  4.93k|		time_t timeStruct = integerPart;
  587|       |#if defined(_WIN32)
  588|       |		if (timeStruct < 0)
  589|       |			timeStruct = 0;
  590|       |		timer = gmtime(&timeStruct);
  591|       |#else
  592|  4.93k|		struct tm timer_r;
  593|  4.93k|		timer = gmtime_r(&timeStruct, &timer_r);
  594|       |
  595|  4.93k|		if (timer != nullptr)
  ------------------
  |  Branch (595:7): [True: 4.93k, False: 0]
  ------------------
  596|  4.93k|			timer = &timer_r;
  597|  4.93k|#endif
  598|  4.93k|		if (timer == nullptr)
  ------------------
  |  Branch (598:7): [True: 0, False: 4.93k]
  ------------------
  599|      0|		{
  600|      0|			PCPP_LOG_ERROR("Can't convert time");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleNtpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleNtpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  601|      0|			return std::string();
  602|      0|		}
  603|  4.93k|		char buffer[50], bufferFraction[15];
  604|  4.93k|		strftime(buffer, sizeof(buffer) - sizeof(bufferFraction), "%Y-%m-%dT%H:%M:%S", timer);
  605|       |
  606|  4.93k|		snprintf(bufferFraction, sizeof(bufferFraction), "%.04lfZ", fabs(fractionPart));
  607|  4.93k|		strncat(buffer, &bufferFraction[1], sizeof(bufferFraction));
  608|       |
  609|  4.93k|		return std::string(buffer);
  610|  4.93k|	}
_ZN4pcpp8NtpLayer18convertToIsoFormatEm:
  613|  4.93k|	{
  614|  4.93k|		return convertToIsoFormat(convertFromTimestampFormat(timestampInNTPformat));
  615|  4.93k|	}
_ZN4pcpp8NtpLayer11isDataValidEPKhm:
  618|  7.61k|	{
  619|  7.61k|		return data && dataSize >= sizeof(ntp_header);
  ------------------
  |  Branch (619:10): [True: 7.61k, False: 0]
  |  Branch (619:18): [True: 7.39k, False: 224]
  ------------------
  620|  7.61k|	}
_ZNK4pcpp8NtpLayer8toStringEv:
  690|  2.46k|	{
  691|  2.46k|		return std::string("NTP Layer v") + std::to_string(getVersion()) + ", Mode: " + getModeString();
  692|  2.46k|	}

_ZNK4pcpp17NullLoopbackLayer9getFamilyEv:
   24|  14.2k|	{
   25|  14.2k|		uint32_t family = *(reinterpret_cast<uint32_t*>(m_Data));
   26|  14.2k|		if ((family & 0xFFFF'0000) != 0)
  ------------------
  |  Branch (26:7): [True: 12.5k, False: 1.76k]
  ------------------
   27|  12.5k|		{
   28|  12.5k|			if ((family & 0xFF00'0000) == 0 && (family & 0x00FF'0000) < 0x0006'0000)
  ------------------
  |  Branch (28:8): [True: 11.2k, False: 1.26k]
  |  Branch (28:39): [True: 370, False: 10.8k]
  ------------------
   29|    370|			{
   30|    370|				family >>= 16;
   31|    370|			}
   32|  12.1k|			else
   33|  12.1k|			{
   34|  12.1k|				family = BSWAP32(family);
  ------------------
  |  |   11|  12.1k|#define BSWAP32(x) (((x) >> 24) | (((x) & 0x00FF'0000) >> 8) | (((x) & 0x0000'FF00) << 8) | ((x) << 24))
  ------------------
   35|  12.1k|			}
   36|  12.5k|		}
   37|  1.76k|		else if ((family & 0x0000'00FF) == 0 && (family & 0x0000'FF00) < 0x0000'0600)
  ------------------
  |  Branch (37:12): [True: 420, False: 1.34k]
  |  Branch (37:43): [True: 270, False: 150]
  ------------------
   38|    270|		{
   39|    270|			family = BSWAP16(family & 0xFFFF);
  ------------------
  |  |   10|    270|#define BSWAP16(x) (((x) >> 8) | ((x) << 8))
  ------------------
   40|    270|		}
   41|       |
   42|  14.2k|		return family;
   43|  14.2k|	}
_ZN4pcpp17NullLoopbackLayer14parseNextLayerEv:
   51|  14.2k|	{
   52|  14.2k|		uint8_t* payload = m_Data + sizeof(uint32_t);
   53|  14.2k|		size_t payloadLen = m_DataLen - sizeof(uint32_t);
   54|       |
   55|  14.2k|		uint32_t family = getFamily();
   56|  14.2k|		if (family > Ieee8023MaxLength)
  ------------------
  |  Branch (56:7): [True: 12.4k, False: 1.86k]
  ------------------
   57|  12.4k|		{
   58|  12.4k|			uint16_t ethType = static_cast<uint16_t>(family);
   59|  12.4k|			switch (ethType)
   60|  12.4k|			{
   61|  10.7k|			case PCPP_ETHERTYPE_IP:
  ------------------
  |  |   33|  10.7k|#define PCPP_ETHERTYPE_IP 0x0800
  ------------------
  |  Branch (61:4): [True: 10.7k, False: 1.68k]
  ------------------
   62|  10.7k|			{
   63|  10.7k|				tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen);
   64|  10.7k|				return;
   65|      0|			}
   66|      0|			case PCPP_ETHERTYPE_IPV6:
  ------------------
  |  |   49|      0|#define PCPP_ETHERTYPE_IPV6 0x86dd
  ------------------
  |  Branch (66:4): [True: 0, False: 12.4k]
  ------------------
   67|      0|			{
   68|      0|				tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen);
   69|      0|				return;
   70|      0|			}
   71|  1.68k|			default:
  ------------------
  |  Branch (71:4): [True: 1.68k, False: 10.7k]
  ------------------
   72|  1.68k|			{
   73|  1.68k|				constructNextLayer<PayloadLayer>(payload, payloadLen);
   74|  1.68k|				return;
   75|      0|			}
   76|  12.4k|			}
   77|  12.4k|		}
   78|       |
   79|  1.86k|		switch (family)
   80|  1.86k|		{
   81|    274|		case PCPP_BSD_AF_INET:
  ------------------
  |  |   13|    274|#define PCPP_BSD_AF_INET 2
  ------------------
  |  Branch (81:3): [True: 274, False: 1.58k]
  ------------------
   82|    274|		{
   83|    274|			tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen);
   84|    274|			break;
   85|      0|		}
   86|    316|		case PCPP_BSD_AF_INET6_BSD:
  ------------------
  |  |   23|    316|#define PCPP_BSD_AF_INET6_BSD 24
  ------------------
  |  Branch (86:3): [True: 316, False: 1.54k]
  ------------------
   87|    316|		case PCPP_BSD_AF_INET6_FREEBSD:
  ------------------
  |  |   25|    316|#define PCPP_BSD_AF_INET6_FREEBSD 28
  ------------------
  |  Branch (87:3): [True: 0, False: 1.86k]
  ------------------
   88|    941|		case PCPP_BSD_AF_INET6_DARWIN:
  ------------------
  |  |   27|    941|#define PCPP_BSD_AF_INET6_DARWIN 30
  ------------------
  |  Branch (88:3): [True: 625, False: 1.23k]
  ------------------
   89|    941|		{
   90|    941|			tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen);
   91|    941|			break;
   92|    316|		}
   93|    645|		default:
  ------------------
  |  Branch (93:3): [True: 645, False: 1.21k]
  ------------------
   94|    645|		{
   95|    645|			constructNextLayer<PayloadLayer>(payload, payloadLen);
   96|    645|			break;
   97|    316|		}
   98|  1.86k|		}
   99|  1.86k|	}
_ZNK4pcpp17NullLoopbackLayer8toStringEv:
  102|  5.52k|	{
  103|  5.52k|		return "Null/Loopback";
  104|  5.52k|	}

_ZN4pcpp10PPPoELayer22computeCalculateFieldsEv:
   33|  3.59k|	{
   34|  3.59k|		pppoe_header* pppoeHdr = getPPPoEHeader();
   35|       |		pppoeHdr->payloadLength = htobe16(m_DataLen - sizeof(pppoe_header));
   36|  3.59k|	}
_ZN4pcpp17PPPoESessionLayer14parseNextLayerEv:
   56|  22.1k|	{
   57|  22.1k|		size_t headerLen = getHeaderLen();
   58|  22.1k|		if (m_DataLen <= headerLen)
  ------------------
  |  Branch (58:7): [True: 780, False: 21.3k]
  ------------------
   59|    780|			return;
   60|       |
   61|  21.3k|		uint8_t* payload = m_Data + headerLen;
   62|  21.3k|		size_t payloadLen = m_DataLen - headerLen;
   63|       |
   64|  21.3k|		switch (getPPPNextProtocol())
   65|  21.3k|		{
   66|  17.2k|		case PCPP_PPP_IP:
  ------------------
  |  |  457|  17.2k|#define PCPP_PPP_IP 0x21
  ------------------
  |  Branch (66:3): [True: 17.2k, False: 4.06k]
  ------------------
   67|  17.2k|			tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen);
   68|  17.2k|			break;
   69|  3.46k|		case PCPP_PPP_IPV6:
  ------------------
  |  |  509|  3.46k|#define PCPP_PPP_IPV6 0x57
  ------------------
  |  Branch (69:3): [True: 3.46k, False: 17.8k]
  ------------------
   70|  3.46k|			tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen);
   71|  3.46k|			break;
   72|    598|		default:
  ------------------
  |  Branch (72:3): [True: 598, False: 20.7k]
  ------------------
   73|    598|			constructNextLayer<PayloadLayer>(payload, payloadLen);
   74|    598|			break;
   75|  21.3k|		}
   76|  21.3k|	}
_ZNK4pcpp17PPPoESessionLayer18getPPPNextProtocolEv:
   79|  27.3k|	{
   80|  27.3k|		if (m_DataLen < getHeaderLen())
  ------------------
  |  Branch (80:7): [True: 0, False: 27.3k]
  ------------------
   81|      0|		{
   82|      0|			PCPP_LOG_ERROR("ERROR: size of layer is smaller then PPPoE session header");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModulePPPoELayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModulePPPoELayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   83|      0|			return 0;
   84|      0|		}
   85|       |
   86|  27.3k|		uint16_t pppNextProto = *reinterpret_cast<uint16_t*>(m_Data + sizeof(pppoe_header));
   87|       |		return be16toh(pppNextProto);
   88|  27.3k|	}
_ZN4pcpp29createPPPNextProtoToStringMapEv:
  103|      2|	{
  104|      2|		std::unordered_map<uint16_t, std::string> tempMap;
  105|      2|		tempMap[PCPP_PPP_PADDING] = "Padding Protocol";
  ------------------
  |  |  451|      2|#define PCPP_PPP_PADDING 0x1
  ------------------
  106|      2|		tempMap[PCPP_PPP_ROHC_SCID] = "ROHC small-CID";
  ------------------
  |  |  453|      2|#define PCPP_PPP_ROHC_SCID 0x3
  ------------------
  107|      2|		tempMap[PCPP_PPP_ROHC_LCID] = "ROHC large-CID";
  ------------------
  |  |  455|      2|#define PCPP_PPP_ROHC_LCID 0x5
  ------------------
  108|      2|		tempMap[PCPP_PPP_IP] = "Internet Protocol version 4";
  ------------------
  |  |  457|      2|#define PCPP_PPP_IP 0x21
  ------------------
  109|      2|		tempMap[PCPP_PPP_OSI] = "OSI Network Layer";
  ------------------
  |  |  459|      2|#define PCPP_PPP_OSI 0x23
  ------------------
  110|      2|		tempMap[PCPP_PPP_XNSIDP] = "Xerox NS IDP";
  ------------------
  |  |  461|      2|#define PCPP_PPP_XNSIDP 0x25
  ------------------
  111|      2|		tempMap[PCPP_PPP_DEC4] = "DECnet Phase IV";
  ------------------
  |  |  463|      2|#define PCPP_PPP_DEC4 0x27
  ------------------
  112|      2|		tempMap[PCPP_PPP_AT] = "Appletalk";
  ------------------
  |  |  465|      2|#define PCPP_PPP_AT 0x29
  ------------------
  113|      2|		tempMap[PCPP_PPP_IPX] = "Novell IPX";
  ------------------
  |  |  467|      2|#define PCPP_PPP_IPX 0x2b
  ------------------
  114|      2|		tempMap[PCPP_PPP_VJC_COMP] = "Van Jacobson Compressed TCP/IP";
  ------------------
  |  |  469|      2|#define PCPP_PPP_VJC_COMP 0x2d
  ------------------
  115|      2|		tempMap[PCPP_PPP_VJC_UNCOMP] = "Van Jacobson Uncompressed TCP/IP";
  ------------------
  |  |  471|      2|#define PCPP_PPP_VJC_UNCOMP 0x2f
  ------------------
  116|      2|		tempMap[PCPP_PPP_BCP] = "Bridging PDU";
  ------------------
  |  |  473|      2|#define PCPP_PPP_BCP 0x31
  ------------------
  117|      2|		tempMap[PCPP_PPP_ST] = "Stream Protocol (ST-II)";
  ------------------
  |  |  475|      2|#define PCPP_PPP_ST 0x33
  ------------------
  118|      2|		tempMap[PCPP_PPP_VINES] = "Banyan Vines";
  ------------------
  |  |  477|      2|#define PCPP_PPP_VINES 0x35
  ------------------
  119|      2|		tempMap[PCPP_PPP_AT_EDDP] = "AppleTalk EDDP";
  ------------------
  |  |  479|      2|#define PCPP_PPP_AT_EDDP 0x39
  ------------------
  120|      2|		tempMap[PCPP_PPP_AT_SB] = "AppleTalk SmartBuffered";
  ------------------
  |  |  481|      2|#define PCPP_PPP_AT_SB 0x3b
  ------------------
  121|      2|		tempMap[PCPP_PPP_MP] = "Multi-Link";
  ------------------
  |  |  483|      2|#define PCPP_PPP_MP 0x3d
  ------------------
  122|      2|		tempMap[PCPP_PPP_NB] = "NETBIOS Framing";
  ------------------
  |  |  485|      2|#define PCPP_PPP_NB 0x3f
  ------------------
  123|      2|		tempMap[PCPP_PPP_CISCO] = "Cisco Systems";
  ------------------
  |  |  487|      2|#define PCPP_PPP_CISCO 0x41
  ------------------
  124|      2|		tempMap[PCPP_PPP_ASCOM] = "Ascom Timeplex";
  ------------------
  |  |  489|      2|#define PCPP_PPP_ASCOM 0x43
  ------------------
  125|      2|		tempMap[PCPP_PPP_LBLB] = "Fujitsu Link Backup and Load Balancing (LBLB)";
  ------------------
  |  |  491|      2|#define PCPP_PPP_LBLB 0x45
  ------------------
  126|      2|		tempMap[PCPP_PPP_RL] = "DCA Remote Lan";
  ------------------
  |  |  493|      2|#define PCPP_PPP_RL 0x47
  ------------------
  127|      2|		tempMap[PCPP_PPP_SDTP] = "Serial Data Transport Protocol (PPP-SDTP)";
  ------------------
  |  |  495|      2|#define PCPP_PPP_SDTP 0x49
  ------------------
  128|      2|		tempMap[PCPP_PPP_LLC] = "SNA over 802.2";
  ------------------
  |  |  497|      2|#define PCPP_PPP_LLC 0x4b
  ------------------
  129|      2|		tempMap[PCPP_PPP_SNA] = "SNA";
  ------------------
  |  |  499|      2|#define PCPP_PPP_SNA 0x4d
  ------------------
  130|      2|		tempMap[PCPP_PPP_IPV6HC] = "IPv6 Header Compression ";
  ------------------
  |  |  501|      2|#define PCPP_PPP_IPV6HC 0x4f
  ------------------
  131|      2|		tempMap[PCPP_PPP_KNX] = "KNX Bridging Data";
  ------------------
  |  |  503|      2|#define PCPP_PPP_KNX 0x51
  ------------------
  132|      2|		tempMap[PCPP_PPP_ENCRYPT] = "Encryption";
  ------------------
  |  |  505|      2|#define PCPP_PPP_ENCRYPT 0x53
  ------------------
  133|      2|		tempMap[PCPP_PPP_ILE] = "Individual Link Encryption";
  ------------------
  |  |  507|      2|#define PCPP_PPP_ILE 0x55
  ------------------
  134|      2|		tempMap[PCPP_PPP_IPV6] = "Internet Protocol version 6";
  ------------------
  |  |  509|      2|#define PCPP_PPP_IPV6 0x57
  ------------------
  135|      2|		tempMap[PCPP_PPP_MUX] = "PPP Muxing";
  ------------------
  |  |  511|      2|#define PCPP_PPP_MUX 0x59
  ------------------
  136|      2|		tempMap[PCPP_PPP_VSNP] = "Vendor-Specific Network Protocol (VSNP)";
  ------------------
  |  |  513|      2|#define PCPP_PPP_VSNP 0x5b
  ------------------
  137|      2|		tempMap[PCPP_PPP_TNP] = "TRILL Network Protocol (TNP)";
  ------------------
  |  |  515|      2|#define PCPP_PPP_TNP 0x5d
  ------------------
  138|      2|		tempMap[PCPP_PPP_RTP_FH] = "RTP IPHC Full Header";
  ------------------
  |  |  517|      2|#define PCPP_PPP_RTP_FH 0x61
  ------------------
  139|      2|		tempMap[PCPP_PPP_RTP_CTCP] = "RTP IPHC Compressed TCP";
  ------------------
  |  |  519|      2|#define PCPP_PPP_RTP_CTCP 0x63
  ------------------
  140|      2|		tempMap[PCPP_PPP_RTP_CNTCP] = "RTP IPHC Compressed Non TCP";
  ------------------
  |  |  521|      2|#define PCPP_PPP_RTP_CNTCP 0x65
  ------------------
  141|      2|		tempMap[PCPP_PPP_RTP_CUDP8] = "RTP IPHC Compressed UDP 8";
  ------------------
  |  |  523|      2|#define PCPP_PPP_RTP_CUDP8 0x67
  ------------------
  142|      2|		tempMap[PCPP_PPP_RTP_CRTP8] = "RTP IPHC Compressed RTP 8";
  ------------------
  |  |  525|      2|#define PCPP_PPP_RTP_CRTP8 0x69
  ------------------
  143|      2|		tempMap[PCPP_PPP_STAMPEDE] = "Stampede Bridging";
  ------------------
  |  |  527|      2|#define PCPP_PPP_STAMPEDE 0x6f
  ------------------
  144|      2|		tempMap[PCPP_PPP_MPPLUS] = "MP+ Protocol";
  ------------------
  |  |  529|      2|#define PCPP_PPP_MPPLUS 0x73
  ------------------
  145|      2|		tempMap[PCPP_PPP_NTCITS_IPI] = "NTCITS IPI";
  ------------------
  |  |  531|      2|#define PCPP_PPP_NTCITS_IPI 0xc1
  ------------------
  146|      2|		tempMap[PCPP_PPP_ML_SLCOMP] = "Single link compression in multilink";
  ------------------
  |  |  533|      2|#define PCPP_PPP_ML_SLCOMP 0xfb
  ------------------
  147|      2|		tempMap[PCPP_PPP_COMP] = "Compressed datagram";
  ------------------
  |  |  535|      2|#define PCPP_PPP_COMP 0xfd
  ------------------
  148|      2|		tempMap[PCPP_PPP_STP_HELLO] = "802.1d Hello Packets";
  ------------------
  |  |  537|      2|#define PCPP_PPP_STP_HELLO 0x0201
  ------------------
  149|      2|		tempMap[PCPP_PPP_IBM_SR] = "IBM Source Routing BPDU";
  ------------------
  |  |  539|      2|#define PCPP_PPP_IBM_SR 0x0203
  ------------------
  150|      2|		tempMap[PCPP_PPP_DEC_LB] = "DEC LANBridge100 Spanning Tree";
  ------------------
  |  |  541|      2|#define PCPP_PPP_DEC_LB 0x0205
  ------------------
  151|      2|		tempMap[PCPP_PPP_CDP] = "Cisco Discovery Protocol";
  ------------------
  |  |  543|      2|#define PCPP_PPP_CDP 0x0207
  ------------------
  152|      2|		tempMap[PCPP_PPP_NETCS] = "Netcs Twin Routing";
  ------------------
  |  |  545|      2|#define PCPP_PPP_NETCS 0x0209
  ------------------
  153|      2|		tempMap[PCPP_PPP_STP] = "STP - Scheduled Transfer Protocol";
  ------------------
  |  |  547|      2|#define PCPP_PPP_STP 0x020b
  ------------------
  154|      2|		tempMap[PCPP_PPP_EDP] = "EDP - Extreme Discovery Protocol";
  ------------------
  |  |  549|      2|#define PCPP_PPP_EDP 0x020d
  ------------------
  155|      2|		tempMap[PCPP_PPP_OSCP] = "Optical Supervisory Channel Protocol (OSCP)";
  ------------------
  |  |  551|      2|#define PCPP_PPP_OSCP 0x0211
  ------------------
  156|      2|		tempMap[PCPP_PPP_OSCP2] = "Optical Supervisory Channel Protocol (OSCP)";
  ------------------
  |  |  553|      2|#define PCPP_PPP_OSCP2 0x0213
  ------------------
  157|      2|		tempMap[PCPP_PPP_LUXCOM] = "Luxcom";
  ------------------
  |  |  555|      2|#define PCPP_PPP_LUXCOM 0x0231
  ------------------
  158|      2|		tempMap[PCPP_PPP_SIGMA] = "Sigma Network Systems";
  ------------------
  |  |  557|      2|#define PCPP_PPP_SIGMA 0x0233
  ------------------
  159|      2|		tempMap[PCPP_PPP_ACSP] = "Apple Client Server Protocol";
  ------------------
  |  |  559|      2|#define PCPP_PPP_ACSP 0x0235
  ------------------
  160|      2|		tempMap[PCPP_PPP_MPLS_UNI] = "MPLS Unicast";
  ------------------
  |  |  561|      2|#define PCPP_PPP_MPLS_UNI 0x0281
  ------------------
  161|      2|		tempMap[PCPP_PPP_MPLS_MULTI] = "MPLS Multicast";
  ------------------
  |  |  563|      2|#define PCPP_PPP_MPLS_MULTI 0x0283
  ------------------
  162|      2|		tempMap[PCPP_PPP_P12844] = "IEEE p1284.4 standard - data packets";
  ------------------
  |  |  565|      2|#define PCPP_PPP_P12844 0x0285
  ------------------
  163|      2|		tempMap[PCPP_PPP_TETRA] = "ETSI TETRA Network Protocol Type 1";
  ------------------
  |  |  567|      2|#define PCPP_PPP_TETRA 0x0287
  ------------------
  164|      2|		tempMap[PCPP_PPP_MFTP] = "Multichannel Flow Treatment Protocol";
  ------------------
  |  |  569|      2|#define PCPP_PPP_MFTP 0x0289
  ------------------
  165|      2|		tempMap[PCPP_PPP_RTP_CTCPND] = "RTP IPHC Compressed TCP No Delta";
  ------------------
  |  |  571|      2|#define PCPP_PPP_RTP_CTCPND 0x2063
  ------------------
  166|      2|		tempMap[PCPP_PPP_RTP_CS] = "RTP IPHC Context State";
  ------------------
  |  |  573|      2|#define PCPP_PPP_RTP_CS 0x2065
  ------------------
  167|      2|		tempMap[PCPP_PPP_RTP_CUDP16] = "RTP IPHC Compressed UDP 16";
  ------------------
  |  |  575|      2|#define PCPP_PPP_RTP_CUDP16 0x2067
  ------------------
  168|      2|		tempMap[PCPP_PPP_RTP_CRDP16] = "RTP IPHC Compressed RTP 16";
  ------------------
  |  |  577|      2|#define PCPP_PPP_RTP_CRDP16 0x2069
  ------------------
  169|      2|		tempMap[PCPP_PPP_CCCP] = "Cray Communications Control Protocol";
  ------------------
  |  |  579|      2|#define PCPP_PPP_CCCP 0x4001
  ------------------
  170|      2|		tempMap[PCPP_PPP_CDPD_MNRP] = "CDPD Mobile Network Registration Protocol";
  ------------------
  |  |  581|      2|#define PCPP_PPP_CDPD_MNRP 0x4003
  ------------------
  171|      2|		tempMap[PCPP_PPP_EXPANDAP] = "Expand accelerator protocol";
  ------------------
  |  |  583|      2|#define PCPP_PPP_EXPANDAP 0x4005
  ------------------
  172|      2|		tempMap[PCPP_PPP_ODSICP] = "ODSICP NCP";
  ------------------
  |  |  585|      2|#define PCPP_PPP_ODSICP 0x4007
  ------------------
  173|      2|		tempMap[PCPP_PPP_DOCSIS] = "DOCSIS DLL";
  ------------------
  |  |  587|      2|#define PCPP_PPP_DOCSIS 0x4009
  ------------------
  174|      2|		tempMap[PCPP_PPP_CETACEANNDP] = "Cetacean Network Detection Protocol";
  ------------------
  |  |  589|      2|#define PCPP_PPP_CETACEANNDP 0x400b
  ------------------
  175|      2|		tempMap[PCPP_PPP_LZS] = "Stacker LZS";
  ------------------
  |  |  591|      2|#define PCPP_PPP_LZS 0x4021
  ------------------
  176|      2|		tempMap[PCPP_PPP_REFTEK] = "RefTek Protocol";
  ------------------
  |  |  593|      2|#define PCPP_PPP_REFTEK 0x4023
  ------------------
  177|      2|		tempMap[PCPP_PPP_FC] = "Fibre Channel";
  ------------------
  |  |  595|      2|#define PCPP_PPP_FC 0x4025
  ------------------
  178|      2|		tempMap[PCPP_PPP_EMIT] = "EMIT Protocols";
  ------------------
  |  |  597|      2|#define PCPP_PPP_EMIT 0x4027
  ------------------
  179|      2|		tempMap[PCPP_PPP_VSP] = "Vendor-Specific Protocol (VSP)";
  ------------------
  |  |  599|      2|#define PCPP_PPP_VSP 0x405b
  ------------------
  180|      2|		tempMap[PCPP_PPP_TLSP] = "TRILL Link State Protocol (TLSP)";
  ------------------
  |  |  601|      2|#define PCPP_PPP_TLSP 0x405d
  ------------------
  181|      2|		tempMap[PCPP_PPP_IPCP] = "Internet Protocol Control Protocol";
  ------------------
  |  |  603|      2|#define PCPP_PPP_IPCP 0x8021
  ------------------
  182|      2|		tempMap[PCPP_PPP_OSINLCP] = "OSI Network Layer Control Protocol";
  ------------------
  |  |  605|      2|#define PCPP_PPP_OSINLCP 0x8023
  ------------------
  183|      2|		tempMap[PCPP_PPP_XNSIDPCP] = "Xerox NS IDP Control Protocol";
  ------------------
  |  |  607|      2|#define PCPP_PPP_XNSIDPCP 0x8025
  ------------------
  184|      2|		tempMap[PCPP_PPP_DECNETCP] = "DECnet Phase IV Control Protocol";
  ------------------
  |  |  609|      2|#define PCPP_PPP_DECNETCP 0x8027
  ------------------
  185|      2|		tempMap[PCPP_PPP_ATCP] = "AppleTalk Control Protocol";
  ------------------
  |  |  611|      2|#define PCPP_PPP_ATCP 0x8029
  ------------------
  186|      2|		tempMap[PCPP_PPP_IPXCP] = "Novell IPX Control Protocol";
  ------------------
  |  |  613|      2|#define PCPP_PPP_IPXCP 0x802b
  ------------------
  187|      2|		tempMap[PCPP_PPP_BRIDGENCP] = "Bridging NCP";
  ------------------
  |  |  615|      2|#define PCPP_PPP_BRIDGENCP 0x8031
  ------------------
  188|      2|		tempMap[PCPP_PPP_SPCP] = "Stream Protocol Control Protocol";
  ------------------
  |  |  617|      2|#define PCPP_PPP_SPCP 0x8033
  ------------------
  189|      2|		tempMap[PCPP_PPP_BVCP] = "Banyan Vines Control Protocol";
  ------------------
  |  |  619|      2|#define PCPP_PPP_BVCP 0x8035
  ------------------
  190|      2|		tempMap[PCPP_PPP_MLCP] = "Multi-Link Control Protocol";
  ------------------
  |  |  621|      2|#define PCPP_PPP_MLCP 0x803d
  ------------------
  191|      2|		tempMap[PCPP_PPP_NBCP] = "NETBIOS Framing Control Protocol";
  ------------------
  |  |  623|      2|#define PCPP_PPP_NBCP 0x803f
  ------------------
  192|      2|		tempMap[PCPP_PPP_CISCOCP] = "Cisco Systems Control Protocol";
  ------------------
  |  |  625|      2|#define PCPP_PPP_CISCOCP 0x8041
  ------------------
  193|      2|		tempMap[PCPP_PPP_ASCOMCP] = "Ascom Timeplex";
  ------------------
  |  |  627|      2|#define PCPP_PPP_ASCOMCP 0x8043
  ------------------
  194|      2|		tempMap[PCPP_PPP_LBLBCP] = "Fujitsu LBLB Control Protocol";
  ------------------
  |  |  629|      2|#define PCPP_PPP_LBLBCP 0x8045
  ------------------
  195|      2|		tempMap[PCPP_PPP_RLNCP] = "DCA Remote Lan Network Control Protocol (RLNCP)";
  ------------------
  |  |  631|      2|#define PCPP_PPP_RLNCP 0x8047
  ------------------
  196|      2|		tempMap[PCPP_PPP_SDCP] = "Serial Data Control Protocol (PPP-SDCP)";
  ------------------
  |  |  633|      2|#define PCPP_PPP_SDCP 0x8049
  ------------------
  197|      2|		tempMap[PCPP_PPP_LLCCP] = "SNA over 802.2 Control Protocol";
  ------------------
  |  |  635|      2|#define PCPP_PPP_LLCCP 0x804b
  ------------------
  198|      2|		tempMap[PCPP_PPP_SNACP] = "SNA Control Protocol";
  ------------------
  |  |  637|      2|#define PCPP_PPP_SNACP 0x804d
  ------------------
  199|      2|		tempMap[PCPP_PPP_IP6HCCP] = "IP6 Header Compression Control Protocol";
  ------------------
  |  |  639|      2|#define PCPP_PPP_IP6HCCP 0x804f
  ------------------
  200|      2|		tempMap[PCPP_PPP_KNXCP] = "KNX Bridging Control Protocol";
  ------------------
  |  |  641|      2|#define PCPP_PPP_KNXCP 0x8051
  ------------------
  201|      2|		tempMap[PCPP_PPP_ECP] = "Encryption Control Protocol";
  ------------------
  |  |  643|      2|#define PCPP_PPP_ECP 0x8053
  ------------------
  202|      2|		tempMap[PCPP_PPP_ILECP] = "Individual Link Encryption Control Protocol";
  ------------------
  |  |  645|      2|#define PCPP_PPP_ILECP 0x8055
  ------------------
  203|      2|		tempMap[PCPP_PPP_IPV6CP] = "IPv6 Control Protocol";
  ------------------
  |  |  647|      2|#define PCPP_PPP_IPV6CP 0x8057
  ------------------
  204|      2|		tempMap[PCPP_PPP_MUXCP] = "PPP Muxing Control Protocol";
  ------------------
  |  |  649|      2|#define PCPP_PPP_MUXCP 0x8059
  ------------------
  205|      2|		tempMap[PCPP_PPP_VSNCP] = "Vendor-Specific Network Control Protocol (VSNCP)";
  ------------------
  |  |  651|      2|#define PCPP_PPP_VSNCP 0x805b
  ------------------
  206|      2|		tempMap[PCPP_PPP_TNCP] = "TRILL Network Control Protocol";
  ------------------
  |  |  653|      2|#define PCPP_PPP_TNCP 0x805d
  ------------------
  207|      2|		tempMap[PCPP_PPP_STAMPEDECP] = "Stampede Bridging Control Protocol";
  ------------------
  |  |  655|      2|#define PCPP_PPP_STAMPEDECP 0x806f
  ------------------
  208|      2|		tempMap[PCPP_PPP_MPPCP] = "MP+ Control Protocol";
  ------------------
  |  |  657|      2|#define PCPP_PPP_MPPCP 0x8073
  ------------------
  209|      2|		tempMap[PCPP_PPP_IPICP] = "NTCITS IPI Control Protocol";
  ------------------
  |  |  659|      2|#define PCPP_PPP_IPICP 0x80c1
  ------------------
  210|      2|		tempMap[PCPP_PPP_SLCC] = "Single link compression in multilink control";
  ------------------
  |  |  661|      2|#define PCPP_PPP_SLCC 0x80fb
  ------------------
  211|      2|		tempMap[PCPP_PPP_CCP] = "Compression Control Protocol";
  ------------------
  |  |  663|      2|#define PCPP_PPP_CCP 0x80fd
  ------------------
  212|      2|		tempMap[PCPP_PPP_CDPCP] = "Cisco Discovery Protocol Control Protocol";
  ------------------
  |  |  665|      2|#define PCPP_PPP_CDPCP 0x8207
  ------------------
  213|      2|		tempMap[PCPP_PPP_NETCSCP] = "Netcs Twin Routing";
  ------------------
  |  |  667|      2|#define PCPP_PPP_NETCSCP 0x8209
  ------------------
  214|      2|		tempMap[PCPP_PPP_STPCP] = "STP - Control Protocol";
  ------------------
  |  |  669|      2|#define PCPP_PPP_STPCP 0x820b
  ------------------
  215|      2|		tempMap[PCPP_PPP_EDPCP] = "EDPCP - Extreme Discovery Protocol Control Protocol";
  ------------------
  |  |  671|      2|#define PCPP_PPP_EDPCP 0x820d
  ------------------
  216|      2|		tempMap[PCPP_PPP_ACSPC] = "Apple Client Server Protocol Control";
  ------------------
  |  |  673|      2|#define PCPP_PPP_ACSPC 0x8235
  ------------------
  217|      2|		tempMap[PCPP_PPP_MPLSCP] = "MPLS Control Protocol";
  ------------------
  |  |  675|      2|#define PCPP_PPP_MPLSCP 0x8281
  ------------------
  218|      2|		tempMap[PCPP_PPP_P12844CP] = "IEEE p1284.4 standard - Protocol Control";
  ------------------
  |  |  677|      2|#define PCPP_PPP_P12844CP 0x8285
  ------------------
  219|      2|		tempMap[PCPP_PPP_TETRACP] = "ETSI TETRA TNP1 Control Protocol";
  ------------------
  |  |  679|      2|#define PCPP_PPP_TETRACP 0x8287
  ------------------
  220|      2|		tempMap[PCPP_PPP_MFTPCP] = "Multichannel Flow Treatment Protocol";
  ------------------
  |  |  681|      2|#define PCPP_PPP_MFTPCP 0x8289
  ------------------
  221|      2|		tempMap[PCPP_PPP_LCP] = "Link Control Protocol";
  ------------------
  |  |  683|      2|#define PCPP_PPP_LCP 0xc021
  ------------------
  222|      2|		tempMap[PCPP_PPP_PAP] = "Password Authentication Protocol";
  ------------------
  |  |  685|      2|#define PCPP_PPP_PAP 0xc023
  ------------------
  223|      2|		tempMap[PCPP_PPP_LQR] = "Link Quality Report";
  ------------------
  |  |  687|      2|#define PCPP_PPP_LQR 0xc025
  ------------------
  224|      2|		tempMap[PCPP_PPP_SPAP] = "Shiva Password Authentication Protocol";
  ------------------
  |  |  689|      2|#define PCPP_PPP_SPAP 0xc027
  ------------------
  225|      2|		tempMap[PCPP_PPP_CBCP] = "Callback Control Protocol (CBCP)";
  ------------------
  |  |  691|      2|#define PCPP_PPP_CBCP 0xc029
  ------------------
  226|      2|		tempMap[PCPP_PPP_BACP] = "BACP Bandwidth Allocation Control Protocol";
  ------------------
  |  |  693|      2|#define PCPP_PPP_BACP 0xc02b
  ------------------
  227|      2|		tempMap[PCPP_PPP_BAP] = "BAP Bandwidth Allocation Protocol";
  ------------------
  |  |  695|      2|#define PCPP_PPP_BAP 0xc02d
  ------------------
  228|      2|		tempMap[PCPP_PPP_VSAP] = "Vendor-Specific Authentication Protocol (VSAP)";
  ------------------
  |  |  697|      2|#define PCPP_PPP_VSAP 0xc05b
  ------------------
  229|      2|		tempMap[PCPP_PPP_CONTCP] = "Container Control Protocol";
  ------------------
  |  |  699|      2|#define PCPP_PPP_CONTCP 0xc081
  ------------------
  230|      2|		tempMap[PCPP_PPP_CHAP] = "Challenge Handshake Authentication Protocol";
  ------------------
  |  |  701|      2|#define PCPP_PPP_CHAP 0xc223
  ------------------
  231|      2|		tempMap[PCPP_PPP_RSAAP] = "RSA Authentication Protocol";
  ------------------
  |  |  703|      2|#define PCPP_PPP_RSAAP 0xc225
  ------------------
  232|      2|		tempMap[PCPP_PPP_EAP] = "Extensible Authentication Protocol";
  ------------------
  |  |  705|      2|#define PCPP_PPP_EAP 0xc227
  ------------------
  233|      2|		tempMap[PCPP_PPP_SIEP] = "Mitsubishi Security Information Exchange Protocol (SIEP)";
  ------------------
  |  |  707|      2|#define PCPP_PPP_SIEP 0xc229
  ------------------
  234|      2|		tempMap[PCPP_PPP_SBAP] = "Stampede Bridging Authorization Protocol";
  ------------------
  |  |  709|      2|#define PCPP_PPP_SBAP 0xc26f
  ------------------
  235|      2|		tempMap[PCPP_PPP_PRPAP] = "Proprietary Authentication Protocol";
  ------------------
  |  |  711|      2|#define PCPP_PPP_PRPAP 0xc281
  ------------------
  236|      2|		tempMap[PCPP_PPP_PRPAP2] = "Proprietary Authentication Protocol";
  ------------------
  |  |  713|      2|#define PCPP_PPP_PRPAP2 0xc283
  ------------------
  237|      2|		tempMap[PCPP_PPP_PRPNIAP] = "Proprietary Node ID Authentication Protocol";
  ------------------
  |  |  715|      2|#define PCPP_PPP_PRPNIAP 0xc481
  ------------------
  238|      2|		return tempMap;
  239|      2|	}
_ZNK4pcpp17PPPoESessionLayer8toStringEv:
  244|  5.37k|	{
  245|  5.37k|		auto findResult = PPPNextProtoToString.find(getPPPNextProtocol());
  246|  5.37k|		std::string nextProtocol;
  247|  5.37k|		if (findResult != PPPNextProtoToString.end())
  ------------------
  |  Branch (247:7): [True: 4.73k, False: 638]
  ------------------
  248|  4.73k|			nextProtocol = findResult->second;
  249|    638|		else
  250|    638|		{
  251|    638|			std::ostringstream stream;
  252|    638|			stream << "Unknown (0x" << std::hex << getPPPNextProtocol() << ")";
  253|    638|			nextProtocol = stream.str();
  254|    638|		}
  255|       |
  256|  5.37k|		return "PPP-over-Ethernet Session (followed by '" + nextProtocol + "')";
  257|  5.37k|	}
_ZNK4pcpp19PPPoEDiscoveryLayer12getHeaderLenEv:
  378|  4.27k|	{
  379|  4.27k|		size_t payloadLen = sizeof(pppoe_header) + be16toh(getPPPoEHeader()->payloadLength);
  380|  4.27k|		if (payloadLen > m_DataLen)
  ------------------
  |  Branch (380:7): [True: 1.11k, False: 3.16k]
  ------------------
  381|  1.11k|			return m_DataLen;
  382|       |
  383|  3.16k|		return payloadLen;
  384|  4.27k|	}
_ZNK4pcpp19PPPoEDiscoveryLayer12codeToStringENS_10PPPoELayer9PPPoECodeE:
  424|  1.81k|	{
  425|  1.81k|		switch (code)
  426|  1.81k|		{
  427|      2|		case PPPoELayer::PPPOE_CODE_SESSION:
  ------------------
  |  Branch (427:3): [True: 2, False: 1.81k]
  ------------------
  428|      2|			return std::string("PPPoE Session");
  429|      0|		case PPPoELayer::PPPOE_CODE_PADO:
  ------------------
  |  Branch (429:3): [True: 0, False: 1.81k]
  ------------------
  430|      0|			return std::string("PADO");
  431|    714|		case PPPoELayer::PPPOE_CODE_PADI:
  ------------------
  |  Branch (431:3): [True: 714, False: 1.10k]
  ------------------
  432|    714|			return std::string("PADI");
  433|    438|		case PPPoELayer::PPPOE_CODE_PADG:
  ------------------
  |  Branch (433:3): [True: 438, False: 1.38k]
  ------------------
  434|    438|			return std::string("PADG");
  435|      0|		case PPPoELayer::PPPOE_CODE_PADC:
  ------------------
  |  Branch (435:3): [True: 0, False: 1.81k]
  ------------------
  436|      0|			return std::string("PADC");
  437|      0|		case PPPoELayer::PPPOE_CODE_PADQ:
  ------------------
  |  Branch (437:3): [True: 0, False: 1.81k]
  ------------------
  438|      0|			return std::string("PADQ");
  439|     48|		case PPPoELayer::PPPOE_CODE_PADR:
  ------------------
  |  Branch (439:3): [True: 48, False: 1.77k]
  ------------------
  440|     48|			return std::string("PADR");
  441|    360|		case PPPoELayer::PPPOE_CODE_PADS:
  ------------------
  |  Branch (441:3): [True: 360, False: 1.45k]
  ------------------
  442|    360|			return std::string("PADS");
  443|      0|		case PPPoELayer::PPPOE_CODE_PADT:
  ------------------
  |  Branch (443:3): [True: 0, False: 1.81k]
  ------------------
  444|      0|			return std::string("PADT");
  445|      0|		case PPPoELayer::PPPOE_CODE_PADM:
  ------------------
  |  Branch (445:3): [True: 0, False: 1.81k]
  ------------------
  446|      0|			return std::string("PADM");
  447|     36|		case PPPoELayer::PPPOE_CODE_PADN:
  ------------------
  |  Branch (447:3): [True: 36, False: 1.78k]
  ------------------
  448|     36|			return std::string("PADN");
  449|    220|		default:
  ------------------
  |  Branch (449:3): [True: 220, False: 1.59k]
  ------------------
  450|    220|			return std::string("Unknown PPPoE code");
  451|  1.81k|		}
  452|  1.81k|	}

_ZN4pcpp6Packet12setRawPacketEPNS_9RawPacketEbjNS_13OsiModelLayerE:
   50|   166k|	{
   51|   166k|		destructPacketData();
   52|       |
   53|   166k|		m_FirstLayer = nullptr;
   54|   166k|		m_LastLayer = nullptr;
   55|   166k|		m_MaxPacketLen = rawPacket->getRawDataLen();
   56|   166k|		m_FreeRawPacket = freeRawPacket;
   57|   166k|		m_RawPacket = rawPacket;
   58|   166k|		m_CanReallocateData = true;
   59|       |
   60|   166k|		if (m_RawPacket == nullptr)
  ------------------
  |  Branch (60:7): [True: 0, False: 166k]
  ------------------
   61|      0|			return;
   62|       |
   63|   166k|		parsePacket(PacketParseOptions{ parseUntil, parseUntilLayer });
   64|   166k|	}
_ZN4pcpp6Packet11parsePacketENS_18PacketParseOptionsEb:
   67|   166k|	{
   68|   166k|		if (m_RawPacket == nullptr)
  ------------------
  |  Branch (68:7): [True: 0, False: 166k]
  ------------------
   69|      0|		{
   70|      0|			throw std::runtime_error("Cannot parse packet: RawPacket is null");
   71|      0|		}
   72|       |
   73|       |		// If we aren't doing an incremental parse, destroy all existing layers and start from scratch
   74|   166k|		if (!incrementalParsing)
  ------------------
  |  Branch (74:7): [True: 0, False: 166k]
  ------------------
   75|      0|		{
   76|      0|			destroyAllLayers();
   77|      0|		}
   78|       |
   79|       |		// Flag indicating whether we are currently parsing new layers (as opposed to traversing already parsed ones).
   80|   166k|		bool parsingNewLayers = false;
   81|       |
   82|       |		// If there is no first layer, create it based on the link layer type
   83|   166k|		if (m_FirstLayer == nullptr)
  ------------------
  |  Branch (83:7): [True: 166k, False: 0]
  ------------------
   84|   166k|		{
   85|   166k|			parsingNewLayers = true;
   86|       |
   87|   166k|			LinkLayerType linkType = m_RawPacket->getLinkLayerType();
   88|   166k|			m_FirstLayer = createFirstLayer(linkType);
   89|       |
   90|   166k|			if (m_FirstLayer == nullptr)
  ------------------
  |  Branch (90:8): [True: 1.88k, False: 165k]
  ------------------
   91|  1.88k|			{
   92|  1.88k|				PCPP_LOG_ERROR("Failed to create first layer! Possibly attempting to parse a RawPacket with no data.");
  ------------------
  |  |  445|  1.88k|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|  1.88k|	do                                                                                                                 \
  |  |  |  |  415|  1.88k|	{                                                                                                                  \
  |  |  |  |  416|  1.88k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  1.88k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.88k|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 1.88k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|  1.88k|		{                                                                                                              \
  |  |  |  |  419|  1.88k|			auto ctx =                                                                                                 \
  |  |  |  |  420|  1.88k|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.88k|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|  1.88k|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|  1.88k|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|  1.88k|		}                                                                                                              \
  |  |  |  |  424|  1.88k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 1.88k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   93|  1.88k|				return;
   94|  1.88k|			}
   95|       |
   96|       |			// Mark the first layer as allocated in the packet
   97|   165k|			m_FirstLayer->m_AllocationInfo.ownedByPacket = true;
   98|   165k|		}
   99|       |
  100|   165k|		Layer* parseStartLayer = m_FirstLayer;
  101|       |
  102|       |		// Fast path:
  103|       |		//   If we are doing an incremental parse and we are not searching for a specific protocol type,
  104|       |		//   we can directly start from the last parsed layer.
  105|   165k|		if (m_LastLayer != nullptr && options.parseUntilProtocol == UnknownProtocol)
  ------------------
  |  Branch (105:7): [True: 0, False: 165k]
  |  Branch (105:33): [True: 0, False: 0]
  ------------------
  106|      0|		{
  107|       |			// NOTE: Potential edge case, PacketTrailerLayer is considered DataLinkLayer.
  108|       |			//  If the user requested a higher OSI layer, this condition would not skip the parse.
  109|       |			//  The parse should still do nothing, as the trailer layer doesn't have a next layer,
  110|       |			//  but it will have to go through 1 extra iteration.
  111|      0|			if (m_LastLayer->getOsiModelLayer() > options.parseUntilLayer)
  ------------------
  |  Branch (111:8): [True: 0, False: 0]
  ------------------
  112|      0|			{
  113|       |				// Already past the OSI target layer, nothing to do
  114|      0|				return;
  115|      0|			}
  116|       |
  117|      0|			parseStartLayer = m_LastLayer;
  118|      0|		}
  119|       |
  120|       |		// As the stop conditions are inclusive, the parse must go one layer further and then roll back if needed
  121|   165k|		bool rollbackLastLayer = false;
  122|   165k|		bool foundTargetProtocol = false;
  123|   824k|		for (auto* curLayer = parseStartLayer; curLayer != nullptr; curLayer = curLayer->getNextLayer())
  ------------------
  |  Branch (123:42): [True: 659k, False: 165k]
  ------------------
  124|   659k|		{
  125|       |			// If we are parsing new layers, update the last layer pointer
  126|       |			// Otherwise we are just traversing already parsed layers
  127|   659k|			if (parsingNewLayers)
  ------------------
  |  Branch (127:8): [True: 659k, False: 0]
  ------------------
  128|   659k|			{
  129|       |				// Mark the current layer as allocated in the packet, as it was just created
  130|   659k|				curLayer->m_AllocationInfo.ownedByPacket = true;
  131|   659k|				m_LastLayer = curLayer;
  132|   659k|			}
  133|       |
  134|       |			// If the current layer is of a higher OSI layer than the target, stop parsing
  135|   659k|			if (curLayer->getOsiModelLayer() > options.parseUntilLayer)
  ------------------
  |  Branch (135:8): [True: 0, False: 659k]
  ------------------
  136|      0|			{
  137|       |				// If we are traversing already parsed layers, we don't want to roll back as they must be kept as is.
  138|      0|				rollbackLastLayer = parsingNewLayers;
  139|      0|				break;
  140|      0|			}
  141|       |
  142|       |			// If we are searching for a specific layer protocol, record when we find at least one target.
  143|   659k|			const bool matchesTarget = curLayer->isMemberOfProtocolFamily(options.parseUntilProtocol);
  144|   659k|			if (options.parseUntilProtocol != UnknownProtocol && matchesTarget)
  ------------------
  |  Branch (144:8): [True: 0, False: 659k]
  |  Branch (144:57): [True: 0, False: 0]
  ------------------
  145|      0|			{
  146|      0|				foundTargetProtocol = true;
  147|      0|			}
  148|       |
  149|       |			// If we have found the target protocol already, we are parsing until we find a different protocol
  150|   659k|			if (foundTargetProtocol && !matchesTarget)
  ------------------
  |  Branch (150:8): [True: 0, False: 659k]
  |  Branch (150:31): [True: 0, False: 0]
  ------------------
  151|      0|			{
  152|       |				// If we are traversing already parsed layers, we don't want to roll back as they must be kept as is.
  153|      0|				rollbackLastLayer = parsingNewLayers;
  154|      0|				break;
  155|      0|			}
  156|       |
  157|       |			// If the current layer doesn't have a next layer yet, parse it.
  158|       |			// This is important for the case of a re-parse where some layers may already have been parsed
  159|   659k|			if (!curLayer->hasNextLayer())
  ------------------
  |  Branch (159:8): [True: 659k, False: 0]
  ------------------
  160|   659k|			{
  161|   659k|				parsingNewLayers = true;  // We are now parsing new layers.
  162|       |
  163|       |				// Parse the next layer. This will update the next layer pointer of the current layer.
  164|   659k|				curLayer->parseNextLayer();
  165|   659k|			}
  166|   659k|		}
  167|       |
  168|       |		// Roll back one layer, if parsing with search condition as the conditions are inclusive.
  169|       |		// Don't delete the first layer. If already past the target layer, treat the same as if the layer was found.
  170|   165k|		if (rollbackLastLayer && m_LastLayer != m_FirstLayer)
  ------------------
  |  Branch (170:7): [True: 0, False: 165k]
  |  Branch (170:28): [True: 0, False: 0]
  ------------------
  171|      0|		{
  172|      0|			m_LastLayer = m_LastLayer->getPrevLayer();
  173|      0|			delete m_LastLayer->m_NextLayer;
  174|      0|			m_LastLayer->m_NextLayer = nullptr;
  175|      0|		}
  176|       |
  177|       |		// If there is data left in the raw packet that doesn't belong to any layer, create a PacketTrailerLayer
  178|   165k|		if (m_LastLayer != nullptr && options.parseUntilProtocol == UnknownProtocol &&
  ------------------
  |  Branch (178:7): [True: 165k, False: 0]
  |  Branch (178:33): [True: 165k, False: 0]
  ------------------
  179|   165k|		    options.parseUntilLayer == OsiModelLayerUnknown)
  ------------------
  |  Branch (179:7): [True: 165k, False: 0]
  ------------------
  180|   165k|		{
  181|       |			// find if there is data left in the raw packet that doesn't belong to any layer. In that case it's probably
  182|       |			// a packet trailer. create a PacketTrailerLayer layer and add it at the end of the packet
  183|   165k|			int trailerLen = (int)((m_RawPacket->getRawData() + m_RawPacket->getRawDataLen()) -
  184|   165k|			                       (m_LastLayer->getData() + m_LastLayer->getDataLen()));
  185|   165k|			if (trailerLen > 0)
  ------------------
  |  Branch (185:8): [True: 18.3k, False: 146k]
  ------------------
  186|  18.3k|			{
  187|  18.3k|				PacketTrailerLayer* trailerLayer =
  188|  18.3k|				    new PacketTrailerLayer(static_cast<uint8_t*>(m_LastLayer->getData() + m_LastLayer->getDataLen()),
  189|  18.3k|				                           trailerLen, m_LastLayer, this);
  190|       |
  191|  18.3k|				trailerLayer->m_AllocationInfo.ownedByPacket = true;
  192|  18.3k|				m_LastLayer->setNextLayer(trailerLayer);
  193|  18.3k|				m_LastLayer = trailerLayer;
  194|  18.3k|			}
  195|   165k|		}
  196|   165k|	}
_ZN4pcpp6PacketC2EPNS_9RawPacketEbhNS_13OsiModelLayerE:
  199|   166k|	    : Packet(rawPacket, freeRawPacket, static_cast<ProtocolTypeFamily>(parseUntil), parseUntilLayer)
  200|   166k|	{}
_ZN4pcpp6PacketC2EPNS_9RawPacketEbjNS_13OsiModelLayerE:
  204|   166k|	{
  205|   166k|		m_FreeRawPacket = false;
  206|   166k|		m_RawPacket = nullptr;
  207|   166k|		m_FirstLayer = nullptr;
  208|   166k|		setRawPacket(rawPacket, freeRawPacket, parseUntil, parseUntilLayer);
  209|   166k|	}
_ZN4pcpp6Packet18destructPacketDataEv:
  237|  1.01M|	{
  238|  1.01M|		destroyAllLayers();
  239|       |
  240|  1.01M|		if (m_RawPacket != nullptr && m_FreeRawPacket)
  ------------------
  |  Branch (240:7): [True: 844k, False: 166k]
  |  Branch (240:33): [True: 677k, False: 166k]
  ------------------
  241|   677k|		{
  242|   677k|			delete m_RawPacket;
  243|   677k|		}
  244|  1.01M|	}
_ZN4pcpp6Packet16destroyAllLayersEv:
  247|  1.01M|	{
  248|  1.01M|		Layer* curLayer = m_FirstLayer;
  249|  7.66M|		while (curLayer != nullptr)
  ------------------
  |  Branch (249:10): [True: 6.64M, False: 1.01M]
  ------------------
  250|  6.64M|		{
  251|  6.64M|			Layer* nextLayer = curLayer->getNextLayer();
  252|  6.64M|			if (curLayer->m_AllocationInfo.ownedByPacket)
  ------------------
  |  Branch (252:8): [True: 6.64M, False: 0]
  ------------------
  253|  6.64M|			{
  254|  6.64M|				delete curLayer;
  255|  6.64M|			}
  256|       |
  257|  6.64M|			curLayer = nextLayer;
  258|  6.64M|		}
  259|       |
  260|  1.01M|		m_FirstLayer = nullptr;
  261|  1.01M|		m_LastLayer = nullptr;
  262|  1.01M|	}
_ZN4pcpp6Packet12copyDataFromERKS0_:
  274|   677k|	{
  275|   677k|		m_RawPacket = new RawPacket(*(other.m_RawPacket));
  276|   677k|		m_FreeRawPacket = true;
  277|   677k|		m_MaxPacketLen = other.m_MaxPacketLen;
  278|   677k|		m_FirstLayer = createFirstLayer(m_RawPacket->getLinkLayerType());
  279|   677k|		m_LastLayer = m_FirstLayer;
  280|   677k|		m_CanReallocateData = true;
  281|   677k|		Layer* curLayer = m_FirstLayer;
  282|  6.64M|		while (curLayer != nullptr)
  ------------------
  |  Branch (282:10): [True: 5.97M, False: 677k]
  ------------------
  283|  5.97M|		{
  284|  5.97M|			curLayer->parseNextLayer();
  285|  5.97M|			curLayer->m_AllocationInfo.ownedByPacket = true;
  286|  5.97M|			curLayer = curLayer->getNextLayer();
  287|  5.97M|			if (curLayer != nullptr)
  ------------------
  |  Branch (287:8): [True: 5.29M, False: 677k]
  ------------------
  288|  5.29M|				m_LastLayer = curLayer;
  289|  5.97M|		}
  290|   677k|	}
_ZN4pcpp6Packet17reallocateRawDataEm:
  293|  13.0k|	{
  294|  13.0k|		PCPP_LOG_DEBUG("Allocating packet to new size: " << newSize);
  ------------------
  |  |  427|  13.0k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  13.0k|	do                                                                                                                 \
  |  |  |  |  415|  13.0k|	{                                                                                                                  \
  |  |  |  |  416|  13.0k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  13.0k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  13.0k|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 13.0k]
  |  |  |  |  ------------------
  |  |  |  |  418|  13.0k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  13.0k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 13.0k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  295|       |
  296|       |		// allocate a new array with size newSize
  297|  13.0k|		m_MaxPacketLen = newSize;
  298|       |
  299|       |		// set the new array to RawPacket
  300|  13.0k|		if (!m_RawPacket->reallocateData(m_MaxPacketLen))
  ------------------
  |  Branch (300:7): [True: 0, False: 13.0k]
  ------------------
  301|      0|		{
  302|      0|			PCPP_LOG_ERROR("Couldn't reallocate data of raw packet to " << m_MaxPacketLen << " bytes");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  303|      0|			return;
  304|      0|		}
  305|       |
  306|       |		// set all data pointers in layers to the new array address
  307|  13.0k|		const uint8_t* dataPtr = m_RawPacket->getRawData();
  308|       |
  309|  67.5k|		for (Layer* curLayer = m_FirstLayer; curLayer != nullptr; curLayer = curLayer->getNextLayer())
  ------------------
  |  Branch (309:40): [True: 54.4k, False: 13.0k]
  ------------------
  310|  54.4k|		{
  311|  54.4k|			PCPP_LOG_DEBUG("Setting new data pointer to layer '" << typeid(curLayer).name() << "'");
  ------------------
  |  |  427|  54.4k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  54.4k|	do                                                                                                                 \
  |  |  |  |  415|  54.4k|	{                                                                                                                  \
  |  |  |  |  416|  54.4k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  54.4k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  54.4k|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 54.4k]
  |  |  |  |  ------------------
  |  |  |  |  418|  54.4k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  54.4k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 54.4k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  312|  54.4k|			curLayer->m_Data = const_cast<uint8_t*>(dataPtr);
  313|  54.4k|			dataPtr += curLayer->getHeaderLen();
  314|  54.4k|		}
  315|  13.0k|	}
_ZNK4pcpp6Packet14isPacketOfTypeEh:
  615|  11.5M|	{
  616|   111M|		for (Layer* curLayer = getFirstLayer(); curLayer != nullptr; curLayer = curLayer->getNextLayer())
  ------------------
  |  Branch (616:43): [True: 100M, False: 10.8M]
  ------------------
  617|   100M|		{
  618|   100M|			if (curLayer->getProtocol() == protocolType)
  ------------------
  |  Branch (618:8): [True: 704k, False: 100M]
  ------------------
  619|   704k|			{
  620|   704k|				return true;
  621|   704k|			}
  622|   100M|		}
  623|       |
  624|  10.8M|		return false;
  625|  11.5M|	}
_ZNK4pcpp6Packet14isPacketOfTypeEj:
  628|  2.70M|	{
  629|  2.70M|		Layer* curLayer = getFirstLayer();
  630|  26.4M|		while (curLayer != nullptr)
  ------------------
  |  Branch (630:10): [True: 23.8M, False: 2.63M]
  ------------------
  631|  23.8M|		{
  632|  23.8M|			if (curLayer->isMemberOfProtocolFamily(protocolTypeFamily))
  ------------------
  |  Branch (632:8): [True: 74.8k, False: 23.7M]
  ------------------
  633|  74.8k|			{
  634|  74.8k|				return true;
  635|  74.8k|			}
  636|  23.7M|			curLayer = curLayer->getNextLayer();
  637|  23.7M|		}
  638|       |
  639|  2.63M|		return false;
  640|  2.70M|	}
_ZN4pcpp6Packet11extendLayerEPNS_5LayerEim:
  643|  72.4k|	{
  644|  72.4k|		if (layer == nullptr)
  ------------------
  |  Branch (644:7): [True: 0, False: 72.4k]
  ------------------
  645|      0|		{
  646|      0|			PCPP_LOG_ERROR("Layer is nullptr");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  647|      0|			return false;
  648|      0|		}
  649|       |
  650|       |		// verify layer is allocated to this packet
  651|  72.4k|		if (!(layer->getAttachedPacket() == this))
  ------------------
  |  Branch (651:7): [True: 0, False: 72.4k]
  ------------------
  652|      0|		{
  653|      0|			PCPP_LOG_ERROR("Layer isn't allocated to this packet");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  654|      0|			return false;
  655|      0|		}
  656|       |
  657|  72.4k|		if (m_RawPacket->getRawDataLen() + numOfBytesToExtend > m_MaxPacketLen)
  ------------------
  |  Branch (657:7): [True: 13.0k, False: 59.3k]
  ------------------
  658|  13.0k|		{
  659|  13.0k|			if (!m_CanReallocateData)
  ------------------
  |  Branch (659:8): [True: 0, False: 13.0k]
  ------------------
  660|      0|			{
  661|      0|				PCPP_LOG_ERROR(
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  662|      0|				    "With the layer extended size the packet will exceed the size of the pre-allocated buffer: "
  663|      0|				    << m_MaxPacketLen << " bytes");
  664|      0|				return false;
  665|      0|			}
  666|       |			// reallocate to maximum value of: twice the max size of the packet or max size + new required length
  667|  13.0k|			if (m_RawPacket->getRawDataLen() + numOfBytesToExtend > m_MaxPacketLen * 2)
  ------------------
  |  Branch (667:8): [True: 400, False: 12.6k]
  ------------------
  668|    400|				reallocateRawData(m_RawPacket->getRawDataLen() + numOfBytesToExtend + m_MaxPacketLen);
  669|  12.6k|			else
  670|  12.6k|				reallocateRawData(m_MaxPacketLen * 2);
  671|  13.0k|		}
  672|       |
  673|       |		// insert layer data to raw packet
  674|  72.4k|		int indexToInsertData = layer->m_Data + offsetInLayer - m_RawPacket->getRawData();
  675|       |		// passing nullptr to insertData will move the data by numOfBytesToExtend
  676|       |		// no new data has to be created for this insertion which saves at least little time
  677|       |		// this move operation occurs on already allocated memory, which is backed by the reallocation if's provided
  678|       |		// above if offsetInLayer == layer->getHeaderLen() insertData will not move any data but only increase the
  679|       |		// packet size by numOfBytesToExtend
  680|  72.4k|		m_RawPacket->insertData(indexToInsertData, nullptr, numOfBytesToExtend);
  681|       |
  682|       |		// re-calculate all layers data ptr and data length
  683|  72.4k|		const uint8_t* dataPtr = m_RawPacket->getRawData();
  684|       |
  685|       |		// go over all layers from the first layer to the last layer and set the data ptr and data length for each layer
  686|  72.4k|		bool passedExtendedLayer = false;
  687|   392k|		for (Layer* curLayer = m_FirstLayer; curLayer != nullptr; curLayer = curLayer->getNextLayer())
  ------------------
  |  Branch (687:40): [True: 321k, False: 70.4k]
  ------------------
  688|   321k|		{
  689|   321k|			if (dataPtr > m_RawPacket->getRawData() + m_RawPacket->getRawDataLen())
  ------------------
  |  Branch (689:8): [True: 1.94k, False: 319k]
  ------------------
  690|  1.94k|			{
  691|  1.94k|				PCPP_LOG_ERROR("Layer data pointer exceeds packet's boundary");
  ------------------
  |  |  445|  1.94k|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|  1.94k|	do                                                                                                                 \
  |  |  |  |  415|  1.94k|	{                                                                                                                  \
  |  |  |  |  416|  1.94k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  1.94k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.94k|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 1.94k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|  1.94k|		{                                                                                                              \
  |  |  |  |  419|  1.94k|			auto ctx =                                                                                                 \
  |  |  |  |  420|  1.94k|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.94k|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|  1.94k|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|  1.94k|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|  1.94k|		}                                                                                                              \
  |  |  |  |  424|  1.94k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 1.94k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  692|  1.94k|				return false;
  693|  1.94k|			}
  694|       |
  695|       |			// set the data ptr
  696|   319k|			curLayer->m_Data = const_cast<uint8_t*>(dataPtr);
  697|       |
  698|       |			// set a flag if arrived to the layer being extended
  699|   319k|			if (curLayer->getPrevLayer() == layer)
  ------------------
  |  Branch (699:8): [True: 10.9k, False: 308k]
  ------------------
  700|  10.9k|				passedExtendedLayer = true;
  701|       |
  702|       |			// change the data length only for layers who come before the extended layer. For layers who come after,
  703|       |			// data length isn't changed
  704|   319k|			if (!passedExtendedLayer)
  ------------------
  |  Branch (704:8): [True: 296k, False: 23.5k]
  ------------------
  705|   296k|				curLayer->m_DataLen += numOfBytesToExtend;
  706|       |
  707|       |			// assuming header length of the layer that requested to be extended hasn't been enlarged yet
  708|   319k|			size_t headerLen = curLayer->getHeaderLen() + (curLayer == layer ? numOfBytesToExtend : 0);
  ------------------
  |  Branch (708:51): [True: 72.4k, False: 247k]
  ------------------
  709|   319k|			dataPtr += headerLen;
  710|   319k|		}
  711|       |
  712|  70.4k|		return true;
  713|  72.4k|	}
_ZN4pcpp6Packet12shortenLayerEPNS_5LayerEim:
  716|  52.1k|	{
  717|  52.1k|		if (layer == nullptr)
  ------------------
  |  Branch (717:7): [True: 0, False: 52.1k]
  ------------------
  718|      0|		{
  719|      0|			PCPP_LOG_ERROR("Layer is nullptr");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  720|      0|			return false;
  721|      0|		}
  722|       |
  723|       |		// verify layer is allocated to this packet
  724|  52.1k|		if (!(layer->getAttachedPacket() == this))
  ------------------
  |  Branch (724:7): [True: 0, False: 52.1k]
  ------------------
  725|      0|		{
  726|      0|			PCPP_LOG_ERROR("Layer isn't allocated to this packet");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  727|      0|			return false;
  728|      0|		}
  729|       |
  730|       |		// remove data from raw packet
  731|  52.1k|		int indexOfDataToRemove = layer->m_Data + offsetInLayer - m_RawPacket->getRawData();
  732|  52.1k|		if (!m_RawPacket->removeData(indexOfDataToRemove, numOfBytesToShorten))
  ------------------
  |  Branch (732:7): [True: 6, False: 52.1k]
  ------------------
  733|      6|		{
  734|      6|			PCPP_LOG_ERROR("Couldn't remove data from packet");
  ------------------
  |  |  445|      6|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      6|	do                                                                                                                 \
  |  |  |  |  415|      6|	{                                                                                                                  \
  |  |  |  |  416|      6|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      6|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      6|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 6, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      6|		{                                                                                                              \
  |  |  |  |  419|      6|			auto ctx =                                                                                                 \
  |  |  |  |  420|      6|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      6|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      6|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      6|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      6|		}                                                                                                              \
  |  |  |  |  424|      6|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 6]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  735|      6|			return false;
  736|      6|		}
  737|       |
  738|       |		// re-calculate all layers data ptr and data length
  739|  52.1k|		const uint8_t* dataPtr = m_RawPacket->getRawData();
  740|       |
  741|       |		// go over all layers from the first layer to the last layer and set the data ptr and data length for each layer
  742|  52.1k|		bool passedExtendedLayer = false;
  743|   316k|		for (Layer* curLayer = m_FirstLayer; curLayer != nullptr; curLayer = curLayer->getNextLayer())
  ------------------
  |  Branch (743:40): [True: 264k, False: 51.8k]
  ------------------
  744|   264k|		{
  745|   264k|			if (dataPtr > m_RawPacket->getRawData() + m_RawPacket->getRawDataLen())
  ------------------
  |  Branch (745:8): [True: 326, False: 264k]
  ------------------
  746|    326|			{
  747|    326|				PCPP_LOG_ERROR("Layer data pointer exceeds packet's boundary");
  ------------------
  |  |  445|    326|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    326|	do                                                                                                                 \
  |  |  |  |  415|    326|	{                                                                                                                  \
  |  |  |  |  416|    326|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    326|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    326|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 326, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    326|		{                                                                                                              \
  |  |  |  |  419|    326|			auto ctx =                                                                                                 \
  |  |  |  |  420|    326|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    326|#define LOG_MODULE PacketLogModulePacket
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    326|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    326|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    326|		}                                                                                                              \
  |  |  |  |  424|    326|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 326]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  748|    326|				return false;
  749|    326|			}
  750|       |
  751|       |			// set the data ptr
  752|   264k|			curLayer->m_Data = const_cast<uint8_t*>(dataPtr);
  753|       |
  754|       |			// set a flag if arrived to the layer being shortened
  755|   264k|			if (curLayer->getPrevLayer() == layer)
  ------------------
  |  Branch (755:8): [True: 15.7k, False: 248k]
  ------------------
  756|  15.7k|				passedExtendedLayer = true;
  757|       |
  758|   264k|			size_t headerLen = curLayer->getHeaderLen();
  759|       |
  760|       |			// change the data length only for layers who come before the shortened layer. For layers who come after,
  761|       |			// data length isn't changed
  762|   264k|			if (!passedExtendedLayer)
  ------------------
  |  Branch (762:8): [True: 229k, False: 34.8k]
  ------------------
  763|   229k|				curLayer->m_DataLen -= numOfBytesToShorten;
  764|       |
  765|       |			// assuming header length of the layer that requested to be extended hasn't been enlarged yet
  766|   264k|			headerLen -= (curLayer == layer ? numOfBytesToShorten : 0);
  ------------------
  |  Branch (766:18): [True: 52.1k, False: 212k]
  ------------------
  767|   264k|			dataPtr += headerLen;
  768|   264k|		}
  769|       |
  770|  51.8k|		return true;
  771|  52.1k|	}
_ZN4pcpp6Packet22computeCalculateFieldsEv:
  774|   166k|	{
  775|       |		// calculated fields should be calculated from top layer to bottom layer
  776|   844k|		for (Layer* curLayer = m_LastLayer; curLayer != nullptr; curLayer = curLayer->getPrevLayer())
  ------------------
  |  Branch (776:39): [True: 677k, False: 166k]
  ------------------
  777|   677k|		{
  778|   677k|			curLayer->computeCalculateFields();
  779|   677k|		}
  780|   166k|	}
_ZNK4pcpp6Packet15printPacketInfoEb:
  783|   166k|	{
  784|   166k|		std::ostringstream dataLenStream;
  785|   166k|		dataLenStream << m_RawPacket->getRawDataLen();
  786|       |
  787|       |		// convert raw packet timestamp to printable format
  788|   166k|		timespec timestamp = m_RawPacket->getPacketTimeStamp();
  789|   166k|		time_t nowtime = timestamp.tv_sec;
  790|   166k|		struct tm* nowtm = nullptr;
  791|   166k|#if __cplusplus > 199711L && !defined(_WIN32)
  792|       |		// localtime_r and gmtime_r are thread-safe versions of localtime and gmtime,
  793|       |		// but they're defined only in newer compilers (>= C++0x).
  794|       |		// on Windows localtime and gmtime are already thread-safe so there is not need
  795|       |		// to use localtime_r and gmtime_r
  796|   166k|		struct tm nowtm_r;
  797|   166k|		if (timeAsLocalTime)
  ------------------
  |  Branch (797:7): [True: 166k, False: 0]
  ------------------
  798|   166k|			nowtm = localtime_r(&nowtime, &nowtm_r);
  799|      0|		else
  800|      0|			nowtm = gmtime_r(&nowtime, &nowtm_r);
  801|       |
  802|   166k|		if (nowtm != nullptr)
  ------------------
  |  Branch (802:7): [True: 166k, False: 0]
  ------------------
  803|   166k|			nowtm = &nowtm_r;
  804|       |#else
  805|       |		// on Window compilers localtime and gmtime are already thread safe.
  806|       |		// in old compilers (< C++0x) gmtime_r and localtime_r were not defined so we have to fall back to localtime and
  807|       |		// gmtime
  808|       |		if (timeAsLocalTime)
  809|       |			nowtm = localtime(&nowtime);
  810|       |		else
  811|       |			nowtm = gmtime(&nowtime);
  812|       |#endif
  813|       |
  814|   166k|		char buf[128];
  815|   166k|		if (nowtm != nullptr)
  ------------------
  |  Branch (815:7): [True: 166k, False: 0]
  ------------------
  816|   166k|		{
  817|   166k|			char tmbuf[64];
  818|   166k|			strftime(tmbuf, sizeof(tmbuf), "%Y-%m-%d %H:%M:%S", nowtm);
  819|   166k|			snprintf(buf, sizeof(buf), "%s.%09lu", tmbuf, (unsigned long)timestamp.tv_nsec);
  820|   166k|		}
  821|      0|		else
  822|      0|			snprintf(buf, sizeof(buf), "0000-00-00 00:00:00.000000000");
  823|       |
  824|   166k|		return "Packet length: " + dataLenStream.str() + " [Bytes], Arrival time: " + std::string(buf);
  825|   166k|	}
_ZN4pcpp6Packet16createFirstLayerENS_13LinkLayerTypeE:
  828|   844k|	{
  829|   844k|		size_t rawDataLen = (size_t)m_RawPacket->getRawDataLen();
  830|   844k|		if (rawDataLen == 0)
  ------------------
  |  Branch (830:7): [True: 1.88k, False: 842k]
  ------------------
  831|  1.88k|			return nullptr;
  832|       |
  833|   842k|		const uint8_t* rawData = m_RawPacket->getRawData();
  834|       |
  835|   842k|		switch (linkType)
  836|   842k|		{
  837|   762k|		case LinkLayerType::LINKTYPE_ETHERNET:
  ------------------
  |  Branch (837:3): [True: 762k, False: 79.4k]
  ------------------
  838|   762k|		{
  839|   762k|			if (EthLayer::isDataValid(rawData, rawDataLen))
  ------------------
  |  Branch (839:8): [True: 754k, False: 8.51k]
  ------------------
  840|   754k|			{
  841|   754k|				return new EthLayer(const_cast<uint8_t*>(rawData), rawDataLen, this);
  842|   754k|			}
  843|  8.51k|			if (EthDot3Layer::isDataValid(rawData, rawDataLen))
  ------------------
  |  Branch (843:8): [True: 8.17k, False: 338]
  ------------------
  844|  8.17k|			{
  845|  8.17k|				return new EthDot3Layer(const_cast<uint8_t*>(rawData), rawDataLen, this);
  846|  8.17k|			}
  847|    338|			break;
  848|  8.51k|		}
  849|  12.5k|		case LinkLayerType::LINKTYPE_LINUX_SLL:
  ------------------
  |  Branch (849:3): [True: 12.5k, False: 829k]
  ------------------
  850|  12.5k|		{
  851|  12.5k|			return new SllLayer(const_cast<uint8_t*>(rawData), rawDataLen, this);
  852|  8.51k|		}
  853|  7.20k|		case LinkLayerType::LINKTYPE_LINUX_SLL2:
  ------------------
  |  Branch (853:3): [True: 7.20k, False: 835k]
  ------------------
  854|  7.20k|		{
  855|  7.20k|			if (Sll2Layer::isDataValid(rawData, rawDataLen))
  ------------------
  |  Branch (855:8): [True: 7.20k, False: 2]
  ------------------
  856|  7.20k|			{
  857|  7.20k|				return new Sll2Layer(const_cast<uint8_t*>(rawData), rawDataLen, this);
  858|  7.20k|			}
  859|      2|			break;
  860|  7.20k|		}
  861|  14.5k|		case LinkLayerType::LINKTYPE_NULL:
  ------------------
  |  Branch (861:3): [True: 14.5k, False: 827k]
  ------------------
  862|  14.5k|		{
  863|  14.5k|			if (NullLoopbackLayer::isDataValid(rawData, rawDataLen))
  ------------------
  |  Branch (863:8): [True: 14.2k, False: 268]
  ------------------
  864|  14.2k|			{
  865|  14.2k|				return new NullLoopbackLayer(const_cast<uint8_t*>(rawData), rawDataLen, this);
  866|  14.2k|			}
  867|    268|			break;
  868|  14.5k|		}
  869|  7.03k|		case LinkLayerType::LINKTYPE_RAW:
  ------------------
  |  Branch (869:3): [True: 7.03k, False: 835k]
  ------------------
  870|  12.0k|		case LinkLayerType::LINKTYPE_DLT_RAW1:
  ------------------
  |  Branch (870:3): [True: 5.01k, False: 837k]
  ------------------
  871|  14.2k|		case LinkLayerType::LINKTYPE_DLT_RAW2:
  ------------------
  |  Branch (871:3): [True: 2.19k, False: 840k]
  ------------------
  872|  14.2k|		{
  873|  14.2k|			uint8_t ipVer = rawData[0] & 0xf0;
  874|  14.2k|			if (ipVer == 0x40 && IPv4Layer::isDataValid(rawData, rawDataLen))
  ------------------
  |  Branch (874:8): [True: 11.4k, False: 2.83k]
  |  Branch (874:25): [True: 11.2k, False: 128]
  ------------------
  875|  11.2k|			{
  876|  11.2k|				return new IPv4Layer(const_cast<uint8_t*>(rawData), rawDataLen, nullptr, this);
  877|  11.2k|			}
  878|  2.96k|			if (ipVer == 0x60 && IPv6Layer::isDataValid(rawData, rawDataLen))
  ------------------
  |  Branch (878:8): [True: 2.62k, False: 332]
  |  Branch (878:25): [True: 2.50k, False: 128]
  ------------------
  879|  2.50k|			{
  880|  2.50k|				return new IPv6Layer(const_cast<uint8_t*>(rawData), rawDataLen, nullptr, this);
  881|  2.50k|			}
  882|    460|			break;
  883|  2.96k|		}
  884|  27.6k|		case LinkLayerType::LINKTYPE_IPV4:
  ------------------
  |  Branch (884:3): [True: 27.6k, False: 814k]
  ------------------
  885|  27.6k|		{
  886|  27.6k|			if (IPv4Layer::isDataValid(rawData, rawDataLen))
  ------------------
  |  Branch (886:8): [True: 27.4k, False: 204]
  ------------------
  887|  27.4k|			{
  888|  27.4k|				return new IPv4Layer(const_cast<uint8_t*>(rawData), rawDataLen, nullptr, this);
  889|  27.4k|			}
  890|    204|			break;
  891|  27.6k|		}
  892|    260|		case LinkLayerType::LINKTYPE_IPV6:
  ------------------
  |  Branch (892:3): [True: 260, False: 842k]
  ------------------
  893|    260|		{
  894|    260|			if (IPv6Layer::isDataValid(rawData, rawDataLen))
  ------------------
  |  Branch (894:8): [True: 132, False: 128]
  ------------------
  895|    132|			{
  896|    132|				return new IPv6Layer(const_cast<uint8_t*>(rawData), rawDataLen, nullptr, this);
  897|    132|			}
  898|    128|			break;
  899|    260|		}
  900|  2.27k|		case LinkLayerType::LINKTYPE_NFLOG:
  ------------------
  |  Branch (900:3): [True: 2.27k, False: 840k]
  ------------------
  901|  2.27k|		{
  902|  2.27k|			if (NflogLayer::isDataValid(rawData, rawDataLen))
  ------------------
  |  Branch (902:8): [True: 2.27k, False: 0]
  ------------------
  903|  2.27k|			{
  904|  2.27k|				return new NflogLayer(const_cast<uint8_t*>(rawData), rawDataLen, this);
  905|  2.27k|			}
  906|      0|			break;
  907|  2.27k|		}
  908|    691|		case LinkLayerType::LINKTYPE_C_HDLC:
  ------------------
  |  Branch (908:3): [True: 691, False: 841k]
  ------------------
  909|    691|		{
  910|    691|			if (CiscoHdlcLayer::isDataValid(rawData, rawDataLen))
  ------------------
  |  Branch (910:8): [True: 531, False: 160]
  ------------------
  911|    531|			{
  912|    531|				return new CiscoHdlcLayer(const_cast<uint8_t*>(rawData), rawDataLen, this);
  913|    531|			}
  914|    160|			break;
  915|    691|		}
  916|    160|		default:
  ------------------
  |  Branch (916:3): [True: 0, False: 842k]
  ------------------
  917|       |			// For all other link types, we don't have a specific layer. Just break and create a PayloadLayer
  918|      0|			break;
  919|   842k|		}
  920|       |
  921|       |		// unknown link type
  922|  1.56k|		return new PayloadLayer(const_cast<uint8_t*>(rawData), rawDataLen, nullptr, this);
  923|   842k|	}
_ZNK4pcpp6Packet8toStringEb:
  926|   166k|	{
  927|   166k|		std::vector<std::string> stringList;
  928|   166k|		toStringList(stringList, timeAsLocalTime);
  929|   166k|		return std::accumulate(stringList.begin(), stringList.end(), std::string(),
  930|   166k|		                       [](std::string a, const std::string& b) { return std::move(a) + b + '\n'; });
  931|   166k|	}
_ZNK4pcpp6Packet12toStringListERNSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEEb:
  934|   166k|	{
  935|   166k|		result.clear();
  936|   166k|		result.push_back(printPacketInfo(timeAsLocalTime));
  937|       |
  938|   844k|		for (Layer* curLayer = m_FirstLayer; curLayer != nullptr; curLayer = curLayer->getNextLayer())
  ------------------
  |  Branch (938:40): [True: 677k, False: 166k]
  ------------------
  939|   677k|		{
  940|   677k|			result.push_back(curLayer->toString());
  941|   677k|		}
  942|   166k|	}
Packet.cpp:_ZZNK4pcpp6Packet8toStringEbENK3$_0clENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKS8_:
  930|   844k|		                       [](std::string a, const std::string& b) { return std::move(a) + b + '\n'; });

_ZNK4pcpp18PacketTrailerLayer8toStringEv:
   14|  36.6k|	{
   15|  36.6k|		std::ostringstream dataLenStream;
   16|  36.6k|		dataLenStream << m_DataLen;
   17|       |
   18|  36.6k|		std::string trailerStr = byteArrayToHexString(m_Data, m_DataLen, 15);
   19|       |
   20|  36.6k|		if (m_DataLen > 15)
  ------------------
  |  Branch (20:7): [True: 14.1k, False: 22.5k]
  ------------------
   21|  14.1k|			trailerStr += "...";
   22|       |
   23|  36.6k|		return "Packet Trailer, Data: " + trailerStr + ", Length: " + dataLenStream.str() + " [Bytes]";
   24|  36.6k|	}

_ZN4pcpp15computeChecksumEPNS_12ScalarBufferItEEm:
   13|   281k|	{
   14|   281k|		uint32_t sum = 0;
   15|   702k|		for (size_t i = 0; i < vecSize; i++)
  ------------------
  |  Branch (15:22): [True: 421k, False: 281k]
  ------------------
   16|   421k|		{
   17|   421k|			uint32_t localSum = 0;
   18|       |
   19|       |			// vec len is in bytes
   20|  20.8M|			for (size_t j = 0; j < vec[i].len / 2; j++)
  ------------------
  |  Branch (20:23): [True: 20.4M, False: 421k]
  ------------------
   21|  20.4M|			{
   22|  20.4M|				PCPP_LOG_DEBUG("Value to add = 0x" << std::uppercase << std::hex << vec[i].buffer[j]);
  ------------------
  |  |  427|  20.4M|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  20.4M|	do                                                                                                                 \
  |  |  |  |  415|  20.4M|	{                                                                                                                  \
  |  |  |  |  416|  20.4M|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  20.4M|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|  20.4M|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 20.4M]
  |  |  |  |  ------------------
  |  |  |  |  418|  20.4M|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  20.4M|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 20.4M]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   23|  20.4M|				localSum += vec[i].buffer[j];
   24|  20.4M|			}
   25|   421k|			PCPP_LOG_DEBUG("Local sum = " << localSum << ", 0x" << std::uppercase << std::hex << localSum);
  ------------------
  |  |  427|   421k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|   421k|	do                                                                                                                 \
  |  |  |  |  415|   421k|	{                                                                                                                  \
  |  |  |  |  416|   421k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|   421k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|   421k|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 421k]
  |  |  |  |  ------------------
  |  |  |  |  418|   421k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|   421k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 421k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   26|       |
   27|       |			// check if there is one byte left
   28|   421k|			if (vec[i].len % 2)
  ------------------
  |  Branch (28:8): [True: 47.4k, False: 373k]
  ------------------
   29|  47.4k|			{
   30|       |				// access to the last byte using an uint8_t pointer
   31|  47.4k|				uint8_t* vecBytes = reinterpret_cast<uint8_t*>(vec[i].buffer);
   32|  47.4k|				uint8_t lastByte = vecBytes[vec[i].len - 1];
   33|  47.4k|				PCPP_LOG_DEBUG("1 byte left, adding value: 0x" << std::uppercase << std::hex << lastByte);
  ------------------
  |  |  427|  47.4k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  47.4k|	do                                                                                                                 \
  |  |  |  |  415|  47.4k|	{                                                                                                                  \
  |  |  |  |  416|  47.4k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  47.4k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|  47.4k|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 47.4k]
  |  |  |  |  ------------------
  |  |  |  |  418|  47.4k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  47.4k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 47.4k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   34|       |				// We have read the latest byte manually but this byte should be properly interpreted
   35|       |				// as a 0xFF on LE and a 0xFF00 on BE to have a proper checksum computation
   36|  47.4k|				localSum += be16toh(lastByte << 8);
   37|       |
   38|  47.4k|				PCPP_LOG_DEBUG("Local sum = " << localSum << ", 0x" << std::uppercase << std::hex << localSum);
  ------------------
  |  |  427|  47.4k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  47.4k|	do                                                                                                                 \
  |  |  |  |  415|  47.4k|	{                                                                                                                  \
  |  |  |  |  416|  47.4k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  47.4k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|  47.4k|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 47.4k]
  |  |  |  |  ------------------
  |  |  |  |  418|  47.4k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  47.4k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 47.4k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   39|  47.4k|			}
   40|       |
   41|       |			// carry count is added to the sum
   42|   796k|			while (localSum >> 16)
  ------------------
  |  Branch (42:11): [True: 374k, False: 421k]
  ------------------
   43|   374k|			{
   44|   374k|				localSum = (localSum & 0xffff) + (localSum >> 16);
   45|   374k|			}
   46|   421k|			PCPP_LOG_DEBUG("Local sum = " << localSum << ", 0x" << std::uppercase << std::hex << localSum);
  ------------------
  |  |  427|   421k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|   421k|	do                                                                                                                 \
  |  |  |  |  415|   421k|	{                                                                                                                  \
  |  |  |  |  416|   421k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|   421k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|   421k|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 421k]
  |  |  |  |  ------------------
  |  |  |  |  418|   421k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|   421k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 421k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   47|   421k|			sum += localSum;
   48|   421k|		}
   49|       |
   50|   354k|		while (sum >> 16)
  ------------------
  |  Branch (50:10): [True: 72.1k, False: 281k]
  ------------------
   51|  72.1k|		{
   52|  72.1k|			sum = (sum & 0xffff) + (sum >> 16);
   53|  72.1k|		}
   54|   281k|		PCPP_LOG_DEBUG("Sum before invert = " << sum << ", 0x" << std::uppercase << std::hex << sum);
  ------------------
  |  |  427|   281k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|   281k|	do                                                                                                                 \
  |  |  |  |  415|   281k|	{                                                                                                                  \
  |  |  |  |  416|   281k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|   281k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|   281k|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 281k]
  |  |  |  |  ------------------
  |  |  |  |  418|   281k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|   281k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 281k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   55|       |
   56|       |		// To obtain the checksum we take the ones' complement of this result
   57|   281k|		uint16_t result = sum;
   58|   281k|		result = ~result;
   59|       |
   60|   281k|		PCPP_LOG_DEBUG("Calculated checksum = " << sum << ", 0x" << std::uppercase << std::hex << result);
  ------------------
  |  |  427|   281k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|   281k|	do                                                                                                                 \
  |  |  |  |  415|   281k|	{                                                                                                                  \
  |  |  |  |  416|   281k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|   281k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|   281k|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 281k]
  |  |  |  |  ------------------
  |  |  |  |  418|   281k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|   281k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 281k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   61|       |
   62|       |		// We return the result in BigEndian byte order
   63|       |		return htobe16(result);
   64|   281k|	}
_ZN4pcpp24computePseudoHdrChecksumEPhmNS_9IPAddress11AddressTypeEhS1_S1_:
   68|   136k|	{
   69|   136k|		PCPP_LOG_DEBUG("Compute pseudo header checksum.\n DataLen = " << dataLen << "IPAddrType = " << ipAddrType
  ------------------
  |  |  427|   136k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|   136k|	do                                                                                                                 \
  |  |  |  |  415|   136k|	{                                                                                                                  \
  |  |  |  |  416|   136k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|   136k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|   136k|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 136k]
  |  |  |  |  ------------------
  |  |  |  |  418|   136k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|   136k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 136k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   70|   136k|		                                                              << "ProtocolType = " << protocolType << "SrcIP = "
   71|   136k|		                                                              << srcIPAddress << "DstIP = " << dstIPAddress);
   72|       |
   73|   136k|		uint16_t checksumRes = 0;
   74|   136k|		ScalarBuffer<uint16_t> vec[2];
   75|   136k|		vec[0].buffer = reinterpret_cast<uint16_t*>(dataPtr);
   76|   136k|		vec[0].len = dataLen;
   77|       |
   78|   136k|		if (ipAddrType == IPAddress::IPv4AddressType)
  ------------------
  |  Branch (78:7): [True: 116k, False: 20.0k]
  ------------------
   79|   116k|		{
   80|   116k|			uint32_t srcIP = srcIPAddress.getIPv4().toInt();
   81|   116k|			uint32_t dstIP = dstIPAddress.getIPv4().toInt();
   82|   116k|			uint16_t pseudoHeader[6];
   83|   116k|			pseudoHeader[0] = srcIP >> 16;
   84|   116k|			pseudoHeader[1] = srcIP & 0xFFFF;
   85|   116k|			pseudoHeader[2] = dstIP >> 16;
   86|   116k|			pseudoHeader[3] = dstIP & 0xFFFF;
   87|   116k|			pseudoHeader[4] = 0xffff & htobe16(dataLen);
   88|   116k|			pseudoHeader[5] = htobe16(0x00ff & protocolType);
   89|   116k|			vec[1].buffer = pseudoHeader;
   90|   116k|			vec[1].len = 12;
   91|   116k|			checksumRes = computeChecksum(vec, 2);
   92|   116k|		}
   93|  20.0k|		else if (ipAddrType == IPAddress::IPv6AddressType)
  ------------------
  |  Branch (93:12): [True: 20.0k, False: 0]
  ------------------
   94|  20.0k|		{
   95|  20.0k|			uint16_t pseudoHeader[18];
   96|  20.0k|			srcIPAddress.getIPv6().copyTo(reinterpret_cast<uint8_t*>(pseudoHeader));
   97|  20.0k|			dstIPAddress.getIPv6().copyTo(reinterpret_cast<uint8_t*>(pseudoHeader + 8));
   98|  20.0k|			pseudoHeader[16] = 0xffff & htobe16(dataLen);
   99|  20.0k|			pseudoHeader[17] = htobe16(0x00ff & protocolType);
  100|  20.0k|			vec[1].buffer = pseudoHeader;
  101|  20.0k|			vec[1].len = 36;
  102|  20.0k|			checksumRes = computeChecksum(vec, 2);
  103|  20.0k|		}
  104|      0|		else
  105|      0|		{
  106|      0|			PCPP_LOG_ERROR("Compute pseudo header checksum failed, for unknown IPAddrType = " << ipAddrType);
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  107|      0|		}
  108|       |
  109|   136k|		PCPP_LOG_DEBUG("Pseudo header checksum = 0xX" << std::uppercase << std::hex << checksumRes);
  ------------------
  |  |  427|   136k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|   136k|	do                                                                                                                 \
  |  |  |  |  415|   136k|	{                                                                                                                  \
  |  |  |  |  416|   136k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|   136k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|   136k|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 136k]
  |  |  |  |  ------------------
  |  |  |  |  418|   136k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|   136k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 136k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  110|       |
  111|   136k|		return checksumRes;
  112|   136k|	}

_ZNK4pcpp12PayloadLayer8toStringEv:
   72|  93.7k|	{
   73|  93.7k|		std::ostringstream dataLenStream;
   74|  93.7k|		dataLenStream << m_DataLen;
   75|       |
   76|  93.7k|		return "Payload Layer, Data length: " + dataLenStream.str() + " [Bytes]";
   77|  93.7k|	}

_ZN4pcpp15PostgresMessage27parsePostgresBackendMessageEPKhm:
  309|     25|	{
  310|     25|		if (data == nullptr || dataLen < 1)
  ------------------
  |  Branch (310:7): [True: 0, False: 25]
  |  Branch (310:26): [True: 0, False: 25]
  ------------------
  311|      0|		{
  312|      0|			return nullptr;
  313|      0|		}
  314|       |
  315|     25|		if (dataLen < 5)
  ------------------
  |  Branch (315:7): [True: 4, False: 21]
  ------------------
  316|      4|		{
  317|      4|			return std::unique_ptr<PostgresMessage>(
  318|      4|			    new PostgresMessage(data, dataLen, PostgresMessageType::Backend_Unknown));
  319|      4|		}
  320|       |
  321|       |		// The length covers itself (4 bytes) but not the message type byte, so the smallest valid length is 4 (for
  322|       |		// example ParseComplete) and the message takes messageLength + 1 bytes.
  323|       |		// The check doesn't add 1: with a 32-bit size_t, 0xFFFFFFFF + 1 wraps around to 0.
  324|     21|		size_t messageLength = be32toh(*reinterpret_cast<const uint32_t*>(data + 1));
  325|     21|		if (messageLength < sizeof(uint32_t) || messageLength >= dataLen)
  ------------------
  |  Branch (325:7): [True: 2, False: 19]
  |  Branch (325:43): [True: 19, False: 0]
  ------------------
  326|     21|		{
  327|     21|			return std::unique_ptr<PostgresMessage>(
  328|     21|			    new PostgresMessage(data, dataLen, PostgresMessageType::Backend_Unknown));
  329|     21|		}
  330|       |
  331|      0|		auto messageTypeValue = data[0];
  332|      0|		auto messageType = PostgresMessageType::Backend_Unknown;
  333|       |
  334|      0|		switch (messageTypeValue)
  335|      0|		{
  336|      0|		case PostgresBackendMessage_R:
  ------------------
  |  Branch (336:3): [True: 0, False: 0]
  ------------------
  337|      0|		{
  338|      0|			uint32_t authType = be32toh(*reinterpret_cast<const uint32_t*>(data + 5));
  339|      0|			switch (authType)
  340|      0|			{
  341|      0|			case 0:
  ------------------
  |  Branch (341:4): [True: 0, False: 0]
  ------------------
  342|      0|			{
  343|      0|				messageType = PostgresMessageType::Backend_AuthenticationOk;
  344|      0|				break;
  345|      0|			}
  346|      0|			case 1:
  ------------------
  |  Branch (346:4): [True: 0, False: 0]
  ------------------
  347|      0|			{
  348|      0|				messageType = PostgresMessageType::Backend_AuthenticationKerberosV4;
  349|      0|				break;
  350|      0|			}
  351|      0|			case 2:
  ------------------
  |  Branch (351:4): [True: 0, False: 0]
  ------------------
  352|      0|			{
  353|      0|				messageType = PostgresMessageType::Backend_AuthenticationKerberosV5;
  354|      0|				break;
  355|      0|			}
  356|      0|			case 3:
  ------------------
  |  Branch (356:4): [True: 0, False: 0]
  ------------------
  357|      0|			{
  358|      0|				messageType = PostgresMessageType::Backend_AuthenticationCleartextPassword;
  359|      0|				break;
  360|      0|			}
  361|      0|			case 5:
  ------------------
  |  Branch (361:4): [True: 0, False: 0]
  ------------------
  362|      0|			{
  363|      0|				messageType = PostgresMessageType::Backend_AuthenticationMD5Password;
  364|      0|				break;
  365|      0|			}
  366|      0|			case 7:
  ------------------
  |  Branch (366:4): [True: 0, False: 0]
  ------------------
  367|      0|			{
  368|      0|				messageType = PostgresMessageType::Backend_AuthenticationGSS;
  369|      0|				break;
  370|      0|			}
  371|      0|			case 8:
  ------------------
  |  Branch (371:4): [True: 0, False: 0]
  ------------------
  372|      0|			{
  373|      0|				messageType = PostgresMessageType::Backend_AuthenticationGSSContinue;
  374|      0|				break;
  375|      0|			}
  376|      0|			case 9:
  ------------------
  |  Branch (376:4): [True: 0, False: 0]
  ------------------
  377|      0|			{
  378|      0|				messageType = PostgresMessageType::Backend_AuthenticationSSPI;
  379|      0|				break;
  380|      0|			}
  381|      0|			case 10:
  ------------------
  |  Branch (381:4): [True: 0, False: 0]
  ------------------
  382|      0|			{
  383|      0|				messageType = PostgresMessageType::Backend_AuthenticationSASL;
  384|      0|				break;
  385|      0|			}
  386|      0|			case 11:
  ------------------
  |  Branch (386:4): [True: 0, False: 0]
  ------------------
  387|      0|			{
  388|      0|				messageType = PostgresMessageType::Backend_AuthenticationSASLContinue;
  389|      0|				break;
  390|      0|			}
  391|      0|			case 12:
  ------------------
  |  Branch (391:4): [True: 0, False: 0]
  ------------------
  392|      0|			{
  393|      0|				messageType = PostgresMessageType::Backend_AuthenticationSASLFinal;
  394|      0|				break;
  395|      0|			}
  396|      0|			default:
  ------------------
  |  Branch (396:4): [True: 0, False: 0]
  ------------------
  397|      0|			{
  398|      0|				break;
  399|      0|			}
  400|      0|			}
  401|      0|			break;
  402|      0|		}
  403|      0|		case PostgresBackendMessage_K:
  ------------------
  |  Branch (403:3): [True: 0, False: 0]
  ------------------
  404|      0|		{
  405|      0|			messageType = PostgresMessageType::Backend_BackendKeyData;
  406|      0|			break;
  407|      0|		}
  408|      0|		case PostgresBackendMessage_2:
  ------------------
  |  Branch (408:3): [True: 0, False: 0]
  ------------------
  409|      0|		{
  410|      0|			messageType = PostgresMessageType::Backend_BindComplete;
  411|      0|			break;
  412|      0|		}
  413|      0|		case PostgresBackendMessage_3:
  ------------------
  |  Branch (413:3): [True: 0, False: 0]
  ------------------
  414|      0|		{
  415|      0|			messageType = PostgresMessageType::Backend_CloseComplete;
  416|      0|			break;
  417|      0|		}
  418|      0|		case PostgresBackendMessage_S:
  ------------------
  |  Branch (418:3): [True: 0, False: 0]
  ------------------
  419|      0|		{
  420|      0|			return std::make_unique<PostgresParameterStatus>(data, messageLength + 1);
  421|      0|		}
  422|      0|		case PostgresBackendMessage_Z:
  ------------------
  |  Branch (422:3): [True: 0, False: 0]
  ------------------
  423|      0|		{
  424|      0|			messageType = PostgresMessageType::Backend_ReadyForQuery;
  425|      0|			break;
  426|      0|		}
  427|      0|		case PostgresBackendMessage_C:
  ------------------
  |  Branch (427:3): [True: 0, False: 0]
  ------------------
  428|      0|		{
  429|      0|			messageType = PostgresMessageType::Backend_CommandComplete;
  430|      0|			break;
  431|      0|		}
  432|      0|		case PostgresBackendMessage_d:
  ------------------
  |  Branch (432:3): [True: 0, False: 0]
  ------------------
  433|      0|		{
  434|      0|			messageType = PostgresMessageType::Backend_CopyData;
  435|      0|			break;
  436|      0|		}
  437|      0|		case PostgresBackendMessage_c:
  ------------------
  |  Branch (437:3): [True: 0, False: 0]
  ------------------
  438|      0|		{
  439|      0|			messageType = PostgresMessageType::Backend_CopyDone;
  440|      0|			break;
  441|      0|		}
  442|      0|		case PostgresBackendMessage_G:
  ------------------
  |  Branch (442:3): [True: 0, False: 0]
  ------------------
  443|      0|		{
  444|      0|			messageType = PostgresMessageType::Backend_CopyInResponse;
  445|      0|			break;
  446|      0|		}
  447|      0|		case PostgresBackendMessage_H:
  ------------------
  |  Branch (447:3): [True: 0, False: 0]
  ------------------
  448|      0|		{
  449|      0|			messageType = PostgresMessageType::Backend_CopyOutResponse;
  450|      0|			break;
  451|      0|		}
  452|      0|		case PostgresBackendMessage_W:
  ------------------
  |  Branch (452:3): [True: 0, False: 0]
  ------------------
  453|      0|		{
  454|      0|			messageType = PostgresMessageType::Backend_CopyBothResponse;
  455|      0|			break;
  456|      0|		}
  457|      0|		case PostgresBackendMessage_D:
  ------------------
  |  Branch (457:3): [True: 0, False: 0]
  ------------------
  458|      0|		{
  459|      0|			return std::make_unique<PostgresDataRowMessage>(data, messageLength + 1);
  460|      0|		}
  461|      0|		case PostgresBackendMessage_I:
  ------------------
  |  Branch (461:3): [True: 0, False: 0]
  ------------------
  462|      0|		{
  463|      0|			messageType = PostgresMessageType::Backend_EmptyQueryResponse;
  464|      0|			break;
  465|      0|		}
  466|      0|		case PostgresBackendMessage_E:
  ------------------
  |  Branch (466:3): [True: 0, False: 0]
  ------------------
  467|      0|		{
  468|      0|			return std::make_unique<PostgresErrorResponseMessage>(data, messageLength + 1);
  469|      0|		}
  470|      0|		case PostgresBackendMessage_V:
  ------------------
  |  Branch (470:3): [True: 0, False: 0]
  ------------------
  471|      0|		{
  472|      0|			messageType = PostgresMessageType::Backend_FunctionCallResponse;
  473|      0|			break;
  474|      0|		}
  475|      0|		case PostgresBackendMessage_v:
  ------------------
  |  Branch (475:3): [True: 0, False: 0]
  ------------------
  476|      0|		{
  477|      0|			messageType = PostgresMessageType::Backend_NegotiateProtocolVersion;
  478|      0|			break;
  479|      0|		}
  480|      0|		case PostgresBackendMessage_n:
  ------------------
  |  Branch (480:3): [True: 0, False: 0]
  ------------------
  481|      0|		{
  482|      0|			messageType = PostgresMessageType::Backend_NoData;
  483|      0|			break;
  484|      0|		}
  485|      0|		case PostgresBackendMessage_N:
  ------------------
  |  Branch (485:3): [True: 0, False: 0]
  ------------------
  486|      0|		{
  487|      0|			messageType = PostgresMessageType::Backend_NoticeResponse;
  488|      0|			break;
  489|      0|		}
  490|      0|		case PostgresBackendMessage_A:
  ------------------
  |  Branch (490:3): [True: 0, False: 0]
  ------------------
  491|      0|		{
  492|      0|			messageType = PostgresMessageType::Backend_NotificationResponse;
  493|      0|			break;
  494|      0|		}
  495|      0|		case PostgresBackendMessage_t:
  ------------------
  |  Branch (495:3): [True: 0, False: 0]
  ------------------
  496|      0|		{
  497|      0|			messageType = PostgresMessageType::Backend_ParameterDescription;
  498|      0|			break;
  499|      0|		}
  500|      0|		case PostgresBackendMessage_1:
  ------------------
  |  Branch (500:3): [True: 0, False: 0]
  ------------------
  501|      0|		{
  502|      0|			messageType = PostgresMessageType::Backend_ParseComplete;
  503|      0|			break;
  504|      0|		}
  505|      0|		case PostgresBackendMessage_s:
  ------------------
  |  Branch (505:3): [True: 0, False: 0]
  ------------------
  506|      0|		{
  507|      0|			messageType = PostgresMessageType::Backend_PortalSuspended;
  508|      0|			break;
  509|      0|		}
  510|      0|		case PostgresBackendMessage_T:
  ------------------
  |  Branch (510:3): [True: 0, False: 0]
  ------------------
  511|      0|		{
  512|      0|			return std::make_unique<PostgresRowDescriptionMessage>(data, messageLength + 1);
  513|      0|		}
  514|      0|		default:
  ------------------
  |  Branch (514:3): [True: 0, False: 0]
  ------------------
  515|      0|		{
  516|      0|			break;
  517|      0|		}
  518|      0|		}
  519|       |
  520|      0|		return std::unique_ptr<PostgresMessage>(new PostgresMessage(data, messageLength + 1, messageType));
  521|      0|	}
_ZN4pcpp15PostgresMessage28parsePostgresFrontendMessageEPKhm:
  524|    365|	{
  525|    365|		if (data == nullptr || dataLen < 1)
  ------------------
  |  Branch (525:7): [True: 0, False: 365]
  |  Branch (525:26): [True: 0, False: 365]
  ------------------
  526|      0|		{
  527|      0|			return nullptr;
  528|      0|		}
  529|       |
  530|    365|		uint8_t messageTypeValue = data[0];
  531|    365|		if (messageTypeValue == PostgresMessage_0)
  ------------------
  |  Branch (531:7): [True: 2, False: 363]
  ------------------
  532|      2|		{
  533|      2|			if (dataLen < 8)
  ------------------
  |  Branch (533:8): [True: 0, False: 2]
  ------------------
  534|      0|			{
  535|      0|				return std::unique_ptr<PostgresMessage>(
  536|      0|				    new PostgresMessage(data, dataLen, PostgresMessageType::Frontend_Unknown));
  537|      0|			}
  538|       |
  539|       |			// The length covers itself and the 4 byte tag
  540|      2|			size_t messageLength = be32toh(*reinterpret_cast<const uint32_t*>(data));
  541|      2|			if (messageLength < 2 * sizeof(uint32_t) || messageLength > dataLen)
  ------------------
  |  Branch (541:8): [True: 1, False: 1]
  |  Branch (541:48): [True: 0, False: 1]
  ------------------
  542|      1|			{
  543|      1|				return std::unique_ptr<PostgresMessage>(
  544|      1|				    new PostgresMessage(data, dataLen, PostgresMessageType::Frontend_Unknown));
  545|      1|			}
  546|       |
  547|      1|			auto messageTag = be32toh(*reinterpret_cast<const uint32_t*>(data + 4));
  548|      1|			auto messageType = PostgresMessageType::Frontend_Unknown;
  549|       |
  550|      1|			switch (messageTag)
  551|      1|			{
  552|      0|			case PostgresFrontendTag_StartupMessage:
  ------------------
  |  Branch (552:4): [True: 0, False: 1]
  ------------------
  553|      0|			{
  554|      0|				return std::make_unique<PostgresStartupMessage>(data, messageLength);
  555|      0|			}
  556|      0|			case PostgresFrontendTag_SSLRequest:
  ------------------
  |  Branch (556:4): [True: 0, False: 1]
  ------------------
  557|      0|			{
  558|      0|				messageType = PostgresMessageType::Frontend_SSLRequest;
  559|      0|				break;
  560|      0|			}
  561|      0|			case PostgresFrontendTag_CancelRequest:
  ------------------
  |  Branch (561:4): [True: 0, False: 1]
  ------------------
  562|      0|			{
  563|      0|				messageType = PostgresMessageType::Frontend_CancelRequest;
  564|      0|				break;
  565|      0|			}
  566|      0|			case PostgresFrontendTag_GSSENCRequest:
  ------------------
  |  Branch (566:4): [True: 0, False: 1]
  ------------------
  567|      0|			{
  568|      0|				messageType = PostgresMessageType::Frontend_GSSENCRequest;
  569|      0|				break;
  570|      0|			}
  571|      1|			default:
  ------------------
  |  Branch (571:4): [True: 1, False: 0]
  ------------------
  572|      1|			{
  573|      1|				break;
  574|      0|			}
  575|      1|			}
  576|       |
  577|      1|			return std::unique_ptr<PostgresMessage>(new PostgresMessage(data, messageLength, messageType));
  578|      1|		}
  579|       |
  580|    363|		if (dataLen < 5)
  ------------------
  |  Branch (580:7): [True: 0, False: 363]
  ------------------
  581|      0|		{
  582|      0|			return std::unique_ptr<PostgresMessage>(
  583|      0|			    new PostgresMessage(data, dataLen, PostgresMessageType::Frontend_Unknown));
  584|      0|		}
  585|       |
  586|       |		// The length covers itself (4 bytes) but not the message type byte, so the smallest valid length is 4 (for
  587|       |		// example a Sync message) and the message takes messageLength + 1 bytes.
  588|       |		// The check doesn't add 1: with a 32-bit size_t, 0xFFFFFFFF + 1 wraps around to 0.
  589|    363|		size_t messageLength = be32toh(*reinterpret_cast<const uint32_t*>(data + 1));
  590|    363|		if (messageLength < sizeof(uint32_t) || messageLength >= dataLen)
  ------------------
  |  Branch (590:7): [True: 0, False: 363]
  |  Branch (590:43): [True: 363, False: 0]
  ------------------
  591|    363|		{
  592|    363|			return std::unique_ptr<PostgresMessage>(
  593|    363|			    new PostgresMessage(data, dataLen, PostgresMessageType::Frontend_Unknown));
  594|    363|		}
  595|       |
  596|      0|		auto messageType = PostgresMessageType::Frontend_Unknown;
  597|      0|		switch (messageTypeValue)
  598|      0|		{
  599|      0|		case PostgresFrontendMessage_Q:
  ------------------
  |  Branch (599:3): [True: 0, False: 0]
  ------------------
  600|      0|		{
  601|      0|			return std::make_unique<PostgresQueryMessage>(data, messageLength + 1);
  602|      0|		}
  603|      0|		case PostgresFrontendMessage_P:
  ------------------
  |  Branch (603:3): [True: 0, False: 0]
  ------------------
  604|      0|		{
  605|      0|			messageType = PostgresMessageType::Frontend_Parse;
  606|      0|			break;
  607|      0|		}
  608|      0|		case PostgresFrontendMessage_B:
  ------------------
  |  Branch (608:3): [True: 0, False: 0]
  ------------------
  609|      0|		{
  610|      0|			messageType = PostgresMessageType::Frontend_Bind;
  611|      0|			break;
  612|      0|		}
  613|      0|		case PostgresFrontendMessage_E:
  ------------------
  |  Branch (613:3): [True: 0, False: 0]
  ------------------
  614|      0|		{
  615|      0|			messageType = PostgresMessageType::Frontend_Execute;
  616|      0|			break;
  617|      0|		}
  618|      0|		case PostgresFrontendMessage_C:
  ------------------
  |  Branch (618:3): [True: 0, False: 0]
  ------------------
  619|      0|		{
  620|      0|			messageType = PostgresMessageType::Frontend_Close;
  621|      0|			break;
  622|      0|		}
  623|      0|		case PostgresFrontendMessage_D:
  ------------------
  |  Branch (623:3): [True: 0, False: 0]
  ------------------
  624|      0|		{
  625|      0|			messageType = PostgresMessageType::Frontend_Describe;
  626|      0|			break;
  627|      0|		}
  628|      0|		case PostgresFrontendMessage_F:
  ------------------
  |  Branch (628:3): [True: 0, False: 0]
  ------------------
  629|      0|		{
  630|      0|			messageType = PostgresMessageType::Frontend_FunctionCall;
  631|      0|			break;
  632|      0|		}
  633|      0|		case PostgresFrontendMessage_H:
  ------------------
  |  Branch (633:3): [True: 0, False: 0]
  ------------------
  634|      0|		{
  635|      0|			messageType = PostgresMessageType::Frontend_Flush;
  636|      0|			break;
  637|      0|		}
  638|      0|		case PostgresFrontendMessage_S:
  ------------------
  |  Branch (638:3): [True: 0, False: 0]
  ------------------
  639|      0|		{
  640|      0|			messageType = PostgresMessageType::Frontend_Sync;
  641|      0|			break;
  642|      0|		}
  643|      0|		case PostgresFrontendMessage_d:
  ------------------
  |  Branch (643:3): [True: 0, False: 0]
  ------------------
  644|      0|		{
  645|      0|			messageType = PostgresMessageType::Frontend_CopyData;
  646|      0|			break;
  647|      0|		}
  648|      0|		case PostgresFrontendMessage_c:
  ------------------
  |  Branch (648:3): [True: 0, False: 0]
  ------------------
  649|      0|		{
  650|      0|			messageType = PostgresMessageType::Frontend_CopyDone;
  651|      0|			break;
  652|      0|		}
  653|      0|		case PostgresFrontendMessage_f:
  ------------------
  |  Branch (653:3): [True: 0, False: 0]
  ------------------
  654|      0|		{
  655|      0|			messageType = PostgresMessageType::Frontend_CopyFail;
  656|      0|			break;
  657|      0|		}
  658|      0|		case PostgresFrontendMessage_X:
  ------------------
  |  Branch (658:3): [True: 0, False: 0]
  ------------------
  659|      0|		{
  660|      0|			messageType = PostgresMessageType::Frontend_Terminate;
  661|      0|			break;
  662|      0|		}
  663|      0|		default:
  ------------------
  |  Branch (663:3): [True: 0, False: 0]
  ------------------
  664|      0|		{
  665|      0|			break;
  666|      0|		}
  667|      0|		}
  668|       |
  669|      0|		return std::unique_ptr<PostgresMessage>(new PostgresMessage(data, messageLength + 1, messageType));
  670|      0|	}
_ZN4pcpp13PostgresLayer28parsePostgresBackendMessagesEPhmPNS_5LayerEPNS_6PacketE:
 1016|    299|	{
 1017|    299|		return new PostgresLayer(data, dataLen, prevLayer, packet, PostgresMessageOrigin::Backend);
 1018|    299|	}
_ZN4pcpp13PostgresLayer29parsePostgresFrontendMessagesEPhmPNS_5LayerEPNS_6PacketE:
 1022|  1.82k|	{
 1023|  1.82k|		return new PostgresLayer(data, dataLen, prevLayer, packet, PostgresMessageOrigin::Frontend);
 1024|  1.82k|	}
_ZNK4pcpp13PostgresLayer19getPostgresMessagesEv:
 1027|    778|	{
 1028|    778|		if (!m_MessagesInitialized)
  ------------------
  |  Branch (1028:7): [True: 389, False: 389]
  ------------------
 1029|    389|		{
 1030|    389|			auto parseFunc = (m_MessageOrigin == PostgresMessageOrigin::Backend)
  ------------------
  |  Branch (1030:21): [True: 25, False: 364]
  ------------------
 1031|    389|			                     ? &PostgresMessage::parsePostgresBackendMessage
 1032|    389|			                     : &PostgresMessage::parsePostgresFrontendMessage;
 1033|       |
 1034|    389|			auto data = m_Data;
 1035|    389|			auto dataLen = m_DataLen;
 1036|       |
 1037|    779|			while (dataLen > 0)
  ------------------
  |  Branch (1037:11): [True: 390, False: 389]
  ------------------
 1038|    390|			{
 1039|    390|				auto curMessage = parseFunc(data, dataLen);
 1040|    390|				if (curMessage == nullptr)
  ------------------
  |  Branch (1040:9): [True: 0, False: 390]
  ------------------
 1041|      0|				{
 1042|      0|					break;
 1043|      0|				}
 1044|       |
 1045|    390|				dataLen -= curMessage->getTotalMessageLength();
 1046|    390|				data += curMessage->getTotalMessageLength();
 1047|    390|				m_Messages.pushBack(std::move(curMessage));
 1048|    390|			}
 1049|       |
 1050|    389|			m_MessagesInitialized = true;
 1051|    389|		}
 1052|       |
 1053|    778|		return m_Messages;
 1054|    778|	}
_ZNK4pcpp13PostgresLayer8toStringEv:
 1067|    778|	{
 1068|    778|		const auto& messages = getPostgresMessages();
 1069|    778|		return std::string("PostgreSQL ") +
 1070|    778|		       (m_MessageOrigin == PostgresMessageOrigin::Frontend ? "Frontend" : "Backend") + " Layer, " +
  ------------------
  |  Branch (1070:11): [True: 728, False: 50]
  ------------------
 1071|    778|		       std::to_string(messages.size()) + " message(s)";
 1072|    778|	}

_ZN4pcpp11QuicV1Layer14parseQuicLayerEPhmPNS_5LayerEPNS_6PacketE:
   11|  1.36k|	{
   12|  1.36k|		if (data == nullptr || dataLen <= sizeof(quic_common_header))
  ------------------
  |  Branch (12:7): [True: 0, False: 1.36k]
  |  Branch (12:26): [True: 18, False: 1.34k]
  ------------------
   13|     18|		{
   14|     18|			return nullptr;
   15|     18|		}
   16|       |
   17|  1.34k|		auto headerForm = static_cast<QuicHeaderForm>(reinterpret_cast<quic_common_header*>(data)->headerForm);
   18|       |
   19|  1.34k|		if (headerForm == QuicHeaderForm::ShortHeader && QuicV1OneRttLayer::isDataValid(data, dataLen))
  ------------------
  |  Branch (19:7): [True: 755, False: 589]
  |  Branch (19:52): [True: 755, False: 0]
  ------------------
   20|    755|		{
   21|    755|			return new QuicV1OneRttLayer(data, dataLen, prevLayer, packet);
   22|    755|		}
   23|       |
   24|    589|		if (headerForm == QuicHeaderForm::LongHeader && QuicV1LongHeaderLayer::isDataValid(data, dataLen))
  ------------------
  |  Branch (24:7): [True: 589, False: 0]
  |  Branch (24:51): [True: 589, False: 0]
  ------------------
   25|    589|		{
   26|    589|			auto header = reinterpret_cast<quic_long_header*>(data);
   27|    589|			if (header->version == 0x00000000)
  ------------------
  |  Branch (27:8): [True: 15, False: 574]
  ------------------
   28|     15|			{
   29|     15|				return new QuicV1VersionNegotiationLayer(data, dataLen, prevLayer, packet);
   30|     15|			}
   31|    574|			if (netToHost32(header->version) != 0x00000001)
  ------------------
  |  Branch (31:8): [True: 22, False: 552]
  ------------------
   32|     22|			{
   33|     22|				return nullptr;
   34|     22|			}
   35|       |
   36|    552|			switch (header->longPacketType)
   37|    552|			{
   38|    319|			case static_cast<uint8_t>(QuicPacketType::Initial):
  ------------------
  |  Branch (38:4): [True: 319, False: 233]
  ------------------
   39|    319|			{
   40|    319|				return new QuicV1InitialLayer(data, dataLen, prevLayer, packet);
   41|      0|			}
   42|    208|			case static_cast<uint8_t>(QuicPacketType::Handshake):
  ------------------
  |  Branch (42:4): [True: 208, False: 344]
  ------------------
   43|    208|			{
   44|    208|				return new QuicV1HandshakeLayer(data, dataLen, prevLayer, packet);
   45|      0|			}
   46|      0|			case static_cast<uint8_t>(QuicPacketType::ZeroRTT):
  ------------------
  |  Branch (46:4): [True: 0, False: 552]
  ------------------
   47|      0|			{
   48|      0|				return new QuicV1ZeroRttLayer(data, dataLen, prevLayer, packet);
   49|      0|			}
   50|     25|			default:  // QuicPacketType::Retry
  ------------------
  |  Branch (50:4): [True: 25, False: 527]
  ------------------
   51|     25|			{
   52|     25|				return new QuicV1RetryLayer(data, dataLen, prevLayer, packet);
   53|      0|			}
   54|    552|			}
   55|    552|		}
   56|       |
   57|      0|		return nullptr;
   58|    589|	}
_ZN4pcpp11QuicV1Layer14parseNextLayerEv:
   61|  1.32k|	{
   62|  1.32k|		auto headerLen = getHeaderLen();
   63|       |
   64|  1.32k|		if (headerLen < m_DataLen)
  ------------------
  |  Branch (64:7): [True: 36, False: 1.28k]
  ------------------
   65|     36|		{
   66|     36|			tryConstructNextLayerFromFactoryWithFallback<PayloadLayer>(parseQuicLayer, m_Data + headerLen,
   67|     36|			                                                           m_DataLen - headerLen);
   68|     36|		}
   69|  1.32k|	}
_ZNK4pcpp11QuicV1Layer8toStringEv:
   82|    434|	{
   83|    434|		std::string packetType;
   84|       |
   85|    434|		switch (getPacketType())
   86|    434|		{
   87|    126|		case QuicPacketType::Initial:
  ------------------
  |  Branch (87:3): [True: 126, False: 308]
  ------------------
   88|    126|		{
   89|    126|			packetType = "Initial";
   90|    126|			break;
   91|      0|		}
   92|     82|		case QuicPacketType::Handshake:
  ------------------
  |  Branch (92:3): [True: 82, False: 352]
  ------------------
   93|     82|		{
   94|     82|			packetType = "Handshake";
   95|     82|			break;
   96|      0|		}
   97|      0|		case QuicPacketType::ZeroRTT:
  ------------------
  |  Branch (97:3): [True: 0, False: 434]
  ------------------
   98|      0|		{
   99|      0|			packetType = "0-RTT";
  100|      0|			break;
  101|      0|		}
  102|     10|		case QuicPacketType::Retry:
  ------------------
  |  Branch (102:3): [True: 10, False: 424]
  ------------------
  103|     10|		{
  104|     10|			packetType = "Retry";
  105|     10|			break;
  106|      0|		}
  107|    210|		case QuicPacketType::OneRtt:
  ------------------
  |  Branch (107:3): [True: 210, False: 224]
  ------------------
  108|    210|		{
  109|    210|			packetType = "1-RTT";
  110|    210|			break;
  111|      0|		}
  112|      6|		default:  // QuicPacketType::VersionNegotiation
  ------------------
  |  Branch (112:3): [True: 6, False: 428]
  ------------------
  113|      6|		{
  114|      6|			packetType = "Version Negotiation";
  115|      6|			break;
  116|      0|		}
  117|    434|		}
  118|       |
  119|    434|		return "QUIC v1 Layer, " + packetType + " message";
  120|    434|	}
_ZN4pcpp21QuicV1LongHeaderLayer11isDataValidEPKhm:
  123|    589|	{
  124|    589|		return data != nullptr && dataLen >= sizeof(quic_long_header);
  ------------------
  |  Branch (124:10): [True: 589, False: 0]
  |  Branch (124:29): [True: 589, False: 0]
  ------------------
  125|    589|	}
_ZNK4pcpp21QuicV1LongHeaderLayer13getPacketTypeEv:
  128|    218|	{
  129|    218|		return static_cast<QuicPacketType>(getLongHeader()->longPacketType);
  130|    218|	}
_ZNK4pcpp21QuicV1LongHeaderLayer27getDestConIdOffsetAndLengthEv:
  140|    631|	{
  141|    631|		if (m_DataLen <= destinationConnectionIdOffset)
  ------------------
  |  Branch (141:7): [True: 0, False: 631]
  ------------------
  142|      0|		{
  143|      0|			throw std::out_of_range("Not enough data to read destination connection ID length");
  144|      0|		}
  145|       |
  146|    631|		auto length = static_cast<size_t>(getLongHeader()->destinationConnectionIdLength);
  147|    631|		if (destinationConnectionIdOffset + length > m_DataLen)
  ------------------
  |  Branch (147:7): [True: 36, False: 595]
  ------------------
  148|     36|		{
  149|     36|			throw std::out_of_range("Not enough data to read destination connection ID");
  150|     36|		}
  151|       |
  152|    595|		return { length, destinationConnectionIdOffset };
  153|    631|	}
_ZNK4pcpp21QuicV1LongHeaderLayer26getSrcConIdOffsetAndLengthEv:
  175|    631|	{
  176|    631|		auto destOffsetAndLength = getDestConIdOffsetAndLength();
  177|    631|		auto sourceConnectionIdLengthOffset = destOffsetAndLength.offset + destOffsetAndLength.length;
  178|    631|		if (m_DataLen <= sourceConnectionIdLengthOffset + sizeof(uint8_t))
  ------------------
  |  Branch (178:7): [True: 0, False: 631]
  ------------------
  179|      0|		{
  180|      0|			throw std::out_of_range("Not enough data to read source connection ID length");
  181|      0|		}
  182|       |
  183|    631|		auto offset = sourceConnectionIdLengthOffset + sizeof(uint8_t);
  184|    631|		auto length = static_cast<size_t>(m_Data[sourceConnectionIdLengthOffset]);
  185|    631|		if (offset + length > m_DataLen)
  ------------------
  |  Branch (185:7): [True: 6, False: 625]
  ------------------
  186|      6|		{
  187|      6|			throw std::out_of_range("Not enough data to read source connection ID");
  188|      6|		}
  189|       |
  190|    625|		return { length, offset };
  191|    631|	}
_ZNK4pcpp24QuicV1EstablishmentLayer15getLengthOffsetEv:
  213|    249|	{
  214|    249|		auto srcConOffsetAndLength = getSrcConIdOffsetAndLength();
  215|    249|		if (srcConOffsetAndLength.offset + srcConOffsetAndLength.length + sizeof(uint8_t) > m_DataLen)
  ------------------
  |  Branch (215:7): [True: 0, False: 249]
  ------------------
  216|      0|		{
  217|      0|			throw std::out_of_range("Not enough data to read length offset");
  218|      0|		}
  219|       |
  220|    249|		return srcConOffsetAndLength.offset + srcConOffsetAndLength.length;
  221|    249|	}
_ZNK4pcpp24QuicV1EstablishmentLayer21getVarintValueAndSizeEm:
  224|    941|	{
  225|    941|		uint8_t prefix = (m_Data[offset] & 0xc0) >> 6;
  226|    941|		auto size = static_cast<size_t>(1) << prefix;
  227|       |
  228|    941|		if (offset + size > m_DataLen)
  ------------------
  |  Branch (228:7): [True: 0, False: 941]
  ------------------
  229|      0|		{
  230|      0|			throw std::out_of_range("Not enough data to read varint value");
  231|      0|		}
  232|       |
  233|    941|		uint64_t value = m_Data[offset] & 0x3f;
  234|  1.58k|		for (size_t i = 1; i < size; i++)
  ------------------
  |  Branch (234:22): [True: 648, False: 941]
  ------------------
  235|    648|		{
  236|    648|			value = (value << 8) | m_Data[offset + i];
  237|    648|		}
  238|       |
  239|    941|		return { value, size };
  240|    941|	}
_ZNK4pcpp24QuicV1EstablishmentLayer12getHeaderLenEv:
  257|    631|	{
  258|    631|		try
  259|    631|		{
  260|    631|			auto offset = getLengthOffset();
  261|    631|			auto lengthValueAndSize = getVarintValueAndSize(offset);
  262|    631|			return (std::min)(static_cast<size_t>(offset + lengthValueAndSize.size + lengthValueAndSize.value),
  263|    631|			                  m_DataLen);
  264|    631|		}
  265|    631|		catch (std::out_of_range&)
  266|    631|		{
  267|     42|			return m_DataLen;
  268|     42|		}
  269|    631|	}
_ZNK4pcpp18QuicV1InitialLayer15getLengthOffsetEv:
  318|    382|	{
  319|    382|		auto tokenLengthOffset = getTokenLengthOffset();
  320|    382|		auto tokenLengthValueAndSize = getVarintValueAndSize(tokenLengthOffset);
  321|    382|		if (tokenLengthOffset + tokenLengthValueAndSize.size + tokenLengthValueAndSize.value > m_DataLen)
  ------------------
  |  Branch (321:7): [True: 0, False: 382]
  ------------------
  322|      0|		{
  323|      0|			throw std::out_of_range("Not enough data to read length offset");
  324|      0|		}
  325|    382|		return tokenLengthOffset + tokenLengthValueAndSize.size + tokenLengthValueAndSize.value;
  326|    382|	}
_ZNK4pcpp18QuicV1InitialLayer20getTokenLengthOffsetEv:
  329|    382|	{
  330|    382|		auto srcConOffsetAndLength = getSrcConIdOffsetAndLength();
  331|    382|		if (srcConOffsetAndLength.offset + srcConOffsetAndLength.length + sizeof(uint8_t) > m_DataLen)
  ------------------
  |  Branch (331:7): [True: 0, False: 382]
  ------------------
  332|      0|		{
  333|      0|			throw std::out_of_range("Not enough data to read token length offset");
  334|      0|		}
  335|    382|		return srcConOffsetAndLength.offset + srcConOffsetAndLength.length;
  336|    382|	}
_ZN4pcpp17QuicV1OneRttLayer11isDataValidEPKhm:
  417|    755|	{
  418|    755|		return data != nullptr && dataLen >= sizeof(quic_short_header);
  ------------------
  |  Branch (418:10): [True: 755, False: 0]
  |  Branch (418:29): [True: 755, False: 0]
  ------------------
  419|    755|	}

_ZN4pcpp11RadiusLayer22getRadiusMessageStringEh:
   93|  8.77k|	{
   94|  8.77k|		switch (radiusMessageCode)
   95|  8.77k|		{
   96|  1.92k|		case 1:
  ------------------
  |  Branch (96:3): [True: 1.92k, False: 6.84k]
  ------------------
   97|  1.92k|			return "Access-Request";
   98|    464|		case 2:
  ------------------
  |  Branch (98:3): [True: 464, False: 8.31k]
  ------------------
   99|    464|			return "Access-Accept";
  100|    544|		case 3:
  ------------------
  |  Branch (100:3): [True: 544, False: 8.23k]
  ------------------
  101|    544|			return "Access-Reject";
  102|    156|		case 4:
  ------------------
  |  Branch (102:3): [True: 156, False: 8.62k]
  ------------------
  103|    156|			return "Accounting-Request";
  104|     70|		case 5:
  ------------------
  |  Branch (104:3): [True: 70, False: 8.70k]
  ------------------
  105|     70|			return "Accounting-Response";
  106|  1.13k|		case 11:
  ------------------
  |  Branch (106:3): [True: 1.13k, False: 7.64k]
  ------------------
  107|  1.13k|			return "Access-Challenge";
  108|      0|		case 12:
  ------------------
  |  Branch (108:3): [True: 0, False: 8.77k]
  ------------------
  109|      0|			return "Status-Server";
  110|      0|		case 13:
  ------------------
  |  Branch (110:3): [True: 0, False: 8.77k]
  ------------------
  111|      0|			return "Status-Client";
  112|  2.40k|		case 40:
  ------------------
  |  Branch (112:3): [True: 2.40k, False: 6.36k]
  ------------------
  113|  2.40k|			return "Disconnect-Request";
  114|  1.49k|		case 41:
  ------------------
  |  Branch (114:3): [True: 1.49k, False: 7.27k]
  ------------------
  115|  1.49k|			return "Disconnect-ACK";
  116|    236|		case 42:
  ------------------
  |  Branch (116:3): [True: 236, False: 8.54k]
  ------------------
  117|    236|			return "Disconnect-NAK";
  118|     52|		case 43:
  ------------------
  |  Branch (118:3): [True: 52, False: 8.72k]
  ------------------
  119|     52|			return "CoA-Request";
  120|    102|		case 44:
  ------------------
  |  Branch (120:3): [True: 102, False: 8.67k]
  ------------------
  121|    102|			return "CoA-ACK";
  122|      0|		case 45:
  ------------------
  |  Branch (122:3): [True: 0, False: 8.77k]
  ------------------
  123|      0|			return "CoA-NAK";
  124|      0|		case 255:
  ------------------
  |  Branch (124:3): [True: 0, False: 8.77k]
  ------------------
  125|      0|			return "Reserved";
  126|    184|		default:
  ------------------
  |  Branch (126:3): [True: 184, False: 8.59k]
  ------------------
  127|    184|			return "Unknown";
  128|  8.77k|		}
  129|  8.77k|	}
_ZNK4pcpp11RadiusLayer12getHeaderLenEv:
  132|  4.38k|	{
  133|  4.38k|		uint16_t len = be16toh(getRadiusHeader()->length);
  134|  4.38k|		if (len > m_DataLen)
  ------------------
  |  Branch (134:7): [True: 0, False: 4.38k]
  ------------------
  135|      0|			return m_DataLen;
  136|       |
  137|  4.38k|		return len;
  138|  4.38k|	}
_ZN4pcpp11RadiusLayer22computeCalculateFieldsEv:
  141|  4.38k|	{
  142|       |		getRadiusHeader()->length = htobe16(m_DataLen);
  143|  4.38k|	}
_ZNK4pcpp11RadiusLayer8toStringEv:
  146|  8.77k|	{
  147|  8.77k|		std::ostringstream str;
  148|  8.77k|		str << "RADIUS Layer, " << RadiusLayer::getRadiusMessageString(getRadiusHeader()->code) << "("
  149|  8.77k|		    << (int)getRadiusHeader()->code
  150|  8.77k|		    << "), "
  151|  8.77k|		       "Id="
  152|  8.77k|		    << (int)getRadiusHeader()->id << ", "
  153|  8.77k|		    << "Length=" << be16toh(getRadiusHeader()->length);
  154|       |
  155|  8.77k|		return str.str();
  156|  8.77k|	}
_ZN4pcpp11RadiusLayer11isDataValidEPKhm:
  239|  28.8k|	{
  240|  28.8k|		if (udpData != nullptr && udpDataLen >= sizeof(radius_header))
  ------------------
  |  Branch (240:7): [True: 28.8k, False: 0]
  |  Branch (240:29): [True: 28.7k, False: 151]
  ------------------
  241|  28.7k|		{
  242|  28.7k|			const radius_header* radHdr = reinterpret_cast<const radius_header*>(udpData);
  243|  28.7k|			size_t radLen = be16toh(radHdr->length);
  244|  28.7k|			return radLen >= sizeof(radius_header) && radLen <= udpDataLen;
  ------------------
  |  Branch (244:11): [True: 28.6k, False: 95]
  |  Branch (244:46): [True: 21.9k, False: 6.68k]
  ------------------
  245|  28.7k|		}
  246|    151|		return false;
  247|  28.8k|	}

_ZN4pcpp9RawPacketD2Ev:
   22|   679k|	{
   23|   679k|		RawPacket::clear();
   24|   679k|	}
_ZN4pcpp9RawPacketC2ERKS0_:
   27|   677k|	{
   28|   677k|		m_RawData = nullptr;
   29|   677k|		copyDataFrom(other, true);
   30|   677k|	}
_ZN4pcpp9RawPacket12copyDataFromERKS0_b:
   50|   677k|	{
   51|   677k|		if (!other.m_RawPacketSet)
  ------------------
  |  Branch (51:7): [True: 0, False: 677k]
  ------------------
   52|      0|			return;
   53|       |
   54|   677k|		m_TimeStamp = other.m_TimeStamp;
   55|       |
   56|   677k|		if (allocateData)
  ------------------
  |  Branch (56:7): [True: 677k, False: 0]
  ------------------
   57|   677k|		{
   58|   677k|			m_OwnsRawData = true;
   59|   677k|			m_RawData = new uint8_t[other.m_RawDataLen];
   60|   677k|			m_RawDataLen = other.m_RawDataLen;
   61|   677k|		}
   62|       |
   63|   677k|		memcpy(m_RawData, other.m_RawData, other.m_RawDataLen);
   64|   677k|		m_LinkLayerType = other.m_LinkLayerType;
   65|   677k|		m_FrameLength = other.m_FrameLength;
   66|   677k|		m_RawPacketSet = true;
   67|   677k|	}
_ZN4pcpp9RawPacket10setRawDataEPKhib8timespecNS_13LinkLayerTypeEi:
   97|   166k|	{
   98|   166k|		return doSetRawData(pRawData, rawDataLen, takeOwnership, timestamp, layerType, frameLength);
   99|   166k|	}
_ZN4pcpp9RawPacket12doSetRawDataEPKhib8timespecNS_13LinkLayerTypeEi:
  103|   166k|	{
  104|   166k|		clear();
  105|       |
  106|   166k|		m_OwnsRawData = takeOwnership;
  107|   166k|		m_FrameLength = (frameLength == -1) ? rawDataLen : frameLength;
  ------------------
  |  Branch (107:19): [True: 410, False: 166k]
  ------------------
  108|   166k|		m_RawData = (uint8_t*)pRawData;
  109|   166k|		m_RawDataLen = rawDataLen;
  110|   166k|		m_TimeStamp = timestamp;
  111|   166k|		m_RawPacketSet = true;
  112|   166k|		m_LinkLayerType = layerType;
  113|   166k|		return true;
  114|   166k|	}
_ZN4pcpp9RawPacket5clearEv:
  123|   846k|	{
  124|   846k|		if (m_RawData != nullptr && m_OwnsRawData)
  ------------------
  |  Branch (124:7): [True: 842k, False: 4.12k]
  |  Branch (124:31): [True: 842k, False: 0]
  ------------------
  125|   842k|			delete[] m_RawData;
  126|       |
  127|   846k|		m_RawData = nullptr;
  128|   846k|		m_RawDataLen = 0;
  129|   846k|		m_FrameLength = 0;
  130|   846k|		m_RawPacketSet = false;
  131|   846k|	}
_ZN4pcpp9RawPacket10insertDataEiPKhm:
  141|  72.4k|	{
  142|  72.4k|		if (atIndex < 0 || atIndex > m_RawDataLen)
  ------------------
  |  Branch (142:7): [True: 0, False: 72.4k]
  |  Branch (142:22): [True: 0, False: 72.4k]
  ------------------
  143|      0|		{
  144|      0|			throw std::out_of_range("Insert index is out of raw packet bound. Inserts can only happen in range [0, " +
  145|      0|			                        std::to_string(m_RawDataLen) + ']');
  146|      0|		}
  147|       |
  148|       |		// memmove copies data as if there was an intermediate buffer in between - so it allows for copying processes on
  149|       |		// overlapping src/dest ptrs if insertData is called with atIndex == m_RawDataLen, then no data is being moved.
  150|       |		// The data of the raw packet is still extended by dataToInsertLen
  151|  72.4k|		memmove((uint8_t*)m_RawData + atIndex + dataToInsertLen, (uint8_t*)m_RawData + atIndex, m_RawDataLen - atIndex);
  152|       |
  153|  72.4k|		if (dataToInsert != nullptr)
  ------------------
  |  Branch (153:7): [True: 0, False: 72.4k]
  ------------------
  154|      0|		{
  155|       |			// insert data
  156|      0|			memcpy((uint8_t*)m_RawData + atIndex, dataToInsert, dataToInsertLen);
  157|      0|		}
  158|       |
  159|  72.4k|		m_RawDataLen += dataToInsertLen;
  160|  72.4k|		m_FrameLength = m_RawDataLen;
  161|  72.4k|	}
_ZN4pcpp9RawPacket14reallocateDataEm:
  164|  13.0k|	{
  165|  13.0k|		if ((int)newBufferLength == m_RawDataLen)
  ------------------
  |  Branch (165:7): [True: 0, False: 13.0k]
  ------------------
  166|      0|			return true;
  167|       |
  168|  13.0k|		if ((int)newBufferLength < m_RawDataLen)
  ------------------
  |  Branch (168:7): [True: 0, False: 13.0k]
  ------------------
  169|      0|		{
  170|      0|			PCPP_LOG_ERROR("Cannot reallocate raw packet to a smaller size. Current data length: "
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleRawPacket
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleRawPacket
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  171|      0|			               << m_RawDataLen << "; requested length: " << newBufferLength);
  172|      0|			return false;
  173|      0|		}
  174|       |
  175|  13.0k|		uint8_t* newBuffer = new uint8_t[newBufferLength];
  176|  13.0k|		memset(newBuffer, 0, newBufferLength);
  177|  13.0k|		if (m_RawDataLen > 0)
  ------------------
  |  Branch (177:7): [True: 13.0k, False: 0]
  ------------------
  178|  13.0k|		{
  179|  13.0k|			memcpy(newBuffer, m_RawData, m_RawDataLen);
  180|  13.0k|		}
  181|  13.0k|		if (m_OwnsRawData)
  ------------------
  |  Branch (181:7): [True: 13.0k, False: 0]
  ------------------
  182|  13.0k|			delete[] m_RawData;
  183|       |
  184|  13.0k|		m_OwnsRawData = true;
  185|  13.0k|		m_RawData = newBuffer;
  186|       |
  187|  13.0k|		return true;
  188|  13.0k|	}
_ZN4pcpp9RawPacket10removeDataEim:
  191|  52.1k|	{
  192|  52.1k|		if (atIndex < 0 || atIndex + (int)numOfBytesToRemove > m_RawDataLen)
  ------------------
  |  Branch (192:7): [True: 6, False: 52.1k]
  |  Branch (192:22): [True: 0, False: 52.1k]
  ------------------
  193|      6|		{
  194|      6|			PCPP_LOG_ERROR("Remove section is out of raw packet bound. Removes can only happen in range [0, " +
  ------------------
  |  |  445|      6|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      6|	do                                                                                                                 \
  |  |  |  |  415|      6|	{                                                                                                                  \
  |  |  |  |  416|      6|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      6|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      6|#define LOG_MODULE PacketLogModuleRawPacket
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 6, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      6|		{                                                                                                              \
  |  |  |  |  419|      6|			auto ctx =                                                                                                 \
  |  |  |  |  420|      6|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      6|#define LOG_MODULE PacketLogModuleRawPacket
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      6|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      6|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      6|		}                                                                                                              \
  |  |  |  |  424|      6|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 6]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  195|      6|			               std::to_string(m_RawDataLen) + ')');
  196|      6|			return false;
  197|      6|		}
  198|       |
  199|  52.1k|		if (numOfBytesToRemove == 0)
  ------------------
  |  Branch (199:7): [True: 0, False: 52.1k]
  ------------------
  200|      0|			return true;
  201|       |
  202|       |		// only move data if we are removing data somewhere in the layer, not at the end of the last layer
  203|       |		// this is so that resizing of the last layer can occur fast by just reducing the fictional length of the packet
  204|       |		// (m_RawDataLen) by the given amount
  205|  52.1k|		if ((atIndex + (int)numOfBytesToRemove) != m_RawDataLen)
  ------------------
  |  Branch (205:7): [True: 37.9k, False: 14.2k]
  ------------------
  206|       |			// memmove copies data as if there was an intermediate buffer in between - so it allows for copying
  207|       |			// processes on overlapping src/dest ptrs
  208|  37.9k|			memmove((uint8_t*)m_RawData + atIndex, (uint8_t*)m_RawData + atIndex + numOfBytesToRemove,
  209|  37.9k|			        m_RawDataLen - (atIndex + numOfBytesToRemove));
  210|       |
  211|  52.1k|		m_RawDataLen -= numOfBytesToRemove;
  212|  52.1k|		m_FrameLength = m_RawDataLen;
  213|  52.1k|		return true;
  214|  52.1k|	}

_ZNK4pcpp11S7CommLayer8toStringEv:
   51|  2.47k|	{
   52|  2.47k|		std::ostringstream str;
   53|  2.47k|		str << "S7Comm Layer, ";
   54|       |
   55|  2.47k|		switch (getS7commHeader()->msgType)
   56|  2.47k|		{
   57|    188|		case 0x01:
  ------------------
  |  Branch (57:3): [True: 188, False: 2.29k]
  ------------------
   58|    188|			str << "Job Request";
   59|    188|			break;
   60|      6|		case 0x02:
  ------------------
  |  Branch (60:3): [True: 6, False: 2.47k]
  ------------------
   61|      6|			str << "Ack";
   62|      6|			break;
   63|    160|		case 0x03:
  ------------------
  |  Branch (63:3): [True: 160, False: 2.31k]
  ------------------
   64|    160|			str << "Ack-Data";
   65|    160|			break;
   66|  1.45k|		case 0x07:
  ------------------
  |  Branch (66:3): [True: 1.45k, False: 1.02k]
  ------------------
   67|  1.45k|			str << "Userdata";
   68|  1.45k|			break;
   69|    670|		default:
  ------------------
  |  Branch (69:3): [True: 670, False: 1.80k]
  ------------------
   70|    670|			str << "Unknown message";
   71|  2.47k|		}
   72|       |
   73|  2.47k|		return str.str();
   74|  2.47k|	}
_ZN4pcpp11S7CommLayer11isDataValidEPKhm:
  120|  10.2k|	{
  121|  10.2k|		if (!data || dataSize < sizeof(s7commhdr))
  ------------------
  |  Branch (121:7): [True: 0, False: 10.2k]
  |  Branch (121:16): [True: 133, False: 10.1k]
  ------------------
  122|    133|			return false;
  123|       |
  124|  10.1k|		return data[0] == 0x32;
  125|  10.2k|	}

_ZN4pcpp8SSHLayer16createSSHMessageEPhmPNS_5LayerEPNS_6PacketE:
   19|  18.1k|	{
   20|  18.1k|		SSHIdentificationMessage* sshIdnetMsg = SSHIdentificationMessage::tryParse(data, dataLen, prevLayer, packet);
   21|  18.1k|		if (sshIdnetMsg != nullptr)
  ------------------
  |  Branch (21:7): [True: 1.48k, False: 16.6k]
  ------------------
   22|  1.48k|			return sshIdnetMsg;
   23|       |
   24|  16.6k|		SSHHandshakeMessage* sshHandshakeMessage = SSHHandshakeMessage::tryParse(data, dataLen, prevLayer, packet);
   25|  16.6k|		if (sshHandshakeMessage != nullptr)
  ------------------
  |  Branch (25:7): [True: 3.64k, False: 13.0k]
  ------------------
   26|  3.64k|			return sshHandshakeMessage;
   27|       |
   28|  13.0k|		return new SSHEncryptedMessage(data, dataLen, prevLayer, packet);
   29|  16.6k|	}
_ZN4pcpp8SSHLayer14parseNextLayerEv:
   32|  18.1k|	{
   33|  18.1k|		size_t headerLen = getHeaderLen();
   34|  18.1k|		if (m_DataLen <= headerLen)
  ------------------
  |  Branch (34:7): [True: 17.1k, False: 974]
  ------------------
   35|  17.1k|			return;
   36|       |
   37|    974|		constructNextLayerFromFactory(SSHLayer::createSSHMessage, m_Data + headerLen, m_DataLen - headerLen);
   38|    974|	}
_ZN4pcpp24SSHIdentificationMessage8tryParseEPhmPNS_5LayerEPNS_6PacketE:
   46|  18.1k|	{
   47|       |		// Payload must be at least as long as the string "SSH-"
   48|  18.1k|		if (dataLen < 5)
  ------------------
  |  Branch (48:7): [True: 199, False: 17.9k]
  ------------------
   49|    199|			return nullptr;
   50|       |
   51|       |		// Payload must begin with "SSH-" and end with "\n"
   52|  17.9k|		if (data[0] == 0x53 && data[1] == 0x53 && data[2] == 0x48 && data[3] == 0x2d && data[dataLen - 1] == 0x0a)
  ------------------
  |  Branch (52:7): [True: 10.1k, False: 7.84k]
  |  Branch (52:26): [True: 9.81k, False: 306]
  |  Branch (52:45): [True: 9.72k, False: 85]
  |  Branch (52:64): [True: 9.71k, False: 10]
  |  Branch (52:83): [True: 1.48k, False: 8.23k]
  ------------------
   53|  1.48k|			return new SSHIdentificationMessage(data, dataLen, prevLayer, packet);
   54|       |
   55|  16.4k|		return nullptr;
   56|  17.9k|	}
_ZNK4pcpp24SSHIdentificationMessage8toStringEv:
   66|    514|	{
   67|    514|		return std::string(SshLayerBaseString) + ", " + "Identification message";
   68|    514|	}
_ZNK4pcpp19SSHHandshakeMessage14getMessageTypeEv:
   75|  1.12k|	{
   76|  1.12k|		uint8_t messageCode = getMsgBaseHeader()->messageCode;
   77|  1.12k|		if (messageCode == 20 || messageCode == 21 || (messageCode >= 30 && messageCode <= 34))
  ------------------
  |  Branch (77:7): [True: 280, False: 846]
  |  Branch (77:28): [True: 292, False: 554]
  |  Branch (77:50): [True: 554, False: 0]
  |  Branch (77:71): [True: 554, False: 0]
  ------------------
   78|  1.12k|			return static_cast<SSHHandshakeMessage::SSHHandshakeMessageType>(messageCode);
   79|      0|		return SSHHandshakeMessage::SSH_MSG_UNKNOWN;
   80|  1.12k|	}
_ZNK4pcpp19SSHHandshakeMessage17getMessageTypeStrEv:
   83|  1.12k|	{
   84|  1.12k|		switch (getMessageType())
   85|  1.12k|		{
   86|    280|		case SSHHandshakeMessage::SSH_MSG_KEX_INIT:
  ------------------
  |  Branch (86:3): [True: 280, False: 846]
  ------------------
   87|    280|			return "Key Exchange Init";
   88|    292|		case SSHHandshakeMessage::SSH_MSG_NEW_KEYS:
  ------------------
  |  Branch (88:3): [True: 292, False: 834]
  ------------------
   89|    292|			return "New Keys";
   90|      6|		case SSHHandshakeMessage::SSH_MSG_KEX_DH_INIT:
  ------------------
  |  Branch (90:3): [True: 6, False: 1.12k]
  ------------------
   91|      6|			return "Diffie-Hellman Key Exchange Init";
   92|    130|		case SSHHandshakeMessage::SSH_MSG_KEX_DH_REPLY:
  ------------------
  |  Branch (92:3): [True: 130, False: 996]
  ------------------
   93|    130|			return "Diffie-Hellman Key Exchange Reply";
   94|    128|		case SSHHandshakeMessage::SSH_MSG_KEX_DH_GEX_INIT:
  ------------------
  |  Branch (94:3): [True: 128, False: 998]
  ------------------
   95|    128|			return "Diffie-Hellman Group Exchange Init";
   96|    164|		case SSHHandshakeMessage::SSH_MSG_KEX_DH_GEX_REPLY:
  ------------------
  |  Branch (96:3): [True: 164, False: 962]
  ------------------
   97|    164|			return "Diffie-Hellman Group Exchange Reply";
   98|    126|		case SSHHandshakeMessage::SSH_MSG_KEX_DH_GEX_REQUEST:
  ------------------
  |  Branch (98:3): [True: 126, False: 1.00k]
  ------------------
   99|    126|			return "Diffie-Hellman Group Exchange Request";
  100|      0|		default:
  ------------------
  |  Branch (100:3): [True: 0, False: 1.12k]
  ------------------
  101|      0|			return "Unknown";
  102|  1.12k|		}
  103|  1.12k|	}
_ZNK4pcpp19SSHHandshakeMessage12getHeaderLenEv:
  130|  4.21k|	{
  131|       |		return (size_t)be32toh(getMsgBaseHeader()->packetLength) + sizeof(uint32_t);
  132|  4.21k|	}
_ZNK4pcpp19SSHHandshakeMessage8toStringEv:
  135|  1.12k|	{
  136|  1.12k|		return std::string(SshLayerBaseString) + ", " + "Handshake Message: " + getMessageTypeStr();
  137|  1.12k|	}
_ZN4pcpp19SSHHandshakeMessage8tryParseEPhmPNS_5LayerEPNS_6PacketE:
  140|  16.6k|	{
  141|  16.6k|		if (dataLen < sizeof(SSHHandshakeMessage::ssh_message_base))
  ------------------
  |  Branch (141:7): [True: 199, False: 16.4k]
  ------------------
  142|    199|		{
  143|    199|			PCPP_LOG_DEBUG(
  ------------------
  |  |  427|    199|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|    199|	do                                                                                                                 \
  |  |  |  |  415|    199|	{                                                                                                                  \
  |  |  |  |  416|    199|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    199|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    199|#define LOG_MODULE PacketLogModuleSSHLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 199]
  |  |  |  |  ------------------
  |  |  |  |  418|    199|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSSHLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|    199|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 199]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  144|    199|			    "Data length is smaller than the minimum size of an SSH handshake message. It's probably not an SSH handshake message");
  145|    199|			return nullptr;
  146|    199|		}
  147|       |
  148|  16.4k|		SSHHandshakeMessage::ssh_message_base* msgBase = (SSHHandshakeMessage::ssh_message_base*)data;
  149|       |
  150|  16.4k|		uint32_t msgLength = be32toh(msgBase->packetLength);
  151|  16.4k|		if (msgLength + sizeof(uint32_t) > dataLen)
  ------------------
  |  Branch (151:7): [True: 12.7k, False: 3.73k]
  ------------------
  152|  12.7k|		{
  153|  12.7k|			PCPP_LOG_DEBUG("Message size is larger than layer size. It's probably not an SSH handshake message");
  ------------------
  |  |  427|  12.7k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  12.7k|	do                                                                                                                 \
  |  |  |  |  415|  12.7k|	{                                                                                                                  \
  |  |  |  |  416|  12.7k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  12.7k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  12.7k|#define LOG_MODULE PacketLogModuleSSHLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 12.7k]
  |  |  |  |  ------------------
  |  |  |  |  418|  12.7k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSSHLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  12.7k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 12.7k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  154|  12.7k|			return nullptr;
  155|  12.7k|		}
  156|       |
  157|  3.73k|		if (msgBase->paddingLength > msgLength)
  ------------------
  |  Branch (157:7): [True: 10, False: 3.72k]
  ------------------
  158|     10|		{
  159|     10|			PCPP_LOG_DEBUG("Message padding is larger than message size. It's probably not an SSH handshake message");
  ------------------
  |  |  427|     10|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|     10|	do                                                                                                                 \
  |  |  |  |  415|     10|	{                                                                                                                  \
  |  |  |  |  416|     10|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|     10|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|     10|#define LOG_MODULE PacketLogModuleSSHLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 10]
  |  |  |  |  ------------------
  |  |  |  |  418|     10|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSSHLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|     10|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 10]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  160|     10|			return nullptr;
  161|     10|		}
  162|       |
  163|  3.72k|		if (msgBase->messageCode != 20 && msgBase->messageCode != 21 &&
  ------------------
  |  Branch (163:7): [True: 2.84k, False: 881]
  |  Branch (163:37): [True: 1.91k, False: 926]
  ------------------
  164|  1.91k|		    (msgBase->messageCode < 30 || msgBase->messageCode > 49))
  ------------------
  |  Branch (164:8): [True: 16, False: 1.89k]
  |  Branch (164:37): [True: 58, False: 1.84k]
  ------------------
  165|     74|		{
  166|     74|			PCPP_LOG_DEBUG("Unknown message type " << (int)msgBase->messageCode
  ------------------
  |  |  427|     74|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|     74|	do                                                                                                                 \
  |  |  |  |  415|     74|	{                                                                                                                  \
  |  |  |  |  416|     74|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|     74|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|     74|#define LOG_MODULE PacketLogModuleSSHLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 74]
  |  |  |  |  ------------------
  |  |  |  |  418|     74|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSSHLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|     74|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 74]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  167|     74|			                                       << ". It's probably not an SSH handshake message");
  168|     74|			return nullptr;
  169|     74|		}
  170|       |
  171|  3.64k|		switch (msgBase->messageCode)
  172|  3.64k|		{
  173|    881|		case SSHHandshakeMessage::SSH_MSG_KEX_INIT:
  ------------------
  |  Branch (173:3): [True: 881, False: 2.76k]
  ------------------
  174|    881|			return new SSHKeyExchangeInitMessage(data, dataLen, prevLayer, packet);
  175|  2.76k|		default:
  ------------------
  |  Branch (175:3): [True: 2.76k, False: 881]
  ------------------
  176|  2.76k|			return new SSHHandshakeMessage(data, dataLen, prevLayer, packet);
  177|  3.64k|		}
  178|  3.64k|	}
_ZN4pcpp25SSHKeyExchangeInitMessageC2EPhmPNS_5LayerEPNS_6PacketE:
  186|    881|	    : SSHHandshakeMessage(data, dataLen, prevLayer, packet), m_OffsetsInitialized(false)
  187|    881|	{
  188|    881|		memset(m_FieldOffsets, 0, 11 * sizeof(size_t));
  189|    881|	}
_ZNK4pcpp19SSHEncryptedMessage8toStringEv:
  264|  4.89k|	{
  265|  4.89k|		return std::string(SshLayerBaseString) + ", " + "Encrypted Message";
  266|  4.89k|	}

_ZN4pcpp10SSLVersion6asEnumEb:
   13|   326k|	{
   14|   326k|		if (m_SSLVersionValue >= 0x0300 && m_SSLVersionValue <= 0x0304)
  ------------------
  |  Branch (14:7): [True: 326k, False: 12]
  |  Branch (14:38): [True: 324k, False: 1.75k]
  ------------------
   15|   324k|			return static_cast<SSLVersion::SSLVersionEnum>(m_SSLVersionValue);
   16|       |
   17|  1.76k|		if ((m_SSLVersionValue >= 0x7f0e && m_SSLVersionValue <= 0x7f1c) || m_SSLVersionValue == 0xfb17 ||
  ------------------
  |  Branch (17:8): [True: 799, False: 966]
  |  Branch (17:39): [True: 0, False: 799]
  |  Branch (17:71): [True: 224, False: 1.54k]
  ------------------
   18|  1.54k|		    m_SSLVersionValue == 0xfb1a)
  ------------------
  |  Branch (18:7): [True: 0, False: 1.54k]
  ------------------
   19|    224|		{
   20|    224|			if (countTlsDraftsAs1_3)
  ------------------
  |  Branch (20:8): [True: 224, False: 0]
  ------------------
   21|    224|				return SSLVersion::TLS1_3;
   22|      0|			else
   23|      0|				return static_cast<SSLVersion::SSLVersionEnum>(m_SSLVersionValue);
   24|    224|		}
   25|       |
   26|  1.54k|		return SSLVersion::Unknown;
   27|  1.76k|	}
_ZN4pcpp10SSLVersion8toStringEb:
   30|  71.9k|	{
   31|  71.9k|		SSLVersionEnum enumValue = asEnum(countTlsDraftsAs1_3);
   32|       |
   33|  71.9k|		switch (enumValue)
   34|  71.9k|		{
   35|  1.70k|		case SSLVersion::TLS1_3:
  ------------------
  |  Branch (35:3): [True: 1.70k, False: 70.2k]
  ------------------
   36|  1.70k|			return "TLS 1.3";
   37|  55.1k|		case SSLVersion::TLS1_2:
  ------------------
  |  Branch (37:3): [True: 55.1k, False: 16.7k]
  ------------------
   38|  55.1k|			return "TLS 1.2";
   39|      8|		case SSLVersion::TLS1_1:
  ------------------
  |  Branch (39:3): [True: 8, False: 71.9k]
  ------------------
   40|      8|			return "TLS 1.1";
   41|  12.8k|		case SSLVersion::TLS1_0:
  ------------------
  |  Branch (41:3): [True: 12.8k, False: 59.1k]
  ------------------
   42|  12.8k|			return "TLS 1.0";
   43|  2.22k|		case SSLVersion::SSL3:
  ------------------
  |  Branch (43:3): [True: 2.22k, False: 69.7k]
  ------------------
   44|  2.22k|			return "SSL 3.0";
   45|      0|		case SSLVersion::TLS1_3_D28:
  ------------------
  |  Branch (45:3): [True: 0, False: 71.9k]
  ------------------
   46|      0|			return "TLS 1.3 (draft 28)";
   47|      0|		case SSLVersion::TLS1_3_D27:
  ------------------
  |  Branch (47:3): [True: 0, False: 71.9k]
  ------------------
   48|      0|			return "TLS 1.3 (draft 27)";
   49|      0|		case SSLVersion::TLS1_3_D26:
  ------------------
  |  Branch (49:3): [True: 0, False: 71.9k]
  ------------------
   50|      0|			return "TLS 1.3 (draft 26)";
   51|      0|		case SSLVersion::TLS1_3_D25:
  ------------------
  |  Branch (51:3): [True: 0, False: 71.9k]
  ------------------
   52|      0|			return "TLS 1.3 (draft 25)";
   53|      0|		case SSLVersion::TLS1_3_D24:
  ------------------
  |  Branch (53:3): [True: 0, False: 71.9k]
  ------------------
   54|      0|			return "TLS 1.3 (draft 24)";
   55|      0|		case SSLVersion::TLS1_3_D23:
  ------------------
  |  Branch (55:3): [True: 0, False: 71.9k]
  ------------------
   56|      0|			return "TLS 1.3 (draft 23)";
   57|      0|		case SSLVersion::TLS1_3_D22:
  ------------------
  |  Branch (57:3): [True: 0, False: 71.9k]
  ------------------
   58|      0|			return "TLS 1.3 (draft 22)";
   59|      0|		case SSLVersion::TLS1_3_D21:
  ------------------
  |  Branch (59:3): [True: 0, False: 71.9k]
  ------------------
   60|      0|			return "TLS 1.3 (draft 21)";
   61|      0|		case SSLVersion::TLS1_3_D20:
  ------------------
  |  Branch (61:3): [True: 0, False: 71.9k]
  ------------------
   62|      0|			return "TLS 1.3 (draft 20)";
   63|      0|		case SSLVersion::TLS1_3_D19:
  ------------------
  |  Branch (63:3): [True: 0, False: 71.9k]
  ------------------
   64|      0|			return "TLS 1.3 (draft 19)";
   65|      0|		case SSLVersion::TLS1_3_D18:
  ------------------
  |  Branch (65:3): [True: 0, False: 71.9k]
  ------------------
   66|      0|			return "TLS 1.3 (draft 18)";
   67|      0|		case SSLVersion::TLS1_3_D17:
  ------------------
  |  Branch (67:3): [True: 0, False: 71.9k]
  ------------------
   68|      0|			return "TLS 1.3 (draft 17)";
   69|      0|		case SSLVersion::TLS1_3_D16:
  ------------------
  |  Branch (69:3): [True: 0, False: 71.9k]
  ------------------
   70|      0|			return "TLS 1.3 (draft 16)";
   71|      0|		case SSLVersion::TLS1_3_D15:
  ------------------
  |  Branch (71:3): [True: 0, False: 71.9k]
  ------------------
   72|      0|			return "TLS 1.3 (draft 15)";
   73|      0|		case SSLVersion::TLS1_3_D14:
  ------------------
  |  Branch (73:3): [True: 0, False: 71.9k]
  ------------------
   74|      0|			return "TLS 1.3 (draft 14)";
   75|      0|		case SSLVersion::TLS1_3_FBD23:
  ------------------
  |  Branch (75:3): [True: 0, False: 71.9k]
  ------------------
   76|      0|			return "TLS 1.3 (Facebook draft 23)";
   77|      0|		case SSLVersion::TLS1_3_FBD26:
  ------------------
  |  Branch (77:3): [True: 0, False: 71.9k]
  ------------------
   78|      0|			return "TLS 1.3 (Facebook draft 26)";
   79|      0|		case SSLVersion::Unknown:
  ------------------
  |  Branch (79:3): [True: 0, False: 71.9k]
  ------------------
   80|      0|			return "Unknown";
   81|      0|		default:
  ------------------
  |  Branch (81:3): [True: 0, False: 71.9k]
  ------------------
   82|      0|			return "Unknown";
   83|  71.9k|		}
   84|  71.9k|	}

_ZN4pcpp15createGreaseSetEv:
 1041|      2|	{
 1042|      2|		uint16_t greaseExtensions[] = { 0x0a0a, 0x1a1a, 0x2a2a, 0x3a3a, 0x4a4a, 0x5a5a, 0x6a6a, 0x7a7a,
 1043|      2|			                            0x8a8a, 0x9a9a, 0xaaaa, 0xbaba, 0xcaca, 0xdada, 0xeaea, 0xfafa };
 1044|      2|		return std::set<uint16_t>(greaseExtensions, greaseExtensions + 16);
 1045|      2|	}
_ZN4pcpp14SSLCipherSuite18getCipherSuiteByIDEt:
 1056|   135k|	{
 1057|   135k|		auto pos = CipherSuiteIdToObjectMap.find(id);
 1058|   135k|		if (pos == CipherSuiteIdToObjectMap.end())
  ------------------
  |  Branch (1058:7): [True: 63.9k, False: 71.3k]
  ------------------
 1059|  63.9k|			return nullptr;
 1060|  71.3k|		else
 1061|  71.3k|			return pos->second;
 1062|   135k|	}
_ZN4pcpp14SSLCipherSuite20getCipherSuiteByNameENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 1065|  6.33k|	{
 1066|  6.33k|		uint32_t nameHash = hashString(std::move(name));
 1067|  6.33k|		auto pos = CipherSuiteStringToObjectMap.find(nameHash);
 1068|  6.33k|		if (pos == CipherSuiteStringToObjectMap.end())
  ------------------
  |  Branch (1068:7): [True: 0, False: 6.33k]
  ------------------
 1069|      0|			return nullptr;
 1070|  6.33k|		else
 1071|  6.33k|			return pos->second;
 1072|  6.33k|	}
_ZN4pcpp12SSLExtensionC2EPhm:
 1081|   225k|	SSLExtension::SSLExtension(uint8_t* data, size_t dataLen) : m_RawData(data), m_RawDataLen(dataLen)
 1082|   225k|	{
 1083|   225k|		if (data == nullptr || dataLen < 2 * sizeof(uint16_t))
  ------------------
  |  Branch (1083:7): [True: 0, False: 225k]
  |  Branch (1083:26): [True: 0, False: 225k]
  ------------------
 1084|      0|		{
 1085|      0|			throw std::invalid_argument("Insufficient data buffer for SSL extension header");
 1086|      0|		}
 1087|       |
 1088|   225k|		uint16_t extDataLen = getLength();
 1089|   225k|		if (dataLen < (2 * sizeof(uint16_t) + extDataLen))
  ------------------
  |  Branch (1089:7): [True: 0, False: 225k]
  ------------------
 1090|      0|		{
 1091|      0|			throw std::invalid_argument("Insufficient data buffer for SSL extension data");
 1092|      0|		}
 1093|   225k|	}
_ZNK4pcpp12SSLExtension7getTypeEv:
 1096|  13.6k|	{
 1097|  13.6k|		uint16_t typeAsInt = getTypeAsInt();
 1098|  13.6k|		if (typeAsInt <= 24 || typeAsInt == 35 || typeAsInt == 65281)
  ------------------
  |  Branch (1098:7): [True: 7.07k, False: 6.55k]
  |  Branch (1098:26): [True: 417, False: 6.13k]
  |  Branch (1098:45): [True: 1.35k, False: 4.78k]
  ------------------
 1099|  8.84k|			return (SSLExtensionType)typeAsInt;
 1100|       |
 1101|  4.78k|		return SSL_EXT_Unknown;
 1102|  13.6k|	}
_ZNK4pcpp12SSLExtension12getTypeAsIntEv:
 1105|  61.8k|	{
 1106|       |		return be16toh(getExtensionStruct()->extensionType);
 1107|  61.8k|	}
_ZNK4pcpp12SSLExtension9getLengthEv:
 1110|   475k|	{
 1111|   475k|		return getExtensionStruct()->getDataLength();
 1112|   475k|	}
_ZNK4pcpp12SSLExtension14getTotalLengthEv:
 1115|   225k|	{
 1116|   225k|		return getLength() + 2 * sizeof(uint16_t);
 1117|   225k|	}
_ZNK4pcpp12SSLExtension7getDataEv:
 1120|  15.2k|	{
 1121|  15.2k|		if (getLength() > 0)
  ------------------
  |  Branch (1121:7): [True: 14.5k, False: 701]
  ------------------
 1122|  14.5k|		{
 1123|  14.5k|			return getExtensionStruct()->extensionData;
 1124|  14.5k|		}
 1125|       |
 1126|    701|		return nullptr;
 1127|  15.2k|	}
_ZNK4pcpp12SSLExtension18SSLExtensionStruct13getDataLengthEv:
 1130|   712k|	{
 1131|       |		return be16toh(extensionDataLength);
 1132|   712k|	}
_ZNK4pcpp32SSLServerNameIndicationExtension11getHostNameEv:
 1139|  3.44k|	{
 1140|  3.44k|		auto* extensionDataPtr = getData();
 1141|       |		// server name list length + name type + host name length
 1142|  3.44k|		constexpr size_t minExtensionDataLen = sizeof(uint16_t) + sizeof(uint8_t) + sizeof(uint16_t);
 1143|  3.44k|		auto length = getLength();
 1144|  3.44k|		if (extensionDataPtr == nullptr || length < minExtensionDataLen)
  ------------------
  |  Branch (1144:7): [True: 701, False: 2.73k]
  |  Branch (1144:38): [True: 1, False: 2.73k]
  ------------------
 1145|    702|		{
 1146|    702|			return "";
 1147|    702|		}
 1148|       |
 1149|  2.73k|		uint8_t const* hostNameLengthPos = extensionDataPtr + sizeof(uint16_t) + sizeof(uint8_t);
 1150|  2.73k|		uint16_t hostNameLength = be16toh(*reinterpret_cast<uint16_t const*>(hostNameLengthPos));
 1151|       |
 1152|  2.73k|		uint8_t const* hostNameDataIt = hostNameLengthPos + sizeof(uint16_t);
 1153|  2.73k|		uint8_t const* hostNameDataEndIt = hostNameDataIt + hostNameLength;
 1154|  2.73k|		uint8_t const* extensionDataEndIt = extensionDataPtr + length;
 1155|       |
 1156|  2.73k|		if (hostNameDataEndIt > extensionDataEndIt)
  ------------------
  |  Branch (1156:7): [True: 48, False: 2.69k]
  ------------------
 1157|     48|		{
 1158|     48|			PCPP_LOG_WARN("Host name length exceeds extension data length. Possible data corruption. Truncating.");
  ------------------
  |  |  433|     48|#	define PCPP_LOG_WARN(message) PCPP_LOG(pcpp::LogLevel::Warn, message)
  |  |  ------------------
  |  |  |  |  414|     48|	do                                                                                                                 \
  |  |  |  |  415|     48|	{                                                                                                                  \
  |  |  |  |  416|     48|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|     48|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|     48|#define LOG_MODULE PacketLogModuleSSLLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 48, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|     48|		{                                                                                                              \
  |  |  |  |  419|     48|			auto ctx =                                                                                                 \
  |  |  |  |  420|     48|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|     48|#define LOG_MODULE PacketLogModuleSSLLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|     48|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|     48|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|     48|		}                                                                                                              \
  |  |  |  |  424|     48|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 48]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1159|     48|			hostNameDataEndIt = extensionDataEndIt;
 1160|     48|		}
 1161|       |
 1162|  2.73k|		return std::string(hostNameDataIt, hostNameDataEndIt);
 1163|  3.44k|	}
_ZNK4pcpp29SSLSupportedVersionsExtension20getSupportedVersionsEv:
 1170|  2.00k|	{
 1171|  2.00k|		std::vector<SSLVersion> result;
 1172|  2.00k|		uint16_t extensionLength = getLength();
 1173|  2.00k|		if (extensionLength == 0)
  ------------------
  |  Branch (1173:7): [True: 0, False: 2.00k]
  ------------------
 1174|      0|			return result;  // bad extension data
 1175|       |
 1176|  2.00k|		if (extensionLength == 2)  // server hello message
  ------------------
  |  Branch (1176:7): [True: 948, False: 1.06k]
  ------------------
 1177|    948|		{
 1178|    948|			result.push_back(SSLVersion(be16toh(*reinterpret_cast<uint16_t*>(getData()))));
 1179|    948|		}
 1180|  1.06k|		else  // client-hello message
 1181|  1.06k|		{
 1182|  1.06k|			uint8_t listLength = *getData();
 1183|  1.06k|			if (listLength != static_cast<uint8_t>(extensionLength - 1) || listLength % 2 != 0)
  ------------------
  |  Branch (1183:8): [True: 5, False: 1.05k]
  |  Branch (1183:67): [True: 0, False: 1.05k]
  ------------------
 1184|      5|				return result;  // bad extension data
 1185|       |
 1186|  1.05k|			uint8_t* dataPtr = getData() + sizeof(uint8_t);
 1187|  3.82k|			for (int i = 0; i < listLength / 2; i++)
  ------------------
  |  Branch (1187:20): [True: 2.76k, False: 1.05k]
  ------------------
 1188|  2.76k|			{
 1189|  2.76k|				result.push_back(SSLVersion(be16toh(*reinterpret_cast<uint16_t*>(dataPtr))));
 1190|  2.76k|				dataPtr += sizeof(uint16_t);
 1191|  2.76k|			}
 1192|  1.05k|		}
 1193|       |
 1194|  2.00k|		return result;
 1195|  2.00k|	}
_ZNK4pcpp27TLSSupportedGroupsExtension18getSupportedGroupsEv:
 1202|  2.99k|	{
 1203|  2.99k|		std::vector<uint16_t> result;
 1204|       |
 1205|  2.99k|		uint16_t extensionLength = getLength();
 1206|  2.99k|		if (extensionLength < sizeof(uint16_t))
  ------------------
  |  Branch (1206:7): [True: 0, False: 2.99k]
  ------------------
 1207|      0|			return result;  // bad extension data
 1208|       |
 1209|  2.99k|		uint16_t listLength = be16toh(*(uint16_t*)getData());
 1210|  2.99k|		if (listLength != (extensionLength - sizeof(uint16_t)) || listLength % 2 != 0)
  ------------------
  |  Branch (1210:7): [True: 203, False: 2.79k]
  |  Branch (1210:61): [True: 0, False: 2.79k]
  ------------------
 1211|    203|			return result;  // bad extension data
 1212|       |
 1213|  2.79k|		uint8_t* dataPtr = getData() + sizeof(uint16_t);
 1214|  15.9k|		for (int i = 0; i < listLength / 2; i++)
  ------------------
  |  Branch (1214:19): [True: 13.1k, False: 2.79k]
  ------------------
 1215|  13.1k|		{
 1216|  13.1k|			result.push_back(be16toh(*reinterpret_cast<uint16_t*>(dataPtr)));
 1217|  13.1k|			dataPtr += sizeof(uint16_t);
 1218|  13.1k|		}
 1219|       |
 1220|  2.79k|		return result;
 1221|  2.99k|	}
_ZNK4pcpp25TLSECPointFormatExtension20getECPointFormatListEv:
 1228|  1.49k|	{
 1229|  1.49k|		std::vector<uint8_t> result;
 1230|       |
 1231|  1.49k|		uint16_t extensionLength = getLength();
 1232|       |
 1233|  1.49k|		if (extensionLength < 1)
  ------------------
  |  Branch (1233:7): [True: 9, False: 1.48k]
  ------------------
 1234|      9|			return result;
 1235|       |
 1236|  1.48k|		uint8_t listLength = *getData();
 1237|       |
 1238|  1.48k|		if (extensionLength != static_cast<uint16_t>(listLength) + 1)
  ------------------
  |  Branch (1238:7): [True: 2, False: 1.47k]
  ------------------
 1239|      2|			return result;  // bad extension data
 1240|       |
 1241|  1.47k|		uint8_t* dataPtr = getData() + sizeof(uint8_t);
 1242|  3.55k|		for (int i = 0; i < listLength; i++)
  ------------------
  |  Branch (1242:19): [True: 2.07k, False: 1.47k]
  ------------------
 1243|  2.07k|		{
 1244|  2.07k|			result.push_back(*dataPtr);
 1245|  2.07k|			dataPtr += sizeof(uint8_t);
 1246|  2.07k|		}
 1247|       |
 1248|  1.47k|		return result;
 1249|  1.48k|	}
_ZN4pcpp19SSLHandshakeMessageC2EPhmPNS_17SSLHandshakeLayerE:
 1287|   119k|	{
 1288|   119k|		m_Data = data;
 1289|   119k|		m_DataLen = dataLen;
 1290|   119k|		m_Container = container;
 1291|   119k|	}
_ZN4pcpp19SSLHandshakeMessage22createHandshakeMessageEPhmPNS_17SSLHandshakeLayerE:
 1295|   245k|	{
 1296|   245k|		if (dataLen < sizeof(ssl_tls_handshake_layer))
  ------------------
  |  Branch (1296:7): [True: 125k, False: 119k]
  ------------------
 1297|   125k|			return nullptr;
 1298|       |
 1299|   119k|		ssl_tls_handshake_layer* hsMsgHeader = reinterpret_cast<ssl_tls_handshake_layer*>(data);
 1300|       |
 1301|   119k|		if (dataLen >= 16 && (be64toh(*(uint64_t*)data) <= 0xFFFFFF || hsMsgHeader->length1 >= 1))
  ------------------
  |  Branch (1301:7): [True: 109k, False: 10.2k]
  |  Branch (1301:25): [True: 2.43k, False: 107k]
  |  Branch (1301:66): [True: 18.2k, False: 88.8k]
  ------------------
 1302|  20.7k|		{
 1303|       |			// possibly Encrypted Handshake Message
 1304|       |			// used heuristic:
 1305|       |			// - handshake layer of more than 16 byte
 1306|       |			// - first 5 bytes of the handshake message are zeroes
 1307|       |			// - or wrong message length is over 64K
 1308|       |			// - or message type makes so sense (handled through the switch statement)
 1309|  20.7k|			return new SSLUnknownMessage(data, dataLen, container);
 1310|  20.7k|		}
 1311|       |
 1312|  99.0k|		switch (hsMsgHeader->handshakeType)
 1313|  99.0k|		{
 1314|  39.7k|		case SSL_CLIENT_HELLO:
  ------------------
  |  Branch (1314:3): [True: 39.7k, False: 59.3k]
  ------------------
 1315|  39.7k|			return new SSLClientHelloMessage(data, dataLen, container);
 1316|  34.2k|		case SSL_SERVER_HELLO:
  ------------------
  |  Branch (1316:3): [True: 34.2k, False: 64.7k]
  ------------------
 1317|  34.2k|			return new SSLServerHelloMessage(data, dataLen, container);
 1318|  6.96k|		case SSL_HELLO_REQUEST:
  ------------------
  |  Branch (1318:3): [True: 6.96k, False: 92.0k]
  ------------------
 1319|  6.96k|			return new SSLHelloRequestMessage(data, dataLen, container);
 1320|  2.01k|		case SSL_CERTIFICATE:
  ------------------
  |  Branch (1320:3): [True: 2.01k, False: 97.0k]
  ------------------
 1321|  2.01k|			return new SSLCertificateMessage(data, dataLen, container);
 1322|     48|		case SSL_SERVER_KEY_EXCHANGE:
  ------------------
  |  Branch (1322:3): [True: 48, False: 98.9k]
  ------------------
 1323|     48|			return new SSLServerKeyExchangeMessage(data, dataLen, container);
 1324|  1.33k|		case SSL_CERTIFICATE_REQUEST:
  ------------------
  |  Branch (1324:3): [True: 1.33k, False: 97.7k]
  ------------------
 1325|  1.33k|			return new SSLCertificateRequestMessage(data, dataLen, container);
 1326|      0|		case SSL_CERTIFICATE_VERIFY:
  ------------------
  |  Branch (1326:3): [True: 0, False: 99.0k]
  ------------------
 1327|      0|			return new SSLCertificateVerifyMessage(data, dataLen, container);
 1328|  3.28k|		case SSL_CLIENT_KEY_EXCHANGE:
  ------------------
  |  Branch (1328:3): [True: 3.28k, False: 95.7k]
  ------------------
 1329|  3.28k|			return new SSLClientKeyExchangeMessage(data, dataLen, container);
 1330|  2.01k|		case SSL_FINISHED:
  ------------------
  |  Branch (1330:3): [True: 2.01k, False: 97.0k]
  ------------------
 1331|  2.01k|			return new SSLFinishedMessage(data, dataLen, container);
 1332|  8.37k|		case SSL_SERVER_DONE:
  ------------------
  |  Branch (1332:3): [True: 8.37k, False: 90.6k]
  ------------------
 1333|  8.37k|			return new SSLServerHelloDoneMessage(data, dataLen, container);
 1334|    646|		case SSL_NEW_SESSION_TICKET:
  ------------------
  |  Branch (1334:3): [True: 646, False: 98.4k]
  ------------------
 1335|    646|			return new SSLNewSessionTicketMessage(data, dataLen, container);
 1336|    369|		default:
  ------------------
  |  Branch (1336:3): [True: 369, False: 98.6k]
  ------------------
 1337|    369|			return new SSLUnknownMessage(data, dataLen, container);
 1338|  99.0k|		}
 1339|  99.0k|	}
_ZNK4pcpp19SSLHandshakeMessage16getHandshakeTypeEv:
 1342|  6.33k|	{
 1343|  6.33k|		ssl_tls_handshake_layer* handshakeLayer = reinterpret_cast<ssl_tls_handshake_layer*>(m_Data);
 1344|  6.33k|		return (SSLHandshakeType)handshakeLayer->handshakeType;
 1345|  6.33k|	}
_ZNK4pcpp19SSLHandshakeMessage16getMessageLengthEv:
 1348|   246k|	{
 1349|   246k|		ssl_tls_handshake_layer* handshakeLayer = reinterpret_cast<ssl_tls_handshake_layer*>(m_Data);
 1350|       |		// TODO: add handshakeLayer->length1 to the calculation
 1351|   246k|		size_t len = sizeof(ssl_tls_handshake_layer) + be16toh(handshakeLayer->length2);
 1352|   246k|		if (len > m_DataLen)
  ------------------
  |  Branch (1352:7): [True: 63.9k, False: 182k]
  ------------------
 1353|  63.9k|			return m_DataLen;
 1354|       |
 1355|   182k|		return len;
 1356|   246k|	}
_ZNK4pcpp19SSLHandshakeMessage17isMessageCompleteEv:
 1359|  11.0k|	{
 1360|  11.0k|		if (m_DataLen < sizeof(ssl_tls_handshake_layer))
  ------------------
  |  Branch (1360:7): [True: 0, False: 11.0k]
  ------------------
 1361|      0|			return false;
 1362|       |
 1363|  11.0k|		ssl_tls_handshake_layer* handshakeLayer = reinterpret_cast<ssl_tls_handshake_layer*>(m_Data);
 1364|       |		size_t len = sizeof(ssl_tls_handshake_layer) + be16toh(handshakeLayer->length2);
 1365|  11.0k|		return len <= m_DataLen;
 1366|  11.0k|	}
_ZN4pcpp21SSLClientHelloMessageC2EPhmPNS_17SSLHandshakeLayerE:
 1373|  39.7k|	    : SSLHandshakeMessage(data, dataLen, container)
 1374|  39.7k|	{
 1375|  39.7k|		size_t extensionLengthOffset = sizeof(ssl_tls_client_server_hello) + sizeof(uint8_t) + getSessionIDLength() +
 1376|  39.7k|		                               sizeof(uint16_t) + sizeof(uint16_t) * getCipherSuiteCount() +
 1377|  39.7k|		                               2 * sizeof(uint8_t);
 1378|  39.7k|		if (extensionLengthOffset + sizeof(uint16_t) > m_DataLen)
  ------------------
  |  Branch (1378:7): [True: 17.3k, False: 22.3k]
  ------------------
 1379|  17.3k|			return;
 1380|       |
 1381|  22.3k|		uint8_t* extensionLengthPos = m_Data + extensionLengthOffset;
 1382|  22.3k|		uint16_t extensionLength = getExtensionsLength();
 1383|  22.3k|		uint8_t* extensionPos = extensionLengthPos + sizeof(uint16_t);
 1384|       |
 1385|  22.3k|		size_t messageLen = getMessageLength();
 1386|       |
 1387|       |		// Iterators for the entire extension data buffer containing the extensions blocks.
 1388|  22.3k|		uint8_t* extensionIt = extensionPos;
 1389|  22.3k|		uint8_t* extensionEndIt = extensionPos + extensionLength;
 1390|       |
 1391|       |		// If the message length is smaller that the extension data buffer, we might have malformed data.
 1392|       |		// In this case, the extension data buffer is truncated to the message length, to avoid out-of-bounds access.
 1393|  22.3k|		uint8_t* endOfMessageIt = m_Data + messageLen;
 1394|  22.3k|		if (endOfMessageIt < extensionEndIt)
  ------------------
  |  Branch (1394:7): [True: 6.63k, False: 15.7k]
  ------------------
 1395|  6.63k|		{
 1396|  6.63k|			extensionEndIt = endOfMessageIt;
 1397|  6.63k|		}
 1398|       |
 1399|  22.3k|		constexpr size_t minSSLExtensionLen = 2 * sizeof(uint16_t);
 1400|   213k|		while (extensionIt < extensionEndIt &&
  ------------------
  |  Branch (1400:10): [True: 205k, False: 8.10k]
  ------------------
 1401|   205k|		       std::distance(extensionIt, extensionEndIt) >= static_cast<std::ptrdiff_t>(minSSLExtensionLen))
  ------------------
  |  Branch (1401:10): [True: 202k, False: 3.68k]
  ------------------
 1402|   202k|		{
 1403|   202k|			std::unique_ptr<SSLExtension> newExt;
 1404|       |
 1405|   202k|			uint16_t sslExtType = be16toh(*reinterpret_cast<uint16_t*>(extensionIt));
 1406|   202k|			size_t availableDataLen = std::distance(extensionIt, extensionEndIt);
 1407|       |
 1408|   202k|			switch (sslExtType)
 1409|   202k|			{
 1410|  25.7k|			case SSL_EXT_SERVER_NAME:
  ------------------
  |  Branch (1410:4): [True: 25.7k, False: 176k]
  ------------------
 1411|  25.7k|			{
 1412|  25.7k|				newExt =
 1413|  25.7k|				    SSLExtension::tryCreateExtension<SSLServerNameIndicationExtension>(extensionIt, availableDataLen);
 1414|  25.7k|				break;
 1415|      0|			}
 1416|  5.43k|			case SSL_EXT_SUPPORTED_VERSIONS:
  ------------------
  |  Branch (1416:4): [True: 5.43k, False: 196k]
  ------------------
 1417|  5.43k|			{
 1418|  5.43k|				newExt = SSLExtension::tryCreateExtension<SSLSupportedVersionsExtension>(extensionIt, availableDataLen);
 1419|  5.43k|				break;
 1420|      0|			}
 1421|  15.0k|			case SSL_EXT_SUPPORTED_GROUPS:
  ------------------
  |  Branch (1421:4): [True: 15.0k, False: 187k]
  ------------------
 1422|  15.0k|			{
 1423|  15.0k|				newExt = SSLExtension::tryCreateExtension<TLSSupportedGroupsExtension>(extensionIt, availableDataLen);
 1424|  15.0k|				break;
 1425|      0|			}
 1426|  7.48k|			case SSL_EXT_EC_POINT_FORMATS:
  ------------------
  |  Branch (1426:4): [True: 7.48k, False: 194k]
  ------------------
 1427|  7.48k|			{
 1428|  7.48k|				newExt = SSLExtension::tryCreateExtension<TLSECPointFormatExtension>(extensionIt, availableDataLen);
 1429|  7.48k|				break;
 1430|      0|			}
 1431|   148k|			default:
  ------------------
  |  Branch (1431:4): [True: 148k, False: 53.7k]
  ------------------
 1432|   148k|			{
 1433|   148k|				newExt = SSLExtension::tryCreateExtension<SSLExtension>(extensionIt, availableDataLen);
 1434|   148k|			}
 1435|   202k|			}
 1436|       |
 1437|   202k|			if (newExt == nullptr)
  ------------------
  |  Branch (1437:8): [True: 10.5k, False: 191k]
  ------------------
 1438|  10.5k|			{
 1439|  10.5k|				PCPP_LOG_DEBUG("Failed to parse SSL extension of type " << sslExtType
  ------------------
  |  |  427|  10.5k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  10.5k|	do                                                                                                                 \
  |  |  |  |  415|  10.5k|	{                                                                                                                  \
  |  |  |  |  416|  10.5k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  10.5k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  10.5k|#define LOG_MODULE PacketLogModuleSSLLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 10.5k]
  |  |  |  |  ------------------
  |  |  |  |  418|  10.5k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSSLLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  10.5k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 10.5k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1440|  10.5k|				                                                        << " skipping remaining extensions.");
 1441|  10.5k|				break;
 1442|  10.5k|			}
 1443|       |
 1444|       |			// Total length can be zero only if getLength() == 0xfffc which is way too large
 1445|       |			// and means that this extension (and packet) are malformed
 1446|   191k|			size_t newExtTotalLen = newExt->getTotalLength();
 1447|   191k|			if (newExtTotalLen == 0)
  ------------------
  |  Branch (1447:8): [True: 0, False: 191k]
  ------------------
 1448|      0|			{
 1449|      0|				break;
 1450|      0|			}
 1451|       |
 1452|   191k|			m_ExtensionList.pushBack(std::move(newExt));
 1453|   191k|			std::advance(extensionIt, newExtTotalLen);
 1454|   191k|		}
 1455|  22.3k|	}
_ZNK4pcpp21SSLClientHelloMessage19getHandshakeVersionEv:
 1458|  12.6k|	{
 1459|  12.6k|		if (m_DataLen < sizeof(ssl_tls_handshake_layer) + sizeof(uint16_t))
  ------------------
  |  Branch (1459:7): [True: 430, False: 12.2k]
  ------------------
 1460|    430|			return SSLVersion(0);
 1461|       |
 1462|  12.2k|		uint16_t handshakeVersion = be16toh(getClientHelloHeader()->handshakeVersion);
 1463|  12.2k|		return SSLVersion(handshakeVersion);
 1464|  12.6k|	}
_ZNK4pcpp21SSLClientHelloMessage18getSessionIDLengthEv:
 1467|   110M|	{
 1468|   110M|		if (m_DataLen <= sizeof(ssl_tls_client_server_hello) + sizeof(uint8_t))
  ------------------
  |  Branch (1468:7): [True: 13.1k, False: 110M]
  ------------------
 1469|  13.1k|			return 0;
 1470|       |
 1471|   110M|		uint8_t val = *(m_Data + sizeof(ssl_tls_client_server_hello));
 1472|   110M|		if ((size_t)val > m_DataLen - sizeof(ssl_tls_client_server_hello) - 1)
  ------------------
  |  Branch (1472:7): [True: 2.36k, False: 110M]
  ------------------
 1473|  2.36k|			return (uint8_t)(m_DataLen - sizeof(ssl_tls_client_server_hello) - 1);
 1474|       |
 1475|   110M|		return val;
 1476|   110M|	}
_ZNK4pcpp21SSLClientHelloMessage12getSessionIDEv:
 1479|  6.33k|	{
 1480|  6.33k|		if (getSessionIDLength() > 0)
  ------------------
  |  Branch (1480:7): [True: 1.45k, False: 4.87k]
  ------------------
 1481|  1.45k|			return (m_Data + sizeof(ssl_tls_client_server_hello) + 1);
 1482|  4.87k|		else
 1483|  4.87k|			return nullptr;
 1484|  6.33k|	}
_ZNK4pcpp21SSLClientHelloMessage19getCipherSuiteCountEv:
 1487|  62.9M|	{
 1488|  62.9M|		size_t cipherSuiteOffset = sizeof(ssl_tls_client_server_hello) + sizeof(uint8_t) + getSessionIDLength();
 1489|  62.9M|		if (cipherSuiteOffset + sizeof(uint16_t) > m_DataLen)
  ------------------
  |  Branch (1489:7): [True: 8.00k, False: 62.9M]
  ------------------
 1490|  8.00k|			return 0;
 1491|       |
 1492|  62.9M|		uint16_t cipherSuiteLen = *(uint16_t*)(m_Data + cipherSuiteOffset);
 1493|       |		return be16toh(cipherSuiteLen) / 2;
 1494|  62.9M|	}
_ZNK4pcpp21SSLClientHelloMessage14getCipherSuiteEi:
 1497|  15.7M|	{
 1498|  15.7M|		bool isValid;
 1499|  15.7M|		uint16_t id = getCipherSuiteID(index, isValid);
 1500|  15.7M|		return (isValid ? SSLCipherSuite::getCipherSuiteByID(id) : nullptr);
  ------------------
  |  Branch (1500:11): [True: 132k, False: 15.5M]
  ------------------
 1501|  15.7M|	}
_ZNK4pcpp21SSLClientHelloMessage16getCipherSuiteIDEiRb:
 1504|  47.1M|	{
 1505|  47.1M|		if (index < 0 || index >= getCipherSuiteCount())
  ------------------
  |  Branch (1505:7): [True: 0, False: 47.1M]
  |  Branch (1505:20): [True: 0, False: 47.1M]
  ------------------
 1506|      0|		{
 1507|      0|			isValid = false;
 1508|      0|			return 0;
 1509|      0|		}
 1510|       |
 1511|  47.1M|		size_t cipherSuiteStartOffset =
 1512|  47.1M|		    sizeof(ssl_tls_client_server_hello) + sizeof(uint8_t) + getSessionIDLength() + sizeof(uint16_t);
 1513|  47.1M|		if (cipherSuiteStartOffset + sizeof(uint16_t) * (index + 1) > m_DataLen)
  ------------------
  |  Branch (1513:7): [True: 46.7M, False: 397k]
  ------------------
 1514|  46.7M|		{
 1515|  46.7M|			isValid = false;
 1516|  46.7M|			return 0;
 1517|  46.7M|		}
 1518|       |
 1519|   397k|		isValid = true;
 1520|   397k|		uint16_t* cipherSuiteStartPos = (uint16_t*)(m_Data + cipherSuiteStartOffset);
 1521|       |		return be16toh(*(cipherSuiteStartPos + index));
 1522|  47.1M|	}
_ZNK4pcpp21SSLClientHelloMessage26getCompressionMethodsValueEv:
 1525|  6.33k|	{
 1526|  6.33k|		size_t offset = sizeof(ssl_tls_client_server_hello) + sizeof(uint8_t) + getSessionIDLength() +
 1527|  6.33k|		                sizeof(uint16_t) + sizeof(uint16_t) * getCipherSuiteCount() + sizeof(uint8_t);
 1528|  6.33k|		if (offset + sizeof(uint8_t) > m_DataLen)
  ------------------
  |  Branch (1528:7): [True: 2.36k, False: 3.96k]
  ------------------
 1529|  2.36k|			return 0xff;
 1530|       |
 1531|  3.96k|		uint8_t* pos = m_Data + offset;
 1532|  3.96k|		return *pos;
 1533|  6.33k|	}
_ZNK4pcpp21SSLClientHelloMessage17getExtensionCountEv:
 1536|  6.33k|	{
 1537|  6.33k|		return m_ExtensionList.size();
 1538|  6.33k|	}
_ZNK4pcpp21SSLClientHelloMessage19getExtensionsLengthEv:
 1541|  22.3k|	{
 1542|  22.3k|		size_t extensionLengthOffset = sizeof(ssl_tls_client_server_hello) + sizeof(uint8_t) + getSessionIDLength() +
 1543|  22.3k|		                               sizeof(uint16_t) + sizeof(uint16_t) * getCipherSuiteCount() +
 1544|  22.3k|		                               2 * sizeof(uint8_t);
 1545|  22.3k|		if (extensionLengthOffset + sizeof(uint16_t) > m_DataLen)
  ------------------
  |  Branch (1545:7): [True: 0, False: 22.3k]
  ------------------
 1546|      0|			return 0;
 1547|       |
 1548|  22.3k|		uint8_t* extensionLengthPos = m_Data + extensionLengthOffset;
 1549|       |		return be16toh(*reinterpret_cast<uint16_t*>(extensionLengthPos));
 1550|  22.3k|	}
_ZNK4pcpp21SSLClientHelloMessage12getExtensionEi:
 1553|  33.5k|	{
 1554|  33.5k|		return const_cast<SSLExtension*>(m_ExtensionList.at(index));
 1555|  33.5k|	}
_ZNK4pcpp21SSLClientHelloMessage18getExtensionOfTypeEt:
 1558|  6.33k|	{
 1559|  6.33k|		size_t vecSize = m_ExtensionList.size();
 1560|  11.6k|		for (size_t i = 0; i < vecSize; i++)
  ------------------
  |  Branch (1560:22): [True: 8.72k, False: 2.89k]
  ------------------
 1561|  8.72k|		{
 1562|  8.72k|			SSLExtension* curElem = const_cast<SSLExtension*>(m_ExtensionList.at(i));
 1563|  8.72k|			if (curElem->getTypeAsInt() == type)
  ------------------
  |  Branch (1563:8): [True: 3.44k, False: 5.28k]
  ------------------
 1564|  3.44k|				return curElem;
 1565|  8.72k|		}
 1566|       |
 1567|  2.89k|		return nullptr;
 1568|  6.33k|	}
_ZNK4pcpp21SSLClientHelloMessage18getExtensionOfTypeENS_16SSLExtensionTypeE:
 1571|  6.33k|	{
 1572|  6.33k|		size_t vecSize = m_ExtensionList.size();
 1573|  11.6k|		for (size_t i = 0; i < vecSize; i++)
  ------------------
  |  Branch (1573:22): [True: 8.72k, False: 2.89k]
  ------------------
 1574|  8.72k|		{
 1575|  8.72k|			SSLExtension* curElem = const_cast<SSLExtension*>(m_ExtensionList.at(i));
 1576|  8.72k|			if (curElem->getType() == type)
  ------------------
  |  Branch (1576:8): [True: 3.44k, False: 5.28k]
  ------------------
 1577|  3.44k|				return curElem;
 1578|  8.72k|		}
 1579|       |
 1580|  2.89k|		return nullptr;
 1581|  6.33k|	}
_ZNK4pcpp21SSLClientHelloMessage22generateTLSFingerprintEv:
 1584|  6.33k|	{
 1585|  6.33k|		SSLClientHelloMessage::ClientHelloTLSFingerprint result;
 1586|       |
 1587|       |		// extract version
 1588|  6.33k|		result.tlsVersion = getHandshakeVersion().asUInt();
 1589|       |
 1590|       |		// extract cipher suites
 1591|  6.33k|		int cipherSuiteCount = getCipherSuiteCount();
 1592|  15.7M|		for (int i = 0; i < cipherSuiteCount; i++)
  ------------------
  |  Branch (1592:19): [True: 15.7M, False: 6.33k]
  ------------------
 1593|  15.7M|		{
 1594|  15.7M|			bool isValid = false;
 1595|  15.7M|			uint16_t cipherSuiteID = getCipherSuiteID(i, isValid);
 1596|  15.7M|			if (isValid && GreaseSet.find(cipherSuiteID) == GreaseSet.end())
  ------------------
  |  Branch (1596:8): [True: 132k, False: 15.5M]
  |  Branch (1596:8): [True: 130k, False: 15.5M]
  |  Branch (1596:19): [True: 130k, False: 2.05k]
  ------------------
 1597|   130k|				result.cipherSuites.push_back(cipherSuiteID);
 1598|  15.7M|		}
 1599|       |
 1600|       |		// extract extensions
 1601|  6.33k|		int extensionCount = getExtensionCount();
 1602|  39.9k|		for (int i = 0; i < extensionCount; i++)
  ------------------
  |  Branch (1602:19): [True: 33.5k, False: 6.33k]
  ------------------
 1603|  33.5k|		{
 1604|  33.5k|			uint16_t extensionType = getExtension(i)->getTypeAsInt();
 1605|  33.5k|			if (GreaseSet.find(extensionType) != GreaseSet.end())
  ------------------
  |  Branch (1605:8): [True: 893, False: 32.6k]
  ------------------
 1606|    893|				continue;
 1607|       |
 1608|  32.6k|			result.extensions.push_back(extensionType);
 1609|  32.6k|		}
 1610|       |
 1611|       |		// extract supported groups
 1612|  6.33k|		TLSSupportedGroupsExtension* supportedGroupsExt = getExtensionOfType<TLSSupportedGroupsExtension>();
 1613|  6.33k|		if (supportedGroupsExt != nullptr)
  ------------------
  |  Branch (1613:7): [True: 2.99k, False: 3.33k]
  ------------------
 1614|  2.99k|		{
 1615|  2.99k|			std::vector<uint16_t> supportedGroups = supportedGroupsExt->getSupportedGroups();
 1616|  2.99k|			for (const auto& iter : supportedGroups)
  ------------------
  |  Branch (1616:26): [True: 13.1k, False: 2.99k]
  ------------------
 1617|  13.1k|				if (GreaseSet.find(iter) == GreaseSet.end())
  ------------------
  |  Branch (1617:9): [True: 12.8k, False: 268]
  ------------------
 1618|  12.8k|					result.supportedGroups.push_back(iter);
 1619|  2.99k|		}
 1620|       |
 1621|       |		// extract EC point formats
 1622|  6.33k|		TLSECPointFormatExtension* ecPointFormatExt = getExtensionOfType<TLSECPointFormatExtension>();
 1623|  6.33k|		if (ecPointFormatExt != nullptr)
  ------------------
  |  Branch (1623:7): [True: 1.49k, False: 4.84k]
  ------------------
 1624|  1.49k|		{
 1625|  1.49k|			result.ecPointFormats = ecPointFormatExt->getECPointFormatList();
 1626|  1.49k|		}
 1627|       |
 1628|  6.33k|		return result;
 1629|  6.33k|	}
_ZNK4pcpp21SSLClientHelloMessage8toStringEv:
 1632|  12.7k|	{
 1633|  12.7k|		return "Client Hello message";
 1634|  12.7k|	}
_ZN4pcpp21SSLClientHelloMessage25ClientHelloTLSFingerprint8toStringEv:
 1641|  6.33k|	{
 1642|  6.33k|		std::stringstream tlsFingerprint;
 1643|       |
 1644|       |		// add version
 1645|  6.33k|		tlsFingerprint << tlsVersion << ",";
 1646|       |
 1647|       |		// add cipher suites
 1648|  6.33k|		bool firstCipher = true;
 1649|  6.33k|		for (const auto& iter : cipherSuites)
  ------------------
  |  Branch (1649:25): [True: 130k, False: 6.33k]
  ------------------
 1650|   130k|		{
 1651|   130k|			tlsFingerprint << (firstCipher ? "" : "-") << iter;
  ------------------
  |  Branch (1651:23): [True: 5.76k, False: 124k]
  ------------------
 1652|   130k|			firstCipher = false;
 1653|   130k|		}
 1654|  6.33k|		tlsFingerprint << ",";
 1655|       |
 1656|       |		// add extensions
 1657|  6.33k|		bool firstExtension = true;
 1658|  6.33k|		for (const auto& iter : extensions)
  ------------------
  |  Branch (1658:25): [True: 32.6k, False: 6.33k]
  ------------------
 1659|  32.6k|		{
 1660|  32.6k|			tlsFingerprint << (firstExtension ? "" : "-") << iter;
  ------------------
  |  Branch (1660:23): [True: 3.91k, False: 28.7k]
  ------------------
 1661|  32.6k|			firstExtension = false;
 1662|  32.6k|		}
 1663|  6.33k|		tlsFingerprint << ",";
 1664|       |
 1665|       |		// add supported groups
 1666|  6.33k|		bool firstGroup = true;
 1667|  6.33k|		for (const auto& iter : supportedGroups)
  ------------------
  |  Branch (1667:25): [True: 12.8k, False: 6.33k]
  ------------------
 1668|  12.8k|		{
 1669|  12.8k|			tlsFingerprint << (firstGroup ? "" : "-") << iter;
  ------------------
  |  Branch (1669:23): [True: 2.79k, False: 10.0k]
  ------------------
 1670|  12.8k|			firstGroup = false;
 1671|  12.8k|		}
 1672|  6.33k|		tlsFingerprint << ",";
 1673|       |
 1674|       |		// add EC point formats
 1675|  6.33k|		bool firstPointFormat = true;
 1676|  6.33k|		for (auto iter : ecPointFormats)
  ------------------
  |  Branch (1676:18): [True: 2.07k, False: 6.33k]
  ------------------
 1677|  2.07k|		{
 1678|  2.07k|			tlsFingerprint << (firstPointFormat ? "" : "-") << (int)iter;
  ------------------
  |  Branch (1678:23): [True: 1.47k, False: 600]
  ------------------
 1679|  2.07k|			firstPointFormat = false;
 1680|  2.07k|		}
 1681|       |
 1682|  6.33k|		return tlsFingerprint.str();
 1683|  6.33k|	}
_ZN4pcpp21SSLClientHelloMessage25ClientHelloTLSFingerprint5toMD5Ev:
 1686|  6.33k|	{
 1687|  6.33k|		return toStringAndMD5().second;
 1688|  6.33k|	}
_ZN4pcpp21SSLClientHelloMessage25ClientHelloTLSFingerprint14toStringAndMD5Ev:
 1691|  6.33k|	{
 1692|  6.33k|		std::string str = toString();
 1693|  6.33k|		MD5 md5;
 1694|  6.33k|		return std::pair<std::string, std::string>(str, md5(str));
 1695|  6.33k|	}
_ZN4pcpp21SSLServerHelloMessageC2EPhmPNS_17SSLHandshakeLayerE:
 1702|  34.2k|	    : SSLHandshakeMessage(data, dataLen, container)
 1703|  34.2k|	{
 1704|  34.2k|		size_t extensionLengthOffset = sizeof(ssl_tls_client_server_hello) + sizeof(uint8_t) + getSessionIDLength() +
 1705|  34.2k|		                               sizeof(uint16_t) + sizeof(uint8_t);
 1706|  34.2k|		if (extensionLengthOffset + sizeof(uint16_t) > m_DataLen)
  ------------------
  |  Branch (1706:7): [True: 10.8k, False: 23.3k]
  ------------------
 1707|  10.8k|			return;
 1708|       |
 1709|  23.3k|		uint8_t* extensionLengthPos = m_Data + extensionLengthOffset;
 1710|  23.3k|		uint16_t extensionLength = getExtensionsLength();
 1711|  23.3k|		uint8_t* extensionPos = extensionLengthPos + sizeof(uint16_t);
 1712|  23.3k|		size_t messageLen = getMessageLength();
 1713|       |
 1714|  23.3k|		uint8_t* extensionIt = extensionPos;
 1715|  23.3k|		uint8_t* extensionEndIt = extensionPos + extensionLength;
 1716|       |
 1717|  23.3k|		uint8_t* endOfMessageIt = m_Data + messageLen;
 1718|  23.3k|		if (endOfMessageIt < extensionEndIt)
  ------------------
  |  Branch (1718:7): [True: 16.9k, False: 6.39k]
  ------------------
 1719|  16.9k|		{
 1720|  16.9k|			extensionEndIt = endOfMessageIt;
 1721|  16.9k|		}
 1722|       |
 1723|  23.3k|		constexpr size_t minSSLExtensionLen = 2 * sizeof(uint16_t);
 1724|  57.0k|		while (extensionIt < extensionEndIt &&
  ------------------
  |  Branch (1724:10): [True: 35.6k, False: 21.3k]
  ------------------
 1725|  35.6k|		       std::distance(extensionIt, extensionEndIt) >= static_cast<std::ptrdiff_t>(minSSLExtensionLen))
  ------------------
  |  Branch (1725:10): [True: 34.9k, False: 766]
  ------------------
 1726|  34.9k|		{
 1727|  34.9k|			std::unique_ptr<SSLExtension> newExt;
 1728|       |
 1729|  34.9k|			uint16_t sslExtType = be16toh(*reinterpret_cast<uint16_t*>(extensionIt));
 1730|  34.9k|			size_t availableDataLen = std::distance(extensionIt, extensionEndIt);
 1731|       |
 1732|  34.9k|			switch (sslExtType)
 1733|  34.9k|			{
 1734|  13.6k|			case SSL_EXT_SERVER_NAME:
  ------------------
  |  Branch (1734:4): [True: 13.6k, False: 21.2k]
  ------------------
 1735|  13.6k|			{
 1736|  13.6k|				newExt =
 1737|  13.6k|				    SSLExtension::tryCreateExtension<SSLServerNameIndicationExtension>(extensionIt, availableDataLen);
 1738|  13.6k|				break;
 1739|      0|			}
 1740|  3.54k|			case SSL_EXT_SUPPORTED_VERSIONS:
  ------------------
  |  Branch (1740:4): [True: 3.54k, False: 31.3k]
  ------------------
 1741|  3.54k|			{
 1742|  3.54k|				newExt = SSLExtension::tryCreateExtension<SSLSupportedVersionsExtension>(extensionIt, availableDataLen);
 1743|  3.54k|				break;
 1744|      0|			}
 1745|     35|			case SSL_EXT_SUPPORTED_GROUPS:
  ------------------
  |  Branch (1745:4): [True: 35, False: 34.8k]
  ------------------
 1746|     35|			{
 1747|     35|				newExt = SSLExtension::tryCreateExtension<TLSSupportedGroupsExtension>(extensionIt, availableDataLen);
 1748|     35|				break;
 1749|      0|			}
 1750|  1.83k|			case SSL_EXT_EC_POINT_FORMATS:
  ------------------
  |  Branch (1750:4): [True: 1.83k, False: 33.0k]
  ------------------
 1751|  1.83k|			{
 1752|  1.83k|				newExt = SSLExtension::tryCreateExtension<TLSECPointFormatExtension>(extensionIt, availableDataLen);
 1753|  1.83k|				break;
 1754|      0|			}
 1755|  15.8k|			default:
  ------------------
  |  Branch (1755:4): [True: 15.8k, False: 19.0k]
  ------------------
 1756|  15.8k|			{
 1757|  15.8k|				newExt = SSLExtension::tryCreateExtension<SSLExtension>(extensionIt, availableDataLen);
 1758|  15.8k|			}
 1759|  34.9k|			}
 1760|       |
 1761|  34.9k|			if (newExt == nullptr)
  ------------------
  |  Branch (1761:8): [True: 1.26k, False: 33.6k]
  ------------------
 1762|  1.26k|			{
 1763|  1.26k|				PCPP_LOG_DEBUG("Failed to parse SSL extension of type " << sslExtType
  ------------------
  |  |  427|  1.26k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  1.26k|	do                                                                                                                 \
  |  |  |  |  415|  1.26k|	{                                                                                                                  \
  |  |  |  |  416|  1.26k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  1.26k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.26k|#define LOG_MODULE PacketLogModuleSSLLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 1.26k]
  |  |  |  |  ------------------
  |  |  |  |  418|  1.26k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSSLLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  1.26k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 1.26k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1764|  1.26k|				                                                        << " skipping remaining extensions.");
 1765|  1.26k|				break;
 1766|  1.26k|			}
 1767|       |
 1768|       |			// Total length can be zero only if getLength() == 0xfffc which is way too large
 1769|       |			// and means that this extension (and packet) are malformed
 1770|  33.6k|			size_t newExtTotalLen = newExt->getTotalLength();
 1771|  33.6k|			if (newExtTotalLen == 0)
  ------------------
  |  Branch (1771:8): [True: 0, False: 33.6k]
  ------------------
 1772|      0|			{
 1773|      0|				break;
 1774|      0|			}
 1775|       |
 1776|  33.6k|			m_ExtensionList.pushBack(std::move(newExt));
 1777|  33.6k|			std::advance(extensionIt, newExtTotalLen);
 1778|  33.6k|		}
 1779|  23.3k|	}
_ZNK4pcpp21SSLServerHelloMessage19getHandshakeVersionEv:
 1782|  7.22k|	{
 1783|  7.22k|		SSLSupportedVersionsExtension* supportedVersionsExt = getExtensionOfType<SSLSupportedVersionsExtension>();
 1784|  7.22k|		if (supportedVersionsExt != nullptr)
  ------------------
  |  Branch (1784:7): [True: 976, False: 6.25k]
  ------------------
 1785|    976|		{
 1786|    976|			std::vector<SSLVersion> supportedVersions = supportedVersionsExt->getSupportedVersions();
 1787|    976|			if (supportedVersions.size() == 1)
  ------------------
  |  Branch (1787:8): [True: 948, False: 28]
  ------------------
 1788|    948|				return supportedVersions[0];
 1789|    976|		}
 1790|       |
 1791|  6.28k|		if (m_DataLen < sizeof(ssl_tls_handshake_layer) + sizeof(uint16_t))
  ------------------
  |  Branch (1791:7): [True: 8, False: 6.27k]
  ------------------
 1792|      8|			return SSLVersion(0);
 1793|       |
 1794|  6.27k|		uint16_t handshakeVersion = be16toh(getServerHelloHeader()->handshakeVersion);
 1795|  6.27k|		return SSLVersion(handshakeVersion);
 1796|  6.28k|	}
_ZNK4pcpp21SSLServerHelloMessage18getSessionIDLengthEv:
 1798|  72.0k|	{
 1799|  72.0k|		if (m_DataLen <= sizeof(ssl_tls_client_server_hello) + sizeof(uint8_t))
  ------------------
  |  Branch (1799:7): [True: 4.62k, False: 67.4k]
  ------------------
 1800|  4.62k|			return 0;
 1801|       |
 1802|  67.4k|		uint8_t val = *(m_Data + sizeof(ssl_tls_client_server_hello));
 1803|  67.4k|		if ((size_t)val > m_DataLen - sizeof(ssl_tls_client_server_hello) - 1)
  ------------------
  |  Branch (1803:7): [True: 8.75k, False: 58.6k]
  ------------------
 1804|  8.75k|			return (uint8_t)(m_DataLen - sizeof(ssl_tls_client_server_hello) - 1);
 1805|       |
 1806|  58.6k|		return val;
 1807|  67.4k|	}
_ZNK4pcpp21SSLServerHelloMessage12getSessionIDEv:
 1810|  3.61k|	{
 1811|  3.61k|		if (getSessionIDLength() > 0)
  ------------------
  |  Branch (1811:7): [True: 2.99k, False: 623]
  ------------------
 1812|  2.99k|			return (m_Data + sizeof(ssl_tls_client_server_hello) + 1);
 1813|    623|		else
 1814|    623|			return nullptr;
 1815|  3.61k|	}
_ZNK4pcpp21SSLServerHelloMessage14getCipherSuiteEv:
 1818|  3.61k|	{
 1819|  3.61k|		bool isValid;
 1820|  3.61k|		uint16_t id = getCipherSuiteID(isValid);
 1821|  3.61k|		return (isValid ? SSLCipherSuite::getCipherSuiteByID(id) : nullptr);
  ------------------
  |  Branch (1821:11): [True: 2.80k, False: 814]
  ------------------
 1822|  3.61k|	}
_ZNK4pcpp21SSLServerHelloMessage16getCipherSuiteIDERb:
 1825|  7.22k|	{
 1826|  7.22k|		size_t cipherSuiteStartOffset = sizeof(ssl_tls_client_server_hello) + sizeof(uint8_t) + getSessionIDLength();
 1827|  7.22k|		if (cipherSuiteStartOffset + sizeof(uint16_t) > m_DataLen)
  ------------------
  |  Branch (1827:7): [True: 1.62k, False: 5.60k]
  ------------------
 1828|  1.62k|		{
 1829|  1.62k|			isValid = false;
 1830|  1.62k|			return 0;
 1831|  1.62k|		}
 1832|       |
 1833|  5.60k|		isValid = true;
 1834|  5.60k|		uint16_t* cipherSuiteStartPos = (uint16_t*)(m_Data + cipherSuiteStartOffset);
 1835|       |		return be16toh(*(cipherSuiteStartPos));
 1836|  7.22k|	}
_ZNK4pcpp21SSLServerHelloMessage26getCompressionMethodsValueEv:
 1839|  3.61k|	{
 1840|  3.61k|		size_t offset = sizeof(ssl_tls_client_server_hello) + sizeof(uint8_t) + getSessionIDLength() + sizeof(uint16_t);
 1841|  3.61k|		if (offset + sizeof(uint8_t) > m_DataLen)
  ------------------
  |  Branch (1841:7): [True: 815, False: 2.79k]
  ------------------
 1842|    815|			return 0xff;
 1843|       |
 1844|  2.79k|		uint8_t* pos = m_Data + offset;
 1845|  2.79k|		return *pos;
 1846|  3.61k|	}
_ZNK4pcpp21SSLServerHelloMessage17getExtensionCountEv:
 1849|  3.61k|	{
 1850|  3.61k|		return m_ExtensionList.size();
 1851|  3.61k|	}
_ZNK4pcpp21SSLServerHelloMessage19getExtensionsLengthEv:
 1854|  23.3k|	{
 1855|  23.3k|		size_t extensionLengthOffset = sizeof(ssl_tls_client_server_hello) + sizeof(uint8_t) + getSessionIDLength() +
 1856|  23.3k|		                               sizeof(uint16_t) + sizeof(uint8_t);
 1857|  23.3k|		if (extensionLengthOffset + sizeof(uint16_t) > m_DataLen)
  ------------------
  |  Branch (1857:7): [True: 0, False: 23.3k]
  ------------------
 1858|      0|			return 0;
 1859|       |
 1860|  23.3k|		uint16_t* extensionLengthPos = (uint16_t*)(m_Data + extensionLengthOffset);
 1861|       |		return be16toh(*extensionLengthPos);
 1862|  23.3k|	}
_ZNK4pcpp21SSLServerHelloMessage12getExtensionEi:
 1865|  5.90k|	{
 1866|  5.90k|		if (index < 0 || index >= (int)m_ExtensionList.size())
  ------------------
  |  Branch (1866:7): [True: 0, False: 5.90k]
  |  Branch (1866:20): [True: 0, False: 5.90k]
  ------------------
 1867|      0|			return nullptr;
 1868|       |
 1869|  5.90k|		return const_cast<SSLExtension*>(m_ExtensionList.at(index));
 1870|  5.90k|	}
_ZNK4pcpp21SSLServerHelloMessage18getExtensionOfTypeEt:
 1873|  3.61k|	{
 1874|  3.61k|		size_t vecSize = m_ExtensionList.size();
 1875|  5.58k|		for (size_t i = 0; i < vecSize; i++)
  ------------------
  |  Branch (1875:22): [True: 2.45k, False: 3.13k]
  ------------------
 1876|  2.45k|		{
 1877|  2.45k|			SSLExtension* curElem = const_cast<SSLExtension*>(m_ExtensionList.at(i));
 1878|  2.45k|			if (curElem->getType() == type)
  ------------------
  |  Branch (1878:8): [True: 481, False: 1.97k]
  ------------------
 1879|    481|				return curElem;
 1880|  2.45k|		}
 1881|       |
 1882|  3.13k|		return nullptr;
 1883|  3.61k|	}
_ZNK4pcpp21SSLServerHelloMessage18getExtensionOfTypeENS_16SSLExtensionTypeE:
 1886|  3.61k|	{
 1887|  3.61k|		size_t vecSize = m_ExtensionList.size();
 1888|  5.58k|		for (size_t i = 0; i < vecSize; i++)
  ------------------
  |  Branch (1888:22): [True: 2.45k, False: 3.13k]
  ------------------
 1889|  2.45k|		{
 1890|  2.45k|			SSLExtension* curElem = const_cast<SSLExtension*>(m_ExtensionList.at(i));
 1891|  2.45k|			if (curElem->getType() == type)
  ------------------
  |  Branch (1891:8): [True: 481, False: 1.97k]
  ------------------
 1892|    481|				return curElem;
 1893|  2.45k|		}
 1894|       |
 1895|  3.13k|		return nullptr;
 1896|  3.61k|	}
_ZNK4pcpp21SSLServerHelloMessage22generateTLSFingerprintEv:
 1899|  3.61k|	{
 1900|  3.61k|		SSLServerHelloMessage::ServerHelloTLSFingerprint result;
 1901|       |
 1902|       |		// extract version
 1903|  3.61k|		result.tlsVersion = getHandshakeVersion().asUInt();
 1904|       |
 1905|       |		// extract cipher suite
 1906|  3.61k|		bool isValid;
 1907|  3.61k|		uint16_t cipherSuite = getCipherSuiteID(isValid);
 1908|  3.61k|		result.cipherSuite = (isValid ? cipherSuite : 0);
  ------------------
  |  Branch (1908:25): [True: 2.80k, False: 814]
  ------------------
 1909|       |
 1910|       |		// extract extensions
 1911|  3.61k|		int extensionCount = getExtensionCount();
 1912|  9.52k|		for (int i = 0; i < extensionCount; i++)
  ------------------
  |  Branch (1912:19): [True: 5.90k, False: 3.61k]
  ------------------
 1913|  5.90k|		{
 1914|  5.90k|			uint16_t extensionType = getExtension(i)->getTypeAsInt();
 1915|  5.90k|			result.extensions.push_back(extensionType);
 1916|  5.90k|		}
 1917|       |
 1918|  3.61k|		return result;
 1919|  3.61k|	}
_ZNK4pcpp21SSLServerHelloMessage8toStringEv:
 1922|  7.50k|	{
 1923|  7.50k|		return "Server Hello message";
 1924|  7.50k|	}
_ZN4pcpp21SSLServerHelloMessage25ServerHelloTLSFingerprint8toStringEv:
 1931|  3.61k|	{
 1932|  3.61k|		std::stringstream tlsFingerprint;
 1933|       |
 1934|       |		// add version and cipher suite
 1935|  3.61k|		tlsFingerprint << tlsVersion << "," << cipherSuite << ",";
 1936|       |
 1937|       |		// add extensions
 1938|  3.61k|		bool firstExtension = true;
 1939|  3.61k|		for (const auto& iter : extensions)
  ------------------
  |  Branch (1939:25): [True: 5.90k, False: 3.61k]
  ------------------
 1940|  5.90k|		{
 1941|  5.90k|			tlsFingerprint << (firstExtension ? "" : "-") << iter;
  ------------------
  |  Branch (1941:23): [True: 1.19k, False: 4.70k]
  ------------------
 1942|  5.90k|			firstExtension = false;
 1943|  5.90k|		}
 1944|       |
 1945|  3.61k|		return tlsFingerprint.str();
 1946|  3.61k|	}
_ZN4pcpp21SSLServerHelloMessage25ServerHelloTLSFingerprint5toMD5Ev:
 1949|  3.61k|	{
 1950|  3.61k|		return toStringAndMD5().second;
 1951|  3.61k|	}
_ZN4pcpp21SSLServerHelloMessage25ServerHelloTLSFingerprint14toStringAndMD5Ev:
 1954|  3.61k|	{
 1955|  3.61k|		std::string str = toString();
 1956|  3.61k|		MD5 md5;
 1957|  3.61k|		return std::pair<std::string, std::string>(str, md5(str));
 1958|  3.61k|	}
_ZN4pcpp21SSLCertificateMessageC2EPhmPNS_17SSLHandshakeLayerE:
 1965|  2.01k|	    : SSLHandshakeMessage(data, dataLen, container)
 1966|  2.01k|	{
 1967|  2.01k|		if (dataLen < sizeof(ssl_tls_handshake_layer) + sizeof(uint8_t) * 3)  // certificates length (3B)
  ------------------
  |  Branch (1967:7): [True: 80, False: 1.93k]
  ------------------
 1968|     80|			return;
 1969|       |
 1970|  1.93k|		size_t messageLen = getMessageLength();
 1971|       |		// read certificates length
 1972|       |		// TODO: certificates length is 3B. Currently assuming the MSB is 0 and reading only 2 LSBs
 1973|  1.93k|		uint8_t* curPos = data + sizeof(ssl_tls_handshake_layer) + sizeof(uint8_t);
 1974|  1.93k|		uint16_t certificatesLength = be16toh(*reinterpret_cast<uint16_t*>(curPos));
 1975|  1.93k|		if (certificatesLength == 0)
  ------------------
  |  Branch (1975:7): [True: 0, False: 1.93k]
  ------------------
 1976|      0|			return;
 1977|       |
 1978|       |		// advance to position of first certificate
 1979|  1.93k|		curPos += sizeof(uint16_t);
 1980|       |
 1981|  4.09k|		while (true)
  ------------------
  |  Branch (1981:10): [True: 4.09k, Folded]
  ------------------
 1982|  4.09k|		{
 1983|       |			// try to read certificate length (3B)
 1984|       |			// TODO: certificate length is 3B. Currently assuming the MSB is 0 and reading only 2 LSBs
 1985|  4.09k|			if (curPos + 3 * sizeof(uint8_t) - data > (int)messageLen)
  ------------------
  |  Branch (1985:8): [True: 1.93k, False: 2.15k]
  ------------------
 1986|  1.93k|				break;
 1987|       |
 1988|       |			// read certificate length
 1989|  2.15k|			curPos += sizeof(uint8_t);
 1990|  2.15k|			uint16_t certificateLength = be16toh(*reinterpret_cast<uint16_t*>(curPos));
 1991|       |
 1992|       |			// advance to start position of certificate
 1993|  2.15k|			curPos += sizeof(uint16_t);
 1994|       |
 1995|       |			// if packet doesn't contain the full certificate, read only what you got from current position till the
 1996|       |			// end of the packet
 1997|  2.15k|			bool certificateFull = true;
 1998|  2.15k|			if (curPos - data + certificateLength > (int)messageLen)
  ------------------
  |  Branch (1998:8): [True: 1.93k, False: 213]
  ------------------
 1999|  1.93k|			{
 2000|  1.93k|				certificateLength = messageLen - (curPos - data);
 2001|  1.93k|				certificateFull = false;
 2002|  1.93k|			}
 2003|       |
 2004|  2.15k|			PCPP_LOG_DEBUG("Parsing certificate: pos=" << (int)(curPos - data) << "; len=" << certificateLength);
  ------------------
  |  |  427|  2.15k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  2.15k|	do                                                                                                                 \
  |  |  |  |  415|  2.15k|	{                                                                                                                  \
  |  |  |  |  416|  2.15k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  2.15k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  2.15k|#define LOG_MODULE PacketLogModuleSSLLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 2.15k]
  |  |  |  |  ------------------
  |  |  |  |  418|  2.15k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSSLLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  2.15k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 2.15k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2005|  2.15k|			SSLx509Certificate* newCert = new SSLx509Certificate(curPos, certificateLength, certificateFull);
 2006|  2.15k|			m_CertificateList.pushBack(newCert);
 2007|       |
 2008|  2.15k|			curPos += certificateLength;
 2009|  2.15k|		}
 2010|  1.93k|	}
_ZNK4pcpp21SSLCertificateMessage8toStringEv:
 2013|    690|	{
 2014|    690|		return "Certificate message";
 2015|    690|	}
_ZNK4pcpp22SSLHelloRequestMessage8toStringEv:
 2039|  1.32k|	{
 2040|  1.32k|		return "Hello Request message";
 2041|  1.32k|	}
_ZNK4pcpp25SSLServerHelloDoneMessage8toStringEv:
 2048|  1.74k|	{
 2049|  1.74k|		return "Server Hello Done message";
 2050|  1.74k|	}
_ZNK4pcpp27SSLServerKeyExchangeMessage8toStringEv:
 2074|      8|	{
 2075|      8|		return "Server Key Exchange message";
 2076|      8|	}
_ZNK4pcpp27SSLClientKeyExchangeMessage8toStringEv:
 2100|    968|	{
 2101|    968|		return "Client Key Exchange message";
 2102|    968|	}
_ZN4pcpp28SSLCertificateRequestMessageC2EPhmPNS_17SSLHandshakeLayerE:
 2110|  1.33k|	    : SSLHandshakeMessage(data, dataLen, container)
 2111|  1.33k|	{
 2112|  1.33k|		size_t minMessageSize = sizeof(ssl_tls_handshake_layer) + sizeof(uint8_t);  // certificate types count (1B)
 2113|  1.33k|		if (dataLen < minMessageSize)
  ------------------
  |  Branch (2113:7): [True: 0, False: 1.33k]
  ------------------
 2114|      0|			return;
 2115|       |
 2116|  1.33k|		size_t messageLen = getMessageLength();
 2117|  1.33k|		if (messageLen < minMessageSize)
  ------------------
  |  Branch (2117:7): [True: 0, False: 1.33k]
  ------------------
 2118|      0|			return;
 2119|       |
 2120|  1.33k|		uint8_t certificateTypesCount = *(uint8_t*)(data + sizeof(ssl_tls_handshake_layer));
 2121|       |
 2122|  1.33k|		if (certificateTypesCount > messageLen - minMessageSize)
  ------------------
  |  Branch (2122:7): [True: 171, False: 1.16k]
  ------------------
 2123|    171|			certificateTypesCount = messageLen - minMessageSize;
 2124|       |
 2125|  1.33k|		uint8_t* pos = data + sizeof(ssl_tls_handshake_layer) + sizeof(uint8_t);
 2126|   148k|		for (uint8_t i = 0; i < certificateTypesCount; i++)
  ------------------
  |  Branch (2126:23): [True: 147k, False: 1.33k]
  ------------------
 2127|   147k|		{
 2128|   147k|			uint8_t certType = *(uint8_t*)(pos + i);
 2129|   147k|			if (certType == 0 || (certType > 6 && certType < 20) || (certType > 20 && certType < 64) || certType > 64)
  ------------------
  |  Branch (2129:8): [True: 60.8k, False: 86.5k]
  |  Branch (2129:26): [True: 56.3k, False: 30.2k]
  |  Branch (2129:42): [True: 6.03k, False: 50.3k]
  |  Branch (2129:61): [True: 50.3k, False: 30.2k]
  |  Branch (2129:78): [True: 7.20k, False: 43.0k]
  |  Branch (2129:96): [True: 43.0k, False: 30.2k]
  ------------------
 2130|   117k|				m_ClientCertificateTypes.push_back(SSL_CCT_UNKNOWN);
 2131|  30.2k|			else
 2132|  30.2k|				m_ClientCertificateTypes.push_back(static_cast<SSLClientCertificateType>(certType));
 2133|   147k|		}
 2134|  1.33k|	}
_ZNK4pcpp28SSLCertificateRequestMessage8toStringEv:
 2170|    110|	{
 2171|    110|		return "Certificate Request message";
 2172|    110|	}
_ZNK4pcpp18SSLFinishedMessage8toStringEv:
 2222|     94|	{
 2223|     94|		return "Finished message";
 2224|     94|	}
_ZNK4pcpp26SSLNewSessionTicketMessage8toStringEv:
 2248|    174|	{
 2249|    174|		return "New Session Ticket message";
 2250|    174|	}
_ZNK4pcpp17SSLUnknownMessage16getMessageLengthEv:
 2264|  42.1k|	{
 2265|       |		// if message type is unknown, it may be some encrypted message so message length isn't necessarily written
 2266|       |		// in clear. So in this case assume message is in length of all remaining data
 2267|  42.1k|		return m_DataLen;
 2268|  42.1k|	}
_ZNK4pcpp17SSLUnknownMessage8toStringEv:
 2271|  4.29k|	{
 2272|  4.29k|		return "Unknown message";
 2273|  4.29k|	}
SSLHandshake.cpp:_ZN4pcppL30createCipherSuiteIdToObjectMapEv:
  353|      2|	{
  354|      2|		std::unordered_map<uint16_t, SSLCipherSuite*> result;
  355|       |
  356|      2|		result[0x0000] = (SSLCipherSuite*)&Cipher1;
  357|      2|		result[0x0001] = (SSLCipherSuite*)&Cipher2;
  358|      2|		result[0x0002] = (SSLCipherSuite*)&Cipher3;
  359|      2|		result[0x0003] = (SSLCipherSuite*)&Cipher4;
  360|      2|		result[0x0004] = (SSLCipherSuite*)&Cipher5;
  361|      2|		result[0x0005] = (SSLCipherSuite*)&Cipher6;
  362|      2|		result[0x0006] = (SSLCipherSuite*)&Cipher7;
  363|      2|		result[0x0007] = (SSLCipherSuite*)&Cipher8;
  364|      2|		result[0x0008] = (SSLCipherSuite*)&Cipher9;
  365|      2|		result[0x0009] = (SSLCipherSuite*)&Cipher10;
  366|      2|		result[0x000A] = (SSLCipherSuite*)&Cipher11;
  367|      2|		result[0x000B] = (SSLCipherSuite*)&Cipher12;
  368|      2|		result[0x000C] = (SSLCipherSuite*)&Cipher13;
  369|      2|		result[0x000D] = (SSLCipherSuite*)&Cipher14;
  370|      2|		result[0x000E] = (SSLCipherSuite*)&Cipher15;
  371|      2|		result[0x000F] = (SSLCipherSuite*)&Cipher16;
  372|      2|		result[0x0010] = (SSLCipherSuite*)&Cipher17;
  373|      2|		result[0x0011] = (SSLCipherSuite*)&Cipher18;
  374|      2|		result[0x0012] = (SSLCipherSuite*)&Cipher19;
  375|      2|		result[0x0013] = (SSLCipherSuite*)&Cipher20;
  376|      2|		result[0x0014] = (SSLCipherSuite*)&Cipher21;
  377|      2|		result[0x0015] = (SSLCipherSuite*)&Cipher22;
  378|      2|		result[0x0016] = (SSLCipherSuite*)&Cipher23;
  379|      2|		result[0x0017] = (SSLCipherSuite*)&Cipher24;
  380|      2|		result[0x0018] = (SSLCipherSuite*)&Cipher25;
  381|      2|		result[0x0019] = (SSLCipherSuite*)&Cipher26;
  382|      2|		result[0x001A] = (SSLCipherSuite*)&Cipher27;
  383|      2|		result[0x001B] = (SSLCipherSuite*)&Cipher28;
  384|      2|		result[0x001E] = (SSLCipherSuite*)&Cipher29;
  385|      2|		result[0x001F] = (SSLCipherSuite*)&Cipher30;
  386|      2|		result[0x0020] = (SSLCipherSuite*)&Cipher31;
  387|      2|		result[0x0021] = (SSLCipherSuite*)&Cipher32;
  388|      2|		result[0x0022] = (SSLCipherSuite*)&Cipher33;
  389|      2|		result[0x0023] = (SSLCipherSuite*)&Cipher34;
  390|      2|		result[0x0024] = (SSLCipherSuite*)&Cipher35;
  391|      2|		result[0x0025] = (SSLCipherSuite*)&Cipher36;
  392|      2|		result[0x0026] = (SSLCipherSuite*)&Cipher37;
  393|      2|		result[0x0027] = (SSLCipherSuite*)&Cipher38;
  394|      2|		result[0x0028] = (SSLCipherSuite*)&Cipher39;
  395|      2|		result[0x0029] = (SSLCipherSuite*)&Cipher40;
  396|      2|		result[0x002A] = (SSLCipherSuite*)&Cipher41;
  397|      2|		result[0x002B] = (SSLCipherSuite*)&Cipher42;
  398|      2|		result[0x002C] = (SSLCipherSuite*)&Cipher43;
  399|      2|		result[0x002D] = (SSLCipherSuite*)&Cipher44;
  400|      2|		result[0x002E] = (SSLCipherSuite*)&Cipher45;
  401|      2|		result[0x002F] = (SSLCipherSuite*)&Cipher46;
  402|      2|		result[0x0030] = (SSLCipherSuite*)&Cipher47;
  403|      2|		result[0x0031] = (SSLCipherSuite*)&Cipher48;
  404|      2|		result[0x0032] = (SSLCipherSuite*)&Cipher49;
  405|      2|		result[0x0033] = (SSLCipherSuite*)&Cipher50;
  406|      2|		result[0x0034] = (SSLCipherSuite*)&Cipher51;
  407|      2|		result[0x0035] = (SSLCipherSuite*)&Cipher52;
  408|      2|		result[0x0036] = (SSLCipherSuite*)&Cipher53;
  409|      2|		result[0x0037] = (SSLCipherSuite*)&Cipher54;
  410|      2|		result[0x0038] = (SSLCipherSuite*)&Cipher55;
  411|      2|		result[0x0039] = (SSLCipherSuite*)&Cipher56;
  412|      2|		result[0x003A] = (SSLCipherSuite*)&Cipher57;
  413|      2|		result[0x003B] = (SSLCipherSuite*)&Cipher58;
  414|      2|		result[0x003C] = (SSLCipherSuite*)&Cipher59;
  415|      2|		result[0x003D] = (SSLCipherSuite*)&Cipher60;
  416|      2|		result[0x003E] = (SSLCipherSuite*)&Cipher61;
  417|      2|		result[0x003F] = (SSLCipherSuite*)&Cipher62;
  418|      2|		result[0x0040] = (SSLCipherSuite*)&Cipher63;
  419|      2|		result[0x0041] = (SSLCipherSuite*)&Cipher64;
  420|      2|		result[0x0042] = (SSLCipherSuite*)&Cipher65;
  421|      2|		result[0x0043] = (SSLCipherSuite*)&Cipher66;
  422|      2|		result[0x0044] = (SSLCipherSuite*)&Cipher67;
  423|      2|		result[0x0045] = (SSLCipherSuite*)&Cipher68;
  424|      2|		result[0x0046] = (SSLCipherSuite*)&Cipher69;
  425|      2|		result[0x0067] = (SSLCipherSuite*)&Cipher70;
  426|      2|		result[0x0068] = (SSLCipherSuite*)&Cipher71;
  427|      2|		result[0x0069] = (SSLCipherSuite*)&Cipher72;
  428|      2|		result[0x006A] = (SSLCipherSuite*)&Cipher73;
  429|      2|		result[0x006B] = (SSLCipherSuite*)&Cipher74;
  430|      2|		result[0x006C] = (SSLCipherSuite*)&Cipher75;
  431|      2|		result[0x006D] = (SSLCipherSuite*)&Cipher76;
  432|      2|		result[0x0084] = (SSLCipherSuite*)&Cipher77;
  433|      2|		result[0x0085] = (SSLCipherSuite*)&Cipher78;
  434|      2|		result[0x0086] = (SSLCipherSuite*)&Cipher79;
  435|      2|		result[0x0087] = (SSLCipherSuite*)&Cipher80;
  436|      2|		result[0x0088] = (SSLCipherSuite*)&Cipher81;
  437|      2|		result[0x0089] = (SSLCipherSuite*)&Cipher82;
  438|      2|		result[0x008A] = (SSLCipherSuite*)&Cipher83;
  439|      2|		result[0x008B] = (SSLCipherSuite*)&Cipher84;
  440|      2|		result[0x008C] = (SSLCipherSuite*)&Cipher85;
  441|      2|		result[0x008D] = (SSLCipherSuite*)&Cipher86;
  442|      2|		result[0x008E] = (SSLCipherSuite*)&Cipher87;
  443|      2|		result[0x008F] = (SSLCipherSuite*)&Cipher88;
  444|      2|		result[0x0090] = (SSLCipherSuite*)&Cipher89;
  445|      2|		result[0x0091] = (SSLCipherSuite*)&Cipher90;
  446|      2|		result[0x0092] = (SSLCipherSuite*)&Cipher91;
  447|      2|		result[0x0093] = (SSLCipherSuite*)&Cipher92;
  448|      2|		result[0x0094] = (SSLCipherSuite*)&Cipher93;
  449|      2|		result[0x0095] = (SSLCipherSuite*)&Cipher94;
  450|      2|		result[0x0096] = (SSLCipherSuite*)&Cipher95;
  451|      2|		result[0x0097] = (SSLCipherSuite*)&Cipher96;
  452|      2|		result[0x0098] = (SSLCipherSuite*)&Cipher97;
  453|      2|		result[0x0099] = (SSLCipherSuite*)&Cipher98;
  454|      2|		result[0x009A] = (SSLCipherSuite*)&Cipher99;
  455|      2|		result[0x009B] = (SSLCipherSuite*)&Cipher100;
  456|      2|		result[0x009C] = (SSLCipherSuite*)&Cipher101;
  457|      2|		result[0x009D] = (SSLCipherSuite*)&Cipher102;
  458|      2|		result[0x009E] = (SSLCipherSuite*)&Cipher103;
  459|      2|		result[0x009F] = (SSLCipherSuite*)&Cipher104;
  460|      2|		result[0x00A0] = (SSLCipherSuite*)&Cipher105;
  461|      2|		result[0x00A1] = (SSLCipherSuite*)&Cipher106;
  462|      2|		result[0x00A2] = (SSLCipherSuite*)&Cipher107;
  463|      2|		result[0x00A3] = (SSLCipherSuite*)&Cipher108;
  464|      2|		result[0x00A4] = (SSLCipherSuite*)&Cipher109;
  465|      2|		result[0x00A5] = (SSLCipherSuite*)&Cipher110;
  466|      2|		result[0x00A6] = (SSLCipherSuite*)&Cipher111;
  467|      2|		result[0x00A7] = (SSLCipherSuite*)&Cipher112;
  468|      2|		result[0x00A8] = (SSLCipherSuite*)&Cipher113;
  469|      2|		result[0x00A9] = (SSLCipherSuite*)&Cipher114;
  470|      2|		result[0x00AA] = (SSLCipherSuite*)&Cipher115;
  471|      2|		result[0x00AB] = (SSLCipherSuite*)&Cipher116;
  472|      2|		result[0x00AC] = (SSLCipherSuite*)&Cipher117;
  473|      2|		result[0x00AD] = (SSLCipherSuite*)&Cipher118;
  474|      2|		result[0x00AE] = (SSLCipherSuite*)&Cipher119;
  475|      2|		result[0x00AF] = (SSLCipherSuite*)&Cipher120;
  476|      2|		result[0x00B0] = (SSLCipherSuite*)&Cipher121;
  477|      2|		result[0x00B1] = (SSLCipherSuite*)&Cipher122;
  478|      2|		result[0x00B2] = (SSLCipherSuite*)&Cipher123;
  479|      2|		result[0x00B3] = (SSLCipherSuite*)&Cipher124;
  480|      2|		result[0x00B4] = (SSLCipherSuite*)&Cipher125;
  481|      2|		result[0x00B5] = (SSLCipherSuite*)&Cipher126;
  482|      2|		result[0x00B6] = (SSLCipherSuite*)&Cipher127;
  483|      2|		result[0x00B7] = (SSLCipherSuite*)&Cipher128;
  484|      2|		result[0x00B8] = (SSLCipherSuite*)&Cipher129;
  485|      2|		result[0x00B9] = (SSLCipherSuite*)&Cipher130;
  486|      2|		result[0x00BA] = (SSLCipherSuite*)&Cipher131;
  487|      2|		result[0x00BB] = (SSLCipherSuite*)&Cipher132;
  488|      2|		result[0x00BC] = (SSLCipherSuite*)&Cipher133;
  489|      2|		result[0x00BD] = (SSLCipherSuite*)&Cipher134;
  490|      2|		result[0x00BE] = (SSLCipherSuite*)&Cipher135;
  491|      2|		result[0x00BF] = (SSLCipherSuite*)&Cipher136;
  492|      2|		result[0x00C0] = (SSLCipherSuite*)&Cipher137;
  493|      2|		result[0x00C1] = (SSLCipherSuite*)&Cipher138;
  494|      2|		result[0x00C2] = (SSLCipherSuite*)&Cipher139;
  495|      2|		result[0x00C3] = (SSLCipherSuite*)&Cipher140;
  496|      2|		result[0x00C4] = (SSLCipherSuite*)&Cipher141;
  497|      2|		result[0x00C5] = (SSLCipherSuite*)&Cipher142;
  498|      2|		result[0xC001] = (SSLCipherSuite*)&Cipher143;
  499|      2|		result[0xC002] = (SSLCipherSuite*)&Cipher144;
  500|      2|		result[0xC003] = (SSLCipherSuite*)&Cipher145;
  501|      2|		result[0xC004] = (SSLCipherSuite*)&Cipher146;
  502|      2|		result[0xC005] = (SSLCipherSuite*)&Cipher147;
  503|      2|		result[0xC006] = (SSLCipherSuite*)&Cipher148;
  504|      2|		result[0xC007] = (SSLCipherSuite*)&Cipher149;
  505|      2|		result[0xC008] = (SSLCipherSuite*)&Cipher150;
  506|      2|		result[0xC009] = (SSLCipherSuite*)&Cipher151;
  507|      2|		result[0xC00A] = (SSLCipherSuite*)&Cipher152;
  508|      2|		result[0xC00B] = (SSLCipherSuite*)&Cipher153;
  509|      2|		result[0xC00C] = (SSLCipherSuite*)&Cipher154;
  510|      2|		result[0xC00D] = (SSLCipherSuite*)&Cipher155;
  511|      2|		result[0xC00E] = (SSLCipherSuite*)&Cipher156;
  512|      2|		result[0xC00F] = (SSLCipherSuite*)&Cipher157;
  513|      2|		result[0xC010] = (SSLCipherSuite*)&Cipher158;
  514|      2|		result[0xC011] = (SSLCipherSuite*)&Cipher159;
  515|      2|		result[0xC012] = (SSLCipherSuite*)&Cipher160;
  516|      2|		result[0xC013] = (SSLCipherSuite*)&Cipher161;
  517|      2|		result[0xC014] = (SSLCipherSuite*)&Cipher162;
  518|      2|		result[0xC015] = (SSLCipherSuite*)&Cipher163;
  519|      2|		result[0xC016] = (SSLCipherSuite*)&Cipher164;
  520|      2|		result[0xC017] = (SSLCipherSuite*)&Cipher165;
  521|      2|		result[0xC018] = (SSLCipherSuite*)&Cipher166;
  522|      2|		result[0xC019] = (SSLCipherSuite*)&Cipher167;
  523|      2|		result[0xC01A] = (SSLCipherSuite*)&Cipher168;
  524|      2|		result[0xC01B] = (SSLCipherSuite*)&Cipher169;
  525|      2|		result[0xC01C] = (SSLCipherSuite*)&Cipher170;
  526|      2|		result[0xC01D] = (SSLCipherSuite*)&Cipher171;
  527|      2|		result[0xC01E] = (SSLCipherSuite*)&Cipher172;
  528|      2|		result[0xC01F] = (SSLCipherSuite*)&Cipher173;
  529|      2|		result[0xC020] = (SSLCipherSuite*)&Cipher174;
  530|      2|		result[0xC021] = (SSLCipherSuite*)&Cipher175;
  531|      2|		result[0xC022] = (SSLCipherSuite*)&Cipher176;
  532|      2|		result[0xC023] = (SSLCipherSuite*)&Cipher177;
  533|      2|		result[0xC024] = (SSLCipherSuite*)&Cipher178;
  534|      2|		result[0xC025] = (SSLCipherSuite*)&Cipher179;
  535|      2|		result[0xC026] = (SSLCipherSuite*)&Cipher180;
  536|      2|		result[0xC027] = (SSLCipherSuite*)&Cipher181;
  537|      2|		result[0xC028] = (SSLCipherSuite*)&Cipher182;
  538|      2|		result[0xC029] = (SSLCipherSuite*)&Cipher183;
  539|      2|		result[0xC02A] = (SSLCipherSuite*)&Cipher184;
  540|      2|		result[0xC02B] = (SSLCipherSuite*)&Cipher185;
  541|      2|		result[0xC02C] = (SSLCipherSuite*)&Cipher186;
  542|      2|		result[0xC02D] = (SSLCipherSuite*)&Cipher187;
  543|      2|		result[0xC02E] = (SSLCipherSuite*)&Cipher188;
  544|      2|		result[0xC02F] = (SSLCipherSuite*)&Cipher189;
  545|      2|		result[0xC030] = (SSLCipherSuite*)&Cipher190;
  546|      2|		result[0xC031] = (SSLCipherSuite*)&Cipher191;
  547|      2|		result[0xC032] = (SSLCipherSuite*)&Cipher192;
  548|      2|		result[0xC033] = (SSLCipherSuite*)&Cipher193;
  549|      2|		result[0xC034] = (SSLCipherSuite*)&Cipher194;
  550|      2|		result[0xC035] = (SSLCipherSuite*)&Cipher195;
  551|      2|		result[0xC036] = (SSLCipherSuite*)&Cipher196;
  552|      2|		result[0xC037] = (SSLCipherSuite*)&Cipher197;
  553|      2|		result[0xC038] = (SSLCipherSuite*)&Cipher198;
  554|      2|		result[0xC039] = (SSLCipherSuite*)&Cipher199;
  555|      2|		result[0xC03A] = (SSLCipherSuite*)&Cipher200;
  556|      2|		result[0xC03B] = (SSLCipherSuite*)&Cipher201;
  557|      2|		result[0xC03C] = (SSLCipherSuite*)&Cipher202;
  558|      2|		result[0xC03D] = (SSLCipherSuite*)&Cipher203;
  559|      2|		result[0xC03E] = (SSLCipherSuite*)&Cipher204;
  560|      2|		result[0xC03F] = (SSLCipherSuite*)&Cipher205;
  561|      2|		result[0xC040] = (SSLCipherSuite*)&Cipher206;
  562|      2|		result[0xC041] = (SSLCipherSuite*)&Cipher207;
  563|      2|		result[0xC042] = (SSLCipherSuite*)&Cipher208;
  564|      2|		result[0xC043] = (SSLCipherSuite*)&Cipher209;
  565|      2|		result[0xC044] = (SSLCipherSuite*)&Cipher210;
  566|      2|		result[0xC045] = (SSLCipherSuite*)&Cipher211;
  567|      2|		result[0xC046] = (SSLCipherSuite*)&Cipher212;
  568|      2|		result[0xC047] = (SSLCipherSuite*)&Cipher213;
  569|      2|		result[0xC048] = (SSLCipherSuite*)&Cipher214;
  570|      2|		result[0xC049] = (SSLCipherSuite*)&Cipher215;
  571|      2|		result[0xC04A] = (SSLCipherSuite*)&Cipher216;
  572|      2|		result[0xC04B] = (SSLCipherSuite*)&Cipher217;
  573|      2|		result[0xC04C] = (SSLCipherSuite*)&Cipher218;
  574|      2|		result[0xC04D] = (SSLCipherSuite*)&Cipher219;
  575|      2|		result[0xC04E] = (SSLCipherSuite*)&Cipher220;
  576|      2|		result[0xC04F] = (SSLCipherSuite*)&Cipher221;
  577|      2|		result[0xC050] = (SSLCipherSuite*)&Cipher222;
  578|      2|		result[0xC051] = (SSLCipherSuite*)&Cipher223;
  579|      2|		result[0xC052] = (SSLCipherSuite*)&Cipher224;
  580|      2|		result[0xC053] = (SSLCipherSuite*)&Cipher225;
  581|      2|		result[0xC054] = (SSLCipherSuite*)&Cipher226;
  582|      2|		result[0xC055] = (SSLCipherSuite*)&Cipher227;
  583|      2|		result[0xC056] = (SSLCipherSuite*)&Cipher228;
  584|      2|		result[0xC057] = (SSLCipherSuite*)&Cipher229;
  585|      2|		result[0xC058] = (SSLCipherSuite*)&Cipher230;
  586|      2|		result[0xC059] = (SSLCipherSuite*)&Cipher231;
  587|      2|		result[0xC05A] = (SSLCipherSuite*)&Cipher232;
  588|      2|		result[0xC05B] = (SSLCipherSuite*)&Cipher233;
  589|      2|		result[0xC05C] = (SSLCipherSuite*)&Cipher234;
  590|      2|		result[0xC05D] = (SSLCipherSuite*)&Cipher235;
  591|      2|		result[0xC05E] = (SSLCipherSuite*)&Cipher236;
  592|      2|		result[0xC05F] = (SSLCipherSuite*)&Cipher237;
  593|      2|		result[0xC060] = (SSLCipherSuite*)&Cipher238;
  594|      2|		result[0xC061] = (SSLCipherSuite*)&Cipher239;
  595|      2|		result[0xC062] = (SSLCipherSuite*)&Cipher240;
  596|      2|		result[0xC063] = (SSLCipherSuite*)&Cipher241;
  597|      2|		result[0xC064] = (SSLCipherSuite*)&Cipher242;
  598|      2|		result[0xC065] = (SSLCipherSuite*)&Cipher243;
  599|      2|		result[0xC066] = (SSLCipherSuite*)&Cipher244;
  600|      2|		result[0xC067] = (SSLCipherSuite*)&Cipher245;
  601|      2|		result[0xC068] = (SSLCipherSuite*)&Cipher246;
  602|      2|		result[0xC069] = (SSLCipherSuite*)&Cipher247;
  603|      2|		result[0xC06A] = (SSLCipherSuite*)&Cipher248;
  604|      2|		result[0xC06B] = (SSLCipherSuite*)&Cipher249;
  605|      2|		result[0xC06C] = (SSLCipherSuite*)&Cipher250;
  606|      2|		result[0xC06D] = (SSLCipherSuite*)&Cipher251;
  607|      2|		result[0xC06E] = (SSLCipherSuite*)&Cipher252;
  608|      2|		result[0xC06F] = (SSLCipherSuite*)&Cipher253;
  609|      2|		result[0xC070] = (SSLCipherSuite*)&Cipher254;
  610|      2|		result[0xC071] = (SSLCipherSuite*)&Cipher255;
  611|      2|		result[0xC072] = (SSLCipherSuite*)&Cipher256;
  612|      2|		result[0xC073] = (SSLCipherSuite*)&Cipher257;
  613|      2|		result[0xC074] = (SSLCipherSuite*)&Cipher258;
  614|      2|		result[0xC075] = (SSLCipherSuite*)&Cipher259;
  615|      2|		result[0xC076] = (SSLCipherSuite*)&Cipher260;
  616|      2|		result[0xC077] = (SSLCipherSuite*)&Cipher261;
  617|      2|		result[0xC078] = (SSLCipherSuite*)&Cipher262;
  618|      2|		result[0xC079] = (SSLCipherSuite*)&Cipher263;
  619|      2|		result[0xC07A] = (SSLCipherSuite*)&Cipher264;
  620|      2|		result[0xC07B] = (SSLCipherSuite*)&Cipher265;
  621|      2|		result[0xC07C] = (SSLCipherSuite*)&Cipher266;
  622|      2|		result[0xC07D] = (SSLCipherSuite*)&Cipher267;
  623|      2|		result[0xC07E] = (SSLCipherSuite*)&Cipher268;
  624|      2|		result[0xC07F] = (SSLCipherSuite*)&Cipher269;
  625|      2|		result[0xC080] = (SSLCipherSuite*)&Cipher270;
  626|      2|		result[0xC081] = (SSLCipherSuite*)&Cipher271;
  627|      2|		result[0xC082] = (SSLCipherSuite*)&Cipher272;
  628|      2|		result[0xC083] = (SSLCipherSuite*)&Cipher273;
  629|      2|		result[0xC084] = (SSLCipherSuite*)&Cipher274;
  630|      2|		result[0xC085] = (SSLCipherSuite*)&Cipher275;
  631|      2|		result[0xC086] = (SSLCipherSuite*)&Cipher276;
  632|      2|		result[0xC087] = (SSLCipherSuite*)&Cipher277;
  633|      2|		result[0xC088] = (SSLCipherSuite*)&Cipher278;
  634|      2|		result[0xC089] = (SSLCipherSuite*)&Cipher279;
  635|      2|		result[0xC08A] = (SSLCipherSuite*)&Cipher280;
  636|      2|		result[0xC08B] = (SSLCipherSuite*)&Cipher281;
  637|      2|		result[0xC08C] = (SSLCipherSuite*)&Cipher282;
  638|      2|		result[0xC08D] = (SSLCipherSuite*)&Cipher283;
  639|      2|		result[0xC08E] = (SSLCipherSuite*)&Cipher284;
  640|      2|		result[0xC08F] = (SSLCipherSuite*)&Cipher285;
  641|      2|		result[0xC090] = (SSLCipherSuite*)&Cipher286;
  642|      2|		result[0xC091] = (SSLCipherSuite*)&Cipher287;
  643|      2|		result[0xC092] = (SSLCipherSuite*)&Cipher288;
  644|      2|		result[0xC093] = (SSLCipherSuite*)&Cipher289;
  645|      2|		result[0xC094] = (SSLCipherSuite*)&Cipher290;
  646|      2|		result[0xC095] = (SSLCipherSuite*)&Cipher291;
  647|      2|		result[0xC096] = (SSLCipherSuite*)&Cipher292;
  648|      2|		result[0xC097] = (SSLCipherSuite*)&Cipher293;
  649|      2|		result[0xC098] = (SSLCipherSuite*)&Cipher294;
  650|      2|		result[0xC099] = (SSLCipherSuite*)&Cipher295;
  651|      2|		result[0xC09A] = (SSLCipherSuite*)&Cipher296;
  652|      2|		result[0xC09B] = (SSLCipherSuite*)&Cipher297;
  653|      2|		result[0xC09C] = (SSLCipherSuite*)&Cipher298;
  654|      2|		result[0xC09D] = (SSLCipherSuite*)&Cipher299;
  655|      2|		result[0xC09E] = (SSLCipherSuite*)&Cipher300;
  656|      2|		result[0xC09F] = (SSLCipherSuite*)&Cipher301;
  657|      2|		result[0xC0A0] = (SSLCipherSuite*)&Cipher302;
  658|      2|		result[0xC0A1] = (SSLCipherSuite*)&Cipher303;
  659|      2|		result[0xC0A2] = (SSLCipherSuite*)&Cipher304;
  660|      2|		result[0xC0A3] = (SSLCipherSuite*)&Cipher305;
  661|      2|		result[0xC0A4] = (SSLCipherSuite*)&Cipher306;
  662|      2|		result[0xC0A5] = (SSLCipherSuite*)&Cipher307;
  663|      2|		result[0xC0A6] = (SSLCipherSuite*)&Cipher308;
  664|      2|		result[0xC0A7] = (SSLCipherSuite*)&Cipher309;
  665|      2|		result[0xC0A8] = (SSLCipherSuite*)&Cipher310;
  666|      2|		result[0xC0A9] = (SSLCipherSuite*)&Cipher311;
  667|      2|		result[0xC0AA] = (SSLCipherSuite*)&Cipher312;
  668|      2|		result[0xC0AB] = (SSLCipherSuite*)&Cipher313;
  669|      2|		result[0xC0AC] = (SSLCipherSuite*)&Cipher314;
  670|      2|		result[0xC0AD] = (SSLCipherSuite*)&Cipher315;
  671|      2|		result[0xC0AE] = (SSLCipherSuite*)&Cipher316;
  672|      2|		result[0xC0AF] = (SSLCipherSuite*)&Cipher317;
  673|      2|		result[0xCCA8] = (SSLCipherSuite*)&Cipher318;
  674|      2|		result[0xCCA9] = (SSLCipherSuite*)&Cipher319;
  675|      2|		result[0xCCAA] = (SSLCipherSuite*)&Cipher320;
  676|      2|		result[0xCCAB] = (SSLCipherSuite*)&Cipher321;
  677|      2|		result[0xCCAC] = (SSLCipherSuite*)&Cipher322;
  678|      2|		result[0xCCAD] = (SSLCipherSuite*)&Cipher323;
  679|      2|		result[0xCCAE] = (SSLCipherSuite*)&Cipher324;
  680|      2|		result[0x1301] = (SSLCipherSuite*)&Cipher325;
  681|      2|		result[0x1302] = (SSLCipherSuite*)&Cipher326;
  682|      2|		result[0x1303] = (SSLCipherSuite*)&Cipher327;
  683|      2|		result[0x1304] = (SSLCipherSuite*)&Cipher328;
  684|      2|		result[0x1305] = (SSLCipherSuite*)&Cipher329;
  685|      2|		return result;
  686|      2|	}
SSLHandshake.cpp:_ZN4pcppL34createCipherSuiteStringToObjectMapEv:
  704|      2|	{
  705|      2|		std::unordered_map<uint32_t, SSLCipherSuite*> result;
  706|       |
  707|      2|		result[0x9F180F43] = (SSLCipherSuite*)&Cipher1;
  708|      2|		result[0x97D9341F] = (SSLCipherSuite*)&Cipher2;
  709|      2|		result[0x288FABA1] = (SSLCipherSuite*)&Cipher3;
  710|      2|		result[0x9179C5BD] = (SSLCipherSuite*)&Cipher4;
  711|      2|		result[0x68DF0C8F] = (SSLCipherSuite*)&Cipher5;
  712|      2|		result[0x5FB32DF1] = (SSLCipherSuite*)&Cipher6;
  713|      2|		result[0x2A1FC0FC] = (SSLCipherSuite*)&Cipher7;
  714|      2|		result[0x5BF6459E] = (SSLCipherSuite*)&Cipher8;
  715|      2|		result[0x60D692F4] = (SSLCipherSuite*)&Cipher9;
  716|      2|		result[0x26A21427] = (SSLCipherSuite*)&Cipher10;
  717|      2|		result[0xD3558C6D] = (SSLCipherSuite*)&Cipher11;
  718|      2|		result[0xAE2673E9] = (SSLCipherSuite*)&Cipher12;
  719|      2|		result[0xC63B19B0] = (SSLCipherSuite*)&Cipher13;
  720|      2|		result[0xFE49B3BC] = (SSLCipherSuite*)&Cipher14;
  721|      2|		result[0x625A86D5] = (SSLCipherSuite*)&Cipher15;
  722|      2|		result[0x60FF1BD4] = (SSLCipherSuite*)&Cipher16;
  723|      2|		result[0xE101D5C8] = (SSLCipherSuite*)&Cipher17;
  724|      2|		result[0x422859E8] = (SSLCipherSuite*)&Cipher18;
  725|      2|		result[0x88ABC503] = (SSLCipherSuite*)&Cipher19;
  726|      2|		result[0x44284B1] = (SSLCipherSuite*)&Cipher20;
  727|      2|		result[0xFD71B064] = (SSLCipherSuite*)&Cipher21;
  728|      2|		result[0x76F35237] = (SSLCipherSuite*)&Cipher22;
  729|      2|		result[0x7D93159D] = (SSLCipherSuite*)&Cipher23;
  730|      2|		result[0x6E9D1AE2] = (SSLCipherSuite*)&Cipher24;
  731|      2|		result[0xFA0974E4] = (SSLCipherSuite*)&Cipher25;
  732|      2|		result[0xEC27ACB1] = (SSLCipherSuite*)&Cipher26;
  733|      2|		result[0x6859C7A8] = (SSLCipherSuite*)&Cipher27;
  734|      2|		result[0x55FD3D14] = (SSLCipherSuite*)&Cipher28;
  735|      2|		result[0xA7650023] = (SSLCipherSuite*)&Cipher29;
  736|      2|		result[0xDC042011] = (SSLCipherSuite*)&Cipher30;
  737|      2|		result[0x94BFBF4D] = (SSLCipherSuite*)&Cipher31;
  738|      2|		result[0x2FE24162] = (SSLCipherSuite*)&Cipher32;
  739|      2|		result[0xC449D595] = (SSLCipherSuite*)&Cipher33;
  740|      2|		result[0xE11292AF] = (SSLCipherSuite*)&Cipher34;
  741|      2|		result[0x47D0643] = (SSLCipherSuite*)&Cipher35;
  742|      2|		result[0xC9ABBA3C] = (SSLCipherSuite*)&Cipher36;
  743|      2|		result[0x9F323A5F] = (SSLCipherSuite*)&Cipher37;
  744|      2|		result[0xFBF78046] = (SSLCipherSuite*)&Cipher38;
  745|      2|		result[0x859BD79F] = (SSLCipherSuite*)&Cipher39;
  746|      2|		result[0xF9FBBB39] = (SSLCipherSuite*)&Cipher40;
  747|      2|		result[0x63587748] = (SSLCipherSuite*)&Cipher41;
  748|      2|		result[0xF84CAE79] = (SSLCipherSuite*)&Cipher42;
  749|      2|		result[0xCA39F6F1] = (SSLCipherSuite*)&Cipher43;
  750|      2|		result[0xDC4D17C1] = (SSLCipherSuite*)&Cipher44;
  751|      2|		result[0x955FBE28] = (SSLCipherSuite*)&Cipher45;
  752|      2|		result[0x73ED7B86] = (SSLCipherSuite*)&Cipher46;
  753|      2|		result[0x14A51855] = (SSLCipherSuite*)&Cipher47;
  754|      2|		result[0x2CE54061] = (SSLCipherSuite*)&Cipher48;
  755|      2|		result[0x3360789A] = (SSLCipherSuite*)&Cipher49;
  756|      2|		result[0xDFEF59B6] = (SSLCipherSuite*)&Cipher50;
  757|      2|		result[0xE819855D] = (SSLCipherSuite*)&Cipher51;
  758|      2|		result[0x24CC3946] = (SSLCipherSuite*)&Cipher52;
  759|      2|		result[0x1CACB5FD] = (SSLCipherSuite*)&Cipher53;
  760|      2|		result[0x40193001] = (SSLCipherSuite*)&Cipher54;
  761|      2|		result[0xA3846DA2] = (SSLCipherSuite*)&Cipher55;
  762|      2|		result[0x8F3B7CF6] = (SSLCipherSuite*)&Cipher56;
  763|      2|		result[0xC7B09945] = (SSLCipherSuite*)&Cipher57;
  764|      2|		result[0xD8172F82] = (SSLCipherSuite*)&Cipher58;
  765|      2|		result[0xB6748503] = (SSLCipherSuite*)&Cipher59;
  766|      2|		result[0xDB105043] = (SSLCipherSuite*)&Cipher60;
  767|      2|		result[0x21E8AC2E] = (SSLCipherSuite*)&Cipher61;
  768|      2|		result[0x55096FC2] = (SSLCipherSuite*)&Cipher62;
  769|      2|		result[0x38F955AF] = (SSLCipherSuite*)&Cipher63;
  770|      2|		result[0xBA8C1D77] = (SSLCipherSuite*)&Cipher64;
  771|      2|		result[0x91128102] = (SSLCipherSuite*)&Cipher65;
  772|      2|		result[0xA7ED740E] = (SSLCipherSuite*)&Cipher66;
  773|      2|		result[0x75C4908B] = (SSLCipherSuite*)&Cipher67;
  774|      2|		result[0xBC6C5E87] = (SSLCipherSuite*)&Cipher68;
  775|      2|		result[0xA0499A2A] = (SSLCipherSuite*)&Cipher69;
  776|      2|		result[0x4F0FFC13] = (SSLCipherSuite*)&Cipher70;
  777|      2|		result[0xCCEE9996] = (SSLCipherSuite*)&Cipher71;
  778|      2|		result[0x8570DA22] = (SSLCipherSuite*)&Cipher72;
  779|      2|		result[0x75D4FD57] = (SSLCipherSuite*)&Cipher73;
  780|      2|		result[0x602E04D3] = (SSLCipherSuite*)&Cipher74;
  781|      2|		result[0x5EDC9C36] = (SSLCipherSuite*)&Cipher75;
  782|      2|		result[0xE66C167E] = (SSLCipherSuite*)&Cipher76;
  783|      2|		result[0x909F6D7B] = (SSLCipherSuite*)&Cipher77;
  784|      2|		result[0x3C35B1AA] = (SSLCipherSuite*)&Cipher78;
  785|      2|		result[0x6D4D1A2E] = (SSLCipherSuite*)&Cipher79;
  786|      2|		result[0xBF788317] = (SSLCipherSuite*)&Cipher80;
  787|      2|		result[0x5329738B] = (SSLCipherSuite*)&Cipher81;
  788|      2|		result[0x7D11AB2] = (SSLCipherSuite*)&Cipher82;
  789|      2|		result[0x461ACA21] = (SSLCipherSuite*)&Cipher83;
  790|      2|		result[0x15404ADD] = (SSLCipherSuite*)&Cipher84;
  791|      2|		result[0x3806AF6] = (SSLCipherSuite*)&Cipher85;
  792|      2|		result[0xB2D80EB6] = (SSLCipherSuite*)&Cipher86;
  793|      2|		result[0xE54425D1] = (SSLCipherSuite*)&Cipher87;
  794|      2|		result[0x476457CD] = (SSLCipherSuite*)&Cipher88;
  795|      2|		result[0x1D55E526] = (SSLCipherSuite*)&Cipher89;
  796|      2|		result[0x953C69E6] = (SSLCipherSuite*)&Cipher90;
  797|      2|		result[0x6ADE7E16] = (SSLCipherSuite*)&Cipher91;
  798|      2|		result[0xE8C7BBE8] = (SSLCipherSuite*)&Cipher92;
  799|      2|		result[0x623DC741] = (SSLCipherSuite*)&Cipher93;
  800|      2|		result[0xF403E1] = (SSLCipherSuite*)&Cipher94;
  801|      2|		result[0x90D8CADC] = (SSLCipherSuite*)&Cipher95;
  802|      2|		result[0xC30D1199] = (SSLCipherSuite*)&Cipher96;
  803|      2|		result[0x9CFB1B5D] = (SSLCipherSuite*)&Cipher97;
  804|      2|		result[0x2D3B99E8] = (SSLCipherSuite*)&Cipher98;
  805|      2|		result[0x4A9E8B0C] = (SSLCipherSuite*)&Cipher99;
  806|      2|		result[0x16BD2351] = (SSLCipherSuite*)&Cipher100;
  807|      2|		result[0x586BC20E] = (SSLCipherSuite*)&Cipher101;
  808|      2|		result[0x996B90AA] = (SSLCipherSuite*)&Cipher102;
  809|      2|		result[0x2F3871FE] = (SSLCipherSuite*)&Cipher103;
  810|      2|		result[0xF2DD519A] = (SSLCipherSuite*)&Cipher104;
  811|      2|		result[0x52615F23] = (SSLCipherSuite*)&Cipher105;
  812|      2|		result[0xDEE51337] = (SSLCipherSuite*)&Cipher106;
  813|      2|		result[0xB30890E2] = (SSLCipherSuite*)&Cipher107;
  814|      2|		result[0x40F3FF3E] = (SSLCipherSuite*)&Cipher108;
  815|      2|		result[0xE306EE17] = (SSLCipherSuite*)&Cipher109;
  816|      2|		result[0x870C6FCB] = (SSLCipherSuite*)&Cipher110;
  817|      2|		result[0xEB12CAEF] = (SSLCipherSuite*)&Cipher111;
  818|      2|		result[0x68795983] = (SSLCipherSuite*)&Cipher112;
  819|      2|		result[0x606BA9BE] = (SSLCipherSuite*)&Cipher113;
  820|      2|		result[0x2C33475A] = (SSLCipherSuite*)&Cipher114;
  821|      2|		result[0x640CAAEE] = (SSLCipherSuite*)&Cipher115;
  822|      2|		result[0x6603488A] = (SSLCipherSuite*)&Cipher116;
  823|      2|		result[0x8BA58643] = (SSLCipherSuite*)&Cipher117;
  824|      2|		result[0x16059E57] = (SSLCipherSuite*)&Cipher118;
  825|      2|		result[0x1B0606D3] = (SSLCipherSuite*)&Cipher119;
  826|      2|		result[0x1CF76007] = (SSLCipherSuite*)&Cipher120;
  827|      2|		result[0x618CE8F2] = (SSLCipherSuite*)&Cipher121;
  828|      2|		result[0xE264D3B6] = (SSLCipherSuite*)&Cipher122;
  829|      2|		result[0xB4C5AE63] = (SSLCipherSuite*)&Cipher123;
  830|      2|		result[0x95DF4757] = (SSLCipherSuite*)&Cipher124;
  831|      2|		result[0x1D1CF062] = (SSLCipherSuite*)&Cipher125;
  832|      2|		result[0xE7AA2826] = (SSLCipherSuite*)&Cipher126;
  833|      2|		result[0x38D94EE2] = (SSLCipherSuite*)&Cipher127;
  834|      2|		result[0x889BA306] = (SSLCipherSuite*)&Cipher128;
  835|      2|		result[0x5B816E75] = (SSLCipherSuite*)&Cipher129;
  836|      2|		result[0x6F18C4DD] = (SSLCipherSuite*)&Cipher130;
  837|      2|		result[0x2E1C05E0] = (SSLCipherSuite*)&Cipher131;
  838|      2|		result[0x5592CFF7] = (SSLCipherSuite*)&Cipher132;
  839|      2|		result[0x8221D38B] = (SSLCipherSuite*)&Cipher133;
  840|      2|		result[0x9538105C] = (SSLCipherSuite*)&Cipher134;
  841|      2|		result[0xF1100DD0] = (SSLCipherSuite*)&Cipher135;
  842|      2|		result[0xF492EF1F] = (SSLCipherSuite*)&Cipher136;
  843|      2|		result[0x226BD52C] = (SSLCipherSuite*)&Cipher137;
  844|      2|		result[0xBBACE99F] = (SSLCipherSuite*)&Cipher138;
  845|      2|		result[0xB3D4B66B] = (SSLCipherSuite*)&Cipher139;
  846|      2|		result[0x8C619440] = (SSLCipherSuite*)&Cipher140;
  847|      2|		result[0xE60B95C] = (SSLCipherSuite*)&Cipher141;
  848|      2|		result[0x24F48D07] = (SSLCipherSuite*)&Cipher142;
  849|      2|		result[0x15C7AF26] = (SSLCipherSuite*)&Cipher143;
  850|      2|		result[0xCBA219CC] = (SSLCipherSuite*)&Cipher144;
  851|      2|		result[0x9BD946BE] = (SSLCipherSuite*)&Cipher145;
  852|      2|		result[0x7CCA46FF] = (SSLCipherSuite*)&Cipher146;
  853|      2|		result[0x9FB51FA3] = (SSLCipherSuite*)&Cipher147;
  854|      2|		result[0xC82A275B] = (SSLCipherSuite*)&Cipher148;
  855|      2|		result[0x4472A583] = (SSLCipherSuite*)&Cipher149;
  856|      2|		result[0xDBA3A5CF] = (SSLCipherSuite*)&Cipher150;
  857|      2|		result[0x86338128] = (SSLCipherSuite*)&Cipher151;
  858|      2|		result[0x8CCE91E4] = (SSLCipherSuite*)&Cipher152;
  859|      2|		result[0xA81C6CA0] = (SSLCipherSuite*)&Cipher153;
  860|      2|		result[0x6D80815E] = (SSLCipherSuite*)&Cipher154;
  861|      2|		result[0xA383DEB0] = (SSLCipherSuite*)&Cipher155;
  862|      2|		result[0x52073879] = (SSLCipherSuite*)&Cipher156;
  863|      2|		result[0x5BA0B279] = (SSLCipherSuite*)&Cipher157;
  864|      2|		result[0xD787CCC9] = (SSLCipherSuite*)&Cipher158;
  865|      2|		result[0x9C86C6A9] = (SSLCipherSuite*)&Cipher159;
  866|      2|		result[0xDAE424E5] = (SSLCipherSuite*)&Cipher160;
  867|      2|		result[0x72C15ECE] = (SSLCipherSuite*)&Cipher161;
  868|      2|		result[0xF0E8FB6E] = (SSLCipherSuite*)&Cipher162;
  869|      2|		result[0xA2005D44] = (SSLCipherSuite*)&Cipher163;
  870|      2|		result[0x77F79962] = (SSLCipherSuite*)&Cipher164;
  871|      2|		result[0x25C8184C] = (SSLCipherSuite*)&Cipher165;
  872|      2|		result[0x2070F8A5] = (SSLCipherSuite*)&Cipher166;
  873|      2|		result[0x4189ED8D] = (SSLCipherSuite*)&Cipher167;
  874|      2|		result[0x94C21B1] = (SSLCipherSuite*)&Cipher168;
  875|      2|		result[0x1B0CB25C] = (SSLCipherSuite*)&Cipher169;
  876|      2|		result[0xF18127A0] = (SSLCipherSuite*)&Cipher170;
  877|      2|		result[0xC7FCA79A] = (SSLCipherSuite*)&Cipher171;
  878|      2|		result[0xC1DEE135] = (SSLCipherSuite*)&Cipher172;
  879|      2|		result[0xDA7143E9] = (SSLCipherSuite*)&Cipher173;
  880|      2|		result[0xE82B6A2] = (SSLCipherSuite*)&Cipher174;
  881|      2|		result[0x438EC1DD] = (SSLCipherSuite*)&Cipher175;
  882|      2|		result[0x6BE32FA9] = (SSLCipherSuite*)&Cipher176;
  883|      2|		result[0x18A5C375] = (SSLCipherSuite*)&Cipher177;
  884|      2|		result[0x24136C59] = (SSLCipherSuite*)&Cipher178;
  885|      2|		result[0x88529408] = (SSLCipherSuite*)&Cipher179;
  886|      2|		result[0xADAB33FC] = (SSLCipherSuite*)&Cipher180;
  887|      2|		result[0x79407DCB] = (SSLCipherSuite*)&Cipher181;
  888|      2|		result[0x64970FFF] = (SSLCipherSuite*)&Cipher182;
  889|      2|		result[0x8260DC9A] = (SSLCipherSuite*)&Cipher183;
  890|      2|		result[0x4B74FFFE] = (SSLCipherSuite*)&Cipher184;
  891|      2|		result[0x350DD5C8] = (SSLCipherSuite*)&Cipher185;
  892|      2|		result[0x53E057C] = (SSLCipherSuite*)&Cipher186;
  893|      2|		result[0x266020E1] = (SSLCipherSuite*)&Cipher187;
  894|      2|		result[0xE6DB4B9D] = (SSLCipherSuite*)&Cipher188;
  895|      2|		result[0x5A992E6] = (SSLCipherSuite*)&Cipher189;
  896|      2|		result[0x1B33C882] = (SSLCipherSuite*)&Cipher190;
  897|      2|		result[0x33579D2B] = (SSLCipherSuite*)&Cipher191;
  898|      2|		result[0x1BD7F7FF] = (SSLCipherSuite*)&Cipher192;
  899|      2|		result[0x39C59ED9] = (SSLCipherSuite*)&Cipher193;
  900|      2|		result[0x4F19FB95] = (SSLCipherSuite*)&Cipher194;
  901|      2|		result[0x8F4737BE] = (SSLCipherSuite*)&Cipher195;
  902|      2|		result[0x2567AA9E] = (SSLCipherSuite*)&Cipher196;
  903|      2|		result[0xEEF843DB] = (SSLCipherSuite*)&Cipher197;
  904|      2|		result[0x978C4E4F] = (SSLCipherSuite*)&Cipher198;
  905|      2|		result[0x2F8D17D9] = (SSLCipherSuite*)&Cipher199;
  906|      2|		result[0x7F80393A] = (SSLCipherSuite*)&Cipher200;
  907|      2|		result[0xDCA5AE1E] = (SSLCipherSuite*)&Cipher201;
  908|      2|		result[0x74AA95D7] = (SSLCipherSuite*)&Cipher202;
  909|      2|		result[0xB93174BB] = (SSLCipherSuite*)&Cipher203;
  910|      2|		result[0x46E274FC] = (SSLCipherSuite*)&Cipher204;
  911|      2|		result[0x9DC85330] = (SSLCipherSuite*)&Cipher205;
  912|      2|		result[0x972847B8] = (SSLCipherSuite*)&Cipher206;
  913|      2|		result[0xFCF61DAC] = (SSLCipherSuite*)&Cipher207;
  914|      2|		result[0x73C0029B] = (SSLCipherSuite*)&Cipher208;
  915|      2|		result[0xDA41D70F] = (SSLCipherSuite*)&Cipher209;
  916|      2|		result[0x12CBC4E7] = (SSLCipherSuite*)&Cipher210;
  917|      2|		result[0x8B2D5ACB] = (SSLCipherSuite*)&Cipher211;
  918|      2|		result[0x28C0C084] = (SSLCipherSuite*)&Cipher212;
  919|      2|		result[0x1602C1F8] = (SSLCipherSuite*)&Cipher213;
  920|      2|		result[0xF5FB9ED] = (SSLCipherSuite*)&Cipher214;
  921|      2|		result[0xE8E30E91] = (SSLCipherSuite*)&Cipher215;
  922|      2|		result[0x70BA7792] = (SSLCipherSuite*)&Cipher216;
  923|      2|		result[0x94C38076] = (SSLCipherSuite*)&Cipher217;
  924|      2|		result[0xE5B3483F] = (SSLCipherSuite*)&Cipher218;
  925|      2|		result[0x892DEBE3] = (SSLCipherSuite*)&Cipher219;
  926|      2|		result[0x65609E50] = (SSLCipherSuite*)&Cipher220;
  927|      2|		result[0xAB4F3F04] = (SSLCipherSuite*)&Cipher221;
  928|      2|		result[0x8BFC76DA] = (SSLCipherSuite*)&Cipher222;
  929|      2|		result[0xD4BDCD6] = (SSLCipherSuite*)&Cipher223;
  930|      2|		result[0xCAB8F54A] = (SSLCipherSuite*)&Cipher224;
  931|      2|		result[0xA10DCFC6] = (SSLCipherSuite*)&Cipher225;
  932|      2|		result[0xD6B71B71] = (SSLCipherSuite*)&Cipher226;
  933|      2|		result[0x6D775A2D] = (SSLCipherSuite*)&Cipher227;
  934|      2|		result[0x7997AD16] = (SSLCipherSuite*)&Cipher228;
  935|      2|		result[0x5338C632] = (SSLCipherSuite*)&Cipher229;
  936|      2|		result[0x45F0598D] = (SSLCipherSuite*)&Cipher230;
  937|      2|		result[0x2D8B6A99] = (SSLCipherSuite*)&Cipher231;
  938|      2|		result[0xE14DC125] = (SSLCipherSuite*)&Cipher232;
  939|      2|		result[0x1538351] = (SSLCipherSuite*)&Cipher233;
  940|      2|		result[0x1A8CE530] = (SSLCipherSuite*)&Cipher234;
  941|      2|		result[0xB01E69C4] = (SSLCipherSuite*)&Cipher235;
  942|      2|		result[0xCCBF70D3] = (SSLCipherSuite*)&Cipher236;
  943|      2|		result[0xEF664FE7] = (SSLCipherSuite*)&Cipher237;
  944|      2|		result[0xF6ED4F52] = (SSLCipherSuite*)&Cipher238;
  945|      2|		result[0x7D6522E] = (SSLCipherSuite*)&Cipher239;
  946|      2|		result[0xBDB5C9B9] = (SSLCipherSuite*)&Cipher240;
  947|      2|		result[0xD98D5C95] = (SSLCipherSuite*)&Cipher241;
  948|      2|		result[0x92B92727] = (SSLCipherSuite*)&Cipher242;
  949|      2|		result[0xB4FE570B] = (SSLCipherSuite*)&Cipher243;
  950|      2|		result[0x8DCF7F77] = (SSLCipherSuite*)&Cipher244;
  951|      2|		result[0x8208545B] = (SSLCipherSuite*)&Cipher245;
  952|      2|		result[0x39A13298] = (SSLCipherSuite*)&Cipher246;
  953|      2|		result[0xECB7070C] = (SSLCipherSuite*)&Cipher247;
  954|      2|		result[0xAFA95F8A] = (SSLCipherSuite*)&Cipher248;
  955|      2|		result[0x3D80E106] = (SSLCipherSuite*)&Cipher249;
  956|      2|		result[0x83AF9B7A] = (SSLCipherSuite*)&Cipher250;
  957|      2|		result[0x1FAAC2F6] = (SSLCipherSuite*)&Cipher251;
  958|      2|		result[0x2AF11F51] = (SSLCipherSuite*)&Cipher252;
  959|      2|		result[0xEDFD300D] = (SSLCipherSuite*)&Cipher253;
  960|      2|		result[0x91AA268F] = (SSLCipherSuite*)&Cipher254;
  961|      2|		result[0x9DF0E933] = (SSLCipherSuite*)&Cipher255;
  962|      2|		result[0xF3951A6A] = (SSLCipherSuite*)&Cipher256;
  963|      2|		result[0xE4FF8DCE] = (SSLCipherSuite*)&Cipher257;
  964|      2|		result[0xBE4DFC61] = (SSLCipherSuite*)&Cipher258;
  965|      2|		result[0xBB2CF025] = (SSLCipherSuite*)&Cipher259;
  966|      2|		result[0x354D38A8] = (SSLCipherSuite*)&Cipher260;
  967|      2|		result[0xE2444B9C] = (SSLCipherSuite*)&Cipher261;
  968|      2|		result[0xF8298D43] = (SSLCipherSuite*)&Cipher262;
  969|      2|		result[0x3EC413B7] = (SSLCipherSuite*)&Cipher263;
  970|      2|		result[0xE0C75BE9] = (SSLCipherSuite*)&Cipher264;
  971|      2|		result[0x7191BE45] = (SSLCipherSuite*)&Cipher265;
  972|      2|		result[0xDDE7C439] = (SSLCipherSuite*)&Cipher266;
  973|      2|		result[0xBE715415] = (SSLCipherSuite*)&Cipher267;
  974|      2|		result[0x6CF8F9A6] = (SSLCipherSuite*)&Cipher268;
  975|      2|		result[0x36D61242] = (SSLCipherSuite*)&Cipher269;
  976|      2|		result[0xFA9BA9ED] = (SSLCipherSuite*)&Cipher270;
  977|      2|		result[0x4588B179] = (SSLCipherSuite*)&Cipher271;
  978|      2|		result[0xB3C246FA] = (SSLCipherSuite*)&Cipher272;
  979|      2|		result[0x750EEB76] = (SSLCipherSuite*)&Cipher273;
  980|      2|		result[0xC50ACCB2] = (SSLCipherSuite*)&Cipher274;
  981|      2|		result[0x9555CD0E] = (SSLCipherSuite*)&Cipher275;
  982|      2|		result[0xF25A659B] = (SSLCipherSuite*)&Cipher276;
  983|      2|		result[0x1670E72F] = (SSLCipherSuite*)&Cipher277;
  984|      2|		result[0xDB0DD6BC] = (SSLCipherSuite*)&Cipher278;
  985|      2|		result[0x19CACD70] = (SSLCipherSuite*)&Cipher279;
  986|      2|		result[0xC54D5481] = (SSLCipherSuite*)&Cipher280;
  987|      2|		result[0x7BCCA2BD] = (SSLCipherSuite*)&Cipher281;
  988|      2|		result[0xA851374E] = (SSLCipherSuite*)&Cipher282;
  989|      2|		result[0xE887BEA] = (SSLCipherSuite*)&Cipher283;
  990|      2|		result[0xDECAA7F9] = (SSLCipherSuite*)&Cipher284;
  991|      2|		result[0x29DA73D5] = (SSLCipherSuite*)&Cipher285;
  992|      2|		result[0xAC69ECC9] = (SSLCipherSuite*)&Cipher286;
  993|      2|		result[0x6AE55625] = (SSLCipherSuite*)&Cipher287;
  994|      2|		result[0x2BB24546] = (SSLCipherSuite*)&Cipher288;
  995|      2|		result[0x7AB5F262] = (SSLCipherSuite*)&Cipher289;
  996|      2|		result[0x3DB83990] = (SSLCipherSuite*)&Cipher290;
  997|      2|		result[0xC852A244] = (SSLCipherSuite*)&Cipher291;
  998|      2|		result[0xA3C952C0] = (SSLCipherSuite*)&Cipher292;
  999|      2|		result[0xAF630C34] = (SSLCipherSuite*)&Cipher293;
 1000|      2|		result[0xD4EE22B] = (SSLCipherSuite*)&Cipher294;
 1001|      2|		result[0x83F4C5DF] = (SSLCipherSuite*)&Cipher295;
 1002|      2|		result[0xCCF6F918] = (SSLCipherSuite*)&Cipher296;
 1003|      2|		result[0x955C9E8C] = (SSLCipherSuite*)&Cipher297;
 1004|      2|		result[0xF3559154] = (SSLCipherSuite*)&Cipher298;
 1005|      2|		result[0xE0991C14] = (SSLCipherSuite*)&Cipher299;
 1006|      2|		result[0x7F6BF424] = (SSLCipherSuite*)&Cipher300;
 1007|      2|		result[0x4A129264] = (SSLCipherSuite*)&Cipher301;
 1008|      2|		result[0xB25E29E3] = (SSLCipherSuite*)&Cipher302;
 1009|      2|		result[0xA6E15A23] = (SSLCipherSuite*)&Cipher303;
 1010|      2|		result[0x637C5C53] = (SSLCipherSuite*)&Cipher304;
 1011|      2|		result[0x22794513] = (SSLCipherSuite*)&Cipher305;
 1012|      2|		result[0x4CE30464] = (SSLCipherSuite*)&Cipher306;
 1013|      2|		result[0xFDFE3B24] = (SSLCipherSuite*)&Cipher307;
 1014|      2|		result[0xDC8A2074] = (SSLCipherSuite*)&Cipher308;
 1015|      2|		result[0xFD448934] = (SSLCipherSuite*)&Cipher309;
 1016|      2|		result[0xF4FC2B13] = (SSLCipherSuite*)&Cipher310;
 1017|      2|		result[0xB10ECD53] = (SSLCipherSuite*)&Cipher311;
 1018|      2|		result[0xF44F4BC7] = (SSLCipherSuite*)&Cipher312;
 1019|      2|		result[0x49AF0BF] = (SSLCipherSuite*)&Cipher313;
 1020|      2|		result[0xDFAF479A] = (SSLCipherSuite*)&Cipher314;
 1021|      2|		result[0x82BF78CE] = (SSLCipherSuite*)&Cipher315;
 1022|      2|		result[0x46CD83C9] = (SSLCipherSuite*)&Cipher316;
 1023|      2|		result[0x8F7D7465] = (SSLCipherSuite*)&Cipher317;
 1024|      2|		result[0xBD9CDFE5] = (SSLCipherSuite*)&Cipher318;
 1025|      2|		result[0x92942203] = (SSLCipherSuite*)&Cipher319;
 1026|      2|		result[0x783C98AD] = (SSLCipherSuite*)&Cipher320;
 1027|      2|		result[0x92213B6D] = (SSLCipherSuite*)&Cipher321;
 1028|      2|		result[0xCFCB1A55] = (SSLCipherSuite*)&Cipher322;
 1029|      2|		result[0x54C2D55D] = (SSLCipherSuite*)&Cipher323;
 1030|      2|		result[0xDCD6F114] = (SSLCipherSuite*)&Cipher324;
 1031|      2|		result[0x6AD23C40] = (SSLCipherSuite*)&Cipher325;
 1032|      2|		result[0x5F5239D4] = (SSLCipherSuite*)&Cipher326;
 1033|      2|		result[0xAB27704B] = (SSLCipherSuite*)&Cipher327;
 1034|      2|		result[0xA3178D0C] = (SSLCipherSuite*)&Cipher328;
 1035|      2|		result[0x5DAAA195] = (SSLCipherSuite*)&Cipher329;
 1036|       |
 1037|      2|		return result;
 1038|      2|	}
SSLHandshake.cpp:_ZN4pcppL10hashStringENSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE:
  694|  6.33k|	{
  695|  6.33k|		unsigned h = SslHashInitialValue;
  696|   139k|		for (auto i = 0u; i < str.size(); ++i)
  ------------------
  |  Branch (696:21): [True: 133k, False: 6.33k]
  ------------------
  697|   133k|		{
  698|   133k|			h = (h * SslHashMultiplierA) ^ (str[i] * SslHashMultiplierB);
  699|   133k|		}
  700|  6.33k|		return h;
  701|  6.33k|	}

_ZN4pcpp8SSLLayer12IsSSLMessageEttPhmb:
   15|   487k|	{
   16|       |		// check the port map first
   17|   487k|		if (!ignorePorts && !isSSLPort(srcPort) && !isSSLPort(dstPort))
  ------------------
  |  Branch (17:7): [True: 357k, False: 130k]
  |  Branch (17:23): [True: 271k, False: 85.2k]
  |  Branch (17:46): [True: 199k, False: 72.3k]
  ------------------
   18|   199k|			return false;
   19|       |
   20|   287k|		if (dataLen < sizeof(ssl_tls_record_layer))
  ------------------
  |  Branch (20:7): [True: 3.01k, False: 284k]
  ------------------
   21|  3.01k|			return false;
   22|       |
   23|   284k|		ssl_tls_record_layer* recordLayer = (ssl_tls_record_layer*)data;
   24|       |
   25|       |		// there is no SSL message with length 0
   26|   284k|		if (recordLayer->length == 0)
  ------------------
  |  Branch (26:7): [True: 8.38k, False: 276k]
  ------------------
   27|  8.38k|			return false;
   28|       |
   29|   276k|		if (recordLayer->recordType < 20 || recordLayer->recordType > 23)
  ------------------
  |  Branch (29:7): [True: 4.08k, False: 272k]
  |  Branch (29:39): [True: 17.6k, False: 254k]
  ------------------
   30|  21.7k|			return false;
   31|       |
   32|   254k|		SSLVersion::SSLVersionEnum recordVersion = SSLVersion(be16toh(recordLayer->recordVersion)).asEnum(true);
   33|       |
   34|   254k|		if (recordVersion == SSLVersion::TLS1_3 || recordVersion == SSLVersion::TLS1_2 ||
  ------------------
  |  Branch (34:7): [True: 5.88k, False: 248k]
  |  Branch (34:46): [True: 202k, False: 45.8k]
  ------------------
   35|  45.8k|		    recordVersion == SSLVersion::TLS1_1 || recordVersion == SSLVersion::TLS1_0 ||
  ------------------
  |  Branch (35:7): [True: 26, False: 45.7k]
  |  Branch (35:46): [True: 34.1k, False: 11.6k]
  ------------------
   36|  11.6k|		    recordVersion == SSLVersion::SSL3)
  ------------------
  |  Branch (36:7): [True: 10.1k, False: 1.54k]
  ------------------
   37|   253k|			return true;
   38|  1.54k|		else
   39|  1.54k|			return false;
   40|   254k|	}
_ZN4pcpp8SSLLayer16createSSLMessageEPhmPNS_5LayerEPNS_6PacketE:
   43|   253k|	{
   44|   253k|		if (!canReinterpretAs<ssl_tls_record_layer>(data, dataLen))
  ------------------
  |  Branch (44:7): [True: 0, False: 253k]
  ------------------
   45|      0|		{
   46|      0|			return nullptr;
   47|      0|		}
   48|       |
   49|   253k|		ssl_tls_record_layer* recordLayer = (ssl_tls_record_layer*)data;
   50|   253k|		switch (recordLayer->recordType)
   51|   253k|		{
   52|   125k|		case SSL_HANDSHAKE:
  ------------------
  |  Branch (52:3): [True: 125k, False: 127k]
  ------------------
   53|   125k|		{
   54|   125k|			return new SSLHandshakeLayer(data, dataLen, prevLayer, packet);
   55|      0|		}
   56|       |
   57|  5.94k|		case SSL_ALERT:
  ------------------
  |  Branch (57:3): [True: 5.94k, False: 247k]
  ------------------
   58|  5.94k|		{
   59|  5.94k|			return new SSLAlertLayer(data, dataLen, prevLayer, packet);
   60|      0|		}
   61|       |
   62|  24.1k|		case SSL_CHANGE_CIPHER_SPEC:
  ------------------
  |  Branch (62:3): [True: 24.1k, False: 228k]
  ------------------
   63|  24.1k|		{
   64|  24.1k|			return new SSLChangeCipherSpecLayer(data, dataLen, prevLayer, packet);
   65|      0|		}
   66|       |
   67|  97.7k|		case SSL_APPLICATION_DATA:
  ------------------
  |  Branch (67:3): [True: 97.7k, False: 155k]
  ------------------
   68|  97.7k|		{
   69|  97.7k|			return new SSLApplicationDataLayer(data, dataLen, prevLayer, packet);
   70|      0|		}
   71|       |
   72|      0|		default:
  ------------------
  |  Branch (72:3): [True: 0, False: 253k]
  ------------------
   73|      0|			return nullptr;
   74|   253k|		}
   75|   253k|	}
_ZNK4pcpp8SSLLayer16getRecordVersionEv:
   78|  71.9k|	{
   79|       |		uint16_t recordVersion = be16toh(getRecordLayer()->recordVersion);
   80|  71.9k|		return SSLVersion(recordVersion);
   81|  71.9k|	}
_ZNK4pcpp8SSLLayer12getHeaderLenEv:
   89|   290k|	{
   90|   290k|		size_t len = sizeof(ssl_tls_record_layer) + be16toh(getRecordLayer()->length);
   91|   290k|		if (len > m_DataLen)
  ------------------
  |  Branch (91:7): [True: 33.6k, False: 257k]
  ------------------
   92|  33.6k|			return m_DataLen;
   93|   257k|		return len;
   94|   290k|	}
_ZN4pcpp8SSLLayer14parseNextLayerEv:
   97|   253k|	{
   98|   253k|		size_t headerLen = getHeaderLen();
   99|   253k|		if (m_DataLen <= headerLen)
  ------------------
  |  Branch (99:7): [True: 122k, False: 130k]
  ------------------
  100|   122k|			return;
  101|       |
  102|   130k|		if (SSLLayer::IsSSLMessage(0, 0, m_Data + headerLen, m_DataLen - headerLen, true))
  ------------------
  |  Branch (102:7): [True: 117k, False: 12.6k]
  ------------------
  103|   117k|		{
  104|   117k|			constructNextLayerFromFactory(SSLLayer::createSSLMessage, m_Data + headerLen, m_DataLen - headerLen);
  105|   117k|		}
  106|   130k|	}
_ZNK4pcpp17SSLHandshakeLayer8toStringEv:
  113|  29.0k|	{
  114|  29.0k|		std::stringstream result;
  115|  29.0k|		result << getRecordVersion().toString(true) << " Layer, Handshake:";
  116|  58.7k|		for (size_t i = 0; i < m_MessageList.size(); i++)
  ------------------
  |  Branch (116:22): [True: 29.6k, False: 29.0k]
  ------------------
  117|  29.6k|		{
  118|  29.6k|			if (i == 0)
  ------------------
  |  Branch (118:8): [True: 22.0k, False: 7.62k]
  ------------------
  119|  22.0k|				result << " " << m_MessageList.at(i)->toString();
  120|  7.62k|			else
  121|  7.62k|				result << ", " << m_MessageList.at(i)->toString();
  122|  29.6k|		}
  123|  29.0k|		return result.str();
  124|  29.0k|	}
_ZN4pcpp17SSLHandshakeLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  127|   125k|	    : SSLLayer(data, dataLen, prevLayer, packet)
  128|   125k|	{
  129|   125k|		constexpr size_t baseTLSRecordSize = sizeof(ssl_tls_record_layer);
  130|   125k|		uint8_t* curPos = m_Data + baseTLSRecordSize;
  131|   125k|		size_t recordDataLen = be16toh(getRecordLayer()->length);
  132|       |
  133|   125k|		if (m_DataLen < recordDataLen + baseTLSRecordSize)
  ------------------
  |  Branch (133:7): [True: 22.7k, False: 102k]
  ------------------
  134|  22.7k|		{
  135|  22.7k|			recordDataLen = m_DataLen >= baseTLSRecordSize ? m_DataLen - baseTLSRecordSize : 0;
  ------------------
  |  Branch (135:20): [True: 22.7k, False: 0]
  ------------------
  136|  22.7k|		}
  137|       |
  138|   125k|		size_t curPosIndex = 0;
  139|   245k|		while (true)
  ------------------
  |  Branch (139:10): [True: 245k, Folded]
  ------------------
  140|   245k|		{
  141|   245k|			SSLHandshakeMessage* message =
  142|   245k|			    SSLHandshakeMessage::createHandshakeMessage(curPos, recordDataLen - curPosIndex, this);
  143|   245k|			if (message == nullptr)
  ------------------
  |  Branch (143:8): [True: 125k, False: 119k]
  ------------------
  144|   125k|				break;
  145|       |
  146|   119k|			m_MessageList.pushBack(message);
  147|   119k|			curPos += message->getMessageLength();
  148|   119k|			curPosIndex += message->getMessageLength();
  149|   119k|		}
  150|   125k|	}
_ZNK4pcpp24SSLChangeCipherSpecLayer8toStringEv:
  165|  6.05k|	{
  166|  6.05k|		std::stringstream result;
  167|  6.05k|		result << getRecordVersion().toString(true) << " Layer, Change Cipher Spec";
  168|  6.05k|		return result.str();
  169|  6.05k|	}
_ZNK4pcpp13SSLAlertLayer13getAlertLevelEv:
  176|  1.66k|	{
  177|       |		// the record is too short to hold the alert level
  178|  1.66k|		if (getHeaderLen() < sizeof(ssl_tls_record_layer) + sizeof(uint8_t))
  ------------------
  |  Branch (178:7): [True: 0, False: 1.66k]
  ------------------
  179|      0|			return SSL_ALERT_LEVEL_ENCRYPTED;
  180|       |
  181|  1.66k|		uint8_t* pos = m_Data + sizeof(ssl_tls_record_layer);
  182|  1.66k|		uint8_t alertLevel = *pos;
  183|  1.66k|		if (alertLevel == SSL_ALERT_LEVEL_WARNING || alertLevel == SSL_ALERT_LEVEL_FATAL)
  ------------------
  |  Branch (183:7): [True: 826, False: 838]
  |  Branch (183:48): [True: 338, False: 500]
  ------------------
  184|  1.16k|			return (SSLAlertLevel)alertLevel;
  185|    500|		else
  186|    500|			return SSL_ALERT_LEVEL_ENCRYPTED;
  187|  1.66k|	}
_ZNK4pcpp13SSLAlertLayer8toStringEv:
  235|  1.66k|	{
  236|  1.66k|		std::stringstream result;
  237|  1.66k|		result << getRecordVersion().toString(true) << " Layer, ";
  238|  1.66k|		if (getAlertLevel() == SSL_ALERT_LEVEL_ENCRYPTED)
  ------------------
  |  Branch (238:7): [True: 500, False: 1.16k]
  ------------------
  239|    500|			result << "Encrypted Alert";
  240|  1.16k|		else
  241|       |			// TODO: add alert level and description here
  242|  1.16k|			result << "Alert";
  243|  1.66k|		return result.str();
  244|  1.66k|	}
_ZNK4pcpp23SSLApplicationDataLayer8toStringEv:
  268|  35.1k|	{
  269|  35.1k|		return getRecordVersion().toString(true) + " Layer, Application Data";
  270|  35.1k|	}

_ZN4pcpp18splitByWhiteSpacesERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE:
   11|  7.21k|	{
   12|  7.21k|		std::string buf;
   13|  7.21k|		std::stringstream stream(str);
   14|  7.21k|		std::vector<std::string> result;
   15|  25.6k|		while (stream >> buf)
  ------------------
  |  Branch (15:10): [True: 18.4k, False: 7.21k]
  ------------------
   16|  18.4k|			result.push_back(buf);
   17|       |
   18|  7.21k|		return result;
   19|  7.21k|	}
_ZN4pcpp8SdpLayerC2EPhmPNS_5LayerEPNS_6PacketE:
   22|  9.47k|	    : TextBasedProtocolMessage(data, dataLen, prevLayer, packet, SDP)
   23|  9.47k|	{
   24|  9.47k|		setFieldsOffset(0);
   25|  9.47k|		parseFields();
   26|  9.47k|	}
_ZNK4pcpp8SdpLayer8toStringEv:
   70|  2.67k|	{
   71|  2.67k|		return "SDP Layer";
   72|  2.67k|	}
_ZNK4pcpp8SdpLayer19getOwnerIPv4AddressEv:
   75|  1.33k|	{
   76|  1.33k|		HeaderField* originator = getFieldByName(PCPP_SDP_ORIGINATOR_FIELD);
  ------------------
  |  |   17|  1.33k|#define PCPP_SDP_ORIGINATOR_FIELD "o"
  ------------------
   77|  1.33k|		if (originator == nullptr)
  ------------------
  |  Branch (77:7): [True: 972, False: 367]
  ------------------
   78|    972|			return IPv4Address::Zero;
   79|       |
   80|    367|		std::vector<std::string> tokens = splitByWhiteSpaces(originator->getFieldValue());
   81|    367|		if (tokens.size() < 6)
  ------------------
  |  Branch (81:7): [True: 276, False: 91]
  ------------------
   82|    276|			return IPv4Address::Zero;
   83|       |
   84|     91|		if (tokens[3] != "IN" || tokens[4] != "IP4")
  ------------------
  |  Branch (84:7): [True: 1, False: 90]
  |  Branch (84:28): [True: 18, False: 72]
  ------------------
   85|     19|			return IPv4Address::Zero;
   86|       |
   87|     72|		try
   88|     72|		{
   89|     72|			return IPv4Address(tokens[5]);
   90|     72|		}
   91|     72|		catch (const std::exception&)
   92|     72|		{
   93|     34|			return IPv4Address::Zero;
   94|     34|		}
   95|     72|	}
_ZNK4pcpp8SdpLayer12getMediaPortERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   98|  1.33k|	{
   99|  1.33k|		int mediaFieldIndex = 0;
  100|  1.33k|		HeaderField* mediaDesc = getFieldByName(PCPP_SDP_MEDIA_NAME_FIELD, mediaFieldIndex);
  ------------------
  |  |   43|  1.33k|#define PCPP_SDP_MEDIA_NAME_FIELD "m"
  ------------------
  101|       |
  102|  8.12k|		while (mediaDesc != nullptr)
  ------------------
  |  Branch (102:10): [True: 6.84k, False: 1.27k]
  ------------------
  103|  6.84k|		{
  104|  6.84k|			std::vector<std::string> tokens = splitByWhiteSpaces(mediaDesc->getFieldValue());
  105|       |
  106|  6.84k|			if (tokens.size() >= 2 && tokens[0] == mediaType)
  ------------------
  |  Branch (106:8): [True: 5.16k, False: 1.68k]
  |  Branch (106:30): [True: 65, False: 5.09k]
  ------------------
  107|     65|				return atoi(tokens[1].c_str());
  108|       |
  109|  6.78k|			mediaFieldIndex++;
  110|  6.78k|			mediaDesc = getFieldByName(PCPP_SDP_MEDIA_NAME_FIELD, mediaFieldIndex);
  ------------------
  |  |   43|  6.78k|#define PCPP_SDP_MEDIA_NAME_FIELD "m"
  ------------------
  111|  6.78k|		}
  112|       |
  113|  1.27k|		return 0;
  114|  1.33k|	}
_ZN4pcpp8SdpLayer19addMediaDescriptionERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEtS9_S9_RKNS1_6vectorIS7_NS5_IS7_EEEE:
  119|  1.33k|	{
  120|  1.33k|		std::stringstream portStream;
  121|  1.33k|		portStream << mediaPort;
  122|       |
  123|  1.33k|		std::string mediaFieldValue = mediaType + " " + portStream.str() + " " + mediaProtocol + " " + mediaFormat;
  124|  1.33k|		if (addField(PCPP_SDP_MEDIA_NAME_FIELD, mediaFieldValue) == nullptr)
  ------------------
  |  |   43|  1.33k|#define PCPP_SDP_MEDIA_NAME_FIELD "m"
  ------------------
  |  Branch (124:7): [True: 1.00k, False: 332]
  ------------------
  125|  1.00k|		{
  126|  1.00k|			PCPP_LOG_ERROR("Failed to add media description field");
  ------------------
  |  |  445|  1.00k|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|  1.00k|	do                                                                                                                 \
  |  |  |  |  415|  1.00k|	{                                                                                                                  \
  |  |  |  |  416|  1.00k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  1.00k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.00k|#define LOG_MODULE PacketLogModuleSdpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 1.00k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|  1.00k|		{                                                                                                              \
  |  |  |  |  419|  1.00k|			auto ctx =                                                                                                 \
  |  |  |  |  420|  1.00k|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.00k|#define LOG_MODULE PacketLogModuleSdpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|  1.00k|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|  1.00k|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|  1.00k|		}                                                                                                              \
  |  |  |  |  424|  1.00k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 1.00k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  127|  1.00k|			return false;
  128|  1.00k|		}
  129|       |
  130|    332|		for (const auto& iter : mediaAttributes)
  ------------------
  |  Branch (130:25): [True: 332, False: 332]
  ------------------
  131|    332|		{
  132|    332|			if (addField(PCPP_SDP_MEDIA_ATTRIBUTE_FIELD, iter) == nullptr)
  ------------------
  |  |   41|    332|#define PCPP_SDP_MEDIA_ATTRIBUTE_FIELD "a"
  ------------------
  |  Branch (132:8): [True: 0, False: 332]
  ------------------
  133|      0|			{
  134|      0|				PCPP_LOG_ERROR("Failed to add media attribute '" << iter << "'");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSdpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSdpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  135|      0|				return false;
  136|      0|			}
  137|    332|		}
  138|       |
  139|    332|		return true;
  140|    332|	}

_ZNK4pcpp25SingleCommandTextProtocol22getArgumentFieldOffsetEv:
   14|  28.4k|	{
   15|  28.4k|		size_t maxLen;
   16|  28.4k|		if (m_DataLen < MaxCommandLength)
  ------------------
  |  Branch (16:7): [True: 8.88k, False: 19.5k]
  ------------------
   17|  8.88k|			maxLen = m_DataLen;
   18|  19.5k|		else
   19|  19.5k|			maxLen = MaxCommandLength;
   20|       |
   21|       |		// To correctly detect multi-line packets with the option containing a space in
   22|       |		// the first MAX_CONTENT_LENGTH bytes, search the both of hyphen and space to take
   23|       |		// correct command delimiter
   24|       |
   25|  28.4k|		std::string field(reinterpret_cast<char*>(m_Data), maxLen);
   26|       |
   27|  28.4k|		size_t posHyphen = field.find_first_of(AsciiHyphen);
   28|  28.4k|		size_t posSpace = field.find_first_of(AsciiSpace);
   29|  28.4k|		size_t posCRLF = field.rfind("\r\n");
   30|       |
   31|       |		// No delimiter or packet end
   32|  28.4k|		if (posHyphen == std::string::npos && posSpace == std::string::npos && posCRLF == std::string::npos)
  ------------------
  |  Branch (32:7): [True: 26.2k, False: 2.16k]
  |  Branch (32:41): [True: 10.0k, False: 16.1k]
  |  Branch (32:74): [True: 3.94k, False: 6.15k]
  ------------------
   33|  3.94k|			return 0;
   34|       |		// Both hyphen and space found
   35|  24.4k|		else if (posHyphen != std::string::npos || posSpace != std::string::npos)
  ------------------
  |  Branch (35:12): [True: 2.16k, False: 22.3k]
  |  Branch (35:46): [True: 16.1k, False: 6.15k]
  ------------------
   36|  18.3k|			return std::min(posSpace, posHyphen);
   37|       |		// If nothing found but there is a CRLF it is a only command packet
   38|  6.15k|		else if (posCRLF != std::string::npos)
  ------------------
  |  Branch (38:12): [True: 6.15k, False: 0]
  ------------------
   39|  6.15k|			return posCRLF;
   40|       |
   41|      0|		return 0;
   42|  28.4k|	}
_ZNK4pcpp25SingleCommandTextProtocol18getCommandInternalEv:
  122|  21.0k|	{
  123|  21.0k|		size_t offset = getArgumentFieldOffset();
  124|       |
  125|       |		// If there is no option remove trailing newline characters
  126|  21.0k|		if (offset == (m_DataLen - 1) && offset > 1)
  ------------------
  |  Branch (126:7): [True: 0, False: 21.0k]
  |  Branch (126:36): [True: 0, False: 0]
  ------------------
  127|      0|			return std::string(reinterpret_cast<char*>(m_Data), offset - 1);
  128|  21.0k|		return std::string(reinterpret_cast<char*>(m_Data), offset);
  129|  21.0k|	}
_ZNK4pcpp25SingleCommandTextProtocol24getCommandOptionInternalEv:
  132|  7.35k|	{
  133|  7.35k|		size_t offset = getArgumentFieldOffset();
  134|       |
  135|       |		// We don't want to get delimiter so add 1 for start unless there is no command,
  136|  7.35k|		int addition = offset ? 1 : 0;
  ------------------
  |  Branch (136:18): [True: 4.12k, False: 3.23k]
  ------------------
  137|       |
  138|       |		// Check if command-only packet (-2 to account for len/position comparison and size of CRLF)
  139|  7.35k|		if (offset != (m_DataLen - 2))
  ------------------
  |  Branch (139:7): [True: 4.96k, False: 2.39k]
  ------------------
  140|  4.96k|		{
  141|       |			// We don't want to trailing newline characters so remove 2 and remove addition from start point
  142|  4.96k|			auto option =
  143|  4.96k|			    std::string(reinterpret_cast<char*>(&m_Data[offset + addition]), m_DataLen - (offset + 2 + addition));
  144|       |
  145|       |			// Remove XXX- and XXX<SP> since they are delimiters of the protocol where XXX is the usually status code
  146|       |			// Check RFC821 (SMTP) Section 3.3 and RFC959 (FTP) Section 4.2
  147|  4.96k|			auto code = getCommandInternal();
  148|  4.96k|			auto vDelim = std::vector<std::string>{ code + " ", code + "-" };
  149|       |
  150|  4.96k|			for (const auto& delim : vDelim)
  ------------------
  |  Branch (150:27): [True: 9.92k, False: 4.96k]
  ------------------
  151|  9.92k|			{
  152|  9.92k|				size_t pos = 0;
  153|  38.4k|				while ((pos = option.find(delim, pos)) != std::string::npos)
  ------------------
  |  Branch (153:12): [True: 28.5k, False: 9.92k]
  ------------------
  154|  28.5k|				{
  155|  28.5k|					option.replace(pos, delim.length(), "");
  156|  28.5k|				}
  157|  9.92k|			}
  158|  4.96k|			return option;
  159|  4.96k|		}
  160|  2.39k|		return "";
  161|  7.35k|	}
_ZN4pcpp25SingleCommandTextProtocol11isDataValidEPKhm:
  169|  40.2k|	{
  170|  40.2k|		if (data == nullptr || dataSize < MinPacketLength)
  ------------------
  |  Branch (170:7): [True: 0, False: 40.2k]
  |  Branch (170:26): [True: 85, False: 40.1k]
  ------------------
  171|     85|			return false;
  172|       |
  173|  40.1k|		std::string payload = std::string(reinterpret_cast<const char*>(data), dataSize);
  174|  40.1k|		return payload.rfind("\r\n") == dataSize - 2;
  175|  40.2k|	}

_ZNK4pcpp8SipLayer16getContentLengthEv:
   58|  14.8k|	{
   59|  14.8k|		std::string contentLengthFieldName(PCPP_SIP_CONTENT_LENGTH_FIELD);
  ------------------
  |  |   24|  14.8k|#define PCPP_SIP_CONTENT_LENGTH_FIELD "Content-Length"
  ------------------
   60|  14.8k|		std::transform(contentLengthFieldName.begin(), contentLengthFieldName.end(), contentLengthFieldName.begin(),
   61|  14.8k|		               ::tolower);
   62|  14.8k|		HeaderField* contentLengthField = getFieldByName(contentLengthFieldName);
   63|  14.8k|		if (contentLengthField != nullptr)
  ------------------
  |  Branch (63:7): [True: 12.0k, False: 2.77k]
  ------------------
   64|  12.0k|			return atoi(contentLengthField->getFieldValue().c_str());
   65|  2.77k|		return 0;
   66|  14.8k|	}
_ZN4pcpp8SipLayer16setContentLengthEiRKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
   69|  1.41k|	{
   70|  1.41k|		std::ostringstream contentLengthAsString;
   71|  1.41k|		contentLengthAsString << contentLength;
   72|  1.41k|		std::string contentLengthFieldName(PCPP_SIP_CONTENT_LENGTH_FIELD);
  ------------------
  |  |   24|  1.41k|#define PCPP_SIP_CONTENT_LENGTH_FIELD "Content-Length"
  ------------------
   73|  1.41k|		HeaderField* contentLengthField = getFieldByName(contentLengthFieldName);
   74|  1.41k|		if (contentLengthField == nullptr)
  ------------------
  |  Branch (74:7): [True: 0, False: 1.41k]
  ------------------
   75|      0|		{
   76|      0|			HeaderField* prevField = getFieldByName(prevFieldName);
   77|      0|			contentLengthField = insertField(prevField, PCPP_SIP_CONTENT_LENGTH_FIELD, contentLengthAsString.str());
  ------------------
  |  |   24|      0|#define PCPP_SIP_CONTENT_LENGTH_FIELD "Content-Length"
  ------------------
   78|      0|		}
   79|  1.41k|		else
   80|  1.41k|			contentLengthField->setFieldValue(contentLengthAsString.str());
   81|       |
   82|  1.41k|		return contentLengthField;
   83|  1.41k|	}
_ZN4pcpp8SipLayer14parseNextLayerEv:
   86|  16.7k|	{
   87|  16.7k|		if (getLayerPayloadSize() == 0)
  ------------------
  |  Branch (87:7): [True: 3.37k, False: 13.4k]
  ------------------
   88|  3.37k|			return;
   89|       |
   90|  13.4k|		size_t headerLen = getHeaderLen();
   91|  13.4k|		std::string contentType;
   92|  13.4k|		if (getContentLength() > 0)
  ------------------
  |  Branch (92:7): [True: 10.3k, False: 3.10k]
  ------------------
   93|  10.3k|		{
   94|  10.3k|			HeaderField* contentTypeField = getFieldByName(PCPP_SIP_CONTENT_TYPE_FIELD);
  ------------------
  |  |   22|  10.3k|#define PCPP_SIP_CONTENT_TYPE_FIELD "Content-Type"
  ------------------
   95|  10.3k|			if (contentTypeField != nullptr)
  ------------------
  |  Branch (95:8): [True: 10.1k, False: 162]
  ------------------
   96|  10.1k|				contentType = contentTypeField->getFieldValue();
   97|  10.3k|		}
   98|       |
   99|  13.4k|		auto payload = m_Data + headerLen;
  100|  13.4k|		auto payloadLen = m_DataLen - headerLen;
  101|       |
  102|  13.4k|		if (contentType.find("application/sdp") != std::string::npos)
  ------------------
  |  Branch (102:7): [True: 9.47k, False: 3.94k]
  ------------------
  103|  9.47k|		{
  104|  9.47k|			constructNextLayer<SdpLayer>(payload, payloadLen);
  105|  9.47k|		}
  106|  3.94k|		else
  107|  3.94k|		{
  108|  3.94k|			constructNextLayer<PayloadLayer>(payload, payloadLen);
  109|  3.94k|		}
  110|  13.4k|	}
_ZN4pcpp8SipLayer22computeCalculateFieldsEv:
  113|  2.58k|	{
  114|  2.58k|		HeaderField* contentLengthField = getFieldByName(PCPP_SIP_CONTENT_LENGTH_FIELD);
  ------------------
  |  |   24|  2.58k|#define PCPP_SIP_CONTENT_LENGTH_FIELD "Content-Length"
  ------------------
  115|  2.58k|		if (contentLengthField == nullptr)
  ------------------
  |  Branch (115:7): [True: 1.02k, False: 1.55k]
  ------------------
  116|  1.02k|			return;
  117|       |
  118|  1.55k|		size_t headerLen = getHeaderLen();
  119|  1.55k|		if (m_DataLen > headerLen)
  ------------------
  |  Branch (119:7): [True: 1.44k, False: 108]
  ------------------
  120|  1.44k|		{
  121|  1.44k|			int currentContentLength = getContentLength();
  122|  1.44k|			if (currentContentLength != static_cast<int>(m_DataLen - headerLen))
  ------------------
  |  Branch (122:8): [True: 1.41k, False: 38]
  ------------------
  123|  1.41k|				setContentLength(m_DataLen - headerLen);
  124|  1.44k|		}
  125|  1.55k|	}
_ZN4pcpp8SipLayer20detectSipMessageTypeEPKhm:
  128|  45.2k|	{
  129|  45.2k|		if (!data || dataLen < 3)
  ------------------
  |  Branch (129:7): [True: 0, False: 45.2k]
  |  Branch (129:16): [True: 130, False: 45.1k]
  ------------------
  130|    130|		{
  131|    130|			return SipLayer::SipParseResult::Unknown;
  132|    130|		}
  133|       |
  134|  45.1k|		uint32_t key = pack4(reinterpret_cast<const char*>(data), dataLen);
  135|       |
  136|  45.1k|		switch (key)
  137|  45.1k|		{
  138|  2.07k|		case "INVI"_packed4:  // INVITE
  ------------------
  |  Branch (138:3): [True: 2.07k, False: 43.0k]
  ------------------
  139|  3.50k|		case "ACK "_packed4:  // ACK
  ------------------
  |  Branch (139:3): [True: 1.43k, False: 43.6k]
  ------------------
  140|  3.50k|		case "BYE "_packed4:  // BYE
  ------------------
  |  Branch (140:3): [True: 0, False: 45.1k]
  ------------------
  141|  3.51k|		case "CANC"_packed4:  // CANCEL
  ------------------
  |  Branch (141:3): [True: 15, False: 45.0k]
  ------------------
  142|  3.54k|		case "REGI"_packed4:  // REGISTER
  ------------------
  |  Branch (142:3): [True: 25, False: 45.0k]
  ------------------
  143|  3.54k|		case "PRAC"_packed4:  // PRACK
  ------------------
  |  Branch (143:3): [True: 0, False: 45.1k]
  ------------------
  144|  3.54k|		case "OPTI"_packed4:  // OPTIONS
  ------------------
  |  Branch (144:3): [True: 0, False: 45.1k]
  ------------------
  145|  3.54k|		case "SUBS"_packed4:  // SUBSCRIBE
  ------------------
  |  Branch (145:3): [True: 0, False: 45.1k]
  ------------------
  146|  4.51k|		case "NOTI"_packed4:  // NOTIFY
  ------------------
  |  Branch (146:3): [True: 970, False: 44.1k]
  ------------------
  147|  4.51k|		case "PUBL"_packed4:  // PUBLISH
  ------------------
  |  Branch (147:3): [True: 0, False: 45.1k]
  ------------------
  148|  4.51k|		case "INFO"_packed4:  // INFO
  ------------------
  |  Branch (148:3): [True: 0, False: 45.1k]
  ------------------
  149|  4.51k|		case "REFE"_packed4:  // REFER
  ------------------
  |  Branch (149:3): [True: 0, False: 45.1k]
  ------------------
  150|  4.51k|		case "MESS"_packed4:  // MESSAGE
  ------------------
  |  Branch (150:3): [True: 0, False: 45.1k]
  ------------------
  151|  4.51k|		case "UPDA"_packed4:  // UPDATE
  ------------------
  |  Branch (151:3): [True: 0, False: 45.1k]
  ------------------
  152|  4.51k|			return SipLayer::SipParseResult::Request;
  153|       |
  154|    793|		case "SIP/"_packed4:
  ------------------
  |  Branch (154:3): [True: 793, False: 44.3k]
  ------------------
  155|    793|			return SipLayer::SipParseResult::Response;
  156|       |
  157|  39.8k|		default:
  ------------------
  |  Branch (157:3): [True: 39.8k, False: 5.30k]
  ------------------
  158|  39.8k|			return SipLayer::SipParseResult::Unknown;
  159|  45.1k|		}
  160|  45.1k|	}
_ZN4pcpp8SipLayer13parseSipLayerEPhmPNS_5LayerEPNS_6PacketEtt:
  164|  10.7k|	{
  165|  10.7k|		if (!(SipLayer::isSipPort(srcPort) || SipLayer::isSipPort(dstPort)))
  ------------------
  |  Branch (165:9): [True: 7.89k, False: 2.83k]
  |  Branch (165:41): [True: 2.83k, False: 0]
  ------------------
  166|      0|		{
  167|      0|			return nullptr;
  168|      0|		}
  169|       |
  170|  10.7k|		if (SipRequestFirstLine::parseMethod(reinterpret_cast<char*>(data), dataLen) !=
  ------------------
  |  Branch (170:7): [True: 2.85k, False: 7.87k]
  ------------------
  171|  10.7k|		    SipRequestLayer::SipMethodUnknown)
  172|  2.85k|		{
  173|  2.85k|			return new SipRequestLayer(data, dataLen, prevLayer, packet);
  174|  2.85k|		}
  175|       |
  176|  7.87k|		if (SipResponseFirstLine::parseStatusCode(reinterpret_cast<char*>(data), dataLen) !=
  ------------------
  |  Branch (176:7): [True: 7.23k, False: 641]
  |  Branch (176:7): [True: 7.20k, False: 671]
  ------------------
  177|  7.87k|		        SipResponseLayer::SipStatusCodeUnknown &&
  178|  7.23k|		    !SipResponseFirstLine::parseVersion(reinterpret_cast<char*>(data), dataLen).empty())
  ------------------
  |  Branch (178:7): [True: 7.20k, False: 30]
  ------------------
  179|  7.20k|		{
  180|  7.20k|			return new SipResponseLayer(data, dataLen, prevLayer, packet);
  181|  7.20k|		}
  182|       |
  183|    671|		return nullptr;
  184|  7.87k|	}
_ZN4pcpp8SipLayer13parseSipLayerEPhmPNS_5LayerEPNS_6PacketE:
  187|  45.2k|	{
  188|  45.2k|		SipLayer::SipParseResult sipParseResult = detectSipMessageType(data, dataLen);
  189|       |
  190|  45.2k|		if (sipParseResult == SipLayer::SipParseResult::Unknown)
  ------------------
  |  Branch (190:7): [True: 39.9k, False: 5.30k]
  ------------------
  191|  39.9k|		{
  192|  39.9k|			return nullptr;
  193|  39.9k|		}
  194|       |
  195|  5.30k|		if (sipParseResult == SipLayer::SipParseResult::Request)
  ------------------
  |  Branch (195:7): [True: 4.51k, False: 793]
  ------------------
  196|  4.51k|		{
  197|  4.51k|			if (SipRequestFirstLine::parseFirstLine(reinterpret_cast<char*>(data), dataLen).first)
  ------------------
  |  Branch (197:8): [True: 3.23k, False: 1.27k]
  ------------------
  198|  3.23k|			{
  199|  3.23k|				return new SipRequestLayer(data, dataLen, prevLayer, packet);
  200|  3.23k|			}
  201|  1.27k|			return nullptr;
  202|  4.51k|		}
  203|       |
  204|    793|		if (SipResponseFirstLine::parseFirstLine(reinterpret_cast<char*>(data), dataLen).first)
  ------------------
  |  Branch (204:7): [True: 783, False: 10]
  ------------------
  205|    783|		{
  206|    783|			return new SipResponseLayer(data, dataLen, prevLayer, packet);
  207|    783|		}
  208|     10|		return nullptr;
  209|    793|	}
_ZN4pcpp19SipRequestFirstLineC2EPNS_15SipRequestLayerE:
  213|  6.08k|	SipRequestFirstLine::SipRequestFirstLine(SipRequestLayer* sipRequest) : m_SipRequest(sipRequest)
  214|  6.08k|	{
  215|  6.08k|		m_Method = parseMethod(reinterpret_cast<char*>(m_SipRequest->m_Data), m_SipRequest->getDataLen());
  216|  6.08k|		if (m_Method == SipRequestLayer::SipMethodUnknown)
  ------------------
  |  Branch (216:7): [True: 0, False: 6.08k]
  ------------------
  217|      0|		{
  218|      0|			m_UriOffset = -1;
  219|      0|			PCPP_LOG_DEBUG("Couldn't resolve SIP request method");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  220|      0|		}
  221|  6.08k|		else
  222|  6.08k|			m_UriOffset = SipMethodEnumToString[m_Method].length() + 1;
  223|       |
  224|  6.08k|		parseVersion();
  225|       |
  226|  6.08k|		char* endOfFirstLine;
  227|  6.08k|		if ((endOfFirstLine =
  ------------------
  |  Branch (227:7): [True: 6.02k, False: 64]
  ------------------
  228|  6.08k|		         static_cast<char*>(memchr(reinterpret_cast<char*>(m_SipRequest->m_Data + m_VersionOffset), '\n',
  229|  6.08k|		                                   m_SipRequest->m_DataLen - static_cast<size_t>(m_VersionOffset)))) != nullptr)
  230|  6.02k|		{
  231|  6.02k|			m_FirstLineEndOffset = endOfFirstLine - reinterpret_cast<char*>(m_SipRequest->m_Data) + 1;
  232|  6.02k|			m_IsComplete = true;
  233|  6.02k|		}
  234|     64|		else
  235|     64|		{
  236|     64|			m_FirstLineEndOffset = m_SipRequest->getDataLen();
  237|     64|			m_IsComplete = false;
  238|     64|		}
  239|       |
  240|  6.08k|		if (Logger::getInstance().isDebugEnabled(PacketLogModuleSipLayer))
  ------------------
  |  Branch (240:7): [True: 0, False: 6.08k]
  ------------------
  241|      0|		{
  242|      0|			std::string method =
  243|      0|			    (m_Method == SipRequestLayer::SipMethodUnknown ? "Unknown" : SipMethodEnumToString[m_Method]);
  ------------------
  |  Branch (243:9): [True: 0, False: 0]
  ------------------
  244|      0|			PCPP_LOG_DEBUG("Method='" << method << "'; SIP version='" << m_Version << "'; URI='" << getUri() << "'");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  245|      0|		}
  246|  6.08k|	}
_ZN4pcpp19SipRequestFirstLine11parseMethodEPKcm:
  292|  19.8k|	{
  293|  19.8k|		if (!data || dataLen < 4)
  ------------------
  |  Branch (293:7): [True: 0, False: 19.8k]
  |  Branch (293:16): [True: 5, False: 19.8k]
  ------------------
  294|      5|		{
  295|      5|			return SipRequestLayer::SipMethodUnknown;
  296|      5|		}
  297|       |
  298|  19.8k|		size_t spaceIndex = 0;
  299|   329k|		while (spaceIndex < dataLen && data[spaceIndex] != ' ')
  ------------------
  |  Branch (299:10): [True: 328k, False: 375]
  |  Branch (299:34): [True: 309k, False: 19.4k]
  ------------------
  300|   309k|		{
  301|   309k|			spaceIndex++;
  302|   309k|		}
  303|       |
  304|  19.8k|		if (spaceIndex == 0 || spaceIndex == dataLen)
  ------------------
  |  Branch (304:7): [True: 90, False: 19.7k]
  |  Branch (304:26): [True: 375, False: 19.3k]
  ------------------
  305|    465|		{
  306|    465|			return SipRequestLayer::SipMethodUnknown;
  307|    465|		}
  308|       |
  309|  19.3k|		auto methodAdEnum = SipMethodStringToEnum.find(std::string(data, data + spaceIndex));
  310|  19.3k|		if (methodAdEnum == SipMethodStringToEnum.end())
  ------------------
  |  Branch (310:7): [True: 10.4k, False: 8.93k]
  ------------------
  311|  10.4k|		{
  312|  10.4k|			return SipRequestLayer::SipMethodUnknown;
  313|  10.4k|		}
  314|  8.93k|		return methodAdEnum->second;
  315|  19.3k|	}
_ZN4pcpp19SipRequestFirstLine14parseFirstLineEPKcm:
  319|  4.51k|	{
  320|  4.51k|		SipFirstLineData result = { "", "", "" };
  321|       |
  322|  4.51k|		if (data == nullptr || dataLen == 0)
  ------------------
  |  Branch (322:7): [True: 0, False: 4.51k]
  |  Branch (322:26): [True: 0, False: 4.51k]
  ------------------
  323|      0|		{
  324|      0|			PCPP_LOG_DEBUG("Empty data in SIP request line");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  325|      0|			return { false, result };
  326|      0|		}
  327|       |
  328|       |		// Find first space (end of METHOD)
  329|  4.51k|		size_t firstSpaceIndex = 0;
  330|  27.3k|		while (firstSpaceIndex < dataLen && data[firstSpaceIndex] != ' ')
  ------------------
  |  Branch (330:10): [True: 27.3k, False: 0]
  |  Branch (330:39): [True: 22.8k, False: 4.51k]
  ------------------
  331|  22.8k|		{
  332|  22.8k|			firstSpaceIndex++;
  333|  22.8k|		}
  334|       |
  335|  4.51k|		if (firstSpaceIndex == 0 || firstSpaceIndex == dataLen)
  ------------------
  |  Branch (335:7): [True: 0, False: 4.51k]
  |  Branch (335:31): [True: 0, False: 4.51k]
  ------------------
  336|      0|		{
  337|      0|			PCPP_LOG_DEBUG("Invalid METHOD in SIP request line");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  338|      0|			return { false, result };
  339|      0|		}
  340|       |
  341|       |		// Validate method exists in SipMethodStringToEnum
  342|  4.51k|		std::string methodStr{ data, firstSpaceIndex };
  343|  4.51k|		if (SipMethodStringToEnum.find(methodStr) == SipMethodStringToEnum.end())
  ------------------
  |  Branch (343:7): [True: 0, False: 4.51k]
  ------------------
  344|      0|		{
  345|      0|			PCPP_LOG_DEBUG("Unknown SIP method");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  346|      0|			return { false, result };
  347|      0|		}
  348|       |
  349|       |		// Find second space (end of URI)
  350|  4.51k|		size_t secondSpaceIndex = firstSpaceIndex + 1;
  351|   356k|		while (secondSpaceIndex < dataLen && data[secondSpaceIndex] != ' ')
  ------------------
  |  Branch (351:10): [True: 356k, False: 8]
  |  Branch (351:40): [True: 352k, False: 4.50k]
  ------------------
  352|   352k|			secondSpaceIndex++;
  353|       |
  354|  4.51k|		if (secondSpaceIndex == dataLen)
  ------------------
  |  Branch (354:7): [True: 8, False: 4.50k]
  ------------------
  355|      8|		{
  356|      8|			PCPP_LOG_DEBUG("No space before version");
  ------------------
  |  |  427|      8|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      8|	do                                                                                                                 \
  |  |  |  |  415|      8|	{                                                                                                                  \
  |  |  |  |  416|      8|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      8|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      8|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 8]
  |  |  |  |  ------------------
  |  |  |  |  418|      8|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      8|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 8]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  357|      8|			return { false, result };
  358|      8|		}
  359|       |
  360|  4.50k|		size_t uriLen = secondSpaceIndex - firstSpaceIndex - 1;
  361|  4.50k|		if (uriLen == 0)
  ------------------
  |  Branch (361:7): [True: 0, False: 4.50k]
  ------------------
  362|      0|		{
  363|      0|			PCPP_LOG_DEBUG("Empty URI");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  364|      0|			return { false, result };
  365|      0|		}
  366|       |
  367|       |		// Find end of line
  368|  4.50k|		size_t lineEnd = secondSpaceIndex + 1;
  369|   166k|		while (lineEnd < dataLen && data[lineEnd] != '\r' && data[lineEnd] != '\n')
  ------------------
  |  Branch (369:10): [True: 166k, False: 263]
  |  Branch (369:31): [True: 163k, False: 3.05k]
  |  Branch (369:56): [True: 162k, False: 1.18k]
  ------------------
  370|   162k|			lineEnd++;
  371|       |
  372|       |		// Minimum length for "SIP/x.y"
  373|  4.50k|		size_t versionLen = lineEnd - secondSpaceIndex - 1;
  374|  4.50k|		if (versionLen < 7)
  ------------------
  |  Branch (374:7): [True: 259, False: 4.24k]
  ------------------
  375|    259|		{
  376|    259|			PCPP_LOG_DEBUG("Version too short");
  ------------------
  |  |  427|    259|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|    259|	do                                                                                                                 \
  |  |  |  |  415|    259|	{                                                                                                                  \
  |  |  |  |  416|    259|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    259|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    259|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 259]
  |  |  |  |  ------------------
  |  |  |  |  418|    259|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|    259|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 259]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  377|    259|			return { false, result };
  378|    259|		}
  379|       |
  380|  4.24k|		const char* versionStart = data + secondSpaceIndex + 1;
  381|  4.24k|		if (versionStart[0] != 'S' || versionStart[1] != 'I' || versionStart[2] != 'P' || versionStart[3] != '/')
  ------------------
  |  Branch (381:7): [True: 979, False: 3.26k]
  |  Branch (381:33): [True: 0, False: 3.26k]
  |  Branch (381:59): [True: 30, False: 3.23k]
  |  Branch (381:85): [True: 0, False: 3.23k]
  ------------------
  382|  1.00k|		{
  383|  1.00k|			PCPP_LOG_DEBUG("Invalid SIP version format");
  ------------------
  |  |  427|  1.00k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  1.00k|	do                                                                                                                 \
  |  |  |  |  415|  1.00k|	{                                                                                                                  \
  |  |  |  |  416|  1.00k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  1.00k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.00k|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 1.00k]
  |  |  |  |  ------------------
  |  |  |  |  418|  1.00k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  1.00k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 1.00k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  384|  1.00k|			return { false, result };
  385|  1.00k|		}
  386|       |
  387|       |		// All validations passed
  388|  3.23k|		result.method = std::move(methodStr);
  389|  3.23k|		result.uri = std::string{ data + firstSpaceIndex + 1, uriLen };
  390|  3.23k|		result.version = std::string{ versionStart, versionLen };
  391|       |
  392|  3.23k|		return { true, result };
  393|  4.24k|	}
_ZN4pcpp19SipRequestFirstLine12parseVersionEv:
  396|  6.08k|	{
  397|  6.08k|		if (m_SipRequest->getDataLen() < static_cast<size_t>(m_UriOffset))
  ------------------
  |  Branch (397:7): [True: 0, False: 6.08k]
  ------------------
  398|      0|		{
  399|      0|			m_Version = "";
  400|      0|			m_VersionOffset = -1;
  401|      0|			return;
  402|      0|		}
  403|       |
  404|  6.08k|		char* data = reinterpret_cast<char*>(m_SipRequest->m_Data + m_UriOffset);
  405|  6.08k|		char* verPos = cross_platform_memmem(data, m_SipRequest->getDataLen() - m_UriOffset, " SIP/", 5);
  406|  6.08k|		if (verPos == nullptr)
  ------------------
  |  Branch (406:7): [True: 2.48k, False: 3.59k]
  ------------------
  407|  2.48k|		{
  408|  2.48k|			m_Version = "";
  409|  2.48k|			m_VersionOffset = -1;
  410|  2.48k|			return;
  411|  2.48k|		}
  412|       |
  413|       |		// verify packet doesn't end before the version, meaning still left place for " SIP/x.y" (7 chars)
  414|  3.59k|		if (static_cast<uint16_t>(verPos + 7 - reinterpret_cast<char*>(m_SipRequest->m_Data)) >
  ------------------
  |  Branch (414:7): [True: 5, False: 3.59k]
  ------------------
  415|  3.59k|		    m_SipRequest->getDataLen())
  416|      5|		{
  417|      5|			m_Version = "";
  418|      5|			m_VersionOffset = -1;
  419|      5|			return;
  420|      5|		}
  421|       |
  422|       |		// skip the space char
  423|  3.59k|		verPos++;
  424|       |
  425|  3.59k|		int endOfVerPos = 0;
  426|   159k|		while (((verPos + endOfVerPos) < reinterpret_cast<char*>(m_SipRequest->m_Data + m_SipRequest->m_DataLen)) &&
  ------------------
  |  Branch (426:10): [True: 159k, False: 0]
  ------------------
  427|   159k|		       ((verPos + endOfVerPos)[0] != '\r') && ((verPos + endOfVerPos)[0] != '\n'))
  ------------------
  |  Branch (427:10): [True: 157k, False: 2.40k]
  |  Branch (427:49): [True: 156k, False: 1.18k]
  ------------------
  428|   156k|			endOfVerPos++;
  429|       |
  430|  3.59k|		m_Version = std::string(verPos, endOfVerPos);
  431|       |
  432|  3.59k|		m_VersionOffset = verPos - reinterpret_cast<char*>(m_SipRequest->m_Data);
  433|  3.59k|	}
_ZN4pcpp15SipRequestLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  535|  6.08k|	    : SipLayer(data, dataLen, prevLayer, packet, SIPRequest)
  536|  6.08k|	{
  537|  6.08k|		m_FirstLine = new SipRequestFirstLine(this);
  538|  6.08k|		setFieldsOffset(m_FirstLine->getSize());
  539|  6.08k|		parseFields();
  540|  6.08k|	}
_ZN4pcpp15SipRequestLayerD2Ev:
  572|  6.08k|	{
  573|  6.08k|		delete m_FirstLine;
  574|  6.08k|	}
_ZNK4pcpp15SipRequestLayer8toStringEv:
  577|  1.75k|	{
  578|  1.75k|		static const int maxLengthToPrint = 120;
  579|  1.75k|		std::string result = "SIP request, ";
  580|  1.75k|		int size = m_FirstLine->getSize() - 2;  // the -2 is to remove \r\n at the end of the first line
  581|  1.75k|		if (size <= 0)
  ------------------
  |  Branch (581:7): [True: 0, False: 1.75k]
  ------------------
  582|      0|		{
  583|      0|			result += std::string("CORRUPT DATA");
  584|      0|			return result;
  585|      0|		}
  586|  1.75k|		if (size <= maxLengthToPrint)
  ------------------
  |  Branch (586:7): [True: 1.70k, False: 44]
  ------------------
  587|  1.70k|		{
  588|  1.70k|			char* firstLine = new char[size + 1];
  589|  1.70k|			strncpy(firstLine, reinterpret_cast<char*>(m_Data), size);
  590|  1.70k|			firstLine[size] = 0;
  591|  1.70k|			result += std::string(firstLine);
  592|  1.70k|			delete[] firstLine;
  593|  1.70k|		}
  594|     44|		else
  595|     44|		{
  596|     44|			char firstLine[maxLengthToPrint + 1];
  597|     44|			strncpy(firstLine, reinterpret_cast<char*>(m_Data), maxLengthToPrint - 3);
  598|     44|			firstLine[maxLengthToPrint - 3] = '.';
  599|     44|			firstLine[maxLengthToPrint - 2] = '.';
  600|     44|			firstLine[maxLengthToPrint - 1] = '.';
  601|     44|			firstLine[maxLengthToPrint] = 0;
  602|     44|			result += std::string(firstLine);
  603|     44|		}
  604|       |
  605|  1.75k|		return result;
  606|  1.75k|	}
_ZN4pcpp16SipResponseLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  881|  10.7k|	    : SipLayer(data, dataLen, prevLayer, packet, SIPResponse)
  882|  10.7k|	{
  883|  10.7k|		m_FirstLine = new SipResponseFirstLine(this);
  884|  10.7k|		setFieldsOffset(m_FirstLine->getSize());
  885|  10.7k|		parseFields();
  886|  10.7k|	}
_ZN4pcpp16SipResponseLayerD2Ev:
  897|  10.7k|	{
  898|  10.7k|		delete m_FirstLine;
  899|  10.7k|	}
_ZNK4pcpp16SipResponseLayer8toStringEv:
  924|  3.41k|	{
  925|  3.41k|		static const int maxLengthToPrint = 120;
  926|  3.41k|		std::string result = "SIP response, ";
  927|  3.41k|		int size = m_FirstLine->getSize() - 2;  // the -2 is to remove \r\n at the end of the first line
  928|  3.41k|		if (size <= 0)
  ------------------
  |  Branch (928:7): [True: 4, False: 3.40k]
  ------------------
  929|      4|		{
  930|      4|			result += std::string("CORRUPT DATA");
  931|      4|			return result;
  932|      4|		}
  933|  3.40k|		if (size <= maxLengthToPrint)
  ------------------
  |  Branch (933:7): [True: 3.24k, False: 160]
  ------------------
  934|  3.24k|		{
  935|  3.24k|			char* firstLine = new char[size + 1];
  936|  3.24k|			strncpy(firstLine, reinterpret_cast<char*>(m_Data), size);
  937|  3.24k|			firstLine[size] = 0;
  938|  3.24k|			result += std::string(firstLine);
  939|  3.24k|			delete[] firstLine;
  940|  3.24k|		}
  941|    160|		else
  942|    160|		{
  943|    160|			char firstLine[maxLengthToPrint + 1];
  944|    160|			strncpy(firstLine, reinterpret_cast<char*>(m_Data), maxLengthToPrint - 3);
  945|    160|			firstLine[maxLengthToPrint - 3] = '.';
  946|    160|			firstLine[maxLengthToPrint - 2] = '.';
  947|    160|			firstLine[maxLengthToPrint - 1] = '.';
  948|    160|			firstLine[maxLengthToPrint] = 0;
  949|    160|			result += std::string(firstLine);
  950|    160|		}
  951|       |
  952|  3.40k|		return result;
  953|  3.41k|	}
_ZN4pcpp20SipResponseFirstLine15parseStatusCodeEPKcm:
 1051|  18.9k|	{
 1052|       |		// minimum data should be 12B long: "SIP/x.y XXX "
 1053|  18.9k|		if (!data || dataLen < 12)
  ------------------
  |  Branch (1053:7): [True: 0, False: 18.9k]
  |  Branch (1053:16): [True: 290, False: 18.6k]
  ------------------
 1054|    290|		{
 1055|    290|			return SipResponseLayer::SipStatusCodeUnknown;
 1056|    290|		}
 1057|       |
 1058|  18.6k|		const char* statusCodeData = data + 8;
 1059|  18.6k|		if (statusCodeData[3] != ' ')
  ------------------
  |  Branch (1059:7): [True: 575, False: 18.0k]
  ------------------
 1060|    575|		{
 1061|    575|			return SipResponseLayer::SipStatusCodeUnknown;
 1062|    575|		}
 1063|       |
 1064|  18.0k|		return parseStatusCodePure(statusCodeData, 3);
 1065|  18.6k|	}
_ZN4pcpp20SipResponseFirstLineC2EPNS_16SipResponseLayerE:
 1067|  10.7k|	SipResponseFirstLine::SipResponseFirstLine(SipResponseLayer* sipResponse) : m_SipResponse(sipResponse)
 1068|  10.7k|	{
 1069|  10.7k|		m_Version = parseVersion(reinterpret_cast<char*>(m_SipResponse->m_Data), m_SipResponse->getDataLen());
 1070|  10.7k|		if (m_Version == "")
  ------------------
  |  Branch (1070:7): [True: 2.72k, False: 7.98k]
  ------------------
 1071|  2.72k|		{
 1072|  2.72k|			m_StatusCode = SipResponseLayer::SipStatusCodeUnknown;
 1073|  2.72k|		}
 1074|  7.98k|		else
 1075|  7.98k|		{
 1076|  7.98k|			m_StatusCode = parseStatusCode(reinterpret_cast<char*>(m_SipResponse->m_Data), m_SipResponse->getDataLen());
 1077|  7.98k|		}
 1078|       |
 1079|  10.7k|		char* endOfFirstLine;
 1080|  10.7k|		if ((endOfFirstLine = static_cast<char*>(
  ------------------
  |  Branch (1080:7): [True: 8.54k, False: 2.16k]
  ------------------
 1081|  10.7k|		         memchr(reinterpret_cast<char*>(m_SipResponse->m_Data), '\n', m_SipResponse->m_DataLen))) != nullptr)
 1082|  8.54k|		{
 1083|  8.54k|			m_FirstLineEndOffset = endOfFirstLine - reinterpret_cast<char*>(m_SipResponse->m_Data) + 1;
 1084|  8.54k|			m_IsComplete = true;
 1085|  8.54k|		}
 1086|  2.16k|		else
 1087|  2.16k|		{
 1088|  2.16k|			m_FirstLineEndOffset = m_SipResponse->getDataLen();
 1089|  2.16k|			m_IsComplete = false;
 1090|  2.16k|		}
 1091|       |
 1092|  10.7k|		if (Logger::getInstance().isDebugEnabled(PacketLogModuleSipLayer))
  ------------------
  |  Branch (1092:7): [True: 0, False: 10.7k]
  ------------------
 1093|      0|		{
 1094|      0|			int statusCode =
 1095|      0|			    (m_StatusCode == SipResponseLayer::SipStatusCodeUnknown ? 0 : StatusCodeEnumToInt[m_StatusCode]);
  ------------------
  |  Branch (1095:9): [True: 0, False: 0]
  ------------------
 1096|      0|			PCPP_LOG_DEBUG("Version='" << m_Version << "'; Status code=" << statusCode << " '" << getStatusCodeString()
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1097|      0|			                           << "'");
 1098|      0|		}
 1099|  10.7k|	}
_ZN4pcpp20SipResponseFirstLine12parseVersionEPKcm:
 1139|  17.9k|	{
 1140|  17.9k|		if (!data || dataLen < 8)  // "SIP/x.y "
  ------------------
  |  Branch (1140:7): [True: 0, False: 17.9k]
  |  Branch (1140:16): [True: 0, False: 17.9k]
  ------------------
 1141|      0|		{
 1142|      0|			PCPP_LOG_DEBUG("SIP response length < 8, cannot identify version");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1143|      0|			return "";
 1144|      0|		}
 1145|       |
 1146|  17.9k|		if (data[0] != 'S' || data[1] != 'I' || data[2] != 'P' || data[3] != '/')
  ------------------
  |  Branch (1146:7): [True: 2.73k, False: 15.2k]
  |  Branch (1146:25): [True: 20, False: 15.1k]
  |  Branch (1146:43): [True: 0, False: 15.1k]
  |  Branch (1146:61): [True: 5, False: 15.1k]
  ------------------
 1147|  2.75k|		{
 1148|  2.75k|			PCPP_LOG_DEBUG("SIP response does not begin with 'SIP/'");
  ------------------
  |  |  427|  2.75k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  2.75k|	do                                                                                                                 \
  |  |  |  |  415|  2.75k|	{                                                                                                                  \
  |  |  |  |  416|  2.75k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  2.75k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  2.75k|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 2.75k]
  |  |  |  |  ------------------
  |  |  |  |  418|  2.75k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  2.75k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 2.75k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1149|  2.75k|			return "";
 1150|  2.75k|		}
 1151|       |
 1152|  15.1k|		const char* nextSpace = static_cast<const char*>(memchr(data, ' ', dataLen));
 1153|  15.1k|		if (nextSpace == nullptr)
  ------------------
  |  Branch (1153:7): [True: 0, False: 15.1k]
  ------------------
 1154|      0|			return "";
 1155|       |
 1156|  15.1k|		return std::string(data, nextSpace - data);
 1157|  15.1k|	}
_ZN4pcpp20SipResponseFirstLine14parseFirstLineEPKcm:
 1161|    793|	{
 1162|    793|		std::pair<bool, FirstLineData> result{};  // initialize to false and empty strings
 1163|       |
 1164|       |		// Minimum data should be 12 bytes long: "SIP/x.y XXX "
 1165|    793|		if (data == nullptr || dataLen < 12)
  ------------------
  |  Branch (1165:7): [True: 0, False: 793]
  |  Branch (1165:26): [True: 0, False: 793]
  ------------------
 1166|      0|		{
 1167|      0|			PCPP_LOG_DEBUG("SIP response length < 12, cannot parse first line");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1168|      0|			return result;
 1169|      0|		}
 1170|       |
 1171|    793|		if (pack4(data, 4) != "SIP/"_packed4)
  ------------------
  |  Branch (1171:7): [True: 0, False: 793]
  ------------------
 1172|      0|		{
 1173|      0|			PCPP_LOG_DEBUG("SIP response does not begin with 'SIP/'");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1174|      0|			return result;
 1175|      0|		}
 1176|       |
 1177|    793|		const auto dataEndIt = data + dataLen;
 1178|       |		// Find first space (end of version)
 1179|    793|		auto firstSpaceIt = std::find(data + 4, dataEndIt, ' ');
 1180|    793|		if (firstSpaceIt == dataEndIt)
  ------------------
  |  Branch (1180:7): [True: 0, False: 793]
  ------------------
 1181|      0|		{
 1182|      0|			PCPP_LOG_DEBUG("No space after version in SIP response line");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1183|      0|			return result;
 1184|      0|		}
 1185|       |
 1186|       |		// Status code is strictly 3 characters followed by a space
 1187|    793|		auto statusCodeIt = firstSpaceIt + 1;
 1188|    793|		auto statusCodeEndIt = statusCodeIt + 3;
 1189|    793|		if (*statusCodeEndIt != ' ')
  ------------------
  |  Branch (1189:7): [True: 0, False: 793]
  ------------------
 1190|      0|		{
 1191|      0|			PCPP_LOG_DEBUG("No space after status code in SIP response line");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1192|      0|			return result;
 1193|      0|		}
 1194|       |
 1195|    793|		auto statusCode = parseStatusCodePure(statusCodeIt, 3);
 1196|    793|		if (statusCode == SipResponseLayer::SipStatusCodeUnknown)
  ------------------
  |  Branch (1196:7): [True: 10, False: 783]
  ------------------
 1197|     10|		{
 1198|     10|			PCPP_LOG_DEBUG("Unknown SIP status code");
  ------------------
  |  |  427|     10|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|     10|	do                                                                                                                 \
  |  |  |  |  415|     10|	{                                                                                                                  \
  |  |  |  |  416|     10|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|     10|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|     10|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 10]
  |  |  |  |  ------------------
  |  |  |  |  418|     10|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleSipLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|     10|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 10]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1199|     10|			return result;
 1200|     10|		}
 1201|       |
 1202|       |		// Write parsed values to result
 1203|    783|		result.first = true;
 1204|    783|		result.second.version = std::string(data, firstSpaceIt);
 1205|    783|		result.second.statusCode = statusCode;
 1206|    783|		return result;
 1207|    793|	}
SipLayer.cpp:_ZN4pcpp12_GLOBAL__N_15pack4EPKcm:
   20|  46.6k|		{
   21|  46.6k|			return ((len > 0 ? static_cast<uint32_t>(data[0]) << 24 : 0) |
  ------------------
  |  Branch (21:13): [True: 46.6k, False: 0]
  ------------------
   22|  46.6k|			        (len > 1 ? static_cast<uint32_t>(data[1]) << 16 : 0) |
  ------------------
  |  Branch (22:13): [True: 46.6k, False: 0]
  ------------------
   23|  46.6k|			        (len > 2 ? static_cast<uint32_t>(data[2]) << 8 : 0) |
  ------------------
  |  Branch (23:13): [True: 46.6k, False: 0]
  ------------------
   24|  46.6k|			        (len > 3 ? static_cast<uint32_t>(data[3]) : 0));
  ------------------
  |  Branch (24:13): [True: 46.6k, False: 0]
  ------------------
   25|  46.6k|		}
SipLayer.cpp:_ZN4pcpp12_GLOBAL__N_119parseStatusCodePureEPKcm:
  701|  18.8k|		{
  702|  18.8k|			if (data == nullptr || dataLen < 3)
  ------------------
  |  Branch (702:8): [True: 0, False: 18.8k]
  |  Branch (702:27): [True: 0, False: 18.8k]
  ------------------
  703|      0|			{
  704|      0|				return SipResponseLayer::SipStatusCodeUnknown;
  705|      0|			}
  706|       |
  707|  18.8k|			uint16_t code = 0;
  708|  18.8k|			code += (static_cast<uint16_t>(data[0]) - '0') * 100;
  709|  18.8k|			code += (static_cast<uint16_t>(data[1]) - '0') * 10;
  710|  18.8k|			code += (static_cast<uint16_t>(data[2]) - '0');
  711|       |
  712|  18.8k|			switch (code)
  713|  18.8k|			{
  714|       |			// 1xx: Informational
  715|    344|			case 100:
  ------------------
  |  Branch (715:4): [True: 344, False: 18.4k]
  ------------------
  716|    344|				return SipResponseLayer::SipResponseStatusCode::Sip100Trying;
  717|  2.73k|			case 180:
  ------------------
  |  Branch (717:4): [True: 2.73k, False: 16.1k]
  ------------------
  718|  2.73k|				return SipResponseLayer::SipResponseStatusCode::Sip180Ringing;
  719|     20|			case 181:
  ------------------
  |  Branch (719:4): [True: 20, False: 18.8k]
  ------------------
  720|     20|				return SipResponseLayer::SipResponseStatusCode::Sip181CallisBeingForwarded;
  721|      0|			case 182:
  ------------------
  |  Branch (721:4): [True: 0, False: 18.8k]
  ------------------
  722|      0|				return SipResponseLayer::SipResponseStatusCode::Sip182Queued;
  723|      0|			case 183:
  ------------------
  |  Branch (723:4): [True: 0, False: 18.8k]
  ------------------
  724|      0|				return SipResponseLayer::SipResponseStatusCode::Sip183SessioninProgress;
  725|    135|			case 199:
  ------------------
  |  Branch (725:4): [True: 135, False: 18.7k]
  ------------------
  726|    135|				return SipResponseLayer::SipResponseStatusCode::Sip199EarlyDialogTerminated;
  727|       |			// 2xx: Success
  728|  14.6k|			case 200:
  ------------------
  |  Branch (728:4): [True: 14.6k, False: 4.19k]
  ------------------
  729|  14.6k|				return SipResponseLayer::SipResponseStatusCode::Sip200OK;
  730|      0|			case 202:
  ------------------
  |  Branch (730:4): [True: 0, False: 18.8k]
  ------------------
  731|      0|				return SipResponseLayer::SipResponseStatusCode::Sip202Accepted;
  732|      0|			case 204:
  ------------------
  |  Branch (732:4): [True: 0, False: 18.8k]
  ------------------
  733|      0|				return SipResponseLayer::SipResponseStatusCode::Sip204NoNotification;
  734|       |			// 3xx: Redirection
  735|    192|			case 300:
  ------------------
  |  Branch (735:4): [True: 192, False: 18.6k]
  ------------------
  736|    192|				return SipResponseLayer::SipResponseStatusCode::Sip300MultipleChoices;
  737|      0|			case 301:
  ------------------
  |  Branch (737:4): [True: 0, False: 18.8k]
  ------------------
  738|      0|				return SipResponseLayer::SipResponseStatusCode::Sip301MovedPermanently;
  739|      0|			case 302:
  ------------------
  |  Branch (739:4): [True: 0, False: 18.8k]
  ------------------
  740|      0|				return SipResponseLayer::SipResponseStatusCode::Sip302MovedTemporarily;
  741|      0|			case 305:
  ------------------
  |  Branch (741:4): [True: 0, False: 18.8k]
  ------------------
  742|      0|				return SipResponseLayer::SipResponseStatusCode::Sip305UseProxy;
  743|     15|			case 380:
  ------------------
  |  Branch (743:4): [True: 15, False: 18.8k]
  ------------------
  744|     15|				return SipResponseLayer::SipResponseStatusCode::Sip380AlternativeService;
  745|       |			// 4xx: Client Failure
  746|      0|			case 400:
  ------------------
  |  Branch (746:4): [True: 0, False: 18.8k]
  ------------------
  747|      0|				return SipResponseLayer::SipResponseStatusCode::Sip400BadRequest;
  748|     84|			case 401:
  ------------------
  |  Branch (748:4): [True: 84, False: 18.7k]
  ------------------
  749|     84|				return SipResponseLayer::SipResponseStatusCode::Sip401Unauthorized;
  750|     10|			case 402:
  ------------------
  |  Branch (750:4): [True: 10, False: 18.8k]
  ------------------
  751|     10|				return SipResponseLayer::SipResponseStatusCode::Sip402PaymentRequired;
  752|     10|			case 403:
  ------------------
  |  Branch (752:4): [True: 10, False: 18.8k]
  ------------------
  753|     10|				return SipResponseLayer::SipResponseStatusCode::Sip403Forbidden;
  754|      0|			case 404:
  ------------------
  |  Branch (754:4): [True: 0, False: 18.8k]
  ------------------
  755|      0|				return SipResponseLayer::SipResponseStatusCode::Sip404NotFound;
  756|      0|			case 405:
  ------------------
  |  Branch (756:4): [True: 0, False: 18.8k]
  ------------------
  757|      0|				return SipResponseLayer::SipResponseStatusCode::Sip405MethodNotAllowed;
  758|      0|			case 406:
  ------------------
  |  Branch (758:4): [True: 0, False: 18.8k]
  ------------------
  759|      0|				return SipResponseLayer::SipResponseStatusCode::Sip406NotAcceptable;
  760|      0|			case 407:
  ------------------
  |  Branch (760:4): [True: 0, False: 18.8k]
  ------------------
  761|      0|				return SipResponseLayer::SipResponseStatusCode::Sip407ProxyAuthenticationRequired;
  762|     72|			case 408:
  ------------------
  |  Branch (762:4): [True: 72, False: 18.7k]
  ------------------
  763|     72|				return SipResponseLayer::SipResponseStatusCode::Sip408RequestTimeout;
  764|    204|			case 409:
  ------------------
  |  Branch (764:4): [True: 204, False: 18.6k]
  ------------------
  765|    204|				return SipResponseLayer::SipResponseStatusCode::Sip409Conflict;
  766|      0|			case 410:
  ------------------
  |  Branch (766:4): [True: 0, False: 18.8k]
  ------------------
  767|      0|				return SipResponseLayer::SipResponseStatusCode::Sip410Gone;
  768|      0|			case 411:
  ------------------
  |  Branch (768:4): [True: 0, False: 18.8k]
  ------------------
  769|      0|				return SipResponseLayer::SipResponseStatusCode::Sip411LengthRequired;
  770|      0|			case 412:
  ------------------
  |  Branch (770:4): [True: 0, False: 18.8k]
  ------------------
  771|      0|				return SipResponseLayer::SipResponseStatusCode::Sip412ConditionalRequestFailed;
  772|      0|			case 413:
  ------------------
  |  Branch (772:4): [True: 0, False: 18.8k]
  ------------------
  773|      0|				return SipResponseLayer::SipResponseStatusCode::Sip413RequestEntityTooLarge;
  774|      0|			case 414:
  ------------------
  |  Branch (774:4): [True: 0, False: 18.8k]
  ------------------
  775|      0|				return SipResponseLayer::SipResponseStatusCode::Sip414RequestURITooLong;
  776|      0|			case 415:
  ------------------
  |  Branch (776:4): [True: 0, False: 18.8k]
  ------------------
  777|      0|				return SipResponseLayer::SipResponseStatusCode::Sip415UnsupportedMediaType;
  778|      0|			case 416:
  ------------------
  |  Branch (778:4): [True: 0, False: 18.8k]
  ------------------
  779|      0|				return SipResponseLayer::SipResponseStatusCode::Sip416UnsupportedURIScheme;
  780|      0|			case 417:
  ------------------
  |  Branch (780:4): [True: 0, False: 18.8k]
  ------------------
  781|      0|				return SipResponseLayer::SipResponseStatusCode::Sip417UnknownResourcePriority;
  782|      0|			case 420:
  ------------------
  |  Branch (782:4): [True: 0, False: 18.8k]
  ------------------
  783|      0|				return SipResponseLayer::SipResponseStatusCode::Sip420BadExtension;
  784|      0|			case 421:
  ------------------
  |  Branch (784:4): [True: 0, False: 18.8k]
  ------------------
  785|      0|				return SipResponseLayer::SipResponseStatusCode::Sip421ExtensionRequired;
  786|      0|			case 422:
  ------------------
  |  Branch (786:4): [True: 0, False: 18.8k]
  ------------------
  787|      0|				return SipResponseLayer::SipResponseStatusCode::Sip422SessionIntervalTooSmall;
  788|      0|			case 423:
  ------------------
  |  Branch (788:4): [True: 0, False: 18.8k]
  ------------------
  789|      0|				return SipResponseLayer::SipResponseStatusCode::Sip423IntervalTooBrief;
  790|      0|			case 424:
  ------------------
  |  Branch (790:4): [True: 0, False: 18.8k]
  ------------------
  791|      0|				return SipResponseLayer::SipResponseStatusCode::Sip424BadLocationInformation;
  792|      0|			case 425:
  ------------------
  |  Branch (792:4): [True: 0, False: 18.8k]
  ------------------
  793|      0|				return SipResponseLayer::SipResponseStatusCode::Sip425BadAlertMessage;
  794|      0|			case 428:
  ------------------
  |  Branch (794:4): [True: 0, False: 18.8k]
  ------------------
  795|      0|				return SipResponseLayer::SipResponseStatusCode::Sip428UseIdentityHeader;
  796|      0|			case 429:
  ------------------
  |  Branch (796:4): [True: 0, False: 18.8k]
  ------------------
  797|      0|				return SipResponseLayer::SipResponseStatusCode::Sip429ProvideReferrerIdentity;
  798|      0|			case 430:
  ------------------
  |  Branch (798:4): [True: 0, False: 18.8k]
  ------------------
  799|      0|				return SipResponseLayer::SipResponseStatusCode::Sip430FlowFailed;
  800|      0|			case 433:
  ------------------
  |  Branch (800:4): [True: 0, False: 18.8k]
  ------------------
  801|      0|				return SipResponseLayer::SipResponseStatusCode::Sip433AnonymityDisallowed;
  802|      0|			case 436:
  ------------------
  |  Branch (802:4): [True: 0, False: 18.8k]
  ------------------
  803|      0|				return SipResponseLayer::SipResponseStatusCode::Sip436BadIdentityInfo;
  804|      0|			case 437:
  ------------------
  |  Branch (804:4): [True: 0, False: 18.8k]
  ------------------
  805|      0|				return SipResponseLayer::SipResponseStatusCode::Sip437UnsupportedCertificate;
  806|      0|			case 438:
  ------------------
  |  Branch (806:4): [True: 0, False: 18.8k]
  ------------------
  807|      0|				return SipResponseLayer::SipResponseStatusCode::Sip438InvalidIdentityHeader;
  808|      0|			case 439:
  ------------------
  |  Branch (808:4): [True: 0, False: 18.8k]
  ------------------
  809|      0|				return SipResponseLayer::SipResponseStatusCode::Sip439FirstHopLacksOutboundSupport;
  810|      0|			case 440:
  ------------------
  |  Branch (810:4): [True: 0, False: 18.8k]
  ------------------
  811|      0|				return SipResponseLayer::SipResponseStatusCode::Sip440MaxBreadthExceeded;
  812|      0|			case 469:
  ------------------
  |  Branch (812:4): [True: 0, False: 18.8k]
  ------------------
  813|      0|				return SipResponseLayer::SipResponseStatusCode::Sip469BadInfoPackage;
  814|      0|			case 470:
  ------------------
  |  Branch (814:4): [True: 0, False: 18.8k]
  ------------------
  815|      0|				return SipResponseLayer::SipResponseStatusCode::Sip470ConsentNeeded;
  816|      0|			case 480:
  ------------------
  |  Branch (816:4): [True: 0, False: 18.8k]
  ------------------
  817|      0|				return SipResponseLayer::SipResponseStatusCode::Sip480TemporarilyUnavailable;
  818|      0|			case 481:
  ------------------
  |  Branch (818:4): [True: 0, False: 18.8k]
  ------------------
  819|      0|				return SipResponseLayer::SipResponseStatusCode::Sip481Call_TransactionDoesNotExist;
  820|      0|			case 482:
  ------------------
  |  Branch (820:4): [True: 0, False: 18.8k]
  ------------------
  821|      0|				return SipResponseLayer::SipResponseStatusCode::Sip482LoopDetected;
  822|      0|			case 483:
  ------------------
  |  Branch (822:4): [True: 0, False: 18.8k]
  ------------------
  823|      0|				return SipResponseLayer::SipResponseStatusCode::Sip483TooManyHops;
  824|      0|			case 484:
  ------------------
  |  Branch (824:4): [True: 0, False: 18.8k]
  ------------------
  825|      0|				return SipResponseLayer::SipResponseStatusCode::Sip484AddressIncomplete;
  826|      0|			case 485:
  ------------------
  |  Branch (826:4): [True: 0, False: 18.8k]
  ------------------
  827|      0|				return SipResponseLayer::SipResponseStatusCode::Sip485Ambiguous;
  828|      0|			case 486:
  ------------------
  |  Branch (828:4): [True: 0, False: 18.8k]
  ------------------
  829|      0|				return SipResponseLayer::SipResponseStatusCode::Sip486BusyHere;
  830|      0|			case 487:
  ------------------
  |  Branch (830:4): [True: 0, False: 18.8k]
  ------------------
  831|      0|				return SipResponseLayer::SipResponseStatusCode::Sip487RequestTerminated;
  832|      0|			case 488:
  ------------------
  |  Branch (832:4): [True: 0, False: 18.8k]
  ------------------
  833|      0|				return SipResponseLayer::SipResponseStatusCode::Sip488NotAcceptableHere;
  834|      0|			case 489:
  ------------------
  |  Branch (834:4): [True: 0, False: 18.8k]
  ------------------
  835|      0|				return SipResponseLayer::SipResponseStatusCode::Sip489BadEvent;
  836|      0|			case 491:
  ------------------
  |  Branch (836:4): [True: 0, False: 18.8k]
  ------------------
  837|      0|				return SipResponseLayer::SipResponseStatusCode::Sip491RequestPending;
  838|      0|			case 493:
  ------------------
  |  Branch (838:4): [True: 0, False: 18.8k]
  ------------------
  839|      0|				return SipResponseLayer::SipResponseStatusCode::Sip493Undecipherable;
  840|      0|			case 494:
  ------------------
  |  Branch (840:4): [True: 0, False: 18.8k]
  ------------------
  841|      0|				return SipResponseLayer::SipResponseStatusCode::Sip494SecurityAgreementRequired;
  842|       |			// 5xx: Server Failure
  843|      0|			case 500:
  ------------------
  |  Branch (843:4): [True: 0, False: 18.8k]
  ------------------
  844|      0|				return SipResponseLayer::SipResponseStatusCode::Sip500ServerInternalError;
  845|      0|			case 501:
  ------------------
  |  Branch (845:4): [True: 0, False: 18.8k]
  ------------------
  846|      0|				return SipResponseLayer::SipResponseStatusCode::Sip501NotImplemented;
  847|      0|			case 502:
  ------------------
  |  Branch (847:4): [True: 0, False: 18.8k]
  ------------------
  848|      0|				return SipResponseLayer::SipResponseStatusCode::Sip502BadGateway;
  849|      0|			case 503:
  ------------------
  |  Branch (849:4): [True: 0, False: 18.8k]
  ------------------
  850|      0|				return SipResponseLayer::SipResponseStatusCode::Sip503ServiceUnavailable;
  851|      0|			case 504:
  ------------------
  |  Branch (851:4): [True: 0, False: 18.8k]
  ------------------
  852|      0|				return SipResponseLayer::SipResponseStatusCode::Sip504ServerTimeout;
  853|      0|			case 505:
  ------------------
  |  Branch (853:4): [True: 0, False: 18.8k]
  ------------------
  854|      0|				return SipResponseLayer::SipResponseStatusCode::Sip505VersionNotSupported;
  855|      0|			case 513:
  ------------------
  |  Branch (855:4): [True: 0, False: 18.8k]
  ------------------
  856|      0|				return SipResponseLayer::SipResponseStatusCode::Sip513MessageTooLarge;
  857|      0|			case 555:
  ------------------
  |  Branch (857:4): [True: 0, False: 18.8k]
  ------------------
  858|      0|				return SipResponseLayer::SipResponseStatusCode::Sip555PushNotificationServiceNotSupported;
  859|     36|			case 580:
  ------------------
  |  Branch (859:4): [True: 36, False: 18.8k]
  ------------------
  860|     36|				return SipResponseLayer::SipResponseStatusCode::Sip580PreconditionFailure;
  861|       |			// 6xx: Global Failure
  862|      0|			case 600:
  ------------------
  |  Branch (862:4): [True: 0, False: 18.8k]
  ------------------
  863|      0|				return SipResponseLayer::SipResponseStatusCode::Sip600BusyEverywhere;
  864|      0|			case 603:
  ------------------
  |  Branch (864:4): [True: 0, False: 18.8k]
  ------------------
  865|      0|				return SipResponseLayer::SipResponseStatusCode::Sip603Decline;
  866|      0|			case 604:
  ------------------
  |  Branch (866:4): [True: 0, False: 18.8k]
  ------------------
  867|      0|				return SipResponseLayer::SipResponseStatusCode::Sip604DoesNotExistAnywhere;
  868|      0|			case 606:
  ------------------
  |  Branch (868:4): [True: 0, False: 18.8k]
  ------------------
  869|      0|				return SipResponseLayer::SipResponseStatusCode::Sip606NotAcceptable;
  870|      0|			case 607:
  ------------------
  |  Branch (870:4): [True: 0, False: 18.8k]
  ------------------
  871|      0|				return SipResponseLayer::SipResponseStatusCode::Sip607Unwanted;
  872|      0|			case 608:
  ------------------
  |  Branch (872:4): [True: 0, False: 18.8k]
  ------------------
  873|      0|				return SipResponseLayer::SipResponseStatusCode::Sip608Rejected;
  874|    335|			default:
  ------------------
  |  Branch (874:4): [True: 335, False: 18.5k]
  ------------------
  875|    335|				return SipResponseLayer::SipStatusCodeUnknown;
  876|  18.8k|			}
  877|  18.8k|		}
SipLayer.cpp:_ZN4pcpp12_GLOBAL__N_1li8_packed4EPKcm:
   28|    793|		{
   29|    793|			return pack4(str, len);
   30|    793|		}

_ZN4pcpp9Sll2Layer24getLinkLayerAsMacAddressEv:
   47|  1.92k|	{
   48|  1.92k|		const uint8_t* data = getLinkLayerAddr();
   49|  1.92k|		uint8_t dataLen = getLinkLayerAddrLen();
   50|  1.92k|		if (data == nullptr || dataLen == 0 || dataLen > 8)
  ------------------
  |  Branch (50:7): [True: 0, False: 1.92k]
  |  Branch (50:26): [True: 234, False: 1.69k]
  |  Branch (50:42): [True: 1.52k, False: 168]
  ------------------
   51|  1.75k|		{
   52|  1.75k|			return MacAddress::Zero;
   53|  1.75k|		}
   54|    168|		return MacAddress(data);
   55|  1.92k|	}
_ZN4pcpp9Sll2Layer14parseNextLayerEv:
   65|  7.20k|	{
   66|  7.20k|		if (m_DataLen <= sizeof(sll2_header))
  ------------------
  |  Branch (66:7): [True: 384, False: 6.81k]
  ------------------
   67|    384|			return;
   68|       |
   69|  6.81k|		uint8_t* payload = m_Data + sizeof(sll2_header);
   70|  6.81k|		size_t payloadLen = m_DataLen - sizeof(sll2_header);
   71|       |
   72|  6.81k|		sll2_header* hdr = getSll2Header();
   73|  6.81k|		switch (be16toh(hdr->protocol_type))
   74|  6.81k|		{
   75|    386|		case PCPP_ETHERTYPE_IP:
  ------------------
  |  |   33|    386|#define PCPP_ETHERTYPE_IP 0x0800
  ------------------
  |  Branch (75:3): [True: 386, False: 6.43k]
  ------------------
   76|    386|		{
   77|    386|			tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen);
   78|    386|			break;
   79|      0|		}
   80|      0|		case PCPP_ETHERTYPE_IPV6:
  ------------------
  |  |   49|      0|#define PCPP_ETHERTYPE_IPV6 0x86dd
  ------------------
  |  Branch (80:3): [True: 0, False: 6.81k]
  ------------------
   81|      0|		{
   82|      0|			tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen);
   83|      0|			break;
   84|      0|		}
   85|      0|		case PCPP_ETHERTYPE_ARP:
  ------------------
  |  |   35|      0|#define PCPP_ETHERTYPE_ARP 0x0806
  ------------------
  |  Branch (85:3): [True: 0, False: 6.81k]
  ------------------
   86|      0|		{
   87|      0|			tryConstructNextLayerWithFallback<ArpLayer, PayloadLayer>(payload, payloadLen);
   88|      0|			break;
   89|      0|		}
   90|      0|		case PCPP_ETHERTYPE_VLAN:
  ------------------
  |  |   45|      0|#define PCPP_ETHERTYPE_VLAN 0x8100
  ------------------
  |  Branch (90:3): [True: 0, False: 6.81k]
  ------------------
   91|  3.93k|		case PCPP_ETHERTYPE_IEEE_802_1AD:
  ------------------
  |  |   63|  3.93k|#define PCPP_ETHERTYPE_IEEE_802_1AD 0x88A8
  ------------------
  |  Branch (91:3): [True: 3.93k, False: 2.88k]
  ------------------
   92|  3.93k|		{
   93|  3.93k|			tryConstructNextLayerWithFallback<VlanLayer, PayloadLayer>(payload, payloadLen);
   94|  3.93k|			break;
   95|      0|		}
   96|    400|		case PCPP_ETHERTYPE_PPPOES:
  ------------------
  |  |   55|    400|#define PCPP_ETHERTYPE_PPPOES 0x8864
  ------------------
  |  Branch (96:3): [True: 400, False: 6.41k]
  ------------------
   97|    400|		{
   98|    400|			tryConstructNextLayerWithFallback<PPPoESessionLayer, PayloadLayer>(payload, payloadLen);
   99|    400|			break;
  100|      0|		}
  101|    326|		case PCPP_ETHERTYPE_PPPOED:
  ------------------
  |  |   53|    326|#define PCPP_ETHERTYPE_PPPOED 0x8863
  ------------------
  |  Branch (101:3): [True: 326, False: 6.49k]
  ------------------
  102|    326|		{
  103|    326|			tryConstructNextLayerWithFallback<PPPoEDiscoveryLayer, PayloadLayer>(payload, payloadLen);
  104|    326|			break;
  105|      0|		}
  106|      0|		case PCPP_ETHERTYPE_MPLS:
  ------------------
  |  |   57|      0|#define PCPP_ETHERTYPE_MPLS 0x8847
  ------------------
  |  Branch (106:3): [True: 0, False: 6.81k]
  ------------------
  107|      0|		{
  108|      0|			tryConstructNextLayerWithFallback<MplsLayer, PayloadLayer>(payload, payloadLen);
  109|      0|			break;
  110|      0|		}
  111|      0|		case Sll2ProtoTypeLLC:
  ------------------
  |  Branch (111:3): [True: 0, False: 6.81k]
  ------------------
  112|      0|		{
  113|      0|			tryConstructNextLayerWithFallback<LLCLayer, PayloadLayer>(payload, payloadLen);
  114|      0|			break;
  115|      0|		}
  116|  1.77k|		default:
  ------------------
  |  Branch (116:3): [True: 1.77k, False: 5.04k]
  ------------------
  117|  1.77k|		{
  118|  1.77k|			constructNextLayer<PayloadLayer>(payload, payloadLen);
  119|  1.77k|			break;
  120|      0|		}
  121|  6.81k|		}
  122|  6.81k|	}
_ZN4pcpp9Sll2Layer22computeCalculateFieldsEv:
  125|  1.92k|	{
  126|  1.92k|		if (m_NextLayer == nullptr)
  ------------------
  |  Branch (126:7): [True: 192, False: 1.73k]
  ------------------
  127|    192|			return;
  128|       |
  129|  1.73k|		sll2_header* hdr = getSll2Header();
  130|  1.73k|		switch (m_NextLayer->getProtocol())
  131|  1.73k|		{
  132|     32|		case IPv4:
  ------------------
  |  Branch (132:3): [True: 32, False: 1.70k]
  ------------------
  133|     32|			hdr->protocol_type = htobe16(PCPP_ETHERTYPE_IP);
  134|     32|			break;
  135|      0|		case IPv6:
  ------------------
  |  Branch (135:3): [True: 0, False: 1.73k]
  ------------------
  136|      0|			hdr->protocol_type = htobe16(PCPP_ETHERTYPE_IPV6);
  137|      0|			break;
  138|      0|		case ARP:
  ------------------
  |  Branch (138:3): [True: 0, False: 1.73k]
  ------------------
  139|      0|			hdr->protocol_type = htobe16(PCPP_ETHERTYPE_ARP);
  140|      0|			break;
  141|    826|		case VLAN:
  ------------------
  |  Branch (141:3): [True: 826, False: 907]
  ------------------
  142|    826|			hdr->protocol_type = htobe16(PCPP_ETHERTYPE_VLAN);
  143|    826|			break;
  144|      0|		case LLC:
  ------------------
  |  Branch (144:3): [True: 0, False: 1.73k]
  ------------------
  145|      0|			hdr->protocol_type = htobe16(Sll2ProtoTypeLLC);
  146|      0|			break;
  147|    875|		default:
  ------------------
  |  Branch (147:3): [True: 875, False: 858]
  ------------------
  148|    875|			return;
  149|  1.73k|		}
  150|  1.73k|	}
_ZN4pcpp9Sll2Layer11isDataValidEPKhm:
  153|  7.20k|	{
  154|  7.20k|		return data && dataLen >= sizeof(sll2_header);
  ------------------
  |  Branch (154:10): [True: 7.20k, False: 0]
  |  Branch (154:18): [True: 7.20k, False: 2]
  ------------------
  155|  7.20k|	}
_ZNK4pcpp9Sll2Layer8toStringEv:
  158|  3.85k|	{
  159|  3.85k|		return "Linux cooked header v2";
  160|  3.85k|	}
_ZNK4pcpp9Sll2Layer15getProtocolTypeEv:
  163|  1.92k|	{
  164|       |		return be16toh(getSll2Header()->protocol_type);
  165|  1.92k|	}
_ZNK4pcpp9Sll2Layer17getInterfaceIndexEv:
  173|  1.92k|	{
  174|       |		return be32toh(getSll2Header()->interface_index);
  175|  1.92k|	}
_ZNK4pcpp9Sll2Layer13getArphrdTypeEv:
  183|  1.92k|	{
  184|       |		return be16toh(getSll2Header()->ARPHRD_type);
  185|  1.92k|	}
_ZNK4pcpp9Sll2Layer13getPacketTypeEv:
  193|  1.92k|	{
  194|  1.92k|		return getSll2Header()->packet_type;
  195|  1.92k|	}
_ZNK4pcpp9Sll2Layer19getLinkLayerAddrLenEv:
  203|  1.92k|	{
  204|  1.92k|		return getSll2Header()->link_layer_addr_len;
  205|  1.92k|	}
_ZNK4pcpp9Sll2Layer16getLinkLayerAddrEv:
  208|  1.92k|	{
  209|  1.92k|		return getSll2Header()->link_layer_addr;
  210|  1.92k|	}

_ZN4pcpp8SllLayer14parseNextLayerEv:
   51|  12.5k|	{
   52|  12.5k|		if (m_DataLen <= sizeof(sll_header))
  ------------------
  |  Branch (52:7): [True: 400, False: 12.1k]
  ------------------
   53|    400|			return;
   54|       |
   55|  12.1k|		uint8_t* payload = m_Data + sizeof(sll_header);
   56|  12.1k|		size_t payloadLen = m_DataLen - sizeof(sll_header);
   57|       |
   58|  12.1k|		sll_header* hdr = getSllHeader();
   59|  12.1k|		switch (be16toh(hdr->protocol_type))
   60|  12.1k|		{
   61|  7.71k|		case PCPP_ETHERTYPE_IP:
  ------------------
  |  |   33|  7.71k|#define PCPP_ETHERTYPE_IP 0x0800
  ------------------
  |  Branch (61:3): [True: 7.71k, False: 4.46k]
  ------------------
   62|  7.71k|		{
   63|  7.71k|			tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen);
   64|  7.71k|			break;
   65|      0|		}
   66|  1.00k|		case PCPP_ETHERTYPE_IPV6:
  ------------------
  |  |   49|  1.00k|#define PCPP_ETHERTYPE_IPV6 0x86dd
  ------------------
  |  Branch (66:3): [True: 1.00k, False: 11.1k]
  ------------------
   67|  1.00k|		{
   68|  1.00k|			tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen);
   69|  1.00k|			break;
   70|      0|		}
   71|  1.77k|		case PCPP_ETHERTYPE_ARP:
  ------------------
  |  |   35|  1.77k|#define PCPP_ETHERTYPE_ARP 0x0806
  ------------------
  |  Branch (71:3): [True: 1.77k, False: 10.3k]
  ------------------
   72|  1.77k|		{
   73|  1.77k|			tryConstructNextLayerWithFallback<ArpLayer, PayloadLayer>(payload, payloadLen);
   74|  1.77k|			break;
   75|      0|		}
   76|      0|		case PCPP_ETHERTYPE_VLAN:
  ------------------
  |  |   45|      0|#define PCPP_ETHERTYPE_VLAN 0x8100
  ------------------
  |  Branch (76:3): [True: 0, False: 12.1k]
  ------------------
   77|      0|		case PCPP_ETHERTYPE_IEEE_802_1AD:
  ------------------
  |  |   63|      0|#define PCPP_ETHERTYPE_IEEE_802_1AD 0x88A8
  ------------------
  |  Branch (77:3): [True: 0, False: 12.1k]
  ------------------
   78|      0|		{
   79|      0|			tryConstructNextLayerWithFallback<VlanLayer, PayloadLayer>(payload, payloadLen);
   80|      0|			break;
   81|      0|		}
   82|      0|		case PCPP_ETHERTYPE_PPPOES:
  ------------------
  |  |   55|      0|#define PCPP_ETHERTYPE_PPPOES 0x8864
  ------------------
  |  Branch (82:3): [True: 0, False: 12.1k]
  ------------------
   83|      0|		{
   84|      0|			tryConstructNextLayerWithFallback<PPPoESessionLayer, PayloadLayer>(payload, payloadLen);
   85|      0|			break;
   86|      0|		}
   87|    296|		case PCPP_ETHERTYPE_PPPOED:
  ------------------
  |  |   53|    296|#define PCPP_ETHERTYPE_PPPOED 0x8863
  ------------------
  |  Branch (87:3): [True: 296, False: 11.8k]
  ------------------
   88|    296|		{
   89|    296|			tryConstructNextLayerWithFallback<PPPoEDiscoveryLayer, PayloadLayer>(payload, payloadLen);
   90|    296|			break;
   91|      0|		}
   92|    531|		case PCPP_ETHERTYPE_MPLS:
  ------------------
  |  |   57|    531|#define PCPP_ETHERTYPE_MPLS 0x8847
  ------------------
  |  Branch (92:3): [True: 531, False: 11.6k]
  ------------------
   93|    531|		{
   94|    531|			tryConstructNextLayerWithFallback<MplsLayer, PayloadLayer>(payload, payloadLen);
   95|    531|			break;
   96|      0|		}
   97|    852|		default:
  ------------------
  |  Branch (97:3): [True: 852, False: 11.3k]
  ------------------
   98|    852|		{
   99|    852|			constructNextLayer<PayloadLayer>(payload, payloadLen);
  100|    852|			break;
  101|      0|		}
  102|  12.1k|		}
  103|  12.1k|	}
_ZN4pcpp8SllLayer22computeCalculateFieldsEv:
  106|  3.13k|	{
  107|  3.13k|		if (m_NextLayer == nullptr)
  ------------------
  |  Branch (107:7): [True: 200, False: 2.93k]
  ------------------
  108|    200|			return;
  109|       |
  110|  2.93k|		sll_header* hdr = getSllHeader();
  111|  2.93k|		switch (m_NextLayer->getProtocol())
  112|  2.93k|		{
  113|  1.49k|		case IPv4:
  ------------------
  |  Branch (113:3): [True: 1.49k, False: 1.43k]
  ------------------
  114|  1.49k|			hdr->protocol_type = htobe16(PCPP_ETHERTYPE_IP);
  115|  1.49k|			break;
  116|    202|		case IPv6:
  ------------------
  |  Branch (116:3): [True: 202, False: 2.73k]
  ------------------
  117|    202|			hdr->protocol_type = htobe16(PCPP_ETHERTYPE_IPV6);
  118|    202|			break;
  119|    473|		case ARP:
  ------------------
  |  Branch (119:3): [True: 473, False: 2.46k]
  ------------------
  120|    473|			hdr->protocol_type = htobe16(PCPP_ETHERTYPE_ARP);
  121|    473|			break;
  122|      0|		case VLAN:
  ------------------
  |  Branch (122:3): [True: 0, False: 2.93k]
  ------------------
  123|      0|			hdr->protocol_type = htobe16(PCPP_ETHERTYPE_VLAN);
  124|      0|			break;
  125|    761|		default:
  ------------------
  |  Branch (125:3): [True: 761, False: 2.17k]
  ------------------
  126|    761|			return;
  127|  2.93k|		}
  128|  2.93k|	}
_ZNK4pcpp8SllLayer8toStringEv:
  131|  6.26k|	{
  132|  6.26k|		return "Linux cooked header";
  133|  6.26k|	}

_ZNK4pcpp16SmtpRequestLayer10getCommandEv:
   16|  4.14k|	{
   17|  4.14k|		size_t val = 0;
   18|  4.14k|		std::string field = getCommandString();
   19|       |
   20|  21.0k|		for (size_t idx = 0; idx < std::min(field.size(), static_cast<size_t>(8)); ++idx)
  ------------------
  |  Branch (20:24): [True: 16.8k, False: 4.14k]
  ------------------
   21|  16.8k|		{
   22|  16.8k|			val |= static_cast<size_t>(field.c_str()[idx]) << (idx * 8);
   23|  16.8k|		}
   24|       |
   25|  4.14k|		return static_cast<SmtpCommand>(val);
   26|  4.14k|	}
_ZNK4pcpp16SmtpRequestLayer16getCommandStringEv:
   29|  4.14k|	{
   30|  4.14k|		return getCommandInternal();
   31|  4.14k|	}
_ZN4pcpp16SmtpRequestLayer14getCommandInfoENS0_11SmtpCommandE:
   54|  4.14k|	{
   55|  4.14k|		switch (code)
   56|  4.14k|		{
   57|    392|		case SmtpCommand::DATA:
  ------------------
  |  Branch (57:3): [True: 392, False: 3.75k]
  ------------------
   58|    392|			return "Starting mail body";
   59|      4|		case SmtpCommand::EHLO:
  ------------------
  |  Branch (59:3): [True: 4, False: 4.14k]
  ------------------
   60|      4|			return "Initiate conversation";
   61|      0|		case SmtpCommand::EXPN:
  ------------------
  |  Branch (61:3): [True: 0, False: 4.14k]
  ------------------
   62|      0|			return "Expand the mailing list";
   63|    120|		case SmtpCommand::HELO:
  ------------------
  |  Branch (63:3): [True: 120, False: 4.02k]
  ------------------
   64|    120|			return "Initiate conversation";
   65|      0|		case SmtpCommand::HELP:
  ------------------
  |  Branch (65:3): [True: 0, False: 4.14k]
  ------------------
   66|      0|			return "Ask information";
   67|     50|		case SmtpCommand::MAIL:
  ------------------
  |  Branch (67:3): [True: 50, False: 4.09k]
  ------------------
   68|     50|			return "Sender indication";
   69|      0|		case SmtpCommand::NOOP:
  ------------------
  |  Branch (69:3): [True: 0, False: 4.14k]
  ------------------
   70|      0|			return "No operation";
   71|      6|		case SmtpCommand::QUIT:
  ------------------
  |  Branch (71:3): [True: 6, False: 4.13k]
  ------------------
   72|      6|			return "Close conversation";
   73|    170|		case SmtpCommand::RCPT:
  ------------------
  |  Branch (73:3): [True: 170, False: 3.97k]
  ------------------
   74|    170|			return "Receiver indication";
   75|      0|		case SmtpCommand::RSET:
  ------------------
  |  Branch (75:3): [True: 0, False: 4.14k]
  ------------------
   76|      0|			return "Abort transaction";
   77|      0|		case SmtpCommand::VRFY:
  ------------------
  |  Branch (77:3): [True: 0, False: 4.14k]
  ------------------
   78|      0|			return "Identify user";
   79|      0|		case SmtpCommand::STARTTLS:
  ------------------
  |  Branch (79:3): [True: 0, False: 4.14k]
  ------------------
   80|      0|			return "Start TLS handshake";
   81|      0|		case SmtpCommand::TURN:
  ------------------
  |  Branch (81:3): [True: 0, False: 4.14k]
  ------------------
   82|      0|			return "Reverse the role of sender and receiver";
   83|      0|		case SmtpCommand::SEND:
  ------------------
  |  Branch (83:3): [True: 0, False: 4.14k]
  ------------------
   84|      0|			return "Send mail to terminal";
   85|      0|		case SmtpCommand::SOML:
  ------------------
  |  Branch (85:3): [True: 0, False: 4.14k]
  ------------------
   86|      0|			return "Send mail to terminal or to mailbox";
   87|      0|		case SmtpCommand::SAML:
  ------------------
  |  Branch (87:3): [True: 0, False: 4.14k]
  ------------------
   88|      0|			return "Send mail to terminal and mailbox";
   89|  2.68k|		case SmtpCommand::AUTH:
  ------------------
  |  Branch (89:3): [True: 2.68k, False: 1.45k]
  ------------------
   90|  2.68k|			return "Authenticate client and server";
   91|      0|		case SmtpCommand::ATRN:
  ------------------
  |  Branch (91:3): [True: 0, False: 4.14k]
  ------------------
   92|      0|			return "Reverse the role of sender and receiver";
   93|      0|		case SmtpCommand::BDAT:
  ------------------
  |  Branch (93:3): [True: 0, False: 4.14k]
  ------------------
   94|      0|			return "Submit mail contents";
   95|      0|		case SmtpCommand::ETRN:
  ------------------
  |  Branch (95:3): [True: 0, False: 4.14k]
  ------------------
   96|      0|			return "Request to start SMTP queue processing";
   97|      0|		case SmtpCommand::XADR:
  ------------------
  |  Branch (97:3): [True: 0, False: 4.14k]
  ------------------
   98|      0|			return "Release status of the channel";
   99|      0|		case SmtpCommand::XCIR:
  ------------------
  |  Branch (99:3): [True: 0, False: 4.14k]
  ------------------
  100|      0|			return "Release status of the circuit checking facility";
  101|      0|		case SmtpCommand::XSTA:
  ------------------
  |  Branch (101:3): [True: 0, False: 4.14k]
  ------------------
  102|      0|			return "Release status of the number of messages in channel queues";
  103|      0|		case SmtpCommand::XGEN:
  ------------------
  |  Branch (103:3): [True: 0, False: 4.14k]
  ------------------
  104|      0|			return "Release status of whether a compiled configuration and character set are in use";
  105|    714|		default:
  ------------------
  |  Branch (105:3): [True: 714, False: 3.43k]
  ------------------
  106|    714|			return "Unknown command";
  107|  4.14k|		}
  108|  4.14k|	}
_ZNK4pcpp16SmtpRequestLayer8toStringEv:
  125|  4.14k|	{
  126|  4.14k|		return "SMTP request layer, command: " + getCommandInfo(getCommand());
  127|  4.14k|	}
_ZNK4pcpp17SmtpResponseLayer13getStatusCodeEv:
  148|  2.23k|	{
  149|  2.23k|		return static_cast<SmtpStatusCode>(atoi(getCommandInternal().c_str()));
  150|  2.23k|	}
_ZN4pcpp17SmtpResponseLayer21getStatusCodeAsStringENS0_14SmtpStatusCodeE:
  178|  2.23k|	{
  179|  2.23k|		switch (code)
  180|  2.23k|		{
  181|      0|		case SmtpStatusCode::SYSTEM_STATUS:
  ------------------
  |  Branch (181:3): [True: 0, False: 2.23k]
  ------------------
  182|      0|			return "System status, or system help reply";
  183|      0|		case SmtpStatusCode::HELP_MESSAGE:
  ------------------
  |  Branch (183:3): [True: 0, False: 2.23k]
  ------------------
  184|      0|			return "Help message";
  185|     88|		case SmtpStatusCode::SERVICE_READY:
  ------------------
  |  Branch (185:3): [True: 88, False: 2.14k]
  ------------------
  186|     88|			return "Service ready";
  187|      4|		case SmtpStatusCode::SERVICE_CLOSE:
  ------------------
  |  Branch (187:3): [True: 4, False: 2.22k]
  ------------------
  188|      4|			return "Service closing transmission channel";
  189|     20|		case SmtpStatusCode::AUTH_SUCCESS:
  ------------------
  |  Branch (189:3): [True: 20, False: 2.21k]
  ------------------
  190|     20|			return "Authentication successful";
  191|    184|		case SmtpStatusCode::COMPLETED:
  ------------------
  |  Branch (191:3): [True: 184, False: 2.04k]
  ------------------
  192|    184|			return "Requested mail action okay, completed";
  193|    202|		case SmtpStatusCode::WILL_FORWARD:
  ------------------
  |  Branch (193:3): [True: 202, False: 2.02k]
  ------------------
  194|    202|			return "User not local; will forward to <forward-path>";
  195|     12|		case SmtpStatusCode::CANNOT_VERIFY:
  ------------------
  |  Branch (195:3): [True: 12, False: 2.21k]
  ------------------
  196|     12|			return "Cannot VRFY user, but will accept message and attempt delivery";
  197|     78|		case SmtpStatusCode::AUTH_INPUT:
  ------------------
  |  Branch (197:3): [True: 78, False: 2.15k]
  ------------------
  198|     78|			return "AUTH input";
  199|     34|		case SmtpStatusCode::MAIL_INPUT:
  ------------------
  |  Branch (199:3): [True: 34, False: 2.19k]
  ------------------
  200|     34|			return "Start mail input; end with <CRLF>.<CRLF>";
  201|     32|		case SmtpStatusCode::SERVICE_UNAVAILABLE:
  ------------------
  |  Branch (201:3): [True: 32, False: 2.19k]
  ------------------
  202|     32|			return "Service not available, closing transmission channel";
  203|      0|		case SmtpStatusCode::PASS_NEEDED:
  ------------------
  |  Branch (203:3): [True: 0, False: 2.23k]
  ------------------
  204|      0|			return "A password transition is needed";
  205|      0|		case SmtpStatusCode::MAILBOX_UNAVAILABLE_TEMP:
  ------------------
  |  Branch (205:3): [True: 0, False: 2.23k]
  ------------------
  206|      0|			return "Requested mail action not taken: mailbox unavailable (mail busy or temporarily blocked)";
  207|      0|		case SmtpStatusCode::ABORT_LOCAL_ERROR:
  ------------------
  |  Branch (207:3): [True: 0, False: 2.23k]
  ------------------
  208|      0|			return "Requested action aborted: local error in processing";
  209|      0|		case SmtpStatusCode::INSUFFICIENT_STORAGE:
  ------------------
  |  Branch (209:3): [True: 0, False: 2.23k]
  ------------------
  210|      0|			return "Requested action not taken: insufficient system storage";
  211|      0|		case SmtpStatusCode::TEMP_AUTH_FAILED:
  ------------------
  |  Branch (211:3): [True: 0, False: 2.23k]
  ------------------
  212|      0|			return "Temporary authentication failed";
  213|      0|		case SmtpStatusCode::PARAM_NOT_ACCOMMODATED:
  ------------------
  |  Branch (213:3): [True: 0, False: 2.23k]
  ------------------
  214|      0|			return "Server unable to accommodate parameters";
  215|      8|		case SmtpStatusCode::CMD_NOT_RECOGNIZED:
  ------------------
  |  Branch (215:3): [True: 8, False: 2.22k]
  ------------------
  216|      8|			return "Syntax error, command unrecognized";
  217|      0|		case SmtpStatusCode::SYNTAX_ERROR_PARAM:
  ------------------
  |  Branch (217:3): [True: 0, False: 2.23k]
  ------------------
  218|      0|			return "Syntax error in parameters or arguments";
  219|     44|		case SmtpStatusCode::CMD_NOT_IMPLEMENTED:
  ------------------
  |  Branch (219:3): [True: 44, False: 2.18k]
  ------------------
  220|     44|			return "Command not implemented";
  221|    206|		case SmtpStatusCode::CMD_BAD_SEQUENCE:
  ------------------
  |  Branch (221:3): [True: 206, False: 2.02k]
  ------------------
  222|    206|			return "Bad sequence of commands";
  223|     56|		case SmtpStatusCode::PARAM_NOT_IMPLEMENTED:
  ------------------
  |  Branch (223:3): [True: 56, False: 2.17k]
  ------------------
  224|     56|			return "Command parameter not implemented";
  225|     54|		case SmtpStatusCode::MAIL_NOT_ACCEPTED:
  ------------------
  |  Branch (225:3): [True: 54, False: 2.17k]
  ------------------
  226|     54|			return "Server does not accept mail";
  227|     56|		case SmtpStatusCode::ENCRYPT_NEED:
  ------------------
  |  Branch (227:3): [True: 56, False: 2.17k]
  ------------------
  228|     56|			return "Encryption needed";
  229|     32|		case SmtpStatusCode::AUTH_REQUIRED:
  ------------------
  |  Branch (229:3): [True: 32, False: 2.19k]
  ------------------
  230|     32|			return "Authentication required";
  231|      0|		case SmtpStatusCode::AUTH_TOO_WEAK:
  ------------------
  |  Branch (231:3): [True: 0, False: 2.23k]
  ------------------
  232|      0|			return "Authentication mechanism is too weak";
  233|      0|		case SmtpStatusCode::AUTH_CRED_INVALID:
  ------------------
  |  Branch (233:3): [True: 0, False: 2.23k]
  ------------------
  234|      0|			return "Authentication credentials invalid";
  235|      0|		case SmtpStatusCode::ENCRYPT_REQUIRED:
  ------------------
  |  Branch (235:3): [True: 0, False: 2.23k]
  ------------------
  236|      0|			return "Encryption required for requested authentication mechanism";
  237|      0|		case SmtpStatusCode::MAILBOX_UNAVAILABLE:
  ------------------
  |  Branch (237:3): [True: 0, False: 2.23k]
  ------------------
  238|      0|			return "Requested action not taken: mailbox unavailable";
  239|    128|		case SmtpStatusCode::USER_NOT_LOCAL:
  ------------------
  |  Branch (239:3): [True: 128, False: 2.10k]
  ------------------
  240|    128|			return "User not local; please try <forward-path>";
  241|      0|		case SmtpStatusCode::EXCEED_STORAGE:
  ------------------
  |  Branch (241:3): [True: 0, False: 2.23k]
  ------------------
  242|      0|			return "Requested mail action aborted: exceeded storage allocation";
  243|      0|		case SmtpStatusCode::NAME_NOT_ALLOWED:
  ------------------
  |  Branch (243:3): [True: 0, False: 2.23k]
  ------------------
  244|      0|			return "Requested action not taken: mailbox name not allowed";
  245|      0|		case SmtpStatusCode::TRANSACTION_FAIL:
  ------------------
  |  Branch (245:3): [True: 0, False: 2.23k]
  ------------------
  246|      0|			return "Transaction failed";
  247|      0|		case SmtpStatusCode::DOMAIN_NOT_ACCEPT:
  ------------------
  |  Branch (247:3): [True: 0, False: 2.23k]
  ------------------
  248|      0|			return "Domain does not accept mail";
  249|    992|		default:
  ------------------
  |  Branch (249:3): [True: 992, False: 1.23k]
  ------------------
  250|    992|			return "Unknown status code";
  251|  2.23k|		}
  252|  2.23k|	}
_ZNK4pcpp17SmtpResponseLayer8toStringEv:
  255|  2.23k|	{
  256|  2.23k|		return "SMTP response layer, status code: " + getStatusCodeAsString(getStatusCode());
  257|  2.23k|	}

_ZN4pcpp11SomeIpLayer16parseSomeIpLayerEPhmPNS_5LayerEPNS_6PacketE:
   46|  56.5k|	{
   47|       |		// Ideas taken from wireshark some ip dissector
   48|  56.5k|		const size_t headerLen = sizeof(someiphdr);
   49|  56.5k|		if (dataLen < headerLen)
  ------------------
  |  Branch (49:7): [True: 130, False: 56.3k]
  ------------------
   50|    130|			return new PayloadLayer(data, dataLen, prevLayer, packet);
   51|       |
   52|  56.3k|		uint32_t lengthBE = 0;
   53|  56.3k|		memcpy(&lengthBE, data + sizeof(uint32_t), sizeof(uint32_t));  // length field in SOME/IP header
   54|  56.3k|		uint32_t length = be32toh(lengthBE);
   55|  56.3k|		if ((length < 8) || (length > dataLen - 8))
  ------------------
  |  Branch (55:7): [True: 141, False: 56.2k]
  |  Branch (55:23): [True: 7.19k, False: 49.0k]
  ------------------
   56|  7.33k|			return new PayloadLayer(data, dataLen, prevLayer, packet);
   57|       |
   58|  49.0k|		if (data[12] != SOMEIP_PROTOCOL_VERSION)
  ------------------
  |  Branch (58:7): [True: 79, False: 48.9k]
  ------------------
   59|     79|			return new PayloadLayer(data, dataLen, prevLayer, packet);
   60|       |
   61|  48.9k|		someiphdr* hdr = (someiphdr*)data;
   62|       |
   63|  48.9k|		switch (static_cast<MsgType>(hdr->msgType & ~(uint8_t)MsgType::TP_REQUEST))
   64|  48.9k|		{
   65|  3.57k|		case MsgType::REQUEST:
  ------------------
  |  Branch (65:3): [True: 3.57k, False: 45.3k]
  ------------------
   66|  3.57k|		case MsgType::REQUEST_ACK:
  ------------------
  |  Branch (66:3): [True: 0, False: 48.9k]
  ------------------
   67|  29.9k|		case MsgType::REQUEST_NO_RETURN:
  ------------------
  |  Branch (67:3): [True: 26.4k, False: 22.5k]
  ------------------
   68|  29.9k|		case MsgType::REQUEST_NO_RETURN_ACK:
  ------------------
  |  Branch (68:3): [True: 0, False: 48.9k]
  ------------------
   69|  45.6k|		case MsgType::NOTIFICATION:
  ------------------
  |  Branch (69:3): [True: 15.6k, False: 33.3k]
  ------------------
   70|  46.0k|		case MsgType::NOTIFICATION_ACK:
  ------------------
  |  Branch (70:3): [True: 380, False: 48.5k]
  ------------------
   71|  48.9k|		case MsgType::RESPONSE:
  ------------------
  |  Branch (71:3): [True: 2.90k, False: 46.0k]
  ------------------
   72|  48.9k|		case MsgType::RESPONSE_ACK:
  ------------------
  |  Branch (72:3): [True: 18, False: 48.9k]
  ------------------
   73|  48.9k|		case MsgType::ERRORS:
  ------------------
  |  Branch (73:3): [True: 0, False: 48.9k]
  ------------------
   74|  48.9k|		case MsgType::ERROR_ACK:
  ------------------
  |  Branch (74:3): [True: 0, False: 48.9k]
  ------------------
   75|  48.9k|			break;
   76|     35|		default:
  ------------------
  |  Branch (76:3): [True: 35, False: 48.9k]
  ------------------
   77|     35|			return new PayloadLayer(data, dataLen, prevLayer, packet);
   78|  48.9k|		}
   79|       |
   80|  48.9k|		if (be16toh(hdr->serviceID) == 0xFFFF && be16toh(hdr->methodID) == 0x8100 &&
  ------------------
  |  Branch (80:7): [True: 45.7k, False: 3.17k]
  |  Branch (80:44): [True: 45.3k, False: 379]
  ------------------
   81|  45.3k|		    SomeIpSdLayer::isDataValid(data, dataLen))
  ------------------
  |  Branch (81:7): [True: 35.9k, False: 9.38k]
  ------------------
   82|  35.9k|		{
   83|  35.9k|			return new SomeIpSdLayer(data, dataLen, prevLayer, packet);
   84|  35.9k|		}
   85|  12.9k|		else if ((hdr->msgType & (uint8_t)SomeIpLayer::MsgType::TP_REQUEST) != 0)
  ------------------
  |  Branch (85:12): [True: 250, False: 12.6k]
  ------------------
   86|    250|		{
   87|    250|			return new SomeIpTpLayer(data, dataLen, prevLayer, packet);
   88|    250|		}
   89|  12.6k|		else
   90|  12.6k|		{
   91|  12.6k|			return new SomeIpLayer(data, dataLen, prevLayer, packet);
   92|  12.6k|		}
   93|  48.9k|	}
_ZN4pcpp11SomeIpLayer12isSomeIpPortEt:
   96|   454k|	{
   97|   454k|		return SomeIpSdLayer::isSomeIpSdPort(port) ||
  ------------------
  |  Branch (97:10): [True: 49.7k, False: 404k]
  ------------------
   98|   404k|		       std::any_of(m_SomeIpPorts.begin(), m_SomeIpPorts.end(),
  ------------------
  |  Branch (98:10): [True: 0, False: 404k]
  ------------------
   99|   404k|		                   [&](const uint16_t& someIpPort) { return someIpPort == port; });
  100|   454k|	}
_ZNK4pcpp11SomeIpLayer12getServiceIDEv:
  137|  4.96k|	{
  138|       |		return be16toh(getSomeIpHeader()->serviceID);
  139|  4.96k|	}
_ZNK4pcpp11SomeIpLayer11getMethodIDEv:
  147|  4.96k|	{
  148|       |		return be16toh(getSomeIpHeader()->methodID);
  149|  4.96k|	}
_ZNK4pcpp11SomeIpLayer14getLengthFieldEv:
  157|  63.4k|	{
  158|       |		return be32toh(getSomeIpHeader()->length);
  159|  63.4k|	}
_ZNK4pcpp11SomeIpLayer19getMessageTypeAsIntEv:
  226|     50|	{
  227|     50|		return getSomeIpHeader()->msgType;
  228|     50|	}
_ZN4pcpp11SomeIpLayer14setMessageTypeEh:
  236|     50|	{
  237|     50|		getSomeIpHeader()->msgType = type;
  238|     50|	}
_ZN4pcpp11SomeIpLayer14parseNextLayerEv:
  258|  48.9k|	{
  259|  48.9k|		size_t headerLen = getHeaderLen();
  260|  48.9k|		if (m_DataLen <= headerLen)
  ------------------
  |  Branch (260:7): [True: 42.2k, False: 6.71k]
  ------------------
  261|  42.2k|			return;
  262|       |
  263|  6.71k|		uint8_t* payload = m_Data + headerLen;
  264|  6.71k|		size_t payloadLen = m_DataLen - headerLen;
  265|       |
  266|  6.71k|		constructNextLayerFromFactory(parseSomeIpLayer, payload, payloadLen);
  267|  6.71k|	}
_ZNK4pcpp11SomeIpLayer8toStringEv:
  270|  4.86k|	{
  271|  4.86k|		std::stringstream dataStream;
  272|       |
  273|  4.86k|		dataStream << "SOME/IP Layer" << std::hex << ", Service ID: 0x" << getServiceID() << ", Method ID: 0x"
  274|  4.86k|		           << getMethodID() << std::dec << ", Length: " << getLengthField();
  275|       |
  276|  4.86k|		return dataStream.str();
  277|  4.86k|	}
_ZN4pcpp13SomeIpTpLayer22computeCalculateFieldsEv:
  410|     50|	{
  411|     50|		setMessageType(setTpFlag(getMessageTypeAsInt()));
  412|     50|	}
_ZNK4pcpp13SomeIpTpLayer8toStringEv:
  415|    100|	{
  416|    100|		std::stringstream dataStream;
  417|       |
  418|    100|		dataStream << "SOME/IP-TP Layer" << std::hex << ", Service ID: 0x" << getServiceID() << ", Method ID: 0x"
  419|    100|		           << getMethodID() << std::dec << ", Length: " << getLengthField();
  420|       |
  421|    100|		return dataStream.str();
  422|    100|	}
_ZN4pcpp13SomeIpTpLayer9setTpFlagEh:
  425|     50|	{
  426|     50|		return messageType | (uint8_t)SomeIpLayer::MsgType::TP_REQUEST;
  427|     50|	}

_ZN4pcpp14SomeIpSdOptionD2Ev:
   15|  8.57k|	{
   16|  8.57k|		if (m_ShadowData != nullptr)
  ------------------
  |  Branch (16:7): [True: 0, False: 8.57k]
  ------------------
   17|      0|			delete[] m_ShadowData;
   18|  8.57k|	}
_ZNK4pcpp14SomeIpSdOption7getTypeEv:
   21|  4.76k|	{
   22|  4.76k|		return static_cast<OptionType>(getSomeIpSdOptionHeader()->type);
   23|  4.76k|	}
_ZNK4pcpp14SomeIpSdOption10getDataPtrEv:
   26|  18.4k|	{
   27|  18.4k|		if (m_DataContainer != nullptr)
  ------------------
  |  Branch (27:7): [True: 18.4k, False: 0]
  ------------------
   28|  18.4k|			return m_DataContainer->getDataPtr(m_Offset);
   29|       |
   30|      0|		return m_ShadowData;
   31|  18.4k|	}
_ZNK4pcpp14SomeIpSdOption23getSomeIpSdOptionHeaderEv:
   34|  5.03k|	{
   35|  5.03k|		return reinterpret_cast<someipsdhdroptionsbase*>(getDataPtr());
   36|  5.03k|	}
_ZN4pcpp18SomeIpSdIPv4OptionC2EPKNS_14IDataContainerEm:
   76|  8.14k|	    : SomeIpSdOption(dataContainer, offset)
   77|  8.14k|	{
   78|  8.14k|		m_DataLen = sizeof(someipsdhdroptionsipv4);
   79|  8.14k|	}
_ZNK4pcpp18SomeIpSdIPv4Option12getIpAddressEv:
   82|  4.33k|	{
   83|  4.33k|		someipsdhdroptionsipv4* hdr = reinterpret_cast<someipsdhdroptionsipv4*>(getDataPtr());
   84|  4.33k|		IPv4Address ipAddr(hdr->ipv4Address);
   85|       |
   86|  4.33k|		return ipAddr;
   87|  4.33k|	}
_ZNK4pcpp18SomeIpSdIPv4Option7getPortEv:
   90|  4.33k|	{
   91|  4.33k|		someipsdhdroptionsipv4* hdr = reinterpret_cast<someipsdhdroptionsipv4*>(getDataPtr());
   92|       |		return be16toh(hdr->portNumber);
   93|  4.33k|	}
_ZNK4pcpp18SomeIpSdIPv4Option11getProtocolEv:
   96|  4.33k|	{
   97|  4.33k|		someipsdhdroptionsipv4* hdr = reinterpret_cast<someipsdhdroptionsipv4*>(getDataPtr());
   98|  4.33k|		return hdr->l4Protocol;
   99|  4.33k|	}
_ZN4pcpp18SomeIpSdIPv6OptionC2EPKNS_14IDataContainerEm:
  130|    121|	    : SomeIpSdOption(dataContainer, offset)
  131|    121|	{
  132|    121|		m_DataLen = sizeof(someipsdhdroptionsipv6);
  133|    121|	}
_ZNK4pcpp18SomeIpSdIPv6Option12getIpAddressEv:
  136|    121|	{
  137|    121|		someipsdhdroptionsipv6* hdr = reinterpret_cast<someipsdhdroptionsipv6*>(getDataPtr());
  138|    121|		IPv6Address ipAddr(hdr->ipv6Address);
  139|       |
  140|    121|		return ipAddr;
  141|    121|	}
_ZNK4pcpp18SomeIpSdIPv6Option7getPortEv:
  144|    121|	{
  145|    121|		someipsdhdroptionsipv6* hdr = reinterpret_cast<someipsdhdroptionsipv6*>(getDataPtr());
  146|       |		return be16toh(hdr->portNumber);
  147|    121|	}
_ZNK4pcpp18SomeIpSdIPv6Option11getProtocolEv:
  150|    121|	{
  151|    121|		someipsdhdroptionsipv6* hdr = reinterpret_cast<someipsdhdroptionsipv6*>(getDataPtr());
  152|    121|		return hdr->l4Protocol;
  153|    121|	}
_ZN4pcpp27SomeIpSdConfigurationOptionC2EPKNS_14IDataContainerEm:
  169|    276|	    : SomeIpSdOption(dataContainer, offset)
  170|    276|	{
  171|       |		m_DataLen = sizeof(someipsdhdroptionsbase) - 1 + be16toh(getSomeIpSdOptionHeader()->length);
  172|    276|	}
_ZN4pcpp27SomeIpSdLoadBalancingOptionC2EPKNS_14IDataContainerEm:
  196|     32|	    : SomeIpSdOption(dataContainer, offset)
  197|     32|	{
  198|     32|		m_DataLen = sizeof(someipsdhdroptionsload);
  199|     32|	}
_ZN4pcpp13SomeIpSdEntryC2EPKNS_13SomeIpSdLayerEm:
  231|  7.50k|	    : m_Layer(pSomeIpSdLayer), m_Offset(offset), m_ShadowData(nullptr)
  232|  7.50k|	{
  233|  7.50k|		EntryType entryType;
  234|       |
  235|  7.50k|		someipsdhdrentry* hdr = getSomeIpSdEntryHeader();
  236|  7.50k|		TypeInternal internalType = static_cast<TypeInternal>(hdr->type);
  237|  7.50k|		auto ttl = getTtl();
  238|       |
  239|  7.50k|		switch (internalType)
  240|  7.50k|		{
  241|    528|		case SomeIpSdEntry::TypeInternal::FindService_Internal:
  ------------------
  |  Branch (241:3): [True: 528, False: 6.97k]
  ------------------
  242|    528|			entryType = SomeIpSdEntry::EntryType::FindService;
  243|    528|			break;
  244|  2.09k|		case SomeIpSdEntry::TypeInternal::OfferService_Internal:
  ------------------
  |  Branch (244:3): [True: 2.09k, False: 5.40k]
  ------------------
  245|  2.09k|			if (ttl == 0)
  ------------------
  |  Branch (245:8): [True: 2.03k, False: 63]
  ------------------
  246|  2.03k|			{
  247|  2.03k|				entryType = EntryType::StopOfferService;
  248|  2.03k|			}
  249|     63|			else
  250|     63|			{
  251|     63|				entryType = EntryType::OfferService;
  252|     63|			}
  253|  2.09k|			break;
  254|  3.06k|		case SomeIpSdEntry::TypeInternal::SubscribeEventgroup_Internal:
  ------------------
  |  Branch (254:3): [True: 3.06k, False: 4.43k]
  ------------------
  255|  3.06k|			if (ttl == 0)
  ------------------
  |  Branch (255:8): [True: 1.99k, False: 1.07k]
  ------------------
  256|  1.99k|			{
  257|  1.99k|				entryType = EntryType::StopSubscribeEventgroup;
  258|  1.99k|			}
  259|  1.07k|			else
  260|  1.07k|			{
  261|  1.07k|				entryType = EntryType::SubscribeEventgroup;
  262|  1.07k|			}
  263|  3.06k|			break;
  264|    236|		case SomeIpSdEntry::TypeInternal::SubscribeEventgroupAck_Internal:
  ------------------
  |  Branch (264:3): [True: 236, False: 7.26k]
  ------------------
  265|    236|			if (ttl == 0)
  ------------------
  |  Branch (265:8): [True: 0, False: 236]
  ------------------
  266|      0|			{
  267|      0|				entryType = EntryType::SubscribeEventgroupNack;
  268|      0|			}
  269|    236|			else
  270|    236|			{
  271|    236|				entryType = EntryType::SubscribeEventgroupAck;
  272|    236|			}
  273|    236|			break;
  274|  1.57k|		default:
  ------------------
  |  Branch (274:3): [True: 1.57k, False: 5.92k]
  ------------------
  275|  1.57k|			entryType = EntryType::UnknownEntryType;
  276|  1.57k|			break;
  277|  7.50k|		}
  278|       |
  279|  7.50k|		m_EntryType = entryType;
  280|  7.50k|	}
_ZN4pcpp13SomeIpSdEntryD2Ev:
  283|  7.50k|	{
  284|  7.50k|		if (m_ShadowData != nullptr)
  ------------------
  |  Branch (284:7): [True: 0, False: 7.50k]
  ------------------
  285|      0|			delete[] m_ShadowData;
  286|  7.50k|	}
_ZNK4pcpp13SomeIpSdEntry10getDataPtrEv:
  289|  67.5k|	{
  290|  67.5k|		if (m_Layer != nullptr)
  ------------------
  |  Branch (290:7): [True: 67.5k, False: 0]
  ------------------
  291|  67.5k|			return m_Layer->getDataPtr(m_Offset);
  292|       |
  293|      0|		return m_ShadowData;
  294|  67.5k|	}
_ZNK4pcpp13SomeIpSdEntry22getSomeIpSdEntryHeaderEv:
  297|  67.5k|	{
  298|  67.5k|		return reinterpret_cast<someipsdhdrentry*>(getDataPtr());
  299|  67.5k|	}
_ZNK4pcpp13SomeIpSdEntry13getNumOptionsEv:
  302|  7.50k|	{
  303|  7.50k|		auto* hdr = getSomeIpSdEntryHeader();
  304|  7.50k|		return hdr->nrOpt1 + hdr->nrOpt2;
  305|  7.50k|	}
_ZNK4pcpp13SomeIpSdEntry12getServiceIdEv:
  308|  7.50k|	{
  309|       |		return be16toh(getSomeIpSdEntryHeader()->serviceID);
  310|  7.50k|	}
_ZNK4pcpp13SomeIpSdEntry13getInstanceIdEv:
  318|  7.50k|	{
  319|       |		return be16toh(getSomeIpSdEntryHeader()->instanceID);
  320|  7.50k|	}
_ZNK4pcpp13SomeIpSdEntry15getMajorVersionEv:
  328|  7.50k|	{
  329|       |		return (be32toh(getSomeIpSdEntryHeader()->majorVersion_ttl) & ~SOMEIPSD_HDR_ENTRY_MASK_TTL) >> 24;
  330|  7.50k|	}
_ZNK4pcpp13SomeIpSdEntry6getTtlEv:
  340|  7.50k|	{
  341|       |		return be32toh(getSomeIpSdEntryHeader()->majorVersion_ttl) & SOMEIPSD_HDR_ENTRY_MASK_TTL;
  342|  7.50k|	}
_ZNK4pcpp13SomeIpSdEntry15getMinorVersionEv:
  353|  7.50k|	{
  354|       |		return be32toh(getSomeIpSdEntryHeader()->data);
  355|  7.50k|	}
_ZNK4pcpp13SomeIpSdEntry10getCounterEv:
  363|  7.50k|	{
  364|       |		return static_cast<uint8_t>((be32toh(getSomeIpSdEntryHeader()->data) >> 16) & 0x0F);
  365|  7.50k|	}
_ZNK4pcpp13SomeIpSdEntry15getEventgroupIdEv:
  374|  7.50k|	{
  375|       |		return static_cast<uint16_t>(be32toh(getSomeIpSdEntryHeader()->data) & 0x0000FFFF);
  376|  7.50k|	}
_ZN4pcpp13SomeIpSdLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  434|  35.9k|	    : SomeIpLayer(data, dataLen, prevLayer, packet)
  435|  35.9k|	{
  436|  35.9k|		countOptions(m_NumOptions, data);
  437|  35.9k|	}
_ZNK4pcpp13SomeIpSdLayer8getFlagsEv:
  460|  7.08k|	{
  461|  7.08k|		someipsdhdr* hdr = reinterpret_cast<someipsdhdr*>(m_Data);
  462|  7.08k|		return hdr->flags;
  463|  7.08k|	}
_ZNK4pcpp13SomeIpSdLayer13getNumEntriesEv:
  472|  21.1k|	{
  473|  21.1k|		return static_cast<uint32_t>(getLenEntries() / sizeof(SomeIpSdEntry::someipsdhdrentry));
  474|  21.1k|	}
_ZNK4pcpp13SomeIpSdLayer13getNumOptionsEv:
  477|  14.1k|	{
  478|  14.1k|		return m_NumOptions;
  479|  14.1k|	}
_ZNK4pcpp13SomeIpSdLayer10getEntriesEv:
  482|  7.08k|	{
  483|  7.08k|		size_t remainingLen = getLenEntries();
  484|  7.08k|		size_t offset = sizeof(someipsdhdr) + sizeof(uint32_t);
  485|       |
  486|  7.08k|		EntriesVec vecEntries;
  487|  7.08k|		EntryPtr entry;
  488|       |
  489|  14.5k|		while (remainingLen > 0)
  ------------------
  |  Branch (489:10): [True: 7.59k, False: 6.99k]
  ------------------
  490|  7.59k|		{
  491|       |			// Ensure there is enough remaining length for a new entry
  492|  7.59k|			if (remainingLen < sizeof(SomeIpSdEntry::someipsdhdrentry))
  ------------------
  |  Branch (492:8): [True: 88, False: 7.50k]
  ------------------
  493|     88|			{
  494|     88|				break;
  495|     88|			}
  496|  7.50k|			entry = new SomeIpSdEntry(this, offset);
  497|       |
  498|  7.50k|			size_t entryLen = entry->getLength();
  499|  7.50k|			remainingLen -= entryLen;
  500|  7.50k|			offset += entryLen;
  501|       |
  502|  7.50k|			vecEntries.push_back(entry);
  503|  7.50k|		}
  504|       |
  505|  7.08k|		return vecEntries;
  506|  7.08k|	};
_ZNK4pcpp13SomeIpSdLayer10getOptionsEv:
  509|  7.08k|	{
  510|  7.08k|		OptionsVec vecOptions;
  511|  7.08k|		OptionPtr option;
  512|       |
  513|  7.08k|		size_t remainingLen = getLenOptions();
  514|  7.08k|		size_t offset = sizeof(someipsdhdr) + sizeof(uint32_t) + getLenEntries() + sizeof(uint32_t);
  515|       |
  516|  14.6k|		while (remainingLen > 0)
  ------------------
  |  Branch (516:10): [True: 7.58k, False: 7.08k]
  ------------------
  517|  7.58k|		{
  518|  7.58k|			SomeIpSdOption::someipsdhdroptionsbase* hdr =
  519|  7.58k|			    reinterpret_cast<SomeIpSdOption::someipsdhdroptionsbase*>(m_Data + offset);
  520|  7.58k|			SomeIpSdOption::OptionType optionType = static_cast<SomeIpSdOption::OptionType>(hdr->type);
  521|       |
  522|  7.58k|			option = parseOption(optionType, offset, remainingLen);
  523|       |
  524|  7.58k|			if (option != nullptr)
  ------------------
  |  Branch (524:8): [True: 4.76k, False: 2.81k]
  ------------------
  525|  4.76k|			{
  526|  4.76k|				vecOptions.push_back(std::move(option));
  527|  4.76k|			}
  528|       |
  529|  7.58k|			size_t optionLen = be16toh(hdr->length) + 3;
  530|  7.58k|			remainingLen -= optionLen;
  531|  7.58k|			offset += optionLen;
  532|  7.58k|		}
  533|       |
  534|  7.08k|		return vecOptions;
  535|  7.08k|	}
_ZNK4pcpp13SomeIpSdLayer19getOptionsFromEntryEj:
  538|  6.96k|	{
  539|  6.96k|		OptionsVec vecOptions;
  540|  6.96k|		OptionPtr option;
  541|       |
  542|  6.96k|		if (index >= getNumEntries())
  ------------------
  |  Branch (542:7): [True: 0, False: 6.96k]
  ------------------
  543|      0|			return vecOptions;
  544|       |
  545|  6.96k|		size_t remainingLen = getLenOptions();
  546|  6.96k|		size_t offset = sizeof(someipsdhdr) + sizeof(uint32_t) + getLenEntries() + sizeof(uint32_t);
  547|       |
  548|  6.96k|		size_t offsetToEntry = sizeof(someipsdhdr) + sizeof(uint32_t) + index * sizeof(SomeIpSdEntry::someipsdhdrentry);
  549|  6.96k|		SomeIpSdEntry::someipsdhdrentry* hdrEntry =
  550|  6.96k|		    reinterpret_cast<SomeIpSdEntry::someipsdhdrentry*>(m_Data + offsetToEntry);
  551|  6.96k|		uint8_t startIdxRun1 = hdrEntry->indexFirstOption;
  552|  6.96k|		uint8_t lenRun1 = hdrEntry->nrOpt1;
  553|  6.96k|		uint8_t startIdxRun2 = hdrEntry->indexSecondOption;
  554|  6.96k|		uint8_t lenRun2 = hdrEntry->nrOpt2;
  555|       |
  556|  6.96k|		int idx = 0;
  557|       |
  558|  13.8k|		while (remainingLen > 0)
  ------------------
  |  Branch (558:10): [True: 6.84k, False: 6.96k]
  ------------------
  559|  6.84k|		{
  560|  6.84k|			SomeIpSdOption::someipsdhdroptionsbase* hdrOption =
  561|  6.84k|			    reinterpret_cast<SomeIpSdOption::someipsdhdroptionsbase*>(m_Data + offset);
  562|       |
  563|  6.84k|			if (((idx >= startIdxRun1) && (idx < (startIdxRun1 + lenRun1))) ||
  ------------------
  |  Branch (563:9): [True: 5.92k, False: 918]
  |  Branch (563:34): [True: 3.01k, False: 2.91k]
  ------------------
  564|  3.83k|			    ((idx >= startIdxRun2) && (idx < (startIdxRun2 + lenRun2))))
  ------------------
  |  Branch (564:9): [True: 2.39k, False: 1.43k]
  |  Branch (564:34): [True: 1.59k, False: 796]
  ------------------
  565|  4.61k|			{
  566|  4.61k|				SomeIpSdOption::OptionType optionType = static_cast<SomeIpSdOption::OptionType>(hdrOption->type);
  567|       |
  568|  4.61k|				option = parseOption(optionType, offset, remainingLen);
  569|       |
  570|  4.61k|				if (option != nullptr)
  ------------------
  |  Branch (570:9): [True: 3.81k, False: 800]
  ------------------
  571|  3.81k|				{
  572|  3.81k|					vecOptions.push_back(std::move(option));
  573|  3.81k|				}
  574|  4.61k|			}
  575|       |
  576|  6.84k|			size_t optionLen = be16toh(hdrOption->length) + 3;
  577|  6.84k|			remainingLen -= optionLen;
  578|  6.84k|			offset += optionLen;
  579|  6.84k|			++idx;
  580|  6.84k|		}
  581|       |
  582|  6.96k|		return vecOptions;
  583|  6.96k|	}
_ZNK4pcpp13SomeIpSdLayer8toStringEv:
  609|  14.1k|	{
  610|  14.1k|		std::stringstream dataStream;
  611|       |
  612|  14.1k|		dataStream << "SOME/IP-SD Layer, " << getNumEntries() << " entries, " << getNumOptions() << " options";
  613|       |
  614|  14.1k|		return dataStream.str();
  615|  14.1k|	}
_ZN4pcpp13SomeIpSdLayer11isDataValidEPKhm:
  832|  45.3k|	{
  833|  45.3k|		uint32_t count;
  834|  45.3k|		if (!data || dataLen < sizeof(someipsdhdr) + sizeof(uint32_t) ||
  ------------------
  |  Branch (834:7): [True: 0, False: 45.3k]
  |  Branch (834:16): [True: 0, False: 45.3k]
  ------------------
  835|  45.3k|		    dataLen < sizeof(someipsdhdr) + sizeof(uint32_t) + getLenEntries(data) + sizeof(uint32_t) ||
  ------------------
  |  Branch (835:7): [True: 659, False: 44.7k]
  ------------------
  836|  44.7k|		    dataLen <
  ------------------
  |  Branch (836:7): [True: 1.02k, False: 43.6k]
  ------------------
  837|  44.7k|		        sizeof(someipsdhdr) + sizeof(uint32_t) + getLenEntries(data) + sizeof(uint32_t) + getLenOptions(data) ||
  838|  43.6k|		    !countOptions(count, data))
  ------------------
  |  Branch (838:7): [True: 7.70k, False: 35.9k]
  ------------------
  839|  9.38k|		{
  840|  9.38k|			return false;
  841|  9.38k|		}
  842|       |
  843|  35.9k|		return true;
  844|  45.3k|	}
_ZN4pcpp13SomeIpSdLayer12countOptionsERjPKh:
  847|  79.6k|	{
  848|  79.6k|		size_t offsetOption = sizeof(someipsdhdr) + sizeof(uint32_t) + getLenEntries(data) + sizeof(uint32_t);
  849|  79.6k|		size_t lenOptions = getLenOptions(data);
  850|  79.6k|		uint32_t len = 0;
  851|       |
  852|  79.6k|		count = 0;
  853|   157k|		while (len < lenOptions)
  ------------------
  |  Branch (853:10): [True: 85.9k, False: 71.9k]
  ------------------
  854|  85.9k|		{
  855|  85.9k|			if (len + sizeof(uint16_t) + 3 * sizeof(uint8_t) > lenOptions)
  ------------------
  |  Branch (855:8): [True: 5, False: 85.9k]
  ------------------
  856|      5|				return false;
  857|       |
  858|  85.9k|			uint32_t lenOption =
  859|  85.9k|			    be16toh(*(reinterpret_cast<uint16_t const*>(data + offsetOption + len))) + 3 * sizeof(uint8_t);
  860|  85.9k|			len += lenOption;
  861|  85.9k|			if (len > lenOptions)  // the last one must be equal to lenOptions
  ------------------
  |  Branch (861:8): [True: 7.69k, False: 78.2k]
  ------------------
  862|  7.69k|				return false;
  863|       |
  864|  78.2k|			++(count);
  865|  78.2k|		}
  866|  71.9k|		return true;
  867|  79.6k|	}
_ZNK4pcpp13SomeIpSdLayer11parseOptionENS_14SomeIpSdOption10OptionTypeEmm:
  960|  12.1k|	{
  961|  12.1k|		switch (type)
  962|  12.1k|		{
  963|    992|		case SomeIpSdOption::OptionType::IPv4Endpoint:
  ------------------
  |  Branch (963:3): [True: 992, False: 11.1k]
  ------------------
  964|  1.08k|		case SomeIpSdOption::OptionType::IPv4Multicast:
  ------------------
  |  Branch (964:3): [True: 92, False: 12.0k]
  ------------------
  965|  8.14k|		case SomeIpSdOption::OptionType::IPv4SdEndpoint:
  ------------------
  |  Branch (965:3): [True: 7.05k, False: 5.13k]
  ------------------
  966|  8.14k|		{
  967|  8.14k|			if (SomeIpSdIPv4Option::isDataValid(this, remainingLength))
  ------------------
  |  Branch (967:8): [True: 8.14k, False: 0]
  ------------------
  968|  8.14k|			{
  969|  8.14k|				return new SomeIpSdIPv4Option(this, offset);
  970|  8.14k|			}
  971|      0|			return nullptr;
  972|  8.14k|		}
  973|    303|		case SomeIpSdOption::OptionType::IPv6Endpoint:
  ------------------
  |  Branch (973:3): [True: 303, False: 11.8k]
  ------------------
  974|    303|		case SomeIpSdOption::OptionType::IPv6Multicast:
  ------------------
  |  Branch (974:3): [True: 0, False: 12.1k]
  ------------------
  975|    318|		case SomeIpSdOption::OptionType::IPv6SdEndpoint:
  ------------------
  |  Branch (975:3): [True: 15, False: 12.1k]
  ------------------
  976|    318|		{
  977|    318|			if (SomeIpSdIPv6Option::isDataValid(this, remainingLength))
  ------------------
  |  Branch (977:8): [True: 121, False: 197]
  ------------------
  978|    121|			{
  979|    121|				return new SomeIpSdIPv6Option(this, offset);
  980|    121|			}
  981|    197|			return nullptr;
  982|    318|		}
  983|    276|		case SomeIpSdOption::OptionType::ConfigurationString:
  ------------------
  |  Branch (983:3): [True: 276, False: 11.9k]
  ------------------
  984|    276|		{
  985|    276|			if (SomeIpSdConfigurationOption::isDataValid(this, remainingLength))
  ------------------
  |  Branch (985:8): [True: 276, False: 0]
  ------------------
  986|    276|			{
  987|    276|				return new SomeIpSdConfigurationOption(this, offset);
  988|    276|			}
  989|      0|			return nullptr;
  990|    276|		}
  991|     32|		case SomeIpSdOption::OptionType::LoadBalancing:
  ------------------
  |  Branch (991:3): [True: 32, False: 12.1k]
  ------------------
  992|     32|		{
  993|     32|			if (SomeIpSdLoadBalancingOption::isDataValid(this, remainingLength))
  ------------------
  |  Branch (993:8): [True: 32, False: 0]
  ------------------
  994|     32|			{
  995|     32|				return new SomeIpSdLoadBalancingOption(this, offset);
  996|     32|			}
  997|      0|			return nullptr;
  998|     32|		}
  999|  3.42k|		default:
  ------------------
  |  Branch (999:3): [True: 3.42k, False: 8.76k]
  ------------------
 1000|  3.42k|			break;
 1001|  12.1k|		}
 1002|  3.42k|		return nullptr;
 1003|  12.1k|	}
_ZNK4pcpp13SomeIpSdLayer13getLenEntriesEv:
 1006|  42.2k|	{
 1007|  42.2k|		return getLenEntries(m_Data);
 1008|  42.2k|	}
_ZN4pcpp13SomeIpSdLayer13getLenEntriesEPKh:
 1011|   350k|	{
 1012|       |		return be32toh(*(reinterpret_cast<const uint32_t*>(data + sizeof(someipsdhdr))));
 1013|   350k|	}
_ZNK4pcpp13SomeIpSdLayer13getLenOptionsEv:
 1016|  14.0k|	{
 1017|  14.0k|		return getLenOptions(m_Data);
 1018|  14.0k|	}
_ZN4pcpp13SomeIpSdLayer13getLenOptionsEPKh:
 1021|   138k|	{
 1022|       |		return be32toh(
 1023|   138k|		    *(reinterpret_cast<const uint32_t*>(data + sizeof(someipsdhdr) + sizeof(uint32_t) + getLenEntries(data))));
 1024|   138k|	}

_ZN4pcpp8StpLayer11isDataValidEPKhm:
  150|  4.76k|	{
  151|  4.76k|		return data && dataLen;
  ------------------
  |  Branch (151:10): [True: 4.76k, False: 0]
  |  Branch (151:18): [True: 4.76k, False: 0]
  ------------------
  152|  4.76k|	}
_ZN4pcpp8StpLayer13parseStpLayerEPhmPNS_5LayerEPNS_6PacketE:
  155|  4.76k|	{
  156|  4.76k|		if (dataLen >= sizeof(stp_tcn_bpdu))
  ------------------
  |  Branch (156:7): [True: 4.76k, False: 0]
  ------------------
  157|  4.76k|		{
  158|  4.76k|			stp_tcn_bpdu* ptr = reinterpret_cast<stp_tcn_bpdu*>(data);
  159|  4.76k|			switch (ptr->type)
  160|  4.76k|			{
  161|  1.88k|			case 0x00:
  ------------------
  |  Branch (161:4): [True: 1.88k, False: 2.87k]
  ------------------
  162|  1.88k|				return StpConfigurationBPDULayer::isDataValid(data, dataLen)
  ------------------
  |  Branch (162:12): [True: 1.88k, False: 0]
  ------------------
  163|  1.88k|				           ? new StpConfigurationBPDULayer(data, dataLen, prevLayer, packet)
  164|  1.88k|				           : nullptr;
  165|  1.27k|			case 0x02:
  ------------------
  |  Branch (165:4): [True: 1.27k, False: 3.48k]
  ------------------
  166|  1.27k|				if (ptr->version == 0x2)
  ------------------
  |  Branch (166:9): [True: 1.08k, False: 196]
  ------------------
  167|  1.08k|					return RapidStpLayer::isDataValid(data, dataLen)
  ------------------
  |  Branch (167:13): [True: 1.08k, False: 0]
  ------------------
  168|  1.08k|					           ? new RapidStpLayer(data, dataLen, prevLayer, packet)
  169|  1.08k|					           : nullptr;
  170|    196|				if (ptr->version == 0x3)
  ------------------
  |  Branch (170:9): [True: 68, False: 128]
  ------------------
  171|     68|					return MultipleStpLayer::isDataValid(data, dataLen)
  ------------------
  |  Branch (171:13): [True: 64, False: 4]
  ------------------
  172|     68|					           ? new MultipleStpLayer(data, dataLen, prevLayer, packet)
  173|     68|					           : nullptr;
  174|    128|				PCPP_LOG_DEBUG("Unknown Spanning Tree Version");
  ------------------
  |  |  427|    128|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|    128|	do                                                                                                                 \
  |  |  |  |  415|    128|	{                                                                                                                  \
  |  |  |  |  416|    128|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    128|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|    128|#define LOG_MODULE PacketLogModuleStpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 128]
  |  |  |  |  ------------------
  |  |  |  |  418|    128|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleStpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|    128|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 128]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  175|    128|				return nullptr;
  176|  1.60k|			case 0x80:
  ------------------
  |  Branch (176:4): [True: 1.60k, False: 3.16k]
  ------------------
  177|  1.60k|				return StpTopologyChangeBPDULayer::isDataValid(data, dataLen)
  ------------------
  |  Branch (177:12): [True: 1.60k, False: 0]
  ------------------
  178|  1.60k|				           ? new StpTopologyChangeBPDULayer(data, dataLen, prevLayer, packet)
  179|  1.60k|				           : nullptr;
  180|       |			// TODO: Per VLAN Spanning Tree+ (PVST+)
  181|       |			// TODO: Rapid Per VLAN Spanning Tree+ (RPVST+)
  182|       |			// TODO: Cisco Uplink Fast
  183|      0|			default:
  ------------------
  |  Branch (183:4): [True: 0, False: 4.76k]
  ------------------
  184|      0|				PCPP_LOG_DEBUG("Unknown Spanning Tree Protocol type");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleStpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleStpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  185|      0|				return nullptr;
  186|  4.76k|			}
  187|  4.76k|		}
  188|       |
  189|      0|		PCPP_LOG_DEBUG("Data length is less than any STP header");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleStpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleStpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  190|      0|		return nullptr;
  191|  4.76k|	}
_ZN4pcpp26StpTopologyChangeBPDULayer14parseNextLayerEv:
  203|  1.60k|	{
  204|  1.60k|		if (m_DataLen > sizeof(stp_tcn_bpdu))
  ------------------
  |  Branch (204:7): [True: 1.60k, False: 0]
  ------------------
  205|  1.60k|		{
  206|  1.60k|			constructNextLayer<PayloadLayer>(m_Data, m_DataLen - sizeof(stp_tcn_bpdu));
  207|  1.60k|		}
  208|  1.60k|	}
_ZN4pcpp25StpConfigurationBPDULayer14parseNextLayerEv:
  350|  1.88k|	{
  351|  1.88k|		if (m_DataLen > sizeof(stp_conf_bpdu))
  ------------------
  |  Branch (351:7): [True: 1.88k, False: 0]
  ------------------
  352|  1.88k|		{
  353|  1.88k|			constructNextLayer<PayloadLayer>(m_Data, m_DataLen - sizeof(stp_conf_bpdu));
  354|  1.88k|		}
  355|  1.88k|	}
_ZN4pcpp13RapidStpLayer14parseNextLayerEv:
  367|  1.08k|	{
  368|  1.08k|		if (m_DataLen > sizeof(rstp_conf_bpdu))
  ------------------
  |  Branch (368:7): [True: 1.08k, False: 0]
  ------------------
  369|  1.08k|		{
  370|  1.08k|			constructNextLayer<PayloadLayer>(m_Data, m_DataLen - sizeof(rstp_conf_bpdu));
  371|  1.08k|		}
  372|  1.08k|	}

_ZN4pcpp16TLVRecordBuilderC2Ev:
    9|  88.9k|	{
   10|  88.9k|		m_RecType = 0;
   11|  88.9k|		m_RecValueLen = 0;
   12|  88.9k|		m_RecValue = nullptr;
   13|  88.9k|	}
_ZN4pcpp16TLVRecordBuilderD2Ev:
  101|  88.9k|	{
  102|  88.9k|		if (m_RecValue != nullptr)
  ------------------
  |  Branch (102:7): [True: 88.9k, False: 0]
  ------------------
  103|  88.9k|			delete[] m_RecValue;
  104|  88.9k|	}
_ZN4pcpp16TLVRecordBuilder4initEjPKhm:
  107|  88.9k|	{
  108|  88.9k|		m_RecType = recType;
  109|  88.9k|		m_RecValueLen = recValueLen;
  110|  88.9k|		m_RecValue = new uint8_t[recValueLen];
  111|  88.9k|		if (recValue != nullptr)
  ------------------
  |  Branch (111:7): [True: 0, False: 88.9k]
  ------------------
  112|      0|			memcpy(m_RecValue, recValue, recValueLen);
  113|  88.9k|		else
  114|  88.9k|			memset(m_RecValue, 0, recValueLen);
  115|  88.9k|	}

_ZN4pcpp16TcpOptionBuilderC2ENS0_20NopEolOptionEnumTypeE:
  112|  88.9k|	{
  113|  88.9k|		switch (optionType)
  114|  88.9k|		{
  115|      0|		case NopEolOptionEnumType::Eol:
  ------------------
  |  Branch (115:3): [True: 0, False: 88.9k]
  ------------------
  116|      0|			init(static_cast<uint8_t>(TcpOptionEnumType::Eol), nullptr, 0);
  117|      0|			break;
  118|  88.9k|		case NopEolOptionEnumType::Nop:
  ------------------
  |  Branch (118:3): [True: 88.9k, False: 0]
  ------------------
  119|  88.9k|		default:
  ------------------
  |  Branch (119:3): [True: 0, False: 88.9k]
  ------------------
  120|  88.9k|			init(static_cast<uint8_t>(TcpOptionEnumType::Nop), nullptr, 0);
  121|  88.9k|			break;
  122|  88.9k|		}
  123|  88.9k|	}
_ZNK4pcpp16TcpOptionBuilder5buildEv:
  126|  36.5k|	{
  127|  36.5k|		uint8_t recType = static_cast<uint8_t>(m_RecType);
  128|  36.5k|		size_t optionSize = m_RecValueLen + 2 * sizeof(uint8_t);
  129|       |
  130|  36.5k|		if (recType == static_cast<uint8_t>(TcpOptionEnumType::Eol) ||
  ------------------
  |  Branch (130:7): [True: 0, False: 36.5k]
  ------------------
  131|  36.5k|		    recType == static_cast<uint8_t>(TcpOptionEnumType::Nop))
  ------------------
  |  Branch (131:7): [True: 36.5k, False: 0]
  ------------------
  132|  36.5k|		{
  133|  36.5k|			if (m_RecValueLen != 0)
  ------------------
  |  Branch (133:8): [True: 0, False: 36.5k]
  ------------------
  134|      0|			{
  135|      0|				PCPP_LOG_ERROR(
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTcpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTcpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  136|      0|				    "TCP NOP and TCP EOL options are 1-byte long and don't have option value. Tried to set option value of size "
  137|      0|				    << m_RecValueLen);
  138|      0|				return TcpOption(nullptr);
  139|      0|			}
  140|       |
  141|  36.5k|			optionSize = 1;
  142|  36.5k|		}
  143|       |
  144|  36.5k|		uint8_t* recordBuffer = new uint8_t[optionSize];
  145|  36.5k|		memset(recordBuffer, 0, optionSize);
  146|  36.5k|		recordBuffer[0] = recType;
  147|  36.5k|		if (optionSize > 1)
  ------------------
  |  Branch (147:7): [True: 0, False: 36.5k]
  ------------------
  148|      0|		{
  149|      0|			recordBuffer[1] = static_cast<uint8_t>(optionSize);
  150|      0|			if (optionSize > 2 && m_RecValue != nullptr)
  ------------------
  |  Branch (150:8): [True: 0, False: 0]
  |  Branch (150:26): [True: 0, False: 0]
  ------------------
  151|      0|				memcpy(recordBuffer + 2, m_RecValue, m_RecValueLen);
  152|      0|		}
  153|       |
  154|  36.5k|		return TcpOption(recordBuffer);
  155|  36.5k|	}
_ZNK4pcpp8TcpLayer10getSrcPortEv:
  162|   590k|	{
  163|       |		return be16toh(getTcpHeader()->portSrc);
  164|   590k|	}
_ZNK4pcpp8TcpLayer10getDstPortEv:
  167|   590k|	{
  168|       |		return be16toh(getTcpHeader()->portDst);
  169|   590k|	}
_ZNK4pcpp8TcpLayer12getTcpOptionENS_17TcpOptionEnumTypeE:
  172|  88.9k|	{
  173|  88.9k|		return m_OptionReader.getTLVRecord(static_cast<uint8_t>(option), getOptionsBasePtr(),
  174|  88.9k|		                                   getHeaderLen() - sizeof(tcphdr));
  175|  88.9k|	}
_ZNK4pcpp8TcpLayer17getFirstTcpOptionEv:
  178|  36.5k|	{
  179|  36.5k|		return m_OptionReader.getFirstTLVRecord(getOptionsBasePtr(), getHeaderLen() - sizeof(tcphdr));
  180|  36.5k|	}
_ZNK4pcpp8TcpLayer16getNextTcpOptionERNS_9TcpOptionE:
  183|   140k|	{
  184|   140k|		TcpOption nextOpt =
  185|   140k|		    m_OptionReader.getNextTLVRecord(tcpOption, getOptionsBasePtr(), getHeaderLen() - sizeof(tcphdr));
  186|   140k|		if (nextOpt.isNotNull() && nextOpt.getType() == TcpOptionDummy)
  ------------------
  |  Branch (186:7): [True: 103k, False: 36.3k]
  |  Branch (186:30): [True: 158, False: 103k]
  ------------------
  187|    158|			return TcpOption(nullptr);
  188|       |
  189|   139k|		return nextOpt;
  190|   140k|	}
_ZN4pcpp8TcpLayer20insertTcpOptionAfterERKNS_16TcpOptionBuilderENS_17TcpOptionEnumTypeE:
  204|  88.9k|	{
  205|  88.9k|		int offset = 0;
  206|       |
  207|  88.9k|		if (prevOptionType == TcpOptionEnumType::Unknown)
  ------------------
  |  Branch (207:7): [True: 0, False: 88.9k]
  ------------------
  208|      0|		{
  209|      0|			offset = sizeof(tcphdr);
  210|      0|		}
  211|  88.9k|		else
  212|  88.9k|		{
  213|  88.9k|			const TcpOption prevOpt = getTcpOption(prevOptionType);
  214|  88.9k|			if (prevOpt.isNull())
  ------------------
  |  Branch (214:8): [True: 52.4k, False: 36.5k]
  ------------------
  215|  52.4k|			{
  216|  52.4k|				PCPP_LOG_ERROR("Previous option of type " << static_cast<int>(prevOptionType)
  ------------------
  |  |  445|  52.4k|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|  52.4k|	do                                                                                                                 \
  |  |  |  |  415|  52.4k|	{                                                                                                                  \
  |  |  |  |  416|  52.4k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  52.4k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  52.4k|#define LOG_MODULE PacketLogModuleTcpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 52.4k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|  52.4k|		{                                                                                                              \
  |  |  |  |  419|  52.4k|			auto ctx =                                                                                                 \
  |  |  |  |  420|  52.4k|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  52.4k|#define LOG_MODULE PacketLogModuleTcpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|  52.4k|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|  52.4k|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|  52.4k|		}                                                                                                              \
  |  |  |  |  424|  52.4k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 52.4k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  217|  52.4k|				                                          << " not found, cannot add a new TCP option");
  218|  52.4k|				return TcpOption(nullptr);
  219|  52.4k|			}
  220|       |
  221|  36.5k|			offset = prevOpt.getRecordBasePtr() + prevOpt.getTotalSize() - m_Data;
  222|  36.5k|		}
  223|       |
  224|  36.5k|		return addTcpOptionAt(optionBuilder, offset);
  225|  88.9k|	}
_ZN4pcpp8TcpLayer14addTcpOptionAtERKNS_16TcpOptionBuilderEi:
  273|  36.5k|	{
  274|  36.5k|		TcpOption newOption = optionBuilder.build();
  275|  36.5k|		if (newOption.isNull())
  ------------------
  |  Branch (275:7): [True: 0, False: 36.5k]
  ------------------
  276|      0|			return newOption;
  277|       |
  278|       |		// calculate total TCP option size
  279|  36.5k|		TcpOption curOpt = getFirstTcpOption();
  280|  36.5k|		size_t totalOptSize = 0;
  281|   176k|		while (!curOpt.isNull())
  ------------------
  |  Branch (281:10): [True: 140k, False: 36.5k]
  ------------------
  282|   140k|		{
  283|   140k|			totalOptSize += curOpt.getTotalSize();
  284|   140k|			curOpt = getNextTcpOption(curOpt);
  285|   140k|		}
  286|  36.5k|		totalOptSize += newOption.getTotalSize();
  287|       |
  288|  36.5k|		size_t sizeToExtend = newOption.getTotalSize();
  289|       |
  290|  36.5k|		if (!extendLayer(offset, sizeToExtend))
  ------------------
  |  Branch (290:7): [True: 0, False: 36.5k]
  ------------------
  291|      0|		{
  292|      0|			PCPP_LOG_ERROR("Could not extend TcpLayer in [" << sizeToExtend << "] bytes");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTcpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTcpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  293|      0|			newOption.purgeRecordData();
  294|      0|			return TcpOption(nullptr);
  295|      0|		}
  296|       |
  297|  36.5k|		memcpy(m_Data + offset, newOption.getRecordBasePtr(), newOption.getTotalSize());
  298|       |
  299|  36.5k|		newOption.purgeRecordData();
  300|       |
  301|  36.5k|		adjustTcpOptionTrailer(totalOptSize);
  302|       |
  303|  36.5k|		m_OptionReader.changeTLVRecordCount(1);
  304|       |
  305|  36.5k|		uint8_t* newOptPtr = m_Data + offset;
  306|       |
  307|  36.5k|		return TcpOption(newOptPtr);
  308|  36.5k|	}
_ZN4pcpp8TcpLayer22adjustTcpOptionTrailerEm:
  311|  36.5k|	{
  312|  36.5k|		int newNumberOfTrailingBytes = 0;
  313|   143k|		while ((totalOptSize + newNumberOfTrailingBytes) % 4 != 0)
  ------------------
  |  Branch (313:10): [True: 107k, False: 36.5k]
  ------------------
  314|   107k|			newNumberOfTrailingBytes++;
  315|       |
  316|  36.5k|		if (newNumberOfTrailingBytes < m_NumOfTrailingBytes)
  ------------------
  |  Branch (316:7): [True: 0, False: 36.5k]
  ------------------
  317|      0|			shortenLayer(sizeof(tcphdr) + totalOptSize, m_NumOfTrailingBytes - newNumberOfTrailingBytes - 1);
  318|  36.5k|		else if (newNumberOfTrailingBytes > m_NumOfTrailingBytes)
  ------------------
  |  Branch (318:12): [True: 36.3k, False: 146]
  ------------------
  319|  36.3k|			extendLayer(sizeof(tcphdr) + totalOptSize, newNumberOfTrailingBytes - m_NumOfTrailingBytes);
  320|       |
  321|  36.5k|		m_NumOfTrailingBytes = newNumberOfTrailingBytes;
  322|       |
  323|   143k|		for (int i = 0; i < m_NumOfTrailingBytes; i++)
  ------------------
  |  Branch (323:19): [True: 107k, False: 36.5k]
  ------------------
  324|   107k|			m_Data[sizeof(tcphdr) + totalOptSize + i] = TcpOptionDummy;
  325|       |
  326|  36.5k|		getTcpHeader()->dataOffset = (sizeof(tcphdr) + totalOptSize + m_NumOfTrailingBytes) / 4;
  327|  36.5k|	}
_ZN4pcpp8TcpLayer17calculateChecksumEb:
  330|  88.9k|	{
  331|  88.9k|		tcphdr* tcpHdr = getTcpHeader();
  332|  88.9k|		uint16_t checksumRes = 0;
  333|  88.9k|		const uint16_t currChecksumValue = tcpHdr->headerChecksum;
  334|       |
  335|  88.9k|		if (m_PrevLayer != nullptr)
  ------------------
  |  Branch (335:7): [True: 88.9k, False: 0]
  ------------------
  336|  88.9k|		{
  337|  88.9k|			tcpHdr->headerChecksum = 0;
  338|  88.9k|			PCPP_LOG_DEBUG("TCP data len = " << m_DataLen);
  ------------------
  |  |  427|  88.9k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  88.9k|	do                                                                                                                 \
  |  |  |  |  415|  88.9k|	{                                                                                                                  \
  |  |  |  |  416|  88.9k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  88.9k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  88.9k|#define LOG_MODULE PacketLogModuleTcpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 88.9k]
  |  |  |  |  ------------------
  |  |  |  |  418|  88.9k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTcpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  88.9k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 88.9k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  339|       |
  340|  88.9k|			if (m_PrevLayer->getProtocol() == IPv4)
  ------------------
  |  Branch (340:8): [True: 72.4k, False: 16.5k]
  ------------------
  341|  72.4k|			{
  342|  72.4k|				const IPv4Address srcIP = static_cast<IPv4Layer*>(m_PrevLayer)->getSrcIPv4Address();
  343|  72.4k|				const IPv4Address dstIP = static_cast<IPv4Layer*>(m_PrevLayer)->getDstIPv4Address();
  344|       |
  345|  72.4k|				checksumRes =
  346|  72.4k|				    pcpp::computePseudoHdrChecksum(reinterpret_cast<uint8_t*>(tcpHdr), getDataLen(),
  347|  72.4k|				                                   IPAddress::IPv4AddressType, PACKETPP_IPPROTO_TCP, srcIP, dstIP);
  348|       |
  349|  72.4k|				PCPP_LOG_DEBUG("calculated IPv4 TCP checksum = 0x" << std::uppercase << std::hex << checksumRes);
  ------------------
  |  |  427|  72.4k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  72.4k|	do                                                                                                                 \
  |  |  |  |  415|  72.4k|	{                                                                                                                  \
  |  |  |  |  416|  72.4k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  72.4k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  72.4k|#define LOG_MODULE PacketLogModuleTcpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 72.4k]
  |  |  |  |  ------------------
  |  |  |  |  418|  72.4k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTcpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  72.4k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 72.4k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  350|  72.4k|			}
  351|  16.5k|			else if (m_PrevLayer->getProtocol() == IPv6)
  ------------------
  |  Branch (351:13): [True: 16.5k, False: 0]
  ------------------
  352|  16.5k|			{
  353|  16.5k|				const IPv6Address srcIP = static_cast<IPv6Layer*>(m_PrevLayer)->getSrcIPv6Address();
  354|  16.5k|				const IPv6Address dstIP = static_cast<IPv6Layer*>(m_PrevLayer)->getDstIPv6Address();
  355|       |
  356|  16.5k|				checksumRes = computePseudoHdrChecksum(reinterpret_cast<uint8_t*>(tcpHdr), getDataLen(),
  357|  16.5k|				                                       IPAddress::IPv6AddressType, PACKETPP_IPPROTO_TCP, srcIP, dstIP);
  358|       |
  359|  16.5k|				PCPP_LOG_DEBUG("calculated IPv6 TCP checksum = 0xX" << std::uppercase << std::hex << checksumRes);
  ------------------
  |  |  427|  16.5k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  16.5k|	do                                                                                                                 \
  |  |  |  |  415|  16.5k|	{                                                                                                                  \
  |  |  |  |  416|  16.5k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  16.5k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  16.5k|#define LOG_MODULE PacketLogModuleTcpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 16.5k]
  |  |  |  |  ------------------
  |  |  |  |  418|  16.5k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTcpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  16.5k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 16.5k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  360|  16.5k|			}
  361|  88.9k|		}
  362|       |
  363|  88.9k|		if (writeResultToPacket)
  ------------------
  |  Branch (363:7): [True: 88.9k, False: 0]
  ------------------
  364|  88.9k|			tcpHdr->headerChecksum = htobe16(checksumRes);
  365|      0|		else
  366|      0|			tcpHdr->headerChecksum = currChecksumValue;
  367|       |
  368|  88.9k|		return checksumRes;
  369|  88.9k|	}
_ZN4pcpp8TcpLayerC2EPhmPNS_5LayerEPNS_6PacketE:
  381|   471k|	    : Layer(data, dataLen, prevLayer, packet, TCP)
  382|   471k|	{
  383|   471k|		m_NumOfTrailingBytes = 0;
  384|   471k|	}
_ZN4pcpp8TcpLayer13copyLayerDataERKS0_:
  399|  88.9k|	{
  400|  88.9k|		m_OptionReader = other.m_OptionReader;
  401|  88.9k|		m_NumOfTrailingBytes = other.m_NumOfTrailingBytes;
  402|  88.9k|	}
_ZN4pcpp8TcpLayerC2ERKS0_:
  404|  88.9k|	TcpLayer::TcpLayer(const TcpLayer& other) : Layer(other)
  405|  88.9k|	{
  406|  88.9k|		copyLayerData(other);
  407|  88.9k|	}
_ZN4pcpp8TcpLayer14parseNextLayerEv:
  419|   471k|	{
  420|   471k|		const size_t headerLen = getHeaderLen();
  421|   471k|		if (m_DataLen <= headerLen)
  ------------------
  |  Branch (421:7): [True: 59.5k, False: 412k]
  ------------------
  422|  59.5k|			return;
  423|       |
  424|   412k|		uint8_t* payload = m_Data + headerLen;
  425|   412k|		const size_t payloadLen = m_DataLen - headerLen;
  426|   412k|		const uint16_t portDst = getDstPort();
  427|   412k|		const uint16_t portSrc = getSrcPort();
  428|   412k|		const char* payloadChar = reinterpret_cast<const char*>(payload);
  429|       |
  430|   412k|		if (HttpMessage::isHttpPort(portDst) &&
  ------------------
  |  Branch (430:7): [True: 55.4k, False: 356k]
  ------------------
  431|  55.4k|		    HttpRequestFirstLine::parseMethod(payloadChar, payloadLen) != HttpRequestLayer::HttpMethodUnknown)
  ------------------
  |  Branch (431:7): [True: 43.9k, False: 11.5k]
  ------------------
  432|  43.9k|		{
  433|  43.9k|			constructNextLayer<HttpRequestLayer>(payload, payloadLen, getAttachedPacket());
  434|  43.9k|		}
  435|   368k|		else if (HttpMessage::isHttpPort(portSrc) &&
  ------------------
  |  Branch (435:12): [True: 19.1k, False: 349k]
  |  Branch (435:12): [True: 11.3k, False: 357k]
  ------------------
  436|  19.1k|		         HttpResponseFirstLine::parseVersion(payloadChar, payloadLen) != HttpVersion::HttpVersionUnknown &&
  ------------------
  |  Branch (436:12): [True: 11.4k, False: 7.73k]
  ------------------
  437|  11.4k|		         !HttpResponseFirstLine::parseStatusCode(payloadChar, payloadLen).isUnsupportedCode())
  ------------------
  |  Branch (437:12): [True: 11.3k, False: 91]
  ------------------
  438|  11.3k|		{
  439|  11.3k|			constructNextLayer<HttpResponseLayer>(payload, payloadLen, getAttachedPacket());
  440|  11.3k|		}
  441|   357k|		else if (SSLLayer::IsSSLMessage(portSrc, portDst, payload, payloadLen))
  ------------------
  |  Branch (441:12): [True: 135k, False: 221k]
  ------------------
  442|   135k|		{
  443|   135k|			constructNextLayerFromFactory(SSLLayer::createSSLMessage, payload, payloadLen);
  444|   135k|		}
  445|   221k|		else if (SipLayer::isSipPort(portDst) || SipLayer::isSipPort(portSrc))
  ------------------
  |  Branch (445:12): [True: 3.06k, False: 218k]
  |  Branch (445:44): [True: 0, False: 218k]
  ------------------
  446|  3.06k|		{
  447|  3.06k|			if (SipRequestFirstLine::parseMethod(payloadChar, payloadLen) != SipRequestLayer::SipMethodUnknown)
  ------------------
  |  Branch (447:8): [True: 0, False: 3.06k]
  ------------------
  448|      0|			{
  449|      0|				constructNextLayer<SipRequestLayer>(payload, payloadLen, getAttachedPacket());
  450|      0|			}
  451|  3.06k|			else if (SipResponseFirstLine::parseStatusCode(payloadChar, payloadLen) !=
  ------------------
  |  Branch (451:13): [True: 2.72k, False: 331]
  ------------------
  452|  3.06k|			         SipResponseLayer::SipStatusCodeUnknown)
  453|  2.72k|			{
  454|  2.72k|				constructNextLayer<SipResponseLayer>(payload, payloadLen, getAttachedPacket());
  455|  2.72k|			}
  456|    331|			else
  457|    331|			{
  458|    331|				constructNextLayer<PayloadLayer>(payload, payloadLen, getAttachedPacket());
  459|    331|			}
  460|  3.06k|		}
  461|   218k|		else if (BgpLayer::isBgpPort(portSrc, portDst))
  ------------------
  |  Branch (461:12): [True: 34.3k, False: 184k]
  ------------------
  462|  34.3k|		{
  463|  34.3k|			tryConstructNextLayerFromFactoryWithFallback<PayloadLayer>(BgpLayer::parseBgpLayer, payload, payloadLen);
  464|  34.3k|		}
  465|   184k|		else if (SSHLayer::isSSHPort(portSrc, portDst))
  ------------------
  |  Branch (465:12): [True: 17.1k, False: 166k]
  ------------------
  466|  17.1k|		{
  467|  17.1k|			constructNextLayerFromFactory(SSHLayer::createSSHMessage, payload, payloadLen);
  468|  17.1k|		}
  469|   166k|		else if (DnsLayer::isDataValid(payload, payloadLen, true) &&
  ------------------
  |  Branch (469:12): [True: 115k, False: 51.3k]
  ------------------
  470|   115k|		         (DnsLayer::isDnsPort(portDst) || DnsLayer::isDnsPort(portSrc)))
  ------------------
  |  Branch (470:13): [True: 2.47k, False: 113k]
  |  Branch (470:45): [True: 295, False: 112k]
  ------------------
  471|  2.77k|		{
  472|  2.77k|			constructNextLayer<DnsOverTcpLayer>(payload, payloadLen, getAttachedPacket());
  473|  2.77k|		}
  474|   164k|		else if (TelnetLayer::isDataValid(payload, payloadLen) &&
  ------------------
  |  Branch (474:12): [True: 164k, False: 0]
  ------------------
  475|   164k|		         (TelnetLayer::isTelnetPort(portDst) || TelnetLayer::isTelnetPort(portSrc)))
  ------------------
  |  Branch (475:13): [True: 9.65k, False: 154k]
  |  Branch (475:51): [True: 171, False: 154k]
  ------------------
  476|  9.82k|		{
  477|  9.82k|			constructNextLayer<TelnetLayer>(payload, payloadLen, getAttachedPacket());
  478|  9.82k|		}
  479|   154k|		else if (FtpLayer::isFtpPort(portSrc) && FtpLayer::isDataValid(payload, payloadLen))
  ------------------
  |  Branch (479:12): [True: 13.6k, False: 140k]
  |  Branch (479:44): [True: 12.8k, False: 787]
  ------------------
  480|  12.8k|		{
  481|  12.8k|			constructNextLayer<FtpResponseLayer>(payload, payloadLen, getAttachedPacket());
  482|  12.8k|		}
  483|   141k|		else if (FtpLayer::isFtpPort(portDst) && FtpLayer::isDataValid(payload, payloadLen))
  ------------------
  |  Branch (483:12): [True: 6.91k, False: 134k]
  |  Branch (483:44): [True: 6.65k, False: 260]
  ------------------
  484|  6.65k|		{
  485|  6.65k|			constructNextLayer<FtpRequestLayer>(payload, payloadLen, getAttachedPacket());
  486|  6.65k|		}
  487|   134k|		else if (FtpLayer::isFtpDataPort(portSrc) || FtpLayer::isFtpDataPort(portDst))
  ------------------
  |  Branch (487:12): [True: 332, False: 134k]
  |  Branch (487:48): [True: 1.10k, False: 133k]
  ------------------
  488|  1.43k|		{
  489|  1.43k|			constructNextLayer<FtpDataLayer>(payload, payloadLen, getAttachedPacket());
  490|  1.43k|		}
  491|   133k|		else if ((DoIpLayer::isDoIpPort(portSrc) || DoIpLayer::isDoIpPort(portDst)) &&
  ------------------
  |  Branch (491:13): [True: 5, False: 133k]
  |  Branch (491:47): [True: 0, False: 133k]
  ------------------
  492|      5|		         (DoIpLayer::isDataValid(payload, payloadLen)))
  ------------------
  |  Branch (492:12): [True: 0, False: 5]
  ------------------
  493|      0|		{
  494|      0|			tryConstructNextLayerFromFactoryWithFallback<PayloadLayer>(DoIpLayer::parseDoIpLayer, payload, payloadLen);
  495|      0|		}
  496|   133k|		else if (SomeIpLayer::isSomeIpPort(portSrc) || SomeIpLayer::isSomeIpPort(portDst))
  ------------------
  |  Branch (496:12): [True: 25, False: 133k]
  |  Branch (496:50): [True: 255, False: 133k]
  ------------------
  497|    280|		{
  498|    280|			constructNextLayerFromFactory(SomeIpLayer::parseSomeIpLayer, payload, payloadLen);
  499|    280|		}
  500|   133k|		else if (TpktLayer::isDataValid(payload, payloadLen) && TpktLayer::isTpktPort(portSrc, portDst))
  ------------------
  |  Branch (500:12): [True: 127k, False: 5.28k]
  |  Branch (500:59): [True: 14.8k, False: 113k]
  ------------------
  501|  14.8k|		{
  502|  14.8k|			constructNextLayer<TpktLayer>(payload, payloadLen, getAttachedPacket());
  503|  14.8k|		}
  504|   118k|		else if (SmtpLayer::isSmtpPort(portSrc) && SmtpLayer::isDataValid(payload, payloadLen))
  ------------------
  |  Branch (504:12): [True: 7.60k, False: 110k]
  |  Branch (504:46): [True: 5.60k, False: 2.00k]
  ------------------
  505|  5.60k|		{
  506|  5.60k|			constructNextLayer<SmtpResponseLayer>(payload, payloadLen, getAttachedPacket());
  507|  5.60k|		}
  508|   112k|		else if (SmtpLayer::isSmtpPort(portDst) && SmtpLayer::isDataValid(payload, payloadLen))
  ------------------
  |  Branch (508:12): [True: 12.1k, False: 100k]
  |  Branch (508:46): [True: 10.3k, False: 1.74k]
  ------------------
  509|  10.3k|		{
  510|  10.3k|			constructNextLayer<SmtpRequestLayer>(payload, payloadLen, getAttachedPacket());
  511|  10.3k|		}
  512|   102k|		else if (LdapLayer::isLdapPort(portDst) || LdapLayer::isLdapPort(portSrc))
  ------------------
  |  Branch (512:12): [True: 10, False: 102k]
  |  Branch (512:46): [True: 1.99k, False: 100k]
  ------------------
  513|  2.00k|		{
  514|  2.00k|			tryConstructNextLayerFromFactoryWithFallback<PayloadLayer>(LdapLayer::parseLdapMessage, payload,
  515|  2.00k|			                                                           payloadLen);
  516|  2.00k|		}
  517|   100k|		else if (PostgresLayer::isPostgresPort(portDst))
  ------------------
  |  Branch (517:12): [True: 1.82k, False: 98.5k]
  ------------------
  518|  1.82k|		{
  519|  1.82k|			tryConstructNextLayerFromFactoryWithFallback<PayloadLayer>(PostgresLayer::parsePostgresFrontendMessages,
  520|  1.82k|			                                                           payload, payloadLen);
  521|  1.82k|		}
  522|  98.5k|		else if (PostgresLayer::isPostgresPort(portSrc))
  ------------------
  |  Branch (522:12): [True: 299, False: 98.2k]
  ------------------
  523|    299|		{
  524|    299|			tryConstructNextLayerFromFactoryWithFallback<PayloadLayer>(PostgresLayer::parsePostgresBackendMessages,
  525|    299|			                                                           payload, payloadLen);
  526|    299|		}
  527|  98.2k|		else if (MySqlLayer::isMySqlPort(portSrc))
  ------------------
  |  Branch (527:12): [True: 4.32k, False: 93.9k]
  ------------------
  528|  4.32k|		{
  529|  4.32k|			tryConstructNextLayerFromFactoryWithFallback<PayloadLayer>(MySqlLayer::parseMySqlServerMessage, payload,
  530|  4.32k|			                                                           payloadLen);
  531|  4.32k|		}
  532|  93.9k|		else if (MySqlLayer::isMySqlPort(portDst))
  ------------------
  |  Branch (532:12): [True: 11.2k, False: 82.6k]
  ------------------
  533|  11.2k|		{
  534|  11.2k|			tryConstructNextLayerFromFactoryWithFallback<PayloadLayer>(MySqlLayer::parseMySqlClientMessage, payload,
  535|  11.2k|			                                                           payloadLen);
  536|  11.2k|		}
  537|  82.6k|		else if ((GtpV2Layer::isGTPv2Port(portDst) || GtpV2Layer::isGTPv2Port(portSrc)) &&
  ------------------
  |  Branch (537:13): [True: 20, False: 82.6k]
  |  Branch (537:49): [True: 0, False: 82.6k]
  ------------------
  538|     20|		         GtpV2Layer::isDataValid(payload, payloadLen))
  ------------------
  |  Branch (538:12): [True: 0, False: 20]
  ------------------
  539|      0|		{
  540|      0|			constructNextLayer<GtpV2Layer>(payload, payloadLen, getAttachedPacket());
  541|      0|		}
  542|  82.6k|		else if (ModbusLayer::isModbusPort(portDst) && ModbusLayer::isDataValid(payload, payloadLen))
  ------------------
  |  Branch (542:12): [True: 1.68k, False: 80.9k]
  |  Branch (542:50): [True: 1.68k, False: 0]
  ------------------
  543|  1.68k|		{
  544|  1.68k|			constructNextLayer<ModbusLayer>(payload, payloadLen, getAttachedPacket());
  545|  1.68k|		}
  546|  80.9k|		else
  547|  80.9k|		{
  548|  80.9k|			constructNextLayer<PayloadLayer>(payload, payloadLen, getAttachedPacket());
  549|  80.9k|		}
  550|   412k|	}
_ZN4pcpp8TcpLayer22computeCalculateFieldsEv:
  553|  88.9k|	{
  554|  88.9k|		tcphdr* tcpHdr = getTcpHeader();
  555|       |
  556|  88.9k|		tcpHdr->dataOffset = getHeaderLen() >> 2;
  557|  88.9k|		calculateChecksum(true);
  558|  88.9k|	}
_ZNK4pcpp8TcpLayer8toStringEv:
  561|   177k|	{
  562|   177k|		const tcphdr* hdr = getTcpHeader();
  563|   177k|		std::string result = "TCP Layer, ";
  564|   177k|		if (hdr->synFlag)
  ------------------
  |  Branch (564:7): [True: 15.7k, False: 162k]
  ------------------
  565|  15.7k|		{
  566|  15.7k|			if (hdr->ackFlag)
  ------------------
  |  Branch (566:8): [True: 7.48k, False: 8.29k]
  ------------------
  567|  7.48k|				result += "[SYN, ACK], ";
  568|  8.29k|			else
  569|  8.29k|				result += "[SYN], ";
  570|  15.7k|		}
  571|   162k|		else if (hdr->finFlag)
  ------------------
  |  Branch (571:12): [True: 9.14k, False: 153k]
  ------------------
  572|  9.14k|		{
  573|  9.14k|			if (hdr->ackFlag)
  ------------------
  |  Branch (573:8): [True: 7.08k, False: 2.05k]
  ------------------
  574|  7.08k|				result += "[FIN, ACK], ";
  575|  2.05k|			else
  576|  2.05k|				result += "[FIN], ";
  577|  9.14k|		}
  578|   153k|		else if (hdr->ackFlag)
  ------------------
  |  Branch (578:12): [True: 150k, False: 3.02k]
  ------------------
  579|   150k|			result += "[ACK], ";
  580|       |
  581|   177k|		std::ostringstream srcPortStream;
  582|   177k|		srcPortStream << getSrcPort();
  583|   177k|		std::ostringstream dstPortStream;
  584|   177k|		dstPortStream << getDstPort();
  585|   177k|		result += "Src port: " + srcPortStream.str() + ", Dst port: " + dstPortStream.str();
  586|       |
  587|   177k|		return result;
  588|   177k|	}

_ZN4pcpp11TelnetLayer17distanceToNextIACEPhm:
  118|  22.2M|	{
  119|  22.2M|		auto beginIt = startPos;
  120|  22.2M|		auto endIt = startPos + maxLength;
  121|  22.2M|		auto nextIacIt = findNextIAC(beginIt, endIt);
  122|  22.2M|		return std::distance(beginIt, nextIacIt);
  123|  22.2M|	}
_ZN4pcpp11TelnetLayer11getFieldLenEPhm:
  126|  44.5M|	{
  127|       |		// Check first byte is IAC
  128|  44.5M|		if (startPos && (startPos[0] == static_cast<int>(TelnetCommand::InterpretAsCommand)) && (maxLength >= 2))
  ------------------
  |  Branch (128:7): [True: 44.5M, False: 0]
  |  Branch (128:19): [True: 32.6M, False: 11.8M]
  |  Branch (128:91): [True: 32.6M, False: 0]
  ------------------
  129|  32.6M|		{
  130|       |			// If subnegotiation parse until next IAC
  131|  32.6M|			if (startPos[1] == static_cast<int>(TelnetCommand::Subnegotiation))
  ------------------
  |  Branch (131:8): [True: 10.3M, False: 22.2M]
  ------------------
  132|  10.3M|				return distanceToNextIAC(startPos, maxLength);
  133|       |			// Only WILL, WONT, DO, DONT have option. Ref http://pcmicro.com/netfoss/telnet.html
  134|  22.2M|			else if (startPos[1] >= static_cast<int>(TelnetCommand::WillPerform) &&
  ------------------
  |  Branch (134:13): [True: 7.63M, False: 14.6M]
  ------------------
  135|  7.63M|			         startPos[1] <= static_cast<int>(TelnetCommand::DontPerform))
  ------------------
  |  Branch (135:13): [True: 4.57M, False: 3.05M]
  ------------------
  136|  4.57M|				return std::min<size_t>(3, maxLength);
  137|  17.6M|			return 2;
  138|  32.6M|		}
  139|  11.8M|		return distanceToNextIAC(startPos, maxLength);
  140|  44.5M|	}
_ZN4pcpp11TelnetLayer16getNextDataFieldEPhm:
  143|  11.3k|	{
  144|       |		// This assumes `pos` points to the start of a valid field.
  145|  11.3k|		auto const endIt = pos + len;
  146|       |
  147|       |		// Advance to the next field, as we are skipping the current one from the search.
  148|  11.3k|		pos += getFieldLen(pos, len);
  149|       |
  150|  38.3k|		while (pos < endIt)
  ------------------
  |  Branch (150:10): [True: 35.9k, False: 2.44k]
  ------------------
  151|  35.9k|		{
  152|       |			// Check if the current field is data
  153|  35.9k|			switch (getTelnetSequenceType(pos, std::distance(pos, endIt)))
  154|  35.9k|			{
  155|     35|			case TelnetSequenceType::Unknown:
  ------------------
  |  Branch (155:4): [True: 35, False: 35.9k]
  ------------------
  156|     35|			{
  157|     35|				PCPP_LOG_DEBUG("Telnet Parse Error: Unknown sequence found during data field search.");
  ------------------
  |  |  427|     35|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|     35|	do                                                                                                                 \
  |  |  |  |  415|     35|	{                                                                                                                  \
  |  |  |  |  416|     35|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|     35|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|     35|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 35]
  |  |  |  |  ------------------
  |  |  |  |  418|     35|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|     35|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 35]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  158|     35|				return nullptr;
  159|      0|			}
  160|  8.91k|			case TelnetSequenceType::UserData:
  ------------------
  |  Branch (160:4): [True: 8.91k, False: 27.0k]
  ------------------
  161|  8.91k|				return pos;
  162|  26.9k|			default:
  ------------------
  |  Branch (162:4): [True: 26.9k, False: 8.95k]
  ------------------
  163|  26.9k|				break;  // continue searching
  164|  35.9k|			}
  165|       |
  166|       |			// If not data, move to next field
  167|  26.9k|			pos += getFieldLen(pos, std::distance(pos, endIt));
  168|  26.9k|		}
  169|       |
  170|       |		// If we got here, no data field has been found before the end of the buffer
  171|  2.44k|		return nullptr;
  172|  11.3k|	}
_ZN4pcpp11TelnetLayer19getNextCommandFieldEPhm:
  175|  29.5M|	{
  176|       |		// This assumes `pos` points to the start of a valid field.
  177|  29.5M|		auto const endIt = pos + len;
  178|       |
  179|       |		// Advance to the next field, as we are skipping the current one from the search.
  180|  29.5M|		pos += getFieldLen(pos, len);
  181|       |
  182|  44.3M|		while (pos < endIt)
  ------------------
  |  Branch (182:10): [True: 44.3M, False: 34.3k]
  ------------------
  183|  44.3M|		{
  184|       |			// Check if the current field is command
  185|  44.3M|			switch (getTelnetSequenceType(pos, std::distance(pos, endIt)))
  186|  44.3M|			{
  187|  2.86k|			case TelnetSequenceType::Unknown:
  ------------------
  |  Branch (187:4): [True: 2.86k, False: 44.3M]
  ------------------
  188|  2.86k|			{
  189|  2.86k|				PCPP_LOG_DEBUG("Telnet Parse Error: Unknown sequence found during command field search.");
  ------------------
  |  |  427|  2.86k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  2.86k|	do                                                                                                                 \
  |  |  |  |  415|  2.86k|	{                                                                                                                  \
  |  |  |  |  416|  2.86k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  2.86k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  2.86k|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 2.86k]
  |  |  |  |  ------------------
  |  |  |  |  418|  2.86k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  2.86k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 2.86k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  190|  2.86k|				return nullptr;
  191|      0|			}
  192|  29.4M|			case TelnetSequenceType::Command:
  ------------------
  |  Branch (192:4): [True: 29.4M, False: 14.8M]
  ------------------
  193|  29.4M|				return pos;
  194|  14.8M|			default:
  ------------------
  |  Branch (194:4): [True: 14.8M, False: 29.4M]
  ------------------
  195|  14.8M|				break;  // continue searching
  196|  44.3M|			}
  197|       |
  198|       |			// If not command, move to next field
  199|  14.8M|			pos += getFieldLen(pos, std::distance(pos, endIt));
  200|  14.8M|		}
  201|       |
  202|       |		// If we got here, no command field has been found before the end of the buffer
  203|  34.3k|		return nullptr;
  204|  29.5M|	}
_ZN4pcpp11TelnetLayer13getSubCommandEPhm:
  207|  65.9k|	{
  208|  65.9k|		if (len < 3 || pos[1] < static_cast<int>(TelnetCommand::Subnegotiation))
  ------------------
  |  Branch (208:7): [True: 42.4k, False: 23.5k]
  |  Branch (208:18): [True: 0, False: 23.5k]
  ------------------
  209|  42.4k|			return static_cast<int>(TelnetOption::TelnetOptionNoOption);
  210|  23.5k|		return pos[2];
  211|  65.9k|	}
_ZN4pcpp11TelnetLayer14getCommandDataEPhRm:
  214|  65.9k|	{
  215|  65.9k|		if (pos[1] == static_cast<int>(TelnetCommand::Subnegotiation) && len > 3)
  ------------------
  |  Branch (215:7): [True: 17.3k, False: 48.5k]
  |  Branch (215:68): [True: 8.94k, False: 8.43k]
  ------------------
  216|  8.94k|		{
  217|  8.94k|			len -= 3;
  218|  8.94k|			return &pos[3];
  219|  8.94k|		}
  220|  56.9k|		len = 0;
  221|  56.9k|		return nullptr;
  222|  65.9k|	}
_ZN4pcpp11TelnetLayer15getDataAsStringEb:
  225|  34.7k|	{
  226|  34.7k|		if (m_Data == nullptr)
  ------------------
  |  Branch (226:7): [True: 0, False: 34.7k]
  ------------------
  227|      0|		{
  228|      0|			PCPP_LOG_DEBUG("Layer does not have data");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  229|      0|			return {};
  230|      0|		}
  231|       |
  232|       |		// Convert to string
  233|  34.7k|		if (removeEscapeCharacters)
  ------------------
  |  Branch (233:7): [True: 34.7k, False: 0]
  ------------------
  234|  34.7k|		{
  235|  34.7k|			uint8_t* dataPos = nullptr;
  236|  34.7k|			switch (getTelnetSequenceType(m_Data, m_DataLen))
  237|  34.7k|			{
  238|      0|			case TelnetSequenceType::Unknown:
  ------------------
  |  Branch (238:4): [True: 0, False: 34.7k]
  ------------------
  239|      0|			{
  240|      0|				PCPP_LOG_DEBUG("Telnet Parse Error: Unknown sequence found during data string extraction.");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  241|      0|				return {};
  242|      0|			}
  243|  23.3k|			case TelnetSequenceType::UserData:
  ------------------
  |  Branch (243:4): [True: 23.3k, False: 11.3k]
  ------------------
  244|  23.3k|				dataPos = m_Data;
  245|  23.3k|				break;
  246|  11.3k|			case TelnetSequenceType::Command:
  ------------------
  |  Branch (246:4): [True: 11.3k, False: 23.3k]
  ------------------
  247|  11.3k|				dataPos = getNextDataField(m_Data, m_DataLen);
  248|  11.3k|				break;
  249|      0|			default:
  ------------------
  |  Branch (249:4): [True: 0, False: 34.7k]
  ------------------
  250|      0|				throw std::logic_error("Unsupported sequence type");
  251|  34.7k|			}
  252|       |
  253|  34.7k|			if (!dataPos)
  ------------------
  |  Branch (253:8): [True: 2.48k, False: 32.2k]
  ------------------
  254|  2.48k|			{
  255|  2.48k|				PCPP_LOG_DEBUG("Packet does not have a data field");
  ------------------
  |  |  427|  2.48k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  2.48k|	do                                                                                                                 \
  |  |  |  |  415|  2.48k|	{                                                                                                                  \
  |  |  |  |  416|  2.48k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  2.48k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  2.48k|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 2.48k]
  |  |  |  |  ------------------
  |  |  |  |  418|  2.48k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  2.48k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 2.48k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  256|  2.48k|				return std::string();
  257|  2.48k|			}
  258|       |
  259|  32.2k|			PCPP_ASSERT(dataPos >= m_Data && dataPos < (m_Data + m_DataLen),
  ------------------
  |  |   47|  32.2k|#	define PCPP_ASSERT(condition, message) (void)0;
  ------------------
  260|  32.2k|			            "Data position is out of bounds, this should never happen!");
  261|       |
  262|       |			// End of range is corrected by the advance offset.
  263|  32.2k|			auto const* beginIt = dataPos;
  264|  32.2k|			auto const* endIt = dataPos + m_DataLen - std::distance(m_Data, dataPos);
  265|       |
  266|  32.2k|			std::string result;
  267|  32.2k|			std::copy_if(beginIt, endIt, std::back_inserter(result), [](char ch) -> bool {
  268|  32.2k|				return ch > 31 && ch < 127;  // From SPACE to ~
  269|  32.2k|			});
  270|  32.2k|			return result;
  271|  34.7k|		}
  272|      0|		return std::string(reinterpret_cast<char*>(m_Data), m_DataLen);
  273|  34.7k|	}
_ZN4pcpp11TelnetLayer24getTotalNumberOfCommandsEv:
  276|  1.79k|	{
  277|  1.79k|		size_t ctr = 0;
  278|  1.79k|		if (isTelnetCommand(m_Data, m_DataLen))
  ------------------
  |  Branch (278:7): [True: 765, False: 1.03k]
  ------------------
  279|    765|			++ctr;
  280|       |
  281|  1.79k|		uint8_t* pos = m_Data;
  282|  35.7k|		while (pos != nullptr)
  ------------------
  |  Branch (282:10): [True: 33.9k, False: 1.79k]
  ------------------
  283|  33.9k|		{
  284|  33.9k|			size_t offset = pos - m_Data;
  285|  33.9k|			pos = getNextCommandField(pos, m_DataLen - offset);
  286|  33.9k|			if (pos)
  ------------------
  |  Branch (286:8): [True: 32.1k, False: 1.79k]
  ------------------
  287|  32.1k|				++ctr;
  288|  33.9k|		}
  289|       |
  290|  1.79k|		return ctr;
  291|  1.79k|	}
_ZN4pcpp11TelnetLayer19getNumberOfCommandsENS0_13TelnetCommandE:
  294|  34.7k|	{
  295|  34.7k|		if (static_cast<int>(command) < 0)
  ------------------
  |  Branch (295:7): [True: 1.79k, False: 32.9k]
  ------------------
  296|  1.79k|			return 0;
  297|       |
  298|  32.9k|		size_t ctr = 0;
  299|  32.9k|		if (isTelnetCommand(m_Data, m_DataLen) && m_Data[1] == static_cast<int>(command))
  ------------------
  |  Branch (299:7): [True: 10.6k, False: 22.3k]
  |  Branch (299:45): [True: 2.87k, False: 7.76k]
  ------------------
  300|  2.87k|			++ctr;
  301|       |
  302|  32.9k|		uint8_t* pos = m_Data;
  303|  27.7M|		while (pos != nullptr)
  ------------------
  |  Branch (303:10): [True: 27.6M, False: 32.9k]
  ------------------
  304|  27.6M|		{
  305|  27.6M|			size_t offset = pos - m_Data;
  306|  27.6M|			pos = getNextCommandField(pos, m_DataLen - offset);
  307|  27.6M|			if (pos && pos[1] == static_cast<int>(command))
  ------------------
  |  Branch (307:8): [True: 27.6M, False: 32.9k]
  |  Branch (307:15): [True: 8.00M, False: 19.6M]
  ------------------
  308|  8.00M|				++ctr;
  309|  27.6M|		}
  310|       |
  311|  32.9k|		return ctr;
  312|  34.7k|	}
_ZN4pcpp11TelnetLayer15getFirstCommandEv:
  315|  1.79k|	{
  316|       |		// If starts with command
  317|  1.79k|		if (isTelnetCommand(m_Data, m_DataLen))
  ------------------
  |  Branch (317:7): [True: 765, False: 1.03k]
  ------------------
  318|    765|			return static_cast<TelnetCommand>(m_Data[1]);
  319|       |
  320|       |		// Check is there any command
  321|  1.03k|		uint8_t* pos = getNextCommandField(m_Data, m_DataLen);
  322|  1.03k|		if (pos)
  ------------------
  |  Branch (322:7): [True: 367, False: 665]
  ------------------
  323|    367|			return static_cast<TelnetCommand>(pos[1]);
  324|    665|		return TelnetCommand::TelnetCommandEndOfPacket;
  325|  1.03k|	}
_ZN4pcpp11TelnetLayer14getNextCommandEv:
  328|  34.7k|	{
  329|  34.7k|		if (lastPositionOffset == SIZE_MAX)
  ------------------
  |  Branch (329:7): [True: 1.79k, False: 32.9k]
  ------------------
  330|  1.79k|		{
  331|  1.79k|			lastPositionOffset = 0;
  332|  1.79k|			if (isTelnetCommand(m_Data, m_DataLen))
  ------------------
  |  Branch (332:8): [True: 765, False: 1.03k]
  ------------------
  333|    765|				return static_cast<TelnetLayer::TelnetCommand>(m_Data[1]);
  334|  1.79k|		}
  335|       |
  336|  33.9k|		uint8_t* pos = getNextCommandField(&m_Data[lastPositionOffset], m_DataLen - lastPositionOffset);
  337|  33.9k|		if (pos)
  ------------------
  |  Branch (337:7): [True: 32.1k, False: 1.79k]
  ------------------
  338|  32.1k|		{
  339|  32.1k|			lastPositionOffset = pos - m_Data;
  340|  32.1k|			return static_cast<TelnetLayer::TelnetCommand>(pos[1]);
  341|  32.1k|		}
  342|  1.79k|		lastPositionOffset = SIZE_MAX;
  343|  1.79k|		return TelnetCommand::TelnetCommandEndOfPacket;
  344|  33.9k|	}
_ZN4pcpp11TelnetLayer9getOptionEv:
  347|  34.7k|	{
  348|  34.7k|		if (lastPositionOffset < m_DataLen)
  ------------------
  |  Branch (348:7): [True: 32.9k, False: 1.79k]
  ------------------
  349|  32.9k|			return static_cast<TelnetOption>(getSubCommand(
  350|  32.9k|			    &m_Data[lastPositionOffset], getFieldLen(&m_Data[lastPositionOffset], m_DataLen - lastPositionOffset)));
  351|  1.79k|		return TelnetOption::TelnetOptionNoOption;
  352|  34.7k|	}
_ZN4pcpp11TelnetLayer9getOptionENS0_13TelnetCommandE:
  355|  34.7k|	{
  356|       |		// Check input
  357|  34.7k|		if (static_cast<int>(command) < 0)
  ------------------
  |  Branch (357:7): [True: 1.79k, False: 32.9k]
  ------------------
  358|  1.79k|		{
  359|  1.79k|			PCPP_LOG_ERROR("Command type can't be negative");
  ------------------
  |  |  445|  1.79k|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|  1.79k|	do                                                                                                                 \
  |  |  |  |  415|  1.79k|	{                                                                                                                  \
  |  |  |  |  416|  1.79k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  1.79k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.79k|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 1.79k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|  1.79k|		{                                                                                                              \
  |  |  |  |  419|  1.79k|			auto ctx =                                                                                                 \
  |  |  |  |  420|  1.79k|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.79k|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|  1.79k|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|  1.79k|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|  1.79k|		}                                                                                                              \
  |  |  |  |  424|  1.79k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 1.79k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  360|  1.79k|			return TelnetOption::TelnetOptionNoOption;
  361|  1.79k|		}
  362|       |
  363|  32.9k|		if (isTelnetCommand(m_Data, m_DataLen) && m_Data[1] == static_cast<int>(command))
  ------------------
  |  Branch (363:7): [True: 10.6k, False: 22.3k]
  |  Branch (363:45): [True: 2.87k, False: 7.76k]
  ------------------
  364|  2.87k|			return static_cast<TelnetOption>(getSubCommand(m_Data, getFieldLen(m_Data, m_DataLen)));
  365|       |
  366|  30.0k|		uint8_t* pos = m_Data;
  367|   876k|		while (pos != nullptr)
  ------------------
  |  Branch (367:10): [True: 876k, False: 0]
  ------------------
  368|   876k|		{
  369|   876k|			size_t offset = pos - m_Data;
  370|   876k|			pos = getNextCommandField(pos, m_DataLen - offset);
  371|       |
  372|   876k|			if (pos && pos[1] == static_cast<int>(command))
  ------------------
  |  Branch (372:8): [True: 876k, False: 0]
  |  Branch (372:15): [True: 30.0k, False: 846k]
  ------------------
  373|  30.0k|			{
  374|  30.0k|				offset = pos - m_Data;
  375|  30.0k|				return static_cast<TelnetOption>(getSubCommand(pos, getFieldLen(pos, m_DataLen - offset)));
  376|  30.0k|			}
  377|   876k|		}
  378|       |
  379|      0|		PCPP_LOG_DEBUG("Can't find requested command");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  380|      0|		return TelnetOption::TelnetOptionNoOption;
  381|  30.0k|	}
_ZN4pcpp11TelnetLayer13getOptionDataERm:
  384|  34.7k|	{
  385|  34.7k|		if (lastPositionOffset < m_DataLen)
  ------------------
  |  Branch (385:7): [True: 32.9k, False: 1.79k]
  ------------------
  386|  32.9k|		{
  387|  32.9k|			size_t lenBuffer = getFieldLen(&m_Data[lastPositionOffset], m_DataLen - lastPositionOffset);
  388|  32.9k|			uint8_t* posBuffer = getCommandData(&m_Data[lastPositionOffset], lenBuffer);
  389|       |
  390|  32.9k|			length = lenBuffer;
  391|  32.9k|			return posBuffer;
  392|  32.9k|		}
  393|  1.79k|		return nullptr;
  394|  34.7k|	}
_ZN4pcpp11TelnetLayer13getOptionDataENS0_13TelnetCommandERm:
  397|  34.7k|	{
  398|       |		// Check input
  399|  34.7k|		if (static_cast<int>(command) < 0)
  ------------------
  |  Branch (399:7): [True: 1.79k, False: 32.9k]
  ------------------
  400|  1.79k|		{
  401|  1.79k|			PCPP_LOG_ERROR("Command type can't be negative");
  ------------------
  |  |  445|  1.79k|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|  1.79k|	do                                                                                                                 \
  |  |  |  |  415|  1.79k|	{                                                                                                                  \
  |  |  |  |  416|  1.79k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  1.79k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.79k|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 1.79k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|  1.79k|		{                                                                                                              \
  |  |  |  |  419|  1.79k|			auto ctx =                                                                                                 \
  |  |  |  |  420|  1.79k|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.79k|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|  1.79k|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|  1.79k|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|  1.79k|		}                                                                                                              \
  |  |  |  |  424|  1.79k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 1.79k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  402|  1.79k|			length = 0;
  403|  1.79k|			return nullptr;
  404|  1.79k|		}
  405|       |
  406|  32.9k|		if (isTelnetCommand(m_Data, m_DataLen) && m_Data[1] == static_cast<int>(command))
  ------------------
  |  Branch (406:7): [True: 10.6k, False: 22.3k]
  |  Branch (406:45): [True: 2.87k, False: 7.76k]
  ------------------
  407|  2.87k|		{
  408|  2.87k|			size_t lenBuffer = getFieldLen(m_Data, m_DataLen);
  409|  2.87k|			uint8_t* posBuffer = getCommandData(m_Data, lenBuffer);
  410|       |
  411|  2.87k|			length = lenBuffer;
  412|  2.87k|			return posBuffer;
  413|  2.87k|		}
  414|       |
  415|  30.0k|		uint8_t* pos = m_Data;
  416|   876k|		while (pos != nullptr)
  ------------------
  |  Branch (416:10): [True: 876k, False: 0]
  ------------------
  417|   876k|		{
  418|   876k|			size_t offset = pos - m_Data;
  419|   876k|			pos = getNextCommandField(pos, m_DataLen - offset);
  420|       |
  421|   876k|			if (pos && pos[1] == static_cast<int>(command))
  ------------------
  |  Branch (421:8): [True: 876k, False: 0]
  |  Branch (421:15): [True: 30.0k, False: 846k]
  ------------------
  422|  30.0k|			{
  423|  30.0k|				offset = pos - m_Data;
  424|  30.0k|				size_t lenBuffer = getFieldLen(pos, m_DataLen - offset);
  425|  30.0k|				uint8_t* posBuffer = getCommandData(pos, lenBuffer);
  426|       |
  427|  30.0k|				length = lenBuffer;
  428|  30.0k|				return posBuffer;
  429|  30.0k|			}
  430|   876k|		}
  431|       |
  432|      0|		PCPP_LOG_DEBUG("Can't find requested command");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  433|      0|		length = 0;
  434|      0|		return nullptr;
  435|  30.0k|	}
_ZN4pcpp11TelnetLayer24getTelnetCommandAsStringENS0_13TelnetCommandE:
  438|  34.7k|	{
  439|  34.7k|		switch (val)
  440|  34.7k|		{
  441|  1.79k|		case TelnetCommand::TelnetCommandEndOfPacket:
  ------------------
  |  Branch (441:3): [True: 1.79k, False: 32.9k]
  ------------------
  442|  1.79k|			return "Reached end of packet while parsing";
  443|     83|		case TelnetCommand::EndOfFile:
  ------------------
  |  Branch (443:3): [True: 83, False: 34.6k]
  ------------------
  444|     83|			return "End of File";
  445|    485|		case TelnetCommand::Suspend:
  ------------------
  |  Branch (445:3): [True: 485, False: 34.2k]
  ------------------
  446|    485|			return "Suspend current process";
  447|    400|		case TelnetCommand::Abort:
  ------------------
  |  Branch (447:3): [True: 400, False: 34.3k]
  ------------------
  448|    400|			return "Abort Process";
  449|  1.15k|		case TelnetCommand::EndOfRecordCommand:
  ------------------
  |  Branch (449:3): [True: 1.15k, False: 33.6k]
  ------------------
  450|  1.15k|			return "End of Record";
  451|  1.01k|		case TelnetCommand::SubnegotiationEnd:
  ------------------
  |  Branch (451:3): [True: 1.01k, False: 33.7k]
  ------------------
  452|  1.01k|			return "Subnegotiation End";
  453|     12|		case TelnetCommand::NoOperation:
  ------------------
  |  Branch (453:3): [True: 12, False: 34.7k]
  ------------------
  454|     12|			return "No Operation";
  455|     49|		case TelnetCommand::DataMark:
  ------------------
  |  Branch (455:3): [True: 49, False: 34.7k]
  ------------------
  456|     49|			return "Data Mark";
  457|    300|		case TelnetCommand::Break:
  ------------------
  |  Branch (457:3): [True: 300, False: 34.4k]
  ------------------
  458|    300|			return "Break";
  459|    330|		case TelnetCommand::InterruptProcess:
  ------------------
  |  Branch (459:3): [True: 330, False: 34.4k]
  ------------------
  460|    330|			return "Interrupt Process";
  461|     18|		case TelnetCommand::AbortOutput:
  ------------------
  |  Branch (461:3): [True: 18, False: 34.7k]
  ------------------
  462|     18|			return "Abort Output";
  463|     27|		case TelnetCommand::AreYouThere:
  ------------------
  |  Branch (463:3): [True: 27, False: 34.7k]
  ------------------
  464|     27|			return "Are You There";
  465|    355|		case TelnetCommand::EraseCharacter:
  ------------------
  |  Branch (465:3): [True: 355, False: 34.4k]
  ------------------
  466|    355|			return "Erase Character";
  467|    268|		case TelnetCommand::EraseLine:
  ------------------
  |  Branch (467:3): [True: 268, False: 34.4k]
  ------------------
  468|    268|			return "Erase Line";
  469|     52|		case TelnetCommand::GoAhead:
  ------------------
  |  Branch (469:3): [True: 52, False: 34.7k]
  ------------------
  470|     52|			return "Go Ahead";
  471|  8.68k|		case TelnetCommand::Subnegotiation:
  ------------------
  |  Branch (471:3): [True: 8.68k, False: 26.0k]
  ------------------
  472|  8.68k|			return "Subnegotiation";
  473|    814|		case TelnetCommand::WillPerform:
  ------------------
  |  Branch (473:3): [True: 814, False: 33.9k]
  ------------------
  474|    814|			return "Will Perform";
  475|  2.90k|		case TelnetCommand::WontPerform:
  ------------------
  |  Branch (475:3): [True: 2.90k, False: 31.8k]
  ------------------
  476|  2.90k|			return "Wont Perform";
  477|  1.76k|		case TelnetCommand::DoPerform:
  ------------------
  |  Branch (477:3): [True: 1.76k, False: 32.9k]
  ------------------
  478|  1.76k|			return "Do Perform";
  479|  1.61k|		case TelnetCommand::DontPerform:
  ------------------
  |  Branch (479:3): [True: 1.61k, False: 33.1k]
  ------------------
  480|  1.61k|			return "Dont Perform";
  481|      0|		case TelnetCommand::InterpretAsCommand:
  ------------------
  |  Branch (481:3): [True: 0, False: 34.7k]
  ------------------
  482|      0|			return "Interpret As Command";
  483|  12.6k|		default:
  ------------------
  |  Branch (483:3): [True: 12.6k, False: 22.1k]
  ------------------
  484|  12.6k|			return "Unknown Command";
  485|  34.7k|		}
  486|  34.7k|	}
_ZN4pcpp11TelnetLayer23getTelnetOptionAsStringENS0_12TelnetOptionE:
  489|  34.7k|	{
  490|  34.7k|		switch (val)
  491|  34.7k|		{
  492|  22.1k|		case TelnetOption::TelnetOptionNoOption:
  ------------------
  |  Branch (492:3): [True: 22.1k, False: 12.6k]
  ------------------
  493|  22.1k|			return "No option for this command";
  494|    493|		case TelnetOption::TransmitBinary:
  ------------------
  |  Branch (494:3): [True: 493, False: 34.2k]
  ------------------
  495|    493|			return "Binary Transmission";
  496|    556|		case TelnetOption::Echo:
  ------------------
  |  Branch (496:3): [True: 556, False: 34.2k]
  ------------------
  497|    556|			return "Echo";
  498|    171|		case TelnetOption::Reconnection:
  ------------------
  |  Branch (498:3): [True: 171, False: 34.5k]
  ------------------
  499|    171|			return "Reconnection";
  500|     67|		case TelnetOption::SuppressGoAhead:
  ------------------
  |  Branch (500:3): [True: 67, False: 34.6k]
  ------------------
  501|     67|			return "Suppress Go Ahead";
  502|     16|		case TelnetOption::ApproxMsgSizeNegotiation:
  ------------------
  |  Branch (502:3): [True: 16, False: 34.7k]
  ------------------
  503|     16|			return "Negotiate approximate message size";
  504|     19|		case TelnetOption::Status:
  ------------------
  |  Branch (504:3): [True: 19, False: 34.7k]
  ------------------
  505|     19|			return "Status";
  506|      1|		case TelnetOption::TimingMark:
  ------------------
  |  Branch (506:3): [True: 1, False: 34.7k]
  ------------------
  507|      1|			return "Timing Mark";
  508|     24|		case TelnetOption::RemoteControlledTransAndEcho:
  ------------------
  |  Branch (508:3): [True: 24, False: 34.7k]
  ------------------
  509|     24|			return "Remote Controlled Transmission and Echo";
  510|    121|		case TelnetOption::OutputLineWidth:
  ------------------
  |  Branch (510:3): [True: 121, False: 34.6k]
  ------------------
  511|    121|			return "Output Line Width";
  512|      2|		case TelnetOption::OutputPageSize:
  ------------------
  |  Branch (512:3): [True: 2, False: 34.7k]
  ------------------
  513|      2|			return "Output Page Size";
  514|    379|		case TelnetOption::OutputCarriageReturnDisposition:
  ------------------
  |  Branch (514:3): [True: 379, False: 34.3k]
  ------------------
  515|    379|			return "Negotiate About Output Carriage-Return Disposition";
  516|    809|		case TelnetOption::OutputHorizontalTabStops:
  ------------------
  |  Branch (516:3): [True: 809, False: 33.9k]
  ------------------
  517|    809|			return "Negotiate About Output Horizontal Tabstops";
  518|     96|		case TelnetOption::OutputHorizontalTabDisposition:
  ------------------
  |  Branch (518:3): [True: 96, False: 34.6k]
  ------------------
  519|     96|			return "Negotiate About Output Horizontal Tab Disposition";
  520|    134|		case TelnetOption::OutputFormfeedDisposition:
  ------------------
  |  Branch (520:3): [True: 134, False: 34.6k]
  ------------------
  521|    134|			return "Negotiate About Output Formfeed Disposition";
  522|    371|		case TelnetOption::OutputVerticalTabStops:
  ------------------
  |  Branch (522:3): [True: 371, False: 34.3k]
  ------------------
  523|    371|			return "Negotiate About Vertical Tabstops";
  524|    158|		case TelnetOption::OutputVerticalTabDisposition:
  ------------------
  |  Branch (524:3): [True: 158, False: 34.5k]
  ------------------
  525|    158|			return "Negotiate About Output Vertcial Tab Disposition";
  526|     19|		case TelnetOption::OutputLinefeedDisposition:
  ------------------
  |  Branch (526:3): [True: 19, False: 34.7k]
  ------------------
  527|     19|			return "Negotiate About Output Linefeed Disposition";
  528|     72|		case TelnetOption::ExtendedASCII:
  ------------------
  |  Branch (528:3): [True: 72, False: 34.6k]
  ------------------
  529|     72|			return "Extended ASCII";
  530|    159|		case TelnetOption::Logout:
  ------------------
  |  Branch (530:3): [True: 159, False: 34.5k]
  ------------------
  531|    159|			return "Logout";
  532|     10|		case TelnetOption::ByteMacro:
  ------------------
  |  Branch (532:3): [True: 10, False: 34.7k]
  ------------------
  533|     10|			return "Byte Macro";
  534|      6|		case TelnetOption::DataEntryTerminal:
  ------------------
  |  Branch (534:3): [True: 6, False: 34.7k]
  ------------------
  535|      6|			return "Data Entry Terminal";
  536|      0|		case TelnetOption::SUPDUP:
  ------------------
  |  Branch (536:3): [True: 0, False: 34.7k]
  ------------------
  537|      0|			return "SUPDUP";
  538|    209|		case TelnetOption::SUPDUPOutput:
  ------------------
  |  Branch (538:3): [True: 209, False: 34.5k]
  ------------------
  539|    209|			return "SUPDUP Output";
  540|     23|		case TelnetOption::SendLocation:
  ------------------
  |  Branch (540:3): [True: 23, False: 34.7k]
  ------------------
  541|     23|			return "Send Location";
  542|    473|		case TelnetOption::TerminalType:
  ------------------
  |  Branch (542:3): [True: 473, False: 34.2k]
  ------------------
  543|    473|			return "Terminal Type";
  544|    169|		case TelnetOption::EndOfRecordOption:
  ------------------
  |  Branch (544:3): [True: 169, False: 34.5k]
  ------------------
  545|    169|			return "End Of Record";
  546|     59|		case TelnetOption::TACACSUserIdentification:
  ------------------
  |  Branch (546:3): [True: 59, False: 34.6k]
  ------------------
  547|     59|			return "TACACS User Identification";
  548|     41|		case TelnetOption::OutputMarking:
  ------------------
  |  Branch (548:3): [True: 41, False: 34.7k]
  ------------------
  549|     41|			return "Output Marking";
  550|     36|		case TelnetOption::TerminalLocationNumber:
  ------------------
  |  Branch (550:3): [True: 36, False: 34.7k]
  ------------------
  551|     36|			return "Terminal Location Number";
  552|     40|		case TelnetOption::Telnet3270Regime:
  ------------------
  |  Branch (552:3): [True: 40, False: 34.7k]
  ------------------
  553|     40|			return "Telnet 3270 Regime";
  554|    154|		case TelnetOption::X3Pad:
  ------------------
  |  Branch (554:3): [True: 154, False: 34.6k]
  ------------------
  555|    154|			return "X3 Pad";
  556|     86|		case TelnetOption::NegotiateAboutWindowSize:
  ------------------
  |  Branch (556:3): [True: 86, False: 34.6k]
  ------------------
  557|     86|			return "Negotiate About Window Size";
  558|    104|		case TelnetOption::TerminalSpeed:
  ------------------
  |  Branch (558:3): [True: 104, False: 34.6k]
  ------------------
  559|    104|			return "Terminal Speed";
  560|    546|		case TelnetOption::RemoteFlowControl:
  ------------------
  |  Branch (560:3): [True: 546, False: 34.2k]
  ------------------
  561|    546|			return "Remote Flow Control";
  562|    575|		case TelnetOption::Linemode:
  ------------------
  |  Branch (562:3): [True: 575, False: 34.1k]
  ------------------
  563|    575|			return "Line mode";
  564|    837|		case TelnetOption::XDisplayLocation:
  ------------------
  |  Branch (564:3): [True: 837, False: 33.9k]
  ------------------
  565|    837|			return "X Display Location";
  566|     41|		case TelnetOption::EnvironmentOption:
  ------------------
  |  Branch (566:3): [True: 41, False: 34.7k]
  ------------------
  567|     41|			return "Environment Option";
  568|    287|		case TelnetOption::AuthenticationOption:
  ------------------
  |  Branch (568:3): [True: 287, False: 34.4k]
  ------------------
  569|    287|			return "Authentication Option";
  570|    238|		case TelnetOption::EncryptionOption:
  ------------------
  |  Branch (570:3): [True: 238, False: 34.5k]
  ------------------
  571|    238|			return "Encryption Option";
  572|    540|		case TelnetOption::NewEnvironmentOption:
  ------------------
  |  Branch (572:3): [True: 540, False: 34.2k]
  ------------------
  573|    540|			return "New Environment Option";
  574|      1|		case TelnetOption::TN3270E:
  ------------------
  |  Branch (574:3): [True: 1, False: 34.7k]
  ------------------
  575|      1|			return "TN3270E";
  576|      5|		case TelnetOption::XAuth:
  ------------------
  |  Branch (576:3): [True: 5, False: 34.7k]
  ------------------
  577|      5|			return "X Server Authentication";
  578|     37|		case TelnetOption::Charset:
  ------------------
  |  Branch (578:3): [True: 37, False: 34.7k]
  ------------------
  579|     37|			return "Charset";
  580|    366|		case TelnetOption::TelnetRemoteSerialPort:
  ------------------
  |  Branch (580:3): [True: 366, False: 34.3k]
  ------------------
  581|    366|			return "Telnet Remote Serial Port";
  582|    147|		case TelnetOption::ComPortControlOption:
  ------------------
  |  Branch (582:3): [True: 147, False: 34.6k]
  ------------------
  583|    147|			return "Com Port Control Option";
  584|     63|		case TelnetOption::TelnetSuppressLocalEcho:
  ------------------
  |  Branch (584:3): [True: 63, False: 34.6k]
  ------------------
  585|     63|			return "Telnet Suppress Local Echo";
  586|      4|		case TelnetOption::TelnetStartTLS:
  ------------------
  |  Branch (586:3): [True: 4, False: 34.7k]
  ------------------
  587|      4|			return "Telnet Start TLS";
  588|    184|		case TelnetOption::Kermit:
  ------------------
  |  Branch (588:3): [True: 184, False: 34.5k]
  ------------------
  589|    184|			return "Kermit";
  590|    207|		case TelnetOption::SendURL:
  ------------------
  |  Branch (590:3): [True: 207, False: 34.5k]
  ------------------
  591|    207|			return "Send URL";
  592|    178|		case TelnetOption::ForwardX:
  ------------------
  |  Branch (592:3): [True: 178, False: 34.5k]
  ------------------
  593|    178|			return "Forward X Server";
  594|     38|		case TelnetOption::TelOptPragmaLogon:
  ------------------
  |  Branch (594:3): [True: 38, False: 34.7k]
  ------------------
  595|     38|			return "Telnet Option Pragma Logon";
  596|     38|		case TelnetOption::TelOptSSPILogon:
  ------------------
  |  Branch (596:3): [True: 38, False: 34.7k]
  ------------------
  597|     38|			return "Telnet Option SSPI Logon";
  598|      0|		case TelnetOption::TelOptPragmaHeartbeat:
  ------------------
  |  Branch (598:3): [True: 0, False: 34.7k]
  ------------------
  599|      0|			return "Telnet Option Pragma Heartbeat";
  600|  1.20k|		case TelnetOption::ExtendedOptions:
  ------------------
  |  Branch (600:3): [True: 1.20k, False: 33.5k]
  ------------------
  601|  1.20k|			return "Extended option list";
  602|  2.03k|		default:
  ------------------
  |  Branch (602:3): [True: 2.03k, False: 32.7k]
  ------------------
  603|  2.03k|			return "Unknown Option";
  604|  34.7k|		}
  605|  34.7k|	}
_ZNK4pcpp11TelnetLayer8toStringEv:
  608|  3.59k|	{
  609|       |		// TODO: Perhaps print the entire sequence of commands and data?
  610|  3.59k|		switch (getTelnetSequenceType(m_Data, m_DataLen))
  611|  3.59k|		{
  612|      0|		case TelnetSequenceType::Unknown:
  ------------------
  |  Branch (612:3): [True: 0, False: 3.59k]
  ------------------
  613|      0|			return "Telnet Unknown";
  614|  1.53k|		case TelnetSequenceType::Command:
  ------------------
  |  Branch (614:3): [True: 1.53k, False: 2.06k]
  ------------------
  615|  1.53k|			return "Telnet Control";
  616|  2.06k|		case TelnetSequenceType::UserData:
  ------------------
  |  Branch (616:3): [True: 2.06k, False: 1.53k]
  ------------------
  617|  2.06k|			return "Telnet Data";
  618|      0|		default:
  ------------------
  |  Branch (618:3): [True: 0, False: 3.59k]
  ------------------
  619|      0|			throw std::logic_error("Unsupported sequence type");
  620|  3.59k|		}
  621|  3.59k|	}
TelnetLayer.cpp:_ZN4pcpp12_GLOBAL__N_111findNextIACEPhS1_:
   77|  22.2M|		{
   78|       |			// FF FF pattern is FF literal
   79|       |			// FF non-FF pattern is IAC op code
   80|       |			// Sample seq: FF AB CD 0F FF FF A4 B5 [FF] 2D DA
   81|       |
   82|       |			// Requires at least 2 elements.
   83|  22.2M|			if (first + 1 >= last)
  ------------------
  |  Branch (83:8): [True: 3.04k, False: 22.2M]
  ------------------
   84|  3.04k|				return last;
   85|       |
   86|  22.2M|			constexpr int IAC = static_cast<int>(TelnetLayer::TelnetCommand::InterpretAsCommand);
   87|       |
   88|       |			// Start the search from the second byte.
   89|  22.2M|			auto it = first + 1;
   90|  35.0M|			while (it != last)
  ------------------
  |  Branch (90:11): [True: 35.0M, False: 437]
  ------------------
   91|  35.0M|			{
   92|       |				// Find the next IAC symbol.
   93|  35.0M|				it = std::find(it, last, IAC);
   94|       |
   95|       |				// Reached the end of the sequence.
   96|  35.0M|				if (it == last)
  ------------------
  |  Branch (96:9): [True: 29.2k, False: 35.0M]
  ------------------
   97|  29.2k|					return last;
   98|       |
   99|  35.0M|				auto itNext = std::next(it);
  100|       |				// Reached the end of the sequence.
  101|       |				// IAC at the end of the sequence is invalid.
  102|  35.0M|				if (itNext == last)
  ------------------
  |  Branch (102:9): [True: 970, False: 35.0M]
  ------------------
  103|    970|					return last;
  104|       |
  105|       |				// If the next symbol is not IAC, this isn't an escaped sequence.
  106|  35.0M|				if (*itNext != IAC)
  ------------------
  |  Branch (106:9): [True: 22.2M, False: 12.7M]
  ------------------
  107|  22.2M|					return it;
  108|       |
  109|       |				// Escaped sequence "FF FF", move it to 1 past the second FF, to skip the view "FF [[FF XX]]".
  110|  12.7M|				it = std::next(itNext);
  111|  12.7M|			}
  112|       |
  113|    437|			return last;
  114|  22.2M|		}
TelnetLayer.cpp:_ZN4pcpp12_GLOBAL__N_121getTelnetSequenceTypeEPKhm:
   33|  44.5M|		{
   34|  44.5M|			if (first == nullptr || maxCount == 0)
  ------------------
  |  Branch (34:8): [True: 0, False: 44.5M]
  |  Branch (34:28): [True: 0, False: 44.5M]
  ------------------
   35|      0|			{
   36|      0|				PCPP_LOG_DEBUG("Checking empty or null buffer for telnet sequence type");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   37|      0|				return TelnetSequenceType::Unknown;
   38|      0|			}
   39|       |
   40|       |			// If first byte is not "FF" it's data
   41|  44.5M|			if (*first != static_cast<int>(TelnetLayer::TelnetCommand::InterpretAsCommand))
  ------------------
  |  Branch (41:8): [True: 11.9M, False: 32.6M]
  ------------------
   42|  11.9M|			{
   43|  11.9M|				return TelnetSequenceType::UserData;
   44|  11.9M|			}
   45|       |
   46|       |			// IAC must be followed by another octet
   47|  32.6M|			if (maxCount <= 1)
  ------------------
  |  Branch (47:8): [True: 2.90k, False: 32.6M]
  ------------------
   48|  2.90k|			{
   49|  2.90k|				PCPP_LOG_DEBUG("Telnet Parse Error: IAC (FF) must always be followed by another octet");
  ------------------
  |  |  427|  2.90k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  2.90k|	do                                                                                                                 \
  |  |  |  |  415|  2.90k|	{                                                                                                                  \
  |  |  |  |  416|  2.90k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  2.90k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  2.90k|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 2.90k]
  |  |  |  |  ------------------
  |  |  |  |  418|  2.90k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleTelnetLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  2.90k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 2.90k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   50|  2.90k|				return TelnetSequenceType::Unknown;
   51|  2.90k|			}
   52|       |
   53|  32.6M|			if (first[1] == static_cast<int>(TelnetLayer::TelnetCommand::InterpretAsCommand))
  ------------------
  |  Branch (53:8): [True: 3.05M, False: 29.5M]
  ------------------
   54|  3.05M|			{
   55|       |				// "FF FF" means data continue
   56|  3.05M|				return TelnetSequenceType::UserData;
   57|  3.05M|			}
   58|       |
   59|       |			// "FF X" where X != "FF" means command
   60|  29.5M|			return TelnetSequenceType::Command;
   61|  32.6M|		}
TelnetLayer.cpp:_ZZN4pcpp11TelnetLayer15getDataAsStringEbENK3$_0clEc:
  267|   371M|			std::copy_if(beginIt, endIt, std::back_inserter(result), [](char ch) -> bool {
  268|   371M|				return ch > 31 && ch < 127;  // From SPACE to ~
  ------------------
  |  Branch (268:12): [True: 105M, False: 265M]
  |  Branch (268:23): [True: 104M, False: 575k]
  ------------------
  269|   371M|			});
TelnetLayer.cpp:_ZN4pcpp12_GLOBAL__N_115isTelnetCommandEPKhm:
   68|   104k|		{
   69|   104k|			return getTelnetSequenceType(first, maxCount) == TelnetSequenceType::Command;
   70|   104k|		}

_ZN4pcpp18tbp_my_own_strnlenEPKcm:
   13|  40.6k|	{
   14|  40.6k|		if (s == nullptr || maxlen == 0)
  ------------------
  |  Branch (14:7): [True: 0, False: 40.6k]
  |  Branch (14:23): [True: 11.7k, False: 28.9k]
  ------------------
   15|  11.7k|			return 0;
   16|       |
   17|  28.9k|		size_t i = 0;
   18|   427k|		for (; (i < maxlen) && s[i]; ++i)
  ------------------
  |  Branch (18:10): [True: 423k, False: 3.84k]
  |  Branch (18:26): [True: 398k, False: 25.0k]
  ------------------
   19|   398k|			;
   20|  28.9k|		return i;
   21|  40.6k|	}
_ZN4pcpp24TextBasedProtocolMessageC2EPhmPNS_5LayerEPNS_6PacketEh:
   27|  81.5k|	    : Layer(data, dataLen, prevLayer, packet, protocol), m_FieldList(nullptr), m_LastField(nullptr),
   28|  81.5k|	      m_FieldsOffset(0)
   29|  81.5k|	{}
_ZN4pcpp24TextBasedProtocolMessageC2ERKS0_:
   31|  1.33k|	TextBasedProtocolMessage::TextBasedProtocolMessage(const TextBasedProtocolMessage& other) : Layer(other)
   32|  1.33k|	{
   33|  1.33k|		copyDataFrom(other);
   34|  1.33k|	}
_ZN4pcpp24TextBasedProtocolMessage12copyDataFromERKS0_:
   53|  1.33k|	{
   54|       |		// copy field list
   55|  1.33k|		if (other.m_FieldList != nullptr)
  ------------------
  |  Branch (55:7): [True: 1.33k, False: 0]
  ------------------
   56|  1.33k|		{
   57|  1.33k|			m_FieldList = new HeaderField(*(other.m_FieldList));
   58|  1.33k|			HeaderField* curField = m_FieldList;
   59|  1.33k|			curField->attachToTextBasedProtocolMessage(this, other.m_FieldList->m_NameOffsetInMessage);
   60|  1.33k|			HeaderField* curOtherField = other.m_FieldList;
   61|  19.0k|			while (curOtherField->getNextField() != nullptr)
  ------------------
  |  Branch (61:11): [True: 17.6k, False: 1.33k]
  ------------------
   62|  17.6k|			{
   63|  17.6k|				HeaderField* newField = new HeaderField(*(curOtherField->getNextField()));
   64|  17.6k|				newField->attachToTextBasedProtocolMessage(this, curOtherField->getNextField()->m_NameOffsetInMessage);
   65|  17.6k|				curField->setNextField(newField);
   66|  17.6k|				curField = curField->getNextField();
   67|  17.6k|				curOtherField = curOtherField->getNextField();
   68|  17.6k|			}
   69|       |
   70|  1.33k|			m_LastField = curField;
   71|  1.33k|		}
   72|      0|		else
   73|      0|		{
   74|      0|			m_FieldList = nullptr;
   75|      0|			m_LastField = nullptr;
   76|      0|		}
   77|       |
   78|  1.33k|		m_FieldsOffset = other.m_FieldsOffset;
   79|       |
   80|       |		// copy map
   81|  20.3k|		for (HeaderField* field = m_FieldList; field != nullptr; field = field->getNextField())
  ------------------
  |  Branch (81:42): [True: 19.0k, False: 1.33k]
  ------------------
   82|  19.0k|		{
   83|  19.0k|			m_FieldNameToFieldMap.insert(std::pair<std::string, HeaderField*>(field->getFieldName(), field));
   84|  19.0k|		}
   85|  1.33k|	}
_ZN4pcpp24TextBasedProtocolMessage11parseFieldsEv:
   88|  81.5k|	{
   89|  81.5k|		char nameValueSeparator = getHeaderFieldNameValueSeparator();
   90|  81.5k|		bool spacesAllowedBetweenNameAndValue = spacesAllowedBetweenHeaderFieldNameAndValue();
   91|       |
   92|  81.5k|		HeaderField* firstField =
   93|  81.5k|		    new HeaderField(this, m_FieldsOffset, nameValueSeparator, spacesAllowedBetweenNameAndValue);
   94|  81.5k|		PCPP_LOG_DEBUG("Added new field: name='" << firstField->getFieldName()
  ------------------
  |  |  427|  81.5k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  81.5k|	do                                                                                                                 \
  |  |  |  |  415|  81.5k|	{                                                                                                                  \
  |  |  |  |  416|  81.5k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  81.5k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|  81.5k|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 81.5k]
  |  |  |  |  ------------------
  |  |  |  |  418|  81.5k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  81.5k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 81.5k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   95|  81.5k|		                                         << "'; offset in packet=" << firstField->m_NameOffsetInMessage
   96|  81.5k|		                                         << "; length=" << firstField->getFieldSize());
   97|  81.5k|		PCPP_LOG_DEBUG("     Field value = " << firstField->getFieldValue());
  ------------------
  |  |  427|  81.5k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  81.5k|	do                                                                                                                 \
  |  |  |  |  415|  81.5k|	{                                                                                                                  \
  |  |  |  |  416|  81.5k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  81.5k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|  81.5k|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 81.5k]
  |  |  |  |  ------------------
  |  |  |  |  418|  81.5k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  81.5k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 81.5k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   98|       |
   99|  81.5k|		if (m_FieldList == nullptr)
  ------------------
  |  Branch (99:7): [True: 81.5k, False: 0]
  ------------------
  100|  81.5k|			m_FieldList = firstField;
  101|      0|		else
  102|      0|			m_FieldList->setNextField(firstField);
  103|       |
  104|  81.5k|		std::string fieldName = firstField->getFieldName();
  105|  81.5k|		std::transform(fieldName.begin(), fieldName.end(), fieldName.begin(), ::tolower);
  106|  81.5k|		m_FieldNameToFieldMap.insert(std::pair<std::string, HeaderField*>(fieldName, firstField));
  107|       |
  108|       |		// Last field will be empty and contain just "\n" or "\r\n". This field will mark the end of the header
  109|  81.5k|		HeaderField* curField = m_FieldList;
  110|  81.5k|		int curOffset = m_FieldsOffset;
  111|       |		// last field can be one of:
  112|       |		// a.) \r\n\r\n or \n\n marking the end of the header
  113|       |		// b.) the end of the packet
  114|   528k|		while (!curField->isEndOfHeader() && curOffset + curField->getFieldSize() < m_DataLen)
  ------------------
  |  Branch (114:10): [True: 465k, False: 63.0k]
  |  Branch (114:40): [True: 460k, False: 5.68k]
  ------------------
  115|   460k|		{
  116|   460k|			curOffset += curField->getFieldSize();
  117|   460k|			HeaderField* newField =
  118|   460k|			    new HeaderField(this, curOffset, nameValueSeparator, spacesAllowedBetweenNameAndValue);
  119|   460k|			if (newField->getFieldSize() > 0)
  ------------------
  |  Branch (119:8): [True: 447k, False: 12.7k]
  ------------------
  120|   447k|			{
  121|   447k|				PCPP_LOG_DEBUG("Added new field: name='" << newField->getFieldName()
  ------------------
  |  |  427|   447k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|   447k|	do                                                                                                                 \
  |  |  |  |  415|   447k|	{                                                                                                                  \
  |  |  |  |  416|   447k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|   447k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|   447k|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 447k]
  |  |  |  |  ------------------
  |  |  |  |  418|   447k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|   447k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 447k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  122|   447k|				                                         << "'; offset in packet=" << newField->m_NameOffsetInMessage
  123|   447k|				                                         << "; length=" << newField->getFieldSize());
  124|   447k|				PCPP_LOG_DEBUG("     Field value = " << newField->getFieldValue());
  ------------------
  |  |  427|   447k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|   447k|	do                                                                                                                 \
  |  |  |  |  415|   447k|	{                                                                                                                  \
  |  |  |  |  416|   447k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|   447k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|   447k|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 447k]
  |  |  |  |  ------------------
  |  |  |  |  418|   447k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|   447k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 447k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  125|   447k|				curField->setNextField(newField);
  126|   447k|				curField = newField;
  127|   447k|				fieldName = newField->getFieldName();
  128|   447k|				std::transform(fieldName.begin(), fieldName.end(), fieldName.begin(), ::tolower);
  129|   447k|				m_FieldNameToFieldMap.insert(std::pair<std::string, HeaderField*>(fieldName, newField));
  130|   447k|			}
  131|  12.7k|			else
  132|  12.7k|			{
  133|  12.7k|				delete newField;
  134|  12.7k|				break;
  135|  12.7k|			}
  136|   460k|		}
  137|       |
  138|  81.5k|		m_LastField = curField;
  139|  81.5k|	}
_ZN4pcpp24TextBasedProtocolMessageD2Ev:
  142|  82.8k|	{
  143|   631k|		while (m_FieldList != nullptr)
  ------------------
  |  Branch (143:10): [True: 548k, False: 82.8k]
  ------------------
  144|   548k|		{
  145|   548k|			HeaderField* temp = m_FieldList;
  146|   548k|			m_FieldList = m_FieldList->getNextField();
  147|   548k|			delete temp;
  148|   548k|		}
  149|  82.8k|	}
_ZN4pcpp24TextBasedProtocolMessage8addFieldERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
  152|  3.01k|	{
  153|  3.01k|		HeaderField newField(fieldName, fieldValue, getHeaderFieldNameValueSeparator(),
  154|  3.01k|		                     spacesAllowedBetweenHeaderFieldNameAndValue());
  155|  3.01k|		return addField(newField);
  156|  3.01k|	}
_ZN4pcpp24TextBasedProtocolMessage8addFieldERKNS_11HeaderFieldE:
  159|  3.01k|	{
  160|  3.01k|		return insertField(m_LastField, newField);
  161|  3.01k|	}
_ZN4pcpp24TextBasedProtocolMessage11insertFieldEPNS_11HeaderFieldERKS1_:
  195|  3.01k|	{
  196|  3.01k|		if (newField.m_TextBasedProtocolMessage != nullptr)
  ------------------
  |  Branch (196:7): [True: 0, False: 3.01k]
  ------------------
  197|      0|		{
  198|      0|			PCPP_LOG_ERROR("This field is already associated with another message");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  199|      0|			return nullptr;
  200|      0|		}
  201|       |
  202|  3.01k|		if (prevField != nullptr && prevField->getFieldName() == PCPP_END_OF_TEXT_BASED_PROTOCOL_HEADER)
  ------------------
  |  |   12|  3.01k|#define PCPP_END_OF_TEXT_BASED_PROTOCOL_HEADER ""
  ------------------
  |  Branch (202:7): [True: 3.01k, False: 0]
  |  Branch (202:7): [True: 428, False: 2.58k]
  |  Branch (202:31): [True: 428, False: 2.58k]
  ------------------
  203|    428|		{
  204|    428|			PCPP_LOG_ERROR("Cannot add a field after end of header");
  ------------------
  |  |  445|    428|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    428|	do                                                                                                                 \
  |  |  |  |  415|    428|	{                                                                                                                  \
  |  |  |  |  416|    428|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    428|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|    428|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 428, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    428|		{                                                                                                              \
  |  |  |  |  419|    428|			auto ctx =                                                                                                 \
  |  |  |  |  420|    428|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|    428|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    428|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    428|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    428|		}                                                                                                              \
  |  |  |  |  424|    428|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 428]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  205|    428|			return nullptr;
  206|    428|		}
  207|       |
  208|  2.58k|		HeaderField* newFieldToAdd = new HeaderField(newField);
  209|       |
  210|  2.58k|		int newFieldOffset = m_FieldsOffset;
  211|  2.58k|		if (prevField != nullptr)
  ------------------
  |  Branch (211:7): [True: 2.58k, False: 0]
  ------------------
  212|  2.58k|			newFieldOffset = prevField->m_NameOffsetInMessage + prevField->getFieldSize();
  213|       |
  214|       |		// extend layer to make room for the new field. Field will be added just before the last field
  215|  2.58k|		if (!extendLayer(newFieldOffset, newFieldToAdd->getFieldSize()))
  ------------------
  |  Branch (215:7): [True: 1.58k, False: 996]
  ------------------
  216|  1.58k|		{
  217|  1.58k|			PCPP_LOG_ERROR("Cannot extend layer to insert the header");
  ------------------
  |  |  445|  1.58k|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|  1.58k|	do                                                                                                                 \
  |  |  |  |  415|  1.58k|	{                                                                                                                  \
  |  |  |  |  416|  1.58k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  1.58k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|  1.58k|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 1.58k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|  1.58k|		{                                                                                                              \
  |  |  |  |  419|  1.58k|			auto ctx =                                                                                                 \
  |  |  |  |  420|  1.58k|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|  1.58k|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|  1.58k|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|  1.58k|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|  1.58k|		}                                                                                                              \
  |  |  |  |  424|  1.58k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 1.58k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  218|  1.58k|			delete newFieldToAdd;
  219|  1.58k|			return nullptr;
  220|  1.58k|		}
  221|       |
  222|    996|		HeaderField* curField = m_FieldList;
  223|    996|		if (prevField != nullptr)
  ------------------
  |  Branch (223:7): [True: 996, False: 0]
  ------------------
  224|    996|			curField = prevField->getNextField();
  225|       |
  226|       |		// go over all fields after prevField and update their offsets
  227|    996|		shiftFieldsOffset(curField, newFieldToAdd->getFieldSize());
  228|       |
  229|       |		// copy new field data to message
  230|    996|		memcpy(m_Data + newFieldOffset, newFieldToAdd->m_NewFieldData, newFieldToAdd->getFieldSize());
  231|       |
  232|       |		// attach new field to message
  233|    996|		newFieldToAdd->attachToTextBasedProtocolMessage(this, newFieldOffset);
  234|       |
  235|       |		// insert field into fields link list
  236|    996|		if (prevField == nullptr)
  ------------------
  |  Branch (236:7): [True: 0, False: 996]
  ------------------
  237|      0|		{
  238|      0|			newFieldToAdd->setNextField(m_FieldList);
  239|      0|			m_FieldList = newFieldToAdd;
  240|      0|		}
  241|    996|		else
  242|    996|		{
  243|    996|			newFieldToAdd->setNextField(prevField->getNextField());
  244|    996|			prevField->setNextField(newFieldToAdd);
  245|    996|		}
  246|       |
  247|       |		// if newField is the last field, update m_LastField
  248|    996|		if (newFieldToAdd->getNextField() == nullptr)
  ------------------
  |  Branch (248:7): [True: 996, False: 0]
  ------------------
  249|    996|			m_LastField = newFieldToAdd;
  250|       |
  251|       |		// insert the new field into name to field map
  252|    996|		std::string fieldName = newFieldToAdd->getFieldName();
  253|    996|		std::transform(fieldName.begin(), fieldName.end(), fieldName.begin(), ::tolower);
  254|    996|		m_FieldNameToFieldMap.insert(std::pair<std::string, HeaderField*>(fieldName, newFieldToAdd));
  255|       |
  256|    996|		return newFieldToAdd;
  257|  2.58k|	}
_ZN4pcpp24TextBasedProtocolMessage11removeFieldENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEi:
  260|  1.33k|	{
  261|  1.33k|		std::transform(fieldName.begin(), fieldName.end(), fieldName.begin(), ::tolower);
  262|       |
  263|  1.33k|		HeaderField* fieldToRemove = nullptr;
  264|       |
  265|  1.33k|		auto range = m_FieldNameToFieldMap.equal_range(fieldName);
  266|  1.33k|		int i = 0;
  267|  1.33k|		for (std::multimap<std::string, HeaderField*>::iterator iter = range.first; iter != range.second; ++iter)
  ------------------
  |  Branch (267:79): [True: 712, False: 627]
  ------------------
  268|    712|		{
  269|    712|			if (i == index)
  ------------------
  |  Branch (269:8): [True: 712, False: 0]
  ------------------
  270|    712|			{
  271|    712|				fieldToRemove = iter->second;
  272|    712|				break;
  273|    712|			}
  274|       |
  275|      0|			i++;
  276|      0|		}
  277|       |
  278|  1.33k|		if (fieldToRemove != nullptr)
  ------------------
  |  Branch (278:7): [True: 712, False: 627]
  ------------------
  279|    712|			return removeField(fieldToRemove);
  280|    627|		else
  281|    627|		{
  282|    627|			PCPP_LOG_ERROR("Cannot find field '" << fieldName << "'");
  ------------------
  |  |  445|    627|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    627|	do                                                                                                                 \
  |  |  |  |  415|    627|	{                                                                                                                  \
  |  |  |  |  416|    627|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    627|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|    627|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 627, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    627|		{                                                                                                              \
  |  |  |  |  419|    627|			auto ctx =                                                                                                 \
  |  |  |  |  420|    627|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|    627|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    627|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    627|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    627|		}                                                                                                              \
  |  |  |  |  424|    627|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 627]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  283|    627|			return false;
  284|    627|		}
  285|  1.33k|	}
_ZN4pcpp24TextBasedProtocolMessage11removeFieldEPNS_11HeaderFieldE:
  288|    712|	{
  289|    712|		if (fieldToRemove == nullptr)
  ------------------
  |  Branch (289:7): [True: 0, False: 712]
  ------------------
  290|      0|			return true;
  291|       |
  292|    712|		if (fieldToRemove->m_TextBasedProtocolMessage != this)
  ------------------
  |  Branch (292:7): [True: 0, False: 712]
  ------------------
  293|      0|		{
  294|      0|			PCPP_LOG_ERROR("Field isn't associated with this message");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  295|      0|			return false;
  296|      0|		}
  297|       |
  298|    712|		std::string fieldName = fieldToRemove->getFieldName();
  299|       |
  300|       |		// shorten layer and delete this field
  301|    712|		if (!shortenLayer(fieldToRemove->m_NameOffsetInMessage, fieldToRemove->getFieldSize()))
  ------------------
  |  Branch (301:7): [True: 3, False: 709]
  ------------------
  302|      3|		{
  303|      3|			PCPP_LOG_ERROR("Cannot shorten layer");
  ------------------
  |  |  445|      3|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      3|	do                                                                                                                 \
  |  |  |  |  415|      3|	{                                                                                                                  \
  |  |  |  |  416|      3|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      3|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      3|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 3, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      3|		{                                                                                                              \
  |  |  |  |  419|      3|			auto ctx =                                                                                                 \
  |  |  |  |  420|      3|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      3|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      3|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      3|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      3|		}                                                                                                              \
  |  |  |  |  424|      3|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 3]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  304|      3|			return false;
  305|      3|		}
  306|       |
  307|       |		// update offsets of all fields after this field
  308|    709|		HeaderField* curField = fieldToRemove->getNextField();
  309|    709|		shiftFieldsOffset(curField, 0 - fieldToRemove->getFieldSize());
  310|       |
  311|       |		// update fields link list
  312|    709|		if (fieldToRemove == m_FieldList)
  ------------------
  |  Branch (312:7): [True: 392, False: 317]
  ------------------
  313|    392|			m_FieldList = m_FieldList->getNextField();
  314|    317|		else
  315|    317|		{
  316|    317|			curField = m_FieldList;
  317|  3.02k|			while (curField->getNextField() != fieldToRemove)
  ------------------
  |  Branch (317:11): [True: 2.70k, False: 317]
  ------------------
  318|  2.70k|				curField = curField->getNextField();
  319|       |
  320|    317|			curField->setNextField(fieldToRemove->getNextField());
  321|    317|		}
  322|       |
  323|       |		// re-calculate m_LastField if needed
  324|    709|		if (fieldToRemove == m_LastField)
  ------------------
  |  Branch (324:7): [True: 288, False: 421]
  ------------------
  325|    288|		{
  326|    288|			if (m_FieldList == nullptr)
  ------------------
  |  Branch (326:8): [True: 0, False: 288]
  ------------------
  327|      0|				m_LastField = nullptr;
  328|    288|			else
  329|    288|			{
  330|    288|				curField = m_FieldList;
  331|  2.34k|				while (curField->getNextField() != nullptr)
  ------------------
  |  Branch (331:12): [True: 2.05k, False: 288]
  ------------------
  332|  2.05k|					curField = curField->getNextField();
  333|    288|				m_LastField = curField;
  334|    288|			}
  335|    288|		}
  336|       |
  337|       |		// remove the hash entry for this field
  338|    709|		std::transform(fieldName.begin(), fieldName.end(), fieldName.begin(), ::tolower);
  339|    709|		auto range = m_FieldNameToFieldMap.equal_range(fieldName);
  340|    709|		for (std::multimap<std::string, HeaderField*>::iterator iter = range.first; iter != range.second; ++iter)
  ------------------
  |  Branch (340:79): [True: 709, False: 0]
  ------------------
  341|    709|		{
  342|    709|			if (iter->second == fieldToRemove)
  ------------------
  |  Branch (342:8): [True: 709, False: 0]
  ------------------
  343|    709|			{
  344|    709|				m_FieldNameToFieldMap.erase(iter);
  345|    709|				break;
  346|    709|			}
  347|    709|		}
  348|       |
  349|       |		// finally - delete this field
  350|    709|		delete fieldToRemove;
  351|       |
  352|    709|		return true;
  353|    712|	}
_ZN4pcpp24TextBasedProtocolMessage15setFieldsOffsetEi:
  364|  81.5k|	{
  365|  81.5k|		validateFieldsOffset(fieldsOffset);
  366|  81.5k|		m_FieldsOffset = fieldsOffset;
  367|  81.5k|	}
_ZN4pcpp24TextBasedProtocolMessage17shiftFieldsOffsetEPNS_11HeaderFieldEi:
  379|  2.60k|	{
  380|  12.4k|		for (; fromField != nullptr; fromField = fromField->getNextField())
  ------------------
  |  Branch (380:10): [True: 9.87k, False: 2.60k]
  ------------------
  381|  9.87k|		{
  382|  9.87k|			fromField->m_NameOffsetInMessage += numOfBytesToShift;
  383|  9.87k|			if (fromField->m_ValueOffsetInMessage != -1)
  ------------------
  |  Branch (383:8): [True: 8.74k, False: 1.12k]
  ------------------
  384|  8.74k|				fromField->m_ValueOffsetInMessage += numOfBytesToShift;
  385|  9.87k|		}
  386|  2.60k|	}
_ZNK4pcpp24TextBasedProtocolMessage20validateFieldsOffsetEi:
  389|  81.5k|	{
  390|  81.5k|		if (offset < 0 || static_cast<size_t>(offset) > m_DataLen)
  ------------------
  |  Branch (390:7): [True: 0, False: 81.5k]
  |  Branch (390:21): [True: 0, False: 81.5k]
  ------------------
  391|      0|			throw std::out_of_range(
  392|      0|			    "Field offset must be greater or equal to zero and less than or equal to the data length");
  393|  81.5k|	}
_ZNK4pcpp24TextBasedProtocolMessage14getFieldByNameENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEi:
  396|  38.6k|	{
  397|  38.6k|		std::transform(fieldName.begin(), fieldName.end(), fieldName.begin(), ::tolower);
  398|       |
  399|  38.6k|		auto range = m_FieldNameToFieldMap.equal_range(fieldName);
  400|  38.6k|		int i = 0;
  401|   439k|		for (std::multimap<std::string, HeaderField*>::const_iterator iter = range.first; iter != range.second; ++iter)
  ------------------
  |  Branch (401:85): [True: 433k, False: 6.20k]
  ------------------
  402|   433k|		{
  403|   433k|			if (i == index)
  ------------------
  |  Branch (403:8): [True: 32.4k, False: 401k]
  ------------------
  404|  32.4k|				return iter->second;
  405|       |
  406|   401k|			i++;
  407|   401k|		}
  408|       |
  409|  6.20k|		return nullptr;
  410|  38.6k|	}
_ZNK4pcpp24TextBasedProtocolMessage13getFieldCountEv:
  413|  1.33k|	{
  414|  1.33k|		int result = 0;
  415|       |
  416|  1.33k|		HeaderField* curField = getFirstField();
  417|  20.3k|		while (curField != nullptr)
  ------------------
  |  Branch (417:10): [True: 19.0k, False: 1.33k]
  ------------------
  418|  19.0k|		{
  419|  19.0k|			if (!curField->isEndOfHeader())
  ------------------
  |  Branch (419:8): [True: 18.7k, False: 213]
  ------------------
  420|  18.7k|				result++;
  421|  19.0k|			curField = curField->getNextField();
  422|  19.0k|		}
  423|       |
  424|  1.33k|		return result;
  425|  1.33k|	}
_ZN4pcpp24TextBasedProtocolMessage14parseNextLayerEv:
  428|  64.7k|	{
  429|  64.7k|		size_t headerLen = getHeaderLen();
  430|  64.7k|		if (m_DataLen <= headerLen)
  ------------------
  |  Branch (430:7): [True: 40.9k, False: 23.7k]
  ------------------
  431|  40.9k|			return;
  432|       |
  433|  23.7k|		constructNextLayer<PayloadLayer>(m_Data + headerLen, m_DataLen - headerLen);
  434|  23.7k|	}
_ZNK4pcpp24TextBasedProtocolMessage12getHeaderLenEv:
  437|   114k|	{
  438|   114k|		return m_LastField->m_NameOffsetInMessage + m_LastField->m_FieldSize;
  439|   114k|	}
_ZN4pcpp24TextBasedProtocolMessage22computeCalculateFieldsEv:
  442|  11.8k|	{
  443|       |		// nothing to do for now
  444|  11.8k|	}
_ZN4pcpp11HeaderFieldC2EPNS_24TextBasedProtocolMessageEicb:
  450|   541k|	    : m_NewFieldData(nullptr), m_TextBasedProtocolMessage(TextBasedProtocolMessage),
  451|   541k|	      m_NameOffsetInMessage(offsetInMessage), m_NextField(nullptr), m_NameValueSeparator(nameValueSeparator),
  452|   541k|	      m_SpacesAllowedBetweenNameAndValue(spacesAllowedBetweenNameAndValue)
  453|   541k|	{
  454|   541k|		char* fieldData = reinterpret_cast<char*>(m_TextBasedProtocolMessage->m_Data + m_NameOffsetInMessage);
  455|   541k|		char* fieldEndPtr = static_cast<char*>(memchr(
  456|   541k|		    fieldData, '\n', m_TextBasedProtocolMessage->m_DataLen - static_cast<size_t>(m_NameOffsetInMessage)));
  457|   541k|		if (fieldEndPtr == nullptr)
  ------------------
  |  Branch (457:7): [True: 40.6k, False: 500k]
  ------------------
  458|  40.6k|			m_FieldSize = tbp_my_own_strnlen(fieldData, m_TextBasedProtocolMessage->m_DataLen -
  459|  40.6k|			                                                static_cast<size_t>(m_NameOffsetInMessage));
  460|   500k|		else
  461|   500k|			m_FieldSize = fieldEndPtr - fieldData + 1;
  462|       |
  463|   541k|		if (m_FieldSize == 0 || (*fieldData) == '\r' || (*fieldData) == '\n')
  ------------------
  |  Branch (463:7): [True: 25.5k, False: 516k]
  |  Branch (463:27): [True: 48.7k, False: 467k]
  |  Branch (463:51): [True: 1.60k, False: 465k]
  ------------------
  464|  75.8k|		{
  465|  75.8k|			m_FieldNameSize = -1;
  466|  75.8k|			m_ValueOffsetInMessage = -1;
  467|  75.8k|			m_FieldValueSize = -1;
  468|  75.8k|			m_FieldNameSize = -1;
  469|  75.8k|			m_IsEndOfHeaderField = true;
  470|  75.8k|			return;
  471|  75.8k|		}
  472|   465k|		else
  473|   465k|			m_IsEndOfHeaderField = false;
  474|       |
  475|   465k|		char* fieldValuePtr = static_cast<char*>(
  476|   465k|		    memchr(fieldData, nameValueSeparator,
  477|   465k|		           m_TextBasedProtocolMessage->m_DataLen - static_cast<size_t>(m_NameOffsetInMessage)));
  478|       |		// could not find the position of the separator, meaning field value position is unknown
  479|   465k|		if (fieldValuePtr == nullptr || (fieldEndPtr != nullptr && fieldValuePtr >= fieldEndPtr))
  ------------------
  |  Branch (479:7): [True: 15.6k, False: 450k]
  |  Branch (479:36): [True: 441k, False: 8.43k]
  |  Branch (479:62): [True: 106k, False: 335k]
  ------------------
  480|   121k|		{
  481|   121k|			m_ValueOffsetInMessage = -1;
  482|   121k|			m_FieldValueSize = -1;
  483|   121k|			m_FieldNameSize = m_FieldSize;
  484|   121k|		}
  485|   343k|		else
  486|   343k|		{
  487|   343k|			m_FieldNameSize = fieldValuePtr - fieldData;
  488|       |			// Header field looks like this: <field_name>[separator]<zero or more spaces><field_Value>
  489|       |			// So fieldValuePtr give us the position of the separator. Value offset is the first non-space byte forward
  490|   343k|			fieldValuePtr++;
  491|       |
  492|       |			// reached the end of the packet and value start offset wasn't found
  493|   343k|			if (static_cast<size_t>(fieldValuePtr - reinterpret_cast<char*>(m_TextBasedProtocolMessage->m_Data)) >=
  ------------------
  |  Branch (493:8): [True: 315, False: 343k]
  ------------------
  494|   343k|			    m_TextBasedProtocolMessage->getDataLen())
  495|    315|			{
  496|    315|				m_ValueOffsetInMessage = -1;
  497|    315|				m_FieldValueSize = -1;
  498|    315|				return;
  499|    315|			}
  500|       |
  501|   343k|			if (spacesAllowedBetweenNameAndValue)
  ------------------
  |  Branch (501:8): [True: 267k, False: 76.0k]
  ------------------
  502|   267k|			{
  503|       |				// advance fieldValuePtr 1 byte forward while didn't get to end of packet and fieldValuePtr points to a
  504|       |				// space char
  505|   267k|				while (
  506|   519k|				    static_cast<size_t>(fieldValuePtr - reinterpret_cast<char*>(m_TextBasedProtocolMessage->m_Data)) <
  ------------------
  |  Branch (506:9): [True: 518k, False: 298]
  ------------------
  507|   519k|				        m_TextBasedProtocolMessage->getDataLen() &&
  508|   518k|				    (*fieldValuePtr) == ' ')
  ------------------
  |  Branch (508:9): [True: 251k, False: 267k]
  ------------------
  509|   251k|				{
  510|   251k|					fieldValuePtr++;
  511|   251k|				}
  512|   267k|			}
  513|       |
  514|       |			// reached the end of the packet and value start offset wasn't found
  515|   343k|			if (static_cast<size_t>(fieldValuePtr - reinterpret_cast<char*>(m_TextBasedProtocolMessage->m_Data)) >=
  ------------------
  |  Branch (515:8): [True: 298, False: 343k]
  ------------------
  516|   343k|			    m_TextBasedProtocolMessage->getDataLen())
  517|    298|			{
  518|    298|				m_ValueOffsetInMessage = -1;
  519|    298|				m_FieldValueSize = -1;
  520|    298|			}
  521|   343k|			else
  522|   343k|			{
  523|   343k|				m_ValueOffsetInMessage = fieldValuePtr - reinterpret_cast<char*>(m_TextBasedProtocolMessage->m_Data);
  524|       |				// couldn't find the end of the field, so assuming the field value length is from m_ValueOffsetInMessage
  525|       |				// until the end of the packet
  526|   343k|				if (fieldEndPtr == nullptr)
  ------------------
  |  Branch (526:9): [True: 7.82k, False: 335k]
  ------------------
  527|  7.82k|				{
  528|       |					// clang-format off
  529|  7.82k|					m_FieldValueSize = reinterpret_cast<char*>(m_TextBasedProtocolMessage->m_Data + m_TextBasedProtocolMessage->getDataLen()) - fieldValuePtr;
  530|       |					// clang-format on
  531|  7.82k|				}
  532|   335k|				else
  533|   335k|				{
  534|   335k|					m_FieldValueSize = fieldEndPtr - fieldValuePtr;
  535|       |					// if field ends with \r\n, decrease the value length by 1
  536|   335k|					if ((*(--fieldEndPtr)) == '\r')
  ------------------
  |  Branch (536:10): [True: 279k, False: 56.3k]
  ------------------
  537|   279k|						m_FieldValueSize--;
  538|   335k|				}
  539|   343k|			}
  540|   343k|		}
  541|   465k|	}
_ZN4pcpp11HeaderFieldC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_cb:
  545|  3.01k|	{
  546|  3.01k|		m_NameValueSeparator = nameValueSeparator;
  547|  3.01k|		m_SpacesAllowedBetweenNameAndValue = spacesAllowedBetweenNameAndValue;
  548|  3.01k|		initNewField(name, value);
  549|  3.01k|	}
_ZN4pcpp11HeaderField12initNewFieldERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_:
  552|  24.5k|	{
  553|  24.5k|		m_TextBasedProtocolMessage = nullptr;
  554|  24.5k|		m_NameOffsetInMessage = 0;
  555|  24.5k|		m_NextField = nullptr;
  556|       |
  557|       |		// first building the name-value separator
  558|  24.5k|		std::string nameValueSeparation(1, m_NameValueSeparator);
  559|  24.5k|		if (m_SpacesAllowedBetweenNameAndValue)
  ------------------
  |  Branch (559:7): [True: 0, False: 24.5k]
  ------------------
  560|      0|			nameValueSeparation += " ";
  561|       |
  562|       |		// Field size is: name_length + separator_len + value_length + '\r\n'
  563|  24.5k|		if (name != PCPP_END_OF_TEXT_BASED_PROTOCOL_HEADER)
  ------------------
  |  |   12|  24.5k|#define PCPP_END_OF_TEXT_BASED_PROTOCOL_HEADER ""
  ------------------
  |  Branch (563:7): [True: 24.1k, False: 445]
  ------------------
  564|  24.1k|			m_FieldSize = name.length() + nameValueSeparation.length() + value.length() + 2;
  565|    445|		else
  566|       |			// Field is \r\n (2B)
  567|    445|			m_FieldSize = 2;
  568|       |
  569|  24.5k|		m_NewFieldData = new uint8_t[m_FieldSize];
  570|  24.5k|		std::string fieldData;
  571|       |
  572|  24.5k|		if (name != PCPP_END_OF_TEXT_BASED_PROTOCOL_HEADER)
  ------------------
  |  |   12|  24.5k|#define PCPP_END_OF_TEXT_BASED_PROTOCOL_HEADER ""
  ------------------
  |  Branch (572:7): [True: 24.1k, False: 445]
  ------------------
  573|  24.1k|			fieldData = name + nameValueSeparation + value + "\r\n";
  574|    445|		else
  575|    445|			fieldData = "\r\n";
  576|       |
  577|       |		// copy field data to m_NewFieldData
  578|  24.5k|		memcpy(m_NewFieldData, fieldData.c_str(), m_FieldSize);
  579|       |
  580|       |		// calculate value offset
  581|  24.5k|		if (name != PCPP_END_OF_TEXT_BASED_PROTOCOL_HEADER)
  ------------------
  |  |   12|  24.5k|#define PCPP_END_OF_TEXT_BASED_PROTOCOL_HEADER ""
  ------------------
  |  Branch (581:7): [True: 24.1k, False: 445]
  ------------------
  582|  24.1k|			m_ValueOffsetInMessage = name.length() + nameValueSeparation.length();
  583|    445|		else
  584|    445|			m_ValueOffsetInMessage = 0;
  585|  24.5k|		m_FieldNameSize = name.length();
  586|  24.5k|		m_FieldValueSize = value.length();
  587|       |
  588|  24.5k|		if (name != PCPP_END_OF_TEXT_BASED_PROTOCOL_HEADER)
  ------------------
  |  |   12|  24.5k|#define PCPP_END_OF_TEXT_BASED_PROTOCOL_HEADER ""
  ------------------
  |  Branch (588:7): [True: 24.1k, False: 445]
  ------------------
  589|  24.1k|			m_IsEndOfHeaderField = false;
  590|    445|		else
  591|    445|			m_IsEndOfHeaderField = true;
  592|  24.5k|	}
_ZN4pcpp11HeaderFieldD2Ev:
  595|   566k|	{
  596|   566k|		if (m_NewFieldData != nullptr)
  ------------------
  |  Branch (596:7): [True: 4.59k, False: 561k]
  ------------------
  597|  4.59k|			delete[] m_NewFieldData;
  598|   566k|	}
_ZN4pcpp11HeaderFieldC2ERKS0_:
  601|  21.5k|	    : m_NameValueSeparator('\0'), m_SpacesAllowedBetweenNameAndValue(false)
  602|  21.5k|	{
  603|  21.5k|		m_NameValueSeparator = other.m_NameValueSeparator;
  604|  21.5k|		m_SpacesAllowedBetweenNameAndValue = other.m_SpacesAllowedBetweenNameAndValue;
  605|  21.5k|		initNewField(other.getFieldName(), other.getFieldValue());
  606|  21.5k|	}
_ZNK4pcpp11HeaderField7getDataEv:
  620|   557k|	{
  621|   557k|		if (m_TextBasedProtocolMessage == nullptr)
  ------------------
  |  Branch (621:7): [True: 5.16k, False: 552k]
  ------------------
  622|  5.16k|			return reinterpret_cast<char*>(m_NewFieldData);
  623|   552k|		else
  624|   552k|			return reinterpret_cast<char*>(m_TextBasedProtocolMessage->m_Data);
  625|   557k|	}
_ZN4pcpp11HeaderField12setNextFieldEPS0_:
  628|   467k|	{
  629|   467k|		m_NextField = nextField;
  630|   467k|	}
_ZNK4pcpp11HeaderField12getNextFieldEv:
  633|   701k|	{
  634|   701k|		return m_NextField;
  635|   701k|	}
_ZNK4pcpp11HeaderField12getFieldNameEv:
  638|   574k|	{
  639|   574k|		std::string result;
  640|       |
  641|   574k|		if (m_FieldNameSize != static_cast<size_t>(-1))
  ------------------
  |  Branch (641:7): [True: 510k, False: 63.2k]
  ------------------
  642|   510k|			result.assign((getData() + m_NameOffsetInMessage), m_FieldNameSize);
  643|       |
  644|   574k|		return result;
  645|   574k|	}
_ZNK4pcpp11HeaderField13getFieldValueEv:
  648|  52.4k|	{
  649|  52.4k|		std::string result;
  650|  52.4k|		if (m_ValueOffsetInMessage != -1)
  ------------------
  |  Branch (650:7): [True: 44.9k, False: 7.53k]
  ------------------
  651|  44.9k|			result.assign((getData() + m_ValueOffsetInMessage), m_FieldValueSize);
  652|  52.4k|		return result;
  653|  52.4k|	}
_ZN4pcpp11HeaderField13setFieldValueERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  656|  1.41k|	{
  657|       |		// Field isn't linked with any message yet
  658|  1.41k|		if (m_TextBasedProtocolMessage == nullptr)
  ------------------
  |  Branch (658:7): [True: 0, False: 1.41k]
  ------------------
  659|      0|		{
  660|      0|			std::string name = getFieldName();
  661|      0|			delete[] m_NewFieldData;
  662|      0|			initNewField(name, newValue);
  663|      0|			return true;
  664|      0|		}
  665|       |
  666|  1.41k|		std::string curValue = getFieldValue();
  667|  1.41k|		int lengthDifference = static_cast<int>(newValue.length()) - static_cast<int>(curValue.length());
  668|       |		// new value is longer than current value
  669|  1.41k|		if (lengthDifference > 0)
  ------------------
  |  Branch (669:7): [True: 49, False: 1.36k]
  ------------------
  670|     49|		{
  671|     49|			if (!m_TextBasedProtocolMessage->extendLayer(m_ValueOffsetInMessage, static_cast<size_t>(lengthDifference)))
  ------------------
  |  Branch (671:8): [True: 0, False: 49]
  ------------------
  672|      0|			{
  673|      0|				PCPP_LOG_ERROR("Could not extend layer");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  674|      0|				return false;
  675|      0|			}
  676|     49|		}
  677|       |		// new value is shorter than current value
  678|  1.36k|		else if (lengthDifference < 0)
  ------------------
  |  Branch (678:12): [True: 852, False: 509]
  ------------------
  679|    852|		{
  680|    852|			if (!m_TextBasedProtocolMessage->shortenLayer(m_ValueOffsetInMessage,
  ------------------
  |  Branch (680:8): [True: 0, False: 852]
  ------------------
  681|    852|			                                              static_cast<size_t>(-lengthDifference)))
  682|      0|			{
  683|      0|				PCPP_LOG_ERROR("Could not shorten layer");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  684|      0|				return false;
  685|      0|			}
  686|    852|		}
  687|       |
  688|  1.41k|		if (lengthDifference != 0)
  ------------------
  |  Branch (688:7): [True: 901, False: 509]
  ------------------
  689|    901|			m_TextBasedProtocolMessage->shiftFieldsOffset(getNextField(), lengthDifference);
  690|       |
  691|       |		// update sizes
  692|  1.41k|		m_FieldValueSize += lengthDifference;
  693|  1.41k|		m_FieldSize += lengthDifference;
  694|       |
  695|       |		// write new value to field data
  696|  1.41k|		memcpy(getData() + m_ValueOffsetInMessage, newValue.c_str(), newValue.length());
  697|       |
  698|  1.41k|		return true;
  699|  1.41k|	}
_ZN4pcpp11HeaderField32attachToTextBasedProtocolMessageEPNS_24TextBasedProtocolMessageEi:
  702|  19.9k|	{
  703|  19.9k|		if (m_TextBasedProtocolMessage != nullptr && m_TextBasedProtocolMessage != message)
  ------------------
  |  Branch (703:7): [True: 0, False: 19.9k]
  |  Branch (703:48): [True: 0, False: 0]
  ------------------
  704|      0|		{
  705|      0|			PCPP_LOG_ERROR("Header field already associated with another message");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  706|      0|			return;
  707|      0|		}
  708|       |
  709|  19.9k|		if (m_NewFieldData == nullptr)
  ------------------
  |  Branch (709:7): [True: 0, False: 19.9k]
  ------------------
  710|      0|		{
  711|      0|			PCPP_LOG_ERROR("Header field doesn't have new field data");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   15|      0|#	define LOG_MODULE UndefinedLogModule
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  712|      0|			return;
  713|      0|		}
  714|       |
  715|  19.9k|		delete[] m_NewFieldData;
  716|  19.9k|		m_NewFieldData = nullptr;
  717|  19.9k|		m_TextBasedProtocolMessage = message;
  718|       |
  719|  19.9k|		int valueAndNameDifference = m_ValueOffsetInMessage - m_NameOffsetInMessage;
  720|  19.9k|		m_NameOffsetInMessage = fieldOffsetInMessage;
  721|  19.9k|		m_ValueOffsetInMessage = m_NameOffsetInMessage + valueAndNameDifference;
  722|  19.9k|	}

_ZNK4pcpp9TpktLayer10getVersionEv:
   27|  4.31k|	{
   28|  4.31k|		return getTpktHeader()->version;
   29|  4.31k|	}
_ZNK4pcpp9TpktLayer9getLengthEv:
   32|  4.31k|	{
   33|       |		return htobe16(getTpktHeader()->length);
   34|  4.31k|	}
_ZNK4pcpp9TpktLayer8toStringEv:
   47|  4.31k|	{
   48|  4.31k|		std::ostringstream versionStream;
   49|  4.31k|		versionStream << std::to_string(getVersion());
   50|  4.31k|		std::ostringstream lengthStream;
   51|  4.31k|		lengthStream << std::to_string(getLength());
   52|       |
   53|  4.31k|		return "TPKT Layer, version: " + versionStream.str() + ", length: " + lengthStream.str();
   54|  4.31k|	}
_ZN4pcpp9TpktLayer14parseNextLayerEv:
   57|  14.8k|	{
   58|  14.8k|		size_t headerLen = getHeaderLen();
   59|  14.8k|		if (m_DataLen <= headerLen)
  ------------------
  |  Branch (59:7): [True: 120, False: 14.7k]
  ------------------
   60|    120|			return;
   61|       |
   62|  14.7k|		uint8_t* payload = m_Data + headerLen;
   63|  14.7k|		size_t payloadLen = m_DataLen - headerLen;
   64|       |
   65|  14.7k|		tryConstructNextLayerWithFallback<CotpLayer, PayloadLayer>(payload, payloadLen);
   66|  14.7k|	}

_ZNK4pcpp8UdpLayer10getSrcPortEv:
   43|   339k|	{
   44|       |		return be16toh(getUdpHeader()->portSrc);
   45|   339k|	}
_ZNK4pcpp8UdpLayer10getDstPortEv:
   48|   339k|	{
   49|       |		return be16toh(getUdpHeader()->portDst);
   50|   339k|	}
_ZN4pcpp8UdpLayer17calculateChecksumEb:
   53|  45.0k|	{
   54|  45.0k|		udphdr* udpHdr = reinterpret_cast<udphdr*>(m_Data);
   55|  45.0k|		uint16_t checksumRes = 0;
   56|  45.0k|		uint16_t currChecksumValue = udpHdr->headerChecksum;
   57|       |
   58|  45.0k|		if (m_PrevLayer != nullptr)
  ------------------
  |  Branch (58:7): [True: 45.0k, False: 0]
  ------------------
   59|  45.0k|		{
   60|  45.0k|			udpHdr->headerChecksum = 0;
   61|  45.0k|			PCPP_LOG_DEBUG("UDP data len = " << m_DataLen);
  ------------------
  |  |  427|  45.0k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  45.0k|	do                                                                                                                 \
  |  |  |  |  415|  45.0k|	{                                                                                                                  \
  |  |  |  |  416|  45.0k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  45.0k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  45.0k|#define LOG_MODULE PacketLogModuleUdpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 45.0k]
  |  |  |  |  ------------------
  |  |  |  |  418|  45.0k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleUdpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  45.0k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 45.0k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   62|       |
   63|  45.0k|			if (m_PrevLayer->getProtocol() == IPv4)
  ------------------
  |  Branch (63:8): [True: 43.0k, False: 2.03k]
  ------------------
   64|  43.0k|			{
   65|  43.0k|				IPv4Address srcIP = static_cast<IPv4Layer*>(m_PrevLayer)->getSrcIPv4Address();
   66|  43.0k|				IPv4Address dstIP = static_cast<IPv4Layer*>(m_PrevLayer)->getDstIPv4Address();
   67|       |
   68|  43.0k|				checksumRes =
   69|  43.0k|				    pcpp::computePseudoHdrChecksum(reinterpret_cast<uint8_t*>(udpHdr), getDataLen(),
   70|  43.0k|				                                   IPAddress::IPv4AddressType, PACKETPP_IPPROTO_UDP, srcIP, dstIP);
   71|       |
   72|  43.0k|				PCPP_LOG_DEBUG("calculated IPv4 UDP checksum = 0x" << std::uppercase << std::hex << checksumRes);
  ------------------
  |  |  427|  43.0k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  43.0k|	do                                                                                                                 \
  |  |  |  |  415|  43.0k|	{                                                                                                                  \
  |  |  |  |  416|  43.0k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  43.0k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  43.0k|#define LOG_MODULE PacketLogModuleUdpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 43.0k]
  |  |  |  |  ------------------
  |  |  |  |  418|  43.0k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleUdpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  43.0k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 43.0k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   73|  43.0k|			}
   74|  2.03k|			else if (m_PrevLayer->getProtocol() == IPv6)
  ------------------
  |  Branch (74:13): [True: 1.79k, False: 232]
  ------------------
   75|  1.79k|			{
   76|  1.79k|				IPv6Address srcIP = static_cast<IPv6Layer*>(m_PrevLayer)->getSrcIPv6Address();
   77|  1.79k|				IPv6Address dstIP = static_cast<IPv6Layer*>(m_PrevLayer)->getDstIPv6Address();
   78|       |
   79|  1.79k|				checksumRes = computePseudoHdrChecksum(reinterpret_cast<uint8_t*>(udpHdr), getDataLen(),
   80|  1.79k|				                                       IPAddress::IPv6AddressType, PACKETPP_IPPROTO_UDP, srcIP, dstIP);
   81|       |
   82|  1.79k|				PCPP_LOG_DEBUG("calculated IPv6 UDP checksum = 0xX" << std::uppercase << std::hex << checksumRes);
  ------------------
  |  |  427|  1.79k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  1.79k|	do                                                                                                                 \
  |  |  |  |  415|  1.79k|	{                                                                                                                  \
  |  |  |  |  416|  1.79k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  1.79k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|  1.79k|#define LOG_MODULE PacketLogModuleUdpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 1.79k]
  |  |  |  |  ------------------
  |  |  |  |  418|  1.79k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleUdpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  1.79k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 1.79k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   83|  1.79k|			}
   84|  45.0k|		}
   85|       |
   86|  45.0k|		if (checksumRes == 0)
  ------------------
  |  Branch (86:7): [True: 334, False: 44.7k]
  ------------------
   87|    334|			checksumRes = 0xffff;
   88|       |
   89|  45.0k|		if (writeResultToPacket)
  ------------------
  |  Branch (89:7): [True: 45.0k, False: 0]
  ------------------
   90|  45.0k|			udpHdr->headerChecksum = htobe16(checksumRes);
   91|      0|		else
   92|      0|			udpHdr->headerChecksum = currChecksumValue;
   93|       |
   94|  45.0k|		return checksumRes;
   95|  45.0k|	}
_ZN4pcpp8UdpLayer14parseNextLayerEv:
   98|   250k|	{
   99|   250k|		if (m_DataLen <= sizeof(udphdr))
  ------------------
  |  Branch (99:7): [True: 498, False: 249k]
  ------------------
  100|    498|			return;
  101|       |
  102|   249k|		uint16_t portDst = getDstPort();
  103|   249k|		uint16_t portSrc = getSrcPort();
  104|       |
  105|   249k|		uint8_t* udpData = m_Data + sizeof(udphdr);
  106|   249k|		size_t udpDataLen = m_DataLen - sizeof(udphdr);
  107|       |
  108|   249k|		if (DhcpLayer::isDhcpPorts(portSrc, portDst))
  ------------------
  |  Branch (108:7): [True: 21.8k, False: 227k]
  ------------------
  109|  21.8k|		{
  110|  21.8k|			tryConstructNextLayerWithFallback<DhcpLayer, PayloadLayer>(udpData, udpDataLen);
  111|  21.8k|		}
  112|   227k|		else if (VxlanLayer::isVxlanPort(portDst))
  ------------------
  |  Branch (112:12): [True: 6.11k, False: 221k]
  ------------------
  113|  6.11k|		{
  114|  6.11k|			tryConstructNextLayerWithFallback<VxlanLayer, PayloadLayer>(udpData, udpDataLen);
  115|  6.11k|		}
  116|   221k|		else if (GeneveLayer::isGenevePort(portDst))
  ------------------
  |  Branch (116:12): [True: 5.71k, False: 216k]
  ------------------
  117|  5.71k|		{
  118|  5.71k|			tryConstructNextLayerWithFallback<GeneveLayer, PayloadLayer>(udpData, udpDataLen);
  119|  5.71k|		}
  120|   216k|		else if (DnsLayer::isDataValid(udpData, udpDataLen) &&
  ------------------
  |  Branch (120:12): [True: 212k, False: 3.60k]
  ------------------
  121|   212k|		         (DnsLayer::isDnsPort(portDst) || DnsLayer::isDnsPort(portSrc)))
  ------------------
  |  Branch (121:13): [True: 28.7k, False: 183k]
  |  Branch (121:45): [True: 8.70k, False: 175k]
  ------------------
  122|  37.4k|		{
  123|  37.4k|			constructNextLayer<DnsLayer>(udpData, udpDataLen);
  124|  37.4k|		}
  125|   178k|		else if (QuicV1Layer::isQuicPort(portDst) || QuicV1Layer::isQuicPort(portSrc))
  ------------------
  |  Branch (125:12): [True: 968, False: 177k]
  |  Branch (125:48): [True: 358, False: 177k]
  ------------------
  126|  1.32k|		{
  127|  1.32k|			tryConstructNextLayerFromFactoryWithFallback<PayloadLayer>(QuicV1Layer::parseQuicLayer, udpData,
  128|  1.32k|			                                                           udpDataLen);
  129|  1.32k|		}
  130|   177k|		else if (SipLayer::isSipPort(portDst) || SipLayer::isSipPort(portSrc))
  ------------------
  |  Branch (130:12): [True: 10.5k, False: 166k]
  |  Branch (130:44): [True: 161, False: 166k]
  ------------------
  131|  10.7k|		{
  132|       |			// Resolves the overload of parseSipLayer, without static_casting a function pointer.
  133|  10.7k|			auto* (*fac)(uint8_t*, size_t, Layer*, Packet*, uint16_t, uint16_t) = SipLayer::parseSipLayer;
  134|  10.7k|			tryConstructNextLayerFromFactoryWithFallback<PayloadLayer>(fac, udpData, udpDataLen, portSrc, portDst);
  135|  10.7k|		}
  136|   166k|		else if ((RadiusLayer::isRadiusPort(portDst) || RadiusLayer::isRadiusPort(portSrc)) &&
  ------------------
  |  Branch (136:13): [True: 14.6k, False: 151k]
  |  Branch (136:51): [True: 14.1k, False: 137k]
  ------------------
  137|  28.8k|		         RadiusLayer::isDataValid(udpData, udpDataLen))
  ------------------
  |  Branch (137:12): [True: 21.9k, False: 6.92k]
  ------------------
  138|  21.9k|		{
  139|  21.9k|			constructNextLayer<RadiusLayer>(udpData, udpDataLen);
  140|  21.9k|		}
  141|   144k|		else if ((GtpV1Layer::isGTPv1Port(portDst) || GtpV1Layer::isGTPv1Port(portSrc)) &&
  ------------------
  |  Branch (141:13): [True: 27.7k, False: 116k]
  |  Branch (141:49): [True: 8.53k, False: 108k]
  ------------------
  142|  36.3k|		         GtpV1Layer::isGTPv1(udpData, udpDataLen))
  ------------------
  |  Branch (142:12): [True: 23.8k, False: 12.4k]
  ------------------
  143|  23.8k|		{
  144|  23.8k|			constructNextLayer<GtpV1Layer>(udpData, udpDataLen);
  145|  23.8k|		}
  146|   120k|		else if ((GtpV2Layer::isGTPv2Port(portDst) || GtpV2Layer::isGTPv2Port(portSrc)) &&
  ------------------
  |  Branch (146:13): [True: 10.5k, False: 110k]
  |  Branch (146:49): [True: 0, False: 110k]
  ------------------
  147|  10.5k|		         GtpV2Layer::isDataValid(udpData, udpDataLen))
  ------------------
  |  Branch (147:12): [True: 10.2k, False: 325]
  ------------------
  148|  10.2k|		{
  149|  10.2k|			constructNextLayer<GtpV2Layer>(udpData, udpDataLen);
  150|  10.2k|		}
  151|   110k|		else if ((DhcpV6Layer::isDhcpV6Port(portSrc) || DhcpV6Layer::isDhcpV6Port(portDst)) &&
  ------------------
  |  Branch (151:13): [True: 1.64k, False: 108k]
  |  Branch (151:51): [True: 4.05k, False: 104k]
  ------------------
  152|  5.70k|		         (DhcpV6Layer::isDataValid(udpData, udpDataLen)))
  ------------------
  |  Branch (152:12): [True: 5.70k, False: 0]
  ------------------
  153|  5.70k|		{
  154|  5.70k|			constructNextLayer<DhcpV6Layer>(udpData, udpDataLen);
  155|  5.70k|		}
  156|   104k|		else if ((NtpLayer::isNTPPort(portSrc) || NtpLayer::isNTPPort(portDst)) &&
  ------------------
  |  Branch (156:13): [True: 1.50k, False: 103k]
  |  Branch (156:45): [True: 6.11k, False: 97.2k]
  ------------------
  157|  7.61k|		         NtpLayer::isDataValid(udpData, udpDataLen))
  ------------------
  |  Branch (157:12): [True: 7.39k, False: 224]
  ------------------
  158|  7.39k|		{
  159|  7.39k|			constructNextLayer<NtpLayer>(udpData, udpDataLen);
  160|  7.39k|		}
  161|  97.4k|		else if ((DoIpLayer::isDoIpPort(portSrc) || DoIpLayer::isDoIpPort(portDst)) &&
  ------------------
  |  Branch (161:13): [True: 0, False: 97.4k]
  |  Branch (161:47): [True: 0, False: 97.4k]
  ------------------
  162|      0|		         (DoIpLayer::isDataValid(udpData, udpDataLen)))
  ------------------
  |  Branch (162:12): [True: 0, False: 0]
  ------------------
  163|      0|		{
  164|      0|			tryConstructNextLayerFromFactoryWithFallback<PayloadLayer>(DoIpLayer::parseDoIpLayer, udpData, udpDataLen);
  165|      0|		}
  166|  97.4k|		else if (SomeIpLayer::isSomeIpPort(portSrc) || SomeIpLayer::isSomeIpPort(portDst))
  ------------------
  |  Branch (166:12): [True: 7.20k, False: 90.2k]
  |  Branch (166:50): [True: 42.3k, False: 47.9k]
  ------------------
  167|  49.5k|		{
  168|  49.5k|			constructNextLayerFromFactory(SomeIpLayer::parseSomeIpLayer, udpData, udpDataLen);
  169|  49.5k|		}
  170|  47.9k|		else if ((WakeOnLanLayer::isWakeOnLanPort(portDst) && WakeOnLanLayer::isDataValid(udpData, udpDataLen)))
  ------------------
  |  Branch (170:13): [True: 3.99k, False: 43.9k]
  |  Branch (170:57): [True: 623, False: 3.36k]
  ------------------
  171|    623|		{
  172|    623|			constructNextLayer<WakeOnLanLayer>(udpData, udpDataLen);
  173|    623|		}
  174|  47.3k|		else if ((WireGuardLayer::isWireGuardPorts(portDst, portSrc) &&
  ------------------
  |  Branch (174:13): [True: 1.84k, False: 45.4k]
  ------------------
  175|  1.84k|		          WireGuardLayer::isDataValid(udpData, udpDataLen)))
  ------------------
  |  Branch (175:13): [True: 1.80k, False: 45]
  ------------------
  176|  1.80k|		{
  177|  1.80k|			tryConstructNextLayerFromFactoryWithFallback<PayloadLayer>(WireGuardLayer::parseWireGuardLayer, udpData,
  178|  1.80k|			                                                           udpDataLen);
  179|  1.80k|		}
  180|  45.5k|		else if (GvcpLayer::isGvcpPort(portDst) || GvcpLayer::isGvcpPort(portSrc))
  ------------------
  |  Branch (180:12): [True: 310, False: 45.2k]
  |  Branch (180:46): [True: 0, False: 45.2k]
  ------------------
  181|    310|		{
  182|    310|			tryConstructNextLayerFromFactoryWithFallback<PayloadLayer>(GvcpLayer::parseGvcpLayer, udpData, udpDataLen);
  183|    310|		}
  184|       |
  185|       |		// If a valid layer was found, return immediately
  186|   249k|		if (hasNextLayer())
  ------------------
  |  Branch (186:7): [True: 204k, False: 45.2k]
  ------------------
  187|   204k|		{
  188|   204k|			return;
  189|   204k|		}
  190|       |
  191|       |		// Here, heuristics for all protocols should be invoked to determine the correct layer
  192|  45.2k|		{
  193|       |			// Resolves the overload of parseSipLayer, without static_casting a function pointer.
  194|  45.2k|			auto* (*fac)(uint8_t*, size_t, Layer*, Packet*) = SipLayer::parseSipLayer;
  195|  45.2k|			tryConstructNextLayerFromFactoryWithFallback<PayloadLayer>(fac, udpData, udpDataLen);
  196|  45.2k|		}
  197|       |
  198|       |		// cppcheck-suppress knownConditionTrueFalse
  199|  45.2k|		if (!hasNextLayer())
  ------------------
  |  Branch (199:7): [True: 0, False: 45.2k]
  ------------------
  200|      0|		{
  201|      0|			constructNextLayer<PayloadLayer>(udpData, udpDataLen);
  202|      0|		}
  203|  45.2k|	}
_ZN4pcpp8UdpLayer22computeCalculateFieldsEv:
  206|  45.0k|	{
  207|  45.0k|		udphdr* udpHdr = reinterpret_cast<udphdr*>(m_Data);
  208|       |		udpHdr->length = htobe16(m_DataLen);
  209|  45.0k|		calculateChecksum(true);
  210|  45.0k|	}
_ZNK4pcpp8UdpLayer8toStringEv:
  213|  90.1k|	{
  214|  90.1k|		std::ostringstream srcPortStream;
  215|  90.1k|		srcPortStream << getSrcPort();
  216|  90.1k|		std::ostringstream dstPortStream;
  217|  90.1k|		dstPortStream << getDstPort();
  218|       |
  219|  90.1k|		return "UDP Layer, Src port: " + srcPortStream.str() + ", Dst port: " + dstPortStream.str();
  220|  90.1k|	}

_ZNK4pcpp9VlanLayer9getVlanIDEv:
   30|  14.9k|	{
   31|       |		return be16toh(getVlanHeader()->vlan) & 0xFFF;
   32|  14.9k|	}
_ZNK4pcpp9VlanLayer6getCFIEv:
   35|  14.9k|	{
   36|       |		return ((be16toh(getVlanHeader()->vlan) >> 12) & 1);
   37|  14.9k|	}
_ZNK4pcpp9VlanLayer11getPriorityEv:
   40|  14.9k|	{
   41|       |		return (be16toh(getVlanHeader()->vlan) >> 13) & 7;
   42|  14.9k|	}
_ZN4pcpp9VlanLayer14parseNextLayerEv:
   60|  73.8k|	{
   61|  73.8k|		if (m_DataLen <= sizeof(vlan_header))
  ------------------
  |  Branch (61:7): [True: 0, False: 73.8k]
  ------------------
   62|      0|			return;
   63|       |
   64|  73.8k|		uint8_t* payload = m_Data + sizeof(vlan_header);
   65|  73.8k|		size_t payloadLen = m_DataLen - sizeof(vlan_header);
   66|       |
   67|  73.8k|		vlan_header* hdr = getVlanHeader();
   68|  73.8k|		switch (be16toh(hdr->etherType))
   69|  73.8k|		{
   70|  13.7k|		case PCPP_ETHERTYPE_IP:
  ------------------
  |  |   33|  13.7k|#define PCPP_ETHERTYPE_IP 0x0800
  ------------------
  |  Branch (70:3): [True: 13.7k, False: 60.0k]
  ------------------
   71|  13.7k|		{
   72|  13.7k|			tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen);
   73|  13.7k|			break;
   74|      0|		}
   75|  2.15k|		case PCPP_ETHERTYPE_IPV6:
  ------------------
  |  |   49|  2.15k|#define PCPP_ETHERTYPE_IPV6 0x86dd
  ------------------
  |  Branch (75:3): [True: 2.15k, False: 71.6k]
  ------------------
   76|  2.15k|		{
   77|  2.15k|			tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen);
   78|  2.15k|			break;
   79|      0|		}
   80|  5.41k|		case PCPP_ETHERTYPE_ARP:
  ------------------
  |  |   35|  5.41k|#define PCPP_ETHERTYPE_ARP 0x0806
  ------------------
  |  Branch (80:3): [True: 5.41k, False: 68.4k]
  ------------------
   81|  5.41k|		{
   82|  5.41k|			tryConstructNextLayerWithFallback<ArpLayer, PayloadLayer>(payload, payloadLen);
   83|  5.41k|			break;
   84|      0|		}
   85|  18.0k|		case PCPP_ETHERTYPE_VLAN:
  ------------------
  |  |   45|  18.0k|#define PCPP_ETHERTYPE_VLAN 0x8100
  ------------------
  |  Branch (85:3): [True: 18.0k, False: 55.7k]
  ------------------
   86|  18.0k|		case PCPP_ETHERTYPE_IEEE_802_1AD:
  ------------------
  |  |   63|  18.0k|#define PCPP_ETHERTYPE_IEEE_802_1AD 0x88A8
  ------------------
  |  Branch (86:3): [True: 0, False: 73.8k]
  ------------------
   87|  18.0k|		{
   88|  18.0k|			tryConstructNextLayerWithFallback<VlanLayer, PayloadLayer>(payload, payloadLen);
   89|  18.0k|			break;
   90|  18.0k|		}
   91|  18.3k|		case PCPP_ETHERTYPE_PPPOES:
  ------------------
  |  |   55|  18.3k|#define PCPP_ETHERTYPE_PPPOES 0x8864
  ------------------
  |  Branch (91:3): [True: 18.3k, False: 55.4k]
  ------------------
   92|  18.3k|		{
   93|  18.3k|			tryConstructNextLayerWithFallback<PPPoESessionLayer, PayloadLayer>(payload, payloadLen);
   94|  18.3k|			break;
   95|  18.0k|		}
   96|      8|		case PCPP_ETHERTYPE_PPPOED:
  ------------------
  |  |   53|      8|#define PCPP_ETHERTYPE_PPPOED 0x8863
  ------------------
  |  Branch (96:3): [True: 8, False: 73.8k]
  ------------------
   97|      8|		{
   98|      8|			tryConstructNextLayerWithFallback<PPPoEDiscoveryLayer, PayloadLayer>(payload, payloadLen);
   99|      8|			break;
  100|  18.0k|		}
  101|  11.6k|		case PCPP_ETHERTYPE_MPLS:
  ------------------
  |  |   57|  11.6k|#define PCPP_ETHERTYPE_MPLS 0x8847
  ------------------
  |  Branch (101:3): [True: 11.6k, False: 62.1k]
  ------------------
  102|  11.6k|		{
  103|  11.6k|			tryConstructNextLayerWithFallback<MplsLayer, PayloadLayer>(payload, payloadLen);
  104|  11.6k|			break;
  105|  18.0k|		}
  106|  4.42k|		default:
  ------------------
  |  Branch (106:3): [True: 4.42k, False: 69.4k]
  ------------------
  107|  4.42k|		{
  108|  4.42k|			if ((be16toh(hdr->etherType) < 1500))
  ------------------
  |  Branch (108:8): [True: 3.54k, False: 877]
  ------------------
  109|  3.54k|			{
  110|  3.54k|				tryConstructNextLayerWithFallback<LLCLayer, PayloadLayer>(payload, payloadLen);
  111|  3.54k|			}
  112|    877|			else
  113|    877|			{
  114|    877|				constructNextLayer<PayloadLayer>(payload, payloadLen);
  115|    877|			}
  116|  4.42k|			break;
  117|  18.0k|		}
  118|  73.8k|		}
  119|  73.8k|	}
_ZN4pcpp9VlanLayer22computeCalculateFieldsEv:
  122|  7.48k|	{
  123|  7.48k|		if (m_NextLayer == nullptr)
  ------------------
  |  Branch (123:7): [True: 0, False: 7.48k]
  ------------------
  124|      0|			return;
  125|       |
  126|  7.48k|		switch (m_NextLayer->getProtocol())
  127|  7.48k|		{
  128|  2.07k|		case IPv4:
  ------------------
  |  Branch (128:3): [True: 2.07k, False: 5.40k]
  ------------------
  129|  2.07k|			getVlanHeader()->etherType = htobe16(PCPP_ETHERTYPE_IP);
  130|  2.07k|			break;
  131|    343|		case IPv6:
  ------------------
  |  Branch (131:3): [True: 343, False: 7.13k]
  ------------------
  132|    343|			getVlanHeader()->etherType = htobe16(PCPP_ETHERTYPE_IPV6);
  133|    343|			break;
  134|  1.05k|		case ARP:
  ------------------
  |  Branch (134:3): [True: 1.05k, False: 6.43k]
  ------------------
  135|  1.05k|			getVlanHeader()->etherType = htobe16(PCPP_ETHERTYPE_ARP);
  136|  1.05k|			break;
  137|    936|		case VLAN:
  ------------------
  |  Branch (137:3): [True: 936, False: 6.54k]
  ------------------
  138|    936|			getVlanHeader()->etherType = htobe16(PCPP_ETHERTYPE_VLAN);
  139|    936|			break;
  140|  3.07k|		default:
  ------------------
  |  Branch (140:3): [True: 3.07k, False: 4.40k]
  ------------------
  141|  3.07k|			return;
  142|  7.48k|		}
  143|  7.48k|	}
_ZNK4pcpp9VlanLayer8toStringEv:
  146|  14.9k|	{
  147|  14.9k|		std::ostringstream cfiStream;
  148|  14.9k|		cfiStream << (int)getCFI();
  149|  14.9k|		std::ostringstream priStream;
  150|  14.9k|		priStream << (int)getPriority();
  151|  14.9k|		std::ostringstream idStream;
  152|  14.9k|		idStream << getVlanID();
  153|       |
  154|  14.9k|		return "VLAN Layer, Priority: " + priStream.str() + ", Vlan ID: " + idStream.str() +
  155|  14.9k|		       ", CFI: " + cfiStream.str();
  156|  14.9k|	}

_ZN4pcpp9VrrpLayer18getVersionFromDataEPhm:
   46|  11.8k|	{
   47|  11.8k|		if (!data || dataLen <= VrrpPacketFixedLength)
  ------------------
  |  Branch (47:7): [True: 0, False: 11.8k]
  |  Branch (47:16): [True: 0, False: 11.8k]
  ------------------
   48|      0|		{
   49|      0|			return UnknownProtocol;
   50|      0|		}
   51|       |
   52|  11.8k|		auto* vrrpPacketCommon = (vrrp_header*)data;
   53|  11.8k|		uint8_t version = vrrpPacketCommon->version;
   54|  11.8k|		switch (version)
   55|  11.8k|		{
   56|  5.62k|		case VrrpVersion2:
  ------------------
  |  Branch (56:3): [True: 5.62k, False: 6.23k]
  ------------------
   57|  5.62k|			return VRRPv2;
   58|  6.12k|		case VrrpVersion3:
  ------------------
  |  Branch (58:3): [True: 6.12k, False: 5.73k]
  ------------------
   59|  6.12k|			return VRRPv3;
   60|    110|		default:
  ------------------
  |  Branch (60:3): [True: 110, False: 11.7k]
  ------------------
   61|    110|			return UnknownProtocol;
   62|  11.8k|		}
   63|  11.8k|	}
_ZN4pcpp9VrrpLayer22computeCalculateFieldsEv:
   66|  2.69k|	{
   67|       |		// calculate and fill the checksum to packet
   68|  2.69k|		calculateAndSetChecksum();
   69|  2.69k|	}
_ZNK4pcpp9VrrpLayer15getIPAddressLenEv:
   72|  13.2k|	{
   73|  13.2k|		if (getAddressType() == IPAddress::IPv4AddressType)
  ------------------
  |  Branch (73:7): [True: 9.37k, False: 3.86k]
  ------------------
   74|  9.37k|		{
   75|  9.37k|			return 4;
   76|  9.37k|		}
   77|       |
   78|  3.86k|		return 16;
   79|  13.2k|	}
_ZNK4pcpp9VrrpLayer17isChecksumCorrectEv:
   82|  2.69k|	{
   83|  2.69k|		auto vrrpHeader = getVrrpHeader();
   84|  2.69k|		if (vrrpHeader == nullptr)
  ------------------
  |  Branch (84:7): [True: 0, False: 2.69k]
  ------------------
   85|      0|		{
   86|      0|			return false;
   87|      0|		}
   88|       |
   89|  2.69k|		return (calculateChecksum() == be16toh(vrrpHeader->checksum));
   90|  2.69k|	}
_ZNK4pcpp9VrrpLayer17getPriorityAsEnumEv:
   93|  2.69k|	{
   94|  2.69k|		switch (getVrrpHeader()->priority)
   95|  2.69k|		{
   96|     32|		case VrrpPriorityDefault:
  ------------------
  |  Branch (96:3): [True: 32, False: 2.66k]
  ------------------
   97|     32|			return VrrpLayer::VrrpPriority::Default;
   98|       |
   99|     62|		case VrrpPriorityStop:
  ------------------
  |  Branch (99:3): [True: 62, False: 2.63k]
  ------------------
  100|     62|			return VrrpLayer::VrrpPriority::Stop;
  101|       |
  102|    385|		case VrrpPriorityOwner:
  ------------------
  |  Branch (102:3): [True: 385, False: 2.30k]
  ------------------
  103|    385|			return VrrpLayer::VrrpPriority::Owner;
  104|       |
  105|  2.21k|		default:
  ------------------
  |  Branch (105:3): [True: 2.21k, False: 479]
  ------------------
  106|  2.21k|			return VrrpLayer::VrrpPriority::Other;
  107|  2.69k|		}
  108|  2.69k|	}
_ZNK4pcpp9VrrpLayer8toStringEv:
  111|  5.38k|	{
  112|  5.38k|		return "VRRP v" + std::to_string(getVersion()) +
  113|  5.38k|		       " Layer, virtual router ID: " + std::to_string(getVirtualRouterID()) +
  114|  5.38k|		       ", IP address count: " + std::to_string(getIPAddressesCount());
  115|  5.38k|	}
_ZNK4pcpp9VrrpLayer10getVersionEv:
  118|  5.38k|	{
  119|  5.38k|		return getVrrpHeader()->version;
  120|  5.38k|	}
_ZNK4pcpp9VrrpLayer7getTypeEv:
  123|  2.69k|	{
  124|  2.69k|		if (getVrrpHeader()->type == VrrpType_Advertisement)
  ------------------
  |  Branch (124:7): [True: 2.04k, False: 646]
  ------------------
  125|  2.04k|		{
  126|  2.04k|			return VrrpType_Advertisement;
  127|  2.04k|		}
  128|       |
  129|    646|		return VrrpType_Unknown;
  130|  2.69k|	}
_ZNK4pcpp9VrrpLayer18getVirtualRouterIDEv:
  133|  5.38k|	{
  134|  5.38k|		return getVrrpHeader()->vrId;
  135|  5.38k|	}
_ZNK4pcpp9VrrpLayer11getPriorityEv:
  143|  2.69k|	{
  144|  2.69k|		return getVrrpHeader()->priority;
  145|  2.69k|	}
_ZNK4pcpp9VrrpLayer11getChecksumEv:
  153|  2.69k|	{
  154|       |		return be16toh(getVrrpHeader()->checksum);
  155|  2.69k|	}
_ZN4pcpp9VrrpLayer23calculateAndSetChecksumEv:
  158|  2.69k|	{
  159|       |		getVrrpHeader()->checksum = htobe16(calculateChecksum());
  160|  2.69k|	}
_ZNK4pcpp9VrrpLayer19getIPAddressesCountEv:
  163|  5.38k|	{
  164|  5.38k|		return getVrrpHeader()->ipAddrCount;
  165|  5.38k|	}
_ZNK4pcpp9VrrpLayer14getIPAddressesEv:
  168|  2.69k|	{
  169|  2.69k|		std::vector<IPAddress> ipAddressesVec;
  170|  2.69k|		auto ipAddressesPtr = getFirstIPAddressPtr();
  171|  13.2k|		while (ipAddressesPtr != nullptr)
  ------------------
  |  Branch (171:10): [True: 10.5k, False: 2.69k]
  ------------------
  172|  10.5k|		{
  173|  10.5k|			IPAddress ipAddress = getIPAddressFromData(ipAddressesPtr);
  174|  10.5k|			ipAddressesVec.push_back(ipAddress);
  175|  10.5k|			ipAddressesPtr = getNextIPAddressPtr(ipAddressesPtr);
  176|  10.5k|		}
  177|       |
  178|  2.69k|		return ipAddressesVec;
  179|  2.69k|	}
_ZNK4pcpp9VrrpLayer20getFirstIPAddressPtrEv:
  182|  2.69k|	{
  183|  2.69k|		size_t ipAddressLen = getIPAddressLen();
  184|       |
  185|       |		// check if there are virtual IP address at all
  186|  2.69k|		if (getHeaderLen() <= VrrpPacketFixedLength + ipAddressLen)
  ------------------
  |  Branch (186:7): [True: 162, False: 2.53k]
  ------------------
  187|    162|		{
  188|    162|			return nullptr;
  189|    162|		}
  190|       |
  191|  2.53k|		return (m_Data + VrrpPacketFixedLength);
  192|  2.69k|	}
_ZNK4pcpp9VrrpLayer19getNextIPAddressPtrEPh:
  195|  10.5k|	{
  196|  10.5k|		if (ipAddressPtr == nullptr)
  ------------------
  |  Branch (196:7): [True: 0, False: 10.5k]
  ------------------
  197|      0|		{
  198|      0|			return nullptr;
  199|      0|		}
  200|       |
  201|  10.5k|		size_t ipAddressLen = getIPAddressLen();
  202|  10.5k|		size_t nextOffset = static_cast<size_t>(ipAddressPtr - m_Data) + ipAddressLen;
  203|       |
  204|       |		// The next virtual IP address must fit entirely inside the layer. Checking only that the current
  205|       |		// address ends inside it leaves a trailing partial address reachable, which the caller then reads
  206|       |		// in full and runs past the end of the buffer.
  207|  10.5k|		if (nextOffset + ipAddressLen > getHeaderLen())
  ------------------
  |  Branch (207:7): [True: 2.53k, False: 8.01k]
  ------------------
  208|  2.53k|		{
  209|  2.53k|			return nullptr;
  210|  2.53k|		}
  211|       |
  212|  8.01k|		return (m_Data + nextOffset);
  213|  10.5k|	}
_ZNK4pcpp9VrrpLayer20getIPAddressFromDataEPh:
  350|  10.5k|	{
  351|  10.5k|		if (getAddressType() == IPAddress::IPv4AddressType)
  ------------------
  |  Branch (351:7): [True: 7.54k, False: 2.99k]
  ------------------
  352|  7.54k|		{
  353|  7.54k|			return IPv4Address(*reinterpret_cast<const uint32_t*>(data));
  354|  7.54k|		}
  355|       |
  356|  2.99k|		return IPv6Address(data);
  357|  10.5k|	}
_ZNK4pcpp9VrrpLayer14getAddressTypeEv:
  376|  26.8k|	{
  377|  26.8k|		return m_AddressType;
  378|  26.8k|	}
_ZNK4pcpp11VrrpV2Layer17getAuthTypeAsEnumEv:
  448|  1.17k|	{
  449|  1.17k|		auto authType = getAuthType();
  450|  1.17k|		if (authType > 3)
  ------------------
  |  Branch (450:7): [True: 11, False: 1.16k]
  ------------------
  451|     11|		{
  452|     11|			return VrrpAuthType::Other;
  453|     11|		}
  454|       |
  455|  1.16k|		return static_cast<VrrpAuthType>(authType);
  456|  1.17k|	}
_ZNK4pcpp11VrrpV2Layer9getAdvIntEv:
  459|  1.17k|	{
  460|  1.17k|		uint16_t authAdvInt = getVrrpHeader()->authTypeAdvInt;
  461|  1.17k|		auto authAdvIntPtr = reinterpret_cast<vrrpv2_auth_adv*>(&authAdvInt);
  462|  1.17k|		return authAdvIntPtr->advInt;
  463|  1.17k|	}
_ZNK4pcpp11VrrpV2Layer11getAuthTypeEv:
  472|  1.17k|	{
  473|  1.17k|		uint16_t authAdvInt = getVrrpHeader()->authTypeAdvInt;
  474|  1.17k|		auto* authAdvIntPtr = reinterpret_cast<vrrpv2_auth_adv*>(&authAdvInt);
  475|  1.17k|		return authAdvIntPtr->authType;
  476|  1.17k|	}
_ZNK4pcpp11VrrpV2Layer17calculateChecksumEv:
  485|  2.34k|	{
  486|  2.34k|		if ((getData() == nullptr) || (getDataLen() == 0))
  ------------------
  |  Branch (486:7): [True: 0, False: 2.34k]
  |  Branch (486:33): [True: 0, False: 2.34k]
  ------------------
  487|      0|		{
  488|      0|			return 0;
  489|      0|		}
  490|       |
  491|  2.34k|		auto vrrpHeader = getVrrpHeader();
  492|  2.34k|		ScalarBuffer<uint16_t> buffer = {};
  493|  2.34k|		buffer.buffer = reinterpret_cast<uint16_t*>(vrrpHeader);
  494|  2.34k|		buffer.len = getHeaderLen();
  495|       |
  496|  2.34k|		uint16_t currChecksumValue = vrrpHeader->checksum;
  497|  2.34k|		vrrpHeader->checksum = 0;
  498|  2.34k|		uint16_t checksum = computeChecksum(&buffer, 1);
  499|  2.34k|		vrrpHeader->checksum = currChecksumValue;
  500|       |
  501|  2.34k|		return checksum;
  502|  2.34k|	}
_ZNK4pcpp11VrrpV3Layer12getMaxAdvIntEv:
  541|  1.51k|	{
  542|  1.51k|		uint16_t authAdvInt = getVrrpHeader()->authTypeAdvInt;
  543|  1.51k|		auto rsvdAdv = reinterpret_cast<vrrpv3_rsvd_adv*>(&authAdvInt);
  544|       |		return be16toh(rsvdAdv->maxAdvInt);
  545|  1.51k|	}
_ZNK4pcpp11VrrpV3Layer17calculateChecksumEv:
  558|  3.03k|	{
  559|  3.03k|		auto* ipLayer = getAttachedPacket()->getLayerOfType<pcpp::IPLayer>();
  560|  3.03k|		if (ipLayer == nullptr)
  ------------------
  |  Branch (560:7): [True: 0, False: 3.03k]
  ------------------
  561|      0|		{
  562|      0|			PCPP_LOG_ERROR("Calculate checksum failed, for can not get IPLayer" << "");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleVrrpLayer
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PacketLogModuleVrrpLayer
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  563|      0|			return 0;
  564|      0|		}
  565|       |
  566|  3.03k|		auto vrrpHeader = getVrrpHeader();
  567|  3.03k|		uint16_t currChecksumValue = vrrpHeader->checksum;
  568|  3.03k|		vrrpHeader->checksum = 0;
  569|       |
  570|  3.03k|		pcpp::IPAddress srcIPAddr = ipLayer->getSrcIPAddress();
  571|  3.03k|		pcpp::IPAddress dstIPAddr = ipLayer->getDstIPAddress();
  572|  3.03k|		uint16_t checksum;
  573|  3.03k|		if (getAddressType() == IPAddress::IPv4AddressType)
  ------------------
  |  Branch (573:7): [True: 1.30k, False: 1.73k]
  ------------------
  574|  1.30k|		{
  575|  1.30k|			checksum = computePseudoHdrChecksum((uint8_t*)vrrpHeader, getDataLen(), IPAddress::IPv4AddressType,
  576|  1.30k|			                                    PACKETPP_IPPROTO_VRRP, srcIPAddr, dstIPAddr);
  577|  1.30k|		}
  578|  1.73k|		else
  579|  1.73k|		{
  580|  1.73k|			checksum = computePseudoHdrChecksum((uint8_t*)vrrpHeader, getDataLen(), IPAddress::IPv6AddressType,
  581|  1.73k|			                                    PACKETPP_IPPROTO_VRRP, srcIPAddr, dstIPAddr);
  582|  1.73k|		}
  583|       |
  584|  3.03k|		vrrpHeader->checksum = currChecksumValue;
  585|       |
  586|  3.03k|		return checksum;
  587|  3.03k|	}

_ZNK4pcpp10VxlanLayer8toStringEv:
   46|  1.43k|	{
   47|  1.43k|		return "VXLAN Layer";
   48|  1.43k|	}
_ZN4pcpp10VxlanLayer14parseNextLayerEv:
   51|  6.11k|	{
   52|  6.11k|		if (m_DataLen <= sizeof(vxlan_header))
  ------------------
  |  Branch (52:7): [True: 0, False: 6.11k]
  ------------------
   53|      0|			return;
   54|       |
   55|  6.11k|		auto payload = m_Data + sizeof(vxlan_header);
   56|  6.11k|		auto payloadLen = m_DataLen - sizeof(vxlan_header);
   57|  6.11k|		tryConstructNextLayerWithFallback<EthLayer, PayloadLayer>(payload, payloadLen);
   58|  6.11k|	}

_ZNK4pcpp14WakeOnLanLayer13getTargetAddrEv:
   46|    190|	{
   47|    190|		return pcpp::MacAddress(getWakeOnLanHeader()->addrBody);
   48|    190|	}
_ZN4pcpp14WakeOnLanLayer11isDataValidEPKhm:
  114|  4.33k|	{
  115|  4.33k|		if (data && dataSize >= sizeof(wol_header))
  ------------------
  |  Branch (115:7): [True: 4.33k, False: 0]
  |  Branch (115:15): [True: 3.00k, False: 1.33k]
  ------------------
  116|  3.00k|		{
  117|       |			// It should repeat same MAC address at the payload 16 times
  118|  3.00k|			pcpp::MacAddress bufAddr(&data[6]);
  119|  31.7k|			for (size_t idx = 1; idx < 16; ++idx)
  ------------------
  |  Branch (119:25): [True: 31.0k, False: 686]
  ------------------
  120|  31.0k|			{
  121|  31.0k|				if (bufAddr != pcpp::MacAddress(&data[6 + idx * 6]))
  ------------------
  |  Branch (121:9): [True: 2.31k, False: 28.7k]
  ------------------
  122|  2.31k|					return false;
  123|  31.0k|			}
  124|    686|			return true;
  125|  3.00k|		}
  126|  1.33k|		return false;
  127|  4.33k|	}
_ZNK4pcpp14WakeOnLanLayer8toStringEv:
  130|    190|	{
  131|    190|		return "Wake On LAN Layer, target address: " + getTargetAddr().toString();
  132|    190|	}

_ZN4pcpp14WireGuardLayer19parseWireGuardLayerEPhmPNS_5LayerEPNS_6PacketE:
   13|  1.80k|	{
   14|  1.80k|		if (dataLen < sizeof(WireGuardLayer::wg_common_header))
  ------------------
  |  Branch (14:7): [True: 0, False: 1.80k]
  ------------------
   15|      0|			return nullptr;
   16|  1.80k|		wg_common_header* wgHeader = reinterpret_cast<wg_common_header*>(data);
   17|       |
   18|  1.80k|		switch (wgHeader->messageType)
   19|  1.80k|		{
   20|    230|		case static_cast<uint8_t>(WireGuardMessageType::HandshakeInitiation):
  ------------------
  |  Branch (20:3): [True: 230, False: 1.57k]
  ------------------
   21|    230|			if (!WireGuardHandshakeInitiationLayer::isDataValid(data, dataLen))
  ------------------
  |  Branch (21:8): [True: 0, False: 230]
  ------------------
   22|      0|				return nullptr;
   23|    230|			return new WireGuardHandshakeInitiationLayer(data, dataLen, prevLayer, packet);
   24|    570|		case static_cast<uint8_t>(WireGuardMessageType::HandshakeResponse):
  ------------------
  |  Branch (24:3): [True: 570, False: 1.23k]
  ------------------
   25|    570|			if (!WireGuardHandshakeResponseLayer::isDataValid(data, dataLen))
  ------------------
  |  Branch (25:8): [True: 35, False: 535]
  ------------------
   26|     35|				return nullptr;
   27|    535|			return new WireGuardHandshakeResponseLayer(data, dataLen, prevLayer, packet);
   28|    130|		case static_cast<uint8_t>(WireGuardMessageType::CookieReply):
  ------------------
  |  Branch (28:3): [True: 130, False: 1.67k]
  ------------------
   29|    130|			if (!WireGuardCookieReplyLayer::isDataValid(data, dataLen))
  ------------------
  |  Branch (29:8): [True: 0, False: 130]
  ------------------
   30|      0|				return nullptr;
   31|    130|			return new WireGuardCookieReplyLayer(data, dataLen, prevLayer, packet);
   32|    870|		case static_cast<uint8_t>(WireGuardMessageType::TransportData):
  ------------------
  |  Branch (32:3): [True: 870, False: 930]
  ------------------
   33|    870|			if (!WireGuardTransportDataLayer::isDataValid(data, dataLen))
  ------------------
  |  Branch (33:8): [True: 0, False: 870]
  ------------------
   34|      0|				return nullptr;
   35|    870|			return new WireGuardTransportDataLayer(data, dataLen, prevLayer, packet);
   36|      0|		default:
  ------------------
  |  Branch (36:3): [True: 0, False: 1.80k]
  ------------------
   37|      0|			return nullptr;
   38|  1.80k|		}
   39|  1.80k|	}
_ZNK4pcpp14WireGuardLayer22getMessageTypeAsStringEv:
   42|    706|	{
   43|    706|		uint32_t messageType = getMessageType();
   44|    706|		switch (messageType)
   45|    706|		{
   46|     92|		case static_cast<uint8_t>(WireGuardMessageType::HandshakeInitiation):
  ------------------
  |  Branch (46:3): [True: 92, False: 614]
  ------------------
   47|     92|			return "Handshake Initiation";
   48|    214|		case static_cast<uint8_t>(WireGuardMessageType::HandshakeResponse):
  ------------------
  |  Branch (48:3): [True: 214, False: 492]
  ------------------
   49|    214|			return "Handshake Response";
   50|     52|		case static_cast<uint8_t>(WireGuardMessageType::CookieReply):
  ------------------
  |  Branch (50:3): [True: 52, False: 654]
  ------------------
   51|     52|			return "Cookie Reply";
   52|    348|		case static_cast<uint8_t>(WireGuardMessageType::TransportData):
  ------------------
  |  Branch (52:3): [True: 348, False: 358]
  ------------------
   53|    348|			return "Transport Data";
   54|      0|		default:
  ------------------
  |  Branch (54:3): [True: 0, False: 706]
  ------------------
   55|      0|			return "Unknown";
   56|    706|		}
   57|    706|	}
_ZNK4pcpp14WireGuardLayer8toStringEv:
   60|    706|	{
   61|    706|		return "WireGuard Layer, " + getMessageTypeAsString() + " message";
   62|    706|	}
_ZNK4pcpp14WireGuardLayer12getHeaderLenEv:
   65|    353|	{
   66|    353|		return m_DataLen;
   67|    353|	}
_ZNK4pcpp14WireGuardLayer14getMessageTypeEv:
   70|    706|	{
   71|    706|		return getBasicHeader()->messageType;
   72|    706|	}
_ZN4pcpp14WireGuardLayer11isDataValidEPKhm:
   88|  1.84k|	{
   89|  1.84k|		if (dataLen < sizeof(WireGuardLayer::wg_common_header))
  ------------------
  |  Branch (89:7): [True: 0, False: 1.84k]
  ------------------
   90|      0|			return false;
   91|       |
   92|  1.84k|		uint8_t messageType = data[0];
   93|  1.84k|		return messageType >= static_cast<uint8_t>(WireGuardLayer::WireGuardMessageType::HandshakeInitiation) &&
  ------------------
  |  Branch (93:10): [True: 1.81k, False: 35]
  ------------------
   94|  1.81k|		       messageType <= static_cast<uint8_t>(WireGuardLayer::WireGuardMessageType::TransportData);
  ------------------
  |  Branch (94:10): [True: 1.80k, False: 10]
  ------------------
   95|  1.84k|	}

_ZN4pcpp17IFilterableDeviceC2Ev:
   47|  2.25k|		IFilterableDevice() = default;
_ZN4pcpp7IDeviceC2Ev:
   23|  2.25k|		IDevice() = default;
_ZN4pcpp7IDeviceD2Ev:
   26|  2.25k|		virtual ~IDevice() = default;

_ZN4pcpp23IPcapStatisticsProviderD2Ev:
   27|  2.25k|		virtual ~IPcapStatisticsProvider() = default;

_ZN4pcpp11IFileDevice21reportPacketProcessedEm:
   66|   166k|		{
   67|   166k|			m_NumOfPacketsProcessed += numPackets;
   68|   166k|		}
_ZN4pcpp20PcapFileReaderDeviceC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  174|  2.25k|		explicit PcapFileReaderDevice(const std::string& fileName) : IFileReaderDevice(fileName)
  175|  2.25k|		{}
_ZN4pcpp20PcapFileReaderDeviceD2Ev:
  178|  2.25k|		~PcapFileReaderDevice() override = default;

_ZN4pcpp16BpfFilterWrapperC2Ev:
   93|  2.25k|		BpfFilterWrapper() = default;

_ZN4pcpp11IFileDeviceC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  494|  2.25k|	{
  495|  2.25k|		m_FileName = fileName;
  496|  2.25k|	}
_ZNK4pcpp11IFileDevice13getStatisticsERNS_9PcapStatsE:
  504|  2.23k|	{
  505|  2.23k|		PCPP_LOG_DEBUG("Statistics requested for file device for filename '" << m_FileName << "'");
  ------------------
  |  |  427|  2.23k|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|  2.23k|	do                                                                                                                 \
  |  |  |  |  415|  2.23k|	{                                                                                                                  \
  |  |  |  |  416|  2.23k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  2.23k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|  2.23k|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 2.23k]
  |  |  |  |  ------------------
  |  |  |  |  418|  2.23k|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|      0|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|  2.23k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 2.23k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  506|  2.23k|		stats.packetsRecv = m_NumOfPacketsProcessed;
  507|  2.23k|		stats.packetsDrop = m_NumOfPacketsDropped;
  508|  2.23k|		stats.packetsDropByInterface = 0;
  509|  2.23k|	}
_ZN4pcpp11IFileDevice22resetStatisticCountersEv:
  512|  2.25k|	{
  513|  2.25k|		m_NumOfPacketsProcessed = 0;
  514|  2.25k|		m_NumOfPacketsDropped = 0;
  515|  2.25k|	}
_ZN4pcpp17IFileReaderDeviceC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  531|  2.25k|	IFileReaderDevice::IFileReaderDevice(const std::string& fileName) : IFileDevice(fileName)
  532|  2.25k|	{}
_ZN4pcpp17IFileReaderDevice9getReaderERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  535|  2.25k|	{
  536|  2.25k|		const auto extensionPos = fileName.find_last_of('.');
  537|  2.25k|		const auto fileExtension = extensionPos != std::string::npos ? fileName.substr(extensionPos) : "";
  ------------------
  |  Branch (537:30): [True: 2.25k, False: 0]
  ------------------
  538|       |
  539|  2.25k|		if (fileExtension == ".pcapng" || fileExtension == ".zstd" || fileExtension == ".zst")
  ------------------
  |  Branch (539:7): [True: 0, False: 2.25k]
  |  Branch (539:37): [True: 0, False: 2.25k]
  |  Branch (539:65): [True: 0, False: 2.25k]
  ------------------
  540|      0|			return new PcapNgFileReaderDevice(fileName);
  541|  2.25k|		else if (fileExtension == ".snoop")
  ------------------
  |  Branch (541:12): [True: 0, False: 2.25k]
  ------------------
  542|      0|			return new SnoopFileReaderDevice(fileName);
  543|       |
  544|  2.25k|		return new PcapFileReaderDevice(fileName);
  545|  2.25k|	}
_ZN4pcpp17IFileReaderDevice14getNextPacketsERNS_13PointerVectorINS_9RawPacketENSt3__114default_deleteIS2_EEEEi:
  606|  2.23k|	{
  607|  2.23k|		int numOfPacketsRead = 0;
  608|       |
  609|  4.47k|		for (; numOfPacketsToRead < 0 || numOfPacketsRead < numOfPacketsToRead; numOfPacketsRead++)
  ------------------
  |  Branch (609:10): [True: 0, False: 4.47k]
  |  Branch (609:36): [True: 2.23k, False: 2.23k]
  ------------------
  610|  2.23k|		{
  611|  2.23k|			RawPacket* newPacket = new RawPacket();
  612|  2.23k|			bool packetRead = getNextPacket(*newPacket);
  613|  2.23k|			if (packetRead)
  ------------------
  |  Branch (613:8): [True: 2.23k, False: 1]
  ------------------
  614|  2.23k|			{
  615|  2.23k|				packetVec.pushBack(newPacket);
  616|  2.23k|			}
  617|      1|			else
  618|      1|			{
  619|      1|				delete newPacket;
  620|      1|				break;
  621|      1|			}
  622|  2.23k|		}
  623|       |
  624|  2.23k|		return numOfPacketsRead;
  625|  2.23k|	}
_ZN4pcpp20PcapFileReaderDevice4openEv:
  709|  2.25k|	{
  710|  2.25k|		if (m_PcapFile.is_open())
  ------------------
  |  Branch (710:7): [True: 0, False: 2.25k]
  ------------------
  711|      0|		{
  712|      0|			PCPP_LOG_ERROR("File already opened");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|      0|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|      0|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  713|      0|			return false;
  714|      0|		}
  715|       |
  716|  2.25k|		resetStatisticCounters();
  717|       |
  718|  2.25k|		std::ifstream pcapFile;
  719|  2.25k|		pcapFile.open(m_FileName.c_str(), std::ifstream::binary);
  720|  2.25k|		if (!pcapFile.is_open())
  ------------------
  |  Branch (720:7): [True: 0, False: 2.25k]
  ------------------
  721|      0|		{
  722|      0|			PCPP_LOG_ERROR("Cannot open pcap reader device for filename '" << m_FileName << "'");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|      0|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|      0|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  723|      0|			return false;
  724|      0|		}
  725|       |
  726|  2.25k|		pcap_file_header pcapFileHeader{};
  727|  2.25k|		auto status = readPcapHeader(pcapFile, pcapFileHeader, m_Precision, m_NeedsSwap);
  728|  2.25k|		switch (status)
  729|  2.25k|		{
  730|  2.25k|		case PcapReadHeaderStatus::Ok:
  ------------------
  |  Branch (730:3): [True: 2.25k, False: 0]
  ------------------
  731|  2.25k|			break;
  732|      0|		case PcapReadHeaderStatus::NoData:
  ------------------
  |  Branch (732:3): [True: 0, False: 2.25k]
  ------------------
  733|      0|		case PcapReadHeaderStatus::MalformedData:
  ------------------
  |  Branch (733:3): [True: 0, False: 2.25k]
  ------------------
  734|      0|		{
  735|      0|			PCPP_LOG_ERROR("Cannot read pcap file header");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|      0|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|      0|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  736|      0|			return false;
  737|      0|		}
  738|      0|		case PcapReadHeaderStatus::UnsupportedFormat:
  ------------------
  |  Branch (738:3): [True: 0, False: 2.25k]
  ------------------
  739|      0|		{
  740|      0|			PCPP_LOG_ERROR("File content is not pcap or byte order can't be determined. Detected magic number: 0x"
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|      0|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|      0|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  741|      0|			               << std::hex << pcapFileHeader.magic);
  742|      0|			return false;
  743|      0|		}
  744|      0|		default:
  ------------------
  |  Branch (744:3): [True: 0, False: 2.25k]
  ------------------
  745|      0|			throw std::logic_error("Unhandled PcapReadHeaderStatus value");
  746|  2.25k|		}
  747|       |
  748|  2.25k|		if (pcapFileHeader.version_major != 2 && pcapFileHeader.version_major != 543)
  ------------------
  |  Branch (748:7): [True: 0, False: 2.25k]
  |  Branch (748:44): [True: 0, False: 0]
  ------------------
  749|      0|		{
  750|      0|			PCPP_LOG_ERROR("Unsupported pcap file version: " << std::to_string(pcapFileHeader.version_major) << "."
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|      0|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|      0|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  751|      0|			                                                 << std::to_string(pcapFileHeader.version_minor));
  752|      0|			return false;
  753|      0|		}
  754|       |
  755|  2.25k|		constexpr uint32_t MAX_SNAPLEN = 1024 * 1024;
  756|  2.25k|		if (pcapFileHeader.snaplen == 0 || pcapFileHeader.snaplen > MAX_SNAPLEN)
  ------------------
  |  Branch (756:7): [True: 0, False: 2.25k]
  |  Branch (756:38): [True: 17, False: 2.23k]
  ------------------
  757|     17|		{
  758|     17|			PCPP_LOG_ERROR("Invalid snapshot length: " << std::to_string(pcapFileHeader.snaplen));
  ------------------
  |  |  445|     17|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|     17|	do                                                                                                                 \
  |  |  |  |  415|     17|	{                                                                                                                  \
  |  |  |  |  416|     17|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|     17|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|     17|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 17, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|     17|		{                                                                                                              \
  |  |  |  |  419|     17|			auto ctx =                                                                                                 \
  |  |  |  |  420|     17|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|     17|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|     17|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|     17|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|     17|		}                                                                                                              \
  |  |  |  |  424|     17|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 17]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  759|     17|			return false;
  760|     17|		}
  761|       |
  762|  2.23k|		m_PcapLinkLayerType = toLinkLayerType(pcapFileHeader.linktype);
  763|       |
  764|  2.23k|		m_SnapshotLength = pcapFileHeader.snaplen;
  765|  2.23k|		m_ReadBuffer.resize(m_SnapshotLength);
  766|       |
  767|  2.23k|		m_PcapFile = std::move(pcapFile);
  768|  2.23k|		return true;
  769|  2.25k|	}
_ZN4pcpp20PcapFileReaderDevice13getNextPacketERNS_9RawPacketE:
  772|   169k|	{
  773|   169k|		timespec packetTimestamp;
  774|   169k|		uint32_t capturedLength = 0, frameLength = 0;
  775|       |
  776|   169k|		while (readNextPacket(packetTimestamp, m_ReadBuffer.data(), m_SnapshotLength, capturedLength, frameLength))
  ------------------
  |  Branch (776:10): [True: 166k, False: 2.23k]
  ------------------
  777|   166k|		{
  778|   166k|			if (m_BpfWrapper.matches(m_ReadBuffer.data(), capturedLength, packetTimestamp, m_PcapLinkLayerType))
  ------------------
  |  Branch (778:8): [True: 166k, False: 0]
  ------------------
  779|   166k|			{
  780|       |				// TODO: Fixup tirage hack of adding 20 bytes buffer to pass fuzz.
  781|   166k|				auto packetData = std::make_unique<uint8_t[]>(capturedLength /* + 200 */);
  782|   166k|				std::copy(m_ReadBuffer.begin(), std::next(m_ReadBuffer.begin(), capturedLength), packetData.get());
  783|       |
  784|   166k|				rawPacket.setRawData(capturedLength > 0 ? packetData.release() : nullptr, capturedLength, true,
  ------------------
  |  Branch (784:26): [True: 165k, False: 1.88k]
  ------------------
  785|   166k|				                     packetTimestamp, m_PcapLinkLayerType, frameLength);
  786|   166k|				reportPacketProcessed();
  787|   166k|				return true;
  788|   166k|			}
  789|      0|			PCPP_LOG_DEBUG("Packet doesn't match filter");
  ------------------
  |  |  427|      0|#	define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|      0|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|      0|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  790|      0|		}
  791|       |
  792|  2.23k|		return false;
  793|   169k|	}
_ZN4pcpp20PcapFileReaderDevice5closeEv:
  796|  2.23k|	{
  797|  2.23k|		m_PcapFile.close();
  798|  2.23k|	}
_ZN4pcpp20PcapFileReaderDevice14readNextPacketER8timespecPhjRjS4_:
  802|   169k|	{
  803|   169k|		packet_header packetHeader{};
  804|   169k|		m_PcapFile.read(reinterpret_cast<char*>(&packetHeader), sizeof(packetHeader));
  805|       |
  806|   169k|		auto bytesRead = m_PcapFile.gcount();
  807|   169k|		if (bytesRead == 0)
  ------------------
  |  Branch (807:7): [True: 323, False: 168k]
  ------------------
  808|    323|		{
  809|    323|			return false;
  810|    323|		}
  811|       |
  812|   168k|		if (static_cast<size_t>(bytesRead) < sizeof(packetHeader))
  ------------------
  |  Branch (812:7): [True: 412, False: 168k]
  ------------------
  813|    412|		{
  814|    412|			PCPP_LOG_ERROR("Failed to read packet metadata");
  ------------------
  |  |  445|    412|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    412|	do                                                                                                                 \
  |  |  |  |  415|    412|	{                                                                                                                  \
  |  |  |  |  416|    412|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    412|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|    412|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 412, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    412|		{                                                                                                              \
  |  |  |  |  419|    412|			auto ctx =                                                                                                 \
  |  |  |  |  420|    412|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|    412|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    412|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    412|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    412|		}                                                                                                              \
  |  |  |  |  424|    412|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 412]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  815|    412|			return false;
  816|    412|		}
  817|       |
  818|   168k|		if (m_NeedsSwap)
  ------------------
  |  Branch (818:7): [True: 484, False: 167k]
  ------------------
  819|    484|		{
  820|    484|			packetHeader.tv_sec = swap32(packetHeader.tv_sec);
  821|    484|			packetHeader.tv_usec = swap32(packetHeader.tv_usec);
  822|    484|			packetHeader.caplen = swap32(packetHeader.caplen);
  823|    484|			packetHeader.len = swap32(packetHeader.len);
  824|    484|		}
  825|       |
  826|   168k|		if (packetHeader.caplen > packetHeader.len)
  ------------------
  |  Branch (826:7): [True: 660, False: 167k]
  ------------------
  827|    660|		{
  828|    660|			PCPP_LOG_ERROR("Packet captured length " << packetHeader.caplen << " exceeds packet length "
  ------------------
  |  |  445|    660|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    660|	do                                                                                                                 \
  |  |  |  |  415|    660|	{                                                                                                                  \
  |  |  |  |  416|    660|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    660|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|    660|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 660, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    660|		{                                                                                                              \
  |  |  |  |  419|    660|			auto ctx =                                                                                                 \
  |  |  |  |  420|    660|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|    660|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    660|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    660|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    660|		}                                                                                                              \
  |  |  |  |  424|    660|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 660]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  829|    660|			                                         << packetHeader.len);
  830|    660|			return false;
  831|    660|		}
  832|       |
  833|   167k|		constexpr uint32_t MAX_PACKET_SIZE = 256 * 1024;
  834|   167k|		if (packetHeader.caplen > MAX_PACKET_SIZE)
  ------------------
  |  Branch (834:7): [True: 420, False: 167k]
  ------------------
  835|    420|		{
  836|    420|			PCPP_LOG_ERROR("Packet captured length " << packetHeader.caplen << " is suspiciously large");
  ------------------
  |  |  445|    420|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    420|	do                                                                                                                 \
  |  |  |  |  415|    420|	{                                                                                                                  \
  |  |  |  |  416|    420|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    420|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|    420|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 420, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    420|		{                                                                                                              \
  |  |  |  |  419|    420|			auto ctx =                                                                                                 \
  |  |  |  |  420|    420|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|    420|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    420|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    420|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    420|		}                                                                                                              \
  |  |  |  |  424|    420|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 420]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  837|    420|			return false;
  838|    420|		}
  839|       |
  840|   167k|		if (m_Precision == FileTimestampPrecision::Nanoseconds)
  ------------------
  |  Branch (840:7): [True: 4.51k, False: 162k]
  ------------------
  841|  4.51k|		{
  842|  4.51k|			constexpr uint32_t NANO_PER_SEC = 1'000'000'000;
  843|  4.51k|			if (packetHeader.tv_usec >= NANO_PER_SEC)
  ------------------
  |  Branch (843:8): [True: 4, False: 4.50k]
  ------------------
  844|      4|			{
  845|      4|				PCPP_LOG_ERROR("Invalid nanosecond timestamp: " << std::to_string(packetHeader.tv_usec));
  ------------------
  |  |  445|      4|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      4|	do                                                                                                                 \
  |  |  |  |  415|      4|	{                                                                                                                  \
  |  |  |  |  416|      4|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      4|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|      4|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 4, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      4|		{                                                                                                              \
  |  |  |  |  419|      4|			auto ctx =                                                                                                 \
  |  |  |  |  420|      4|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|      4|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      4|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      4|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      4|		}                                                                                                              \
  |  |  |  |  424|      4|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 4]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  846|      4|				return false;
  847|      4|			}
  848|  4.51k|		}
  849|   162k|		else
  850|   162k|		{
  851|   162k|			constexpr uint32_t MICRO_PER_SEC = 1'000'000;
  852|   162k|			if (packetHeader.tv_usec >= MICRO_PER_SEC)
  ------------------
  |  Branch (852:8): [True: 110, False: 162k]
  ------------------
  853|    110|			{
  854|    110|				PCPP_LOG_ERROR("Invalid microsecond timestamp: " << std::to_string(packetHeader.tv_usec));
  ------------------
  |  |  445|    110|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    110|	do                                                                                                                 \
  |  |  |  |  415|    110|	{                                                                                                                  \
  |  |  |  |  416|    110|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    110|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|    110|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 110, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    110|		{                                                                                                              \
  |  |  |  |  419|    110|			auto ctx =                                                                                                 \
  |  |  |  |  420|    110|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|    110|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    110|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    110|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    110|		}                                                                                                              \
  |  |  |  |  424|    110|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 110]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  855|    110|				return false;
  856|    110|			}
  857|   162k|		}
  858|       |
  859|   167k|		uint32_t bytesToDiscard = 0;
  860|   167k|		if (packetHeader.caplen > packetDataLen)
  ------------------
  |  Branch (860:7): [True: 4.37k, False: 162k]
  ------------------
  861|  4.37k|		{
  862|  4.37k|			PCPP_LOG_WARN("Packet captured length " << packetHeader.caplen << " exceeds file snapshot length "
  ------------------
  |  |  433|  4.37k|#	define PCPP_LOG_WARN(message) PCPP_LOG(pcpp::LogLevel::Warn, message)
  |  |  ------------------
  |  |  |  |  414|  4.37k|	do                                                                                                                 \
  |  |  |  |  415|  4.37k|	{                                                                                                                  \
  |  |  |  |  416|  4.37k|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|  4.37k|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|  4.37k|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 4.37k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|  4.37k|		{                                                                                                              \
  |  |  |  |  419|  4.37k|			auto ctx =                                                                                                 \
  |  |  |  |  420|  4.37k|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|  4.37k|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|  4.37k|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|  4.37k|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|  4.37k|		}                                                                                                              \
  |  |  |  |  424|  4.37k|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 4.37k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  863|  4.37k|			                                        << packetDataLen);
  864|  4.37k|			bytesToDiscard = packetHeader.caplen - packetDataLen;
  865|  4.37k|			packetHeader.caplen = packetDataLen;
  866|  4.37k|		}
  867|       |
  868|   167k|		if (packetHeader.caplen > 0 && !m_PcapFile.read(reinterpret_cast<char*>(packetData), packetHeader.caplen))
  ------------------
  |  Branch (868:7): [True: 165k, False: 1.88k]
  |  Branch (868:34): [True: 310, False: 165k]
  ------------------
  869|    310|		{
  870|    310|			PCPP_LOG_ERROR("Failed to read packet data");
  ------------------
  |  |  445|    310|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|    310|	do                                                                                                                 \
  |  |  |  |  415|    310|	{                                                                                                                  \
  |  |  |  |  416|    310|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|    310|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|    310|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 310, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|    310|		{                                                                                                              \
  |  |  |  |  419|    310|			auto ctx =                                                                                                 \
  |  |  |  |  420|    310|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|    310|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|    310|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|    310|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|    310|		}                                                                                                              \
  |  |  |  |  424|    310|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 310]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  871|    310|			return false;
  872|    310|		}
  873|       |
  874|   166k|		if (bytesToDiscard && !m_PcapFile.ignore(bytesToDiscard))
  ------------------
  |  Branch (874:7): [True: 4.36k, False: 162k]
  |  Branch (874:25): [True: 0, False: 4.36k]
  ------------------
  875|      0|		{
  876|      0|			PCPP_LOG_ERROR("Failed to read discarded packet data");
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|      0|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    3|      0|#define LOG_MODULE PcapLogModuleFileDevice
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  877|      0|			return false;
  878|      0|		}
  879|       |
  880|   166k|		capturedLength = packetHeader.caplen;
  881|   166k|		frameLength = packetHeader.len;
  882|   166k|		packetTimestamp = { static_cast<time_t>(packetHeader.tv_sec),
  883|   166k|			                static_cast<long>(m_Precision == FileTimestampPrecision::Microseconds
  ------------------
  |  Branch (883:38): [True: 162k, False: 4.49k]
  ------------------
  884|   166k|			                                      ? packetHeader.tv_usec * 1000
  885|   166k|			                                      : packetHeader.tv_usec) };
  886|   166k|		return true;
  887|   166k|	}
PcapFileDevice.cpp:_ZN4pcpp12_GLOBAL__N_115detectPcapMagicEjPNS0_13FileByteOrderE:
  286|  2.25k|		{
  287|       |			// Pcap magic numbers are taken from: https://github.com/the-tcpdump-group/libpcap/blob/master/sf-pcap.c
  288|       |			// There are some other reserved magic numbers but they are not supported by libpcap so we ignore them.
  289|       |			// The order of the magic numbers in the array is important for format detection. See switch statement
  290|       |			// below.
  291|  2.25k|			constexpr std::array<uint32_t, 6> pcapMagicNumbers = {
  292|  2.25k|				TCPDUMP_MAGIC,          // 0xa1'b2'c3'd4 - regular pcap, microsecond-precision
  293|  2.25k|				TCPDUMP_MAGIC_SWAPPED,  // 0xd4'c3'b2'a1 - regular pcap, microsecond-precision (byte-swapped)
  294|       |				// Libpcap 0.9.1 and later support reading a modified pcap format that contains an extended header.
  295|       |				// Format reference: https://wiki.wireshark.org/Development/LibpcapFileFormat#modified-pcap
  296|  2.25k|				KUZNETZOV_TCPDUMP_MAGIC,          // Alexey Kuznetzov's modified libpcap format
  297|  2.25k|				KUZNETZOV_TCPDUMP_MAGIC_SWAPPED,  // Alexey Kuznetzov's modified libpcap format (byte-swapped)
  298|       |				// Libpcap 1.5.0 and later support reading nanosecond-precision pcap files.
  299|  2.25k|				NSEC_TCPDUMP_MAGIC,          // 0xa1'b2'3c'4d - regular pcap, nanosecond-precision
  300|  2.25k|				NSEC_TCPDUMP_MAGIC_SWAPPED,  // 0x4d'3c'b2'a1 - regular pcap, nanosecond-precision (byte-swapped)
  301|  2.25k|			};
  302|       |
  303|  2.25k|			auto it = std::find(pcapMagicNumbers.begin(), pcapMagicNumbers.end(), magic);
  304|  2.25k|			if (it == pcapMagicNumbers.end())
  ------------------
  |  Branch (304:8): [True: 0, False: 2.25k]
  ------------------
  305|      0|			{
  306|      0|				return FileFormat::Unknown;
  307|      0|			}
  308|       |
  309|       |			// Indices 0-1 are regular microsecond-precision pcap files.
  310|       |			// Indices 2-3 are "modified" pcap files
  311|       |			// Indices 4-5 are nanosecond-precision pcap files.
  312|  2.25k|			auto const selectedIdx = std::distance(pcapMagicNumbers.begin(), it);
  313|       |
  314|  2.25k|			if (byteOrder != nullptr)
  ------------------
  |  Branch (314:8): [True: 2.25k, False: 0]
  ------------------
  315|  2.25k|			{
  316|  2.25k|				*byteOrder = (selectedIdx % 2 == 0) ? FileByteOrder::Native : FileByteOrder::Swapped;
  ------------------
  |  Branch (316:18): [True: 2.25k, False: 5]
  ------------------
  317|  2.25k|			}
  318|       |
  319|  2.25k|			if (selectedIdx < 2)
  ------------------
  |  Branch (319:8): [True: 2.18k, False: 73]
  ------------------
  320|  2.18k|			{
  321|  2.18k|				return FileFormat::Pcap;
  322|  2.18k|			}
  323|     73|			if (selectedIdx < 4)
  ------------------
  |  Branch (323:8): [True: 0, False: 73]
  ------------------
  324|      0|			{
  325|      0|				return FileFormat::PcapMod;
  326|      0|			}
  327|       |
  328|     73|			return FileFormat::PcapNano;
  329|     73|		}
PcapFileDevice.cpp:_ZN4pcpp12_GLOBAL__N_114readPcapHeaderERNSt3__113basic_istreamIcNS1_11char_traitsIcEEEERNS0_16pcap_file_headerERNS_22FileTimestampPrecisionERb:
  670|  2.25k|		{
  671|  2.25k|			inStream.read(reinterpret_cast<char*>(&header), sizeof(header));
  672|       |
  673|  2.25k|			auto readBytes = inStream.gcount();
  674|  2.25k|			if (readBytes == 0)
  ------------------
  |  Branch (674:8): [True: 0, False: 2.25k]
  ------------------
  675|      0|			{
  676|      0|				return PcapReadHeaderStatus::NoData;
  677|      0|			}
  678|  2.25k|			if (readBytes < static_cast<std::streamsize>(sizeof(header)))
  ------------------
  |  Branch (678:8): [True: 0, False: 2.25k]
  ------------------
  679|      0|			{
  680|      0|				return PcapReadHeaderStatus::MalformedData;
  681|      0|			}
  682|       |
  683|  2.25k|			FileByteOrder byteOrder;
  684|  2.25k|			FileFormat pcapFormat = detectPcapMagic(header.magic, &byteOrder);
  685|  2.25k|			if (pcapFormat == FileFormat::Unknown)
  ------------------
  |  Branch (685:8): [True: 0, False: 2.25k]
  ------------------
  686|      0|			{
  687|      0|				return PcapReadHeaderStatus::UnsupportedFormat;
  688|      0|			}
  689|       |
  690|  2.25k|			precision = getPcapPrecision(pcapFormat);
  691|  2.25k|			needsSwap = byteOrder == FileByteOrder::Swapped;
  692|       |
  693|  2.25k|			if (needsSwap)
  ------------------
  |  Branch (693:8): [True: 5, False: 2.25k]
  ------------------
  694|      5|			{
  695|      5|				header.magic = swap32(header.magic);
  696|      5|				header.version_major = swap16(header.version_major);
  697|      5|				header.version_minor = swap16(header.version_minor);
  698|      5|				header.thiszone = swap32(header.thiszone);
  699|      5|				header.sigfigs = swap32(header.sigfigs);
  700|      5|				header.snaplen = swap32(header.snaplen);
  701|      5|				header.linktype = swap32(header.linktype);
  702|      5|			}
  703|       |
  704|  2.25k|			return PcapReadHeaderStatus::Ok;
  705|  2.25k|		}
PcapFileDevice.cpp:_ZN4pcpp12_GLOBAL__N_116getPcapPrecisionENS0_10FileFormatE:
  462|  2.25k|		{
  463|  2.25k|			switch (format)
  464|  2.25k|			{
  465|  2.18k|			case FileFormat::Pcap:
  ------------------
  |  Branch (465:4): [True: 2.18k, False: 73]
  ------------------
  466|  2.18k|			case FileFormat::PcapMod:
  ------------------
  |  Branch (466:4): [True: 0, False: 2.25k]
  ------------------
  467|  2.18k|				return FileTimestampPrecision::Microseconds;
  468|     73|			case FileFormat::PcapNano:
  ------------------
  |  Branch (468:4): [True: 73, False: 2.18k]
  ------------------
  469|     73|				return FileTimestampPrecision::Nanoseconds;
  470|      0|			default:
  ------------------
  |  Branch (470:4): [True: 0, False: 2.25k]
  ------------------
  471|      0|				return FileTimestampPrecision::Unknown;
  472|  2.25k|			}
  473|  2.25k|		}
PcapFileDevice.cpp:_ZN4pcpp12_GLOBAL__N_16swap16Et:
  641|     10|		{
  642|     10|			return static_cast<uint16_t>((value >> 8) | (value << 8));
  643|     10|		}
PcapFileDevice.cpp:_ZN4pcpp12_GLOBAL__N_115toLinkLayerTypeEj:
   91|  2.23k|		{
   92|  2.23k|			switch (value)
   93|  2.23k|			{
   94|     67|			case LINKTYPE_NULL:
  ------------------
  |  Branch (94:4): [True: 67, False: 2.17k]
  ------------------
   95|  1.98k|			case LINKTYPE_ETHERNET:
  ------------------
  |  Branch (95:4): [True: 1.91k, False: 323]
  ------------------
   96|  1.98k|			case LINKTYPE_AX25:
  ------------------
  |  Branch (96:4): [True: 0, False: 2.23k]
  ------------------
   97|  1.98k|			case LINKTYPE_IEEE802_5:
  ------------------
  |  Branch (97:4): [True: 0, False: 2.23k]
  ------------------
   98|  1.98k|			case LINKTYPE_ARCNET_BSD:
  ------------------
  |  Branch (98:4): [True: 0, False: 2.23k]
  ------------------
   99|  1.98k|			case LINKTYPE_SLIP:
  ------------------
  |  Branch (99:4): [True: 0, False: 2.23k]
  ------------------
  100|  1.98k|			case LINKTYPE_PPP:
  ------------------
  |  Branch (100:4): [True: 0, False: 2.23k]
  ------------------
  101|  1.98k|			case LINKTYPE_FDDI:
  ------------------
  |  Branch (101:4): [True: 0, False: 2.23k]
  ------------------
  102|  2.01k|			case LINKTYPE_DLT_RAW1:
  ------------------
  |  Branch (102:4): [True: 27, False: 2.21k]
  ------------------
  103|  2.04k|			case LINKTYPE_DLT_RAW2:
  ------------------
  |  Branch (103:4): [True: 33, False: 2.20k]
  ------------------
  104|  2.04k|			case LINKTYPE_PPP_HDLC:
  ------------------
  |  Branch (104:4): [True: 0, False: 2.23k]
  ------------------
  105|  2.04k|			case LINKTYPE_PPP_ETHER:
  ------------------
  |  Branch (105:4): [True: 0, False: 2.23k]
  ------------------
  106|  2.04k|			case LINKTYPE_ATM_RFC1483:
  ------------------
  |  Branch (106:4): [True: 0, False: 2.23k]
  ------------------
  107|  2.07k|			case LINKTYPE_RAW:
  ------------------
  |  Branch (107:4): [True: 30, False: 2.20k]
  ------------------
  108|  2.07k|			case LINKTYPE_C_HDLC:
  ------------------
  |  Branch (108:4): [True: 4, False: 2.23k]
  ------------------
  109|  2.07k|			case LINKTYPE_IEEE802_11:
  ------------------
  |  Branch (109:4): [True: 0, False: 2.23k]
  ------------------
  110|  2.07k|			case LINKTYPE_FRELAY:
  ------------------
  |  Branch (110:4): [True: 0, False: 2.23k]
  ------------------
  111|  2.07k|			case LINKTYPE_LOOP:
  ------------------
  |  Branch (111:4): [True: 0, False: 2.23k]
  ------------------
  112|  2.11k|			case LINKTYPE_LINUX_SLL:
  ------------------
  |  Branch (112:4): [True: 34, False: 2.20k]
  ------------------
  113|  2.11k|			case LINKTYPE_LTALK:
  ------------------
  |  Branch (113:4): [True: 0, False: 2.23k]
  ------------------
  114|  2.11k|			case LINKTYPE_PFLOG:
  ------------------
  |  Branch (114:4): [True: 0, False: 2.23k]
  ------------------
  115|  2.11k|			case LINKTYPE_IEEE802_11_PRISM:
  ------------------
  |  Branch (115:4): [True: 0, False: 2.23k]
  ------------------
  116|  2.11k|			case LINKTYPE_IP_OVER_FC:
  ------------------
  |  Branch (116:4): [True: 0, False: 2.23k]
  ------------------
  117|  2.11k|			case LINKTYPE_SUNATM:
  ------------------
  |  Branch (117:4): [True: 0, False: 2.23k]
  ------------------
  118|  2.11k|			case LINKTYPE_IEEE802_11_RADIOTAP:
  ------------------
  |  Branch (118:4): [True: 0, False: 2.23k]
  ------------------
  119|  2.11k|			case LINKTYPE_ARCNET_LINUX:
  ------------------
  |  Branch (119:4): [True: 0, False: 2.23k]
  ------------------
  120|  2.11k|			case LINKTYPE_APPLE_IP_OVER_IEEE1394:
  ------------------
  |  Branch (120:4): [True: 0, False: 2.23k]
  ------------------
  121|  2.11k|			case LINKTYPE_MTP2_WITH_PHDR:
  ------------------
  |  Branch (121:4): [True: 0, False: 2.23k]
  ------------------
  122|  2.11k|			case LINKTYPE_MTP2:
  ------------------
  |  Branch (122:4): [True: 0, False: 2.23k]
  ------------------
  123|  2.11k|			case LINKTYPE_MTP3:
  ------------------
  |  Branch (123:4): [True: 0, False: 2.23k]
  ------------------
  124|  2.11k|			case LINKTYPE_SCCP:
  ------------------
  |  Branch (124:4): [True: 0, False: 2.23k]
  ------------------
  125|  2.11k|			case LINKTYPE_DOCSIS:
  ------------------
  |  Branch (125:4): [True: 0, False: 2.23k]
  ------------------
  126|  2.11k|			case LINKTYPE_LINUX_IRDA:
  ------------------
  |  Branch (126:4): [True: 0, False: 2.23k]
  ------------------
  127|  2.11k|			case LINKTYPE_USER0:
  ------------------
  |  Branch (127:4): [True: 0, False: 2.23k]
  ------------------
  128|  2.11k|			case LINKTYPE_USER1:
  ------------------
  |  Branch (128:4): [True: 0, False: 2.23k]
  ------------------
  129|  2.11k|			case LINKTYPE_USER2:
  ------------------
  |  Branch (129:4): [True: 0, False: 2.23k]
  ------------------
  130|  2.11k|			case LINKTYPE_USER3:
  ------------------
  |  Branch (130:4): [True: 0, False: 2.23k]
  ------------------
  131|  2.11k|			case LINKTYPE_USER4:
  ------------------
  |  Branch (131:4): [True: 0, False: 2.23k]
  ------------------
  132|  2.11k|			case LINKTYPE_USER5:
  ------------------
  |  Branch (132:4): [True: 0, False: 2.23k]
  ------------------
  133|  2.11k|			case LINKTYPE_USER6:
  ------------------
  |  Branch (133:4): [True: 0, False: 2.23k]
  ------------------
  134|  2.11k|			case LINKTYPE_USER7:
  ------------------
  |  Branch (134:4): [True: 0, False: 2.23k]
  ------------------
  135|  2.11k|			case LINKTYPE_USER8:
  ------------------
  |  Branch (135:4): [True: 0, False: 2.23k]
  ------------------
  136|  2.11k|			case LINKTYPE_USER9:
  ------------------
  |  Branch (136:4): [True: 0, False: 2.23k]
  ------------------
  137|  2.11k|			case LINKTYPE_USER10:
  ------------------
  |  Branch (137:4): [True: 0, False: 2.23k]
  ------------------
  138|  2.11k|			case LINKTYPE_USER11:
  ------------------
  |  Branch (138:4): [True: 0, False: 2.23k]
  ------------------
  139|  2.11k|			case LINKTYPE_USER12:
  ------------------
  |  Branch (139:4): [True: 0, False: 2.23k]
  ------------------
  140|  2.11k|			case LINKTYPE_USER13:
  ------------------
  |  Branch (140:4): [True: 0, False: 2.23k]
  ------------------
  141|  2.11k|			case LINKTYPE_USER14:
  ------------------
  |  Branch (141:4): [True: 0, False: 2.23k]
  ------------------
  142|  2.11k|			case LINKTYPE_USER15:
  ------------------
  |  Branch (142:4): [True: 0, False: 2.23k]
  ------------------
  143|  2.11k|			case LINKTYPE_IEEE802_11_AVS:
  ------------------
  |  Branch (143:4): [True: 0, False: 2.23k]
  ------------------
  144|  2.11k|			case LINKTYPE_BACNET_MS_TP:
  ------------------
  |  Branch (144:4): [True: 0, False: 2.23k]
  ------------------
  145|  2.11k|			case LINKTYPE_PPP_PPPD:
  ------------------
  |  Branch (145:4): [True: 0, False: 2.23k]
  ------------------
  146|  2.11k|			case LINKTYPE_GPRS_LLC:
  ------------------
  |  Branch (146:4): [True: 0, False: 2.23k]
  ------------------
  147|  2.11k|			case LINKTYPE_GPF_T:
  ------------------
  |  Branch (147:4): [True: 0, False: 2.23k]
  ------------------
  148|  2.11k|			case LINKTYPE_GPF_F:
  ------------------
  |  Branch (148:4): [True: 0, False: 2.23k]
  ------------------
  149|  2.11k|			case LINKTYPE_LINUX_LAPD:
  ------------------
  |  Branch (149:4): [True: 0, False: 2.23k]
  ------------------
  150|  2.11k|			case LINKTYPE_BLUETOOTH_HCI_H4:
  ------------------
  |  Branch (150:4): [True: 0, False: 2.23k]
  ------------------
  151|  2.11k|			case LINKTYPE_USB_LINUX:
  ------------------
  |  Branch (151:4): [True: 0, False: 2.23k]
  ------------------
  152|  2.11k|			case LINKTYPE_PPI:
  ------------------
  |  Branch (152:4): [True: 0, False: 2.23k]
  ------------------
  153|  2.11k|			case LINKTYPE_IEEE802_15_4:
  ------------------
  |  Branch (153:4): [True: 0, False: 2.23k]
  ------------------
  154|  2.11k|			case LINKTYPE_SITA:
  ------------------
  |  Branch (154:4): [True: 0, False: 2.23k]
  ------------------
  155|  2.11k|			case LINKTYPE_ERF:
  ------------------
  |  Branch (155:4): [True: 0, False: 2.23k]
  ------------------
  156|  2.11k|			case LINKTYPE_BLUETOOTH_HCI_H4_WITH_PHDR:
  ------------------
  |  Branch (156:4): [True: 0, False: 2.23k]
  ------------------
  157|  2.11k|			case LINKTYPE_AX25_KISS:
  ------------------
  |  Branch (157:4): [True: 0, False: 2.23k]
  ------------------
  158|  2.11k|			case LINKTYPE_LAPD:
  ------------------
  |  Branch (158:4): [True: 0, False: 2.23k]
  ------------------
  159|  2.11k|			case LINKTYPE_PPP_WITH_DIR:
  ------------------
  |  Branch (159:4): [True: 0, False: 2.23k]
  ------------------
  160|  2.11k|			case LINKTYPE_C_HDLC_WITH_DIR:
  ------------------
  |  Branch (160:4): [True: 0, False: 2.23k]
  ------------------
  161|  2.11k|			case LINKTYPE_FRELAY_WITH_DIR:
  ------------------
  |  Branch (161:4): [True: 0, False: 2.23k]
  ------------------
  162|  2.11k|			case LINKTYPE_IPMB_LINUX:
  ------------------
  |  Branch (162:4): [True: 0, False: 2.23k]
  ------------------
  163|  2.11k|			case LINKTYPE_IEEE802_15_4_NONASK_PHY:
  ------------------
  |  Branch (163:4): [True: 0, False: 2.23k]
  ------------------
  164|  2.11k|			case LINKTYPE_USB_LINUX_MMAPPED:
  ------------------
  |  Branch (164:4): [True: 0, False: 2.23k]
  ------------------
  165|  2.11k|			case LINKTYPE_FC_2:
  ------------------
  |  Branch (165:4): [True: 0, False: 2.23k]
  ------------------
  166|  2.11k|			case LINKTYPE_FC_2_WITH_FRAME_DELIMS:
  ------------------
  |  Branch (166:4): [True: 0, False: 2.23k]
  ------------------
  167|  2.11k|			case LINKTYPE_IPNET:
  ------------------
  |  Branch (167:4): [True: 0, False: 2.23k]
  ------------------
  168|  2.11k|			case LINKTYPE_CAN_SOCKETCAN:
  ------------------
  |  Branch (168:4): [True: 0, False: 2.23k]
  ------------------
  169|  2.19k|			case LINKTYPE_IPV4:
  ------------------
  |  Branch (169:4): [True: 82, False: 2.15k]
  ------------------
  170|  2.19k|			case LINKTYPE_IPV6:
  ------------------
  |  Branch (170:4): [True: 2, False: 2.23k]
  ------------------
  171|  2.19k|			case LINKTYPE_IEEE802_15_4_NOFCS:
  ------------------
  |  Branch (171:4): [True: 0, False: 2.23k]
  ------------------
  172|  2.19k|			case LINKTYPE_DBUS:
  ------------------
  |  Branch (172:4): [True: 0, False: 2.23k]
  ------------------
  173|  2.19k|			case LINKTYPE_DVB_CI:
  ------------------
  |  Branch (173:4): [True: 0, False: 2.23k]
  ------------------
  174|  2.19k|			case LINKTYPE_MUX27010:
  ------------------
  |  Branch (174:4): [True: 0, False: 2.23k]
  ------------------
  175|  2.19k|			case LINKTYPE_STANAG_5066_D_PDU:
  ------------------
  |  Branch (175:4): [True: 0, False: 2.23k]
  ------------------
  176|  2.21k|			case LINKTYPE_NFLOG:
  ------------------
  |  Branch (176:4): [True: 16, False: 2.22k]
  ------------------
  177|  2.21k|			case LINKTYPE_NETANALYZER:
  ------------------
  |  Branch (177:4): [True: 0, False: 2.23k]
  ------------------
  178|  2.21k|			case LINKTYPE_NETANALYZER_TRANSPARENT:
  ------------------
  |  Branch (178:4): [True: 0, False: 2.23k]
  ------------------
  179|  2.21k|			case LINKTYPE_IPOIB:
  ------------------
  |  Branch (179:4): [True: 0, False: 2.23k]
  ------------------
  180|  2.21k|			case LINKTYPE_MPEG_2_TS:
  ------------------
  |  Branch (180:4): [True: 0, False: 2.23k]
  ------------------
  181|  2.21k|			case LINKTYPE_NG40:
  ------------------
  |  Branch (181:4): [True: 0, False: 2.23k]
  ------------------
  182|  2.21k|			case LINKTYPE_NFC_LLCP:
  ------------------
  |  Branch (182:4): [True: 0, False: 2.23k]
  ------------------
  183|  2.21k|			case LINKTYPE_INFINIBAND:
  ------------------
  |  Branch (183:4): [True: 0, False: 2.23k]
  ------------------
  184|  2.21k|			case LINKTYPE_SCTP:
  ------------------
  |  Branch (184:4): [True: 0, False: 2.23k]
  ------------------
  185|  2.21k|			case LINKTYPE_USBPCAP:
  ------------------
  |  Branch (185:4): [True: 0, False: 2.23k]
  ------------------
  186|  2.21k|			case LINKTYPE_RTAC_SERIAL:
  ------------------
  |  Branch (186:4): [True: 0, False: 2.23k]
  ------------------
  187|  2.21k|			case LINKTYPE_BLUETOOTH_LE_LL:
  ------------------
  |  Branch (187:4): [True: 0, False: 2.23k]
  ------------------
  188|  2.21k|			case LINKTYPE_NETLINK:
  ------------------
  |  Branch (188:4): [True: 0, False: 2.23k]
  ------------------
  189|  2.21k|			case LINKTYPE_BLUETOOTH_LINUX_MONITOR:
  ------------------
  |  Branch (189:4): [True: 0, False: 2.23k]
  ------------------
  190|  2.21k|			case LINKTYPE_BLUETOOTH_BREDR_BB:
  ------------------
  |  Branch (190:4): [True: 0, False: 2.23k]
  ------------------
  191|  2.21k|			case LINKTYPE_BLUETOOTH_LE_LL_WITH_PHDR:
  ------------------
  |  Branch (191:4): [True: 0, False: 2.23k]
  ------------------
  192|  2.21k|			case LINKTYPE_PROFIBUS_DL:
  ------------------
  |  Branch (192:4): [True: 0, False: 2.23k]
  ------------------
  193|  2.21k|			case LINKTYPE_PKTAP:
  ------------------
  |  Branch (193:4): [True: 0, False: 2.23k]
  ------------------
  194|  2.21k|			case LINKTYPE_EPON:
  ------------------
  |  Branch (194:4): [True: 0, False: 2.23k]
  ------------------
  195|  2.21k|			case LINKTYPE_IPMI_HPM_2:
  ------------------
  |  Branch (195:4): [True: 0, False: 2.23k]
  ------------------
  196|  2.21k|			case LINKTYPE_ZWAVE_R1_R2:
  ------------------
  |  Branch (196:4): [True: 0, False: 2.23k]
  ------------------
  197|  2.21k|			case LINKTYPE_ZWAVE_R3:
  ------------------
  |  Branch (197:4): [True: 0, False: 2.23k]
  ------------------
  198|  2.21k|			case LINKTYPE_WATTSTOPPER_DLM:
  ------------------
  |  Branch (198:4): [True: 0, False: 2.23k]
  ------------------
  199|  2.21k|			case LINKTYPE_ISO_14443:
  ------------------
  |  Branch (199:4): [True: 0, False: 2.23k]
  ------------------
  200|  2.23k|			case LINKTYPE_LINUX_SLL2:
  ------------------
  |  Branch (200:4): [True: 27, False: 2.21k]
  ------------------
  201|  2.23k|			{
  202|  2.23k|				return static_cast<LinkLayerType>(value);
  203|  2.21k|			}
  204|       |
  205|      1|			default:
  ------------------
  |  Branch (205:4): [True: 1, False: 2.23k]
  ------------------
  206|      1|			{
  207|      1|				return LINKTYPE_INVALID;
  208|  2.21k|			}
  209|  2.23k|			}
  210|  2.23k|		}
PcapFileDevice.cpp:_ZN4pcpp12_GLOBAL__N_16swap32Ej:
  646|  1.96k|		{
  647|  1.96k|			return (value >> 24) | ((value >> 8) & 0x0000FF00) | ((value << 8) & 0x00FF0000) | (value << 24);
  648|  1.96k|		}

_ZNK4pcpp16BpfFilterWrapper7matchesEPKhj8timespect:
  103|   166k|	{
  104|   166k|		if (m_FilterStr.empty())
  ------------------
  |  Branch (104:7): [True: 166k, False: 0]
  ------------------
  105|   166k|			return true;
  106|       |
  107|      0|#ifdef USE_PCAP
  108|       |		// Handle uncompiled program or link type mismatch
  109|      0|		if (m_CachedProgram == nullptr || linkType != static_cast<uint16_t>(m_CachedProgramLinkType))
  ------------------
  |  Branch (109:7): [True: 0, False: 0]
  |  Branch (109:37): [True: 0, False: 0]
  ------------------
  110|      0|		{
  111|      0|			auto newProgram = compileFilter(m_FilterStr, static_cast<LinkLayerType>(linkType));
  112|      0|			if (newProgram == nullptr)
  ------------------
  |  Branch (112:8): [True: 0, False: 0]
  ------------------
  113|      0|			{
  114|      0|				PCPP_LOG_ERROR("Couldn't compile BPF filter: '" << m_FilterStr << "' for link type: " << linkType);
  ------------------
  |  |  445|      0|#	define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
  |  |  ------------------
  |  |  |  |  414|      0|	do                                                                                                                 \
  |  |  |  |  415|      0|	{                                                                                                                  \
  |  |  |  |  416|      0|		auto& logger = pcpp::Logger::getInstance();                                                                    \
  |  |  |  |  417|      0|		if (logger.shouldLog(level, LOG_MODULE))                                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PcapLogModuleLiveDevice
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (417:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  418|      0|		{                                                                                                              \
  |  |  |  |  419|      0|			auto ctx =                                                                                                 \
  |  |  |  |  420|      0|			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|      0|#define LOG_MODULE PcapLogModuleLiveDevice
  |  |  |  |  ------------------
  |  |  |  |               			    logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#	define PCAPPP_FILENAME __FILE_NAME__
  |  |  |  |  ------------------
  |  |  |  |  421|      0|			(*ctx) << message;                                                                                         \
  |  |  |  |  422|      0|			logger.emit(std::move(ctx));                                                                               \
  |  |  |  |  423|      0|		}                                                                                                              \
  |  |  |  |  424|      0|	} while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (424:11): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  115|      0|				return false;
  116|      0|			}
  117|      0|			m_CachedProgram = std::move(newProgram);
  118|      0|			m_CachedProgramLinkType = static_cast<LinkLayerType>(linkType);
  119|      0|		}
  120|       |
  121|       |		// Test the packet against the filter
  122|      0|		pcap_pkthdr pktHdr;
  123|      0|		pktHdr.caplen = packetDataLength;
  124|      0|		pktHdr.len = packetDataLength;
  125|      0|		pktHdr.ts = internal::toTimeval(timestamp);
  126|      0|		return (pcap_offline_filter(m_CachedProgram.get(), &pktHdr, packetData) != 0);
  127|       |#else
  128|       |		PCPP_LOG_ERROR("pcap is not available");
  129|       |		return false;
  130|       |#endif
  131|      0|	}

FuzzTarget.cpp:_ZL18dumpDataToPcapFilePKhmPKc:
    8|  2.25k|{
    9|  2.25k|	FILE* fd;
   10|  2.25k|	int written = 0;
   11|       |
   12|  2.25k|	fd = fopen(path, "wb");
   13|  2.25k|	if (fd == nullptr)
  ------------------
  |  Branch (13:6): [True: 0, False: 2.25k]
  ------------------
   14|      0|	{
   15|      0|		std::cerr << "Error opening pcap file for writing\n";
   16|      0|		return -1;
   17|      0|	}
   18|       |
   19|  2.25k|	written = fwrite(data, 1, size, fd);
   20|  2.25k|	if (static_cast<size_t>(written) != size)
  ------------------
  |  Branch (20:6): [True: 0, False: 2.25k]
  ------------------
   21|      0|	{
   22|      0|		std::cerr << "Error writing pcap file\n";
   23|      0|		fclose(fd);
   24|      0|		return -1;
   25|      0|	}
   26|       |
   27|  2.25k|	fclose(fd);
   28|  2.25k|	return 0;
   29|  2.25k|}

LLVMFuzzerTestOneInput:
   11|  2.25k|{
   12|  2.25k|	if (tmpName.empty())
  ------------------
  |  Branch (12:6): [True: 1, False: 2.25k]
  ------------------
   13|      1|		tmpName = tmpnam(nullptr);
   14|       |
   15|  2.25k|	if (tmpFile.empty())
  ------------------
  |  Branch (15:6): [True: 1, False: 2.25k]
  ------------------
   16|      1|		tmpFile = tmpName + FILE_EXT;
   17|       |
   18|  2.25k|	if (dumpDataToPcapFile(data, size, tmpFile.c_str()) != 0)
  ------------------
  |  Branch (18:6): [True: 0, False: 2.25k]
  ------------------
   19|      0|	{
   20|      0|		std::cerr << "Can't Dump buffer to the '" << tmpFile << "' file!!!!\n";
   21|      0|		return -1;
   22|      0|	}
   23|       |
   24|  2.25k|	pcpp::Logger::getInstance().suppressLogs();
   25|       |
   26|  2.25k|	std::unique_ptr<pcpp::IFileReaderDevice> reader(pcpp::IFileReaderDevice::getReader(tmpFile));
   27|  2.25k|	if (!reader->open())
  ------------------
  |  Branch (27:6): [True: 17, False: 2.23k]
  ------------------
   28|     17|	{
   29|     17|		std::cerr << "Error opening the '" << tmpFile << "' file\n";
   30|     17|		return -1;
   31|     17|	}
   32|       |
   33|  2.23k|	pcpp::PcapStats stats;
   34|  2.23k|	reader->getStatistics(stats);
   35|  2.23k|	std::cout << "Read " << stats.packetsRecv << " packets successfully and " << stats.packetsDrop
   36|  2.23k|	          << " packets could not be read" << std::endl;
   37|       |
   38|  2.23k|	if (auto ngReader = dynamic_cast<pcpp::PcapNgFileReaderDevice*>(reader.get()))
  ------------------
  |  Branch (38:11): [True: 0, False: 2.23k]
  ------------------
   39|      0|	{
   40|      0|		std::cout << "OS is '" << ngReader->getOS() << "'; Hardware is '" << ngReader->getHardware() << "'"
   41|      0|		          << "'; CaptureApplication is '" << ngReader->getCaptureApplication() << "'; CaptureFileComment is '"
   42|      0|		          << ngReader->getCaptureFileComment() << "'" << std::endl;
   43|      0|	}
   44|       |
   45|  2.23k|	pcpp::RawPacketVector packets;
   46|  2.23k|	if (reader->getNextPackets(packets, 1) != 1)
  ------------------
  |  Branch (46:6): [True: 1, False: 2.23k]
  ------------------
   47|      1|	{
   48|      1|		std::cerr << "Couldn't read the first packet in the file\n";
   49|      1|		return 0;
   50|      1|	}
   51|       |
   52|  2.23k|	pcpp::RawPacket& rawPacket = *packets.front();
   53|  2.23k|	do
   54|   166k|	{
   55|       |		// go deeper only for .pcap and .pcapng format
   56|       |		// for .snoop we are only fuzzing the reader
   57|   166k|		if (0 == strcmp(FILE_EXT, ".pcap") || 0 == strcmp(FILE_EXT, ".pcapng"))
  ------------------
  |  Branch (57:7): [True: 166k, Folded]
  |  Branch (57:41): [Folded, False: 0]
  ------------------
   58|   166k|		{
   59|   166k|			pcpp::Packet parsedPacket(&rawPacket);
   60|   166k|			parsedPacket.toString();
   61|   166k|			auto layer = parsedPacket.getFirstLayer();
   62|   844k|			while (layer != nullptr)
  ------------------
  |  Branch (62:11): [True: 677k, False: 166k]
  ------------------
   63|   677k|			{
   64|   677k|				std::cout << layer->toString() << std::endl;
   65|   677k|				layer->getHeaderLen();
   66|   677k|				readParsedPacket(parsedPacket, layer);
   67|   677k|				layer = layer->getNextLayer();
   68|   677k|			}
   69|   166k|			parsedPacket.computeCalculateFields();
   70|   166k|		}
   71|   166k|	} while (reader->getNextPacket(rawPacket));
  ------------------
  |  Branch (71:11): [True: 164k, False: 2.23k]
  ------------------
   72|       |
   73|  2.23k|	reader->close();
   74|  2.23k|	return 0;
   75|  2.23k|}

FuzzTarget.cpp:_ZL16readParsedPacketN4pcpp6PacketEPNS_5LayerE:
   28|   677k|{
   29|   677k|	if (parsedPacket.isPacketOfType(pcpp::Telnet))
  ------------------
  |  Branch (29:6): [True: 8.02k, False: 669k]
  ------------------
   30|  8.02k|	{
   31|  8.02k|		if (auto telnetLayer = dynamic_cast<pcpp::TelnetLayer*>(layer))
  ------------------
  |  Branch (31:12): [True: 1.79k, False: 6.22k]
  ------------------
   32|  1.79k|		{
   33|  1.79k|			telnetLayer->getFirstCommand();
   34|  1.79k|			telnetLayer->getTotalNumberOfCommands();
   35|       |
   36|  1.79k|			pcpp::TelnetLayer::TelnetCommand commandVal;
   37|  1.79k|			do
   38|  34.7k|			{
   39|  34.7k|				commandVal = telnetLayer->getNextCommand();
   40|  34.7k|				std::cout << "Telnet command is '" << telnetLayer->getTelnetCommandAsString(commandVal) << "'"
   41|  34.7k|				          << std::endl;
   42|  34.7k|				pcpp::TelnetLayer::TelnetOption option = telnetLayer->getOption();
   43|  34.7k|				std::cout << "Telnet option is '" << telnetLayer->getTelnetOptionAsString(option) << "'" << std::endl;
   44|       |
   45|  34.7k|				telnetLayer->getDataAsString(true);
   46|  34.7k|				telnetLayer->getNumberOfCommands(commandVal);
   47|  34.7k|				telnetLayer->getOption(commandVal);
   48|  34.7k|				size_t length = 0;
   49|  34.7k|				telnetLayer->getOptionData(length);
   50|  34.7k|				telnetLayer->getOptionData(commandVal, length);
   51|  34.7k|			} while (commandVal != pcpp::TelnetLayer::TelnetCommand::TelnetCommandEndOfPacket);
  ------------------
  |  Branch (51:13): [True: 32.9k, False: 1.79k]
  ------------------
   52|  1.79k|		}
   53|  8.02k|	}
   54|   677k|	if (parsedPacket.isPacketOfType(pcpp::ARP))
  ------------------
  |  Branch (54:6): [True: 13.4k, False: 663k]
  ------------------
   55|  13.4k|	{
   56|  13.4k|		if (auto arpLayer = dynamic_cast<pcpp::ArpLayer*>(layer))
  ------------------
  |  Branch (56:12): [True: 4.55k, False: 8.87k]
  ------------------
   57|  4.55k|		{
   58|  4.55k|			arpLayer->isReply();
   59|  4.55k|			arpLayer->isRequest();
   60|  4.55k|		}
   61|  13.4k|	}
   62|   677k|	if (parsedPacket.isPacketOfType(pcpp::SomeIP))
  ------------------
  |  Branch (62:6): [True: 39.3k, False: 637k]
  ------------------
   63|  39.3k|	{
   64|  39.3k|		if (auto someipLayer = dynamic_cast<pcpp::SomeIpSdLayer*>(layer))
  ------------------
  |  Branch (64:12): [True: 7.08k, False: 32.2k]
  ------------------
   65|  7.08k|		{
   66|  7.08k|			auto entries = someipLayer->getEntries();
   67|  7.08k|			if (!entries.empty())
  ------------------
  |  Branch (67:8): [True: 6.96k, False: 117]
  ------------------
   68|  6.96k|			{
   69|  6.96k|				auto opts = someipLayer->getOptionsFromEntry(0);
   70|  6.96k|				for (auto opt : opts)
  ------------------
  |  Branch (70:19): [True: 3.81k, False: 6.96k]
  ------------------
   71|  3.81k|					delete opt;
   72|  6.96k|			}
   73|       |
   74|  7.08k|			for (auto entry : entries)
  ------------------
  |  Branch (74:20): [True: 7.50k, False: 7.08k]
  ------------------
   75|  7.50k|			{
   76|  7.50k|				entry->getNumOptions();
   77|  7.50k|				entry->getServiceId();
   78|  7.50k|				entry->getInstanceId();
   79|  7.50k|				entry->getMajorVersion();
   80|  7.50k|				entry->getMinorVersion();
   81|  7.50k|				entry->getCounter();
   82|  7.50k|				entry->getEventgroupId();
   83|  7.50k|				delete entry;
   84|  7.50k|			}
   85|       |
   86|  7.08k|			someipLayer->getFlags();
   87|  7.08k|			auto opts = someipLayer->getOptions();
   88|  7.08k|			for (auto opt : opts)
  ------------------
  |  Branch (88:18): [True: 4.76k, False: 7.08k]
  ------------------
   89|  4.76k|			{
   90|  4.76k|				opt->getType();
   91|  4.76k|				if (auto v4opt = dynamic_cast<pcpp::SomeIpSdIPv4Option*>(opt))
  ------------------
  |  Branch (91:14): [True: 4.33k, False: 429]
  ------------------
   92|  4.33k|				{
   93|  4.33k|					v4opt->getIpAddress();
   94|  4.33k|					v4opt->getPort();
   95|  4.33k|					v4opt->getProtocol();
   96|  4.33k|				}
   97|    429|				else if (auto v6opt = dynamic_cast<pcpp::SomeIpSdIPv6Option*>(opt))
  ------------------
  |  Branch (97:19): [True: 121, False: 308]
  ------------------
   98|    121|				{
   99|    121|					v6opt->getIpAddress();
  100|    121|					v6opt->getPort();
  101|    121|					v6opt->getProtocol();
  102|    121|				}
  103|  4.76k|				delete opt;
  104|  4.76k|			}
  105|  7.08k|		}
  106|  39.3k|	}
  107|   677k|	if (parsedPacket.isPacketOfType(pcpp::GTP))
  ------------------
  |  Branch (107:6): [True: 26.6k, False: 650k]
  ------------------
  108|  26.6k|	{
  109|  26.6k|		if (auto gtpLayer = dynamic_cast<pcpp::GtpV1Layer*>(layer))
  ------------------
  |  Branch (109:12): [True: 3.58k, False: 23.0k]
  ------------------
  110|  3.58k|		{
  111|  3.58k|			uint16_t value16 = 0;
  112|  3.58k|			gtpLayer->getSequenceNumber(value16);
  113|  3.58k|			uint8_t value8;
  114|  3.58k|			gtpLayer->getNpduNumber(value8);
  115|  3.58k|			gtpLayer->getMessageType();
  116|  3.58k|			gtpLayer->getMessageTypeAsString();
  117|  3.58k|			gtpLayer->isGTPUMessage();
  118|  3.58k|			gtpLayer->isGTPCMessage();
  119|  3.58k|			auto ext = gtpLayer->getNextExtension();
  120|  3.58k|			ext.getExtensionType();
  121|  3.58k|			ext.getContent();
  122|  3.58k|			ext.getContentLength();
  123|  3.58k|			ext.getNextExtension();
  124|  3.58k|		}
  125|  26.6k|	}
  126|   677k|	if (parsedPacket.isPacketOfType(pcpp::GRE))
  ------------------
  |  Branch (126:6): [True: 22.1k, False: 655k]
  ------------------
  127|  22.1k|	{
  128|  22.1k|		if (auto greLayer = dynamic_cast<pcpp::GreLayer*>(layer))
  ------------------
  |  Branch (128:12): [True: 5.17k, False: 16.9k]
  ------------------
  129|  5.17k|		{
  130|  5.17k|			uint32_t value32 = 0;
  131|  5.17k|			greLayer->getSequenceNumber(value32);
  132|  5.17k|		}
  133|  22.1k|	}
  134|   677k|	if (parsedPacket.isPacketOfType(pcpp::GREv0))
  ------------------
  |  Branch (134:6): [True: 11.4k, False: 665k]
  ------------------
  135|  11.4k|	{
  136|  11.4k|		if (auto greLayer = dynamic_cast<pcpp::GREv0Layer*>(layer))
  ------------------
  |  Branch (136:12): [True: 2.94k, False: 8.48k]
  ------------------
  137|  2.94k|		{
  138|  2.94k|			uint16_t value16 = 0;
  139|  2.94k|			greLayer->getChecksum(value16);
  140|  2.94k|			greLayer->getOffset(value16);
  141|  2.94k|			uint32_t value32 = 0;
  142|  2.94k|			greLayer->getKey(value32);
  143|  2.94k|		}
  144|  11.4k|	}
  145|   677k|	if (parsedPacket.isPacketOfType(pcpp::GREv1))
  ------------------
  |  Branch (145:6): [True: 10.8k, False: 666k]
  ------------------
  146|  10.8k|	{
  147|  10.8k|		if (auto greLayer = dynamic_cast<pcpp::GREv1Layer*>(layer))
  ------------------
  |  Branch (147:12): [True: 2.23k, False: 8.64k]
  ------------------
  148|  2.23k|		{
  149|  2.23k|			uint32_t value32 = 0;
  150|  2.23k|			greLayer->getAcknowledgmentNum(value32);
  151|  2.23k|		}
  152|  10.8k|	}
  153|   677k|	if (parsedPacket.isPacketOfType(pcpp::FTP))
  ------------------
  |  Branch (153:6): [True: 16.9k, False: 660k]
  ------------------
  154|  16.9k|	{
  155|  16.9k|		if (auto ftpLayer = dynamic_cast<pcpp::FtpRequestLayer*>(layer))
  ------------------
  |  Branch (155:12): [True: 1.31k, False: 15.6k]
  ------------------
  156|  1.31k|		{
  157|  1.31k|			ftpLayer->getCommandOption(false);
  158|  1.31k|			ftpLayer->getCommandOption(true);
  159|  1.31k|		}
  160|  15.6k|		else if (auto ftpLayer = dynamic_cast<pcpp::FtpResponseLayer*>(layer))
  ------------------
  |  Branch (160:17): [True: 2.36k, False: 13.3k]
  ------------------
  161|  2.36k|		{
  162|  2.36k|			ftpLayer->getStatusCode();
  163|  2.36k|			ftpLayer->getStatusOption(false);
  164|  2.36k|			ftpLayer->getStatusOption(true);
  165|  2.36k|		}
  166|  16.9k|	}
  167|   677k|	if (parsedPacket.isPacketOfType(pcpp::SLL2))
  ------------------
  |  Branch (167:6): [True: 5.27k, False: 672k]
  ------------------
  168|  5.27k|	{
  169|  5.27k|		if (auto sllLayer = dynamic_cast<pcpp::Sll2Layer*>(layer))
  ------------------
  |  Branch (169:12): [True: 1.92k, False: 3.35k]
  ------------------
  170|  1.92k|		{
  171|  1.92k|			sllLayer->getLinkLayerAsMacAddress();
  172|  1.92k|			sllLayer->getProtocolType();
  173|  1.92k|			sllLayer->getInterfaceIndex();
  174|  1.92k|			sllLayer->getArphrdType();
  175|  1.92k|			sllLayer->getPacketType();
  176|  1.92k|		}
  177|  5.27k|	}
  178|   677k|	if (parsedPacket.isPacketOfType(pcpp::VRRP))
  ------------------
  |  Branch (178:6): [True: 9.05k, False: 668k]
  ------------------
  179|  9.05k|	{
  180|  9.05k|		if (auto vrrpLayer = dynamic_cast<pcpp::VrrpLayer*>(layer))
  ------------------
  |  Branch (180:12): [True: 2.69k, False: 6.36k]
  ------------------
  181|  2.69k|		{
  182|  2.69k|			vrrpLayer->getIPAddresses();
  183|  2.69k|			vrrpLayer->isChecksumCorrect();
  184|  2.69k|			vrrpLayer->getChecksum();
  185|  2.69k|			vrrpLayer->getPriorityAsEnum();
  186|  2.69k|			vrrpLayer->getPriority();
  187|  2.69k|			vrrpLayer->getType();
  188|  2.69k|		}
  189|  9.05k|	}
  190|   677k|	if (parsedPacket.isPacketOfType(pcpp::VRRPv2))
  ------------------
  |  Branch (190:6): [True: 4.44k, False: 672k]
  ------------------
  191|  4.44k|	{
  192|  4.44k|		if (auto vrrpLayer = dynamic_cast<pcpp::VrrpV2Layer*>(layer))
  ------------------
  |  Branch (192:12): [True: 1.17k, False: 3.27k]
  ------------------
  193|  1.17k|		{
  194|  1.17k|			vrrpLayer->getAuthTypeAsEnum();
  195|  1.17k|			vrrpLayer->getAdvInt();
  196|  1.17k|		}
  197|  4.44k|	}
  198|   677k|	if (parsedPacket.isPacketOfType(pcpp::VRRPv3))
  ------------------
  |  Branch (198:6): [True: 4.60k, False: 672k]
  ------------------
  199|  4.60k|	{
  200|  4.60k|		if (auto vrrpLayer = dynamic_cast<pcpp::VrrpV3Layer*>(layer))
  ------------------
  |  Branch (200:12): [True: 1.51k, False: 3.08k]
  ------------------
  201|  1.51k|		{
  202|  1.51k|			vrrpLayer->getMaxAdvInt();
  203|  1.51k|		}
  204|  4.60k|	}
  205|   677k|	if (parsedPacket.isPacketOfType(pcpp::TCP))
  ------------------
  |  Branch (205:6): [True: 382k, False: 294k]
  ------------------
  206|   382k|	{
  207|   382k|		if (auto tcpLayer = dynamic_cast<pcpp::TcpLayer*>(layer))
  ------------------
  |  Branch (207:12): [True: 88.9k, False: 293k]
  ------------------
  208|  88.9k|		{
  209|  88.9k|			auto tcpLayer2(*tcpLayer);
  210|  88.9k|			tcpLayer2.insertTcpOptionAfter(pcpp::TcpOptionBuilder(pcpp::TcpOptionBuilder::NopEolOptionEnumType::Nop),
  211|  88.9k|			                               pcpp::TcpOptionEnumType::Nop);
  212|  88.9k|		}
  213|   382k|	}
  214|   677k|	if (parsedPacket.isPacketOfType(pcpp::SDP))
  ------------------
  |  Branch (214:6): [True: 8.13k, False: 669k]
  ------------------
  215|  8.13k|	{
  216|  8.13k|		if (auto sdpLayer = dynamic_cast<pcpp::SdpLayer*>(layer))
  ------------------
  |  Branch (216:12): [True: 1.33k, False: 6.79k]
  ------------------
  217|  1.33k|		{
  218|  1.33k|			sdpLayer->getOwnerIPv4Address();
  219|  1.33k|			sdpLayer->getMediaPort("audio");
  220|  1.33k|			sdpLayer->getFieldCount();
  221|       |
  222|  1.33k|			auto sdpLayer2 = *sdpLayer;
  223|  1.33k|			std::vector<std::string> audioAttributes;
  224|  1.33k|			audioAttributes.push_back("rtpmap:8 PCMA/8000");
  225|  1.33k|			sdpLayer2.addMediaDescription("audio", 6010, "RTP/AVP", "8 96", audioAttributes);
  226|  1.33k|			sdpLayer2.addField(PCPP_SDP_PROTOCOL_VERSION_FIELD, "0");
  ------------------
  |  |   15|  1.33k|#define PCPP_SDP_PROTOCOL_VERSION_FIELD "v"
  ------------------
  227|  1.33k|			sdpLayer2.removeField(PCPP_SDP_PROTOCOL_VERSION_FIELD);
  ------------------
  |  |   15|  1.33k|#define PCPP_SDP_PROTOCOL_VERSION_FIELD "v"
  ------------------
  228|  1.33k|		}
  229|  8.13k|	}
  230|   677k|	if (parsedPacket.isPacketOfType(pcpp::SSL))
  ------------------
  |  Branch (230:6): [True: 111k, False: 565k]
  ------------------
  231|   111k|	{
  232|   111k|		if (auto handshakeLayer = dynamic_cast<pcpp::SSLHandshakeLayer*>(layer))
  ------------------
  |  Branch (232:12): [True: 14.5k, False: 97.2k]
  ------------------
  233|  14.5k|		{
  234|  14.5k|			if (auto clientHelloMessage = handshakeLayer->getHandshakeMessageOfType<pcpp::SSLClientHelloMessage>())
  ------------------
  |  Branch (234:13): [True: 6.33k, False: 8.20k]
  ------------------
  235|  6.33k|			{
  236|  6.33k|				clientHelloMessage->getCompressionMethodsValue();
  237|  6.33k|				clientHelloMessage->getSessionID();
  238|  6.33k|				clientHelloMessage->getHandshakeType();
  239|  6.33k|				clientHelloMessage->getHandshakeVersion();
  240|       |
  241|  6.33k|				pcpp::SSLCipherSuite::getCipherSuiteByName("TLS_RSA_WITH_NULL_MD5");
  242|  15.7M|				for (int i = 0; i < clientHelloMessage->getCipherSuiteCount(); i++)
  ------------------
  |  Branch (242:21): [True: 15.7M, False: 6.33k]
  ------------------
  243|  15.7M|				{
  244|  15.7M|					clientHelloMessage->getCipherSuite(i);
  245|  15.7M|					bool valid;
  246|  15.7M|					clientHelloMessage->getCipherSuiteID(i, valid);
  247|  15.7M|				}
  248|  6.33k|				if (auto ext = clientHelloMessage->getExtensionOfType<pcpp::SSLServerNameIndicationExtension>())
  ------------------
  |  Branch (248:14): [True: 3.44k, False: 2.89k]
  ------------------
  249|  3.44k|					ext->getHostName();
  250|  6.33k|				if (auto ext = clientHelloMessage->getExtensionOfType<pcpp::SSLSupportedVersionsExtension>())
  ------------------
  |  Branch (250:14): [True: 1.03k, False: 5.30k]
  ------------------
  251|  1.03k|					ext->getSupportedVersions();
  252|       |
  253|  6.33k|				clientHelloMessage->getExtensionOfType(pcpp::SSL_EXT_SERVER_NAME);
  254|  6.33k|				clientHelloMessage->getExtensionOfType((uint16_t)0);
  255|       |
  256|  6.33k|				auto fingerprint = clientHelloMessage->generateTLSFingerprint();
  257|  6.33k|				fingerprint.toMD5();
  258|  6.33k|			}
  259|  14.5k|			if (auto serverHelloMessage = handshakeLayer->getHandshakeMessageOfType<pcpp::SSLServerHelloMessage>())
  ------------------
  |  Branch (259:13): [True: 3.61k, False: 10.9k]
  ------------------
  260|  3.61k|			{
  261|  3.61k|				serverHelloMessage->getCompressionMethodsValue();
  262|  3.61k|				serverHelloMessage->getSessionID();
  263|  3.61k|				serverHelloMessage->getCipherSuite();
  264|       |
  265|  3.61k|				serverHelloMessage->getExtensionOfType<pcpp::SSLServerNameIndicationExtension>();
  266|  3.61k|				serverHelloMessage->getExtensionOfType(pcpp::SSL_EXT_SERVER_NAME);
  267|  3.61k|				serverHelloMessage->getExtensionOfType((uint16_t)0);
  268|       |
  269|  3.61k|				serverHelloMessage->getHandshakeVersion();
  270|  3.61k|				auto fingerprint = serverHelloMessage->generateTLSFingerprint();
  271|  3.61k|				fingerprint.toMD5();
  272|  3.61k|			}
  273|  14.5k|			if (auto handshakeMessage = handshakeLayer->getHandshakeMessageOfType<pcpp::SSLHandshakeMessage>())
  ------------------
  |  Branch (273:13): [True: 11.0k, False: 3.53k]
  ------------------
  274|  11.0k|			{
  275|  11.0k|				handshakeMessage->isMessageComplete();
  276|  11.0k|			}
  277|  14.5k|		}
  278|   111k|	}
  279|   677k|	if (parsedPacket.isPacketOfType(pcpp::NTP))
  ------------------
  |  Branch (279:6): [True: 6.16k, False: 671k]
  ------------------
  280|  6.16k|	{
  281|  6.16k|		if (auto ntpLayer = dynamic_cast<pcpp::NtpLayer*>(layer))
  ------------------
  |  Branch (281:12): [True: 1.23k, False: 4.92k]
  ------------------
  282|  1.23k|		{
  283|  1.23k|			ntpLayer->getLeapIndicator();
  284|  1.23k|			ntpLayer->getMode();
  285|  1.23k|			ntpLayer->getModeString();
  286|  1.23k|			ntpLayer->getStratum();
  287|  1.23k|			ntpLayer->getPollInterval();
  288|  1.23k|			ntpLayer->getPrecision();
  289|  1.23k|			ntpLayer->getRootDelay();
  290|  1.23k|			ntpLayer->getRootDispersion();
  291|  1.23k|			ntpLayer->getReferenceIdentifier();
  292|  1.23k|			ntpLayer->getReferenceIdentifierString();
  293|  1.23k|			ntpLayer->getReferenceTimestamp();
  294|  1.23k|			ntpLayer->getOriginTimestamp();
  295|  1.23k|			ntpLayer->getReceiveTimestamp();
  296|  1.23k|			ntpLayer->getTransmitTimestamp();
  297|       |
  298|  1.23k|			ntpLayer->getDigest();
  299|  1.23k|			ntpLayer->getKeyID();
  300|       |
  301|  1.23k|			ntpLayer->getPollIntervalInSecs();
  302|  1.23k|			ntpLayer->getPrecisionInSecs();
  303|  1.23k|			ntpLayer->getRootDelayInSecs();
  304|  1.23k|			ntpLayer->getRootDispersionInSecs();
  305|  1.23k|			ntpLayer->getReferenceTimestampInSecs();
  306|  1.23k|			ntpLayer->getOriginTimestampInSecs();
  307|  1.23k|			ntpLayer->getReceiveTimestampInSecs();
  308|  1.23k|			ntpLayer->getTransmitTimestampInSecs();
  309|       |
  310|  1.23k|			ntpLayer->getReferenceTimestampAsString();
  311|  1.23k|			ntpLayer->getOriginTimestampAsString();
  312|  1.23k|			ntpLayer->getReceiveTimestampAsString();
  313|  1.23k|			ntpLayer->getTransmitTimestampAsString();
  314|       |
  315|  1.23k|			auto ntpLayer2(*ntpLayer);
  316|  1.23k|			ntpLayer2.setRootDelayInSecs(0.1);
  317|  1.23k|			ntpLayer2.setReferenceTimestampInSecs(0.1);
  318|  1.23k|		}
  319|  6.16k|	}
  320|   677k|	if (parsedPacket.isPacketOfType(pcpp::ICMP))
  ------------------
  |  Branch (320:6): [True: 17.0k, False: 660k]
  ------------------
  321|  17.0k|	{
  322|  17.0k|		if (auto icmpLayer = dynamic_cast<pcpp::IcmpLayer*>(layer))
  ------------------
  |  Branch (322:12): [True: 3.84k, False: 13.1k]
  ------------------
  323|  3.84k|		{
  324|  3.84k|			auto icmpLayer2(*icmpLayer);
  325|       |
  326|  3.84k|			if (icmpLayer->isMessageOfType(pcpp::ICMP_TIMESTAMP_REPLY))
  ------------------
  |  Branch (326:8): [True: 199, False: 3.64k]
  ------------------
  327|    199|			{
  328|    199|				icmpLayer->getTimestampReplyData();
  329|    199|				timeval orig = { 16131, 171000 };
  330|    199|				timeval recv = { 16133, 474000 };
  331|    199|				timeval tran = { 16133, 474000 };
  332|    199|				icmpLayer2.setTimestampReplyData(14640, 0, orig, recv, tran);
  333|    199|			}
  334|  3.64k|			else if (icmpLayer->isMessageOfType(pcpp::ICMP_ADDRESS_MASK_REQUEST))
  ------------------
  |  Branch (334:13): [True: 39, False: 3.61k]
  ------------------
  335|     39|			{
  336|     39|				icmpLayer->getAddressMaskRequestData();
  337|     39|				icmpLayer2.setAddressMaskRequestData(45068, 1536, pcpp::IPv4Address::Zero);
  338|     39|			}
  339|  3.61k|			else if (icmpLayer->isMessageOfType(pcpp::ICMP_ADDRESS_MASK_REPLY))
  ------------------
  |  Branch (339:13): [True: 344, False: 3.26k]
  ------------------
  340|    344|			{
  341|    344|				icmpLayer->getAddressMaskReplyData();
  342|    344|				icmpLayer2.setAddressMaskReplyData(45068, 1536, pcpp::IPv4Address::Zero);
  343|    344|			}
  344|  3.26k|			else if (icmpLayer->isMessageOfType(pcpp::ICMP_DEST_UNREACHABLE))
  ------------------
  |  Branch (344:13): [True: 359, False: 2.90k]
  ------------------
  345|    359|			{
  346|    359|				icmpLayer->getDestUnreachableData();
  347|    359|				icmpLayer2.setDestUnreachableData(pcpp::IcmpHostUnreachable, 0, nullptr, nullptr);
  348|    359|			}
  349|  2.90k|			else if (icmpLayer->isMessageOfType(pcpp::ICMP_INFO_REPLY))
  ------------------
  |  Branch (349:13): [True: 1.13k, False: 1.77k]
  ------------------
  350|  1.13k|			{
  351|  1.13k|				auto layerData = icmpLayer->getInfoReplyData();
  352|  1.13k|				icmpLayer2.setInfoReplyData(layerData->id, layerData->sequence);
  353|  1.13k|			}
  354|  1.77k|			else if (icmpLayer->isMessageOfType(pcpp::ICMP_INFO_REQUEST))
  ------------------
  |  Branch (354:13): [True: 0, False: 1.77k]
  ------------------
  355|      0|			{
  356|      0|				auto layerData = icmpLayer->getInfoRequestData();
  357|      0|				icmpLayer2.setInfoRequestData(layerData->id, layerData->sequence);
  358|      0|			}
  359|  1.77k|			else if (icmpLayer->isMessageOfType(pcpp::ICMP_PARAM_PROBLEM))
  ------------------
  |  Branch (359:13): [True: 96, False: 1.68k]
  ------------------
  360|     96|			{
  361|     96|				auto layerData = icmpLayer->getParamProblemData();
  362|     96|				icmpLayer2.setParamProblemData(layerData->code, layerData->pointer, nullptr, nullptr);
  363|     96|			}
  364|  1.68k|			else if (icmpLayer->isMessageOfType(pcpp::ICMP_TIME_EXCEEDED))
  ------------------
  |  Branch (364:13): [True: 106, False: 1.57k]
  ------------------
  365|    106|			{
  366|    106|				icmpLayer->getTimeExceededData();
  367|    106|				icmpLayer2.setTimeExceededData(1, nullptr, nullptr);
  368|    106|			}
  369|  1.57k|			else if (icmpLayer->isMessageOfType(pcpp::ICMP_ROUTER_ADV))
  ------------------
  |  Branch (369:13): [True: 1, False: 1.57k]
  ------------------
  370|      1|			{
  371|      1|				icmpLayer->getRouterAdvertisementData();
  372|      1|				pcpp::icmp_router_address_structure addr1;
  373|      1|				addr1.setRouterAddress(pcpp::IPv4Address("192.168.144.2"), (uint32_t)0x08000000);
  374|      1|				std::vector<pcpp::icmp_router_address_structure> routerAddresses;
  375|      1|				routerAddresses.push_back(addr1);
  376|      1|				icmpLayer2.setRouterAdvertisementData(16, 200, routerAddresses);
  377|      1|			}
  378|  3.84k|		}
  379|  17.0k|	}
  380|   677k|	if (parsedPacket.isPacketOfType(pcpp::DHCPv6))
  ------------------
  |  Branch (380:6): [True: 4.50k, False: 672k]
  ------------------
  381|  4.50k|	{
  382|  4.50k|		if (auto dhcpLayer = dynamic_cast<pcpp::DhcpV6Layer*>(layer))
  ------------------
  |  Branch (382:12): [True: 1.19k, False: 3.31k]
  ------------------
  383|  1.19k|		{
  384|  1.19k|			dhcpLayer->getTransactionID();
  385|  1.19k|			if (dhcpLayer->getOptionCount() > 0)
  ------------------
  |  Branch (385:8): [True: 850, False: 343]
  ------------------
  386|    850|			{
  387|    850|				pcpp::DhcpV6Option opt = dhcpLayer->getFirstOptionData();
  388|    850|				opt.getType();
  389|    850|				opt.getTotalSize();
  390|    850|				opt.getValueAsHexString();
  391|  5.28k|				for (size_t i = 0; i < dhcpLayer->getOptionCount(); i++)
  ------------------
  |  Branch (391:24): [True: 4.43k, False: 850]
  ------------------
  392|  4.43k|				{
  393|  4.43k|					opt = dhcpLayer->getNextOptionData(opt);
  394|  4.43k|				}
  395|    850|				dhcpLayer->getOptionData(pcpp::DHCPV6_OPT_CLIENTID);
  396|    850|			}
  397|  1.19k|		}
  398|  4.50k|	}
  399|   677k|	if (parsedPacket.isPacketOfType(pcpp::DHCP))
  ------------------
  |  Branch (399:6): [True: 17.1k, False: 660k]
  ------------------
  400|  17.1k|	{
  401|  17.1k|		if (auto dhcpLayer = dynamic_cast<pcpp::DhcpLayer*>(layer))
  ------------------
  |  Branch (401:12): [True: 3.73k, False: 13.4k]
  ------------------
  402|  3.73k|		{
  403|  3.73k|			dhcpLayer->getOpCode();
  404|  3.73k|			dhcpLayer->getDhcpHeader();
  405|  3.73k|			dhcpLayer->getClientIpAddress();
  406|  3.73k|			dhcpLayer->getYourIpAddress();
  407|  3.73k|			dhcpLayer->getServerIpAddress();
  408|  3.73k|			dhcpLayer->getGatewayIpAddress();
  409|  3.73k|			dhcpLayer->getClientHardwareAddress();
  410|  3.73k|			if (dhcpLayer->getOptionsCount() > 0)
  ------------------
  |  Branch (410:8): [True: 3.69k, False: 47]
  ------------------
  411|  3.69k|			{
  412|  3.69k|				pcpp::DhcpOption opt = dhcpLayer->getFirstOptionData();
  413|  3.69k|				opt.getValueAsIpAddr();
  414|  3.69k|				opt.getValueAsString();
  415|   249k|				for (size_t i = 0; i < dhcpLayer->getOptionsCount(); i++)
  ------------------
  |  Branch (415:24): [True: 245k, False: 3.69k]
  ------------------
  416|   245k|				{
  417|   245k|					opt = dhcpLayer->getNextOptionData(opt);
  418|   245k|				}
  419|  3.69k|			}
  420|  3.73k|			dhcpLayer->getOptionData(pcpp::DHCPOPT_SUBNET_MASK);
  421|  3.73k|		}
  422|  17.1k|	}
  423|   677k|	if (parsedPacket.isPacketOfType(pcpp::BGP))
  ------------------
  |  Branch (423:6): [True: 27.3k, False: 650k]
  ------------------
  424|  27.3k|	{
  425|  27.3k|		if (auto bgpLayer = dynamic_cast<pcpp::BgpLayer*>(layer))
  ------------------
  |  Branch (425:12): [True: 8.46k, False: 18.8k]
  ------------------
  426|  8.46k|		{
  427|  8.46k|			bgpLayer->getMessageTypeAsString();
  428|  8.46k|			if (auto bgpOpenMsgLayer = dynamic_cast<pcpp::BgpOpenMessageLayer*>(bgpLayer))
  ------------------
  |  Branch (428:13): [True: 2.34k, False: 6.11k]
  ------------------
  429|  2.34k|			{
  430|  2.34k|				std::vector<pcpp::BgpOpenMessageLayer::optional_parameter> optionalParams;
  431|  2.34k|				bgpOpenMsgLayer->getOptionalParameters(optionalParams);
  432|  2.34k|				std::vector<pcpp::BgpOpenMessageLayer::optional_parameter> optionalParams2(optionalParams);
  433|  2.34k|				optionalParams2.push_back(pcpp::BgpOpenMessageLayer::optional_parameter(2, "010400010001"));
  434|  2.34k|				optionalParams2.push_back(pcpp::BgpOpenMessageLayer::optional_parameter(2, "8000"));
  435|  2.34k|				optionalParams2.push_back(pcpp::BgpOpenMessageLayer::optional_parameter(2, "0200"));
  436|  2.34k|				optionalParams2.push_back(pcpp::BgpOpenMessageLayer::optional_parameter(2, "4600"));
  437|  2.34k|				optionalParams2.push_back(pcpp::BgpOpenMessageLayer::optional_parameter(2, "410400000001"));
  438|  2.34k|				bgpOpenMsgLayer->setOptionalParameters(optionalParams2);
  439|  2.34k|				bgpOpenMsgLayer->clearOptionalParameters();
  440|  2.34k|				bgpOpenMsgLayer->setOptionalParameters(optionalParams);
  441|  2.34k|			}
  442|  6.11k|			else if (auto bgpUpdateMsgLayer = dynamic_cast<pcpp::BgpUpdateMessageLayer*>(bgpLayer))
  ------------------
  |  Branch (442:18): [True: 5.33k, False: 779]
  ------------------
  443|  5.33k|			{
  444|  5.33k|				std::vector<pcpp::BgpUpdateMessageLayer::prefix_and_ip> withdrawnRoutes;
  445|  5.33k|				bgpUpdateMsgLayer->getWithdrawnRoutes(withdrawnRoutes);
  446|  5.33k|				std::vector<pcpp::BgpUpdateMessageLayer::prefix_and_ip> withdrawnRoutes2(withdrawnRoutes);
  447|  5.33k|				withdrawnRoutes2.push_back(pcpp::BgpUpdateMessageLayer::prefix_and_ip(24, "40.1.1.0"));
  448|  5.33k|				withdrawnRoutes2.push_back(pcpp::BgpUpdateMessageLayer::prefix_and_ip(24, "40.40.40.0"));
  449|  5.33k|				withdrawnRoutes2.push_back(pcpp::BgpUpdateMessageLayer::prefix_and_ip(16, "103.103.0.0"));
  450|  5.33k|				withdrawnRoutes2.push_back(pcpp::BgpUpdateMessageLayer::prefix_and_ip(24, "103.103.40.0"));
  451|  5.33k|				bgpUpdateMsgLayer->setWithdrawnRoutes(withdrawnRoutes2);
  452|  5.33k|				bgpUpdateMsgLayer->clearWithdrawnRoutes();
  453|  5.33k|				bgpUpdateMsgLayer->setWithdrawnRoutes(withdrawnRoutes);
  454|       |
  455|  5.33k|				std::vector<pcpp::BgpUpdateMessageLayer::prefix_and_ip> nlriVec;
  456|  5.33k|				bgpUpdateMsgLayer->getNetworkLayerReachabilityInfo(nlriVec);
  457|  5.33k|				std::vector<pcpp::BgpUpdateMessageLayer::prefix_and_ip> nlriVec2(nlriVec);
  458|  5.33k|				nlriVec2.push_back(pcpp::BgpUpdateMessageLayer::prefix_and_ip(24, "40.1.1.0"));
  459|  5.33k|				bgpUpdateMsgLayer->setNetworkLayerReachabilityInfo(nlriVec2);
  460|  5.33k|				bgpUpdateMsgLayer->clearNetworkLayerReachabilityInfo();
  461|  5.33k|				bgpUpdateMsgLayer->setNetworkLayerReachabilityInfo(nlriVec);
  462|       |
  463|  5.33k|				std::vector<pcpp::BgpUpdateMessageLayer::path_attribute> pathAttributes;
  464|  5.33k|				bgpUpdateMsgLayer->getPathAttributes(pathAttributes);
  465|  5.33k|				std::vector<pcpp::BgpUpdateMessageLayer::path_attribute> pathAttributes2(pathAttributes);
  466|  5.33k|				pathAttributes2.push_back(pcpp::BgpUpdateMessageLayer::path_attribute(0x40, 1, "02"));
  467|  5.33k|				pathAttributes2.push_back(
  468|  5.33k|				    pcpp::BgpUpdateMessageLayer::path_attribute(0x40, 2, "02030000000a0000001400000028"));
  469|  5.33k|				pathAttributes2.push_back(pcpp::BgpUpdateMessageLayer::path_attribute(0x40, 3, "1e031e03"));
  470|  5.33k|				bgpUpdateMsgLayer->setPathAttributes(pathAttributes2);
  471|  5.33k|				bgpUpdateMsgLayer->clearPathAttributes();
  472|  5.33k|				bgpUpdateMsgLayer->setPathAttributes(pathAttributes);
  473|  5.33k|			}
  474|    779|			else if (auto bgpNotificationMsgLayer = dynamic_cast<pcpp::BgpNotificationMessageLayer*>(bgpLayer))
  ------------------
  |  Branch (474:18): [True: 104, False: 675]
  ------------------
  475|    104|			{
  476|    104|				bgpNotificationMsgLayer->getNotificationDataAsHexString();
  477|    104|			}
  478|  8.46k|		}
  479|  27.3k|	}
  480|   677k|	if (parsedPacket.isPacketOfType(pcpp::DNS))
  ------------------
  |  Branch (480:6): [True: 31.9k, False: 645k]
  ------------------
  481|  31.9k|	{
  482|  31.9k|		if (auto dnsLayer = dynamic_cast<pcpp::DnsLayer*>(layer))
  ------------------
  |  Branch (482:12): [True: 8.26k, False: 23.6k]
  ------------------
  483|  8.26k|		{
  484|  8.26k|			dnsLayer->addQuery("mail-attachment.googleusercontent.com", pcpp::DNS_TYPE_A, pcpp::DNS_CLASS_IN);
  485|  8.26k|			dnsLayer->removeQuery("a", true);
  486|  8.26k|			dnsLayer->removeQuery("mail-attachment.googleusercontent.com", false);
  487|  8.26k|			pcpp::IPv4DnsResourceData ipv4DnsData(std::string("151.249.90.217"));
  488|  8.26k|			dnsLayer->addAnswer("assets.pinterest.com.cdngc.net", pcpp::DNS_TYPE_A, pcpp::DNS_CLASS_IN, 3,
  489|  8.26k|			                    &ipv4DnsData);
  490|  8.26k|			dnsLayer->removeAnswer("a", true);
  491|  8.26k|			dnsLayer->removeAnswer("assets.pinterest.com.cdngc.net", false);
  492|  8.26k|			dnsLayer->addAuthority("Yaels-iPhone.local", pcpp::DNS_TYPE_A, pcpp::DNS_CLASS_IN, 120, &ipv4DnsData);
  493|  8.26k|			dnsLayer->removeAuthority("a", true);
  494|  8.26k|			dnsLayer->removeAuthority("Yaels-iPhone.local", false);
  495|  8.26k|			pcpp::GenericDnsResourceData genericData("0004000800df581faa4f3f9d");
  496|  8.26k|			dnsLayer->addAdditionalRecord("abc", pcpp::DNS_TYPE_OPT, 0xa005, 0x1194, &genericData);
  497|  8.26k|			dnsLayer->removeAdditionalRecord("a", true);
  498|  8.26k|			dnsLayer->removeAdditionalRecord("abc", false);
  499|       |
  500|  8.26k|			auto add = dnsLayer->getFirstAdditionalRecord();
  501|  9.32k|			while (add != nullptr)
  ------------------
  |  Branch (501:11): [True: 1.05k, False: 8.26k]
  ------------------
  502|  1.05k|			{
  503|  1.05k|				add = dnsLayer->getNextAdditionalRecord(add);
  504|  1.05k|			}
  505|       |
  506|  8.26k|			auto answer = dnsLayer->getFirstAnswer();
  507|  11.5k|			while (answer != nullptr)
  ------------------
  |  Branch (507:11): [True: 3.25k, False: 8.26k]
  ------------------
  508|  3.25k|			{
  509|  3.25k|				answer = dnsLayer->getNextAnswer(answer);
  510|  3.25k|			}
  511|       |
  512|  8.26k|			auto auth = dnsLayer->getFirstAuthority();
  513|  8.94k|			while (auth != nullptr)
  ------------------
  |  Branch (513:11): [True: 680, False: 8.26k]
  ------------------
  514|    680|			{
  515|    680|				auth = dnsLayer->getNextAuthority(auth);
  516|    680|			}
  517|       |
  518|  8.26k|			pcpp::DnsLayer other(*dnsLayer);
  519|  8.26k|			other = *dnsLayer;
  520|  8.26k|		}
  521|  31.9k|	}
  522|   677k|}

