netfilter: nfnetlink: add nfnetlink_rcv_skb_batch()
authorPablo Neira Ayuso <pablo@netfilter.org>
Fri, 10 Feb 2017 11:08:14 +0000 (12:08 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Sun, 12 Feb 2017 13:45:10 +0000 (14:45 +0100)
Add new nfnetlink_rcv_skb_batch() to wrap initial nfnetlink batch
handling.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nfnetlink.c

index 586212ebba9ecc7adefb3f9ddf977e924ca055fa..ca645a3b1375142b555c97e9980b3a07dfa1928e 100644 (file)
@@ -436,12 +436,35 @@ done:
        kfree_skb(skb);
 }
 
-static void nfnetlink_rcv(struct sk_buff *skb)
+static void nfnetlink_rcv_skb_batch(struct sk_buff *skb, struct nlmsghdr *nlh)
 {
-       struct nlmsghdr *nlh = nlmsg_hdr(skb);
+       struct nfgenmsg *nfgenmsg;
        u16 res_id;
        int msglen;
 
+       msglen = NLMSG_ALIGN(nlh->nlmsg_len);
+       if (msglen > skb->len)
+               msglen = skb->len;
+
+       if (nlh->nlmsg_len < NLMSG_HDRLEN ||
+           skb->len < NLMSG_HDRLEN + sizeof(struct nfgenmsg))
+               return;
+
+       nfgenmsg = nlmsg_data(nlh);
+       skb_pull(skb, msglen);
+       /* Work around old nft using host byte order */
+       if (nfgenmsg->res_id == NFNL_SUBSYS_NFTABLES)
+               res_id = NFNL_SUBSYS_NFTABLES;
+       else
+               res_id = ntohs(nfgenmsg->res_id);
+
+       nfnetlink_rcv_batch(skb, nlh, res_id);
+}
+
+static void nfnetlink_rcv(struct sk_buff *skb)
+{
+       struct nlmsghdr *nlh = nlmsg_hdr(skb);
+
        if (nlh->nlmsg_len < NLMSG_HDRLEN ||
            skb->len < nlh->nlmsg_len)
                return;
@@ -451,28 +474,10 @@ static void nfnetlink_rcv(struct sk_buff *skb)
                return;
        }
 
-       if (nlh->nlmsg_type == NFNL_MSG_BATCH_BEGIN) {
-               struct nfgenmsg *nfgenmsg;
-
-               msglen = NLMSG_ALIGN(nlh->nlmsg_len);
-               if (msglen > skb->len)
-                       msglen = skb->len;
-
-               if (nlh->nlmsg_len < NLMSG_HDRLEN ||
-                   skb->len < NLMSG_HDRLEN + sizeof(struct nfgenmsg))
-                       return;
-
-               nfgenmsg = nlmsg_data(nlh);
-               skb_pull(skb, msglen);
-               /* Work around old nft using host byte order */
-               if (nfgenmsg->res_id == NFNL_SUBSYS_NFTABLES)
-                       res_id = NFNL_SUBSYS_NFTABLES;
-               else
-                       res_id = ntohs(nfgenmsg->res_id);
-               nfnetlink_rcv_batch(skb, nlh, res_id);
-       } else {
+       if (nlh->nlmsg_type == NFNL_MSG_BATCH_BEGIN)
+               nfnetlink_rcv_skb_batch(skb, nlh);
+       else
                netlink_rcv_skb(skb, &nfnetlink_rcv_msg);
-       }
 }
 
 #ifdef CONFIG_MODULES