Skip to content

Commit b5ba41c

Browse files
committed
Added packet macros. Work in progress.
1 parent 38e6e3c commit b5ba41c

File tree

1 file changed

+134
-0
lines changed

1 file changed

+134
-0
lines changed

macros/packet.h

+134
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
2+
/*
3+
* This is a collection of handy macros.
4+
*/
5+
6+
/* select one out of a list */
7+
#define GET_MACRO(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,NAME,...) NAME
8+
9+
#define FOREACH_PAIR_2(WHAT, WHAT_LAST, X, Y) WHAT_LAST(X,Y)
10+
#define FOREACH_PAIR_4(WHAT, WHAT_LAST, X, Y, ...) WHAT(X,Y)FOREACH_PAIR_2(WHAT, WHAT_LAST, __VA_ARGS__)
11+
#define FOREACH_PAIR_6(WHAT, WHAT_LAST, X, Y, ...) WHAT(X,Y)FOREACH_PAIR_4(WHAT, WHAT_LAST, __VA_ARGS__)
12+
#define FOREACH_PAIR_8(WHAT, WHAT_LAST, X, Y, ...) WHAT(X,Y)FOREACH_PAIR_6(WHAT, WHAT_LAST, __VA_ARGS__)
13+
#define FOREACH_PAIR_10(WHAT, WHAT_LAST, X, Y, ...) WHAT(X,Y)FOREACH_PAIR_8(WHAT, WHAT_LAST, __VA_ARGS__)
14+
#define FOREACH_PAIR_12(WHAT, WHAT_LAST, X, Y, ...) WHAT(X,Y)FOREACH_PAIR_10(WHAT, WHAT_LAST, __VA_ARGS__)
15+
#define FOREACH_PAIR_14(WHAT, WHAT_LAST, X, Y, ...) WHAT(X,Y)FOREACH_PAIR_12(WHAT, WHAT_LAST, __VA_ARGS__)
16+
#define FOREACH_PAIR_16(WHAT, WHAT_LAST, X, Y, ...) WHAT(X,Y)FOREACH_PAIR_14(WHAT, WHAT_LAST, __VA_ARGS__)
17+
18+
/* run an action macro against all elements passed as arguments, handles arguments in PAIRS */
19+
#define FOREACH_PAIR(action, ...) \
20+
GET_MACRO(__VA_ARGS__,FOREACH_PAIR_16,OOPS15,FOREACH_PAIR_14,OOPS13,FOREACH_PAIR_12,OOPS11,FOREACH_PAIR_10,OOPS9,FOREACH_PAIR_8,OOPS7,FOREACH_PAIR_6,OOPS5,FOREACH_PAIR_4,OOPS3,FOREACH_PAIR_2,OOPS1,)(action,action,__VA_ARGS__)
21+
22+
/* as above, but run a second macro function against the last element in the list */
23+
#define FOREACH_PAIR_LAST(action, action_last, ...) \
24+
GET_MACRO(__VA_ARGS__,FOREACH_PAIR_16,OOPS15,FOREACH_PAIR_14,OOPS13,FOREACH_PAIR_12,OOPS11,FOREACH_PAIR_10,OOPS9,FOREACH_PAIR_8,OOPS7,FOREACH_PAIR_6,OOPS5,FOREACH_PAIR_4,OOPS3,FOREACH_PAIR_2,OOPS1,)(action,action_last,__VA_ARGS__)
25+
26+
27+
#define FOREACH_1(WHAT, WHAT_LAST, X) WHAT_LAST(X)
28+
#define FOREACH_2(WHAT, WHAT_LAST, X, ...) WHAT(X)FOREACH_1(WHAT, WHAT_LAST, __VA_ARGS__)
29+
#define FOREACH_3(WHAT, WHAT_LAST, X, ...) WHAT(X)FOREACH_2(WHAT, WHAT_LAST, __VA_ARGS__)
30+
#define FOREACH_4(WHAT, WHAT_LAST, X, ...) WHAT(X)FOREACH_3(WHAT, WHAT_LAST, __VA_ARGS__)
31+
#define FOREACH_5(WHAT, WHAT_LAST, X, ...) WHAT(X)FOREACH_4(WHAT, WHAT_LAST, __VA_ARGS__)
32+
#define FOREACH_6(WHAT, WHAT_LAST, X, ...) WHAT(X)FOREACH_5(WHAT, WHAT_LAST, __VA_ARGS__)
33+
#define FOREACH_7(WHAT, WHAT_LAST, X, ...) WHAT(X)FOREACH_6(WHAT, WHAT_LAST, __VA_ARGS__)
34+
#define FOREACH_8(WHAT, WHAT_LAST, X, ...) WHAT(X)FOREACH_7(WHAT, WHAT_LAST, __VA_ARGS__)
35+
#define FOREACH_9(WHAT, WHAT_LAST, X, ...) WHAT(X)FOREACH_8(WHAT, WHAT_LAST, __VA_ARGS__)
36+
#define FOREACH_10(WHAT, WHAT_LAST, X, ...) WHAT(X)FOREACH_9(WHAT, WHAT_LAST, __VA_ARGS__)
37+
#define FOREACH_11(WHAT, WHAT_LAST, X, ...) WHAT(X)FOREACH_10(WHAT, WHAT_LAST, __VA_ARGS__)
38+
#define FOREACH_12(WHAT, WHAT_LAST, X, ...) WHAT(X)FOREACH_11(WHAT, WHAT_LAST, __VA_ARGS__)
39+
#define FOREACH_13(WHAT, WHAT_LAST, X, ...) WHAT(X)FOREACH_12(WHAT, WHAT_LAST, __VA_ARGS__)
40+
#define FOREACH_14(WHAT, WHAT_LAST, X, ...) WHAT(X)FOREACH_13(WHAT, WHAT_LAST, __VA_ARGS__)
41+
#define FOREACH_15(WHAT, WHAT_LAST, X, ...) WHAT(X)FOREACH_14(WHAT, WHAT_LAST, __VA_ARGS__)
42+
#define FOREACH_16(WHAT, WHAT_LAST, X, ...) WHAT(X)FOREACH_15(WHAT, WHAT_LAST, __VA_ARGS__)
43+
44+
45+
/* run action macro against all elements in a list. */
46+
#define FOREACH(action, ...) \
47+
GET_MACRO(__VA_ARGS__,FOREACH_16,FOREACH_15,FOREACH_14,FOREACH_13,FOREACH_12,FOREACH_11,FOREACH_10,FOREACH_9,FOREACH_8,FOREACH_7,FOREACH_6,FOREACH_5,FOREACH_4,FOREACH_3,FOREACH_2,FOREACH_1,)(action,action,__VA_ARGS__)
48+
49+
/* run action macro against all elements in a list. Run a different macro against the last element. */
50+
#define FOREACH_LAST(action, action_last, ...) \
51+
GET_MACRO(__VA_ARGS__,FOREACH_16,FOREACH_15,FOREACH_14,FOREACH_13,FOREACH_12,FOREACH_11,FOREACH_10,FOREACH_9,FOREACH_8,FOREACH_7,FOREACH_6,FOREACH_5,FOREACH_4,FOREACH_3,FOREACH_2,FOREACH_1,)(action,action_last,__VA_ARGS__)
52+
53+
54+
#define STRINGIFY(X) STRINGIFY_1(X)
55+
#define STRINGIFY_1(X) STRINGIFY_2(X)
56+
#define STRINGIFY_2(X) STRINGIFY_3(X)
57+
#define STRINGIFY_3(X) STRINGIFY_4(X)
58+
#define STRINGIFY_4(X) STRINGIFY_5(X)
59+
#define STRINGIFY_5(X) #X
60+
61+
62+
#define CONCAT(A,B) CONCAT_1(A,B)
63+
#define CONCAT_1(A,B) CONCAT_2(A,B)
64+
#define CONCAT_2(A,B) A ## B
65+
66+
#define MAKE_FIELD(T, N) MAKE_FIELD_1(T,N)
67+
#define MAKE_FIELD_1(T,N) \
68+
T N; \
69+
70+
71+
#define MAKE_STRUCT_NAME(base_name) CONCAT(packet_,base_name)
72+
#define MAKE_STRUCT(base_name, ...) \
73+
struct MAKE_STRUCT_NAME(base_name) { \
74+
FOREACH_PAIR(MAKE_FIELD,__VA_ARGS__) \
75+
}; \
76+
typedef struct MAKE_STRUCT_NAME(base_name) *MAKE_STRUCT_NAME(base_name); \
77+
78+
79+
#define MAKE_LENGTH_NAME(T) CONCAT(length_,T)
80+
#define MAKE_FIELD_LENGTH(T,N) + MAKE_LENGTH_NAME(T)(N)
81+
#define MAKE_LENGTH(base_name, ...) \
82+
int MAKE_LENGTH_NAME(base_name)(MAKE_STRUCT_NAME(base_name) data) \
83+
{ \
84+
return 0 FOREACH_PAIR(MAKE_FIELD_LENGTH,__VA_ARGS__) ; \
85+
} \
86+
87+
88+
#define MAKE_MARSHALL_NAME(T) CONCAT(marshall_,T)
89+
#define MAKE_FIELD_MARSHALL(T,N) if(offset >= 0) {offset = MAKE_MARSHALL_NAME(T)(buf, offset, data->N);} else {pdebug(DEBUG_WARN,"Unable to marshal field " #N "! rc=%d",offset); }
90+
#define MAKE_MARSHALL(base_name, ...) \
91+
int MAKE_MARSHALL_NAME(base_name)(byte_buffer_p buf, int offset, MAKE_STRUCT_NAME(base_name) data) \
92+
{ \
93+
FOREACH_PAIR(MAKE_FIELD_MARSHALL,__VA_ARGS__) \
94+
return offset; \
95+
} \
96+
97+
#define MAKE_UNMARSHALL_NAME(T) CONCAT(unmarshall_,T)
98+
#define MAKE_FIELD_UNMARSHALL(T,N) if(offset >= 0) {offset = MAKE_UNMARSHALL_NAME(T)(buf, offset, &data->N);} else {pdebug(DEBUG_WARN,"Unable to unmarshal field " #N "! rc=%d",offset); }
99+
#define MAKE_UNMARSHALL(base_name, ...) \
100+
int MAKE_UNMARSHALL_NAME(base_name)(byte_buffer_p buf, int offset, MAKE_STRUCT_NAME(base_name) *data) \
101+
{ \
102+
FOREACH_PAIR(MAKE_FIELD_UNMARSHALL,__VA_ARGS__) \
103+
return offset; \
104+
} \
105+
106+
107+
108+
#define PACKET(base_name, ...) \
109+
MAKE_STRUCT(base_name, __VA_ARGS__) \
110+
MAKE_LENGTH(base_name, __VA_ARGS__) \
111+
MAKE_MARSHALL(base_name, __VA_ARGS__) \
112+
MAKE_UNMARSHALL(base_name, __VA_ARGS__) \
113+
114+
115+
116+
PACKET(eip_header, \
117+
uint16_t,command, \
118+
uint16_t,length, \
119+
uint32_t,session_handle, \
120+
uint32_t,status, \
121+
uint64_t,session_seq, \
122+
uint32_t,options \
123+
)
124+
125+
126+
127+
PACKET(session_register, \
128+
packet_eip_header,header, \
129+
uint16_t,eip_version, \
130+
uint16_t,option_flags \
131+
)
132+
133+
134+

0 commit comments

Comments
 (0)