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 : 3 : static int __net_init udplite4_proc_init_net(struct net *net) 81 : : { 82 : 3 : 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 : 3 : return 0; 86 : : } 87 : : 88 : 1 : static void __net_exit udplite4_proc_exit_net(struct net *net) 89 : : { 90 : 1 : remove_proc_entry("udplite", net->proc_net); 91 : 1 : } 92 : : 93 : : static struct pernet_operations udplite4_net_ops = { 94 : : .init = udplite4_proc_init_net, 95 : : .exit = udplite4_proc_exit_net, 96 : : }; 97 : : 98 : 3 : static __init int udplite4_proc_init(void) 99 : : { 100 : 3 : 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 : 3 : void __init udplite4_register(void) 110 : : { 111 : 3 : udp_table_init(&udplite_table, "UDP-Lite"); 112 : 3 : if (proto_register(&udplite_prot, 1)) 113 : : goto out_register_err; 114 : : 115 : 3 : if (inet_add_protocol(&udplite_protocol, IPPROTO_UDPLITE) < 0) 116 : : goto out_unregister_proto; 117 : : 118 : 3 : inet_register_protosw(&udplite4_protosw); 119 : : 120 : 3 : if (udplite4_proc_init()) 121 : 0 : pr_err("%s: Cannot register /proc!\n", __func__); 122 : 3 : 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 : : }