Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/net/ipv6/udplite.c
15109 views
1
/*
2
* UDPLITEv6 An implementation of the UDP-Lite protocol over IPv6.
3
* See also net/ipv4/udplite.c
4
*
5
* Authors: Gerrit Renker <[email protected]>
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 "udp_impl.h"
15
16
static int udplitev6_rcv(struct sk_buff *skb)
17
{
18
return __udp6_lib_rcv(skb, &udplite_table, IPPROTO_UDPLITE);
19
}
20
21
static void udplitev6_err(struct sk_buff *skb,
22
struct inet6_skb_parm *opt,
23
u8 type, u8 code, int offset, __be32 info)
24
{
25
__udp6_lib_err(skb, opt, type, code, offset, info, &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
.backlog_rcv = udpv6_queue_rcv_skb,
48
.hash = udp_lib_hash,
49
.unhash = udp_lib_unhash,
50
.get_port = udp_v6_get_port,
51
.obj_size = sizeof(struct udp6_sock),
52
.slab_flags = SLAB_DESTROY_BY_RCU,
53
.h.udp_table = &udplite_table,
54
#ifdef CONFIG_COMPAT
55
.compat_setsockopt = compat_udpv6_setsockopt,
56
.compat_getsockopt = compat_udpv6_getsockopt,
57
#endif
58
.clear_sk = sk_prot_clear_portaddr_nulls,
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
.no_check = 0,
67
.flags = INET_PROTOSW_PERMANENT,
68
};
69
70
int __init udplitev6_init(void)
71
{
72
int ret;
73
74
ret = inet6_add_protocol(&udplitev6_protocol, IPPROTO_UDPLITE);
75
if (ret)
76
goto out;
77
78
ret = inet6_register_protosw(&udplite6_protosw);
79
if (ret)
80
goto out_udplitev6_protocol;
81
out:
82
return ret;
83
84
out_udplitev6_protocol:
85
inet6_del_protocol(&udplitev6_protocol, IPPROTO_UDPLITE);
86
goto out;
87
}
88
89
void udplitev6_exit(void)
90
{
91
inet6_unregister_protosw(&udplite6_protosw);
92
inet6_del_protocol(&udplitev6_protocol, IPPROTO_UDPLITE);
93
}
94
95
#ifdef CONFIG_PROC_FS
96
static struct udp_seq_afinfo udplite6_seq_afinfo = {
97
.name = "udplite6",
98
.family = AF_INET6,
99
.udp_table = &udplite_table,
100
.seq_fops = {
101
.owner = THIS_MODULE,
102
},
103
.seq_ops = {
104
.show = udp6_seq_show,
105
},
106
};
107
108
static int __net_init udplite6_proc_init_net(struct net *net)
109
{
110
return udp_proc_register(net, &udplite6_seq_afinfo);
111
}
112
113
static void __net_exit udplite6_proc_exit_net(struct net *net)
114
{
115
udp_proc_unregister(net, &udplite6_seq_afinfo);
116
}
117
118
static struct pernet_operations udplite6_net_ops = {
119
.init = udplite6_proc_init_net,
120
.exit = udplite6_proc_exit_net,
121
};
122
123
int __init udplite6_proc_init(void)
124
{
125
return register_pernet_subsys(&udplite6_net_ops);
126
}
127
128
void udplite6_proc_exit(void)
129
{
130
unregister_pernet_subsys(&udplite6_net_ops);
131
}
132
#endif
133
134