1 #ifndef DRBD_TAG_MAGIC_H
2 #define DRBD_TAG_MAGIC_H
3 
4 #define TT_END     0
5 #define TT_REMOVED 0xE000
6 
7 /* declare packet_type enums */
8 enum packet_types {
9 #define NL_PACKET(name, number, fields) P_ ## name = number,
10 #define NL_RESPONSE(name, number) P_ ## name = number,
11 #define NL_INTEGER(pn, pr, member)
12 #define NL_INT64(pn, pr, member)
13 #define NL_BIT(pn, pr, member)
14 #define NL_STRING(pn, pr, member, len)
15 #include "drbd_nl.h"
16 	P_nl_after_last_packet,
17 };
18 
19 /* These struct are used to deduce the size of the tag lists: */
20 #define NL_PACKET(name, number, fields)	\
21 	struct name ## _tag_len_struct { fields };
22 #define NL_INTEGER(pn, pr, member)		\
23 	int member; int tag_and_len ## member;
24 #define NL_INT64(pn, pr, member)		\
25 	__u64 member; int tag_and_len ## member;
26 #define NL_BIT(pn, pr, member)		\
27 	unsigned char member:1; int tag_and_len ## member;
28 #define NL_STRING(pn, pr, member, len)	\
29 	unsigned char member[len]; int member ## _len; \
30 	int tag_and_len ## member;
31 #include "linux/drbd_nl.h"
32 
33 /* declate tag-list-sizes */
34 static const int tag_list_sizes[] = {
35 #define NL_PACKET(name, number, fields) 2 fields ,
36 #define NL_INTEGER(pn, pr, member)      + 4 + 4
37 #define NL_INT64(pn, pr, member)        + 4 + 8
38 #define NL_BIT(pn, pr, member)          + 4 + 1
39 #define NL_STRING(pn, pr, member, len)  + 4 + (len)
40 #include "drbd_nl.h"
41 };
42 
43 /* The two highest bits are used for the tag type */
44 #define TT_MASK      0xC000
45 #define TT_INTEGER   0x0000
46 #define TT_INT64     0x4000
47 #define TT_BIT       0x8000
48 #define TT_STRING    0xC000
49 /* The next bit indicates if processing of the tag is mandatory */
50 #define T_MANDATORY  0x2000
51 #define T_MAY_IGNORE 0x0000
52 #define TN_MASK      0x1fff
53 /* The remaining 13 bits are used to enumerate the tags */
54 
55 #define tag_type(T)   ((T) & TT_MASK)
56 #define tag_number(T) ((T) & TN_MASK)
57 
58 /* declare tag enums */
59 #define NL_PACKET(name, number, fields) fields
60 enum drbd_tags {
61 #define NL_INTEGER(pn, pr, member)     T_ ## member = pn | TT_INTEGER | pr ,
62 #define NL_INT64(pn, pr, member)       T_ ## member = pn | TT_INT64   | pr ,
63 #define NL_BIT(pn, pr, member)         T_ ## member = pn | TT_BIT     | pr ,
64 #define NL_STRING(pn, pr, member, len) T_ ## member = pn | TT_STRING  | pr ,
65 #include "drbd_nl.h"
66 };
67 
68 struct tag {
69 	const char *name;
70 	int type_n_flags;
71 	int max_len;
72 };
73 
74 /* declare tag names */
75 #define NL_PACKET(name, number, fields) fields
76 static const struct tag tag_descriptions[] = {
77 #define NL_INTEGER(pn, pr, member)     [ pn ] = { #member, TT_INTEGER | pr, sizeof(int)   },
78 #define NL_INT64(pn, pr, member)       [ pn ] = { #member, TT_INT64   | pr, sizeof(__u64) },
79 #define NL_BIT(pn, pr, member)         [ pn ] = { #member, TT_BIT     | pr, sizeof(int)   },
80 #define NL_STRING(pn, pr, member, len) [ pn ] = { #member, TT_STRING  | pr, (len)         },
81 #include "drbd_nl.h"
82 };
83 
84 #endif
85