1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
|
/* packet-pn.h
* Common functions for other PROFINET protocols like DCP, MRP, ...
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1999 Gerald Combs
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
/*
* Cyclic PNIO RTC1 Data Dissection:
*
* Added new structures to packet-pn.h to transfer the gained data of
* packet-pn-dcp.c and packet-dcerpc-pn-io.c to packet-pn-rtc-one.c for
* detailled dissection of cyclic PNIO RTC1 dataframes.
*
*/
#define FRAME_ID_DCP_HELLO 0xfefc
#define FRAME_ID_DCP_GETORSET 0xfefd
#define FRAME_ID_DCP_IDENT_REQ 0xfefe
#define FRAME_ID_DCP_IDENT_RES 0xfeff
/* ---- Structures for pnio_rtc1 ---- */
extern int proto_pn_dcp;
extern int proto_pn_io_apdu_status;
extern int proto_pn_io_time_aware_status;
extern gboolean pnio_ps_selection; /* given by pnio preferences */
/* Structure for general station information */
typedef struct tagStationInfo {
/* general information */
gchar *typeofstation;
gchar *nameofstation;
guint16 u16Vendor_id;
guint16 u16Device_id;
/* frame structure */
guint16 ioDataObjectNr_in;
guint16 ioDataObjectNr_out;
guint16 iocsNr_in;
guint16 iocsNr_out;
/* GSDfile station information */
gboolean gsdFound;
gboolean gsdPathLength;
gchar *gsdLocation;
/* IOCS object data */
wmem_list_t *iocs_data_in;
wmem_list_t *iocs_data_out;
/* IOData object data */
wmem_list_t *ioobject_data_in;
wmem_list_t *ioobject_data_out;
/* Different ModuleIdentnumber */
wmem_list_t *diff_module;
} stationInfo;
typedef struct tagApduStatusSwitch
{
gboolean isRedundancyActive;
address dl_dst;
address dl_src;
}apduStatusSwitch;
/* Structure for IOCS Frames */
typedef struct tagIocsObject {
guint16 slotNr;
guint16 subSlotNr;
guint16 frameOffset;
} iocsObject;
/* Structure for IO Data Objects */
typedef struct tagIoDataObject {
guint16 slotNr;
guint16 subSlotNr;
guint32 api;
guint32 moduleIdentNr;
guint32 subModuleIdentNr;
guint16 frameOffset;
guint16 length;
guint16 amountInGSDML;
guint32 fParameterIndexNr;
guint16 f_par_crc1;
guint16 f_src_adr;
guint16 f_dest_adr;
gboolean f_crc_seed;
guint8 f_crc_len;
address srcAddr;
address dstAddr;
gboolean profisafeSupported;
gboolean discardIOXS;
gchar *moduleNameStr;
tvbuff_t *tvb_slot;
tvbuff_t *tvb_subslot;
/* Status- or Controlbyte data*/
guint8 last_sb_cb;
guint8 lastToggleBit;
} ioDataObject;
/* Structure for Modules with different ModuleIdentnumber */
typedef struct tagModuleDiffInfo {
guint16 slotNr;
guint32 modulID;
} moduleDiffInfo;
typedef struct tagARUUIDFrame {
e_guid_t aruuid;
guint32 setupframe;
guint32 releaseframe;
guint16 outputframe;
guint16 inputframe;
} ARUUIDFrame;
extern wmem_list_t *aruuid_frame_setup_list;
extern void init_pn(int proto);
extern void init_pn_io_rtc1(int proto);
extern void init_pn_rsi(int proto);
extern void pn_rsi_reassemble_init(void);
extern void init_pnio_rtc1_station(stationInfo *station_info);
extern int dissect_pn_uint8(tvbuff_t *tvb, gint offset, packet_info *pinfo,
proto_tree *tree, int hfindex, guint8 *pdata);
extern int dissect_pn_uint16_ret_item(tvbuff_t *tvb, gint offset, packet_info *pinfo _U_,
proto_tree *tree, int hfindex, guint16 *pdata, proto_item ** new_item);
extern int dissect_pn_uint16(tvbuff_t *tvb, gint offset, packet_info *pinfo,
proto_tree *tree, int hfindex, guint16 *pdata);
extern int dissect_pn_int16(tvbuff_t *tvb, gint offset, packet_info *pinfo,
proto_tree *tree, int hfindex, gint16 *pdata);
extern int dissect_pn_oid(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, int hfindex, guint32 *pdata);
extern int dissect_pn_mac(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, int hfindex, guint8 *pdata);
extern int dissect_pn_ipv4(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, int hfindex, guint32 *pdata);
extern int dissect_pn_uuid(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, int hfindex, e_guid_t *uuid);
extern int dissect_pn_undecoded(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, guint32 length);
extern int dissect_pn_user_data(tvbuff_t *tvb, int offset, packet_info *pinfo _U_,
proto_tree *tree, guint32 length, const char *text);
extern int dissect_pn_pa_profile_data(tvbuff_t *tvb, int offset, packet_info *pinfo _U_,
proto_tree *tree, guint32 length, const char *text);
extern int dissect_blocks(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep);
#define PDU_TYPE_REQ 0x05
#define PDU_TYPE_RSP 0x06
extern int dissect_rsi_blocks(tvbuff_t* tvb, int offset, packet_info* pinfo, proto_tree* tree, guint8* drep, guint32 u32FOpnumOffsetOpnum, int type);
#define SUBST_DATA 1
#define FRAG_DATA 2
extern int dissect_pn_user_data_bytes(tvbuff_t *tvb, int offset, packet_info *pinfo _U_,
proto_tree *tree, guint32 length, int iSelect);
extern int dissect_pn_malformed(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, guint32 length);
extern int dissect_pn_padding(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, int length);
extern int dissect_pn_align4(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree);
extern int dissect_PNIO_status(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, guint8 *drep);
extern int dissect_PNIO_C_SDU_RTC1(tvbuff_t* tvb, int offset, packet_info* pinfo,
proto_tree* tree, guint8* drep _U_, guint16 frameid);
extern int dissect_PNIO_RSI(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, guint8 *drep);
extern int dissect_PDRsiInstances_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep, guint8 u8BlockVersionHigh, guint8 u8BlockVersionLow);
extern void pn_append_info(packet_info *pinfo, proto_item *dcp_item, const char *text);
extern void pn_init_append_aruuid_frame_setup_list(e_guid_t aruuid, guint32 setup);
extern ARUUIDFrame* pn_find_aruuid_frame_setup(packet_info* pinfo);
extern void pn_find_dcp_station_info(stationInfo* station_info, conversation_t* conversation);
extern gboolean dissect_CSF_SDU_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data);
#define MAX_LINE_LENGTH 1024 /* used for fgets() */
/* Read a string from an "xml" file, dropping xml comment blocks */
#include <stdio.h>
extern char *pn_fgets(char *str, int n, FILE *stream, wmem_allocator_t *scope);
|