Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0-or-later
2 : : /*
3 : : * UDPLITE An implementation of the UDP-Lite protocol (RFC 3828).
4 : : *
5 : : * Authors: Gerrit Renker <gerrit@erg.abdn.ac.uk>
6 : : *
7 : : * Changes:
8 : : * Fixes:
9 : : */
10 : :
11 : : #define pr_fmt(fmt) "UDPLite: " fmt
12 : :
13 : : #include <linux/export.h>
14 : : #include <linux/proc_fs.h>
15 : : #include "udp_impl.h"
16 : :
17 : : struct udp_table udplite_table __read_mostly;
18 : : EXPORT_SYMBOL(udplite_table);
19 : :
20 : 0 : static int udplite_rcv(struct sk_buff *skb)
21 : : {
22 : 0 : return __udp4_lib_rcv(skb, &udplite_table, IPPROTO_UDPLITE);
23 : : }
24 : :
25 : 0 : static int udplite_err(struct sk_buff *skb, u32 info)
26 : : {
27 : 0 : return __udp4_lib_err(skb, info, &udplite_table);
28 : : }
29 : :
30 : : static const struct net_protocol udplite_protocol = {
31 : : .handler = udplite_rcv,
32 : : .err_handler = udplite_err,
33 : : .no_policy = 1,
34 : : .netns_ok = 1,
35 : : };
36 : :
37 : : struct proto udplite_prot = {
38 : : .name = "UDP-Lite",
39 : : .owner = THIS_MODULE,
40 : : .close = udp_lib_close,
41 : : .connect = ip4_datagram_connect,
42 : : .disconnect = udp_disconnect,
43 : : .ioctl = udp_ioctl,
44 : : .init = udplite_sk_init,
45 : : .destroy = udp_destroy_sock,
46 : : .setsockopt = udp_setsockopt,
47 : : .getsockopt = udp_getsockopt,
48 : : .sendmsg = udp_sendmsg,
49 : : .recvmsg = udp_recvmsg,
50 : : .sendpage = udp_sendpage,
51 : : .hash = udp_lib_hash,
52 : : .unhash = udp_lib_unhash,
53 : : .rehash = udp_v4_rehash,
54 : : .get_port = udp_v4_get_port,
55 : : .memory_allocated = &udp_memory_allocated,
56 : : .sysctl_mem = sysctl_udp_mem,
57 : : .obj_size = sizeof(struct udp_sock),
58 : : .h.udp_table = &udplite_table,
59 : : #ifdef CONFIG_COMPAT
60 : : .compat_setsockopt = compat_udp_setsockopt,
61 : : .compat_getsockopt = compat_udp_getsockopt,
62 : : #endif
63 : : };
64 : : EXPORT_SYMBOL(udplite_prot);
65 : :
66 : : static struct inet_protosw udplite4_protosw = {
67 : : .type = SOCK_DGRAM,
68 : : .protocol = IPPROTO_UDPLITE,
69 : : .prot = &udplite_prot,
70 : : .ops = &inet_dgram_ops,
71 : : .flags = INET_PROTOSW_PERMANENT,
72 : : };
73 : :
74 : : #ifdef CONFIG_PROC_FS
75 : : static struct udp_seq_afinfo udplite4_seq_afinfo = {
76 : : .family = AF_INET,
77 : : .udp_table = &udplite_table,
78 : : };
79 : :
80 : 207 : static int __net_init udplite4_proc_init_net(struct net *net)
81 : : {
82 [ + - ]: 207 : if (!proc_create_net_data("udplite", 0444, net->proc_net, &udp_seq_ops,
83 : : sizeof(struct udp_iter_state), &udplite4_seq_afinfo))
84 : : return -ENOMEM;
85 : 207 : return 0;
86 : : }
87 : :
88 : 0 : static void __net_exit udplite4_proc_exit_net(struct net *net)
89 : : {
90 : 0 : remove_proc_entry("udplite", net->proc_net);
91 : 0 : }
92 : :
93 : : static struct pernet_operations udplite4_net_ops = {
94 : : .init = udplite4_proc_init_net,
95 : : .exit = udplite4_proc_exit_net,
96 : : };
97 : :
98 : 207 : static __init int udplite4_proc_init(void)
99 : : {
100 : 207 : return register_pernet_subsys(&udplite4_net_ops);
101 : : }
102 : : #else
103 : : static inline int udplite4_proc_init(void)
104 : : {
105 : : return 0;
106 : : }
107 : : #endif
108 : :
109 : 207 : void __init udplite4_register(void)
110 : : {
111 : 207 : udp_table_init(&udplite_table, "UDP-Lite");
112 [ + - ]: 207 : if (proto_register(&udplite_prot, 1))
113 : : goto out_register_err;
114 : :
115 [ + - ]: 207 : if (inet_add_protocol(&udplite_protocol, IPPROTO_UDPLITE) < 0)
116 : : goto out_unregister_proto;
117 : :
118 : 207 : inet_register_protosw(&udplite4_protosw);
119 : :
120 [ - + ]: 207 : if (udplite4_proc_init())
121 : 0 : pr_err("%s: Cannot register /proc!\n", __func__);
122 : 207 : return;
123 : :
124 : : out_unregister_proto:
125 : 0 : proto_unregister(&udplite_prot);
126 : : out_register_err:
127 : 0 : pr_crit("%s: Cannot add UDP-Lite protocol\n", __func__);
128 : : }
|