This patch adds code to parse new handle attribute for tables.

Signed-off-by: Harsha Sharma <[email protected]>
---
 include/libnftnl/table.h            |  3 +++
 include/libnftnl/trace.h            |  1 +
 include/linux/netfilter/nf_tables.h |  4 ++++
 src/libnftnl.map                    |  2 ++
 src/table.c                         | 38 +++++++++++++++++++++++++++++++++++--
 src/trace.c                         | 13 +++++++++++++
 6 files changed, 59 insertions(+), 2 deletions(-)

diff --git a/include/libnftnl/table.h b/include/libnftnl/table.h
index 2e76c45..44017c6 100644
--- a/include/libnftnl/table.h
+++ b/include/libnftnl/table.h
@@ -22,6 +22,7 @@ enum nftnl_table_attr {
        NFTNL_TABLE_FAMILY,
        NFTNL_TABLE_FLAGS,
        NFTNL_TABLE_USE,
+       NFTNL_TABLE_HANDLE,
        __NFTNL_TABLE_MAX
 };
 #define NFTNL_TABLE_MAX (__NFTNL_TABLE_MAX - 1)
@@ -37,9 +38,11 @@ const void *nftnl_table_get_data(const struct nftnl_table 
*t, uint16_t attr,
 
 void nftnl_table_set_u8(struct nftnl_table *t, uint16_t attr, uint8_t data);
 void nftnl_table_set_u32(struct nftnl_table *t, uint16_t attr, uint32_t data);
+void nftnl_table_set_u64(struct nftnl_table *t, uint16_t attr, uint64_t data);
 int nftnl_table_set_str(struct nftnl_table *t, uint16_t attr, const char *str);
 uint8_t nftnl_table_get_u8(const struct nftnl_table *t, uint16_t attr);
 uint32_t nftnl_table_get_u32(const struct nftnl_table *t, uint16_t attr);
+uint64_t nftnl_table_get_u64(const struct nftnl_table *t, uint16_t attr);
 const char *nftnl_table_get_str(const struct nftnl_table *t, uint16_t attr);
 
 struct nlmsghdr;
diff --git a/include/libnftnl/trace.h b/include/libnftnl/trace.h
index 18ab0c3..20cca84 100644
--- a/include/libnftnl/trace.h
+++ b/include/libnftnl/trace.h
@@ -24,6 +24,7 @@ enum nftnl_trace_attr {
        NFTNL_TRACE_TRANSPORT_HEADER,
        NFTNL_TRACE_TABLE,
        NFTNL_TRACE_TYPE,
+       NFTNL_TRACE_TABLE_HANDLE,
        NFTNL_TRACE_RULE_HANDLE,
        NFTNL_TRACE_VERDICT,
        NFTNL_TRACE_NFPROTO,
diff --git a/include/linux/netfilter/nf_tables.h 
b/include/linux/netfilter/nf_tables.h
index 874fa3f..dbc4e38 100644
--- a/include/linux/netfilter/nf_tables.h
+++ b/include/linux/netfilter/nf_tables.h
@@ -160,12 +160,14 @@ enum nft_table_flags {
  * @NFTA_TABLE_NAME: name of the table (NLA_STRING)
  * @NFTA_TABLE_FLAGS: bitmask of enum nft_table_flags (NLA_U32)
  * @NFTA_TABLE_USE: number of chains in this table (NLA_U32)
+ * @NFTA_TABLE_HANDLE: numeric handle of the table (NLA_U64)
  */
 enum nft_table_attributes {
        NFTA_TABLE_UNSPEC,
        NFTA_TABLE_NAME,
        NFTA_TABLE_FLAGS,
        NFTA_TABLE_USE,
+       NFTA_TABLE_HANDLE,
        __NFTA_TABLE_MAX
 };
 #define NFTA_TABLE_MAX         (__NFTA_TABLE_MAX - 1)
@@ -1307,6 +1309,7 @@ enum nft_object_attributes {
  *
  * @NFTA_TRACE_TABLE: name of the table (NLA_STRING)
  * @NFTA_TRACE_CHAIN: name of the chain (NLA_STRING)
+ * @NFTA_TRACE_TABLE_HANDLE: numeric handle of the table (NLA_U64)
  * @NFTA_TRACE_RULE_HANDLE: numeric handle of the rule (NLA_U64)
  * @NFTA_TRACE_TYPE: type of the event (NLA_U32: nft_trace_types)
  * @NFTA_TRACE_VERDICT: verdict returned by hook (NLA_NESTED: nft_verdicts)
@@ -1326,6 +1329,7 @@ enum nft_trace_attributes {
        NFTA_TRACE_UNSPEC,
        NFTA_TRACE_TABLE,
        NFTA_TRACE_CHAIN,
+       NFTA_TRACE_TABLE_HANDLE,
        NFTA_TRACE_RULE_HANDLE,
        NFTA_TRACE_TYPE,
        NFTA_TRACE_VERDICT,
diff --git a/src/libnftnl.map b/src/libnftnl.map
index d59e802..e641824 100644
--- a/src/libnftnl.map
+++ b/src/libnftnl.map
@@ -8,9 +8,11 @@ global:
   nftnl_table_get;
   nftnl_table_set_u8;
   nftnl_table_set_u32;
+  nftnl_table_set_u64;
   nftnl_table_set_str;
   nftnl_table_get_u8;
   nftnl_table_get_u32;
+  nftnl_table_get_u64;
   nftnl_table_get_str;
   nftnl_table_parse;
   nftnl_table_parse_file;
diff --git a/src/table.c b/src/table.c
index cf61dda..2d8321e 100644
--- a/src/table.c
+++ b/src/table.c
@@ -34,6 +34,7 @@ struct nftnl_table {
        uint32_t        table_flags;
        uint32_t        use;
        uint32_t        flags;
+       uint64_t        handle;
 };
 
 struct nftnl_table *nftnl_table_alloc(void)
@@ -67,6 +68,7 @@ void nftnl_table_unset(struct nftnl_table *t, uint16_t attr)
                xfree(t->name);
                break;
        case NFTNL_TABLE_FLAGS:
+       case NFTNL_TABLE_HANDLE:
        case NFTNL_TABLE_FAMILY:
                break;
        case NFTNL_TABLE_USE:
@@ -79,6 +81,7 @@ EXPORT_SYMBOL(nftnl_table_unset);
 static uint32_t nftnl_table_validate[NFTNL_TABLE_MAX + 1] = {
        [NFTNL_TABLE_FLAGS]     = sizeof(uint32_t),
        [NFTNL_TABLE_FAMILY]    = sizeof(uint32_t),
+       [NFTNL_TABLE_HANDLE] = sizeof(uint64_t),
 };
 
 int nftnl_table_set_data(struct nftnl_table *t, uint16_t attr,
@@ -96,6 +99,9 @@ int nftnl_table_set_data(struct nftnl_table *t, uint16_t attr,
                if (!t->name)
                        return -1;
                break;
+       case NFTNL_TABLE_HANDLE:
+               t->handle = *((uint64_t *)data);
+               break;
        case NFTNL_TABLE_FLAGS:
                t->table_flags = *((uint32_t *)data);
                break;
@@ -123,6 +129,12 @@ void nftnl_table_set_u32(struct nftnl_table *t, uint16_t 
attr, uint32_t val)
 }
 EXPORT_SYMBOL(nftnl_table_set_u32);
 
+void nftnl_table_set_u64(struct nftnl_table *t, uint16_t attr, uint64_t val)
+{
+       nftnl_table_set_data(t, attr, &val, sizeof(uint64_t));
+}
+EXPORT_SYMBOL(nftnl_table_set_u64);
+
 void nftnl_table_set_u8(struct nftnl_table *t, uint16_t attr, uint8_t val)
 {
        nftnl_table_set_data(t, attr, &val, sizeof(uint8_t));
@@ -145,6 +157,9 @@ const void *nftnl_table_get_data(const struct nftnl_table 
*t, uint16_t attr,
        case NFTNL_TABLE_NAME:
                *data_len = strlen(t->name) + 1;
                return t->name;
+       case NFTNL_TABLE_HANDLE:
+               *data_len = sizeof(uint64_t);
+               return &t->handle;
        case NFTNL_TABLE_FLAGS:
                *data_len = sizeof(uint32_t);
                return &t->table_flags;
@@ -173,6 +188,13 @@ uint32_t nftnl_table_get_u32(const struct nftnl_table *t, 
uint16_t attr)
 }
 EXPORT_SYMBOL(nftnl_table_get_u32);
 
+uint64_t nftnl_table_get_u64(const struct nftnl_table *t, uint16_t attr)
+{
+       const void *ret = nftnl_table_get(t, attr);
+       return ret == NULL ? 0 : *((uint64_t *)ret);
+}
+EXPORT_SYMBOL(nftnl_table_get_u64);
+
 uint8_t nftnl_table_get_u8(const struct nftnl_table *t, uint16_t attr)
 {
        const void *ret = nftnl_table_get(t, attr);
@@ -190,6 +212,8 @@ void nftnl_table_nlmsg_build_payload(struct nlmsghdr *nlh, 
const struct nftnl_ta
 {
        if (t->flags & (1 << NFTNL_TABLE_NAME))
                mnl_attr_put_strz(nlh, NFTA_TABLE_NAME, t->name);
+       if (t->flags & (1 << NFTNL_TABLE_HANDLE))
+               mnl_attr_put_u64(nlh, NFTA_TABLE_HANDLE, htobe64(t->handle));
        if (t->flags & (1 << NFTNL_TABLE_FLAGS))
                mnl_attr_put_u32(nlh, NFTA_TABLE_FLAGS, htonl(t->table_flags));
 }
@@ -208,6 +232,10 @@ static int nftnl_table_parse_attr_cb(const struct nlattr 
*attr, void *data)
                if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0)
                        abi_breakage();
                break;
+       case NFTA_TABLE_HANDLE:
+               if (mnl_attr_validate(attr, MNL_TYPE_U64) < 0)
+                       abi_breakage();
+               break;
        case NFTA_TABLE_FLAGS:
        case NFTA_TABLE_USE:
                if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
@@ -243,6 +271,10 @@ int nftnl_table_nlmsg_parse(const struct nlmsghdr *nlh, 
struct nftnl_table *t)
                t->use = ntohl(mnl_attr_get_u32(tb[NFTA_TABLE_USE]));
                t->flags |= (1 << NFTNL_TABLE_USE);
        }
+       if (tb[NFTA_TABLE_HANDLE]) {
+               t->handle = be64toh(mnl_attr_get_u64(tb[NFTA_TABLE_HANDLE]));
+               t->flags |= (1 << NFTNL_TABLE_HANDLE);
+       }
 
        t->family = nfg->nfgen_family;
        t->flags |= (1 << NFTNL_TABLE_FAMILY);
@@ -358,6 +390,8 @@ static int nftnl_table_export(char *buf, size_t size,
                nftnl_buf_u32(&b, type, t->table_flags, FLAGS);
        if (t->flags & (1 << NFTNL_TABLE_USE))
                nftnl_buf_u32(&b, type, t->use, USE);
+       if (t->flags & (1 << NFTNL_TABLE_HANDLE))
+               nftnl_buf_u64(&b, type, t->handle, HANDLE);
 
        nftnl_buf_close(&b, type, TABLE);
 
@@ -367,9 +401,9 @@ static int nftnl_table_export(char *buf, size_t size,
 static int nftnl_table_snprintf_default(char *buf, size_t size,
                                        const struct nftnl_table *t)
 {
-       return snprintf(buf, size, "table %s %s flags %x use %d",
+       return snprintf(buf, size, "table %s %s flags %x use %d handle %llu",
                        t->name, nftnl_family2str(t->family),
-                       t->table_flags, t->use);
+                       t->table_flags, t->use, (unsigned long long)t->handle);
 }
 
 static int nftnl_table_cmd_snprintf(char *buf, size_t size,
diff --git a/src/trace.c b/src/trace.c
index b016e72..05a9478 100644
--- a/src/trace.c
+++ b/src/trace.c
@@ -34,6 +34,7 @@ struct nftnl_trace {
        char *chain;
        char *jump_target;
        uint64_t rule_handle;
+       uint64_t table_handle;
        struct nftnl_header_data ll;
        struct nftnl_header_data nh;
        struct nftnl_header_data th;
@@ -112,6 +113,10 @@ static int nftnl_trace_parse_attr_cb(const struct nlattr 
*attr, void *data)
                if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0)
                        abi_breakage();
                break;
+       case NFTA_TRACE_TABLE_HANDLE:
+               if (mnl_attr_validate(attr, MNL_TYPE_U64) < 0)
+                       abi_breakage();
+               break;
        case NFTA_TRACE_RULE_HANDLE:
                if (mnl_attr_validate(attr, MNL_TYPE_U64) < 0)
                        abi_breakage();
@@ -179,6 +184,9 @@ const void *nftnl_trace_get_data(const struct nftnl_trace 
*trace,
        case NFTNL_TRACE_RULE_HANDLE:
                *data_len = sizeof(uint64_t);
                return &trace->rule_handle;
+       case NFTNL_TRACE_TABLE_HANDLE:
+               *data_len = sizeof(uint64_t);
+               return &trace->table_handle;
        case NFTNL_TRACE_VERDICT:
                *data_len = sizeof(uint32_t);
                return &trace->verdict;
@@ -395,6 +403,11 @@ int nftnl_trace_nlmsg_parse(const struct nlmsghdr *nlh, 
struct nftnl_trace *t)
                t->flags |= (1 << NFTNL_TRACE_RULE_HANDLE);
        }
 
+       if (tb[NFTA_TRACE_TABLE_HANDLE]) {
+               t->table_handle = 
be64toh(mnl_attr_get_u64(tb[NFTA_TRACE_TABLE_HANDLE]));
+               t->flags |= (1 << NFTNL_TRACE_TABLE_HANDLE);
+       }
+
        if (tb[NFTA_TRACE_VERDICT] &&
            nftnl_trace_parse_verdict(tb[NFTA_TRACE_VERDICT], t) < 0)
                return -1;
-- 
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