Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  *  UDPLITE     An implementation of the UDP-Lite protocol (RFC 3828).
0004  *
0005  *  Authors:    Gerrit Renker       <gerrit@erg.abdn.ac.uk>
0006  *
0007  *  Changes:
0008  *  Fixes:
0009  */
0010 
0011 #define pr_fmt(fmt) "UDPLite: " fmt
0012 
0013 #include <linux/export.h>
0014 #include <linux/proc_fs.h>
0015 #include "udp_impl.h"
0016 
0017 struct udp_table    udplite_table __read_mostly;
0018 EXPORT_SYMBOL(udplite_table);
0019 
0020 static int udplite_rcv(struct sk_buff *skb)
0021 {
0022     return __udp4_lib_rcv(skb, &udplite_table, IPPROTO_UDPLITE);
0023 }
0024 
0025 static int udplite_err(struct sk_buff *skb, u32 info)
0026 {
0027     return __udp4_lib_err(skb, info, &udplite_table);
0028 }
0029 
0030 static const struct net_protocol udplite_protocol = {
0031     .handler    = udplite_rcv,
0032     .err_handler    = udplite_err,
0033     .no_policy  = 1,
0034 };
0035 
0036 struct proto    udplite_prot = {
0037     .name          = "UDP-Lite",
0038     .owner         = THIS_MODULE,
0039     .close         = udp_lib_close,
0040     .connect       = ip4_datagram_connect,
0041     .disconnect    = udp_disconnect,
0042     .ioctl         = udp_ioctl,
0043     .init          = udplite_sk_init,
0044     .destroy       = udp_destroy_sock,
0045     .setsockopt    = udp_setsockopt,
0046     .getsockopt    = udp_getsockopt,
0047     .sendmsg       = udp_sendmsg,
0048     .recvmsg       = udp_recvmsg,
0049     .sendpage      = udp_sendpage,
0050     .hash          = udp_lib_hash,
0051     .unhash        = udp_lib_unhash,
0052     .rehash        = udp_v4_rehash,
0053     .get_port      = udp_v4_get_port,
0054 
0055     .memory_allocated  = &udp_memory_allocated,
0056     .per_cpu_fw_alloc  = &udp_memory_per_cpu_fw_alloc,
0057 
0058     .sysctl_mem    = sysctl_udp_mem,
0059     .obj_size      = sizeof(struct udp_sock),
0060     .h.udp_table       = &udplite_table,
0061 };
0062 EXPORT_SYMBOL(udplite_prot);
0063 
0064 static struct inet_protosw udplite4_protosw = {
0065     .type       =  SOCK_DGRAM,
0066     .protocol   =  IPPROTO_UDPLITE,
0067     .prot       =  &udplite_prot,
0068     .ops        =  &inet_dgram_ops,
0069     .flags      =  INET_PROTOSW_PERMANENT,
0070 };
0071 
0072 #ifdef CONFIG_PROC_FS
0073 static struct udp_seq_afinfo udplite4_seq_afinfo = {
0074     .family     = AF_INET,
0075     .udp_table  = &udplite_table,
0076 };
0077 
0078 static int __net_init udplite4_proc_init_net(struct net *net)
0079 {
0080     if (!proc_create_net_data("udplite", 0444, net->proc_net, &udp_seq_ops,
0081             sizeof(struct udp_iter_state), &udplite4_seq_afinfo))
0082         return -ENOMEM;
0083     return 0;
0084 }
0085 
0086 static void __net_exit udplite4_proc_exit_net(struct net *net)
0087 {
0088     remove_proc_entry("udplite", net->proc_net);
0089 }
0090 
0091 static struct pernet_operations udplite4_net_ops = {
0092     .init = udplite4_proc_init_net,
0093     .exit = udplite4_proc_exit_net,
0094 };
0095 
0096 static __init int udplite4_proc_init(void)
0097 {
0098     return register_pernet_subsys(&udplite4_net_ops);
0099 }
0100 #else
0101 static inline int udplite4_proc_init(void)
0102 {
0103     return 0;
0104 }
0105 #endif
0106 
0107 void __init udplite4_register(void)
0108 {
0109     udp_table_init(&udplite_table, "UDP-Lite");
0110     if (proto_register(&udplite_prot, 1))
0111         goto out_register_err;
0112 
0113     if (inet_add_protocol(&udplite_protocol, IPPROTO_UDPLITE) < 0)
0114         goto out_unregister_proto;
0115 
0116     inet_register_protosw(&udplite4_protosw);
0117 
0118     if (udplite4_proc_init())
0119         pr_err("%s: Cannot register /proc!\n", __func__);
0120     return;
0121 
0122 out_unregister_proto:
0123     proto_unregister(&udplite_prot);
0124 out_register_err:
0125     pr_crit("%s: Cannot add UDP-Lite protocol\n", __func__);
0126 }