cpp-d1064d
[cross.git] / i686-linux-gnu-4.7 / usr / include / linux / netfilter / xt_sctp.h
1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2 #ifndef _XT_SCTP_H_
3 #define _XT_SCTP_H_
4
5 #include <linux/types.h>
6
7 #define XT_SCTP_SRC_PORTS               0x01
8 #define XT_SCTP_DEST_PORTS              0x02
9 #define XT_SCTP_CHUNK_TYPES             0x04
10
11 #define XT_SCTP_VALID_FLAGS             0x07
12
13 struct xt_sctp_flag_info {
14         __u8 chunktype;
15         __u8 flag;
16         __u8 flag_mask;
17 };
18
19 #define XT_NUM_SCTP_FLAGS       4
20
21 struct xt_sctp_info {
22         __u16 dpts[2];  /* Min, Max */
23         __u16 spts[2];  /* Min, Max */
24
25         __u32 chunkmap[256 / sizeof (__u32)];  /* Bit mask of chunks to be matched according to RFC 2960 */
26
27 #define SCTP_CHUNK_MATCH_ANY   0x01  /* Match if any of the chunk types are present */
28 #define SCTP_CHUNK_MATCH_ALL   0x02  /* Match if all of the chunk types are present */
29 #define SCTP_CHUNK_MATCH_ONLY  0x04  /* Match if these are the only chunk types present */
30
31         __u32 chunk_match_type;
32         struct xt_sctp_flag_info flag_info[XT_NUM_SCTP_FLAGS];
33         int flag_count;
34
35         __u32 flags;
36         __u32 invflags;
37 };
38
39 #define bytes(type) (sizeof(type) * 8)
40
41 #define SCTP_CHUNKMAP_SET(chunkmap, type)               \
42         do {                                            \
43                 (chunkmap)[type / bytes(__u32)] |=      \
44                         1u << (type % bytes(__u32));    \
45         } while (0)
46
47 #define SCTP_CHUNKMAP_CLEAR(chunkmap, type)                     \
48         do {                                                    \
49                 (chunkmap)[type / bytes(__u32)] &=              \
50                         ~(1u << (type % bytes(__u32))); \
51         } while (0)
52
53 #define SCTP_CHUNKMAP_IS_SET(chunkmap, type)                    \
54 ({                                                              \
55         ((chunkmap)[type / bytes (__u32)] &             \
56                 (1u << (type % bytes (__u32)))) ? 1: 0; \
57 })
58
59 #define SCTP_CHUNKMAP_RESET(chunkmap) \
60         memset((chunkmap), 0, sizeof(chunkmap))
61
62 #define SCTP_CHUNKMAP_SET_ALL(chunkmap) \
63         memset((chunkmap), ~0U, sizeof(chunkmap))
64
65 #define SCTP_CHUNKMAP_COPY(destmap, srcmap) \
66         memcpy((destmap), (srcmap), sizeof(srcmap))
67
68 #define SCTP_CHUNKMAP_IS_CLEAR(chunkmap) \
69         __sctp_chunkmap_is_clear((chunkmap), ARRAY_SIZE(chunkmap))
70 static __inline__ _Bool
71 __sctp_chunkmap_is_clear(const __u32 *chunkmap, unsigned int n)
72 {
73         unsigned int i;
74         for (i = 0; i < n; ++i)
75                 if (chunkmap[i])
76                         return 0;
77         return 1;
78 }
79
80 #define SCTP_CHUNKMAP_IS_ALL_SET(chunkmap) \
81         __sctp_chunkmap_is_all_set((chunkmap), ARRAY_SIZE(chunkmap))
82 static __inline__ _Bool
83 __sctp_chunkmap_is_all_set(const __u32 *chunkmap, unsigned int n)
84 {
85         unsigned int i;
86         for (i = 0; i < n; ++i)
87                 if (chunkmap[i] != ~0U)
88                         return 0;
89         return 1;
90 }
91
92 #endif /* _XT_SCTP_H_ */
93