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