2005-04-17 02:20:36 +04:00
/*
* INET An implementation of the TCP / IP protocol suite for the LINUX
* operating system . INET is implemented using the BSD Socket
* interface as the means of communication with the user level .
*
* PF_INET6 protocol dispatch tables .
*
* Authors : Pedro Roque < roque @ di . fc . ul . pt >
*
* 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 .
*/
/*
* Changes :
*
* Vince Laviano ( vince @ cs . stanford . edu ) 16 May 2001
* - Removed unused variable ' inet6_protocol_base '
* - Modified inet6_del_protocol ( ) to correctly maintain copy bit .
*/
2009-09-09 14:43:50 +04:00
# include <linux/module.h>
2005-04-17 02:20:36 +04:00
# include <linux/netdevice.h>
2009-09-09 14:43:50 +04:00
# include <linux/spinlock.h>
2005-04-17 02:20:36 +04:00
# include <net/protocol.h>
2012-11-15 12:49:22 +04:00
# if IS_ENABLED(CONFIG_IPV6)
2017-03-23 22:34:16 +03:00
struct inet6_protocol __rcu * inet6_protos [ MAX_INET_PROTOS ] __read_mostly ;
2012-11-15 12:49:22 +04:00
EXPORT_SYMBOL ( inet6_protos ) ;
2005-04-17 02:20:36 +04:00
2009-09-14 16:22:28 +04:00
int inet6_add_protocol ( const struct inet6_protocol * prot , unsigned char protocol )
2005-04-17 02:20:36 +04:00
{
2012-06-20 05:56:21 +04:00
return ! cmpxchg ( ( const struct inet6_protocol * * ) & inet6_protos [ protocol ] ,
2010-10-26 01:02:28 +04:00
NULL , prot ) ? 0 : - 1 ;
2005-04-17 02:20:36 +04:00
}
2007-02-22 16:05:40 +03:00
EXPORT_SYMBOL ( inet6_add_protocol ) ;
2009-09-14 16:22:28 +04:00
int inet6_del_protocol ( const struct inet6_protocol * prot , unsigned char protocol )
2005-04-17 02:20:36 +04:00
{
2012-06-20 05:56:21 +04:00
int ret ;
2005-04-17 02:20:36 +04:00
2012-06-20 05:56:21 +04:00
ret = ( cmpxchg ( ( const struct inet6_protocol * * ) & inet6_protos [ protocol ] ,
2010-10-26 01:02:28 +04:00
prot , NULL ) = = prot ) ? 0 : - 1 ;
2005-04-17 02:20:36 +04:00
synchronize_net ( ) ;
return ret ;
}
2007-02-22 16:05:40 +03:00
EXPORT_SYMBOL ( inet6_del_protocol ) ;
2012-11-15 12:49:22 +04:00
# endif
const struct net_offload __rcu * inet6_offloads [ MAX_INET_PROTOS ] __read_mostly ;
2014-09-17 23:25:55 +04:00
EXPORT_SYMBOL ( inet6_offloads ) ;
2012-11-15 12:49:22 +04:00
int inet6_add_offload ( const struct net_offload * prot , unsigned char protocol )
{
return ! cmpxchg ( ( const struct net_offload * * ) & inet6_offloads [ protocol ] ,
NULL , prot ) ? 0 : - 1 ;
}
EXPORT_SYMBOL ( inet6_add_offload ) ;
2012-11-15 12:49:13 +04:00
int inet6_del_offload ( const struct net_offload * prot , unsigned char protocol )
{
int ret ;
ret = ( cmpxchg ( ( const struct net_offload * * ) & inet6_offloads [ protocol ] ,
prot , NULL ) = = prot ) ? 0 : - 1 ;
synchronize_net ( ) ;
return ret ;
}
EXPORT_SYMBOL ( inet6_del_offload ) ;