Merge branch 'icmp-move-duplicate-code-in-helper-functions'
authorDavid S. Miller <davem@davemloft.net>
Tue, 5 Nov 2019 22:03:11 +0000 (14:03 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 5 Nov 2019 22:03:11 +0000 (14:03 -0800)
Matteo Croce says:

====================
icmp: move duplicate code in helper functions

Remove some duplicate code by moving it in two helper functions.
First patch adds the helpers, the second one uses it.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/icmp.h
include/linux/icmpv6.h
net/ipv4/netfilter/nf_socket_ipv4.c
net/ipv4/route.c
net/ipv6/route.c
net/netfilter/nf_conntrack_proto_icmp.c
net/netfilter/xt_HMARK.c
net/sched/act_nat.c

index 2d8aaf7..81ca84c 100644 (file)
@@ -20,4 +20,19 @@ static inline struct icmphdr *icmp_hdr(const struct sk_buff *skb)
 {
        return (struct icmphdr *)skb_transport_header(skb);
 }
+
+static inline bool icmp_is_err(int type)
+{
+       switch (type) {
+       case ICMP_DEST_UNREACH:
+       case ICMP_SOURCE_QUENCH:
+       case ICMP_REDIRECT:
+       case ICMP_TIME_EXCEEDED:
+       case ICMP_PARAMETERPROB:
+               return true;
+       }
+
+       return false;
+}
+
 #endif /* _LINUX_ICMP_H */
index a8f8889..ef1cbb5 100644 (file)
@@ -46,4 +46,18 @@ extern void                          icmpv6_flow_init(struct sock *sk,
                                                         const struct in6_addr *saddr,
                                                         const struct in6_addr *daddr,
                                                         int oif);
+
+static inline bool icmpv6_is_err(int type)
+{
+       switch (type) {
+       case ICMPV6_DEST_UNREACH:
+       case ICMPV6_PKT_TOOBIG:
+       case ICMPV6_TIME_EXCEED:
+       case ICMPV6_PARAMPROB:
+               return true;
+       }
+
+       return false;
+}
+
 #endif
index 36a28d4..c94445b 100644 (file)
@@ -31,16 +31,8 @@ extract_icmp4_fields(const struct sk_buff *skb, u8 *protocol,
        if (icmph == NULL)
                return 1;
 
-       switch (icmph->type) {
-       case ICMP_DEST_UNREACH:
-       case ICMP_SOURCE_QUENCH:
-       case ICMP_REDIRECT:
-       case ICMP_TIME_EXCEEDED:
-       case ICMP_PARAMETERPROB:
-               break;
-       default:
+       if (!icmp_is_err(icmph->type))
                return 1;
-       }
 
        inside_iph = skb_header_pointer(skb, outside_hdrlen +
                                        sizeof(struct icmphdr),
index 621f834..dcc4fa1 100644 (file)
@@ -1894,10 +1894,7 @@ static void ip_multipath_l3_keys(const struct sk_buff *skb,
        if (!icmph)
                goto out;
 
-       if (icmph->type != ICMP_DEST_UNREACH &&
-           icmph->type != ICMP_REDIRECT &&
-           icmph->type != ICMP_TIME_EXCEEDED &&
-           icmph->type != ICMP_PARAMETERPROB)
+       if (!icmp_is_err(icmph->type))
                goto out;
 
        inner_iph = skb_header_pointer(skb,
index c7a2022..bf2dac4 100644 (file)
@@ -2291,10 +2291,7 @@ static void ip6_multipath_l3_keys(const struct sk_buff *skb,
        if (!icmph)
                goto out;
 
-       if (icmph->icmp6_type != ICMPV6_DEST_UNREACH &&
-           icmph->icmp6_type != ICMPV6_PKT_TOOBIG &&
-           icmph->icmp6_type != ICMPV6_TIME_EXCEED &&
-           icmph->icmp6_type != ICMPV6_PARAMPROB)
+       if (!icmpv6_is_err(icmph->icmp6_type))
                goto out;
 
        inner_iph = skb_header_pointer(skb,
index 097deba..c2e3dff 100644 (file)
@@ -235,11 +235,7 @@ int nf_conntrack_icmpv4_error(struct nf_conn *tmpl,
        }
 
        /* Need to track icmp error message? */
-       if (icmph->type != ICMP_DEST_UNREACH &&
-           icmph->type != ICMP_SOURCE_QUENCH &&
-           icmph->type != ICMP_TIME_EXCEEDED &&
-           icmph->type != ICMP_PARAMETERPROB &&
-           icmph->type != ICMP_REDIRECT)
+       if (!icmp_is_err(icmph->type))
                return NF_ACCEPT;
 
        memset(&outer_daddr, 0, sizeof(outer_daddr));
index be7798a..713fb38 100644 (file)
@@ -239,11 +239,7 @@ static int get_inner_hdr(const struct sk_buff *skb, int iphsz, int *nhoff)
                return 0;
 
        /* Error message? */
-       if (icmph->type != ICMP_DEST_UNREACH &&
-           icmph->type != ICMP_SOURCE_QUENCH &&
-           icmph->type != ICMP_TIME_EXCEEDED &&
-           icmph->type != ICMP_PARAMETERPROB &&
-           icmph->type != ICMP_REDIRECT)
+       if (!icmp_is_err(icmph->type))
                return 0;
 
        *nhoff += iphsz + sizeof(_ih);
index 88a1b79..855a6fa 100644 (file)
@@ -206,9 +206,7 @@ static int tcf_nat_act(struct sk_buff *skb, const struct tc_action *a,
 
                icmph = (void *)(skb_network_header(skb) + ihl);
 
-               if ((icmph->type != ICMP_DEST_UNREACH) &&
-                   (icmph->type != ICMP_TIME_EXCEEDED) &&
-                   (icmph->type != ICMP_PARAMETERPROB))
+               if (!icmp_is_err(icmph->type))
                        break;
 
                if (!pskb_may_pull(skb, ihl + sizeof(*icmph) + sizeof(*iph) +