/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 |