netfilter: conntrack: handle icmp pkt_to_tuple helper via direct calls
authorFlorian Westphal <fw@strlen.de>
Tue, 15 Jan 2019 21:03:33 +0000 (22:03 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Fri, 18 Jan 2019 14:02:33 +0000 (15:02 +0100)
rather than handling them via indirect call, use a direct one instead.
This leaves GRE as the last user of this indirect call facility.

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/net/netfilter/nf_conntrack_l4proto.h
net/netfilter/nf_conntrack_core.c
net/netfilter/nf_conntrack_proto_icmp.c
net/netfilter/nf_conntrack_proto_icmpv6.c

index 6ca4355ae3dc0cef8d07220dabea3dbd01dcd2a6..46d554806eb39979a067df160b3deb5893e03938 100644 (file)
@@ -90,6 +90,16 @@ struct nf_conntrack_l4proto {
        struct module *me;
 };
 
+bool icmp_pkt_to_tuple(const struct sk_buff *skb,
+                      unsigned int dataoff,
+                      struct net *net,
+                      struct nf_conntrack_tuple *tuple);
+
+bool icmpv6_pkt_to_tuple(const struct sk_buff *skb,
+                        unsigned int dataoff,
+                        struct net *net,
+                        struct nf_conntrack_tuple *tuple);
+
 int nf_conntrack_icmpv4_error(struct nf_conn *tmpl,
                              struct sk_buff *skb,
                              unsigned int dataoff,
index 5dfd95ae510d34423bd378fe94420864018591b0..b3840d36c3a687868456c81018e529b6eacef61f 100644 (file)
@@ -274,6 +274,12 @@ nf_ct_get_tuple(const struct sk_buff *skb,
        tuple->dst.protonum = protonum;
        tuple->dst.dir = IP_CT_DIR_ORIGINAL;
 
+       switch (protonum) {
+       case IPPROTO_ICMPV6:
+               return icmpv6_pkt_to_tuple(skb, dataoff, net, tuple);
+       case IPPROTO_ICMP:
+               return icmp_pkt_to_tuple(skb, dataoff, net, tuple);
+       }
        if (unlikely(l4proto->pkt_to_tuple))
                return l4proto->pkt_to_tuple(skb, dataoff, net, tuple);
 
index 381a7f3ea68a932450961643580d083c1973b39c..805c1fe5b837ef0fef9fc8ef7fb8e42645a68d8b 100644 (file)
@@ -25,8 +25,8 @@
 
 static const unsigned int nf_ct_icmp_timeout = 30*HZ;
 
-static bool icmp_pkt_to_tuple(const struct sk_buff *skb, unsigned int dataoff,
-                             struct net *net, struct nf_conntrack_tuple *tuple)
+bool icmp_pkt_to_tuple(const struct sk_buff *skb, unsigned int dataoff,
+                      struct net *net, struct nf_conntrack_tuple *tuple)
 {
        const struct icmphdr *hp;
        struct icmphdr _hdr;
@@ -347,7 +347,6 @@ static struct nf_proto_net *icmp_get_net_proto(struct net *net)
 const struct nf_conntrack_l4proto nf_conntrack_l4proto_icmp =
 {
        .l4proto                = IPPROTO_ICMP,
-       .pkt_to_tuple           = icmp_pkt_to_tuple,
        .invert_tuple           = icmp_invert_tuple,
 #if IS_ENABLED(CONFIG_NF_CT_NETLINK)
        .tuple_to_nlattr        = icmp_tuple_to_nlattr,
index 93f27d0bcb7558b1805ccf631448d444ca2b5308..20cd55e55e41357ab1f15454f50419be61ecaa6b 100644 (file)
 
 static const unsigned int nf_ct_icmpv6_timeout = 30*HZ;
 
-static bool icmpv6_pkt_to_tuple(const struct sk_buff *skb,
-                               unsigned int dataoff,
-                               struct net *net,
-                               struct nf_conntrack_tuple *tuple)
+bool icmpv6_pkt_to_tuple(const struct sk_buff *skb,
+                        unsigned int dataoff,
+                        struct net *net,
+                        struct nf_conntrack_tuple *tuple)
 {
        const struct icmp6hdr *hp;
        struct icmp6hdr _hdr;
@@ -358,7 +358,6 @@ static struct nf_proto_net *icmpv6_get_net_proto(struct net *net)
 const struct nf_conntrack_l4proto nf_conntrack_l4proto_icmpv6 =
 {
        .l4proto                = IPPROTO_ICMPV6,
-       .pkt_to_tuple           = icmpv6_pkt_to_tuple,
        .invert_tuple           = icmpv6_invert_tuple,
 #if IS_ENABLED(CONFIG_NF_CT_NETLINK)
        .tuple_to_nlattr        = icmpv6_tuple_to_nlattr,