From patchwork Mon Jun 30 11:50:05 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ana Rey X-Patchwork-Id: 365554 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 10BFE1400FA for ; Mon, 30 Jun 2014 21:50:30 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752338AbaF3Lu2 (ORCPT ); Mon, 30 Jun 2014 07:50:28 -0400 Received: from mail-we0-f171.google.com ([74.125.82.171]:41254 "EHLO mail-we0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752215AbaF3Lu0 (ORCPT ); Mon, 30 Jun 2014 07:50:26 -0400 Received: by mail-we0-f171.google.com with SMTP id q58so7993219wes.16 for ; Mon, 30 Jun 2014 04:50:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Ps8KodG3uvmp8/L3TEriCvf67HWTfmpr9umBFXY4hEM=; b=YTmfC+AjgTHwv1v0ibFHaDLvZyv6Po3AqMQDLcZNCHKJDuNADkz4JOUYHE0HmvkYPP 39kZ9+FCsVPADOImScrrzm7dW+mJBFXNsI+bIyni1Zgu+vN2FBlC0E43J7RRCMV6f6wu 2J32QLJ2dmrKsvpu73APb421TUJAFE0YlGK6NlZqBTkjsnuBKzexJzYyId0JDns5YEFy vhib7kZavANhBhB8tU9vrrVAkFFlL5eHec1s71J0hCrDBHVWOsHzoutJ/n+GYiuXY44f rg4mIz+g2sf2M9pRICVepGSJ1djgZ6RMcyPgNCHynsdoU3aQKn5acNT0BQI5hNeIWEAu yt+g== X-Received: by 10.180.74.11 with SMTP id p11mr28450907wiv.68.1404129024809; Mon, 30 Jun 2014 04:50:24 -0700 (PDT) Received: from localhost.localdomain (186.169.216.87.static.jazztel.es. [87.216.169.186]) by mx.google.com with ESMTPSA id e18sm1955435wic.0.2014.06.30.04.50.23 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 30 Jun 2014 04:50:24 -0700 (PDT) From: Ana Rey To: netfilter-devel@vger.kernel.org Cc: Ana Rey Subject: [libnftnl PATCH v2 1/4] src: chain: Add all support of use attribute Date: Mon, 30 Jun 2014 13:50:05 +0200 Message-Id: <1404129008-29564-2-git-send-email-anarey@gmail.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1404129008-29564-1-git-send-email-anarey@gmail.com> References: <1404129008-29564-1-git-send-email-anarey@gmail.com> Sender: netfilter-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netfilter-devel@vger.kernel.org Add set, unset, get, parse and build payload implementation for use value. These changes are neeeded for a correct import/export of xml/json file Signed-off-by: Ana Rey --- [Changes in v2:] I add a xml support for 'use' attribute that I did not add in v1 Moreover, I improve the subject and description of this patch src/chain.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/chain.c b/src/chain.c index 9e9f207..ea7bc56 100644 --- a/src/chain.c +++ b/src/chain.c @@ -115,8 +115,7 @@ void nft_chain_attr_unset(struct nft_chain *c, uint16_t attr) } break; case NFT_CHAIN_ATTR_USE: - /* cannot be unset?, ignore it */ - return; + break; case NFT_CHAIN_ATTR_TYPE: if (c->type) { xfree(c->type); @@ -178,8 +177,8 @@ void nft_chain_attr_set_data(struct nft_chain *c, uint16_t attr, c->policy = *((uint32_t *)data); break; case NFT_CHAIN_ATTR_USE: - /* cannot be set, ignore it */ - return; + c->use = *((uint32_t *)data); + break; case NFT_CHAIN_ATTR_BYTES: c->bytes = *((uint64_t *)data); break; @@ -356,6 +355,8 @@ void nft_chain_nlmsg_build_payload(struct nlmsghdr *nlh, const struct nft_chain } if (c->flags & (1 << NFT_CHAIN_ATTR_POLICY)) mnl_attr_put_u32(nlh, NFTA_CHAIN_POLICY, htonl(c->policy)); + if (c->flags & (1 << NFT_CHAIN_ATTR_USE)) + mnl_attr_put_u32(nlh, NFTA_CHAIN_USE, htonl(c->use)); if ((c->flags & (1 << NFT_CHAIN_ATTR_PACKETS)) && (c->flags & (1 << NFT_CHAIN_ATTR_BYTES))) { struct nlattr *nest; @@ -566,7 +567,7 @@ int nft_jansson_parse_chain(struct nft_chain *c, json_t *tree, json_t *root; uint64_t uval64; int policy; - int32_t val32; + int32_t val32, use; const char *valstr; root = nft_jansson_get_node(tree, "chain", err); @@ -609,6 +610,9 @@ int nft_jansson_parse_chain(struct nft_chain *c, json_t *tree, nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TABLE, valstr); + if (nft_jansson_parse_val(root, "use", NFT_TYPE_U32, &use, err) == 0) + nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_USE, use); + if (nft_jansson_node_exist(root, "hooknum")) { valstr = nft_jansson_parse_str(root, "type", err); @@ -681,7 +685,7 @@ int nft_mxml_chain_parse(mxml_node_t *tree, struct nft_chain *c, { const char *table, *name, *hooknum_str, *policy_str, *type; int family, hooknum, policy; - uint64_t handle, bytes, packets, prio; + uint64_t handle, bytes, packets, prio, use; name = nft_mxml_str_parse(tree, "name", MXML_DESCEND_FIRST, NFT_XML_MAND, err); @@ -711,6 +715,10 @@ int nft_mxml_chain_parse(mxml_node_t *tree, struct nft_chain *c, return -1; nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TABLE, table); + if (nft_mxml_num_parse(tree, "use", MXML_DESCEND_FIRST, BASE_DEC, + &use, NFT_TYPE_U64, NFT_XML_MAND, err) == 0) + nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_PACKETS, use); + family = nft_mxml_family_parse(tree, "family", MXML_DESCEND_FIRST, NFT_XML_MAND, err); if (family < 0) @@ -860,6 +868,10 @@ static int nft_chain_snprintf_xml(char *buf, size_t size, struct nft_chain *c) c->name, c->handle, c->bytes, c->packets, c->table); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + if (c->flags & (1 << NFT_CHAIN_ATTR_USE)) { + ret = snprintf(buf + offset, len, "%u", c->use); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + } if (c->flags & (1 << NFT_CHAIN_ATTR_HOOKNUM)) { ret = snprintf(buf+offset, len, "%s"