diff options
Diffstat (limited to 'net/ipv4/udplite.c')
-rw-r--r-- | net/ipv4/udplite.c | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/net/ipv4/udplite.c b/net/ipv4/udplite.c new file mode 100644 index 000000000000..d49c6d68c8a9 --- /dev/null +++ b/net/ipv4/udplite.c | |||
@@ -0,0 +1,121 @@ | |||
1 | /* | ||
2 | * UDPLITE An implementation of the UDP-Lite protocol (RFC 3828). | ||
3 | * | ||
4 | * Version: $Id: udplite.c,v 1.25 2006/10/19 07:22:36 gerrit Exp $ | ||
5 | * | ||
6 | * Authors: Gerrit Renker <gerrit@erg.abdn.ac.uk> | ||
7 | * | ||
8 | * Changes: | ||
9 | * Fixes: | ||
10 | * This program is free software; you can redistribute it and/or | ||
11 | * modify it under the terms of the GNU General Public License | ||
12 | * as published by the Free Software Foundation; either version | ||
13 | * 2 of the License, or (at your option) any later version. | ||
14 | */ | ||
15 | #include "udp_impl.h" | ||
16 | DEFINE_SNMP_STAT(struct udp_mib, udplite_statistics) __read_mostly; | ||
17 | |||
18 | struct hlist_head udplite_hash[UDP_HTABLE_SIZE]; | ||
19 | |||
20 | int udplite_get_port(struct sock *sk, unsigned short p, | ||
21 | int (*c)(const struct sock *, const struct sock *)) | ||
22 | { | ||
23 | return __udp_lib_get_port(sk, p, udplite_hash, c); | ||
24 | } | ||
25 | |||
26 | static int udplite_v4_get_port(struct sock *sk, unsigned short snum) | ||
27 | { | ||
28 | return udplite_get_port(sk, snum, ipv4_rcv_saddr_equal); | ||
29 | } | ||
30 | |||
31 | static int udplite_rcv(struct sk_buff *skb) | ||
32 | { | ||
33 | return __udp4_lib_rcv(skb, udplite_hash, IPPROTO_UDPLITE); | ||
34 | } | ||
35 | |||
36 | static void udplite_err(struct sk_buff *skb, u32 info) | ||
37 | { | ||
38 | __udp4_lib_err(skb, info, udplite_hash); | ||
39 | } | ||
40 | |||
41 | static struct net_protocol udplite_protocol = { | ||
42 | .handler = udplite_rcv, | ||
43 | .err_handler = udplite_err, | ||
44 | .no_policy = 1, | ||
45 | }; | ||
46 | |||
47 | DEFINE_PROTO_INUSE(udplite) | ||
48 | |||
49 | struct proto udplite_prot = { | ||
50 | .name = "UDP-Lite", | ||
51 | .owner = THIS_MODULE, | ||
52 | .close = udp_lib_close, | ||
53 | .connect = ip4_datagram_connect, | ||
54 | .disconnect = udp_disconnect, | ||
55 | .ioctl = udp_ioctl, | ||
56 | .init = udplite_sk_init, | ||
57 | .destroy = udp_destroy_sock, | ||
58 | .setsockopt = udp_setsockopt, | ||
59 | .getsockopt = udp_getsockopt, | ||
60 | .sendmsg = udp_sendmsg, | ||
61 | .recvmsg = udp_recvmsg, | ||
62 | .sendpage = udp_sendpage, | ||
63 | .backlog_rcv = udp_queue_rcv_skb, | ||
64 | .hash = udp_lib_hash, | ||
65 | .unhash = udp_lib_unhash, | ||
66 | .get_port = udplite_v4_get_port, | ||
67 | .obj_size = sizeof(struct udp_sock), | ||
68 | #ifdef CONFIG_COMPAT | ||
69 | .compat_setsockopt = compat_udp_setsockopt, | ||
70 | .compat_getsockopt = compat_udp_getsockopt, | ||
71 | #endif | ||
72 | REF_PROTO_INUSE(udplite) | ||
73 | }; | ||
74 | |||
75 | static struct inet_protosw udplite4_protosw = { | ||
76 | .type = SOCK_DGRAM, | ||
77 | .protocol = IPPROTO_UDPLITE, | ||
78 | .prot = &udplite_prot, | ||
79 | .ops = &inet_dgram_ops, | ||
80 | .capability = -1, | ||
81 | .no_check = 0, /* must checksum (RFC 3828) */ | ||
82 | .flags = INET_PROTOSW_PERMANENT, | ||
83 | }; | ||
84 | |||
85 | #ifdef CONFIG_PROC_FS | ||
86 | static struct file_operations udplite4_seq_fops; | ||
87 | static struct udp_seq_afinfo udplite4_seq_afinfo = { | ||
88 | .owner = THIS_MODULE, | ||
89 | .name = "udplite", | ||
90 | .family = AF_INET, | ||
91 | .hashtable = udplite_hash, | ||
92 | .seq_show = udp4_seq_show, | ||
93 | .seq_fops = &udplite4_seq_fops, | ||
94 | }; | ||
95 | #endif | ||
96 | |||
97 | void __init udplite4_register(void) | ||
98 | { | ||
99 | if (proto_register(&udplite_prot, 1)) | ||
100 | goto out_register_err; | ||
101 | |||
102 | if (inet_add_protocol(&udplite_protocol, IPPROTO_UDPLITE) < 0) | ||
103 | goto out_unregister_proto; | ||
104 | |||
105 | inet_register_protosw(&udplite4_protosw); | ||
106 | |||
107 | #ifdef CONFIG_PROC_FS | ||
108 | if (udp_proc_register(&udplite4_seq_afinfo)) /* udplite4_proc_init() */ | ||
109 | printk(KERN_ERR "%s: Cannot register /proc!\n", __func__); | ||
110 | #endif | ||
111 | return; | ||
112 | |||
113 | out_unregister_proto: | ||
114 | proto_unregister(&udplite_prot); | ||
115 | out_register_err: | ||
116 | printk(KERN_CRIT "%s: Cannot add UDP-Lite protocol.\n", __func__); | ||
117 | } | ||
118 | |||
119 | EXPORT_SYMBOL(udplite_hash); | ||
120 | EXPORT_SYMBOL(udplite_prot); | ||
121 | EXPORT_SYMBOL(udplite_get_port); | ||