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 : 3 : int __init udplitev6_init(void) 70 : : { 71 : : int ret; 72 : : 73 : 3 : ret = inet6_add_protocol(&udplitev6_protocol, IPPROTO_UDPLITE); 74 : 3 : if (ret) 75 : : goto out; 76 : : 77 : 3 : ret = inet6_register_protosw(&udplite6_protosw); 78 : 3 : if (ret) 79 : : goto out_udplitev6_protocol; 80 : : out: 81 : 3 : 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 : 3 : static int __net_init udplite6_proc_init_net(struct net *net) 101 : : { 102 : 3 : if (!proc_create_net_data("udplite6", 0444, net->proc_net, 103 : : &udp6_seq_ops, sizeof(struct udp_iter_state), 104 : : &udplite6_seq_afinfo)) 105 : : return -ENOMEM; 106 : 3 : return 0; 107 : : } 108 : : 109 : 1 : static void __net_exit udplite6_proc_exit_net(struct net *net) 110 : : { 111 : 1 : remove_proc_entry("udplite6", net->proc_net); 112 : 1 : } 113 : : 114 : : static struct pernet_operations udplite6_net_ops = { 115 : : .init = udplite6_proc_init_net, 116 : : .exit = udplite6_proc_exit_net, 117 : : }; 118 : : 119 : 3 : int __init udplite6_proc_init(void) 120 : : { 121 : 3 : 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