linux/net/ipv4/protocol.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * INET         An implementation of the TCP/IP protocol suite for the LINUX
   4 *              operating system.  INET is implemented using the  BSD Socket
   5 *              interface as the means of communication with the user level.
   6 *
   7 *              INET protocol dispatch tables.
   8 *
   9 * Authors:     Ross Biro
  10 *              Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  11 *
  12 * Fixes:
  13 *              Alan Cox        : Ahah! udp icmp errors don't work because
  14 *                                udp_err is never called!
  15 *              Alan Cox        : Added new fields for init and ready for
  16 *                                proper fragmentation (_NO_ 4K limits!)
  17 *              Richard Colella : Hang on hash collision
  18 *              Vince Laviano   : Modified inet_del_protocol() to correctly
  19 *                                maintain copy bit.
  20 */
  21#include <linux/cache.h>
  22#include <linux/module.h>
  23#include <linux/netdevice.h>
  24#include <linux/spinlock.h>
  25#include <net/protocol.h>
  26
  27struct net_protocol __rcu *inet_protos[MAX_INET_PROTOS] __read_mostly;
  28EXPORT_SYMBOL(inet_protos);
  29const struct net_offload __rcu *inet_offloads[MAX_INET_PROTOS] __read_mostly;
  30EXPORT_SYMBOL(inet_offloads);
  31
  32int inet_add_protocol(const struct net_protocol *prot, unsigned char protocol)
  33{
  34        return !cmpxchg((const struct net_protocol **)&inet_protos[protocol],
  35                        NULL, prot) ? 0 : -1;
  36}
  37EXPORT_SYMBOL(inet_add_protocol);
  38
  39int inet_add_offload(const struct net_offload *prot, unsigned char protocol)
  40{
  41        return !cmpxchg((const struct net_offload **)&inet_offloads[protocol],
  42                        NULL, prot) ? 0 : -1;
  43}
  44EXPORT_SYMBOL(inet_add_offload);
  45
  46int inet_del_protocol(const struct net_protocol *prot, unsigned char protocol)
  47{
  48        int ret;
  49
  50        ret = (cmpxchg((const struct net_protocol **)&inet_protos[protocol],
  51                       prot, NULL) == prot) ? 0 : -1;
  52
  53        synchronize_net();
  54
  55        return ret;
  56}
  57EXPORT_SYMBOL(inet_del_protocol);
  58
  59int inet_del_offload(const struct net_offload *prot, unsigned char protocol)
  60{
  61        int ret;
  62
  63        ret = (cmpxchg((const struct net_offload **)&inet_offloads[protocol],
  64                       prot, NULL) == prot) ? 0 : -1;
  65
  66        synchronize_net();
  67
  68        return ret;
  69}
  70EXPORT_SYMBOL(inet_del_offload);
  71