0001
0002
0003
0004
0005
0006
0007
0008
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 }