Coverage Report

Created: 2026-02-26 06:41

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
148k
  {
53
148k
    if (m_DataLen <= sizeof(sll_header))
54
640
      return;
55
56
148k
    uint8_t* payload = m_Data + sizeof(sll_header);
57
148k
    size_t payloadLen = m_DataLen - sizeof(sll_header);
58
59
148k
    sll_header* hdr = getSllHeader();
60
148k
    switch (be16toh(hdr->protocol_type))
61
148k
    {
62
70.8k
    case PCPP_ETHERTYPE_IP:
63
70.8k
    {
64
70.8k
      tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen);
65
70.8k
      break;
66
0
    }
67
67.1k
    case PCPP_ETHERTYPE_IPV6:
68
67.1k
    {
69
67.1k
      tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen);
70
67.1k
      break;
71
0
    }
72
2.16k
    case PCPP_ETHERTYPE_ARP:
73
2.16k
    {
74
2.16k
      constructNextLayer<ArpLayer>(payload, payloadLen);
75
2.16k
      break;
76
0
    }
77
2.04k
    case PCPP_ETHERTYPE_VLAN:
78
2.05k
    case PCPP_ETHERTYPE_IEEE_802_1AD:
79
2.05k
    {
80
2.05k
      constructNextLayer<VlanLayer>(payload, payloadLen);
81
2.05k
      break;
82
2.04k
    }
83
7
    case PCPP_ETHERTYPE_PPPOES:
84
7
    {
85
7
      tryConstructNextLayerWithFallback<PPPoESessionLayer, PayloadLayer>(payload, payloadLen);
86
7
      break;
87
2.04k
    }
88
7
    case PCPP_ETHERTYPE_PPPOED:
89
7
    {
90
7
      tryConstructNextLayerWithFallback<PPPoEDiscoveryLayer, PayloadLayer>(payload, payloadLen);
91
7
      break;
92
2.04k
    }
93
1.17k
    case PCPP_ETHERTYPE_MPLS:
94
1.17k
    {
95
1.17k
      constructNextLayer<MplsLayer>(payload, payloadLen);
96
1.17k
      break;
97
2.04k
    }
98
4.86k
    default:
99
4.86k
    {
100
4.86k
      constructNextLayer<PayloadLayer>(payload, payloadLen);
101
4.86k
      break;
102
2.04k
    }
103
148k
    }
104
148k
  }
105
106
  void SllLayer::computeCalculateFields()
107
26.2k
  {
108
26.2k
    if (m_NextLayer == nullptr)
109
320
      return;
110
111
25.9k
    sll_header* hdr = getSllHeader();
112
25.9k
    switch (m_NextLayer->getProtocol())
113
25.9k
    {
114
11.3k
    case IPv4:
115
11.3k
      hdr->protocol_type = htobe16(PCPP_ETHERTYPE_IP);
116
11.3k
      break;
117
11.8k
    case IPv6:
118
11.8k
      hdr->protocol_type = htobe16(PCPP_ETHERTYPE_IPV6);
119
11.8k
      break;
120
597
    case ARP:
121
597
      hdr->protocol_type = htobe16(PCPP_ETHERTYPE_ARP);
122
597
      break;
123
261
    case VLAN:
124
261
      hdr->protocol_type = htobe16(PCPP_ETHERTYPE_VLAN);
125
261
      break;
126
1.97k
    default:
127
1.97k
      return;
128
25.9k
    }
129
25.9k
  }
130
131
  std::string SllLayer::toString() const
132
52.5k
  {
133
52.5k
    return "Linux cooked header";
134
52.5k
  }
135
136
}  // namespace pcpp