]> git.ipfire.org Git - thirdparty/ipset.git/commitdiff
Backport "netfilter: add helper function to set up the nfnetlink header and use it"
authorJozsef Kadlecsik <kadlec@netfilter.org>
Sat, 26 Jun 2021 20:17:58 +0000 (22:17 +0200)
committerJozsef Kadlecsik <kadlec@netfilter.org>
Sat, 26 Jun 2021 20:17:58 +0000 (22:17 +0200)
Backport patch "netfilter: add helper function to set up the nfnetlink
header and use it" from Pablo Neira Ayuso <pablo@netfilter.org>.

Signed-off-by: Jozsef Kadlecsik <kadlec@netfilter.org>
configure.ac
kernel/include/linux/netfilter/ipset/ip_set_compat.h.in
kernel/net/netfilter/ipset/ip_set_core.c

index bd6116ca7f0a37011524d4445006b4c32934831c..9aea0049d174bd2a1297f9596a5b068e390c18f9 100644 (file)
@@ -786,6 +786,16 @@ else
        AC_SUBST(HAVE_NLA_POLICY_EXACT_LEN, undef)
 fi
 
+AC_MSG_CHECKING([kernel source for nfnl_msg_put() in nfnetlink.h])
+if test -f $ksourcedir/include/linux/netfilter/nfnetlink.h && \
+   $GREP -q 'nfnl_msg_put' $ksourcedir/include/linux/netfilter/nfnetlink.h; then
+       AC_MSG_RESULT(yes)
+       AC_SUBST(HAVE_NFNL_MSG_PUT, define)
+else
+       AC_MSG_RESULT(no)
+       AC_SUBST(HAVE_NFNL_MSG_PUT, undef)
+fi
+
 AC_MSG_CHECKING([kernel source for kvzalloc() in mm.h])
 if test -f $ksourcedir/include/linux/mm.h && \
    $GREP -q 'static inline void \*kvzalloc(' $ksourcedir/include/linux/mm.h; then
index 96a4cf4417829b94b732155aa9405883fefdffe5..3a8dd9ef9d2a819f3a8208347f484fcf1884c2e1 100644 (file)
@@ -62,6 +62,7 @@
 #@HAVE_KVZALLOC@ HAVE_KVZALLOC
 #@HAVE_GFP_KERNEL_ACCOUNT@ HAVE_GFP_KERNEL_ACCOUNT
 #@HAVE_NLA_STRSCPY@ HAVE_NLA_STRSCPY
+#@HAVE_NFNL_MSG_PUT@ HAVE_NFNL_MSG_PUT
 
 #ifdef HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H
 #include <linux/module.h>
@@ -406,6 +407,35 @@ static inline u16 nfnl_msg_type(u8 subsys, u8 msg_type)
 }
 #endif
 
+#ifndef HAVE_NFNL_MSG_PUT
+static inline void nfnl_fill_hdr(struct nlmsghdr *nlh, u8 family, u8 version,
+                                __be16 res_id)
+{
+       struct nfgenmsg *nfmsg;
+
+       nfmsg = nlmsg_data(nlh);
+       nfmsg->nfgen_family = family;
+       nfmsg->version = version;
+       nfmsg->res_id = res_id;
+}
+
+static inline struct nlmsghdr *nfnl_msg_put(struct sk_buff *skb, u32 portid,
+                                           u32 seq, int type, int flags,
+                                           u8 family, u8 version,
+                                           __be16 res_id)
+{
+       struct nlmsghdr *nlh;
+
+       nlh = nlmsg_put(skb, portid, seq, type, sizeof(struct nfgenmsg), flags);
+       if (!nlh)
+               return NULL;
+
+       nfnl_fill_hdr(nlh, family, version, res_id);
+
+       return nlh;
+}
+#endif
+
 #ifdef HAVE_NETLINK_EXTENDED_ACK
 #define NETLINK_ACK(in_skb, nlh, err, extack)  netlink_ack(in_skb, nlh, err, extack)
 #else
index 63a7955dcc859446f7448d4ae528daabba42135e..4057dc1ad5f35db69d51bd6086061ff4c8a79ccc 100644 (file)
@@ -964,20 +964,9 @@ static struct nlmsghdr *
 start_msg(struct sk_buff *skb, u32 portid, u32 seq, unsigned int flags,
          enum ipset_cmd cmd)
 {
-       struct nlmsghdr *nlh;
-       struct nfgenmsg *nfmsg;
-
-       nlh = nlmsg_put(skb, portid, seq, nfnl_msg_type(NFNL_SUBSYS_IPSET, cmd),
-                       sizeof(*nfmsg), flags);
-       if (!nlh)
-               return NULL;
-
-       nfmsg = nlmsg_data(nlh);
-       nfmsg->nfgen_family = NFPROTO_IPV4;
-       nfmsg->version = NFNETLINK_V0;
-       nfmsg->res_id = 0;
-
-       return nlh;
+       return nfnl_msg_put(skb, portid, seq,
+                           nfnl_msg_type(NFNL_SUBSYS_IPSET, cmd), flags,
+                           NFPROTO_IPV4, NFNETLINK_V0, 0);
 }
 
 /* Create a set */