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 .
*
* 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 .
*/
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>
2009-09-14 12:21:47 +00:00
const struct net_protocol * inet_protos [ MAX_INET_PROTOS ] ____cacheline_aligned_in_smp ;
2005-04-16 15:20:36 -07:00
static DEFINE_SPINLOCK ( inet_proto_lock ) ;
/*
* Add a protocol handler to the hash tables
*/
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
{
int hash , ret ;
hash = protocol & ( MAX_INET_PROTOS - 1 ) ;
spin_lock_bh ( & inet_proto_lock ) ;
if ( inet_protos [ hash ] ) {
ret = - 1 ;
} else {
inet_protos [ hash ] = prot ;
ret = 0 ;
}
spin_unlock_bh ( & inet_proto_lock ) ;
return ret ;
}
/*
* Remove a protocol from the hash tables .
*/
2007-02-09 23:24:47 +09:00
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
{
int hash , ret ;
hash = protocol & ( MAX_INET_PROTOS - 1 ) ;
spin_lock_bh ( & inet_proto_lock ) ;
if ( inet_protos [ hash ] = = prot ) {
inet_protos [ hash ] = NULL ;
ret = 0 ;
} else {
ret = - 1 ;
}
spin_unlock_bh ( & inet_proto_lock ) ;
synchronize_net ( ) ;
return ret ;
}
EXPORT_SYMBOL ( inet_add_protocol ) ;
EXPORT_SYMBOL ( inet_del_protocol ) ;