Merge ath-next from git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
[linux-2.6-block.git] / net / dccp / ipv6.c
CommitLineData
2874c5fd 1// SPDX-License-Identifier: GPL-2.0-or-later
3df80d93
ACM
2/*
3 * DCCP over IPv6
45329e71 4 * Linux INET6 implementation
3df80d93
ACM
5 *
6 * Based on net/dccp6/ipv6.c
7 *
8 * Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
3df80d93
ACM
9 */
10
3df80d93
ACM
11#include <linux/module.h>
12#include <linux/random.h>
5a0e3ad6 13#include <linux/slab.h>
3df80d93 14#include <linux/xfrm.h>
323fbd0e 15#include <linux/string.h>
3df80d93
ACM
16
17#include <net/addrconf.h>
18#include <net/inet_common.h>
19#include <net/inet_hashtables.h>
14c85021 20#include <net/inet_sock.h>
3df80d93
ACM
21#include <net/inet6_connection_sock.h>
22#include <net/inet6_hashtables.h>
23#include <net/ip6_route.h>
24#include <net/ipv6.h>
25#include <net/protocol.h>
26#include <net/transp_v6.h>
aa0e4e4a 27#include <net/ip6_checksum.h>
3df80d93 28#include <net/xfrm.h>
6e5714ea 29#include <net/secure_seq.h>
b98b3304 30#include <net/netns/generic.h>
323fbd0e 31#include <net/sock.h>
3df80d93
ACM
32
33#include "dccp.h"
34#include "ipv6.h"
4b79f0af 35#include "feat.h"
3df80d93 36
b98b3304
FW
37struct dccp_v6_pernet {
38 struct sock *v6_ctl_sk;
39};
40
41static unsigned int dccp_v6_pernet_id __read_mostly;
42
43/* The per-net v6_ctl_sk is used for sending RSTs and ACKs */
72478873 44
3b401a81
SH
45static const struct inet_connection_sock_af_ops dccp_ipv6_mapped;
46static const struct inet_connection_sock_af_ops dccp_ipv6_af_ops;
3df80d93 47
6f4e5fff 48/* add pseudo-header to DCCP checksum stored in skb->csum */
868c86bc 49static inline __sum16 dccp_v6_csum_finish(struct sk_buff *skb,
b71d1d42
ED
50 const struct in6_addr *saddr,
51 const struct in6_addr *daddr)
3df80d93 52{
6f4e5fff
GR
53 return csum_ipv6_magic(saddr, daddr, skb->len, IPPROTO_DCCP, skb->csum);
54}
55
bb296246 56static inline void dccp_v6_send_check(struct sock *sk, struct sk_buff *skb)
6f4e5fff
GR
57{
58 struct ipv6_pinfo *np = inet6_sk(sk);
59 struct dccp_hdr *dh = dccp_hdr(skb);
60
61 dccp_csum_outgoing(skb);
efe4208f 62 dh->dccph_checksum = dccp_v6_csum_finish(skb, &np->saddr, &sk->sk_v6_daddr);
3df80d93
ACM
63}
64
6e5714ea 65static inline __u64 dccp_v6_init_sequence(struct sk_buff *skb)
d7f7365f 66{
0660e03f
ACM
67 return secure_dccpv6_sequence_number(ipv6_hdr(skb)->daddr.s6_addr32,
68 ipv6_hdr(skb)->saddr.s6_addr32,
d7f7365f
GR
69 dccp_hdr(skb)->dccph_dport,
70 dccp_hdr(skb)->dccph_sport );
71
3df80d93
ACM
72}
73
32bbd879 74static int dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
d5fdd6ba 75 u8 type, u8 code, int offset, __be32 info)
3df80d93 76{
b71d1d42 77 const struct ipv6hdr *hdr = (const struct ipv6hdr *)skb->data;
1aa9d1a0 78 const struct dccp_hdr *dh;
e0bcfb0c 79 struct dccp_sock *dp;
3df80d93
ACM
80 struct ipv6_pinfo *np;
81 struct sock *sk;
82 int err;
83 __u64 seq;
ca12a1a4 84 struct net *net = dev_net(skb->dev);
3df80d93 85
1aa9d1a0
ED
86 /* Only need dccph_dport & dccph_sport which are the first
87 * 4 bytes in dccp header.
88 * Our caller (icmpv6_notify()) already pulled 8 bytes for us.
89 */
90 BUILD_BUG_ON(offsetofend(struct dccp_hdr, dccph_sport) > 8);
91 BUILD_BUG_ON(offsetofend(struct dccp_hdr, dccph_dport) > 8);
92 dh = (struct dccp_hdr *)(skb->data + offset);
860239c5 93
52036a43
ED
94 sk = __inet6_lookup_established(net, &dccp_hashinfo,
95 &hdr->daddr, dh->dccph_dport,
96 &hdr->saddr, ntohs(dh->dccph_sport),
4297a0ef 97 inet6_iif(skb), 0);
3df80d93 98
52036a43 99 if (!sk) {
a16292a0
ED
100 __ICMP6_INC_STATS(net, __in6_dev_get(skb->dev),
101 ICMP6_MIB_INERRORS);
32bbd879 102 return -ENOENT;
3df80d93
ACM
103 }
104
105 if (sk->sk_state == DCCP_TIME_WAIT) {
9469c7b4 106 inet_twsk_put(inet_twsk(sk));
32bbd879 107 return 0;
3df80d93 108 }
52036a43 109 seq = dccp_hdr_seq(dh);
32bbd879
SB
110 if (sk->sk_state == DCCP_NEW_SYN_RECV) {
111 dccp_req_err(sk, seq);
112 return 0;
113 }
3df80d93
ACM
114
115 bh_lock_sock(sk);
116 if (sock_owned_by_user(sk))
02a1d6e7 117 __NET_INC_STATS(net, LINUX_MIB_LOCKDROPPEDICMPS);
3df80d93
ACM
118
119 if (sk->sk_state == DCCP_CLOSED)
120 goto out;
121
e0bcfb0c 122 dp = dccp_sk(sk);
e0bcfb0c
WY
123 if ((1 << sk->sk_state) & ~(DCCPF_REQUESTING | DCCPF_LISTEN) &&
124 !between48(seq, dp->dccps_awl, dp->dccps_awh)) {
02a1d6e7 125 __NET_INC_STATS(net, LINUX_MIB_OUTOFWINDOWICMPS);
e0bcfb0c
WY
126 goto out;
127 }
128
3df80d93
ACM
129 np = inet6_sk(sk);
130
ec18d9a2 131 if (type == NDISC_REDIRECT) {
45caeaa5
JM
132 if (!sock_owned_by_user(sk)) {
133 struct dst_entry *dst = __sk_dst_check(sk, np->dst_cookie);
ec18d9a2 134
45caeaa5
JM
135 if (dst)
136 dst->ops->redirect(dst, sk, skb);
137 }
bd784a14 138 goto out;
ec18d9a2
DM
139 }
140
3df80d93 141 if (type == ICMPV6_PKT_TOOBIG) {
3df80d93
ACM
142 struct dst_entry *dst = NULL;
143
93b36cf3
HFS
144 if (!ip6_sk_accept_pmtu(sk))
145 goto out;
146
3df80d93
ACM
147 if (sock_owned_by_user(sk))
148 goto out;
149 if ((1 << sk->sk_state) & (DCCPF_LISTEN | DCCPF_CLOSED))
150 goto out;
151
35ad9b9c
DM
152 dst = inet6_csk_update_pmtu(sk, ntohl(info));
153 if (!dst)
154 goto out;
155
156 if (inet_csk(sk)->icsk_pmtu_cookie > dst_mtu(dst))
3df80d93 157 dccp_sync_mss(sk, dst_mtu(dst));
3df80d93
ACM
158 goto out;
159 }
160
161 icmpv6_err_convert(type, code, &err);
162
3df80d93
ACM
163 /* Might be for an request_sock */
164 switch (sk->sk_state) {
3df80d93
ACM
165 case DCCP_REQUESTING:
166 case DCCP_RESPOND: /* Cannot happen.
45329e71 167 It can, it SYNs are crossed. --ANK */
3df80d93 168 if (!sock_owned_by_user(sk)) {
aa62d76b 169 __DCCP_INC_STATS(DCCP_MIB_ATTEMPTFAILS);
3df80d93
ACM
170 sk->sk_err = err;
171 /*
172 * Wake people up to see the error
173 * (see connect in sock.c)
174 */
e3ae2365 175 sk_error_report(sk);
3df80d93 176 dccp_done(sk);
9a25f0cb
ED
177 } else {
178 WRITE_ONCE(sk->sk_err_soft, err);
179 }
3df80d93
ACM
180 goto out;
181 }
182
183 if (!sock_owned_by_user(sk) && np->recverr) {
184 sk->sk_err = err;
e3ae2365 185 sk_error_report(sk);
9a25f0cb
ED
186 } else {
187 WRITE_ONCE(sk->sk_err_soft, err);
188 }
3df80d93
ACM
189out:
190 bh_unlock_sock(sk);
191 sock_put(sk);
32bbd879 192 return 0;
3df80d93
ACM
193}
194
195
ea3bea3a 196static int dccp_v6_send_response(const struct sock *sk, struct request_sock *req)
3df80d93 197{
634fb979 198 struct inet_request_sock *ireq = inet_rsk(req);
3df80d93
ACM
199 struct ipv6_pinfo *np = inet6_sk(sk);
200 struct sk_buff *skb;
20c59de2 201 struct in6_addr *final_p, final;
4c9483b2 202 struct flowi6 fl6;
3df80d93 203 int err = -1;
fd80eb94 204 struct dst_entry *dst;
3df80d93 205
4c9483b2
DM
206 memset(&fl6, 0, sizeof(fl6));
207 fl6.flowi6_proto = IPPROTO_DCCP;
634fb979
ED
208 fl6.daddr = ireq->ir_v6_rmt_addr;
209 fl6.saddr = ireq->ir_v6_loc_addr;
4c9483b2 210 fl6.flowlabel = 0;
634fb979
ED
211 fl6.flowi6_oif = ireq->ir_iif;
212 fl6.fl6_dport = ireq->ir_rmt_port;
b44084c2 213 fl6.fl6_sport = htons(ireq->ir_num);
3df98d79 214 security_req_classify_flow(req, flowi6_to_flowi_common(&fl6));
3df80d93 215
3df80d93 216
45f6fad8
ED
217 rcu_read_lock();
218 final_p = fl6_update_dst(&fl6, rcu_dereference(np->opt), &final);
219 rcu_read_unlock();
3df80d93 220
c4e85f73 221 dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p);
68d0c6d3
DM
222 if (IS_ERR(dst)) {
223 err = PTR_ERR(dst);
224 dst = NULL;
fd80eb94 225 goto done;
68d0c6d3 226 }
3df80d93
ACM
227
228 skb = dccp_make_response(sk, dst, req);
229 if (skb != NULL) {
230 struct dccp_hdr *dh = dccp_hdr(skb);
56ac42bc 231 struct ipv6_txoptions *opt;
45329e71 232
6f4e5fff 233 dh->dccph_checksum = dccp_v6_csum_finish(skb,
634fb979
ED
234 &ireq->ir_v6_loc_addr,
235 &ireq->ir_v6_rmt_addr);
236 fl6.daddr = ireq->ir_v6_rmt_addr;
45f6fad8 237 rcu_read_lock();
56ac42bc
HD
238 opt = ireq->ipv6_opt;
239 if (!opt)
240 opt = rcu_dereference(np->opt);
4f6570d7
ED
241 err = ip6_xmit(sk, skb, &fl6, sk->sk_mark, opt, np->tclass,
242 sk->sk_priority);
45f6fad8 243 rcu_read_unlock();
b9df3cb8 244 err = net_xmit_eval(err);
3df80d93
ACM
245 }
246
247done:
0cbd7825 248 dst_release(dst);
3df80d93
ACM
249 return err;
250}
251
252static void dccp_v6_reqsk_destructor(struct request_sock *req)
253{
d99a7bd2 254 dccp_feat_list_purge(&dccp_rsk(req)->dreq_featneg);
56ac42bc 255 kfree(inet_rsk(req)->ipv6_opt);
634fb979 256 kfree_skb(inet_rsk(req)->pktopts);
3df80d93
ACM
257}
258
a00e7444 259static void dccp_v6_ctl_send_reset(const struct sock *sk, struct sk_buff *rxskb)
3df80d93 260{
b71d1d42 261 const struct ipv6hdr *rxip6h;
3df80d93 262 struct sk_buff *skb;
4c9483b2 263 struct flowi6 fl6;
adf30907 264 struct net *net = dev_net(skb_dst(rxskb)->dev);
b98b3304
FW
265 struct dccp_v6_pernet *pn;
266 struct sock *ctl_sk;
adf30907 267 struct dst_entry *dst;
3df80d93 268
e356d37a 269 if (dccp_hdr(rxskb)->dccph_type == DCCP_PKT_RESET)
3df80d93
ACM
270 return;
271
272 if (!ipv6_unicast_destination(rxskb))
45329e71 273 return;
3df80d93 274
b98b3304
FW
275 pn = net_generic(net, dccp_v6_pernet_id);
276 ctl_sk = pn->v6_ctl_sk;
02047741 277 skb = dccp_ctl_make_reset(ctl_sk, rxskb);
45329e71 278 if (skb == NULL)
8109b02b 279 return;
3df80d93 280
0660e03f 281 rxip6h = ipv6_hdr(rxskb);
e356d37a
GR
282 dccp_hdr(skb)->dccph_checksum = dccp_v6_csum_finish(skb, &rxip6h->saddr,
283 &rxip6h->daddr);
6f4e5fff 284
4c9483b2 285 memset(&fl6, 0, sizeof(fl6));
4e3fd7a0
AD
286 fl6.daddr = rxip6h->saddr;
287 fl6.saddr = rxip6h->daddr;
6f4e5fff 288
4c9483b2
DM
289 fl6.flowi6_proto = IPPROTO_DCCP;
290 fl6.flowi6_oif = inet6_iif(rxskb);
1958b856
DM
291 fl6.fl6_dport = dccp_hdr(skb)->dccph_dport;
292 fl6.fl6_sport = dccp_hdr(skb)->dccph_sport;
3df98d79 293 security_skb_classify_flow(rxskb, flowi6_to_flowi_common(&fl6));
3df80d93
ACM
294
295 /* sk = NULL, but it is safe for now. RST socket required. */
c4e85f73 296 dst = ip6_dst_lookup_flow(sock_net(ctl_sk), ctl_sk, &fl6, NULL);
68d0c6d3
DM
297 if (!IS_ERR(dst)) {
298 skb_dst_set(skb, dst);
4f6570d7 299 ip6_xmit(ctl_sk, skb, &fl6, 0, NULL, 0, 0);
7309f882
ED
300 DCCP_INC_STATS(DCCP_MIB_OUTSEGS);
301 DCCP_INC_STATS(DCCP_MIB_OUTRSTS);
68d0c6d3 302 return;
3df80d93
ACM
303 }
304
305 kfree_skb(skb);
306}
307
73c9e02c
GR
308static struct request_sock_ops dccp6_request_sock_ops = {
309 .family = AF_INET6,
310 .obj_size = sizeof(struct dccp6_request_sock),
311 .rtx_syn_ack = dccp_v6_send_response,
312 .send_ack = dccp_reqsk_send_ack,
313 .destructor = dccp_v6_reqsk_destructor,
314 .send_reset = dccp_v6_ctl_send_reset,
c72e1183 315 .syn_ack_timeout = dccp_syn_ack_timeout,
73c9e02c
GR
316};
317
3df80d93
ACM
318static int dccp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
319{
3df80d93
ACM
320 struct request_sock *req;
321 struct dccp_request_sock *dreq;
634fb979 322 struct inet_request_sock *ireq;
3df80d93 323 struct ipv6_pinfo *np = inet6_sk(sk);
8109b02b 324 const __be32 service = dccp_hdr_request(skb)->dccph_req_service;
3df80d93 325 struct dccp_skb_cb *dcb = DCCP_SKB_CB(skb);
3df80d93
ACM
326
327 if (skb->protocol == htons(ETH_P_IP))
328 return dccp_v4_conn_request(sk, skb);
329
330 if (!ipv6_unicast_destination(skb))
4a5409a5 331 return 0; /* discard, don't send a reset here */
3df80d93 332
dcc32f4f
JK
333 if (ipv6_addr_v4mapped(&ipv6_hdr(skb)->saddr)) {
334 __IP6_INC_STATS(sock_net(sk), NULL, IPSTATS_MIB_INHDRERRORS);
335 return 0;
336 }
337
3df80d93 338 if (dccp_bad_service_code(sk, service)) {
4a5409a5 339 dcb->dccpd_reset_code = DCCP_RESET_CODE_BAD_SERVICE_CODE;
3df80d93 340 goto drop;
8109b02b 341 }
3df80d93 342 /*
45329e71 343 * There are no SYN attacks on IPv6, yet...
3df80d93 344 */
4a5409a5 345 dcb->dccpd_reset_code = DCCP_RESET_CODE_TOO_BUSY;
3df80d93 346 if (inet_csk_reqsk_queue_is_full(sk))
45329e71 347 goto drop;
3df80d93 348
5ea8ea2c 349 if (sk_acceptq_is_full(sk))
3df80d93
ACM
350 goto drop;
351
a1a5344d 352 req = inet_reqsk_alloc(&dccp6_request_sock_ops, sk, true);
3df80d93
ACM
353 if (req == NULL)
354 goto drop;
355
ac75773c
GR
356 if (dccp_reqsk_init(req, dccp_sk(sk), skb))
357 goto drop_and_free;
3df80d93 358
8b819412
GR
359 dreq = dccp_rsk(req);
360 if (dccp_parse_options(sk, dreq, skb))
361 goto drop_and_free;
362
4237c75c
VY
363 if (security_inet_conn_request(sk, skb, req))
364 goto drop_and_free;
365
634fb979
ED
366 ireq = inet_rsk(req);
367 ireq->ir_v6_rmt_addr = ipv6_hdr(skb)->saddr;
368 ireq->ir_v6_loc_addr = ipv6_hdr(skb)->daddr;
3f66b083 369 ireq->ireq_family = AF_INET6;
b855ff82 370 ireq->ir_mark = inet_request_mark(sk, skb);
3df80d93 371
a224772d 372 if (ipv6_opt_accepted(sk, skb, IP6CB(skb)) ||
3df80d93
ACM
373 np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo ||
374 np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim) {
63354797 375 refcount_inc(&skb->users);
634fb979 376 ireq->pktopts = skb;
3df80d93 377 }
36f7cec4 378 ireq->ir_iif = READ_ONCE(sk->sk_bound_dev_if);
3df80d93
ACM
379
380 /* So that link locals have meaning */
36f7cec4 381 if (!ireq->ir_iif &&
634fb979
ED
382 ipv6_addr_type(&ireq->ir_v6_rmt_addr) & IPV6_ADDR_LINKLOCAL)
383 ireq->ir_iif = inet6_iif(skb);
3df80d93 384
45329e71 385 /*
3df80d93
ACM
386 * Step 3: Process LISTEN state
387 *
d83ca5ac 388 * Set S.ISR, S.GSR, S.SWL, S.SWH from packet or Init Cookie
3df80d93 389 *
f541fb7e 390 * Setting S.SWL/S.SWH to is deferred to dccp_create_openreq_child().
3df80d93 391 */
3df80d93 392 dreq->dreq_isr = dcb->dccpd_seq;
f541fb7e 393 dreq->dreq_gsr = dreq->dreq_isr;
865e9022 394 dreq->dreq_iss = dccp_v6_init_sequence(skb);
f541fb7e 395 dreq->dreq_gss = dreq->dreq_iss;
3df80d93
ACM
396 dreq->dreq_service = service;
397
1a2c6181 398 if (dccp_v6_send_response(sk, req))
3df80d93
ACM
399 goto drop_and_free;
400
079096f1 401 inet_csk_reqsk_queue_hash_add(sk, req, DCCP_TIMEOUT_INIT);
0c2232b0 402 reqsk_put(req);
3df80d93
ACM
403 return 0;
404
405drop_and_free:
406 reqsk_free(req);
407drop:
aa62d76b 408 __DCCP_INC_STATS(DCCP_MIB_ATTEMPTFAILS);
3df80d93
ACM
409 return -1;
410}
411
0c27171e 412static struct sock *dccp_v6_request_recv_sock(const struct sock *sk,
3df80d93
ACM
413 struct sk_buff *skb,
414 struct request_sock *req,
5e0724d0
ED
415 struct dst_entry *dst,
416 struct request_sock *req_unhash,
417 bool *own_req)
3df80d93 418{
634fb979 419 struct inet_request_sock *ireq = inet_rsk(req);
0c27171e
ED
420 struct ipv6_pinfo *newnp;
421 const struct ipv6_pinfo *np = inet6_sk(sk);
45f6fad8 422 struct ipv6_txoptions *opt;
3df80d93 423 struct inet_sock *newinet;
3df80d93
ACM
424 struct dccp6_sock *newdp6;
425 struct sock *newsk;
3df80d93
ACM
426
427 if (skb->protocol == htons(ETH_P_IP)) {
428 /*
429 * v6 mapped
430 */
5e0724d0
ED
431 newsk = dccp_v4_request_recv_sock(sk, skb, req, dst,
432 req_unhash, own_req);
45329e71 433 if (newsk == NULL)
3df80d93
ACM
434 return NULL;
435
436 newdp6 = (struct dccp6_sock *)newsk;
3df80d93
ACM
437 newinet = inet_sk(newsk);
438 newinet->pinet6 = &newdp6->inet6;
439 newnp = inet6_sk(newsk);
440
441 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
442
d1e559d0 443 newnp->saddr = newsk->sk_v6_rcv_saddr;
3df80d93
ACM
444
445 inet_csk(newsk)->icsk_af_ops = &dccp_ipv6_mapped;
446 newsk->sk_backlog_rcv = dccp_v4_do_rcv;
447 newnp->pktoptions = NULL;
448 newnp->opt = NULL;
83eaddab
WC
449 newnp->ipv6_mc_list = NULL;
450 newnp->ipv6_ac_list = NULL;
451 newnp->ipv6_fl_list = NULL;
e0aa6770
ED
452 newnp->mcast_oif = inet_iif(skb);
453 newnp->mcast_hops = ip_hdr(skb)->ttl;
3df80d93
ACM
454
455 /*
456 * No need to charge this sock to the relevant IPv6 refcnt debug socks count
457 * here, dccp_create_openreq_child now does this for us, see the comment in
458 * that function for the gory details. -acme
459 */
460
461 /* It is tricky place. Until this moment IPv4 tcp
462 worked with IPv6 icsk.icsk_af_ops.
463 Sync it now.
464 */
d83d8461 465 dccp_sync_mss(newsk, inet_csk(newsk)->icsk_pmtu_cookie);
3df80d93
ACM
466
467 return newsk;
468 }
469
3df80d93
ACM
470
471 if (sk_acceptq_is_full(sk))
472 goto out_overflow;
473
f76b33c3 474 if (!dst) {
4c9483b2
DM
475 struct flowi6 fl6;
476
f76b33c3
ED
477 dst = inet6_csk_route_req(sk, &fl6, req, IPPROTO_DCCP);
478 if (!dst)
3df80d93 479 goto out;
45329e71 480 }
3df80d93
ACM
481
482 newsk = dccp_create_openreq_child(sk, req, skb);
483 if (newsk == NULL)
093d2823 484 goto out_nonewsk;
3df80d93
ACM
485
486 /*
487 * No need to charge this sock to the relevant IPv6 refcnt debug socks
488 * count here, dccp_create_openreq_child now does this for us, see the
489 * comment in that function for the gory details. -acme
490 */
491
6bd4f355 492 ip6_dst_store(newsk, dst, NULL, NULL);
45329e71
ACM
493 newsk->sk_route_caps = dst->dev->features & ~(NETIF_F_IP_CSUM |
494 NETIF_F_TSO);
3df80d93
ACM
495 newdp6 = (struct dccp6_sock *)newsk;
496 newinet = inet_sk(newsk);
497 newinet->pinet6 = &newdp6->inet6;
3df80d93
ACM
498 newnp = inet6_sk(newsk);
499
500 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
501
634fb979
ED
502 newsk->sk_v6_daddr = ireq->ir_v6_rmt_addr;
503 newnp->saddr = ireq->ir_v6_loc_addr;
504 newsk->sk_v6_rcv_saddr = ireq->ir_v6_loc_addr;
505 newsk->sk_bound_dev_if = ireq->ir_iif;
3df80d93 506
45329e71 507 /* Now IPv6 options...
3df80d93
ACM
508
509 First: no IPv4 options.
510 */
f6d8bd05 511 newinet->inet_opt = NULL;
3df80d93
ACM
512
513 /* Clone RX bits */
514 newnp->rxopt.all = np->rxopt.all;
515
83eaddab
WC
516 newnp->ipv6_mc_list = NULL;
517 newnp->ipv6_ac_list = NULL;
518 newnp->ipv6_fl_list = NULL;
3df80d93 519 newnp->pktoptions = NULL;
3df80d93
ACM
520 newnp->opt = NULL;
521 newnp->mcast_oif = inet6_iif(skb);
0660e03f 522 newnp->mcast_hops = ipv6_hdr(skb)->hop_limit;
3df80d93 523
45329e71
ACM
524 /*
525 * Clone native IPv6 options from listening socket (if any)
526 *
527 * Yes, keeping reference count would be much more clever, but we make
528 * one more one thing there: reattach optmem to newsk.
3df80d93 529 */
56ac42bc
HD
530 opt = ireq->ipv6_opt;
531 if (!opt)
532 opt = rcu_dereference(np->opt);
45f6fad8
ED
533 if (opt) {
534 opt = ipv6_dup_options(newsk, opt);
535 RCU_INIT_POINTER(newnp->opt, opt);
536 }
d83d8461 537 inet_csk(newsk)->icsk_ext_hdr_len = 0;
45f6fad8
ED
538 if (opt)
539 inet_csk(newsk)->icsk_ext_hdr_len = opt->opt_nflen +
540 opt->opt_flen;
3df80d93
ACM
541
542 dccp_sync_mss(newsk, dst_mtu(dst));
543
c720c7e8
ED
544 newinet->inet_daddr = newinet->inet_saddr = LOOPBACK4_IPV6;
545 newinet->inet_rcv_saddr = LOOPBACK4_IPV6;
3df80d93 546
093d2823 547 if (__inet_inherit_port(sk, newsk) < 0) {
e337e24d
CP
548 inet_csk_prepare_forced_close(newsk);
549 dccp_done(newsk);
093d2823
BS
550 goto out;
551 }
01770a16 552 *own_req = inet_ehash_nolisten(newsk, req_to_sk(req_unhash), NULL);
ce105008
ED
553 /* Clone pktoptions received with SYN, if we own the req */
554 if (*own_req && ireq->pktopts) {
ca43ccf4 555 newnp->pktoptions = skb_clone_and_charge_r(ireq->pktopts, newsk);
ce105008
ED
556 consume_skb(ireq->pktopts);
557 ireq->pktopts = NULL;
ce105008 558 }
3df80d93
ACM
559
560 return newsk;
561
562out_overflow:
02a1d6e7 563 __NET_INC_STATS(sock_net(sk), LINUX_MIB_LISTENOVERFLOWS);
093d2823
BS
564out_nonewsk:
565 dst_release(dst);
3df80d93 566out:
02a1d6e7 567 __NET_INC_STATS(sock_net(sk), LINUX_MIB_LISTENDROPS);
3df80d93
ACM
568 return NULL;
569}
570
571/* The socket must have it's spinlock held when we get
572 * here.
573 *
574 * We have a potential double-lock case here, so even when
575 * doing backlog processing we use the BH locking scheme.
576 * This is because we cannot sleep with the original spinlock
577 * held.
578 */
579static int dccp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
580{
581 struct ipv6_pinfo *np = inet6_sk(sk);
582 struct sk_buff *opt_skb = NULL;
583
584 /* Imagine: socket is IPv6. IPv4 packet arrives,
585 goes to IPv4 receive handler and backlogged.
586 From backlog it always goes here. Kerboom...
587 Fortunately, dccp_rcv_established and rcv_established
588 handle them correctly, but it is not case with
589 dccp_v6_hnd_req and dccp_v6_ctl_send_reset(). --ANK
590 */
591
592 if (skb->protocol == htons(ETH_P_IP))
593 return dccp_v4_do_rcv(sk, skb);
594
fda9ef5d 595 if (sk_filter(sk, skb))
3df80d93
ACM
596 goto discard;
597
598 /*
45329e71
ACM
599 * socket locking is here for SMP purposes as backlog rcv is currently
600 * called with bh processing disabled.
3df80d93
ACM
601 */
602
603 /* Do Stevens' IPV6_PKTOPTIONS.
604
605 Yes, guys, it is the only place in our code, where we
606 may make it not affecting IPv4.
607 The rest of code is protocol independent,
608 and I do not like idea to uglify IPv4.
609
610 Actually, all the idea behind IPV6_PKTOPTIONS
611 looks not very well thought. For now we latch
612 options, received in the last packet, enqueued
613 by tcp. Feel free to propose better solution.
c9eaf173 614 --ANK (980728)
3df80d93
ACM
615 */
616 if (np->rxopt.all)
ca43ccf4 617 opt_skb = skb_clone_and_charge_r(skb, sk);
3df80d93
ACM
618
619 if (sk->sk_state == DCCP_OPEN) { /* Fast path */
620 if (dccp_rcv_established(sk, skb, dccp_hdr(skb), skb->len))
621 goto reset;
323fbd0e
A
622 if (opt_skb)
623 goto ipv6_pktoptions;
3df80d93
ACM
624 return 0;
625 }
626
d83ca5ac
GR
627 /*
628 * Step 3: Process LISTEN state
629 * If S.state == LISTEN,
630 * If P.type == Request or P contains a valid Init Cookie option,
631 * (* Must scan the packet's options to check for Init
632 * Cookies. Only Init Cookies are processed here,
633 * however; other options are processed in Step 8. This
634 * scan need only be performed if the endpoint uses Init
635 * Cookies *)
636 * (* Generate a new socket and switch to that socket *)
637 * Set S := new socket for this port pair
638 * S.state = RESPOND
639 * Choose S.ISS (initial seqno) or set from Init Cookies
640 * Initialize S.GAR := S.ISS
641 * Set S.ISR, S.GSR, S.SWL, S.SWH from packet or Init Cookies
642 * Continue with S.state == RESPOND
643 * (* A Response packet will be generated in Step 11 *)
644 * Otherwise,
645 * Generate Reset(No Connection) unless P.type == Reset
646 * Drop packet and return
647 *
648 * NOTE: the check for the packet types is done in
649 * dccp_rcv_state_process
650 */
3df80d93
ACM
651
652 if (dccp_rcv_state_process(sk, skb, dccp_hdr(skb), skb->len))
653 goto reset;
323fbd0e
A
654 if (opt_skb)
655 goto ipv6_pktoptions;
3df80d93
ACM
656 return 0;
657
658reset:
cfb6eeb4 659 dccp_v6_ctl_send_reset(sk, skb);
3df80d93 660discard:
45329e71 661 if (opt_skb != NULL)
3df80d93
ACM
662 __kfree_skb(opt_skb);
663 kfree_skb(skb);
664 return 0;
323fbd0e
A
665
666/* Handling IPV6_PKTOPTIONS skb the similar
667 * way it's done for net/ipv6/tcp_ipv6.c
668 */
669ipv6_pktoptions:
670 if (!((1 << sk->sk_state) & (DCCPF_CLOSED | DCCPF_LISTEN))) {
671 if (np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo)
672 np->mcast_oif = inet6_iif(opt_skb);
673 if (np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim)
674 np->mcast_hops = ipv6_hdr(opt_skb)->hop_limit;
675 if (np->rxopt.bits.rxflow || np->rxopt.bits.rxtclass)
676 np->rcv_flowinfo = ip6_flowinfo(ipv6_hdr(opt_skb));
677 if (np->repflow)
678 np->flow_label = ip6_flowlabel(ipv6_hdr(opt_skb));
679 if (ipv6_opt_accepted(sk, opt_skb,
680 &DCCP_SKB_CB(opt_skb)->header.h6)) {
323fbd0e
A
681 memmove(IP6CB(opt_skb),
682 &DCCP_SKB_CB(opt_skb)->header.h6,
683 sizeof(struct inet6_skb_parm));
684 opt_skb = xchg(&np->pktoptions, opt_skb);
685 } else {
686 __kfree_skb(opt_skb);
687 opt_skb = xchg(&np->pktoptions, NULL);
688 }
689 }
690
691 kfree_skb(opt_skb);
692 return 0;
3df80d93
ACM
693}
694
e5bbef20 695static int dccp_v6_rcv(struct sk_buff *skb)
3df80d93
ACM
696{
697 const struct dccp_hdr *dh;
3b24d854 698 bool refcounted;
3df80d93 699 struct sock *sk;
6f4e5fff 700 int min_cov;
3df80d93 701
6f4e5fff 702 /* Step 1: Check header basics */
3df80d93
ACM
703
704 if (dccp_invalid_packet(skb))
705 goto discard_it;
706
6f4e5fff 707 /* Step 1: If header checksum is incorrect, drop packet and return. */
0660e03f
ACM
708 if (dccp_v6_csum_finish(skb, &ipv6_hdr(skb)->saddr,
709 &ipv6_hdr(skb)->daddr)) {
59348b19 710 DCCP_WARN("dropped packet with invalid checksum\n");
6f4e5fff
GR
711 goto discard_it;
712 }
713
3df80d93
ACM
714 dh = dccp_hdr(skb);
715
fde20105 716 DCCP_SKB_CB(skb)->dccpd_seq = dccp_hdr_seq(dh);
3df80d93
ACM
717 DCCP_SKB_CB(skb)->dccpd_type = dh->dccph_type;
718
719 if (dccp_packet_without_ack(skb))
720 DCCP_SKB_CB(skb)->dccpd_ack_seq = DCCP_PKT_WITHOUT_ACK_SEQ;
721 else
722 DCCP_SKB_CB(skb)->dccpd_ack_seq = dccp_hdr_ack_seq(skb);
723
4bdc3d66 724lookup:
a583636a 725 sk = __inet6_lookup_skb(&dccp_hashinfo, skb, __dccp_hdr_len(dh),
870c3151 726 dh->dccph_sport, dh->dccph_dport,
4297a0ef 727 inet6_iif(skb), 0, &refcounted);
4bdc3d66 728 if (!sk) {
d23c7107
GR
729 dccp_pr_debug("failed to look up flow ID in table and "
730 "get corresponding socket\n");
3df80d93 731 goto no_dccp_socket;
d23c7107 732 }
3df80d93 733
45329e71 734 /*
3df80d93 735 * Step 2:
8109b02b 736 * ... or S.state == TIMEWAIT,
3df80d93
ACM
737 * Generate Reset(No Connection) unless P.type == Reset
738 * Drop packet and return
739 */
d23c7107
GR
740 if (sk->sk_state == DCCP_TIME_WAIT) {
741 dccp_pr_debug("sk->sk_state == DCCP_TIME_WAIT: do_time_wait\n");
742 inet_twsk_put(inet_twsk(sk));
743 goto no_dccp_socket;
744 }
3df80d93 745
079096f1
ED
746 if (sk->sk_state == DCCP_NEW_SYN_RECV) {
747 struct request_sock *req = inet_reqsk(sk);
7716682c 748 struct sock *nsk;
079096f1
ED
749
750 sk = req->rsk_listener;
7716682c 751 if (unlikely(sk->sk_state != DCCP_LISTEN)) {
f03f2e15 752 inet_csk_reqsk_queue_drop_and_put(sk, req);
4bdc3d66
ED
753 goto lookup;
754 }
7716682c 755 sock_hold(sk);
3b24d854 756 refcounted = true;
7716682c 757 nsk = dccp_check_req(sk, skb, req);
079096f1
ED
758 if (!nsk) {
759 reqsk_put(req);
7716682c 760 goto discard_and_relse;
079096f1
ED
761 }
762 if (nsk == sk) {
079096f1
ED
763 reqsk_put(req);
764 } else if (dccp_child_process(sk, nsk, skb)) {
765 dccp_v6_ctl_send_reset(sk, skb);
7716682c 766 goto discard_and_relse;
079096f1 767 } else {
7716682c 768 sock_put(sk);
079096f1
ED
769 return 0;
770 }
771 }
6f4e5fff
GR
772 /*
773 * RFC 4340, sec. 9.2.1: Minimum Checksum Coverage
8109b02b
ACM
774 * o if MinCsCov = 0, only packets with CsCov = 0 are accepted
775 * o if MinCsCov > 0, also accept packets with CsCov >= MinCsCov
6f4e5fff
GR
776 */
777 min_cov = dccp_sk(sk)->dccps_pcrlen;
778 if (dh->dccph_cscov && (min_cov == 0 || dh->dccph_cscov < min_cov)) {
779 dccp_pr_debug("Packet CsCov %d does not satisfy MinCsCov %d\n",
780 dh->dccph_cscov, min_cov);
781 /* FIXME: send Data Dropped option (see also dccp_v4_rcv) */
782 goto discard_and_relse;
783 }
784
3df80d93
ACM
785 if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
786 goto discard_and_relse;
b0e214d2 787 nf_reset_ct(skb);
3df80d93 788
c3f24cfb
ED
789 return __sk_receive_skb(sk, skb, 1, dh->dccph_doff * 4,
790 refcounted) ? -1 : 0;
3df80d93
ACM
791
792no_dccp_socket:
793 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
794 goto discard_it;
795 /*
796 * Step 2:
8109b02b 797 * If no socket ...
3df80d93
ACM
798 * Generate Reset(No Connection) unless P.type == Reset
799 * Drop packet and return
800 */
801 if (dh->dccph_type != DCCP_PKT_RESET) {
802 DCCP_SKB_CB(skb)->dccpd_reset_code =
803 DCCP_RESET_CODE_NO_CONNECTION;
cfb6eeb4 804 dccp_v6_ctl_send_reset(sk, skb);
3df80d93 805 }
3df80d93 806
d23c7107 807discard_it:
3df80d93
ACM
808 kfree_skb(skb);
809 return 0;
810
811discard_and_relse:
3b24d854
ED
812 if (refcounted)
813 sock_put(sk);
3df80d93 814 goto discard_it;
3df80d93
ACM
815}
816
73c9e02c
GR
817static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
818 int addr_len)
819{
820 struct sockaddr_in6 *usin = (struct sockaddr_in6 *)uaddr;
821 struct inet_connection_sock *icsk = inet_csk(sk);
822 struct inet_sock *inet = inet_sk(sk);
823 struct ipv6_pinfo *np = inet6_sk(sk);
824 struct dccp_sock *dp = dccp_sk(sk);
20c59de2 825 struct in6_addr *saddr = NULL, *final_p, final;
45f6fad8 826 struct ipv6_txoptions *opt;
4c9483b2 827 struct flowi6 fl6;
73c9e02c
GR
828 struct dst_entry *dst;
829 int addr_type;
830 int err;
831
832 dp->dccps_role = DCCP_ROLE_CLIENT;
833
834 if (addr_len < SIN6_LEN_RFC2133)
835 return -EINVAL;
836
837 if (usin->sin6_family != AF_INET6)
838 return -EAFNOSUPPORT;
839
4c9483b2 840 memset(&fl6, 0, sizeof(fl6));
73c9e02c
GR
841
842 if (np->sndflow) {
4c9483b2
DM
843 fl6.flowlabel = usin->sin6_flowinfo & IPV6_FLOWINFO_MASK;
844 IP6_ECN_flow_init(fl6.flowlabel);
845 if (fl6.flowlabel & IPV6_FLOWLABEL_MASK) {
73c9e02c 846 struct ip6_flowlabel *flowlabel;
4c9483b2 847 flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);
59c820b2 848 if (IS_ERR(flowlabel))
73c9e02c 849 return -EINVAL;
73c9e02c
GR
850 fl6_sock_release(flowlabel);
851 }
852 }
853 /*
854 * connect() to INADDR_ANY means loopback (BSD'ism).
855 */
856 if (ipv6_addr_any(&usin->sin6_addr))
857 usin->sin6_addr.s6_addr[15] = 1;
858
859 addr_type = ipv6_addr_type(&usin->sin6_addr);
860
861 if (addr_type & IPV6_ADDR_MULTICAST)
862 return -ENETUNREACH;
863
864 if (addr_type & IPV6_ADDR_LINKLOCAL) {
865 if (addr_len >= sizeof(struct sockaddr_in6) &&
866 usin->sin6_scope_id) {
867 /* If interface is set while binding, indices
868 * must coincide.
869 */
870 if (sk->sk_bound_dev_if &&
871 sk->sk_bound_dev_if != usin->sin6_scope_id)
872 return -EINVAL;
873
874 sk->sk_bound_dev_if = usin->sin6_scope_id;
875 }
876
877 /* Connect to link-local address requires an interface */
878 if (!sk->sk_bound_dev_if)
879 return -EINVAL;
880 }
881
efe4208f 882 sk->sk_v6_daddr = usin->sin6_addr;
4c9483b2 883 np->flow_label = fl6.flowlabel;
73c9e02c
GR
884
885 /*
886 * DCCP over IPv4
887 */
888 if (addr_type == IPV6_ADDR_MAPPED) {
889 u32 exthdrlen = icsk->icsk_ext_hdr_len;
890 struct sockaddr_in sin;
891
892 SOCK_DEBUG(sk, "connect: ipv4 mapped\n");
893
89e9c728 894 if (ipv6_only_sock(sk))
73c9e02c
GR
895 return -ENETUNREACH;
896
897 sin.sin_family = AF_INET;
898 sin.sin_port = usin->sin6_port;
899 sin.sin_addr.s_addr = usin->sin6_addr.s6_addr32[3];
900
901 icsk->icsk_af_ops = &dccp_ipv6_mapped;
902 sk->sk_backlog_rcv = dccp_v4_do_rcv;
903
904 err = dccp_v4_connect(sk, (struct sockaddr *)&sin, sizeof(sin));
905 if (err) {
906 icsk->icsk_ext_hdr_len = exthdrlen;
907 icsk->icsk_af_ops = &dccp_ipv6_af_ops;
908 sk->sk_backlog_rcv = dccp_v6_do_rcv;
909 goto failure;
73c9e02c 910 }
d1e559d0 911 np->saddr = sk->sk_v6_rcv_saddr;
73c9e02c
GR
912 return err;
913 }
914
efe4208f
ED
915 if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr))
916 saddr = &sk->sk_v6_rcv_saddr;
73c9e02c 917
4c9483b2 918 fl6.flowi6_proto = IPPROTO_DCCP;
efe4208f 919 fl6.daddr = sk->sk_v6_daddr;
4e3fd7a0 920 fl6.saddr = saddr ? *saddr : np->saddr;
4c9483b2 921 fl6.flowi6_oif = sk->sk_bound_dev_if;
1958b856
DM
922 fl6.fl6_dport = usin->sin6_port;
923 fl6.fl6_sport = inet->inet_sport;
3df98d79 924 security_sk_classify_flow(sk, flowi6_to_flowi_common(&fl6));
73c9e02c 925
1e1d04e6 926 opt = rcu_dereference_protected(np->opt, lockdep_sock_is_held(sk));
45f6fad8 927 final_p = fl6_update_dst(&fl6, opt, &final);
73c9e02c 928
c4e85f73 929 dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p);
68d0c6d3
DM
930 if (IS_ERR(dst)) {
931 err = PTR_ERR(dst);
73c9e02c 932 goto failure;
14e50e57 933 }
73c9e02c
GR
934
935 if (saddr == NULL) {
4c9483b2 936 saddr = &fl6.saddr;
8c5dae4c
KI
937
938 err = inet_bhash2_update_saddr(sk, saddr, AF_INET6);
939 if (err)
940 goto failure;
73c9e02c
GR
941 }
942
943 /* set the source address */
4e3fd7a0 944 np->saddr = *saddr;
c720c7e8 945 inet->inet_rcv_saddr = LOOPBACK4_IPV6;
73c9e02c 946
6bd4f355 947 ip6_dst_store(sk, dst, NULL, NULL);
73c9e02c
GR
948
949 icsk->icsk_ext_hdr_len = 0;
45f6fad8
ED
950 if (opt)
951 icsk->icsk_ext_hdr_len = opt->opt_flen + opt->opt_nflen;
73c9e02c 952
c720c7e8 953 inet->inet_dport = usin->sin6_port;
73c9e02c
GR
954
955 dccp_set_state(sk, DCCP_REQUESTING);
956 err = inet6_hash_connect(&dccp_death_row, sk);
957 if (err)
958 goto late_failure;
d7f7365f
GR
959
960 dp->dccps_iss = secure_dccpv6_sequence_number(np->saddr.s6_addr32,
efe4208f 961 sk->sk_v6_daddr.s6_addr32,
c720c7e8
ED
962 inet->inet_sport,
963 inet->inet_dport);
73c9e02c
GR
964 err = dccp_connect(sk);
965 if (err)
966 goto late_failure;
967
968 return 0;
969
970late_failure:
971 dccp_set_state(sk, DCCP_CLOSED);
e0833d1f 972 inet_bhash2_reset_saddr(sk);
73c9e02c
GR
973 __sk_dst_reset(sk);
974failure:
c720c7e8 975 inet->inet_dport = 0;
73c9e02c
GR
976 sk->sk_route_caps = 0;
977 return err;
978}
979
3b401a81 980static const struct inet_connection_sock_af_ops dccp_ipv6_af_ops = {
543d9cfe
ACM
981 .queue_xmit = inet6_csk_xmit,
982 .send_check = dccp_v6_send_check,
983 .rebuild_header = inet6_sk_rebuild_header,
984 .conn_request = dccp_v6_conn_request,
985 .syn_recv_sock = dccp_v6_request_recv_sock,
986 .net_header_len = sizeof(struct ipv6hdr),
987 .setsockopt = ipv6_setsockopt,
988 .getsockopt = ipv6_getsockopt,
989 .addr2sockaddr = inet6_csk_addr2sockaddr,
990 .sockaddr_len = sizeof(struct sockaddr_in6),
3df80d93
ACM
991};
992
993/*
994 * DCCP over IPv4 via INET6 API
995 */
3b401a81 996static const struct inet_connection_sock_af_ops dccp_ipv6_mapped = {
543d9cfe
ACM
997 .queue_xmit = ip_queue_xmit,
998 .send_check = dccp_v4_send_check,
999 .rebuild_header = inet_sk_rebuild_header,
1000 .conn_request = dccp_v6_conn_request,
1001 .syn_recv_sock = dccp_v6_request_recv_sock,
1002 .net_header_len = sizeof(struct iphdr),
1003 .setsockopt = ipv6_setsockopt,
1004 .getsockopt = ipv6_getsockopt,
1005 .addr2sockaddr = inet6_csk_addr2sockaddr,
1006 .sockaddr_len = sizeof(struct sockaddr_in6),
3df80d93
ACM
1007};
1008
1651951e
KI
1009static void dccp_v6_sk_destruct(struct sock *sk)
1010{
1011 dccp_destruct_common(sk);
1012 inet6_sock_destruct(sk);
1013}
1014
3df80d93
ACM
1015/* NOTE: A lot of things set to zero explicitly by call to
1016 * sk_alloc() so need not be done here.
1017 */
1018static int dccp_v6_init_sock(struct sock *sk)
1019{
72478873
ACM
1020 static __u8 dccp_v6_ctl_sock_initialized;
1021 int err = dccp_init_sock(sk, dccp_v6_ctl_sock_initialized);
3df80d93 1022
72478873
ACM
1023 if (err == 0) {
1024 if (unlikely(!dccp_v6_ctl_sock_initialized))
1025 dccp_v6_ctl_sock_initialized = 1;
3df80d93 1026 inet_csk(sk)->icsk_af_ops = &dccp_ipv6_af_ops;
1651951e 1027 sk->sk_destruct = dccp_v6_sk_destruct;
72478873 1028 }
3df80d93
ACM
1029
1030 return err;
1031}
1032
73c9e02c
GR
1033static struct timewait_sock_ops dccp6_timewait_sock_ops = {
1034 .twsk_obj_size = sizeof(struct dccp6_timewait_sock),
1035};
1036
3df80d93 1037static struct proto dccp_v6_prot = {
543d9cfe
ACM
1038 .name = "DCCPv6",
1039 .owner = THIS_MODULE,
1040 .close = dccp_close,
1041 .connect = dccp_v6_connect,
1042 .disconnect = dccp_disconnect,
1043 .ioctl = dccp_ioctl,
1044 .init = dccp_v6_init_sock,
1045 .setsockopt = dccp_setsockopt,
1046 .getsockopt = dccp_getsockopt,
1047 .sendmsg = dccp_sendmsg,
1048 .recvmsg = dccp_recvmsg,
1049 .backlog_rcv = dccp_v6_do_rcv,
496611d7 1050 .hash = inet6_hash,
ab1e0a13 1051 .unhash = inet_unhash,
543d9cfe 1052 .accept = inet_csk_accept,
ab1e0a13 1053 .get_port = inet_csk_get_port,
543d9cfe 1054 .shutdown = dccp_shutdown,
1651951e 1055 .destroy = dccp_destroy_sock,
543d9cfe
ACM
1056 .orphan_count = &dccp_orphan_count,
1057 .max_header = MAX_DCCP_HEADER,
1058 .obj_size = sizeof(struct dccp6_sock),
5f0d5a3a 1059 .slab_flags = SLAB_TYPESAFE_BY_RCU,
543d9cfe
ACM
1060 .rsk_prot = &dccp6_request_sock_ops,
1061 .twsk_prot = &dccp6_timewait_sock_ops,
39d8cda7 1062 .h.hashinfo = &dccp_hashinfo,
3df80d93
ACM
1063};
1064
41135cc8 1065static const struct inet6_protocol dccp_v6_protocol = {
45329e71
ACM
1066 .handler = dccp_v6_rcv,
1067 .err_handler = dccp_v6_err,
1068 .flags = INET6_PROTO_NOPOLICY | INET6_PROTO_FINAL,
3df80d93
ACM
1069};
1070
5708e868 1071static const struct proto_ops inet6_dccp_ops = {
543d9cfe
ACM
1072 .family = PF_INET6,
1073 .owner = THIS_MODULE,
1074 .release = inet6_release,
1075 .bind = inet6_bind,
1076 .connect = inet_stream_connect,
1077 .socketpair = sock_no_socketpair,
1078 .accept = inet_accept,
1079 .getname = inet6_getname,
a11e1d43 1080 .poll = dccp_poll,
543d9cfe 1081 .ioctl = inet6_ioctl,
c7cbdbf2 1082 .gettstamp = sock_gettstamp,
543d9cfe
ACM
1083 .listen = inet_dccp_listen,
1084 .shutdown = inet_shutdown,
1085 .setsockopt = sock_common_setsockopt,
1086 .getsockopt = sock_common_getsockopt,
1087 .sendmsg = inet_sendmsg,
1088 .recvmsg = sock_common_recvmsg,
1089 .mmap = sock_no_mmap,
1090 .sendpage = sock_no_sendpage,
3fdadf7d 1091#ifdef CONFIG_COMPAT
3986912f 1092 .compat_ioctl = inet6_compat_ioctl,
3fdadf7d 1093#endif
3df80d93
ACM
1094};
1095
1096static struct inet_protosw dccp_v6_protosw = {
1097 .type = SOCK_DCCP,
1098 .protocol = IPPROTO_DCCP,
1099 .prot = &dccp_v6_prot,
1100 .ops = &inet6_dccp_ops,
d83d8461 1101 .flags = INET_PROTOSW_ICSK,
3df80d93
ACM
1102};
1103
2c8c1e72 1104static int __net_init dccp_v6_init_net(struct net *net)
8231bd27 1105{
b98b3304
FW
1106 struct dccp_v6_pernet *pn = net_generic(net, dccp_v6_pernet_id);
1107
d14a0ebd
GR
1108 if (dccp_hashinfo.bhash == NULL)
1109 return -ESOCKTNOSUPPORT;
334527d3 1110
b98b3304 1111 return inet_ctl_sock_create(&pn->v6_ctl_sk, PF_INET6,
d14a0ebd 1112 SOCK_DCCP, IPPROTO_DCCP, net);
8231bd27
PE
1113}
1114
2c8c1e72 1115static void __net_exit dccp_v6_exit_net(struct net *net)
8231bd27 1116{
b98b3304
FW
1117 struct dccp_v6_pernet *pn = net_generic(net, dccp_v6_pernet_id);
1118
1119 inet_ctl_sock_destroy(pn->v6_ctl_sk);
8231bd27
PE
1120}
1121
04c494e6
ED
1122static void __net_exit dccp_v6_exit_batch(struct list_head *net_exit_list)
1123{
1124 inet_twsk_purge(&dccp_hashinfo, AF_INET6);
1125}
1126
8231bd27
PE
1127static struct pernet_operations dccp_v6_ops = {
1128 .init = dccp_v6_init_net,
1129 .exit = dccp_v6_exit_net,
04c494e6 1130 .exit_batch = dccp_v6_exit_batch,
b98b3304
FW
1131 .id = &dccp_v6_pernet_id,
1132 .size = sizeof(struct dccp_v6_pernet),
8231bd27
PE
1133};
1134
3df80d93
ACM
1135static int __init dccp_v6_init(void)
1136{
1137 int err = proto_register(&dccp_v6_prot, 1);
1138
a0f9a4c2 1139 if (err)
3df80d93
ACM
1140 goto out;
1141
3df80d93 1142 inet6_register_protosw(&dccp_v6_protosw);
72478873 1143
8231bd27 1144 err = register_pernet_subsys(&dccp_v6_ops);
a0f9a4c2 1145 if (err)
8231bd27 1146 goto out_destroy_ctl_sock;
a0f9a4c2
XL
1147
1148 err = inet6_add_protocol(&dccp_v6_protocol, IPPROTO_DCCP);
1149 if (err)
1150 goto out_unregister_proto;
1151
3df80d93
ACM
1152out:
1153 return err;
a0f9a4c2
XL
1154out_unregister_proto:
1155 unregister_pernet_subsys(&dccp_v6_ops);
8231bd27 1156out_destroy_ctl_sock:
72478873 1157 inet6_unregister_protosw(&dccp_v6_protosw);
3df80d93
ACM
1158 proto_unregister(&dccp_v6_prot);
1159 goto out;
1160}
1161
1162static void __exit dccp_v6_exit(void)
1163{
1164 inet6_del_protocol(&dccp_v6_protocol, IPPROTO_DCCP);
a0f9a4c2 1165 unregister_pernet_subsys(&dccp_v6_ops);
3df80d93
ACM
1166 inet6_unregister_protosw(&dccp_v6_protosw);
1167 proto_unregister(&dccp_v6_prot);
1168}
1169
1170module_init(dccp_v6_init);
1171module_exit(dccp_v6_exit);
1172
1173/*
1174 * __stringify doesn't likes enums, so use SOCK_DCCP (6) and IPPROTO_DCCP (33)
1175 * values directly, Also cover the case where the protocol is not specified,
1176 * i.e. net-pf-PF_INET6-proto-0-type-SOCK_DCCP
1177 */
7131c6c7
JD
1178MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET6, 33, 6);
1179MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET6, 0, 6);
3df80d93
ACM
1180MODULE_LICENSE("GPL");
1181MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@mandriva.com>");
1182MODULE_DESCRIPTION("DCCPv6 - Datagram Congestion Controlled Protocol");