Blob Blame History Raw
commit 7cfb10eca050964b22bc8f25dd4682b409434078
Author: Martin Cermak <mcermak@redhat.com>
Date:   Fri Jul 31 17:40:18 2015 +0200

    Fix PR18711 by updating the netfilter code for new rhel-7.2 kernels.
    
    * buildrun.cxx (compile_pass): Add new netfilter autoconf test.
    * runtime/linux/autoconf-netfilter-313b.c: New autoconf test.
    * tapset-netfilter.cxx: (emit_module_decls): Add support for new
      netfilter code backported to kernel-3.10.0-284.el7.

diff --git a/buildrun.cxx b/buildrun.cxx
index e4b2697..d7a431d 100644
--- a/buildrun.cxx
+++ b/buildrun.cxx
@@ -385,6 +385,7 @@ compile_pass (systemtap_session& s)
   output_autoconf(s, o, "autoconf-fs_supers-hlist.c", "STAPCONF_FS_SUPERS_HLIST", NULL);
   output_autoconf(s, o, "autoconf-compat_sigaction.c", "STAPCONF_COMPAT_SIGACTION", NULL);
   output_autoconf(s, o, "autoconf-netfilter.c", "STAPCONF_NETFILTER_V313", NULL);
+  output_autoconf(s, o, "autoconf-netfilter-313b.c", "STAPCONF_NETFILTER_V313B", NULL);
   output_autoconf(s, o, "autoconf-netfilter-4_1.c", "STAPCONF_NETFILTER_V41", NULL);
   output_autoconf(s, o, "autoconf-smpcall-5args.c", "STAPCONF_SMPCALL_5ARGS", NULL);
   output_autoconf(s, o, "autoconf-smpcall-4args.c", "STAPCONF_SMPCALL_4ARGS", NULL);
diff --git a/runtime/linux/autoconf-netfilter-313b.c b/runtime/linux/autoconf-netfilter-313b.c
new file mode 100644
index 0000000..3b18830
--- /dev/null
+++ b/runtime/linux/autoconf-netfilter-313b.c
@@ -0,0 +1,22 @@
+#include <linux/netfilter.h>
+
+// Similarly to autoconf-netfilter-4_1.c, this autoconf test covers
+// backport of kernel patch 238e54c9cb9385a1ba99e92801f3615a2fb398b6
+// to kernel-3.10.0-284.el7 per rhbz1230935#c4 as patch no 119478.
+// This fixes PR18711.
+
+unsigned int
+new_style_hook(const struct nf_hook_ops *ops,
+		 struct sk_buff *skb,
+		 const struct net_device *nf_in,
+		 const struct net_device *nf_out,
+		 const struct nf_hook_state *state)
+{
+  (void) ops; (void) skb; (void) nf_in; (void) nf_out; (void) state;
+  return 0;
+}
+
+struct nf_hook_ops netfilter_ops = {
+  .hook = new_style_hook
+};
+
diff --git a/tapset-netfilter.cxx b/tapset-netfilter.cxx
index 12df8d7..a820b8d 100644
--- a/tapset-netfilter.cxx
+++ b/tapset-netfilter.cxx
@@ -277,6 +277,11 @@ netfilter_derived_probe_group::emit_module_decls (systemtap_session& s)
       s.op->newline() << "(const struct nf_hook_ops *nf_ops, struct sk_buff *nf_skb, const struct net_device *nf_in, const struct net_device *nf_out, int (*nf_okfn)(struct sk_buff *))";
       s.op->newline() << "{";
 
+      s.op->newline() << "#elif defined(STAPCONF_NETFILTER_V313B)";
+
+      s.op->newline() << "(const struct nf_hook_ops *nf_ops, struct sk_buff *nf_skb, const struct net_device *nf_in, const struct net_device *nf_out, const struct nf_hook_state *nf_state)";
+      s.op->newline() << "{";
+
       s.op->newline() << "#elif LINUX_VERSION_CODE > KERNEL_VERSION(2,6,22)";
 
       s.op->newline() << "(unsigned int nf_hooknum, struct sk_buff *nf_skb, const struct net_device *nf_in, const struct net_device *nf_out, int (*nf_okfn)(struct sk_buff *))";
@@ -291,7 +296,7 @@ netfilter_derived_probe_group::emit_module_decls (systemtap_session& s)
       s.op->newline(-1) << "#endif";
       s.op->newline(1) << "const struct stap_probe * const stp = & stap_probes[" << np->session_index << "];";
       s.op->newline() << "int nf_verdict = NF_ACCEPT;"; // default NF_ACCEPT, to be used by $verdict context var
-      s.op->newline() << "#if defined(STAPCONF_NETFILTER_V313) || defined(STAPCONF_NETFILTER_V41)";
+      s.op->newline() << "#if defined(STAPCONF_NETFILTER_V313) || defined(STAPCONF_NETFILTER_V313B) || defined(STAPCONF_NETFILTER_V41)";
       s.op->newline() << "unsigned int nf_hooknum = nf_ops->hooknum;";
       s.op->newline() << "#endif";
       s.op->newline() << "#ifdef STAPCONF_NETFILTER_V41";