Coverage Report

Created: 2025-11-09 07:08

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/PcapPlusPlus/Packet++/src/NullLoopbackLayer.cpp
Line
Count
Source
1
#include "NullLoopbackLayer.h"
2
#include "EthLayer.h"
3
#include "IPv4Layer.h"
4
#include "IPv6Layer.h"
5
#include "PayloadLayer.h"
6
7
namespace pcpp
8
{
9
10
0
#define BSWAP16(x) (((x) >> 8) | ((x) << 8))
11
0
#define BSWAP32(x) (((x) >> 24) | (((x) & 0x00FF'0000) >> 8) | (((x) & 0x0000'FF00) << 8) | ((x) << 24))
12
13
0
#define IEEE_802_3_MAX_LEN 0x5dc
14
15
  NullLoopbackLayer::NullLoopbackLayer(uint32_t family)
16
0
  {
17
0
    const size_t dataLen = sizeof(uint32_t);
18
0
    m_DataLen = dataLen;
19
0
    m_Data = new uint8_t[dataLen];
20
0
    memset(m_Data, 0, dataLen);
21
0
    m_Protocol = NULL_LOOPBACK;
22
23
0
    setFamily(family);
24
0
  }
25
26
  uint32_t NullLoopbackLayer::getFamily() const
27
0
  {
28
0
    uint32_t family = *(reinterpret_cast<uint32_t*>(m_Data));
29
0
    if ((family & 0xFFFF'0000) != 0)
30
0
    {
31
0
      if ((family & 0xFF00'0000) == 0 && (family & 0x00FF'0000) < 0x0006'0000)
32
0
      {
33
0
        family >>= 16;
34
0
      }
35
0
      else
36
0
      {
37
0
        family = BSWAP32(family);
38
0
      }
39
0
    }
40
0
    else if ((family & 0x0000'00FF) == 0 && (family & 0x0000'FF00) < 0x0000'0600)
41
0
    {
42
0
      family = BSWAP16(family & 0xFFFF);
43
0
    }
44
45
0
    return family;
46
0
  }
47
48
  void NullLoopbackLayer::setFamily(uint32_t family)
49
0
  {
50
0
    *m_Data = family;
51
0
  }
52
53
  void NullLoopbackLayer::parseNextLayer()
54
0
  {
55
0
    uint8_t* payload = m_Data + sizeof(uint32_t);
56
0
    size_t payloadLen = m_DataLen - sizeof(uint32_t);
57
58
0
    uint32_t family = getFamily();
59
0
    if (family > IEEE_802_3_MAX_LEN)
60
0
    {
61
0
      uint16_t ethType = static_cast<uint16_t>(family);
62
0
      switch (ethType)
63
0
      {
64
0
      case PCPP_ETHERTYPE_IP:
65
0
        m_NextLayer = IPv4Layer::isDataValid(payload, payloadLen)
66
0
                          ? static_cast<Layer*>(new IPv4Layer(payload, payloadLen, this, m_Packet))
67
0
                          : static_cast<Layer*>(new PayloadLayer(payload, payloadLen, this, m_Packet));
68
0
        return;
69
0
      case PCPP_ETHERTYPE_IPV6:
70
0
        m_NextLayer = IPv6Layer::isDataValid(payload, payloadLen)
71
0
                          ? static_cast<Layer*>(new IPv6Layer(payload, payloadLen, this, m_Packet))
72
0
                          : static_cast<Layer*>(new PayloadLayer(payload, payloadLen, this, m_Packet));
73
0
        return;
74
0
      default:
75
0
        m_NextLayer = new PayloadLayer(payload, payloadLen, this, m_Packet);
76
0
        return;
77
0
      }
78
0
    }
79
80
0
    switch (family)
81
0
    {
82
0
    case PCPP_BSD_AF_INET:
83
0
      m_NextLayer = IPv4Layer::isDataValid(payload, payloadLen)
84
0
                        ? static_cast<Layer*>(new IPv4Layer(payload, payloadLen, this, m_Packet))
85
0
                        : static_cast<Layer*>(new PayloadLayer(payload, payloadLen, this, m_Packet));
86
0
      break;
87
0
    case PCPP_BSD_AF_INET6_BSD:
88
0
    case PCPP_BSD_AF_INET6_FREEBSD:
89
0
    case PCPP_BSD_AF_INET6_DARWIN:
90
0
      m_NextLayer = IPv6Layer::isDataValid(payload, payloadLen)
91
0
                        ? static_cast<Layer*>(new IPv6Layer(payload, payloadLen, this, m_Packet))
92
0
                        : static_cast<Layer*>(new PayloadLayer(payload, payloadLen, this, m_Packet));
93
0
      break;
94
0
    default:
95
0
      m_NextLayer = new PayloadLayer(payload, payloadLen, this, m_Packet);
96
0
    }
97
0
  }
98
99
  std::string NullLoopbackLayer::toString() const
100
0
  {
101
0
    return "Null/Loopback";
102
0
  }
103
104
}  // namespace pcpp