Coverage Report

Created: 2025-07-18 07:14

/src/PcapPlusPlus/Packet++/src/WakeOnLanLayer.cpp
Line
Count
Source (jump to first uncovered line)
1
0
#define LOG_MODULE PacketLogModuleWakeOnLanLayer
2
3
#include "WakeOnLanLayer.h"
4
#include "GeneralUtils.h"
5
#include "Logger.h"
6
7
namespace pcpp
8
{
9
10
  void WakeOnLanLayer::init(uint16_t len)
11
0
  {
12
0
    m_Data = new uint8_t[len];
13
0
    m_DataLen = len;
14
0
    m_Protocol = WakeOnLan;
15
16
0
    memset(getWakeOnLanHeader()->sync, 0xFF, 6);
17
0
  }
18
19
  WakeOnLanLayer::WakeOnLanLayer(const pcpp::MacAddress& targetAddr)
20
0
  {
21
0
    init(sizeof(wol_header));
22
0
    setTargetAddr(targetAddr);
23
0
  }
24
25
  WakeOnLanLayer::WakeOnLanLayer(const pcpp::MacAddress& targetAddr, uint8_t* password, uint8_t len)
26
0
  {
27
0
    init(sizeof(wol_header) + len);
28
0
    setTargetAddr(targetAddr);
29
0
    setPassword(password, len);
30
0
  }
31
32
  WakeOnLanLayer::WakeOnLanLayer(const pcpp::MacAddress& targetAddr, const pcpp::MacAddress& password)
33
0
  {
34
0
    init(sizeof(wol_header) + 6);
35
0
    setTargetAddr(targetAddr);
36
0
    setPassword(password);
37
0
  }
38
39
  WakeOnLanLayer::WakeOnLanLayer(const pcpp::MacAddress& targetAddr, const IPv4Address& password)
40
0
  {
41
0
    init(sizeof(wol_header) + 4);
42
0
    setTargetAddr(targetAddr);
43
0
    setPassword(password);
44
0
  }
45
46
  pcpp::MacAddress WakeOnLanLayer::getTargetAddr() const
47
52
  {
48
52
    return pcpp::MacAddress(getWakeOnLanHeader()->addrBody);
49
52
  }
50
51
  void WakeOnLanLayer::setTargetAddr(const pcpp::MacAddress& targetAddr)
52
0
  {
53
0
    for (size_t idx = 0; idx < 16; ++idx)
54
0
      memcpy(&(getWakeOnLanHeader()->addrBody[idx * 6]), targetAddr.getRawData(), 6);
55
0
  }
56
57
  std::string WakeOnLanLayer::getPassword() const
58
0
  {
59
0
    size_t passSize = m_DataLen - sizeof(wol_header);
60
0
    switch (passSize)
61
0
    {
62
0
    case 0:
63
0
      return std::string();
64
0
    case 4:
65
0
      return IPv4Address(&m_Data[sizeof(wol_header)]).toString();
66
0
    case 6:
67
0
      return MacAddress(&m_Data[sizeof(wol_header)]).toString();
68
0
    default:
69
0
      return byteArrayToHexString(&m_Data[sizeof(wol_header)], passSize);
70
0
    }
71
0
  }
72
73
  bool WakeOnLanLayer::setPassword(const uint8_t* password, uint8_t len)
74
0
  {
75
0
    if (len)
76
0
    {
77
0
      if (m_DataLen > sizeof(wol_header) + len)
78
0
      {
79
0
        if (!shortenLayer(sizeof(wol_header), m_DataLen - (sizeof(wol_header) + len)))
80
0
        {
81
0
          PCPP_LOG_ERROR("Can't shorten Wake on LAN layer");
82
0
          return false;
83
0
        }
84
0
      }
85
0
      else if (m_DataLen < sizeof(wol_header) + len)
86
0
      {
87
0
        if (!extendLayer(m_DataLen, (sizeof(wol_header) + len) - m_DataLen))
88
0
        {
89
0
          PCPP_LOG_ERROR("Can't extend Wake on LAN layer");
90
0
          return false;
91
0
        }
92
0
      }
93
0
      memcpy(&m_Data[sizeof(wol_header)], password, len);
94
0
    }
95
96
0
    return true;
97
0
  }
98
99
  bool WakeOnLanLayer::setPassword(const std::string& password)
100
0
  {
101
0
    return setPassword(reinterpret_cast<const uint8_t*>(password.c_str()), password.size());
102
0
  }
103
104
  bool WakeOnLanLayer::setPassword(const MacAddress& addr)
105
0
  {
106
0
    return setPassword(addr.getRawData(), 6);
107
0
  }
108
109
  bool WakeOnLanLayer::setPassword(const IPv4Address& addr)
110
0
  {
111
0
    return setPassword(addr.toBytes(), 4);
112
0
  }
113
114
  bool WakeOnLanLayer::isDataValid(const uint8_t* data, size_t dataSize)
115
1.03k
  {
116
1.03k
    if (data && dataSize >= sizeof(wol_header))
117
673
    {
118
      // It should repeat same MAC address at the payload 16 times
119
673
      pcpp::MacAddress bufAddr(&data[6]);
120
6.03k
      for (size_t idx = 1; idx < 16; ++idx)
121
5.90k
      {
122
5.90k
        if (bufAddr != pcpp::MacAddress(&data[6 + idx * 6]))
123
543
          return false;
124
5.90k
      }
125
130
      return true;
126
673
    }
127
363
    return false;
128
1.03k
  }
129
130
  std::string WakeOnLanLayer::toString() const
131
52
  {
132
52
    return "Wake On LAN Layer, target address: " + getTargetAddr().toString();
133
52
  }
134
135
}  // namespace pcpp