Branch data Line data Source code
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 : 0 : static int udplitev6_rcv(struct sk_buff *skb)
16 : : {
17 : 0 : return __udp6_lib_rcv(skb, &udplite_table, IPPROTO_UDPLITE);
18 : : }
19 : :
20 : 0 : 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 : 0 : 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 : 13 : int __init udplitev6_init(void)
70 : : {
71 : 13 : int ret;
72 : :
73 : 13 : ret = inet6_add_protocol(&udplitev6_protocol, IPPROTO_UDPLITE);
74 [ - + ]: 13 : if (ret)
75 : 0 : goto out;
76 : :
77 : 13 : ret = inet6_register_protosw(&udplite6_protosw);
78 [ + - ]: 13 : if (ret)
79 : 0 : goto out_udplitev6_protocol;
80 : 13 : out:
81 : 13 : return ret;
82 : :
83 : : out_udplitev6_protocol:
84 : 0 : inet6_del_protocol(&udplitev6_protocol, IPPROTO_UDPLITE);
85 : 0 : goto out;
86 : : }
87 : :
88 : 0 : void udplitev6_exit(void)
89 : : {
90 : 0 : inet6_unregister_protosw(&udplite6_protosw);
91 : 0 : inet6_del_protocol(&udplitev6_protocol, IPPROTO_UDPLITE);
92 : 0 : }
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 : 13 : static int __net_init udplite6_proc_init_net(struct net *net)
101 : : {
102 [ - + ]: 13 : if (!proc_create_net_data("udplite6", 0444, net->proc_net,
103 : : &udp6_seq_ops, sizeof(struct udp_iter_state),
104 : : &udplite6_seq_afinfo))
105 : 0 : return -ENOMEM;
106 : : return 0;
107 : : }
108 : :
109 : 0 : static void __net_exit udplite6_proc_exit_net(struct net *net)
110 : : {
111 : 0 : remove_proc_entry("udplite6", net->proc_net);
112 : 0 : }
113 : :
114 : : static struct pernet_operations udplite6_net_ops = {
115 : : .init = udplite6_proc_init_net,
116 : : .exit = udplite6_proc_exit_net,
117 : : };
118 : :
119 : 13 : int __init udplite6_proc_init(void)
120 : : {
121 : 13 : return register_pernet_subsys(&udplite6_net_ops);
122 : : }
123 : :
124 : 0 : void udplite6_proc_exit(void)
125 : : {
126 : 0 : unregister_pernet_subsys(&udplite6_net_ops);
127 : 0 : }
128 : : #endif
|