Signed-off-by: Pablo Neira Ayuso <[email protected]>
---
 include/ct.h                        |  3 +--
 include/linux/netfilter/nf_tables.h | 12 ++++++++++--
 src/ct.c                            | 21 +++++++++++++++++++--
 src/evaluate.c                      |  2 +-
 src/netlink_delinearize.c           |  2 +-
 src/parser_bison.y                  | 14 ++++++++------
 6 files changed, 40 insertions(+), 14 deletions(-)

diff --git a/include/ct.h b/include/ct.h
index 2c3392d36c94..27bbdc4ca43a 100644
--- a/include/ct.h
+++ b/include/ct.h
@@ -24,8 +24,7 @@ struct ct_template {
 }
 
 extern struct expr *ct_expr_alloc(const struct location *loc,
-                                 enum nft_ct_keys key, int8_t direction,
-                                 uint8_t nfproto);
+                                 enum nft_ct_keys key, int8_t direction);
 extern void ct_expr_update_type(struct proto_ctx *ctx, struct expr *expr);
 
 extern struct stmt *notrack_stmt_alloc(const struct location *loc);
diff --git a/include/linux/netfilter/nf_tables.h 
b/include/linux/netfilter/nf_tables.h
index 517a39a00e3d..9aa29e43f36d 100644
--- a/include/linux/netfilter/nf_tables.h
+++ b/include/linux/netfilter/nf_tables.h
@@ -909,8 +909,8 @@ enum nft_rt_attributes {
  * @NFT_CT_EXPIRATION: relative conntrack expiration time in ms
  * @NFT_CT_HELPER: connection tracking helper assigned to conntrack
  * @NFT_CT_L3PROTOCOL: conntrack layer 3 protocol
- * @NFT_CT_SRC: conntrack layer 3 protocol source (IPv4/IPv6 address)
- * @NFT_CT_DST: conntrack layer 3 protocol destination (IPv4/IPv6 address)
+ * @NFT_CT_SRC: conntrack layer 3 protocol source (IPv4/IPv6 address, 
deprecated)
+ * @NFT_CT_DST: conntrack layer 3 protocol destination (IPv4/IPv6 address, 
deprecated)
  * @NFT_CT_PROTOCOL: conntrack layer 4 protocol
  * @NFT_CT_PROTO_SRC: conntrack layer 4 protocol source
  * @NFT_CT_PROTO_DST: conntrack layer 4 protocol destination
@@ -920,6 +920,10 @@ enum nft_rt_attributes {
  * @NFT_CT_AVGPKT: conntrack average bytes per packet
  * @NFT_CT_ZONE: conntrack zone
  * @NFT_CT_EVENTMASK: ctnetlink events to be generated for this conntrack
+ * @NFT_CT_SRC_IP: conntrack layer 3 protocol source (IPv4 address)
+ * @NFT_CT_DST_IP: conntrack layer 3 protocol destination (IPv4 address)
+ * @NFT_CT_SRC_IP6: conntrack layer 3 protocol source (IPv6 address)
+ * @NFT_CT_DST_IP6: conntrack layer 3 protocol destination (IPv6 address)
  */
 enum nft_ct_keys {
        NFT_CT_STATE,
@@ -941,6 +945,10 @@ enum nft_ct_keys {
        NFT_CT_AVGPKT,
        NFT_CT_ZONE,
        NFT_CT_EVENTMASK,
+       NFT_CT_SRC_IP,
+       NFT_CT_DST_IP,
+       NFT_CT_SRC_IP6,
+       NFT_CT_DST_IP6,
 };
 
 /**
diff --git a/src/ct.c b/src/ct.c
index edfe5586ebe6..96d0a931d4af 100644
--- a/src/ct.c
+++ b/src/ct.c
@@ -269,6 +269,14 @@ static const struct ct_template ct_templates[] = {
                                              BYTEORDER_HOST_ENDIAN, 16),
        [NFT_CT_EVENTMASK]      = CT_TEMPLATE("event", &ct_event_type,
                                              BYTEORDER_HOST_ENDIAN, 32),
+       [NFT_CT_SRC_IP]         = CT_TEMPLATE("ip saddr", &ipaddr_type,
+                                             BYTEORDER_BIG_ENDIAN, 0),
+       [NFT_CT_DST_IP]         = CT_TEMPLATE("ip daddr", &ipaddr_type,
+                                             BYTEORDER_BIG_ENDIAN, 0),
+       [NFT_CT_SRC_IP6]        = CT_TEMPLATE("ip6 saddr", &ip6addr_type,
+                                             BYTEORDER_BIG_ENDIAN, 0),
+       [NFT_CT_DST_IP6]        = CT_TEMPLATE("ip6 daddr", &ip6addr_type,
+                                             BYTEORDER_BIG_ENDIAN, 0),
 };
 
 static void ct_print(enum nft_ct_keys key, int8_t dir, uint8_t nfproto,
@@ -349,7 +357,7 @@ static const struct expr_ops ct_expr_ops = {
 };
 
 struct expr *ct_expr_alloc(const struct location *loc, enum nft_ct_keys key,
-                          int8_t direction, uint8_t nfproto)
+                          int8_t direction)
 {
        const struct ct_template *tmpl = &ct_templates[key];
        struct expr *expr;
@@ -358,7 +366,6 @@ struct expr *ct_expr_alloc(const struct location *loc, enum 
nft_ct_keys key,
                          tmpl->byteorder, tmpl->len);
        expr->ct.key = key;
        expr->ct.direction = direction;
-       expr->ct.nfproto = nfproto;
 
        switch (key) {
        case NFT_CT_SRC:
@@ -409,6 +416,16 @@ void ct_expr_update_type(struct proto_ctx *ctx, struct 
expr *expr)
                        break;
                expr->dtype = &inet_service_type;
                break;
+       case NFT_CT_SRC_IP:
+       case NFT_CT_DST_IP:
+               expr->dtype = &ipaddr_type;
+               expr->len = expr->dtype->size;
+               break;
+       case NFT_CT_SRC_IP6:
+       case NFT_CT_DST_IP6:
+               expr->dtype = &ip6addr_type;
+               expr->len = expr->dtype->size;
+               break;
        default:
                break;
        }
diff --git a/src/evaluate.c b/src/evaluate.c
index a2c1c7283d6a..86337c6e12f2 100644
--- a/src/evaluate.c
+++ b/src/evaluate.c
@@ -734,7 +734,7 @@ static int ct_gen_nh_dependency(struct eval_ctx *ctx, 
struct expr *ct)
                return 0;
        }
 
-       left = ct_expr_alloc(&ct->location, NFT_CT_L3PROTOCOL, 
ct->ct.direction, ct->ct.nfproto);
+       left = ct_expr_alloc(&ct->location, NFT_CT_L3PROTOCOL, 
ct->ct.direction);
 
        right = constant_expr_alloc(&ct->location, left->dtype,
                                    left->dtype->byteorder, left->len,
diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c
index d65aacf8b616..2171d2067b22 100644
--- a/src/netlink_delinearize.c
+++ b/src/netlink_delinearize.c
@@ -735,7 +735,7 @@ static void netlink_parse_ct_expr(struct netlink_parse_ctx 
*ctx,
                dir = nftnl_expr_get_u8(nle, NFTNL_EXPR_CT_DIR);
 
        key  = nftnl_expr_get_u32(nle, NFTNL_EXPR_CT_KEY);
-       expr = ct_expr_alloc(loc, key, dir, NFPROTO_UNSPEC);
+       expr = ct_expr_alloc(loc, key, dir);
 
        dreg = netlink_parse_register(nle, NFTNL_EXPR_CT_DREG);
        netlink_set_register(ctx, dreg, expr);
diff --git a/src/parser_bison.y b/src/parser_bison.y
index 2ccaf9abd751..9c32dbb7ff07 100644
--- a/src/parser_bison.y
+++ b/src/parser_bison.y
@@ -3548,15 +3548,15 @@ rt_key                  :       CLASSID         { $$ = 
NFT_RT_CLASSID; }
 
 ct_expr                        :       CT      ct_key
                        {
-                               $$ = ct_expr_alloc(&@$, $2, -1, NFPROTO_UNSPEC);
+                               $$ = ct_expr_alloc(&@$, $2, -1);
                        }
                        |       CT      ct_dir  ct_key_dir
                        {
-                               $$ = ct_expr_alloc(&@$, $3, $2, NFPROTO_UNSPEC);
+                               $$ = ct_expr_alloc(&@$, $3, $2);
                        }
-                       |       CT      ct_dir  nf_key_proto ct_key_proto_field
+                       |       CT      ct_dir  ct_key_proto_field
                        {
-                               $$ = ct_expr_alloc(&@$, $4, $2, $3);
+                               $$ = ct_expr_alloc(&@$, $3, $2);
                        }
                        ;
 
@@ -3590,8 +3590,10 @@ ct_key_dir               :       SADDR           { $$ = 
NFT_CT_SRC; }
                        |       ct_key_dir_optional
                        ;
 
-ct_key_proto_field     :       SADDR           { $$ = NFT_CT_SRC; }
-                       |       DADDR           { $$ = NFT_CT_DST; }
+ct_key_proto_field     :       IP      SADDR   { $$ = NFT_CT_SRC_IP; }
+                       |       IP      DADDR   { $$ = NFT_CT_DST_IP; }
+                       |       IP6     SADDR   { $$ = NFT_CT_SRC_IP6; }
+                       |       IP6     DADDR   { $$ = NFT_CT_DST_IP6; }
                        ;
 
 ct_key_dir_optional    :       BYTES           { $$ = NFT_CT_BYTES; }
-- 
2.11.0

--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to