MSWSP: add ids for another unknown Property Set
[wireshark-wip.git] / plugins / ethercat / packet-ecatmb.h
blob38a6a6bd40e449abef3fe6352ad11d47531dd5c8
1 /* packet-ecatmb.h
3 * $Id$
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
32 guint8 b[6];
33 } ETHERNET_ADDRESS, *PETHERNET_ADDRESS;
34 #define ETHERNET_ADDRESS_LEN ((int) sizeof(ETHERNET_ADDRESS))
36 /* Mailbox*/
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
45 guint16 Control;
46 struct
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*/
53 } v;
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 /*/////////////////////////////////////////////////////////////////////////////*/
66 /* EoE*/
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;
91 guint32 Reserved :26;
92 ETHERNET_ADDRESS MacAddr;
93 guint32 IpAddr;
94 guint32 SubnetMask;
95 guint32 DefaultGateway;
96 guint32 DnsServer;
97 char DnsName[32];
98 } ETHERCAT_EOE_INIT, *PETHERCAT_EOE_INIT;*/
99 #define ETHERCAT_EOE_INIT_LEN 58 /*sizeof(ETHERCAT_EOE_INIT)*/
101 typedef union tEoeMacFilterOptionsUnion
103 struct
105 guint16 MacFilterCount :4;
106 guint16 MacFilterMaskCount :2;
107 guint16 Reserved1 :1;
108 guint16 NoBroadcasts :1;
109 guint16 Reserved2 :8;
110 } v;
111 guint16 Options;
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
131 struct
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) */
137 } v;
138 guint16 Result; /* EOE_TYPE_INIT_RES and EOE_TYPE_MACFILTER_RES only */
139 } EoeHeaderDataUnion;
141 typedef union tEoeHeaderInfoUnion
143 struct
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;
151 } v;
152 guint16 Info;
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 /*/////////////////////////////////////////////////////////////////////////////*/
163 /* CANopen*/
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
175 struct
177 guint16 Number : 9; /* e.g. PDO number*/
178 guint16 Reserved : 3; /* = 0*/
179 guint16 Type : 4; /* CANopen type*/
180 } v;
181 guint16 header;
182 } ETHERCAT_COE_HEADER, *PETHERCAT_COE_HEADER;
183 #define ETHERCAT_COE_HEADER_LEN ((int) sizeof(ETHERCAT_COE_HEADER))
186 typedef union tSdoHeaderUnion
188 struct
189 { /* Initiate Download Request*/
190 guint8 SizeInd : 1;
191 guint8 Expedited : 1;
192 guint8 Size : 2;
193 guint8 Complete : 1;
194 guint8 Ccs : 3; /* = 1*/
195 } Idq;
196 struct
197 { /* Initiate Download Response*/
198 guint8 Reserved : 5;
199 guint8 Scs : 3; /* = 3*/
200 } Ids;
201 struct
202 { /* Download Segment Request*/
203 guint8 LastSeg : 1;
204 guint8 Size : 3;
205 guint8 Toggle : 1;
206 guint8 Ccs : 3; /* = 0*/
207 } Dsq;
208 struct
209 { /* Download Segment Response*/
210 guint8 Reserved : 4;
211 guint8 Toggle : 1;
212 guint8 Scs : 3; /* = 1*/
213 } Dss;
214 struct
215 { /* Initiate Upload Request*/
216 guint8 Reserved : 4;
217 guint8 Complete : 1;
218 guint8 Ccs : 3; /* = 2*/
219 } Iuq;
220 struct
221 { /* Initiate Upload Response*/
222 guint8 SizeInd : 1;
223 guint8 Expedited : 1;
224 guint8 Size : 2;
225 guint8 Complete : 1;
226 guint8 Scs : 3; /* = 2*/
227 } Ius;
228 struct
229 { /* Upload Segment Request*/
230 guint8 Reserved : 4;
231 guint8 Toggle : 1;
232 guint8 Ccs : 3; /* = 3*/
233 } Usq;
234 struct
235 { /* Upload Segment Response*/
236 guint8 LastSeg : 1;
237 guint8 Bytes : 3;
238 guint8 Toggle : 1;
239 guint8 Scs : 3; /* = 0*/
240 } Uss;
241 struct
242 { /* Abort Transfer*/
243 guint8 Reserved : 5;
244 guint8 Ccs : 3; /* = 4*/
245 } Abt;
246 guint8 CS;
247 } SdoHeaderUnion;
249 typedef struct TETHERCAT_SDO_HEADER
251 SdoHeaderUnion anSdoHeaderUnion;
253 guint16 Index;
254 guint8 SubIndex;
255 guint32 Data;
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 */
302 struct
304 guint16 Index[1];
305 } Res;
306 } ETHERCAT_SDO_INFO_LIST;
308 typedef struct TETHERCAT_SDO_INFO_OBJ
310 guint16 Index;
311 struct
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*/
317 } Res;
318 } ETHERCAT_SDO_INFO_OBJ;
320 typedef struct TETHERCAT_SDO_INFO_ENTRY
322 guint16 Index;
323 guint8 SubIdx;
324 guint8 ValueInfo; /* bit0 = ObjAccess, bit1 = ObjCategory, bit2 = PdoMapping, bit3 = UnitType
325 bit4 = DefaultValue, bit5 = MinValue, bit6 = MaxValue*/
326 struct
328 guint16 DataType; /* refer to data type index */
329 guint16 BitLen;
330 guint16 ObjAccess; /* bit0 = read; bit1 = write; bit2 = const. bit3 = 'PRE-OP'; bit4 = 'SAFE-OP'; bit5 = 'OP'.*/
331 } Res;
332 } ETHERCAT_SDO_INFO_ENTRY;
334 typedef struct TETHERCAT_SDO_INFO_ERROR
336 guint32 ErrorCode;
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;
346 guint8 Data[1];
347 } SdoInfoUnion;
349 typedef union tSdoControlUnion
351 struct
353 guint8 OpCode : 7; /* == SDO_INFO_TYPE_XXX */
354 guint8 InComplete : 1;
355 } v;
356 guint8 Control;
357 } SdoControlUnion;
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 */
391 struct
393 guint16 PacketNo; /* (DATA, ACK)*/
394 guint16 Reserved2; /* (DATA, ACK)*/
395 } v;
396 guint32 ErrorCode; /* (ERR)*/
397 struct
399 guint16 Done; /* (BUSY)*/
400 guint16 Entire; /* (BUSY)*/
401 } v2;
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)*/
419 typedef struct
421 guint16 Cmd;
422 guint16 Size;
423 guint16 AddressLW;
424 guint16 AddressHW;
425 } TEFWUPDATE_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
438 struct
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 */
453 guint8 Reserved : 1;
454 } v;
455 struct
457 guint8 Control;
458 guint8 Element;
459 } v2;
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);
482 #endif