]> git.ipfire.org Git - thirdparty/libnftnl.git/commitdiff
examples: nft-rule-parse-add: add batching support
authorArturo Borrero <arturo.borrero.glez@gmail.com>
Tue, 23 Sep 2014 11:15:26 +0000 (13:15 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Tue, 23 Sep 2014 13:49:11 +0000 (15:49 +0200)
Let's add support for current kernels.

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

index 8b6152a41744fefa141d7b1ae6d6380214dcd286..41604355da7fdba0b1bd510210ca4f5c100994ab 100644 (file)
@@ -75,11 +75,12 @@ static struct nft_rule *rule_parse_file(const char *file, uint16_t format)
 int main(int argc, char *argv[])
 {
        struct mnl_socket *nl;
+       struct mnl_nlmsg_batch *batch;
        char buf[MNL_SOCKET_BUFFER_SIZE];
        struct nlmsghdr *nlh;
-       uint32_t portid, seq;
+       uint32_t portid, seq, rule_seq;
        struct nft_rule *r;
-       int ret;
+       int ret, batching;
        uint16_t family, format, outformat;
 
        if (argc < 3) {
@@ -105,14 +106,33 @@ int main(int argc, char *argv[])
        nft_rule_fprintf(stdout, r, outformat, 0);
        fprintf(stdout, "\n");
 
-       family = nft_rule_attr_get_u32(r, NFT_RULE_ATTR_FAMILY);
+       batching = nft_batch_is_supported();
+       if (batching < 0) {
+               perror("Cannot talk to nfnetlink");
+               exit(EXIT_FAILURE);
+       }
 
        seq = time(NULL);
+       batch = mnl_nlmsg_batch_start(buf, sizeof(buf));
+
+       if (batching) {
+               nft_batch_begin(mnl_nlmsg_batch_current(batch), seq++);
+               mnl_nlmsg_batch_next(batch);
+       }
+
+       rule_seq = seq;
+       family = nft_rule_attr_get_u32(r, NFT_RULE_ATTR_FAMILY);
        nlh = nft_rule_nlmsg_build_hdr(buf, NFT_MSG_NEWRULE, family,
                                       NLM_F_CREATE|NLM_F_APPEND|NLM_F_ACK,
-                                      seq);
+                                      seq++);
        nft_rule_nlmsg_build_payload(nlh, r);
        nft_rule_free(r);
+       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) {
@@ -126,14 +146,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, rule_seq, portid, NULL, NULL);
                if (ret <= 0)
                        break;
                ret = mnl_socket_recvfrom(nl, buf, sizeof(buf));