net: ipv4: add IPPROTO_ICMP socket kind
[pandora-kernel.git] / net / ipv4 / af_inet.c
index 851aa05..cc14631 100644 (file)
 #include <net/tcp.h>
 #include <net/udp.h>
 #include <net/udplite.h>
+#include <net/ping.h>
 #include <linux/skbuff.h>
 #include <net/sock.h>
 #include <net/raw.h>
@@ -1008,6 +1009,14 @@ static struct inet_protosw inetsw_array[] =
                .flags =      INET_PROTOSW_PERMANENT,
        },
 
+       {
+               .type =       SOCK_DGRAM,
+               .protocol =   IPPROTO_ICMP,
+               .prot =       &ping_prot,
+               .ops =        &inet_dgram_ops,
+               .no_check =   UDP_CSUM_DEFAULT,
+               .flags =      INET_PROTOSW_REUSE,
+       },
 
        {
               .type =       SOCK_RAW,
@@ -1527,6 +1536,7 @@ static const struct net_protocol udp_protocol = {
 
 static const struct net_protocol icmp_protocol = {
        .handler =      icmp_rcv,
+       .err_handler =  ping_err,
        .no_policy =    1,
        .netns_ok =     1,
 };
@@ -1642,6 +1652,10 @@ static int __init inet_init(void)
        if (rc)
                goto out_unregister_udp_proto;
 
+       rc = proto_register(&ping_prot, 1);
+       if (rc)
+               goto out_unregister_raw_proto;
+
        /*
         *      Tell SOCKET that we are alive...
         */
@@ -1697,6 +1711,8 @@ static int __init inet_init(void)
        /* Add UDP-Lite (RFC 3828) */
        udplite4_register();
 
+       ping_init();
+
        /*
         *      Set the ICMP layer up
         */
@@ -1727,6 +1743,8 @@ static int __init inet_init(void)
        rc = 0;
 out:
        return rc;
+out_unregister_raw_proto:
+       proto_unregister(&raw_prot);
 out_unregister_udp_proto:
        proto_unregister(&udp_prot);
 out_unregister_tcp_proto:
@@ -1751,11 +1769,15 @@ static int __init ipv4_proc_init(void)
                goto out_tcp;
        if (udp4_proc_init())
                goto out_udp;
+       if (ping_proc_init())
+               goto out_ping;
        if (ip_misc_proc_init())
                goto out_misc;
 out:
        return rc;
 out_misc:
+       ping_proc_exit();
+out_ping:
        udp4_proc_exit();
 out_udp:
        tcp4_proc_exit();