From patchwork Thu Jan 18 18:51:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Harsha Sharma X-Patchwork-Id: 863092 X-Patchwork-Delegate: pablo@netfilter.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netfilter-devel-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="HVYaU4uz"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zMtNR34kmz9s7M for ; Fri, 19 Jan 2018 05:51:51 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755589AbeARSvu (ORCPT ); Thu, 18 Jan 2018 13:51:50 -0500 Received: from mail-pf0-f196.google.com ([209.85.192.196]:39554 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752368AbeARSvt (ORCPT ); Thu, 18 Jan 2018 13:51:49 -0500 Received: by mail-pf0-f196.google.com with SMTP id e11so15334866pff.6 for ; Thu, 18 Jan 2018 10:51:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=/5lqxlnoLXUuyn/Y7srA7y1YXPQ8+BFXXvanq0Jq2tc=; b=HVYaU4uzEx8QLhP8/MF3NAtCrlA+ZiIn0QS1U8mAhnPh2qATzIFADWBzhCMZCKpflG 8uaBl/AVd7Iux0OHGoJLRynivnG0+yXOHlPjsUpqkwQ6Ko7wn7E+LJRFiygFD0V67r1W bK9Vve4R6IUAhQ3XRNTJZ/7lWEGMxBIV+g6t84hs7s+y6V9k6mMlIoMw9ZhVZTfkWCoV qnKdNfILeFNZoSD20p37H7oqSbI1xd9TKBmb0V6mrMENXt+Ho+1VEGuoAcnFgwmO53nZ +it71x86xSQxRBEJpnGAPBiDey1oWIj0zyyt8NuPMvH15Z9rOszC+UfbJPauPBZ1DnGw M2aQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=/5lqxlnoLXUuyn/Y7srA7y1YXPQ8+BFXXvanq0Jq2tc=; b=NZ2CbSlJmAZ3kDQTmNqIH7MUzgJmSxGo/69Smx0XJvVMpAQIuluw3CJgrUuGRnRrzM SNSxio9wjZ/LrhBR35gk4Ogv0KaZXzMVR+aSifOGuvNKLnx5f/VNgib8yS5gF7d3uBy8 62+clShv66yyWjWB0vNWI3Dx5cG2G9+8ABRvKgO2PxXxs0b47yjEYjp/GjjH7NFjmDvt Zp01nSI7+0kw5tsZEx9YsSf3yRcM8aNB70mOnbNzU3uIBcNn1yuqCIOroswFPQk5sjjW ZcwSJOxjxXash1L6QQkpyl+eLe1fwbg+rWN0ueNxaxK4GZ2er9Bl5XmRk0GRc6KiC/Xc xuPA== X-Gm-Message-State: AKwxytc7BKHK8dL8DdKwxrQEBtzrBFCNwxLETMCVgTePbcIQYeKADkWg sU1vdo5FJjfSY4aFhdhJe1k= X-Google-Smtp-Source: ACJfBotbH5w4dg2n1ceamojrd5Srdhfl/czHTkkYU5lerGm9tU0MhgeJN8HZnDYb9wStCn2wbcLqLA== X-Received: by 10.101.68.138 with SMTP id l10mr7705768pgq.150.1516301508548; Thu, 18 Jan 2018 10:51:48 -0800 (PST) Received: from localhost.localdomain ([103.37.201.122]) by smtp.gmail.com with ESMTPSA id c184sm13642862pfc.60.2018.01.18.10.51.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 18 Jan 2018 10:51:47 -0800 (PST) From: Harsha Sharma To: pablo@netfilter.org, harshasharmaiitr@gmail.com Cc: netfilter-devel@vger.kernel.org Subject: [PATCH] src: parse new handle attribute for objects Date: Fri, 19 Jan 2018 00:21:32 +0530 Message-Id: <20180118185132.8730-1-harshasharmaiitr@gmail.com> X-Mailer: git-send-email 2.11.0 Sender: netfilter-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netfilter-devel@vger.kernel.org This patch add code to allocate object handles and delete objects via object handles. Signed-off-by: Harsha Sharma --- include/libnftnl/object.h | 1 + include/linux/netfilter/nf_tables.h | 2 ++ include/obj.h | 1 + src/object.c | 20 +++++++++++++++++++- 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/include/libnftnl/object.h b/include/libnftnl/object.h index 1c3bc7c..f4be8ce 100644 --- a/include/libnftnl/object.h +++ b/include/libnftnl/object.h @@ -19,6 +19,7 @@ enum { NFTNL_OBJ_FAMILY, NFTNL_OBJ_USE, NFTNL_OBJ_BASE = 16, + NFTNL_OBJ_HANDLE, __NFTNL_OBJ_MAX }; #define NFTNL_OBJ_MAX (__NFTNL_OBJ_MAX - 1) diff --git a/include/linux/netfilter/nf_tables.h b/include/linux/netfilter/nf_tables.h index 120fa23..e9a8ba1 100644 --- a/include/linux/netfilter/nf_tables.h +++ b/include/linux/netfilter/nf_tables.h @@ -1291,6 +1291,7 @@ enum nft_ct_helper_attributes { * * @NFTA_OBJ_TABLE: name of the table containing the expression (NLA_STRING) * @NFTA_OBJ_NAME: name of this expression type (NLA_STRING) + * @NFTA_OBJ_HANDLE: numeric object handle (NLA_U64) * @NFTA_OBJ_TYPE: stateful object type (NLA_U32) * @NFTA_OBJ_DATA: stateful object data (NLA_NESTED) * @NFTA_OBJ_USE: number of references to this expression (NLA_U32) @@ -1302,6 +1303,7 @@ enum nft_object_attributes { NFTA_OBJ_TYPE, NFTA_OBJ_DATA, NFTA_OBJ_USE, + NFTA_OBJ_HANDLE, __NFTA_OBJ_MAX }; #define NFTA_OBJ_MAX (__NFTA_OBJ_MAX - 1) diff --git a/include/obj.h b/include/obj.h index d17d63a..4a728c8 100644 --- a/include/obj.h +++ b/include/obj.h @@ -19,6 +19,7 @@ struct nftnl_obj { uint32_t use; uint32_t flags; + uint64_t handle; union { struct nftnl_obj_counter { diff --git a/src/object.c b/src/object.c index da3423b..e20e820 100644 --- a/src/object.c +++ b/src/object.c @@ -66,6 +66,7 @@ EXPORT_SYMBOL(nftnl_obj_is_set); static uint32_t nftnl_obj_validate[NFTNL_OBJ_MAX + 1] = { [NFTNL_OBJ_FAMILY] = sizeof(uint32_t), [NFTNL_OBJ_USE] = sizeof(uint32_t), + [NFTNL_OBJ_HANDLE] = sizeof(uint64_t), }; void nftnl_obj_set_data(struct nftnl_obj *obj, uint16_t attr, @@ -94,6 +95,9 @@ void nftnl_obj_set_data(struct nftnl_obj *obj, uint16_t attr, case NFTNL_OBJ_USE: obj->use = *((uint32_t *)data); break; + case NFTNL_OBJ_HANDLE: + obj->handle = *((uint64_t *)data); + break; default: if (obj->ops) obj->ops->set(obj, attr, data, data_len); @@ -162,6 +166,9 @@ const void *nftnl_obj_get_data(struct nftnl_obj *obj, uint16_t attr, case NFTNL_OBJ_USE: *data_len = sizeof(uint32_t); return &obj->use; + case NFTNL_OBJ_HANDLE: + *data_len = sizeof(uint64_t); + return &obj->handle; default: if (obj->ops) return obj->ops->get(obj, attr, data_len); @@ -221,7 +228,8 @@ void nftnl_obj_nlmsg_build_payload(struct nlmsghdr *nlh, mnl_attr_put_strz(nlh, NFTA_OBJ_NAME, obj->name); if (obj->flags & (1 << NFTNL_OBJ_TYPE)) mnl_attr_put_u32(nlh, NFTA_OBJ_TYPE, htonl(obj->ops->type)); - + if (obj->flags & (1 << NFTNL_OBJ_HANDLE)) + mnl_attr_put_u64(nlh, NFTA_OBJ_HANDLE, htobe64(obj->handle)); if (obj->ops) { struct nlattr *nest = mnl_attr_nest_start(nlh, NFTA_OBJ_DATA); @@ -245,6 +253,10 @@ static int nftnl_obj_parse_attr_cb(const struct nlattr *attr, void *data) if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0) abi_breakage(); break; + case NFTA_OBJ_HANDLE: + if (mnl_attr_validate(attr, MNL_TYPE_U64) < 0) + abi_breakage(); + break; case NFTA_OBJ_DATA: if (mnl_attr_validate(attr, MNL_TYPE_NESTED) < 0) abi_breakage(); @@ -294,6 +306,10 @@ int nftnl_obj_nlmsg_parse(const struct nlmsghdr *nlh, struct nftnl_obj *obj) obj->use = ntohl(mnl_attr_get_u32(tb[NFTA_OBJ_USE])); obj->flags |= (1 << NFTNL_OBJ_USE); } + if (tb[NFTA_OBJ_HANDLE]) { + obj->handle = be64toh(mnl_attr_get_u64(tb[NFTA_OBJ_HANDLE])); + obj->flags |= (1 << NFTNL_OBJ_HANDLE); + } obj->family = nfg->nfgen_family; obj->flags |= (1 << NFTNL_OBJ_FAMILY); @@ -409,6 +425,8 @@ static int nftnl_obj_export(char *buf, size_t size, nftnl_buf_str(&b, type, nftnl_family2str(obj->family), FAMILY); if (obj->flags & (1 << NFTNL_OBJ_USE)) nftnl_buf_u32(&b, type, obj->use, USE); + if (obj->flags & (1 << NFTNL_OBJ_HANDLE)) + nftnl_buf_u64(&b, type, obj->handle, HANDLE); if (obj->ops) ret = obj->ops->snprintf(buf + b.len, size - b.len, type,