]> git.ipfire.org Git - thirdparty/libnftnl.git/commitdiff
examples: nft-table-parse-add: add batching support
authorArturo Borrero <arturo.borrero.glez@gmail.com>
Fri, 22 Aug 2014 09:39:35 +0000 (11:39 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Sun, 24 Aug 2014 12:50:19 +0000 (14:50 +0200)
Add batching support to operate with recent kernels.

Signed-off-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
examples/nft-table-parse-add.c

index 0faedad86cc69d93f5c851979cdf8b4004df8edc..c21b6ba5f1ad45f2f99dd0d0eef72566bee647b7 100644 (file)
@@ -73,10 +73,11 @@ int main(int argc, char *argv[])
        struct mnl_socket *nl;
        char buf[MNL_SOCKET_BUFFER_SIZE];
        struct nlmsghdr *nlh;
-       uint32_t portid, seq;
+       uint32_t portid, seq, table_seq;
        struct nft_table *t = NULL;
-       int ret;
+       int ret, batching;
        uint16_t family, format, outformat;
+       struct mnl_nlmsg_batch *batch;
 
        if (argc < 3) {
                printf("Usage: %s {xml|json} <file>\n", argv[0]);
@@ -101,14 +102,34 @@ int main(int argc, char *argv[])
        nft_table_fprintf(stdout, t, outformat, 0);
        fprintf(stdout, "\n");
 
-       family = nft_table_attr_get_u32(t, NFT_TABLE_ATTR_FAMILY);
-
        seq = time(NULL);
+       batching = nft_batch_is_supported();
+       if (batching < 0) {
+               perror("cannot talk to nfnetlink");
+               exit(EXIT_FAILURE);
+       }
+
+       batch = mnl_nlmsg_batch_start(buf, sizeof(buf));
+
+       if (batching) {
+               nft_batch_begin(mnl_nlmsg_batch_current(batch), seq++);
+               mnl_nlmsg_batch_next(batch);
+       }
+
+       family = nft_table_attr_get_u32(t, NFT_TABLE_ATTR_FAMILY);
 
-       nlh = nft_table_nlmsg_build_hdr(buf, NFT_MSG_NEWTABLE, family,
-                                       NLM_F_CREATE|NLM_F_ACK, seq);
+       table_seq = seq;
+       nlh = nft_table_nlmsg_build_hdr(mnl_nlmsg_batch_current(batch),
+                                       NFT_MSG_NEWTABLE, family,
+                                       NLM_F_CREATE|NLM_F_ACK, seq++);
        nft_table_nlmsg_build_payload(nlh, t);
        nft_table_free(t);
+       mnl_nlmsg_batch_next(batch);
+
+       if (batching) {
+               nft_batch_end(mnl_nlmsg_batch_current(batch), seq++);
+               mnl_nlmsg_batch_next(batch);
+       }
 
        nl = mnl_socket_open(NETLINK_NETFILTER);
        if (nl == NULL) {
@@ -122,14 +143,17 @@ int main(int argc, char *argv[])
        }
        portid = mnl_socket_get_portid(nl);
 
-       if (mnl_socket_sendto(nl, nlh, nlh->nlmsg_len) < 0) {
+       if (mnl_socket_sendto(nl, mnl_nlmsg_batch_head(batch),
+                             mnl_nlmsg_batch_size(batch)) < 0) {
                perror("mnl_socket_send");
                exit(EXIT_FAILURE);
        }
 
+       mnl_nlmsg_batch_stop(batch);
+
        ret = mnl_socket_recvfrom(nl, buf, sizeof(buf));
        while (ret > 0) {
-               ret = mnl_cb_run(buf, ret, seq, portid, NULL, NULL);
+               ret = mnl_cb_run(buf, ret, table_seq, portid, NULL, NULL);
                if (ret <= 0)
                        break;
                ret = mnl_socket_recvfrom(nl, buf, sizeof(buf));