Merge branches 'acpi-scan', 'acpi-pnp' and 'acpi-sleep'
[linux-2.6-microblaze.git] / include / net / netfilter / nf_tables.h
index c1c0a4f..f4af836 100644 (file)
@@ -305,8 +305,33 @@ struct nft_set_estimate {
        enum nft_set_class      space;
 };
 
+#define NFT_EXPR_MAXATTR               16
+#define NFT_EXPR_SIZE(size)            (sizeof(struct nft_expr) + \
+                                        ALIGN(size, __alignof__(struct nft_expr)))
+
+/**
+ *     struct nft_expr - nf_tables expression
+ *
+ *     @ops: expression ops
+ *     @data: expression private data
+ */
+struct nft_expr {
+       const struct nft_expr_ops       *ops;
+       unsigned char                   data[]
+               __attribute__((aligned(__alignof__(u64))));
+};
+
+static inline void *nft_expr_priv(const struct nft_expr *expr)
+{
+       return (void *)expr->data;
+}
+
+int nft_expr_clone(struct nft_expr *dst, struct nft_expr *src);
+void nft_expr_destroy(const struct nft_ctx *ctx, struct nft_expr *expr);
+int nft_expr_dump(struct sk_buff *skb, unsigned int attr,
+                 const struct nft_expr *expr);
+
 struct nft_set_ext;
-struct nft_expr;
 
 /**
  *     struct nft_set_ops - nf_tables set operations
@@ -396,6 +421,22 @@ struct nft_set_type {
 };
 #define to_set_type(o) container_of(o, struct nft_set_type, ops)
 
+struct nft_set_elem_expr {
+       u8                              size;
+       unsigned char                   data[]
+               __attribute__((aligned(__alignof__(struct nft_expr))));
+};
+
+#define nft_setelem_expr_at(__elem_expr, __offset)                     \
+       ((struct nft_expr *)&__elem_expr->data[__offset])
+
+#define nft_setelem_expr_foreach(__expr, __elem_expr, __size)          \
+       for (__expr = nft_setelem_expr_at(__elem_expr, 0), __size = 0;  \
+            __size < (__elem_expr)->size;                              \
+            __size += (__expr)->ops->size, __expr = ((void *)(__expr)) + (__expr)->ops->size)
+
+#define NFT_SET_EXPR_MAX       2
+
 /**
  *     struct nft_set - nf_tables set instance
  *
@@ -448,13 +489,14 @@ struct nft_set {
        u16                             policy;
        u16                             udlen;
        unsigned char                   *udata;
-       struct nft_expr                 *expr;
        /* runtime data below here */
        const struct nft_set_ops        *ops ____cacheline_aligned;
        u16                             flags:14,
                                        genmask:2;
        u8                              klen;
        u8                              dlen;
+       u8                              num_exprs;
+       struct nft_expr                 *exprs[NFT_SET_EXPR_MAX];
        unsigned char                   data[]
                __attribute__((aligned(__alignof__(u64))));
 };
@@ -519,7 +561,7 @@ void nf_tables_destroy_set(const struct nft_ctx *ctx, struct nft_set *set);
  *     @NFT_SET_EXT_TIMEOUT: element timeout
  *     @NFT_SET_EXT_EXPIRATION: element expiration time
  *     @NFT_SET_EXT_USERDATA: user data associated with the element
- *     @NFT_SET_EXT_EXPR: expression assiociated with the element
+ *     @NFT_SET_EXT_EXPRESSIONS: expressions assiciated with the element
  *     @NFT_SET_EXT_OBJREF: stateful object reference associated with element
  *     @NFT_SET_EXT_NUM: number of extension types
  */
@@ -531,7 +573,7 @@ enum nft_set_extensions {
        NFT_SET_EXT_TIMEOUT,
        NFT_SET_EXT_EXPIRATION,
        NFT_SET_EXT_USERDATA,
-       NFT_SET_EXT_EXPR,
+       NFT_SET_EXT_EXPRESSIONS,
        NFT_SET_EXT_OBJREF,
        NFT_SET_EXT_NUM
 };
@@ -649,9 +691,9 @@ static inline struct nft_userdata *nft_set_ext_userdata(const struct nft_set_ext
        return nft_set_ext(ext, NFT_SET_EXT_USERDATA);
 }
 
-static inline struct nft_expr *nft_set_ext_expr(const struct nft_set_ext *ext)
+static inline struct nft_set_elem_expr *nft_set_ext_expr(const struct nft_set_ext *ext)
 {
-       return nft_set_ext(ext, NFT_SET_EXT_EXPR);
+       return nft_set_ext(ext, NFT_SET_EXT_EXPRESSIONS);
 }
 
 static inline bool nft_set_elem_expired(const struct nft_set_ext *ext)
@@ -794,7 +836,6 @@ struct nft_offload_ctx;
  *     @validate: validate expression, called during loop detection
  *     @data: extra data to attach to this expression operation
  */
-struct nft_expr;
 struct nft_expr_ops {
        void                            (*eval)(const struct nft_expr *expr,
                                                struct nft_regs *regs,
@@ -830,32 +871,6 @@ struct nft_expr_ops {
        void                            *data;
 };
 
-#define NFT_EXPR_MAXATTR               16
-#define NFT_EXPR_SIZE(size)            (sizeof(struct nft_expr) + \
-                                        ALIGN(size, __alignof__(struct nft_expr)))
-
-/**
- *     struct nft_expr - nf_tables expression
- *
- *     @ops: expression ops
- *     @data: expression private data
- */
-struct nft_expr {
-       const struct nft_expr_ops       *ops;
-       unsigned char                   data[]
-               __attribute__((aligned(__alignof__(u64))));
-};
-
-static inline void *nft_expr_priv(const struct nft_expr *expr)
-{
-       return (void *)expr->data;
-}
-
-int nft_expr_clone(struct nft_expr *dst, struct nft_expr *src);
-void nft_expr_destroy(const struct nft_ctx *ctx, struct nft_expr *expr);
-int nft_expr_dump(struct sk_buff *skb, unsigned int attr,
-                 const struct nft_expr *expr);
-
 /**
  *     struct nft_rule - nf_tables rule
  *
@@ -908,11 +923,17 @@ static inline void nft_set_elem_update_expr(const struct nft_set_ext *ext,
                                            struct nft_regs *regs,
                                            const struct nft_pktinfo *pkt)
 {
+       struct nft_set_elem_expr *elem_expr;
        struct nft_expr *expr;
-
-       if (__nft_set_ext_exists(ext, NFT_SET_EXT_EXPR)) {
-               expr = nft_set_ext_expr(ext);
-               expr->ops->eval(expr, regs, pkt);
+       u32 size;
+
+       if (__nft_set_ext_exists(ext, NFT_SET_EXT_EXPRESSIONS)) {
+               elem_expr = nft_set_ext_expr(ext);
+               nft_setelem_expr_foreach(expr, elem_expr, size) {
+                       expr->ops->eval(expr, regs, pkt);
+                       if (regs->verdict.code == NFT_BREAK)
+                               return;
+               }
        }
 }