root/net/ipv6/udplite.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. udplitev6_rcv
  2. udplitev6_err
  3. udplitev6_init
  4. udplitev6_exit
  5. udplite6_proc_init_net
  6. udplite6_proc_exit_net
  7. udplite6_proc_init
  8. udplite6_proc_exit

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  *  UDPLITEv6   An implementation of the UDP-Lite protocol over IPv6.
   4  *              See also net/ipv4/udplite.c
   5  *
   6  *  Authors:    Gerrit Renker       <gerrit@erg.abdn.ac.uk>
   7  *
   8  *  Changes:
   9  *  Fixes:
  10  */
  11 #include <linux/export.h>
  12 #include <linux/proc_fs.h>
  13 #include "udp_impl.h"
  14 
  15 static int udplitev6_rcv(struct sk_buff *skb)
  16 {
  17         return __udp6_lib_rcv(skb, &udplite_table, IPPROTO_UDPLITE);
  18 }
  19 
  20 static int udplitev6_err(struct sk_buff *skb,
  21                           struct inet6_skb_parm *opt,
  22                           u8 type, u8 code, int offset, __be32 info)
  23 {
  24         return __udp6_lib_err(skb, opt, type, code, offset, info,
  25                               &udplite_table);
  26 }
  27 
  28 static const struct inet6_protocol udplitev6_protocol = {
  29         .handler        =       udplitev6_rcv,
  30         .err_handler    =       udplitev6_err,
  31         .flags          =       INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
  32 };
  33 
  34 struct proto udplitev6_prot = {
  35         .name              = "UDPLITEv6",
  36         .owner             = THIS_MODULE,
  37         .close             = udp_lib_close,
  38         .connect           = ip6_datagram_connect,
  39         .disconnect        = udp_disconnect,
  40         .ioctl             = udp_ioctl,
  41         .init              = udplite_sk_init,
  42         .destroy           = udpv6_destroy_sock,
  43         .setsockopt        = udpv6_setsockopt,
  44         .getsockopt        = udpv6_getsockopt,
  45         .sendmsg           = udpv6_sendmsg,
  46         .recvmsg           = udpv6_recvmsg,
  47         .hash              = udp_lib_hash,
  48         .unhash            = udp_lib_unhash,
  49         .rehash            = udp_v6_rehash,
  50         .get_port          = udp_v6_get_port,
  51         .memory_allocated  = &udp_memory_allocated,
  52         .sysctl_mem        = sysctl_udp_mem,
  53         .obj_size          = sizeof(struct udp6_sock),
  54         .h.udp_table       = &udplite_table,
  55 #ifdef CONFIG_COMPAT
  56         .compat_setsockopt = compat_udpv6_setsockopt,
  57         .compat_getsockopt = compat_udpv6_getsockopt,
  58 #endif
  59 };
  60 
  61 static struct inet_protosw udplite6_protosw = {
  62         .type           = SOCK_DGRAM,
  63         .protocol       = IPPROTO_UDPLITE,
  64         .prot           = &udplitev6_prot,
  65         .ops            = &inet6_dgram_ops,
  66         .flags          = INET_PROTOSW_PERMANENT,
  67 };
  68 
  69 int __init udplitev6_init(void)
  70 {
  71         int ret;
  72 
  73         ret = inet6_add_protocol(&udplitev6_protocol, IPPROTO_UDPLITE);
  74         if (ret)
  75                 goto out;
  76 
  77         ret = inet6_register_protosw(&udplite6_protosw);
  78         if (ret)
  79                 goto out_udplitev6_protocol;
  80 out:
  81         return ret;
  82 
  83 out_udplitev6_protocol:
  84         inet6_del_protocol(&udplitev6_protocol, IPPROTO_UDPLITE);
  85         goto out;
  86 }
  87 
  88 void udplitev6_exit(void)
  89 {
  90         inet6_unregister_protosw(&udplite6_protosw);
  91         inet6_del_protocol(&udplitev6_protocol, IPPROTO_UDPLITE);
  92 }
  93 
  94 #ifdef CONFIG_PROC_FS
  95 static struct udp_seq_afinfo udplite6_seq_afinfo = {
  96         .family         = AF_INET6,
  97         .udp_table      = &udplite_table,
  98 };
  99 
 100 static int __net_init udplite6_proc_init_net(struct net *net)
 101 {
 102         if (!proc_create_net_data("udplite6", 0444, net->proc_net,
 103                         &udp6_seq_ops, sizeof(struct udp_iter_state),
 104                         &udplite6_seq_afinfo))
 105                 return -ENOMEM;
 106         return 0;
 107 }
 108 
 109 static void __net_exit udplite6_proc_exit_net(struct net *net)
 110 {
 111         remove_proc_entry("udplite6", net->proc_net);
 112 }
 113 
 114 static struct pernet_operations udplite6_net_ops = {
 115         .init = udplite6_proc_init_net,
 116         .exit = udplite6_proc_exit_net,
 117 };
 118 
 119 int __init udplite6_proc_init(void)
 120 {
 121         return register_pernet_subsys(&udplite6_net_ops);
 122 }
 123 
 124 void udplite6_proc_exit(void)
 125 {
 126         unregister_pernet_subsys(&udplite6_net_ops);
 127 }
 128 #endif

/* [<][>][^][v][top][bottom][index][help] */