2 * Routines for "ETHERNET Powerlink 1.0" dissection
3 * (ETHERNET Powerlink Powerlink WhitePaper V0006-B)
5 * Copyright (c) 2006: Zurich University of Applied Sciences Winterthur (ZHW)
6 * Institute of Embedded Systems (InES)
9 * - Dominic Bechaz <bdo@zhwin.ch>
10 * - David Buechi <bhd@zhwin.ch>
16 * Wireshark - Network traffic analyzer
17 * By Gerald Combs <gerald@wireshark.org>
18 * Copyright 1999 Gerald Combs
20 * This program is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU General Public License
22 * as published by the Free Software Foundation; either version 2
23 * of the License, or (at your option) any later version.
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 * GNU General Public License for more details.
30 * You should have received a copy of the GNU General Public License
31 * along with this program; if not, write to the Free Software
32 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
40 #include <epan/packet.h>
41 #include <epan/etypes.h>
42 #include <epan/emem.h>
45 /* Offsets of fields within an EPL_V1 packet. */
46 #define EPL_V1_SERVICE_OFFSET 0 /* same offset for all message types*/
47 #define EPL_V1_DEST_OFFSET 1 /* same offset for all message types*/
48 #define EPL_V1_SRC_OFFSET 2 /* same offset for all message types*/
50 #define EPL_V1_SOC_C2_OFFSET 3
51 #define EPL_V1_SOC_PF_OFFSET 3
52 #define EPL_V1_SOC_NET_COMMAND_OFFSET 4
53 #define EPL_V1_SOC_NET_TIME_OFFSET 6
54 #define EPL_V1_SOC_POWERLINK_CYCLE_TIME_OFFSET 10
55 #define EPL_V1_SOC_NET_COMMAND_PARAMETER_OFFSET 14
57 #define EPL_V1_PREQ_C2_OFFSET 3
58 /* "Powerlink Multimanager Konzept V1.1" protocol extension*/
59 #define PMM_KONZEPT_V1_1_PREQ_YA 3
60 #define PMM_KONZEPT_V1_1_PREQ_SC 3
61 /* end "Powerlink Multimanager Konzept V1.1" protocol extension*/
62 #define EPL_V1_PREQ_RD_OFFSET 3
63 #define EPL_V1_PREQ_RD_OFFSET 3
64 #define EPL_V1_PREQ_POLL_SIZE_OUT_OFFSET 4
65 #define EPL_V1_PREQ_OUT_DATA_OFFSET 10
67 #define EPL_V1_PRES_C2_OFFSET 3
68 #define EPL_V1_PRES_EX_OFFSET 3
69 #define EPL_V1_PRES_RS_OFFSET 3
70 #define EPL_V1_PRES_WA_OFFSET 3
71 #define EPL_V1_PRES_ER_OFFSET 3
72 #define EPL_V1_PRES_RD_OFFSET 3
73 #define EPL_V1_PRES_POLL_SIZE_IN_OFFSET 4
74 #define EPL_V1_PRES_IN_DATA_OFFSET 10
76 #define EPL_V1_EOC_NET_COMMAND_OFFSET 4
77 #define EPL_V1_EOC_NET_COMMAND_PARAMETER_OFFSET 14
79 #define EPL_V1_AINV_CHANNEL_OFFSET 3
81 #define EPL_V1_ASND_CHANNEL_OFFSET 3
82 #define EPL_V1_ASND_SIZE_OFFSET 4
83 #define EPL_V1_ASND_DATA_OFFSET 6
84 #define EPL_V1_ASND_NODE_ID_OFFSET 6
85 #define EPL_V1_ASND_HARDWARE_REVISION_OFFSET 10
86 #define EPL_V1_ASND_FIRMWARE_VERSION_OFFSET 14
87 #define EPL_V1_ASND_DEVICE_VARIANT_OFFSET 18
88 #define EPL_V1_ASND_POLL_IN_SIZE_OFFSET 22
89 #define EPL_V1_ASND_POLL_OUT_SIZE_OFFSET 26
91 /* EPL_V1 message types */
92 #define EPL_V1_SOC 0x01
93 #define EPL_V1_EOC 0x02
94 #define EPL_V1_PREQ 0x03
95 #define EPL_V1_PRES 0x04
96 #define EPL_V1_AINV 0x05
97 #define EPL_V1_ASND 0x06
99 static const value_string service_vals[] = {
100 {EPL_V1_SOC, "Start of Cyclic (SoC)" },
101 {EPL_V1_EOC, "End of Cyclic (EoC)" },
102 {EPL_V1_PREQ, "Poll Request (PReq)" },
103 {EPL_V1_PRES, "Poll Response (PRes)" },
104 {EPL_V1_AINV, "Acyclic Invite (AInv)" },
105 {EPL_V1_ASND, "Acyclic Send (ASnd)" },
109 /* Channel values for EPL_V1 message type "AInv" */
110 #define EPL_V1_AINV_IDENT 1
111 #define EPL_V1_AINV_GENERIC 255
113 static const value_string ainv_channel_number_vals[] = {
114 {EPL_V1_AINV_IDENT, "Ident" },
115 {EPL_V1_AINV_GENERIC, "Generic Channel" },
119 /* Channel values for EPL_V1 message type "ASnd" */
120 #define EPL_V1_ASND_IDENT 1
121 #define EPL_V1_ASND_GENERIC 255
123 static const value_string asnd_channel_number_vals[] = {
124 {EPL_V1_ASND_IDENT, "Ident" },
125 {EPL_V1_ASND_GENERIC, "Generic Channel" },
129 /* Net Command values for EPL_V1 message type "SoC" */
130 #define EPL_V1_SOC_NET_COMMAND_IDLE 0
131 #define EPL_V1_SOC_NET_COMMAND_ACTIVE 1
133 static const value_string soc_net_command_vals[] = {
134 {EPL_V1_SOC_NET_COMMAND_IDLE, "Net Command Idle" },
135 {EPL_V1_SOC_NET_COMMAND_ACTIVE, "Net Command Active"},
139 /* Net Command values for EPL_V1 message type "EoC" */
140 #define EPL_V1_EOC_NET_COMMAND_IDLE 0
141 #define EPL_V1_EOC_NET_COMMAND_ACTIVE 1
143 static const value_string eoc_net_command_vals[] = {
144 {EPL_V1_EOC_NET_COMMAND_IDLE, "Net Command Idle" },
145 {EPL_V1_EOC_NET_COMMAND_ACTIVE, "Net Command Active"},
150 /* Initialize the protocol and registered fields */
151 static int proto_epl_v1 = -1;
152 static int hf_epl_v1_service = -1;
153 static int hf_epl_v1_dest = -1;
154 static int hf_epl_v1_src = -1;
156 static int hf_epl_v1_soc_ms = -1;
157 static int hf_epl_v1_soc_ps = -1;
158 static int hf_epl_v1_soc_net_command = -1;
159 static int hf_epl_v1_soc_net_time = -1;
160 static int hf_epl_v1_soc_powerlink_cycle_time = -1;
161 static int hf_epl_v1_soc_net_command_parameter = -1;
163 static int hf_epl_v1_preq_ms = -1;
164 static int hf_epl_v1_preq_rd = -1;
165 static int hf_epl_v1_preq_poll_size_out = -1;
166 static int hf_epl_v1_preq_out_data = -1;
168 static int hf_epl_v1_pres_ms = -1;
169 static int hf_epl_v1_pres_ex = -1;
170 static int hf_epl_v1_pres_rs = -1;
171 static int hf_epl_v1_pres_wa = -1;
172 static int hf_epl_v1_pres_er = -1;
173 static int hf_epl_v1_pres_rd = -1;
174 static int hf_epl_v1_pres_poll_size_in = -1;
175 static int hf_epl_v1_pres_in_data = -1;
177 static int hf_epl_v1_eoc_net_command = -1;
178 static int hf_epl_v1_eoc_net_command_parameter = -1;
180 static int hf_epl_v1_ainv_channel = -1;
182 static int hf_epl_v1_asnd_channel = -1;
183 static int hf_epl_v1_asnd_size = -1;
184 static int hf_epl_v1_asnd_data = -1;
185 static int hf_epl_v1_asnd_node_id = -1;
186 static int hf_epl_v1_asnd_hardware_revision = -1;
187 static int hf_epl_v1_asnd_firmware_version = -1;
188 static int hf_epl_v1_asnd_device_variant = -1;
189 static int hf_epl_v1_asnd_poll_in_size = -1;
190 static int hf_epl_v1_asnd_poll_out_size = -1;
192 static gint ett_epl_v1 = -1;
196 dissect_epl_v1_soc(proto_tree *epl_v1_tree, tvbuff_t *tvb, gint offset)
198 proto_tree_add_item(epl_v1_tree, hf_epl_v1_soc_ms, tvb, offset, 1, ENC_LITTLE_ENDIAN);
199 proto_tree_add_item(epl_v1_tree, hf_epl_v1_soc_ps, tvb, offset, 1, ENC_LITTLE_ENDIAN);
202 proto_tree_add_item(epl_v1_tree, hf_epl_v1_soc_net_command, tvb, offset, 2, ENC_LITTLE_ENDIAN);
205 proto_tree_add_item(epl_v1_tree, hf_epl_v1_soc_net_time, tvb, offset, 4, ENC_LITTLE_ENDIAN);
208 proto_tree_add_item(epl_v1_tree, hf_epl_v1_soc_powerlink_cycle_time, tvb, offset, 4, ENC_LITTLE_ENDIAN);
211 proto_tree_add_item(epl_v1_tree, hf_epl_v1_soc_net_command_parameter, tvb, offset, 32, ENC_NA);
219 dissect_epl_v1_eoc(proto_tree *epl_v1_tree, tvbuff_t *tvb, gint offset)
223 proto_tree_add_item(epl_v1_tree, hf_epl_v1_eoc_net_command, tvb, offset, 2, ENC_LITTLE_ENDIAN);
226 proto_tree_add_item(epl_v1_tree, hf_epl_v1_eoc_net_command_parameter, tvb, offset, 32, ENC_NA);
234 dissect_epl_v1_preq(proto_tree *epl_v1_tree, tvbuff_t *tvb, gint offset)
238 proto_tree_add_item(epl_v1_tree, hf_epl_v1_preq_ms, tvb, offset, 1, ENC_LITTLE_ENDIAN);
239 proto_tree_add_item(epl_v1_tree, hf_epl_v1_preq_rd, tvb, offset, 1, ENC_LITTLE_ENDIAN);
242 /* get length of data */
243 proto_tree_add_item(epl_v1_tree, hf_epl_v1_preq_poll_size_out, tvb, offset, 2, ENC_LITTLE_ENDIAN);
244 len = tvb_get_letohs(tvb, offset);
248 proto_tree_add_item(epl_v1_tree, hf_epl_v1_preq_out_data, tvb, offset, len, ENC_NA);
258 dissect_epl_v1_pres(proto_tree *epl_v1_tree, tvbuff_t *tvb, gint offset)
262 proto_tree_add_item(epl_v1_tree, hf_epl_v1_pres_ms, tvb, offset, 1, ENC_LITTLE_ENDIAN);
263 proto_tree_add_item(epl_v1_tree, hf_epl_v1_pres_ex, tvb, offset, 1, ENC_LITTLE_ENDIAN);
264 proto_tree_add_item(epl_v1_tree, hf_epl_v1_pres_rs, tvb, offset, 1, ENC_LITTLE_ENDIAN);
265 proto_tree_add_item(epl_v1_tree, hf_epl_v1_pres_wa, tvb, offset, 1, ENC_LITTLE_ENDIAN);
266 proto_tree_add_item(epl_v1_tree, hf_epl_v1_pres_er, tvb, offset, 1, ENC_LITTLE_ENDIAN);
267 proto_tree_add_item(epl_v1_tree, hf_epl_v1_pres_rd, tvb, offset, 1, ENC_LITTLE_ENDIAN);
270 /* get length of data */
271 proto_tree_add_item(epl_v1_tree, hf_epl_v1_pres_poll_size_in, tvb, offset, 2, ENC_LITTLE_ENDIAN);
272 len = tvb_get_letohs(tvb, offset);
276 proto_tree_add_item(epl_v1_tree, hf_epl_v1_pres_in_data, tvb, offset, len, ENC_NA);
286 dissect_epl_v1_ainv(proto_tree *epl_v1_tree, tvbuff_t *tvb, gint offset)
288 proto_tree_add_item(epl_v1_tree, hf_epl_v1_ainv_channel, tvb, offset, 1, ENC_LITTLE_ENDIAN);
297 dissect_epl_v1_asnd(proto_tree *epl_v1_tree, tvbuff_t *tvb, gint offset)
299 guint8 epl_v1_asnd_channel;
302 /* get ASnd channel */
303 proto_tree_add_item(epl_v1_tree, hf_epl_v1_asnd_channel, tvb, offset, 1, ENC_LITTLE_ENDIAN);
304 epl_v1_asnd_channel = tvb_get_guint8(tvb, offset);
307 /* get length of data */
308 proto_tree_add_item(epl_v1_tree, hf_epl_v1_asnd_size, tvb, offset, 2, ENC_LITTLE_ENDIAN);
309 len = tvb_get_letohs(tvb, offset);
312 /* "Ident" or "Generic" channel? */
313 if(epl_v1_asnd_channel == EPL_V1_AINV_IDENT){ /* Ident channel*/
314 proto_tree_add_item(epl_v1_tree, hf_epl_v1_asnd_node_id, tvb, offset, 4, ENC_LITTLE_ENDIAN);
317 proto_tree_add_item(epl_v1_tree, hf_epl_v1_asnd_hardware_revision, tvb, offset, 4, ENC_LITTLE_ENDIAN);
320 proto_tree_add_item(epl_v1_tree, hf_epl_v1_asnd_firmware_version, tvb, offset, 4, ENC_LITTLE_ENDIAN);
323 proto_tree_add_item(epl_v1_tree, hf_epl_v1_asnd_device_variant, tvb, offset, 4, ENC_LITTLE_ENDIAN);
326 proto_tree_add_item(epl_v1_tree, hf_epl_v1_asnd_poll_in_size, tvb, offset, 4, ENC_LITTLE_ENDIAN);
329 proto_tree_add_item(epl_v1_tree, hf_epl_v1_asnd_poll_out_size, tvb, offset, 4, ENC_LITTLE_ENDIAN);
331 } else { /* "Generic" and all other channels */
332 proto_tree_add_item(epl_v1_tree, hf_epl_v1_asnd_data, tvb, offset, len, ENC_NA);
341 /* Code to actually dissect the packets */
343 dissect_epl_v1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
345 guint8 epl_v1_service, epl_v1_dest, epl_v1_src, epl_v1_ainv_ch, epl_v1_asnd_ch;
348 proto_tree *epl_v1_tree=NULL;
351 if(tvb_length(tvb) < 3){
352 /* Not enough data for an EPL_V1 header; don't try to interpret it */
358 /* make entries in Protocol column and Info column on summary display */
359 col_set_str(pinfo->cinfo, COL_PROTOCOL, "EPL_V1");
360 col_clear(pinfo->cinfo, COL_INFO);
362 /* get service type */
363 epl_v1_service = tvb_get_guint8(tvb, EPL_V1_SERVICE_OFFSET) & 0x7F;
365 /* get destination */
366 epl_v1_dest = tvb_get_guint8(tvb, EPL_V1_DEST_OFFSET);
369 epl_v1_src = tvb_get_guint8(tvb, EPL_V1_SRC_OFFSET);
371 /* choose the right string for "Info" column */
372 switch(epl_v1_service){
374 col_add_fstr(pinfo->cinfo, COL_INFO, "SoC dest = %3d src = %3d ", epl_v1_dest, epl_v1_src);
378 col_add_fstr(pinfo->cinfo, COL_INFO, "EoC dest = %3d src = %3d ", epl_v1_dest, epl_v1_src);
382 col_add_fstr(pinfo->cinfo, COL_INFO, "PReq dest = %3d src = %3d ", epl_v1_dest, epl_v1_src);
386 col_add_fstr(pinfo->cinfo, COL_INFO, "PRes dest = %3d src = %3d ", epl_v1_dest, epl_v1_src);
390 /* get AInv channel */
391 epl_v1_ainv_ch = tvb_get_guint8(tvb, EPL_V1_AINV_CHANNEL_OFFSET);
392 col_add_fstr(pinfo->cinfo, COL_INFO, "AInv dest = %3d src = %3d channel = %s ",
393 epl_v1_dest, epl_v1_src, val_to_str(epl_v1_ainv_ch, ainv_channel_number_vals, "unknown Channel (%d)"));
397 /* get ASnd channel */
398 epl_v1_asnd_ch = tvb_get_guint8(tvb, EPL_V1_ASND_CHANNEL_OFFSET);
399 col_add_fstr(pinfo->cinfo, COL_INFO, "ASnd dest = %3d src = %3d channel = %s ",
400 epl_v1_dest, epl_v1_src, val_to_str(epl_v1_asnd_ch, asnd_channel_number_vals, "unknown Channel (%d)"));
403 default: /* no valid EPL packet */
408 /* create display subtree for the protocol */
409 ti = proto_tree_add_item(tree, proto_epl_v1, tvb, 0, -1, ENC_NA);
411 epl_v1_tree = proto_item_add_subtree(ti, ett_epl_v1);
413 proto_tree_add_item(epl_v1_tree, hf_epl_v1_service, tvb, offset, 1, ENC_LITTLE_ENDIAN);
416 proto_tree_add_item(epl_v1_tree, hf_epl_v1_dest, tvb, offset, 1, ENC_LITTLE_ENDIAN);
419 proto_tree_add_item(epl_v1_tree, hf_epl_v1_src, tvb, offset, 1, ENC_LITTLE_ENDIAN);
422 /* The rest of the epl_v1 dissector depends on the message type */
423 switch(epl_v1_service){
425 offset = dissect_epl_v1_soc(epl_v1_tree, tvb, offset);
429 offset = dissect_epl_v1_eoc(epl_v1_tree, tvb, offset);
433 offset = dissect_epl_v1_preq(epl_v1_tree, tvb, offset);
437 offset = dissect_epl_v1_pres(epl_v1_tree, tvb, offset);
441 offset = dissect_epl_v1_ainv(epl_v1_tree, tvb, offset);
445 offset = dissect_epl_v1_asnd(epl_v1_tree, tvb, offset);
448 default: /* not a valid MessageType - can't dissect any further. */
457 proto_register_epl_v1(void)
459 static hf_register_info hf[] = {
460 /* Common data fields (same for all message types) */
461 { &hf_epl_v1_service,
462 { "Service", "epl_v1.service",
463 FT_UINT8, BASE_DEC, VALS(service_vals), 0x7F,
467 { "Destination", "epl_v1.dest",
468 FT_UINT8, BASE_DEC, NULL, 0x00,
472 { "Source", "epl_v1.src",
473 FT_UINT8, BASE_DEC, NULL, 0x00,
478 { "MS (Multiplexed Slot)", "epl_v1.soc.ms",
479 FT_UINT8, BASE_DEC, NULL, 0x80,
483 { "PS (Prescaled Slot)", "epl_v1.soc.ps",
484 FT_UINT8, BASE_DEC, NULL, 0x40,
487 { &hf_epl_v1_soc_net_command,
488 { "Net Command", "epl_v1.soc.netcommand",
489 FT_UINT16, BASE_DEC, VALS(soc_net_command_vals), 0x0,
492 { &hf_epl_v1_soc_net_time,
493 { "Net Time", "epl_v1.soc.nettime",
494 FT_UINT32, BASE_DEC, NULL, 0x0,
497 { &hf_epl_v1_soc_powerlink_cycle_time,
498 { "Cycle Time", "epl_v1.soc.cycletime",
499 FT_UINT32, BASE_DEC, NULL, 0x0,
502 { &hf_epl_v1_soc_net_command_parameter,
503 { "Net Command Parameter", "epl_v1.soc.netcommand.parameter",
504 FT_BYTES, BASE_NONE, NULL, 0x0,
507 /* PReq data fields*/
508 { &hf_epl_v1_preq_ms,
509 { "MS (Multiplexed Slot)", "epl_v1.preq.ms",
510 FT_UINT8, BASE_DEC, NULL, 0x20,
513 { &hf_epl_v1_preq_rd,
514 { "RD (Ready)", "epl_v1.preq.rd",
515 FT_UINT8, BASE_DEC, NULL, 0x01,
518 { &hf_epl_v1_preq_poll_size_out,
519 { "Poll Size OUT", "epl_v1.preq.pollsize",
520 FT_UINT16, BASE_DEC, NULL, 0x00,
523 { &hf_epl_v1_preq_out_data,
524 { "OUT Data", "epl_v1.preq.data",
525 FT_BYTES, BASE_NONE, NULL, 0x00,
528 /* PRes data fields*/
529 { &hf_epl_v1_pres_ms,
530 { "MS (Multiplexed)", "epl_v1.pres.ms",
531 FT_UINT8, BASE_DEC, NULL, 0x20,
534 { &hf_epl_v1_pres_ex,
535 { "EX (Exception)", "epl_v1.pres.ex",
536 FT_UINT8, BASE_DEC, NULL, 0x10,
539 { &hf_epl_v1_pres_rs,
540 { "RS (Request to Send)", "epl_v1.pres.rs",
541 FT_UINT8, BASE_DEC, NULL, 0x08,
544 { &hf_epl_v1_pres_wa,
545 { "WA (Warning)", "epl_v1.pres.wa",
546 FT_UINT8, BASE_DEC, NULL, 0x04,
549 { &hf_epl_v1_pres_er,
550 { "ER (Error)", "epl_v1.pres.er",
551 FT_UINT8, BASE_DEC, NULL, 0x02,
554 { &hf_epl_v1_pres_rd,
555 { "RD (Ready)", "epl_v1.pres.rd",
556 FT_UINT8, BASE_DEC, NULL, 0x01,
559 { &hf_epl_v1_pres_poll_size_in,
560 { "Poll Size IN", "epl_v1.pres.pollsize",
561 FT_UINT16, BASE_DEC, NULL, 0x00,
564 { &hf_epl_v1_pres_in_data,
565 { "IN Data", "epl_v1.pres.data",
566 FT_BYTES, BASE_NONE, NULL, 0x00,
570 { &hf_epl_v1_eoc_net_command,
571 { "Net Command", "epl_v1.eoc.netcommand",
572 FT_UINT16, BASE_DEC, VALS(eoc_net_command_vals), 0x00,
575 { &hf_epl_v1_eoc_net_command_parameter,
576 { "Net Command Parameter", "epl_v1.soa.netcommand.parameter",
577 FT_BYTES, BASE_NONE, NULL, 0x00,
580 /* AInv data fields*/
581 { &hf_epl_v1_ainv_channel,
582 { "Channel", "epl_v1.ainv.channel",
583 FT_UINT8, BASE_DEC, VALS(ainv_channel_number_vals), 0x00,
586 /* ASnd data fields*/
587 { &hf_epl_v1_asnd_channel,
588 { "Channel", "epl_v1.asnd.channel",
589 FT_UINT8, BASE_DEC, VALS(asnd_channel_number_vals), 0x00,
592 { &hf_epl_v1_asnd_size,
593 { "Size", "epl_v1.asnd.size",
594 FT_UINT16, BASE_DEC, NULL, 0x00,
597 { &hf_epl_v1_asnd_data,
598 { "Data", "epl_v1.asnd.data",
599 FT_BYTES, BASE_NONE, NULL, 0x00,
603 { &hf_epl_v1_asnd_node_id,
604 { "NodeID", "epl_v1.asnd.node_id",
605 FT_UINT32, BASE_DEC, NULL, 0x00,
608 { &hf_epl_v1_asnd_hardware_revision,
609 { "Hardware Revision", "epl_v1.asnd.hardware.revision",
610 FT_UINT32, BASE_DEC, NULL, 0x00,
613 { &hf_epl_v1_asnd_firmware_version,
614 { "Firmware Version", "epl_v1.asnd.firmware.version",
615 FT_UINT32, BASE_DEC, NULL, 0x00,
618 { &hf_epl_v1_asnd_device_variant,
619 { "Device Variant", "epl_v1.asnd.device.variant",
620 FT_UINT32, BASE_DEC, NULL, 0x00,
623 { &hf_epl_v1_asnd_poll_in_size,
624 { "Poll IN Size", "epl_v1.asnd.poll.in.size",
625 FT_UINT32, BASE_DEC, NULL, 0x00,
628 { &hf_epl_v1_asnd_poll_out_size,
629 { "Poll OUT Size", "epl_v1.asnd.poll.out.size",
630 FT_UINT32, BASE_DEC, NULL, 0x00,
635 /* Setup protocol subtree array */
636 static gint *ett[] = {
640 /* Register the protocol name and description */
641 proto_epl_v1 = proto_register_protocol("ETHERNET Powerlink V1.0", "EPL_V1", "epl_v1");
643 /* Required function calls to register the header fields and subtrees used */
644 proto_register_field_array(proto_epl_v1, hf, array_length(hf));
645 proto_register_subtree_array(ett, array_length(ett));
651 proto_reg_handoff_epl_v1(void)
653 dissector_handle_t epl_v1_handle;
655 epl_v1_handle = new_create_dissector_handle(dissect_epl_v1, proto_epl_v1);
656 dissector_add_uint("ethertype", ETHERTYPE_EPL_V1, epl_v1_handle);