2019-05-27 08:55:01 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
2005-04-16 15:20:36 -07: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 .
*
* INET protocol dispatch tables .
*
2005-05-05 16:16:16 -07:00
* Authors : Ross Biro
2005-04-16 15:20:36 -07:00
* Fred N . van Kempen , < waltje @ uWalt . NL . Mugnet . ORG >
*
* Fixes :
* Alan Cox : Ahah ! udp icmp errors don ' t work because
* udp_err is never called !
* Alan Cox : Added new fields for init and ready for
* proper fragmentation ( _NO_ 4 K limits ! )
* Richard Colella : Hang on hash collision
* Vince Laviano : Modified inet_del_protocol ( ) to correctly
* maintain copy bit .
*/
2009-09-09 03:43:50 -07:00
# include <linux/cache.h>
2005-04-16 15:20:36 -07:00
# include <linux/module.h>
# include <linux/netdevice.h>
2009-09-09 03:43:50 -07:00
# include <linux/spinlock.h>
2005-04-16 15:20:36 -07:00
# include <net/protocol.h>
2017-03-23 13:34:16 -06:00
struct net_protocol __rcu * inet_protos [ MAX_INET_PROTOS ] __read_mostly ;
2018-11-08 12:19:23 +01:00
EXPORT_SYMBOL ( inet_protos ) ;
2012-11-15 08:49:12 +00:00
const struct net_offload __rcu * inet_offloads [ MAX_INET_PROTOS ] __read_mostly ;
2014-09-17 12:25:55 -07:00
EXPORT_SYMBOL ( inet_offloads ) ;
2005-04-16 15:20:36 -07:00
2009-09-14 12:21:47 +00:00
int inet_add_protocol ( const struct net_protocol * prot , unsigned char protocol )
2005-04-16 15:20:36 -07:00
{
2012-06-19 18:56:21 -07:00
return ! cmpxchg ( ( const struct net_protocol * * ) & inet_protos [ protocol ] ,
2010-10-25 21:02:28 +00:00
NULL , prot ) ? 0 : - 1 ;
2005-04-16 15:20:36 -07:00
}
2010-07-09 21:22:10 +00:00
EXPORT_SYMBOL ( inet_add_protocol ) ;
2005-04-16 15:20:36 -07:00
2012-11-15 08:49:12 +00:00
int inet_add_offload ( const struct net_offload * prot , unsigned char protocol )
{
return ! cmpxchg ( ( const struct net_offload * * ) & inet_offloads [ protocol ] ,
NULL , prot ) ? 0 : - 1 ;
}
EXPORT_SYMBOL ( inet_add_offload ) ;
2009-09-14 12:21:47 +00:00
int inet_del_protocol ( const struct net_protocol * prot , unsigned char protocol )
2005-04-16 15:20:36 -07:00
{
2012-06-19 18:56:21 -07:00
int ret ;
2005-04-16 15:20:36 -07:00
2012-06-19 18:56:21 -07:00
ret = ( cmpxchg ( ( const struct net_protocol * * ) & inet_protos [ protocol ] ,
2010-10-25 21:02:28 +00:00
prot , NULL ) = = prot ) ? 0 : - 1 ;
2005-04-16 15:20:36 -07:00
synchronize_net ( ) ;
return ret ;
}
EXPORT_SYMBOL ( inet_del_protocol ) ;
2012-11-15 08:49:12 +00:00
int inet_del_offload ( const struct net_offload * prot , unsigned char protocol )
{
int ret ;
ret = ( cmpxchg ( ( const struct net_offload * * ) & inet_offloads [ protocol ] ,
prot , NULL ) = = prot ) ? 0 : - 1 ;
synchronize_net ( ) ;
return ret ;
}
EXPORT_SYMBOL ( inet_del_offload ) ;