summaryrefslogtreecommitdiff
path: root/epan/dissectors/packet-epl.h
blob: 7db6187fa7d3d29d6ca111ebc0974a12c134b166 (plain)
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
/* packet-epl.h
 * Routines for "Ethernet POWERLINK 2.0" dissection
 * (Ethernet POWERLINK V2.0 Communication Profile Specification Draft Standard Version 1.2.0)
 *
 * A dissector for:
 * Wireshark - Network traffic analyzer
 * By Gerald Combs <gerald@wireshark.org>
 * Copyright 1999 Gerald Combs
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#ifndef __EPL_H_
#define __EPL_H_

#include <glib.h>
#include <epan/address.h>
#include <epan/wmem/wmem.h>
#include <epan/range.h>

#ifdef __GNUC__
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
#pragma GCC diagnostic ignored "-Wmissing-braces"
#endif

struct epl_datatype;

struct profile {
	guint16 id;
	guint8 nodeid;
	address node_addr;

	guint32 vendor_id;
	guint32 product_code;

	wmem_map_t *objects;
	wmem_allocator_t *scope, *parent_scope;
	wmem_map_t *parent_map;

	char *name;
	char *path;
	void *data;
	guint cb_id;
	wmem_array_t *TPDO; /* CN->MN */
	wmem_array_t *RPDO; /* MN->CN */

	struct profile *next;
};

enum { OD_ENTRY_SCALAR = 7, OD_ENTRY_ARRAY = 8, OD_ENTRY_RECORD = 9 };
struct od_entry {
	guint16 idx;
	/* This is called the ObjectType in the standard,
	 * but this is too easy to be mistaken with the
	 * DataType.
	 * ObjectType specifies whether it's a scalar or
	 * an aggregate
	 */
	guint16 type_class;
	char name[64];
	/* Called DataType by the standard,
	 * Can be e.g. Unsigned32
	 */
	const struct epl_datatype *type;
	guint64 value;
};

struct subobject {
	range_admin_t range;
	struct od_entry info;
};

typedef struct epl_wmem_iarray epl_wmem_iarray_t;

struct object {
	struct od_entry info;
	epl_wmem_iarray_t *subindices;
};

struct profile;

const struct epl_datatype *epl_type_to_hf(const char *name);

static inline gboolean
subobject_equal(gconstpointer _a, gconstpointer _b)
{
	const struct od_entry *a = &((const struct subobject*)_a)->info;
	const struct od_entry *b = &((const struct subobject*)_b)->info;

	return a->type_class == b->type_class
	    && a->type == b->type
	    && g_str_equal(a->name, b->name);
}

void epl_xdd_init(void);
struct profile *epl_xdd_load(struct profile *profile, const char *xml_file);

void epl_eds_init(void);
struct profile *epl_eds_load(struct profile *profile, const char *eds_file);


struct object *epl_profile_object_add(struct profile *profile, guint16 idx);
struct object *epl_profile_object_lookup_or_add(struct profile *profile, guint16 idx);

gboolean epl_profile_object_mapping_add(struct profile *profile, guint16 idx, guint8 subindex, guint64 mapping);
gboolean epl_profile_object_mappings_update(struct profile *profile);

range_admin_t * epl_wmem_iarray_find(epl_wmem_iarray_t *arr, guint32 value);
gboolean epl_wmem_iarray_is_empty(epl_wmem_iarray_t *iarr);
gboolean epl_wmem_iarray_is_sorted(epl_wmem_iarray_t *iarr);

#define EPL_OBJECT_MAPPING_SIZE sizeof (guint64)

#define CHECK_OVERLAP_ENDS(x1, x2, y1, y2) ((x1) < (y2) && (y1) < (x2))
#define CHECK_OVERLAP_LENGTH(x, x_len, y, y_len) \
	CHECK_OVERLAP_ENDS((x), (x) + (x_len), (y), (y) + (y_len))


#endif