PcapPlusPlus  Next
ModbusLayer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Layer.h"
4 
7 
10 namespace pcpp
11 {
12 
13 #pragma pack(push, 1)
17  {
19  uint16_t transactionId;
21  uint16_t protocolId;
23  uint16_t length;
25  uint8_t unitId;
27  uint8_t functionCode;
28  };
29 #pragma pack(pop)
30  static_assert(sizeof(modbus_header) == 8, "modbus_header size is not 8 bytes");
31 
34  class ModbusLayer : public Layer
35  {
36  public:
40  enum class ModbusFunctionCode : uint8_t
41  {
43  ReadCoils = 1,
44 
47 
50 
53 
55  WriteSingleCoil = 5,
56 
59 
61  WriteMultipleCoils = 15,
62 
65 
67  ReadSlaveId = 17,
68 
70  UnknownFunction = 0xFF
71  };
72 
76  {
77  uint16_t startingAddress;
78  uint16_t quantity;
79  };
80 
86  ModbusLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
87  : Layer(data, dataLen, prevLayer, packet, Modbus)
88  {}
89 
93  ModbusLayer(uint16_t transactionId, uint8_t unitId);
94 
99  static bool isModbusPort(uint16_t port)
100  {
101  return port == 502;
102  }
103 
105  uint16_t getTransactionId() const;
106 
108  uint16_t getProtocolId() const;
109 
112  uint16_t getLength() const;
113 
115  uint8_t getUnitId() const;
116 
119 
122  void setTransactionId(uint16_t transactionId);
123 
126  void setUnitId(uint8_t unitId);
127 
131 
132  // Overridden methods
133 
135  void parseNextLayer() override
136  {}
137 
140  size_t getHeaderLen() const override
141  {
142  return sizeof(modbus_header);
143  }
144 
146  void computeCalculateFields() override
147  {}
148 
151  std::string toString() const override;
152 
155  {
157  }
158 
159  private:
161  modbus_header* getModbusHeader() const;
162  };
163 
164 } // namespace pcpp
Definition: Layer.h:62
Definition: ModbusLayer.h:35
void setTransactionId(uint16_t transactionId)
set the MODBUS transaction id
ModbusFunctionCode getFunctionCode() const
size_t getHeaderLen() const override
Get the length of the MODBUS header.
Definition: ModbusLayer.h:140
static bool isModbusPort(uint16_t port)
Check if a port is a valid MODBUS port.
Definition: ModbusLayer.h:99
ModbusLayer(uint16_t transactionId, uint8_t unitId)
void computeCalculateFields() override
Does nothing for this layer.
Definition: ModbusLayer.h:146
OsiModelLayer getOsiModelLayer() const override
Definition: ModbusLayer.h:154
void setUnitId(uint8_t unitId)
set the MODBUS header unit id
ModbusLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: ModbusLayer.h:86
uint8_t getUnitId() const
void setFunctionCode(ModbusFunctionCode functionCode)
set the MODBUS header function code
ModbusFunctionCode
Enum class representing Modbus function codes. This enumeration defines the standard Modbus function ...
Definition: ModbusLayer.h:41
@ WriteSingleHoldingRegister
Write a single holding register (0x06)
@ WriteMultipleHoldingRegisters
Write multiple holding registers (0x10)
@ UnknownFunction
Unknown or unsupported function code (0xFF)
@ ReadSlaveId
Report slave ID (0x11)
@ ReadHoldingRegisters
Read holding registers (0x03)
@ WriteSingleCoil
Write a single coil (0x05)
@ ReadDiscreteInputs
Read discrete input status (0x02)
@ ReadCoils
Read coil status (0x01)
@ ReadInputRegisters
Read input registers (0x04)
@ WriteMultipleCoils
Write multiple coils (0x0F)
uint16_t getTransactionId() const
void parseNextLayer() override
Does nothing for this layer (ModbusLayer is always last)
Definition: ModbusLayer.h:135
uint16_t getLength() const
uint16_t getProtocolId() const
std::string toString() const override
Definition: Packet.h:22
const ProtocolType Modbus
Modbus protocol.
Definition: ProtocolType.h:252
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:261
@ OsiModelApplicationLayer
Application layer (layer 7)
Definition: ProtocolType.h:275
uint16_t startingAddress
Starting address of the input registers to read.
Definition: ModbusLayer.h:77
uint16_t quantity
Number of input registers to read.
Definition: ModbusLayer.h:78
Definition: ModbusLayer.h:17
uint16_t length
Number of remaining bytes in this frame starting from the unit id.
Definition: ModbusLayer.h:23
uint16_t protocolId
0 for Modbus/TCP
Definition: ModbusLayer.h:21
uint8_t functionCode
Function code.
Definition: ModbusLayer.h:27
uint8_t unitId
Unit identifier.
Definition: ModbusLayer.h:25
uint16_t transactionId
For synchronization between messages of server and client.
Definition: ModbusLayer.h:19