linux/net/ipv6/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 *              PF_INET6 protocol dispatch tables.
   8 *
   9 * Authors:     Pedro Roque     <roque@di.fc.ul.pt>
  10 */
  11
  12/*
  13 *      Changes:
  14 *
  15 *      Vince Laviano (vince@cs.stanford.edu)       16 May 2001
  16 *      - Removed unused variable 'inet6_protocol_base'
  17 *      - Modified inet6_del_protocol() to correctly maintain copy bit.
  18 */
  19#include <linux/module.h>
  20#include <linux/netdevice.h>
  21#include <linux/spinlock.h>
  22#include <net/protocol.h>
  23
  24#if IS_ENABLED(CONFIG_IPV6)
  25struct inet6_protocol __rcu *inet6_protos[MAX_INET_PROTOS] __read_mostly;
  26EXPORT_SYMBOL(inet6_protos);
  27
  28int inet6_add_protocol(const struct inet6_protocol *prot, unsigned char protocol)
  29{
  30        return !cmpxchg((const struct inet6_protocol **)&inet6_protos[protocol],
  31                        NULL, prot) ? 0 : -1;
  32}
  33EXPORT_SYMBOL(inet6_add_protocol);
  34
  35int inet6_del_protocol(const struct inet6_protocol *prot, unsigned char protocol)
  36{
  37        int ret;
  38
  39        ret = (cmpxchg((const struct inet6_protocol **)&inet6_protos[protocol],
  40                       prot, NULL) == prot) ? 0 : -1;
  41
  42        synchronize_net();
  43
  44        return ret;
  45}
  46EXPORT_SYMBOL(inet6_del_protocol);
  47#endif
  48
  49const struct net_offload __rcu *inet6_offloads[MAX_INET_PROTOS] __read_mostly;
  50EXPORT_SYMBOL(inet6_offloads);
  51
  52int inet6_add_offload(const struct net_offload *prot, unsigned char protocol)
  53{
  54        return !cmpxchg((const struct net_offload **)&inet6_offloads[protocol],
  55                        NULL, prot) ? 0 : -1;
  56}
  57EXPORT_SYMBOL(inet6_add_offload);
  58
  59int inet6_del_offload(const struct net_offload *prot, unsigned char protocol)
  60{
  61        int ret;
  62
  63        ret = (cmpxchg((const struct net_offload **)&inet6_offloads[protocol],
  64                       prot, NULL) == prot) ? 0 : -1;
  65
  66        synchronize_net();
  67
  68        return ret;
  69}
  70EXPORT_SYMBOL(inet6_del_offload);
  71