Branch data Line data Source code
1 : : /*
2 : : * UDPLITEv6 An implementation of the UDP-Lite protocol over IPv6.
3 : : * See also net/ipv4/udplite.c
4 : : *
5 : : * Authors: Gerrit Renker <gerrit@erg.abdn.ac.uk>
6 : : *
7 : : * Changes:
8 : : * Fixes:
9 : : * This program is free software; you can redistribute it and/or
10 : : * modify it under the terms of the GNU General Public License
11 : : * as published by the Free Software Foundation; either version
12 : : * 2 of the License, or (at your option) any later version.
13 : : */
14 : : #include <linux/export.h>
15 : : #include "udp_impl.h"
16 : :
17 : 0 : static int udplitev6_rcv(struct sk_buff *skb)
18 : : {
19 : 0 : return __udp6_lib_rcv(skb, &udplite_table, IPPROTO_UDPLITE);
20 : : }
21 : :
22 : 0 : static void udplitev6_err(struct sk_buff *skb,
23 : : struct inet6_skb_parm *opt,
24 : : u8 type, u8 code, int offset, __be32 info)
25 : : {
26 : 0 : __udp6_lib_err(skb, opt, type, code, offset, info, &udplite_table);
27 : 0 : }
28 : :
29 : : static const struct inet6_protocol udplitev6_protocol = {
30 : : .handler = udplitev6_rcv,
31 : : .err_handler = udplitev6_err,
32 : : .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
33 : : };
34 : :
35 : : struct proto udplitev6_prot = {
36 : : .name = "UDPLITEv6",
37 : : .owner = THIS_MODULE,
38 : : .close = udp_lib_close,
39 : : .connect = ip6_datagram_connect,
40 : : .disconnect = udp_disconnect,
41 : : .ioctl = udp_ioctl,
42 : : .init = udplite_sk_init,
43 : : .destroy = udpv6_destroy_sock,
44 : : .setsockopt = udpv6_setsockopt,
45 : : .getsockopt = udpv6_getsockopt,
46 : : .sendmsg = udpv6_sendmsg,
47 : : .recvmsg = udpv6_recvmsg,
48 : : .backlog_rcv = udpv6_queue_rcv_skb,
49 : : .hash = udp_lib_hash,
50 : : .unhash = udp_lib_unhash,
51 : : .get_port = udp_v6_get_port,
52 : : .obj_size = sizeof(struct udp6_sock),
53 : : .slab_flags = SLAB_DESTROY_BY_RCU,
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 : : .clear_sk = udp_v6_clear_sk,
60 : : };
61 : :
62 : : static struct inet_protosw udplite6_protosw = {
63 : : .type = SOCK_DGRAM,
64 : : .protocol = IPPROTO_UDPLITE,
65 : : .prot = &udplitev6_prot,
66 : : .ops = &inet6_dgram_ops,
67 : : .no_check = 0,
68 : : .flags = INET_PROTOSW_PERMANENT,
69 : : };
70 : :
71 : 0 : int __init udplitev6_init(void)
72 : : {
73 : : int ret;
74 : :
75 : 0 : ret = inet6_add_protocol(&udplitev6_protocol, IPPROTO_UDPLITE);
76 [ # # ]: 0 : if (ret)
77 : : goto out;
78 : :
79 : 0 : ret = inet6_register_protosw(&udplite6_protosw);
80 [ # # ]: 0 : if (ret)
81 : : goto out_udplitev6_protocol;
82 : : out:
83 : 0 : return ret;
84 : :
85 : : out_udplitev6_protocol:
86 : 0 : inet6_del_protocol(&udplitev6_protocol, IPPROTO_UDPLITE);
87 : 0 : goto out;
88 : : }
89 : :
90 : 0 : void udplitev6_exit(void)
91 : : {
92 : 0 : inet6_unregister_protosw(&udplite6_protosw);
93 : 0 : inet6_del_protocol(&udplitev6_protocol, IPPROTO_UDPLITE);
94 : 0 : }
95 : :
96 : : #ifdef CONFIG_PROC_FS
97 : :
98 : : static const struct file_operations udplite6_afinfo_seq_fops = {
99 : : .owner = THIS_MODULE,
100 : : .open = udp_seq_open,
101 : : .read = seq_read,
102 : : .llseek = seq_lseek,
103 : : .release = seq_release_net
104 : : };
105 : :
106 : : static struct udp_seq_afinfo udplite6_seq_afinfo = {
107 : : .name = "udplite6",
108 : : .family = AF_INET6,
109 : : .udp_table = &udplite_table,
110 : : .seq_fops = &udplite6_afinfo_seq_fops,
111 : : .seq_ops = {
112 : : .show = udp6_seq_show,
113 : : },
114 : : };
115 : :
116 : 0 : static int __net_init udplite6_proc_init_net(struct net *net)
117 : : {
118 : 0 : return udp_proc_register(net, &udplite6_seq_afinfo);
119 : : }
120 : :
121 : 0 : static void __net_exit udplite6_proc_exit_net(struct net *net)
122 : : {
123 : 0 : udp_proc_unregister(net, &udplite6_seq_afinfo);
124 : 0 : }
125 : :
126 : : static struct pernet_operations udplite6_net_ops = {
127 : : .init = udplite6_proc_init_net,
128 : : .exit = udplite6_proc_exit_net,
129 : : };
130 : :
131 : 0 : int __init udplite6_proc_init(void)
132 : : {
133 : 0 : return register_pernet_subsys(&udplite6_net_ops);
134 : : }
135 : :
136 : 0 : void udplite6_proc_exit(void)
137 : : {
138 : 0 : unregister_pernet_subsys(&udplite6_net_ops);
139 : 0 : }
140 : : #endif
|