Coverage Report

Created: 2025-12-31 07:37

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/PcapPlusPlus/Packet++/src/SllLayer.cpp
Line
Count
Source
1
0
#define LOG_MODULE PacketLogModuleSllLayer
2
3
#include "SllLayer.h"
4
#include "Logger.h"
5
#include "IPv4Layer.h"
6
#include "IPv6Layer.h"
7
#include "PayloadLayer.h"
8
#include "ArpLayer.h"
9
#include "VlanLayer.h"
10
#include "PPPoELayer.h"
11
#include "MplsLayer.h"
12
#include "EndianPortable.h"
13
14
namespace pcpp
15
{
16
17
  SllLayer::SllLayer(uint16_t packetType, uint16_t ARPHRDType)
18
0
  {
19
0
    const size_t headerLen = sizeof(sll_header);
20
0
    m_DataLen = headerLen;
21
0
    m_Data = new uint8_t[headerLen];
22
0
    memset(m_Data, 0, headerLen);
23
0
    auto* sllHdr = reinterpret_cast<sll_header*>(m_Data);
24
0
    sllHdr->packet_type = htobe16(packetType);
25
0
    sllHdr->ARPHRD_type = htobe16(ARPHRDType);
26
0
    m_Protocol = SLL;
27
0
  }
28
29
  bool SllLayer::setLinkLayerAddr(uint8_t* addr, size_t addrLength)
30
0
  {
31
0
    if (addr == nullptr || addrLength == 0 || addrLength > 8)
32
0
    {
33
0
      PCPP_LOG_ERROR("Address length is out of bounds, it must be between 1 and 8");
34
0
      return false;
35
0
    }
36
37
0
    sll_header* sllHdr = getSllHeader();
38
0
    memcpy(sllHdr->link_layer_addr, addr, addrLength);
39
0
    sllHdr->link_layer_addr_len = htobe16(addrLength);
40
41
0
    return true;
42
0
  }
43
44
  bool SllLayer::setMacAddressAsLinkLayer(MacAddress const& macAddr)
45
0
  {
46
0
    uint8_t macAddrAsArr[6];
47
0
    macAddr.copyTo(macAddrAsArr);
48
0
    return setLinkLayerAddr(macAddrAsArr, 6);
49
0
  }
50
51
  void SllLayer::parseNextLayer()
52
130k
  {
53
130k
    if (m_DataLen <= sizeof(sll_header))
54
562
      return;
55
56
130k
    uint8_t* payload = m_Data + sizeof(sll_header);
57
130k
    size_t payloadLen = m_DataLen - sizeof(sll_header);
58
59
130k
    sll_header* hdr = getSllHeader();
60
130k
    switch (be16toh(hdr->protocol_type))
61
130k
    {
62
58.5k
    case PCPP_ETHERTYPE_IP:
63
58.5k
      m_NextLayer = IPv4Layer::isDataValid(payload, payloadLen)
64
58.5k
                        ? static_cast<Layer*>(new IPv4Layer(payload, payloadLen, this, m_Packet))
65
58.5k
                        : static_cast<Layer*>(new PayloadLayer(payload, payloadLen, this, m_Packet));
66
58.5k
      break;
67
66.8k
    case PCPP_ETHERTYPE_IPV6:
68
66.8k
      m_NextLayer = IPv6Layer::isDataValid(payload, payloadLen)
69
66.8k
                        ? static_cast<Layer*>(new IPv6Layer(payload, payloadLen, this, m_Packet))
70
66.8k
                        : static_cast<Layer*>(new PayloadLayer(payload, payloadLen, this, m_Packet));
71
66.8k
      break;
72
68
    case PCPP_ETHERTYPE_ARP:
73
68
      m_NextLayer = new ArpLayer(payload, payloadLen, this, m_Packet);
74
68
      break;
75
305
    case PCPP_ETHERTYPE_VLAN:
76
305
    case PCPP_ETHERTYPE_IEEE_802_1AD:
77
305
      m_NextLayer = new VlanLayer(payload, payloadLen, this, m_Packet);
78
305
      break;
79
0
    case PCPP_ETHERTYPE_PPPOES:
80
0
      m_NextLayer = PPPoESessionLayer::isDataValid(payload, payloadLen)
81
0
                        ? static_cast<Layer*>(new PPPoESessionLayer(payload, payloadLen, this, m_Packet))
82
0
                        : static_cast<Layer*>(new PayloadLayer(payload, payloadLen, this, m_Packet));
83
0
      break;
84
0
    case PCPP_ETHERTYPE_PPPOED:
85
0
      m_NextLayer = PPPoEDiscoveryLayer::isDataValid(payload, payloadLen)
86
0
                        ? static_cast<Layer*>(new PPPoEDiscoveryLayer(payload, payloadLen, this, m_Packet))
87
0
                        : static_cast<Layer*>(new PayloadLayer(payload, payloadLen, this, m_Packet));
88
0
      break;
89
0
    case PCPP_ETHERTYPE_MPLS:
90
0
      m_NextLayer = new MplsLayer(payload, payloadLen, this, m_Packet);
91
0
      break;
92
4.44k
    default:
93
4.44k
      m_NextLayer = new PayloadLayer(payload, payloadLen, this, m_Packet);
94
130k
    }
95
130k
  }
96
97
  void SllLayer::computeCalculateFields()
98
22.3k
  {
99
22.3k
    if (m_NextLayer == nullptr)
100
281
      return;
101
102
22.1k
    sll_header* hdr = getSllHeader();
103
22.1k
    switch (m_NextLayer->getProtocol())
104
22.1k
    {
105
8.73k
    case IPv4:
106
8.73k
      hdr->protocol_type = htobe16(PCPP_ETHERTYPE_IP);
107
8.73k
      break;
108
11.6k
    case IPv6:
109
11.6k
      hdr->protocol_type = htobe16(PCPP_ETHERTYPE_IPV6);
110
11.6k
      break;
111
17
    case ARP:
112
17
      hdr->protocol_type = htobe16(PCPP_ETHERTYPE_ARP);
113
17
      break;
114
53
    case VLAN:
115
53
      hdr->protocol_type = htobe16(PCPP_ETHERTYPE_VLAN);
116
53
      break;
117
1.63k
    default:
118
1.63k
      return;
119
22.1k
    }
120
22.1k
  }
121
122
  std::string SllLayer::toString() const
123
44.7k
  {
124
44.7k
    return "Linux cooked header";
125
44.7k
  }
126
127
}  // namespace pcpp