|
@@ -123,15 +123,6 @@ static __inline__ void icmpv6_xmit_unlock(struct sock *sk)
|
|
|
spin_unlock_bh(&sk->sk_lock.slock);
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * Slightly more convenient version of icmpv6_send.
|
|
|
- */
|
|
|
-void icmpv6_param_prob(struct sk_buff *skb, u8 code, int pos)
|
|
|
-{
|
|
|
- icmpv6_send(skb, ICMPV6_PARAMPROB, code, pos);
|
|
|
- kfree_skb(skb);
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* Figure out, may we reply to this packet with icmp error.
|
|
|
*
|
|
@@ -332,7 +323,7 @@ static struct dst_entry *icmpv6_route_lookup(struct net *net, struct sk_buff *sk
|
|
|
* anycast.
|
|
|
*/
|
|
|
if (((struct rt6_info *)dst)->rt6i_flags & RTF_ANYCAST) {
|
|
|
- LIMIT_NETDEBUG(KERN_DEBUG "icmpv6_send: acast source\n");
|
|
|
+ LIMIT_NETDEBUG(KERN_DEBUG "icmp6_send: acast source\n");
|
|
|
dst_release(dst);
|
|
|
return ERR_PTR(-EINVAL);
|
|
|
}
|
|
@@ -381,7 +372,7 @@ relookup_failed:
|
|
|
/*
|
|
|
* Send an ICMP message in response to a packet in error
|
|
|
*/
|
|
|
-void icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info)
|
|
|
+static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info)
|
|
|
{
|
|
|
struct net *net = dev_net(skb->dev);
|
|
|
struct inet6_dev *idev = NULL;
|
|
@@ -406,7 +397,7 @@ void icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info)
|
|
|
/*
|
|
|
* Make sure we respect the rules
|
|
|
* i.e. RFC 1885 2.4(e)
|
|
|
- * Rule (e.1) is enforced by not using icmpv6_send
|
|
|
+ * Rule (e.1) is enforced by not using icmp6_send
|
|
|
* in any code that processes icmp errors.
|
|
|
*/
|
|
|
addr_type = ipv6_addr_type(&hdr->daddr);
|
|
@@ -444,7 +435,7 @@ void icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info)
|
|
|
* and anycast addresses will be checked later.
|
|
|
*/
|
|
|
if ((addr_type == IPV6_ADDR_ANY) || (addr_type & IPV6_ADDR_MULTICAST)) {
|
|
|
- LIMIT_NETDEBUG(KERN_DEBUG "icmpv6_send: addr_any/mcast source\n");
|
|
|
+ LIMIT_NETDEBUG(KERN_DEBUG "icmp6_send: addr_any/mcast source\n");
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -452,7 +443,7 @@ void icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info)
|
|
|
* Never answer to a ICMP packet.
|
|
|
*/
|
|
|
if (is_ineligible(skb)) {
|
|
|
- LIMIT_NETDEBUG(KERN_DEBUG "icmpv6_send: no reply to icmp error\n");
|
|
|
+ LIMIT_NETDEBUG(KERN_DEBUG "icmp6_send: no reply to icmp error\n");
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -529,7 +520,14 @@ out_dst_release:
|
|
|
out:
|
|
|
icmpv6_xmit_unlock(sk);
|
|
|
}
|
|
|
-EXPORT_SYMBOL(icmpv6_send);
|
|
|
+
|
|
|
+/* Slightly more convenient version of icmp6_send.
|
|
|
+ */
|
|
|
+void icmpv6_param_prob(struct sk_buff *skb, u8 code, int pos)
|
|
|
+{
|
|
|
+ icmp6_send(skb, ICMPV6_PARAMPROB, code, pos);
|
|
|
+ kfree_skb(skb);
|
|
|
+}
|
|
|
|
|
|
static void icmpv6_echo_reply(struct sk_buff *skb)
|
|
|
{
|
|
@@ -885,8 +883,14 @@ int __init icmpv6_init(void)
|
|
|
err = -EAGAIN;
|
|
|
if (inet6_add_protocol(&icmpv6_protocol, IPPROTO_ICMPV6) < 0)
|
|
|
goto fail;
|
|
|
+
|
|
|
+ err = inet6_register_icmp_sender(icmp6_send);
|
|
|
+ if (err)
|
|
|
+ goto sender_reg_err;
|
|
|
return 0;
|
|
|
|
|
|
+sender_reg_err:
|
|
|
+ inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
|
|
|
fail:
|
|
|
pr_err("Failed to register ICMP6 protocol\n");
|
|
|
unregister_pernet_subsys(&icmpv6_sk_ops);
|
|
@@ -895,6 +899,7 @@ fail:
|
|
|
|
|
|
void icmpv6_cleanup(void)
|
|
|
{
|
|
|
+ inet6_unregister_icmp_sender(icmp6_send);
|
|
|
unregister_pernet_subsys(&icmpv6_sk_ops);
|
|
|
inet6_del_protocol(&icmpv6_protocol, IPPROTO_ICMPV6);
|
|
|
}
|