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