5 * Copyright (c) 2007 by Beckhoff Automation GmbH
7 * Wireshark - Network traffic analyzer
8 * By Gerald Combs <gerald@wireshark.org>
9 * Copyright 1998 Gerald Combs
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25 #ifndef _PACKET_ECATMAILBOX_H_
26 #define _PACKET_ECATMAILBOX_H_
28 /* Ensure the same data layout for all platforms */
30 typedef struct TETHERNET_ADDRESS
33 } ETHERNET_ADDRESS
, *PETHERNET_ADDRESS
;
34 #define ETHERNET_ADDRESS_LEN ((int) sizeof(ETHERNET_ADDRESS))
37 #define ETHERCAT_MBOX_TYPE_ADS 1 /* AMS/ADS header follows*/
38 #define ETHERCAT_MBOX_TYPE_EOE 2 /* ETHERCAT_EOE_HEADER follows*/
39 #define ETHERCAT_MBOX_TYPE_COE 3 /* ETHERCAT_COE_HEADER follows*/
40 #define ETHERCAT_MBOX_TYPE_FOE 4 /* ETHERCAT_FOE_HEADER follows*/
41 #define ETHERCAT_MBOX_TYPE_SOE 5 /* ETHERCAT_SOE_HEADER follows*/
43 typedef union tMbxHeaderControlUnion
48 guint16 Channel
: 6; /* optional communication channels (default = 0)*/
49 guint16 Priority
: 2; /* optional communication priority (default = 0)*/
50 guint16 Type
: 4; /* TETHERCAT_MBOX_TYPE_xxx*/
51 guint16 Counter
: 3; /* 0 = counter not used (old version)*/
52 guint16 Unsupported
: 1; /* unsupported protocol detected*/
54 } MbxHeaderControlUnion
;
56 typedef struct TETHERCAT_MBOX_HEADER
58 guint16 Length
; /* following bytes*/
59 guint16 Address
; /* S->M: phys addr of destination; M->S: phys addr of source; 0 = master*/
60 MbxHeaderControlUnion aControlUnion
;
61 } ETHERCAT_MBOX_HEADER
, *PETHERCAT_MBOX_HEADER
;
63 #define ETHERCAT_MBOX_HEADER_LEN ((int) sizeof(ETHERCAT_MBOX_HEADER))
65 /*/////////////////////////////////////////////////////////////////////////////*/
67 #define ETHERNET_FRAMENO_MASK 0x0000000F
69 #define EOE_TYPE_FRAME_FRAG 0 /* ETHERCAT_EOE_HEADER followed by frame fragment (ETHERCAT_EOE_TIMESTAMP may included) */
70 #define EOE_TYPE_TIMESTAMP_RES 1 /* ETHERCAT_EOE_HEADER followed by ETHERCAT_EOE_TIMESTAMP */
71 #define EOE_TYPE_INIT_REQ 2 /* ETHERCAT_EOE_HEADER followed by ETHERCAT_EOE_INIT */
72 #define EOE_TYPE_INIT_RES 3 /* ETHERCAT_EOE_HEADER */
73 #define EOE_TYPE_MACFILTER_REQ 4 /* ETHERCAT_EOE_HEADER followed by ETHERCAT_EOE_MACFILTER */
74 #define EOE_TYPE_MACFILTER_RES 5 /* ETHERCAT_EOE_HEADER */
76 #define EOE_RESULT_NOERROR 0x0000
77 #define EOE_RESULT_UNSPECIFIED_ERROR 0x0001
78 #define EOE_RESULT_UNSUPPORTED_TYPE 0x0002
79 #define EOE_RESULT_NO_IP_SUPPORT 0x0201
80 #define EOE_RESULT_NO_MACFILTERMASK_SUPPORT 0x0401
83 /*typedef struct TETHERCAT_EOE_INIT
85 guint32 ContainsMacAddr :1;
86 guint32 ContainsIpAddr :1;
87 guint32 ContainsSubnetMask :1;
88 guint32 ContainsDefaultGateway :1;
89 guint32 ContainsDnsServer :1;
90 guint32 ContainsDnsName :1;
92 ETHERNET_ADDRESS MacAddr;
95 guint32 DefaultGateway;
98 } ETHERCAT_EOE_INIT, *PETHERCAT_EOE_INIT;*/
99 #define ETHERCAT_EOE_INIT_LEN 58 /*sizeof(ETHERCAT_EOE_INIT)*/
101 typedef union tEoeMacFilterOptionsUnion
105 guint16 MacFilterCount
:4;
106 guint16 MacFilterMaskCount
:2;
107 guint16 Reserved1
:1;
108 guint16 NoBroadcasts
:1;
109 guint16 Reserved2
:8;
112 } EoeMacFilterOptionsUnion
;
115 typedef struct TETHERCAT_EOE_MACFILTER
117 EoeMacFilterOptionsUnion anEoeMacFilterOptionsUnion
;
118 ETHERNET_ADDRESS MacFilter
[16];
119 ETHERNET_ADDRESS MacFilterMask
[4];
120 } ETHERCAT_EOE_MACFILTER
;
121 #define ETHERCAT_EOE_MACFILTER_LEN ((int) sizeof(ETHERCAT_EOE_MACFILTER))
123 typedef struct TETHERCAT_EOE_TIMESTAMP
125 guint32 TimeStamp
; /* 32 bit time stamp */
126 } ETHERCAT_EOE_TIMESTAMP
;
127 #define ETHERCAT_EOE_TIMESTAMP_LEN ((int) sizeof(ETHERCAT_EOE_TIMESTAMP))
129 typedef union tEoeHeaderDataUnion
132 { /* EOE_TYPE_FRAME_FRAG and EOE_TYPE_TIMESTAMP_RES only */
133 guint16 Fragment
: 6; /* fragment number (EOE_TYPE_FRAME_FRAG only) */
134 guint16 OffsetBuffer
: 6; /* byte offset multiplied by 32 (if Fragment != 0) (EOE_TYPE_FRAME_FRAG only) */
135 /* buffer size multiplied by 32 (if Fragment == 0) (EOE_TYPE_FRAME_FRAG only) */
136 guint16 FrameNo
: 4; /* frame number (EOE_TYPE_FRAME_FRAG and EOE_TYPE_TIMESTAMP_RES only) */
138 guint16 Result
; /* EOE_TYPE_INIT_RES and EOE_TYPE_MACFILTER_RES only */
139 } EoeHeaderDataUnion
;
141 typedef union tEoeHeaderInfoUnion
145 guint16 Type
: 4; /* specifies following data */
146 guint16 PortAssign
: 4; /* 0 = unspecified, 1 = port 1 */
147 guint16 LastFragment
: 1; /* TRUE if last fragment (EOE_TYPE_FRAME_FRAG only) */
148 guint16 TimeStampAppended
: 1; /* 32 bit time stamp appended (EOE_TYPE_FRAME_FRAG with LastFragment=1 only) */
149 guint16 TimeStampRequested
: 1; /* time stamp response requested (EOE_TYPE_FRAME_FRAG only) */
150 guint16 Reserved
: 5;
153 } EoeHeaderInfoUnion
;
155 typedef struct TETHERCAT_EOE_HEADER
157 EoeHeaderInfoUnion anEoeHeaderInfoUnion
;
158 EoeHeaderDataUnion anEoeHeaderDataUnion
;
159 } ETHERCAT_EOE_HEADER
, *PETHERCAT_EOE_HEADER
;
160 #define ETHERCAT_EOE_HEADER_LEN ((int) sizeof(ETHERCAT_EOE_HEADER))
162 /*/////////////////////////////////////////////////////////////////////////////*/
164 #define ETHERCAT_COE_TYPE_EMERGENCY 1
165 #define ETHERCAT_COE_TYPE_SDOREQ 2
166 #define ETHERCAT_COE_TYPE_SDORES 3
167 #define ETHERCAT_COE_TYPE_TXPDO 4
168 #define ETHERCAT_COE_TYPE_RXPDO 5
169 #define ETHERCAT_COE_TYPE_TXPDO_RTR 6 /* Remote transmission request of TXPDO (master requested)*/
170 #define ETHERCAT_COE_TYPE_RXPDO_RTR 7 /* Remote transmission request of RXPDO (slave requested) */
171 #define ETHERCAT_COE_TYPE_SDOINFO 8
173 typedef union TETHERCAT_COE_HEADER
177 guint16 Number
: 9; /* e.g. PDO number*/
178 guint16 Reserved
: 3; /* = 0*/
179 guint16 Type
: 4; /* CANopen type*/
182 } ETHERCAT_COE_HEADER
, *PETHERCAT_COE_HEADER
;
183 #define ETHERCAT_COE_HEADER_LEN ((int) sizeof(ETHERCAT_COE_HEADER))
186 typedef union tSdoHeaderUnion
189 { /* Initiate Download Request*/
191 guint8 Expedited
: 1;
194 guint8 Ccs
: 3; /* = 1*/
197 { /* Initiate Download Response*/
199 guint8 Scs
: 3; /* = 3*/
202 { /* Download Segment Request*/
206 guint8 Ccs
: 3; /* = 0*/
209 { /* Download Segment Response*/
212 guint8 Scs
: 3; /* = 1*/
215 { /* Initiate Upload Request*/
218 guint8 Ccs
: 3; /* = 2*/
221 { /* Initiate Upload Response*/
223 guint8 Expedited
: 1;
226 guint8 Scs
: 3; /* = 2*/
229 { /* Upload Segment Request*/
232 guint8 Ccs
: 3; /* = 3*/
235 { /* Upload Segment Response*/
239 guint8 Scs
: 3; /* = 0*/
242 { /* Abort Transfer*/
244 guint8 Ccs
: 3; /* = 4*/
249 typedef struct TETHERCAT_SDO_HEADER
251 SdoHeaderUnion anSdoHeaderUnion
;
256 } ETHERCAT_SDO_HEADER
, *PETHERCAT_SDO_HEADER
;
258 #define ETHERCAT_SDO_HEADER_LEN 8 /* sizeof(ETHERCAT_SDO_HEADER)*/
260 #define SDO_CCS_DOWNLOAD_SEGMENT 0
261 #define SDO_CCS_INITIATE_DOWNLOAD 1
262 #define SDO_CCS_INITIATE_UPLOAD 2
263 #define SDO_CCS_UPLOAD_SEGMENT 3
264 #define SDO_CCS_ABORT_TRANSFER 4
266 #define SDO_SCS_UPLOAD_SEGMENT 0
267 #define SDO_SCS_DOWNLOAD_SEGMENT 1
268 #define SDO_SCS_INITIATE_UPLOAD 2
269 #define SDO_SCS_INITIATE_DOWNLOAD 3
271 /* CoE SDO Information */
272 #define ECAT_COE_INFO_OPCODE_LIST_Q 1
273 #define ECAT_COE_INFO_OPCODE_LIST_S 2
274 #define ECAT_COE_INFO_OPCODE_OBJ_Q 3
275 #define ECAT_COE_INFO_OPCODE_OBJ_S 4
276 #define ECAT_COE_INFO_OPCODE_ENTRY_Q 5
277 #define ECAT_COE_INFO_OPCODE_ENTRY_S 6
278 #define ECAT_COE_INFO_OPCODE_ERROR_S 7
280 #define ECAT_COE_INFO_LIST_TYPE_LENGTH 0
281 #define ECAT_COE_INFO_LIST_TYPE_ALL 1
282 #define ECAT_COE_INFO_LIST_TYPE_PDOMAP 2
283 #define ECAT_COE_INFO_LIST_TYPE_BACKUP 3
285 #define ECAT_COE_INFO_OBJCODE_NULL 0
286 #define ECAT_COE_INFO_OBJCODE_DOMAIN 2
287 #define ECAT_COE_INFO_OBJCODE_DEFTYPE 5
288 #define ECAT_COE_INFO_OBJCODE_DEFSTRUCT 6
289 #define ECAT_COE_INFO_OBJCODE_VAR 7
290 #define ECAT_COE_INFO_OBJCODE_ARRAY 8
291 #define ECAT_COE_INFO_OBJCODE_RECORD 9
293 #define ECAT_COE_INFO_OBJCAT_OPTIONAL 0
294 #define ECAT_COE_INFO_OBJCAT_MANDATORY 1
296 #define ECAT_COE_INFO_OBJACCESS_RO 0x07
297 #define ECAT_COE_INFO_OBJACCESS_RW 0x3f
299 typedef struct TETHERCAT_SDO_INFO_LIST
301 guint16 ListType
; /* == SDO_INFO_LIST_TYPE_XXX */
306 } ETHERCAT_SDO_INFO_LIST
;
308 typedef struct TETHERCAT_SDO_INFO_OBJ
313 guint16 DataType
; /* refer to data type index */
314 guint8 MaxSubIndex
; /* max subIndex */
315 guint8 ObjCode
; /* defined in DS 301 (Table 37)*/
316 char Name
[1]; /* rest of mailbox data*/
318 } ETHERCAT_SDO_INFO_OBJ
;
320 typedef struct TETHERCAT_SDO_INFO_ENTRY
324 guint8 ValueInfo
; /* bit0 = ObjAccess, bit1 = ObjCategory, bit2 = PdoMapping, bit3 = UnitType
325 bit4 = DefaultValue, bit5 = MinValue, bit6 = MaxValue*/
328 guint16 DataType
; /* refer to data type index */
330 guint16 ObjAccess
; /* bit0 = read; bit1 = write; bit2 = const. bit3 = 'PRE-OP'; bit4 = 'SAFE-OP'; bit5 = 'OP'.*/
332 } ETHERCAT_SDO_INFO_ENTRY
;
334 typedef struct TETHERCAT_SDO_INFO_ERROR
337 char ErrorText
[1]; /* rest of mailbox data */
338 } ETHERCAT_SDO_INFO_ERROR
;
340 typedef union tSdoInfoUnion
342 ETHERCAT_SDO_INFO_LIST List
;
343 ETHERCAT_SDO_INFO_OBJ Obj
;
344 ETHERCAT_SDO_INFO_ENTRY Entry
;
345 ETHERCAT_SDO_INFO_ERROR Error
;
349 typedef union tSdoControlUnion
353 guint8 OpCode
: 7; /* == SDO_INFO_TYPE_XXX */
354 guint8 InComplete
: 1;
359 typedef struct TETHERCAT_SDO_INFO_HEADER
361 SdoControlUnion anSdoControlUnion
;
362 guint8 Reserved
; /* == 0 */
363 guint16 FragmentsLeft
;
364 SdoInfoUnion anSdoInfoUnion
;
365 } ETHERCAT_SDO_INFO_HEADER
, *PETHERCAT_SDO_INFO_HEADER
;
367 #define ETHERCAT_SDO_INFO_LISTREQ_LEN 6 /*offsetof(ETHERCAT_SDO_INFO_HEADER, anSdoInfoUnion.List.Res)*/
369 /* FoE (File Access over EtherCAT)*/
370 #define ECAT_FOE_OPMODE_RRQ 1
371 #define ECAT_FOE_OPMODE_WRQ 2
372 #define ECAT_FOE_OPMODE_DATA 3
373 #define ECAT_FOE_OPMODE_ACK 4
374 #define ECAT_FOE_OPMODE_ERR 5
375 #define ECAT_FOE_OPMODE_BUSY 6
377 #define ECAT_FOE_ERRCODE_NOTDEFINED 0
378 #define ECAT_FOE_ERRCODE_NOTFOUND 1
379 #define ECAT_FOE_ERRCODE_ACCESS 2
380 #define ECAT_FOE_ERRCODE_DISKFULL 3
381 #define ECAT_FOE_ERRCODE_ILLEAGAL 4
382 #define ECAT_FOE_ERRCODE_PACKENO 5
383 #define ECAT_FOE_ERRCODE_EXISTS 6
384 #define ECAT_FOE_ERRCODE_NOUSER 7
385 #define ECAT_FOE_ERRCODE_BOOTSTRAPONLY 8
386 #define ECAT_FOE_ERRCODE_NOTINBOOTSTRAP 9
388 typedef union tFoeHeaderDataUnion
390 guint32 FileLength
; /* (RRQ, WRQ) = 0 if unknown */
393 guint16 PacketNo
; /* (DATA, ACK)*/
394 guint16 Reserved2
; /* (DATA, ACK)*/
396 guint32 ErrorCode
; /* (ERR)*/
399 guint16 Done
; /* (BUSY)*/
400 guint16 Entire
; /* (BUSY)*/
402 } FoeHeaderDataUnion
;
404 typedef struct TETHERCAT_FOE_HEADER
406 guint8 OpMode
; /* = 1 (RRQ), = 2 (WRQ), = 3 (DATA), = 4 (ACK), = 5 (ERR), = 6 (BUSY) */
407 guint8 Reserved1
; /* = 0 */
409 FoeHeaderDataUnion aFoeHeaderDataUnion
;
410 /* typedef union tMailBoxDataUnion
412 char Name[] (RRQ, WRQ) rest of mailbox data
413 guint8 Data[] (DATA) rest of mailbox data (if OpMode = 3)
414 char ErrorText[] (ERR) rest of mailbox data
415 } MailBoxDataUnion;*/
416 } ETHERCAT_FOE_HEADER
, *PETHERCAT_FOE_HEADER
;
417 #define ETHERCAT_FOE_HEADER_LEN 6 /*sizeof(ETHERCAT_FOE_HEADER)*/
428 /* SoE (SOE over EtherCAT)*/
429 #define ECAT_SOE_OPCODE_RRQ 1
430 #define ECAT_SOE_OPCODE_RRS 2
431 #define ECAT_SOE_OPCODE_WRQ 3
432 #define ECAT_SOE_OPCODE_WRS 4
433 #define ECAT_SOE_OPCODE_NFC 5
436 typedef union tSoeHeaderControlUnion
440 guint8 OpCode
: 3; /* 0 = unused, 1 = readReq, 2 = readRes, 3 = writeReq, 4 = writeRes
441 5 = notification (command changed notification)*/
442 guint8 InComplete
: 1; /* more follows*/
443 guint8 Error
: 1; /* an error word follows */
444 guint8 DriveNo
: 3; /* drive number */
446 guint8 DataState
: 1; /* follows or requested */
447 guint8 Name
: 1; /* follows or requested */
448 guint8 Attribute
: 1; /* follows or requested */
449 guint8 Unit
: 1; /* follows or requested */
450 guint8 Min
: 1; /* follows or requested */
451 guint8 Max
: 1; /* follows or requested */
452 guint8 Value
: 1; /* follows or requested */
460 } SoeHeaderControlUnion
;
462 typedef union tSoeHeaderDataUnion
464 guint16 IDN
; /* SOE IDN if (InComplete==0) */
465 guint16 FragmentsLeft
; /* Pending fragments if (InComplete==1) */
466 } SoeHeaderDataUnion
;
468 typedef struct TETHERCAT_SOE_HEADER
470 SoeHeaderControlUnion anSoeHeaderControlUnion
;
471 SoeHeaderDataUnion anSoeHeaderDataUnion
;
472 /* typedef union tMailBoxDataUnion
474 guint8 Data[] rest of mailbox data if (Error==0)
475 guint16 ErrorCode if (Error==1)
476 } MailBoxDataUnion;*/
477 } ETHERCAT_SOE_HEADER
, *PETHERCAT_SOE_HEADER
;
478 #define ETHERCAT_SOE_HEADER_LEN ((int) sizeof(ETHERCAT_SOE_HEADER))
480 extern void init_mbx_header(PETHERCAT_MBOX_HEADER pMbox
, tvbuff_t
*tvb
, gint offset
);