ARM: sunxi_defconfig: enable CONFIG_REGULATOR
[cascardo/linux.git] / net / ipv6 / icmp.c
index 06ba3e5..97ae700 100644 (file)
@@ -170,11 +170,11 @@ static bool is_ineligible(const struct sk_buff *skb)
 /*
  * Check the ICMP output rate limit
  */
-static inline bool icmpv6_xrlim_allow(struct sock *sk, u8 type,
-                                     struct flowi6 *fl6)
+static bool icmpv6_xrlim_allow(struct sock *sk, u8 type,
+                              struct flowi6 *fl6)
 {
-       struct dst_entry *dst;
        struct net *net = sock_net(sk);
+       struct dst_entry *dst;
        bool res = false;
 
        /* Informational messages are not limited. */
@@ -199,16 +199,20 @@ static inline bool icmpv6_xrlim_allow(struct sock *sk, u8 type,
        } else {
                struct rt6_info *rt = (struct rt6_info *)dst;
                int tmo = net->ipv6.sysctl.icmpv6_time;
-               struct inet_peer *peer;
 
                /* Give more bandwidth to wider prefixes. */
                if (rt->rt6i_dst.plen < 128)
                        tmo >>= ((128 - rt->rt6i_dst.plen)>>5);
 
-               peer = inet_getpeer_v6(net->ipv6.peers, &rt->rt6i_dst.addr, 1);
-               res = inet_peer_xrlim_allow(peer, tmo);
-               if (peer)
-                       inet_putpeer(peer);
+               if (icmp_global_allow()) {
+                       struct inet_peer *peer;
+
+                       peer = inet_getpeer_v6(net->ipv6.peers,
+                                              &rt->rt6i_dst.addr, 1);
+                       res = inet_peer_xrlim_allow(peer, tmo);
+                       if (peer)
+                               inet_putpeer(peer);
+               }
        }
        dst_release(dst);
        return res;
@@ -503,7 +507,7 @@ static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info)
        msg.type = type;
 
        len = skb->len - msg.offset;
-       len = min_t(unsigned int, len, IPV6_MIN_MTU - sizeof(struct ipv6hdr) -sizeof(struct icmp6hdr));
+       len = min_t(unsigned int, len, IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(struct icmp6hdr));
        if (len < 0) {
                LIMIT_NETDEBUG(KERN_DEBUG "icmp: len problem\n");
                goto out_dst_release;
@@ -636,7 +640,7 @@ void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info)
                /* now skip over extension headers */
                inner_offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr),
                                                &nexthdr, &frag_off);
-               if (inner_offset<0)
+               if (inner_offset < 0)
                        goto out;
        } else {
                inner_offset = sizeof(struct ipv6hdr);
@@ -773,12 +777,12 @@ static int icmpv6_rcv(struct sk_buff *skb)
                break;
 
        default:
-               LIMIT_NETDEBUG(KERN_DEBUG "icmpv6: msg of unknown type\n");
-
                /* informational */
                if (type & ICMPV6_INFOMSG_MASK)
                        break;
 
+               LIMIT_NETDEBUG(KERN_DEBUG "icmpv6: msg of unknown type\n");
+
                /*
                 * error of unknown type.
                 * must pass to upper level
@@ -808,7 +812,7 @@ void icmpv6_flow_init(struct sock *sk, struct flowi6 *fl6,
        memset(fl6, 0, sizeof(*fl6));
        fl6->saddr = *saddr;
        fl6->daddr = *daddr;
-       fl6->flowi6_proto       = IPPROTO_ICMPV6;
+       fl6->flowi6_proto       = IPPROTO_ICMPV6;
        fl6->fl6_icmp_type      = type;
        fl6->fl6_icmp_code      = 0;
        fl6->flowi6_oif         = oif;
@@ -875,8 +879,8 @@ static void __net_exit icmpv6_sk_exit(struct net *net)
 }
 
 static struct pernet_operations icmpv6_sk_ops = {
-       .init = icmpv6_sk_init,
-       .exit = icmpv6_sk_exit,
+       .init = icmpv6_sk_init,
+       .exit = icmpv6_sk_exit,
 };
 
 int __init icmpv6_init(void)