linux/include/uapi/linux/netfilter/xt_sctp.h
<<
>>
Prefs
   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
  13struct xt_sctp_flag_info {
  14        __u8 chunktype;
  15        __u8 flag;
  16        __u8 flag_mask;
  17};
  18
  19#define XT_NUM_SCTP_FLAGS       4
  20
  21struct 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))
  70static 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))
  82static 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
  94