Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.2/patches/805166/?format=api
{ "id": 805166, "url": "http://patchwork.ozlabs.org/api/1.2/patches/805166/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netfilter-devel/patch/20170823204224.31534-1-pablombg@gmail.com/", "project": { "id": 26, "url": "http://patchwork.ozlabs.org/api/1.2/projects/26/?format=api", "name": "Netfilter Development", "link_name": "netfilter-devel", "list_id": "netfilter-devel.vger.kernel.org", "list_email": "netfilter-devel@vger.kernel.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20170823204224.31534-1-pablombg@gmail.com>", "list_archive_url": null, "date": "2017-08-23T20:42:24", "name": "[libnftnl] src: limit stateful object support", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "a33defc4f7a4a0fd6168b70fd6b4f61e1a55211a", "submitter": { "id": 67698, "url": "http://patchwork.ozlabs.org/api/1.2/people/67698/?format=api", "name": "Pablo M. Bermudo Garay", "email": "pablombg@gmail.com" }, "delegate": { "id": 6139, "url": "http://patchwork.ozlabs.org/api/1.2/users/6139/?format=api", "username": "pablo", "first_name": "Pablo", "last_name": "Neira", "email": "pablo@netfilter.org" }, "mbox": "http://patchwork.ozlabs.org/project/netfilter-devel/patch/20170823204224.31534-1-pablombg@gmail.com/mbox/", "series": [], "comments": "http://patchwork.ozlabs.org/api/patches/805166/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/805166/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<netfilter-devel-owner@vger.kernel.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org", "Authentication-Results": [ "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netfilter-devel-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)", "ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"dBeRuZl0\"; dkim-atps=neutral" ], "Received": [ "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xczrY19W0z9t3C\n\tfor <incoming@patchwork.ozlabs.org>;\n\tThu, 24 Aug 2017 06:42:37 +1000 (AEST)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1754206AbdHWUmf (ORCPT <rfc822;incoming@patchwork.ozlabs.org>);\n\tWed, 23 Aug 2017 16:42:35 -0400", "from mail-wr0-f193.google.com ([209.85.128.193]:36206 \"EHLO\n\tmail-wr0-f193.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1751774AbdHWUmd (ORCPT\n\t<rfc822;netfilter-devel@vger.kernel.org>);\n\tWed, 23 Aug 2017 16:42:33 -0400", "by mail-wr0-f193.google.com with SMTP id u17so374570wrf.3\n\tfor <netfilter-devel@vger.kernel.org>;\n\tWed, 23 Aug 2017 13:42:32 -0700 (PDT)", "from localhost.localdomain (75.red-88-9-82.dynamicip.rima-tde.net.\n\t[88.9.82.75]) by smtp.gmail.com with ESMTPSA id\n\tu46sm4155090wrf.15.2017.08.23.13.42.30\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tWed, 23 Aug 2017 13:42:31 -0700 (PDT)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=gmail.com; s=20161025;\n\th=from:to:cc:subject:date:message-id;\n\tbh=kejyTEp/csGFipGAzJZ2kl6uN4sYePzR2GwmBDMRWWM=;\n\tb=dBeRuZl0IRdynzusS3V1OL2vsZdRqHKDtdi5ACAlQS31reDfFB9/QM/bIxyyX4NZDA\n\tqaRYXumVjj2oc5OPsE6qe8+oFoVmcD2N8MHUfdFdFyO46ZqCOQr5nVj/lX4jy/3JOf8T\n\tDabG2edOVKTrEgFo87XfzJNnr9jLHjezqNu4+TN0P3Wd1ujBcYO27yEMkVTAaTQPp1fc\n\tS/OLItzOtaTK7bq4ekif0pbkGX39Dbq7hLsXA9kdlIRQ3CPJ0k1PZMP/mnWUmpQ6mfIy\n\tfMwsA0weQKQ9Su5xRMb8C/DRzqYDNMM4nRbSv48lewakZHxFv9lz3hrZFz2IsR/fIc7A\n\tf/Ig==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id;\n\tbh=kejyTEp/csGFipGAzJZ2kl6uN4sYePzR2GwmBDMRWWM=;\n\tb=SmvGJ+LvFMIwwCZQjFidrl+LppfdnsJL2iNXxnEwLU4Qdv38+6Ziry5bTb6wmApys8\n\tlj5BxAPBGvSQthXDNvSGy1ml1Dha+rH7w+VcSmb+WqSeJGyrVmMz0nvl9OQABBvXfBFW\n\tMzOE0nA57FpkGXy7dATo8y5ql/nTJKCw81hoLv3h0Ub6L7YTlsYHJizLay9TVKYY2D3x\n\t67ePW9v/FHVhLN53nectYXencqkq5CP1ge1r2fGyKKwJCRhBuIPqXsU/5y4fk1PzlucA\n\tRyeYmT9GWHF2AZV4BuIKcgWcAFXLu0LcCTtCczmG6zog0saDHdFCWMHjeLRHk65DmBwY\n\tfbMg==", "X-Gm-Message-State": "AHYfb5j60YHXPL5g/UYj9ABYfXrSWHrdB4RBuZFxvvjOzC4OOH7Uq+q2\n\tZMgDv2zteZb+Zp/YfuE=", "X-Received": "by 10.223.188.5 with SMTP id s5mr1669143wrg.278.1503520951933;\n\tWed, 23 Aug 2017 13:42:31 -0700 (PDT)", "From": "\"Pablo M. Bermudo Garay\" <pablombg@gmail.com>", "To": "netfilter-devel@vger.kernel.org", "Cc": "pablo@netfilter.org, \"Pablo M. Bermudo Garay\" <pablombg@gmail.com>", "Subject": "[PATCH libnftnl] src: limit stateful object support", "Date": "Wed, 23 Aug 2017 22:42:24 +0200", "Message-Id": "<20170823204224.31534-1-pablombg@gmail.com>", "X-Mailer": "git-send-email 2.14.1", "Sender": "netfilter-devel-owner@vger.kernel.org", "Precedence": "bulk", "List-ID": "<netfilter-devel.vger.kernel.org>", "X-Mailing-List": "netfilter-devel@vger.kernel.org" }, "content": "This patch adds support for a new type of stateful object: limit.\n\nSigned-off-by: Pablo M. Bermudo Garay <pablombg@gmail.com>\n---\n include/libnftnl/object.h | 8 ++\n include/linux/netfilter/nf_tables.h | 3 +-\n include/obj.h | 8 ++\n src/Makefile.am | 1 +\n src/obj/limit.c | 238 ++++++++++++++++++++++++++++++++++++\n src/object.c | 3 +-\n 6 files changed, 259 insertions(+), 2 deletions(-)\n create mode 100644 src/obj/limit.c", "diff": "diff --git a/include/libnftnl/object.h b/include/libnftnl/object.h\nindex ccd9d19..1c3bc7c 100644\n--- a/include/libnftnl/object.h\n+++ b/include/libnftnl/object.h\n@@ -40,6 +40,14 @@ enum {\n \tNFTNL_OBJ_CT_HELPER_L4PROTO,\n };\n \n+enum {\n+\tNFTNL_OBJ_LIMIT_RATE\t= NFTNL_OBJ_BASE,\n+\tNFTNL_OBJ_LIMIT_UNIT,\n+\tNFTNL_OBJ_LIMIT_BURST,\n+\tNFTNL_OBJ_LIMIT_TYPE,\n+\tNFTNL_OBJ_LIMIT_FLAGS,\n+};\n+\n struct nftnl_obj;\n \n struct nftnl_obj *nftnl_obj_alloc(void);\ndiff --git a/include/linux/netfilter/nf_tables.h b/include/linux/netfilter/nf_tables.h\nindex 2e174d8..874fa3f 100644\n--- a/include/linux/netfilter/nf_tables.h\n+++ b/include/linux/netfilter/nf_tables.h\n@@ -1278,7 +1278,8 @@ enum nft_ct_helper_attributes {\n #define NFT_OBJECT_COUNTER\t1\n #define NFT_OBJECT_QUOTA\t2\n #define NFT_OBJECT_CT_HELPER\t3\n-#define __NFT_OBJECT_MAX\t4\n+#define NFT_OBJECT_LIMIT\t4\n+#define __NFT_OBJECT_MAX\t5\n #define NFT_OBJECT_MAX\t\t(__NFT_OBJECT_MAX - 1)\n \n /**\ndiff --git a/include/obj.h b/include/obj.h\nindex d90919f..d17d63a 100644\n--- a/include/obj.h\n+++ b/include/obj.h\n@@ -35,6 +35,13 @@ struct nftnl_obj {\n \t\t\tuint8_t\t\tl4proto;\n \t\t\tchar\t\tname[16];\n \t\t} ct_helper;\n+\t\tstruct nftnl_obj_limit {\n+\t\t\tuint64_t\trate;\n+\t\t\tuint64_t\tunit;\n+\t\t\tuint32_t\tburst;\n+\t\t\tuint32_t\ttype;\n+\t\t\tuint32_t\tflags;\n+\t\t} limit;\n \t} data;\n };\n \n@@ -55,6 +62,7 @@ struct obj_ops {\n extern struct obj_ops obj_ops_counter;\n extern struct obj_ops obj_ops_quota;\n extern struct obj_ops obj_ops_ct_helper;\n+extern struct obj_ops obj_ops_limit;\n \n #define nftnl_obj_data(obj) (void *)&obj->data\n \ndiff --git a/src/Makefile.am b/src/Makefile.am\nindex 77b67b2..59ddf6a 100644\n--- a/src/Makefile.am\n+++ b/src/Makefile.am\n@@ -55,4 +55,5 @@ libnftnl_la_SOURCES = utils.c\t\t\\\n \t\t obj/counter.c\t\\\n \t\t obj/ct_helper.c\t\\\n \t\t obj/quota.c\t\\\n+\t\t obj/limit.c\t\\\n \t\t libnftnl.map\ndiff --git a/src/obj/limit.c b/src/obj/limit.c\nnew file mode 100644\nindex 0000000..8cf0faa\n--- /dev/null\n+++ b/src/obj/limit.c\n@@ -0,0 +1,238 @@\n+/*\n+ * Copyright (c) 2017 Pablo M. Bermudo Garay <pablombg@gmail.com>\n+ *\n+ * This program is free software; you can redistribute it and/or modify\n+ * it under the terms of the GNU General Public License as published\n+ * by the Free Software Foundation; either version 2 of the License, or\n+ * (at your option) any later version.\n+ */\n+\n+#include <stdio.h>\n+#include <stdint.h>\n+#include <arpa/inet.h>\n+#include <errno.h>\n+#include <inttypes.h>\n+\n+#include <linux/netfilter/nf_tables.h>\n+\n+#include \"internal.h\"\n+#include <libmnl/libmnl.h>\n+#include <libnftnl/object.h>\n+\n+#include \"obj.h\"\n+\n+static int nftnl_obj_limit_set(struct nftnl_obj *e, uint16_t type,\n+\t\t\t const void *data, uint32_t data_len)\n+{\n+\tstruct nftnl_obj_limit *limit = nftnl_obj_data(e);\n+\n+\tswitch (type) {\n+\tcase NFTNL_OBJ_LIMIT_RATE:\n+\t\tlimit->rate = *((uint64_t *)data);\n+\t\tbreak;\n+\tcase NFTNL_OBJ_LIMIT_UNIT:\n+\t\tlimit->unit = *((uint64_t *)data);\n+\t\tbreak;\n+\tcase NFTNL_OBJ_LIMIT_BURST:\n+\t\tlimit->burst = *((uint32_t *)data);\n+\t\tbreak;\n+\tcase NFTNL_OBJ_LIMIT_TYPE:\n+\t\tlimit->type = *((uint32_t *)data);\n+\t\tbreak;\n+\tcase NFTNL_OBJ_LIMIT_FLAGS:\n+\t\tlimit->flags = *((uint32_t *)data);\n+\t\tbreak;\n+\tdefault:\n+\t\treturn -1;\n+\t}\n+\treturn 0;\n+}\n+\n+static const void *nftnl_obj_limit_get(const struct nftnl_obj *e,\n+\t\t\t\t uint16_t type, uint32_t *data_len)\n+{\n+\tstruct nftnl_obj_limit *limit = nftnl_obj_data(e);\n+\n+\tswitch (type) {\n+\tcase NFTNL_OBJ_LIMIT_RATE:\n+\t\t*data_len = sizeof(limit->rate);\n+\t\treturn &limit->rate;\n+\tcase NFTNL_OBJ_LIMIT_UNIT:\n+\t\t*data_len = sizeof(limit->unit);\n+\t\treturn &limit->unit;\n+\tcase NFTNL_OBJ_LIMIT_BURST:\n+\t\t*data_len = sizeof(limit->burst);\n+\t\treturn &limit->burst;\n+\tcase NFTNL_OBJ_LIMIT_TYPE:\n+\t\t*data_len = sizeof(limit->type);\n+\t\treturn &limit->type;\n+\tcase NFTNL_OBJ_LIMIT_FLAGS:\n+\t\t*data_len = sizeof(limit->flags);\n+\t\treturn &limit->flags;\n+\t}\n+\treturn NULL;\n+}\n+\n+static int nftnl_obj_limit_cb(const struct nlattr *attr, void *data)\n+{\n+\tint type = mnl_attr_get_type(attr);\n+\tconst struct nlattr **tb = data;\n+\n+\tif (mnl_attr_type_valid(attr, NFTA_LIMIT_MAX) < 0)\n+\t\treturn MNL_CB_OK;\n+\n+\tswitch (type) {\n+\tcase NFTA_LIMIT_RATE:\n+\tcase NFTA_LIMIT_UNIT:\n+\t\tif (mnl_attr_validate(attr, MNL_TYPE_U64) < 0)\n+\t\t\tabi_breakage();\n+\t\tbreak;\n+\tcase NFTA_LIMIT_BURST:\n+\tcase NFTA_LIMIT_TYPE:\n+\tcase NFTA_LIMIT_FLAGS:\n+\t\tif (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)\n+\t\t\tabi_breakage();\n+\t\tbreak;\n+\t}\n+\n+\ttb[type] = attr;\n+\treturn MNL_CB_OK;\n+}\n+\n+static void nftnl_obj_limit_build(struct nlmsghdr *nlh,\n+\t\t\t\t const struct nftnl_obj *e)\n+{\n+\tstruct nftnl_obj_limit *limit = nftnl_obj_data(e);\n+\n+\tif (e->flags & (1 << NFTNL_OBJ_LIMIT_RATE))\n+\t\tmnl_attr_put_u64(nlh, NFTA_LIMIT_RATE, htobe64(limit->rate));\n+\tif (e->flags & (1 << NFTNL_OBJ_LIMIT_UNIT))\n+\t\tmnl_attr_put_u64(nlh, NFTA_LIMIT_UNIT, htobe64(limit->unit));\n+\tif (e->flags & (1 << NFTNL_OBJ_LIMIT_BURST))\n+\t\tmnl_attr_put_u32(nlh, NFTA_LIMIT_BURST, htonl(limit->burst));\n+\tif (e->flags & (1 << NFTNL_OBJ_LIMIT_TYPE))\n+\t\tmnl_attr_put_u32(nlh, NFTA_LIMIT_TYPE, htonl(limit->type));\n+\tif (e->flags & (1 << NFTNL_OBJ_LIMIT_FLAGS))\n+\t\tmnl_attr_put_u32(nlh, NFTA_LIMIT_FLAGS, htonl(limit->flags));\n+}\n+\n+static int nftnl_obj_limit_parse(struct nftnl_obj *e, struct nlattr *attr)\n+{\n+\tstruct nftnl_obj_limit *limit = nftnl_obj_data(e);\n+\tstruct nlattr *tb[NFTA_LIMIT_MAX + 1] = {};\n+\n+\tif (mnl_attr_parse_nested(attr, nftnl_obj_limit_cb, tb) < 0)\n+\t\treturn -1;\n+\n+\tif (tb[NFTA_LIMIT_RATE]) {\n+\t\tlimit->rate = be64toh(mnl_attr_get_u64(tb[NFTA_LIMIT_RATE]));\n+\t\te->flags |= (1 << NFTNL_OBJ_LIMIT_RATE);\n+\t}\n+\tif (tb[NFTA_LIMIT_UNIT]) {\n+\t\tlimit->unit = be64toh(mnl_attr_get_u64(tb[NFTA_LIMIT_UNIT]));\n+\t\te->flags |= (1 << NFTNL_OBJ_LIMIT_UNIT);\n+\t}\n+\tif (tb[NFTA_LIMIT_BURST]) {\n+\t\tlimit->burst = ntohl(mnl_attr_get_u32(tb[NFTA_LIMIT_BURST]));\n+\t\te->flags |= (1 << NFTNL_OBJ_LIMIT_BURST);\n+\t}\n+\tif (tb[NFTA_LIMIT_TYPE]) {\n+\t\tlimit->type = ntohl(mnl_attr_get_u32(tb[NFTA_LIMIT_TYPE]));\n+\t\te->flags |= (1 << NFTNL_OBJ_LIMIT_TYPE);\n+\t}\n+\tif (tb[NFTA_LIMIT_FLAGS]) {\n+\t\tlimit->flags = ntohl(mnl_attr_get_u32(tb[NFTA_LIMIT_FLAGS]));\n+\t\te->flags |= (1 << NFTNL_OBJ_LIMIT_FLAGS);\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int nftnl_obj_limit_json_parse(struct nftnl_obj *e, json_t *root,\n+\t\t\t\t struct nftnl_parse_err *err)\n+{\n+#ifdef JSON_PARSING\n+\tuint64_t uval64;\n+\tuint32_t uval32;\n+\n+\tif (nftnl_jansson_parse_val(root, \"rate\", NFTNL_TYPE_U64, &uval64,\n+\t\t\t\t err) == 0)\n+\t\tnftnl_obj_set_u64(e, NFTNL_OBJ_LIMIT_RATE, uval64);\n+\tif (nftnl_jansson_parse_val(root, \"unit\", NFTNL_TYPE_U64, &uval64,\n+\t\t\t\t err) == 0)\n+\t\tnftnl_obj_set_u64(e, NFTNL_OBJ_LIMIT_UNIT, uval64);\n+\tif (nftnl_jansson_parse_val(root, \"burst\", NFTNL_TYPE_U32, &uval32,\n+\t\t\t\t err) == 0)\n+\t\tnftnl_obj_set_u32(e, NFTNL_OBJ_LIMIT_BURST, uval32);\n+\tif (nftnl_jansson_parse_val(root, \"type\", NFTNL_TYPE_U32, &uval32,\n+\t\t\t\t err) == 0)\n+\t\tnftnl_obj_set_u32(e, NFTNL_OBJ_LIMIT_TYPE, uval32);\n+\tif (nftnl_jansson_parse_val(root, \"flags\", NFTNL_TYPE_U32, &uval32,\n+\t\t\t\t err) == 0)\n+\t\tnftnl_obj_set_u32(e, NFTNL_OBJ_LIMIT_FLAGS, uval32);\n+\n+\treturn 0;\n+#else\n+\terrno = EOPNOTSUPP;\n+\treturn -1;\n+#endif\n+}\n+\n+static int nftnl_obj_limit_export(char *buf, size_t size,\n+\t\t\t\t const struct nftnl_obj *e, int type)\n+{\n+\tstruct nftnl_obj_limit *limit = nftnl_obj_data(e);\n+\tNFTNL_BUF_INIT(b, buf, size);\n+\n+\tif (e->flags & (1 << NFTNL_OBJ_LIMIT_RATE))\n+\t\tnftnl_buf_u64(&b, type, limit->rate, RATE);\n+\tif (e->flags & (1 << NFTNL_OBJ_LIMIT_UNIT))\n+\t\tnftnl_buf_u64(&b, type, limit->unit, UNIT);\n+\tif (e->flags & (1 << NFTNL_OBJ_LIMIT_BURST))\n+\t\tnftnl_buf_u32(&b, type, limit->burst, BURST);\n+\tif (e->flags & (1 << NFTNL_OBJ_LIMIT_TYPE))\n+\t\tnftnl_buf_u32(&b, type, limit->type, TYPE);\n+\tif (e->flags & (1 << NFTNL_OBJ_LIMIT_FLAGS))\n+\t\tnftnl_buf_u32(&b, type, limit->flags, FLAGS);\n+\n+\treturn nftnl_buf_done(&b);\n+}\n+\n+static int nftnl_obj_limit_snprintf_default(char *buf, size_t len,\n+\t\t\t\t\t const struct nftnl_obj *e)\n+{\n+\tstruct nftnl_obj_limit *limit = nftnl_obj_data(e);\n+\n+\treturn snprintf(buf, len, \"rate %\"PRIu64\" unit %\"PRIu64\" burst %u \"\n+\t\t\t\"type %u flags %u \", limit->rate, limit->unit,\n+\t\t\tlimit->burst, limit->type, limit->flags);\n+}\n+\n+static int nftnl_obj_limit_snprintf(char *buf, size_t len, uint32_t type,\n+\t\t\t\t uint32_t flags,\n+\t\t\t\t const struct nftnl_obj *e)\n+{\n+\tswitch (type) {\n+\tcase NFTNL_OUTPUT_DEFAULT:\n+\t\treturn nftnl_obj_limit_snprintf_default(buf, len, e);\n+\tcase NFTNL_OUTPUT_XML:\n+\tcase NFTNL_OUTPUT_JSON:\n+\t\treturn nftnl_obj_limit_export(buf, len, e, type);\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\treturn -1;\n+}\n+\n+struct obj_ops obj_ops_limit = {\n+\t.name\t\t= \"limit\",\n+\t.type\t\t= NFT_OBJECT_LIMIT,\n+\t.alloc_len\t= sizeof(struct nftnl_obj_limit),\n+\t.max_attr\t= NFTA_LIMIT_MAX,\n+\t.set\t\t= nftnl_obj_limit_set,\n+\t.get\t\t= nftnl_obj_limit_get,\n+\t.parse\t\t= nftnl_obj_limit_parse,\n+\t.build\t\t= nftnl_obj_limit_build,\n+\t.snprintf\t= nftnl_obj_limit_snprintf,\n+\t.json_parse\t= nftnl_obj_limit_json_parse,\n+};\ndiff --git a/src/object.c b/src/object.c\nindex e1a5ac4..9dc5b41 100644\n--- a/src/object.c\n+++ b/src/object.c\n@@ -29,11 +29,12 @@ static struct obj_ops *obj_ops[] = {\n \t[NFT_OBJECT_COUNTER]\t= &obj_ops_counter,\n \t[NFT_OBJECT_QUOTA]\t= &obj_ops_quota,\n \t[NFT_OBJECT_CT_HELPER]\t= &obj_ops_ct_helper,\n+\t[NFT_OBJECT_LIMIT]\t= &obj_ops_limit,\n };\n \n static struct obj_ops *nftnl_obj_ops_lookup(uint32_t type)\n {\n-\tif (type > NFT_OBJECT_CT_HELPER)\n+\tif (type > NFT_OBJECT_MAX)\n \t\treturn NULL;\n \n \treturn obj_ops[type];\n", "prefixes": [ "libnftnl" ] }