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>
2010-10-26 01:02:28 +04:00
const struct inet6_protocol __rcu * inet6_protos [ MAX_INET_PROTOS ] __read_mostly ;
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
{
2010-09-09 08:31:35 +04:00
int hash = protocol & ( MAX_INET_PROTOS - 1 ) ;
2005-04-17 02:20:36 +04:00
2010-10-26 01:02:28 +04:00
return ! cmpxchg ( ( const struct inet6_protocol * * ) & inet6_protos [ hash ] ,
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 ) ;
2005-04-17 02:20:36 +04:00
/*
* Remove a protocol from the hash tables .
*/
2007-02-09 17:24:49 +03:00
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
{
int ret , hash = protocol & ( MAX_INET_PROTOS - 1 ) ;
2010-10-26 01:02:28 +04:00
ret = ( cmpxchg ( ( const struct inet6_protocol * * ) & inet6_protos [ hash ] ,
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 ) ;