Coverage Report

Created: 2026-08-13 07:36

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
    allocData(sizeof(sll_header));
20
21
0
    auto* sllHdr = reinterpret_cast<sll_header*>(m_Data);
22
0
    sllHdr->packet_type = htobe16(packetType);
23
0
    sllHdr->ARPHRD_type = htobe16(ARPHRDType);
24
0
    m_Protocol = SLL;
25
0
  }
26
27
  bool SllLayer::setLinkLayerAddr(uint8_t* addr, size_t addrLength)
28
0
  {
29
0
    if (addr == nullptr || addrLength == 0 || addrLength > 8)
30
0
    {
31
0
      PCPP_LOG_ERROR("Address length is out of bounds, it must be between 1 and 8");
32
0
      return false;
33
0
    }
34
35
0
    sll_header* sllHdr = getSllHeader();
36
0
    memcpy(sllHdr->link_layer_addr, addr, addrLength);
37
0
    sllHdr->link_layer_addr_len = htobe16(addrLength);
38
39
0
    return true;
40
0
  }
41
42
  bool SllLayer::setMacAddressAsLinkLayer(MacAddress const& macAddr)
43
0
  {
44
0
    uint8_t macAddrAsArr[6];
45
0
    macAddr.copyTo(macAddrAsArr);
46
0
    return setLinkLayerAddr(macAddrAsArr, 6);
47
0
  }
48
49
  void SllLayer::parseNextLayer()
50
134k
  {
51
134k
    if (m_DataLen <= sizeof(sll_header))
52
256
      return;
53
54
134k
    uint8_t* payload = m_Data + sizeof(sll_header);
55
134k
    size_t payloadLen = m_DataLen - sizeof(sll_header);
56
57
134k
    sll_header* hdr = getSllHeader();
58
134k
    switch (be16toh(hdr->protocol_type))
59
134k
    {
60
51.6k
    case PCPP_ETHERTYPE_IP:
61
51.6k
    {
62
51.6k
      tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen);
63
51.6k
      break;
64
0
    }
65
77.2k
    case PCPP_ETHERTYPE_IPV6:
66
77.2k
    {
67
77.2k
      tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen);
68
77.2k
      break;
69
0
    }
70
0
    case PCPP_ETHERTYPE_ARP:
71
0
    {
72
0
      constructNextLayer<ArpLayer>(payload, payloadLen);
73
0
      break;
74
0
    }
75
3.15k
    case PCPP_ETHERTYPE_VLAN:
76
3.15k
    case PCPP_ETHERTYPE_IEEE_802_1AD:
77
3.15k
    {
78
3.15k
      constructNextLayer<VlanLayer>(payload, payloadLen);
79
3.15k
      break;
80
3.15k
    }
81
0
    case PCPP_ETHERTYPE_PPPOES:
82
0
    {
83
0
      tryConstructNextLayerWithFallback<PPPoESessionLayer, PayloadLayer>(payload, payloadLen);
84
0
      break;
85
3.15k
    }
86
0
    case PCPP_ETHERTYPE_PPPOED:
87
0
    {
88
0
      tryConstructNextLayerWithFallback<PPPoEDiscoveryLayer, PayloadLayer>(payload, payloadLen);
89
0
      break;
90
3.15k
    }
91
0
    case PCPP_ETHERTYPE_MPLS:
92
0
    {
93
0
      constructNextLayer<MplsLayer>(payload, payloadLen);
94
0
      break;
95
3.15k
    }
96
2.27k
    default:
97
2.27k
    {
98
2.27k
      constructNextLayer<PayloadLayer>(payload, payloadLen);
99
2.27k
      break;
100
3.15k
    }
101
134k
    }
102
134k
  }
103
104
  void SllLayer::computeCalculateFields()
105
22.3k
  {
106
22.3k
    if (m_NextLayer == nullptr)
107
128
      return;
108
109
22.2k
    sll_header* hdr = getSllHeader();
110
22.2k
    switch (m_NextLayer->getProtocol())
111
22.2k
    {
112
7.42k
    case IPv4:
113
7.42k
      hdr->protocol_type = htobe16(PCPP_ETHERTYPE_IP);
114
7.42k
      break;
115
13.4k
    case IPv6:
116
13.4k
      hdr->protocol_type = htobe16(PCPP_ETHERTYPE_IPV6);
117
13.4k
      break;
118
0
    case ARP:
119
0
      hdr->protocol_type = htobe16(PCPP_ETHERTYPE_ARP);
120
0
      break;
121
567
    case VLAN:
122
567
      hdr->protocol_type = htobe16(PCPP_ETHERTYPE_VLAN);
123
567
      break;
124
763
    default:
125
763
      return;
126
22.2k
    }
127
22.2k
  }
128
129
  std::string SllLayer::toString() const
130
44.7k
  {
131
44.7k
    return "Linux cooked header";
132
44.7k
  }
133
134
}  // namespace pcpp