]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
proto: add support for meta templates
authorPatrick McHardy <kaber@trash.net>
Wed, 8 Jan 2014 13:02:16 +0000 (13:02 +0000)
committerPatrick McHardy <kaber@trash.net>
Wed, 8 Jan 2014 13:03:19 +0000 (13:03 +0000)
The following two patches will add two new meta expression types that are
used as dependencies in the inet table. To reuse the existing dependency
generation code, add a slightly hackish way to specify meta expressions
as payload dependencies.

Signed-off-by: Patrick McHardy <kaber@trash.net>
include/proto.h
src/payload.c

index de58d4cc2166488a0e4940202ecfc2f2d83f4384..6a280367801c6721c84eeab1313ac8d33d3fc597 100644 (file)
@@ -2,6 +2,7 @@
 #define NFTABLES_PROTO_H
 
 #include <nftables.h>
+#include <linux/netfilter/nf_tables.h>
 
 /**
  * enum proto_bases - protocol bases
@@ -30,12 +31,14 @@ extern const char *proto_base_tokens[];
  * @dtype:     data type of the header field
  * @offset:    offset of the header field from base
  * @len:       length of header field
+ * @meta_key:  special case: meta expression key
  */
 struct proto_hdr_template {
        const char                      *token;
        const struct datatype           *dtype;
        uint16_t                        offset;
        uint16_t                        len;
+       enum nft_meta_keys              meta_key;
 };
 
 #define PROTO_HDR_TEMPLATE(__token, __dtype,  __offset, __len)         \
@@ -46,6 +49,14 @@ struct proto_hdr_template {
                .len            = (__len),                              \
        }
 
+#define PROTO_META_TEMPLATE(__token, __dtype, __key, __len)            \
+       {                                                               \
+               .token          = (__token),                            \
+               .dtype          = (__dtype),                            \
+               .meta_key       = (__key),                              \
+               .len            = (__len),                              \
+       }
+
 #define PROTO_UPPER_MAX                16
 #define PROTO_HDRS_MAX         20
 
index 0ef3c791acb09abca13127e473f40615a025aaec..04a3455e38f0d7fc692109e8dadb6e8527a293c9 100644 (file)
@@ -187,7 +187,11 @@ int payload_gen_dependency(struct eval_ctx *ctx, const struct expr *expr,
                                  desc->name, expr->payload.desc->name);
 
        tmpl = &desc->templates[desc->protocol_key];
-       left = payload_expr_alloc(&expr->location, desc, desc->protocol_key);
+       if (tmpl->meta_key)
+               left = meta_expr_alloc(&expr->location, tmpl->meta_key);
+       else
+               left = payload_expr_alloc(&expr->location, desc, desc->protocol_key);
+
        right = constant_expr_alloc(&expr->location, tmpl->dtype,
                                    BYTEORDER_HOST_ENDIAN,
                                    tmpl->len, &protocol);