2006-11-27 22:10:57 +03:00
/*
* UDPLITEv6 An implementation of the UDP - Lite protocol over IPv6 .
* See also net / ipv4 / udplite . c
*
* Authors : Gerrit Renker < gerrit @ erg . abdn . ac . uk >
*
* Changes :
* Fixes :
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*/
# include "udp_impl.h"
2007-10-15 23:50:28 +04:00
static int udplitev6_rcv ( struct sk_buff * skb )
2006-11-27 22:10:57 +03:00
{
2007-10-15 23:50:28 +04:00
return __udp6_lib_rcv ( skb , udplite_hash , IPPROTO_UDPLITE ) ;
2006-11-27 22:10:57 +03:00
}
2006-12-01 04:22:29 +03:00
static void udplitev6_err ( struct sk_buff * skb ,
struct inet6_skb_parm * opt ,
int type , int code , int offset , __be32 info )
2006-11-27 22:10:57 +03:00
{
2008-01-22 11:09:55 +03:00
__udp6_lib_err ( skb , opt , type , code , offset , info , udplite_hash ) ;
2006-11-27 22:10:57 +03:00
}
static struct inet6_protocol udplitev6_protocol = {
. handler = udplitev6_rcv ,
. err_handler = udplitev6_err ,
. flags = INET6_PROTO_NOPOLICY | INET6_PROTO_FINAL ,
} ;
struct proto udplitev6_prot = {
. name = " UDPLITEv6 " ,
. owner = THIS_MODULE ,
. close = udp_lib_close ,
. connect = ip6_datagram_connect ,
. disconnect = udp_disconnect ,
. ioctl = udp_ioctl ,
. init = udplite_sk_init ,
. destroy = udpv6_destroy_sock ,
. setsockopt = udpv6_setsockopt ,
. getsockopt = udpv6_getsockopt ,
. sendmsg = udpv6_sendmsg ,
. recvmsg = udpv6_recvmsg ,
. backlog_rcv = udpv6_queue_rcv_skb ,
. hash = udp_lib_hash ,
. unhash = udp_lib_unhash ,
2008-03-23 02:51:21 +03:00
. get_port = udp_v6_get_port ,
2006-11-27 22:10:57 +03:00
. obj_size = sizeof ( struct udp6_sock ) ,
2008-03-23 02:51:21 +03:00
. h . udp_hash = udplite_hash ,
2006-11-27 22:10:57 +03:00
# ifdef CONFIG_COMPAT
. compat_setsockopt = compat_udpv6_setsockopt ,
. compat_getsockopt = compat_udpv6_getsockopt ,
# endif
} ;
static struct inet_protosw udplite6_protosw = {
. type = SOCK_DGRAM ,
. protocol = IPPROTO_UDPLITE ,
. prot = & udplitev6_prot ,
. ops = & inet6_dgram_ops ,
. capability = - 1 ,
. no_check = 0 ,
. flags = INET_PROTOSW_PERMANENT ,
} ;
2007-12-11 13:25:35 +03:00
int __init udplitev6_init ( void )
2006-11-27 22:10:57 +03:00
{
2007-12-11 13:25:35 +03:00
int ret ;
2006-11-27 22:10:57 +03:00
2007-12-11 13:25:35 +03:00
ret = inet6_add_protocol ( & udplitev6_protocol , IPPROTO_UDPLITE ) ;
if ( ret )
goto out ;
ret = inet6_register_protosw ( & udplite6_protosw ) ;
if ( ret )
goto out_udplitev6_protocol ;
out :
return ret ;
out_udplitev6_protocol :
inet6_del_protocol ( & udplitev6_protocol , IPPROTO_UDPLITE ) ;
goto out ;
}
2007-12-13 16:34:58 +03:00
void udplitev6_exit ( void )
2007-12-11 13:25:35 +03:00
{
inet6_unregister_protosw ( & udplite6_protosw ) ;
inet6_del_protocol ( & udplitev6_protocol , IPPROTO_UDPLITE ) ;
2006-11-27 22:10:57 +03:00
}
# ifdef CONFIG_PROC_FS
static struct udp_seq_afinfo udplite6_seq_afinfo = {
. name = " udplite6 " ,
. family = AF_INET6 ,
. hashtable = udplite_hash ,
2008-03-29 04:25:53 +03:00
. seq_fops = {
. owner = THIS_MODULE ,
} ,
2008-03-29 04:24:26 +03:00
. seq_ops = {
. show = udp6_seq_show ,
} ,
2006-11-27 22:10:57 +03:00
} ;
2008-03-25 00:56:57 +03:00
static int udplite6_proc_init_net ( struct net * net )
{
return udp_proc_register ( net , & udplite6_seq_afinfo ) ;
}
static void udplite6_proc_exit_net ( struct net * net )
{
udp_proc_unregister ( net , & udplite6_seq_afinfo ) ;
}
static struct pernet_operations udplite6_net_ops = {
. init = udplite6_proc_init_net ,
. exit = udplite6_proc_exit_net ,
} ;
2006-11-27 22:10:57 +03:00
int __init udplite6_proc_init ( void )
{
2008-03-25 00:56:57 +03:00
return register_pernet_subsys ( & udplite6_net_ops ) ;
2006-11-27 22:10:57 +03:00
}
void udplite6_proc_exit ( void )
{
2008-03-25 00:56:57 +03:00
unregister_pernet_subsys ( & udplite6_net_ops ) ;
2006-11-27 22:10:57 +03:00
}
# endif