Coverage Report

Created: 2026-08-13 07:36

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/PcapPlusPlus/Packet++/src/S7CommLayer.cpp
Line
Count
Source
1
#include "EndianPortable.h"
2
3
#include "S7CommLayer.h"
4
#include <iostream>
5
#include <cstring>
6
#include <sstream>
7
8
namespace pcpp
9
{
10
11
  S7CommLayer::S7CommLayer(uint8_t msgType, uint16_t pduRef, uint16_t paramLength, uint16_t dataLength,
12
                           uint8_t errorClass, uint8_t errorCode)
13
0
  {
14
0
    size_t basicHeaderLen = msgType == 0x03 ? sizeof(s7comm_ack_data_hdr) : sizeof(s7commhdr);
15
0
    size_t headerLen = basicHeaderLen + paramLength + dataLength;
16
0
    allocData(headerLen);
17
18
0
    if (msgType == 0x03)
19
0
    {
20
0
      auto* ack_d = reinterpret_cast<s7comm_ack_data_hdr*>(m_Data);
21
0
      ack_d->protocolId = 0x32;
22
0
      ack_d->msgType = msgType;
23
0
      ack_d->reserved = 0x0000;
24
0
      ack_d->pduRef = htobe16(pduRef);
25
0
      ack_d->paramLength = htobe16(paramLength);
26
0
      ack_d->dataLength = htobe16(dataLength);
27
0
      ack_d->errorClass = errorClass;
28
0
      ack_d->errorCode = errorCode;
29
0
    }
30
0
    else
31
0
    {
32
0
      auto* s7commHdr = reinterpret_cast<s7commhdr*>(m_Data);
33
0
      s7commHdr->protocolId = 0x32;
34
0
      s7commHdr->msgType = msgType;
35
0
      s7commHdr->reserved = 0x0000;
36
0
      s7commHdr->pduRef = htobe16(pduRef);
37
0
      s7commHdr->paramLength = htobe16(paramLength);
38
0
      s7commHdr->dataLength = htobe16(dataLength);
39
0
    }
40
41
0
    m_Parameter = nullptr;
42
0
    m_Protocol = S7COMM;
43
0
  }
44
45
  std::string S7CommLayer::toString() const
46
2.79k
  {
47
2.79k
    std::ostringstream str;
48
2.79k
    str << "S7Comm Layer, ";
49
50
2.79k
    switch (getS7commHeader()->msgType)
51
2.79k
    {
52
1.13k
    case 0x01:
53
1.13k
      str << "Job Request";
54
1.13k
      break;
55
4
    case 0x02:
56
4
      str << "Ack";
57
4
      break;
58
858
    case 0x03:
59
858
      str << "Ack-Data";
60
858
      break;
61
656
    case 0x07:
62
656
      str << "Userdata";
63
656
      break;
64
134
    default:
65
134
      str << "Unknown message";
66
2.79k
    }
67
68
2.79k
    return str.str();
69
2.79k
  }
70
71
  bool S7CommLayer::isDataValid(const uint8_t* data, size_t dataSize)
72
10.9k
  {
73
10.9k
    if (!data || dataSize < sizeof(s7commhdr))
74
160
      return false;
75
76
10.7k
    return data[0] == 0x32;
77
10.9k
  }
78
79
  uint8_t S7CommLayer::getProtocolId() const
80
0
  {
81
0
    return getS7commHeader()->protocolId;
82
0
  }
83
84
  uint8_t S7CommLayer::getMsgType() const
85
0
  {
86
0
    return getS7commHeader()->msgType;
87
0
  }
88
89
  uint16_t S7CommLayer::getParamLength() const
90
0
  {
91
0
    return be16toh(getS7commHeader()->paramLength);
92
0
  }
93
94
  uint16_t S7CommLayer::getPduRef() const
95
0
  {
96
0
    return be16toh(getS7commHeader()->pduRef);
97
0
  }
98
99
  uint16_t S7CommLayer::getDataLength() const
100
0
  {
101
0
    return be16toh(getS7commHeader()->dataLength);
102
0
  }
103
104
  void S7CommLayer::setMsgType(uint8_t msgType) const
105
0
  {
106
0
    getS7commHeader()->msgType = msgType;
107
0
  }
108
109
  uint8_t S7CommLayer::getErrorCode() const
110
0
  {
111
0
    return getS7commAckDataHeader()->errorCode;
112
0
  }
113
114
  uint8_t S7CommLayer::getErrorClass() const
115
0
  {
116
0
    return getS7commAckDataHeader()->errorClass;
117
0
  }
118
119
  void S7CommLayer::setPduRef(uint16_t pduRef) const
120
0
  {
121
0
    getS7commHeader()->pduRef = htobe16(pduRef);
122
0
  }
123
124
  void S7CommLayer::setErrorCode(uint8_t errorCode) const
125
0
  {
126
0
    getS7commAckDataHeader()->errorCode = errorCode;
127
0
  }
128
129
  void S7CommLayer::setErrorClass(uint8_t errorClass) const
130
0
  {
131
0
    getS7commAckDataHeader()->errorClass = errorClass;
132
0
  }
133
134
  const S7CommParameter* S7CommLayer::getParameter()
135
0
  {
136
0
    if (!m_Parameter)
137
0
    {
138
0
      uint8_t* payload = m_Data + getS7commHeaderLength();
139
0
      m_Parameter = new S7CommParameter(payload, getParamLength());
140
0
    }
141
142
0
    return m_Parameter;
143
0
  }
144
145
  size_t S7CommLayer::getS7commHeaderLength() const
146
0
  {
147
0
    if (getS7commHeader()->msgType == 0x03)
148
0
    {
149
0
      return sizeof(s7comm_ack_data_hdr);
150
0
    }
151
0
    return sizeof(s7commhdr);
152
0
  }
153
154
}  // namespace pcpp