55
55
/* add pseudo-header to DCCP checksum stored in skb->csum */
56
56
static inline __sum16 dccp_v6_csum_finish(struct sk_buff *skb,
57
struct in6_addr *saddr,
58
struct in6_addr *daddr)
57
const struct in6_addr *saddr,
58
const struct in6_addr *daddr)
60
60
return csum_ipv6_magic(saddr, daddr, skb->len, IPPROTO_DCCP, skb->csum);
87
87
static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
88
88
u8 type, u8 code, int offset, __be32 info)
90
struct ipv6hdr *hdr = (struct ipv6hdr *)skb->data;
90
const struct ipv6hdr *hdr = (const struct ipv6hdr *)skb->data;
91
91
const struct dccp_hdr *dh = (struct dccp_hdr *)(skb->data + offset);
92
92
struct dccp_sock *dp;
93
93
struct ipv6_pinfo *np;
147
147
dst = __sk_dst_check(sk, np->dst_cookie);
148
148
if (dst == NULL) {
149
149
struct inet_sock *inet = inet_sk(sk);
152
152
/* BUGGG_FUTURE: Again, it is not clear how
153
153
to handle rthdr case. Ignore this complexity
156
memset(&fl, 0, sizeof(fl));
157
fl.proto = IPPROTO_DCCP;
158
ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
159
ipv6_addr_copy(&fl.fl6_src, &np->saddr);
160
fl.oif = sk->sk_bound_dev_if;
161
fl.fl_ip_dport = inet->inet_dport;
162
fl.fl_ip_sport = inet->inet_sport;
163
security_sk_classify_flow(sk, &fl);
165
err = ip6_dst_lookup(sk, &dst, &fl);
167
sk->sk_err_soft = -err;
171
err = xfrm_lookup(net, &dst, &fl, sk, 0);
173
sk->sk_err_soft = -err;
156
memset(&fl6, 0, sizeof(fl6));
157
fl6.flowi6_proto = IPPROTO_DCCP;
158
ipv6_addr_copy(&fl6.daddr, &np->daddr);
159
ipv6_addr_copy(&fl6.saddr, &np->saddr);
160
fl6.flowi6_oif = sk->sk_bound_dev_if;
161
fl6.fl6_dport = inet->inet_dport;
162
fl6.fl6_sport = inet->inet_sport;
163
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
165
dst = ip6_dst_lookup_flow(sk, &fl6, NULL, false);
167
sk->sk_err_soft = -PTR_ERR(dst);
249
243
struct sk_buff *skb;
250
244
struct ipv6_txoptions *opt = NULL;
251
245
struct in6_addr *final_p, final;
254
248
struct dst_entry *dst;
256
memset(&fl, 0, sizeof(fl));
257
fl.proto = IPPROTO_DCCP;
258
ipv6_addr_copy(&fl.fl6_dst, &ireq6->rmt_addr);
259
ipv6_addr_copy(&fl.fl6_src, &ireq6->loc_addr);
260
fl.fl6_flowlabel = 0;
262
fl.fl_ip_dport = inet_rsk(req)->rmt_port;
263
fl.fl_ip_sport = inet_rsk(req)->loc_port;
264
security_req_classify_flow(req, &fl);
250
memset(&fl6, 0, sizeof(fl6));
251
fl6.flowi6_proto = IPPROTO_DCCP;
252
ipv6_addr_copy(&fl6.daddr, &ireq6->rmt_addr);
253
ipv6_addr_copy(&fl6.saddr, &ireq6->loc_addr);
255
fl6.flowi6_oif = ireq6->iif;
256
fl6.fl6_dport = inet_rsk(req)->rmt_port;
257
fl6.fl6_sport = inet_rsk(req)->loc_port;
258
security_req_classify_flow(req, flowi6_to_flowi(&fl6));
268
final_p = fl6_update_dst(&fl, opt, &final);
270
err = ip6_dst_lookup(sk, &dst, &fl);
275
ipv6_addr_copy(&fl.fl6_dst, final_p);
277
err = xfrm_lookup(sock_net(sk), &dst, &fl, sk, 0);
262
final_p = fl6_update_dst(&fl6, opt, &final);
264
dst = ip6_dst_lookup_flow(sk, &fl6, final_p, false);
281
271
skb = dccp_make_response(sk, dst, req);
282
272
if (skb != NULL) {
285
275
dh->dccph_checksum = dccp_v6_csum_finish(skb,
286
276
&ireq6->loc_addr,
287
277
&ireq6->rmt_addr);
288
ipv6_addr_copy(&fl.fl6_dst, &ireq6->rmt_addr);
289
err = ip6_xmit(sk, skb, &fl, opt);
278
ipv6_addr_copy(&fl6.daddr, &ireq6->rmt_addr);
279
err = ip6_xmit(sk, skb, &fl6, opt);
290
280
err = net_xmit_eval(err);
307
297
static void dccp_v6_ctl_send_reset(struct sock *sk, struct sk_buff *rxskb)
309
struct ipv6hdr *rxip6h;
299
const struct ipv6hdr *rxip6h;
310
300
struct sk_buff *skb;
312
302
struct net *net = dev_net(skb_dst(rxskb)->dev);
313
303
struct sock *ctl_sk = net->dccp.v6_ctl_sk;
314
304
struct dst_entry *dst;
327
317
dccp_hdr(skb)->dccph_checksum = dccp_v6_csum_finish(skb, &rxip6h->saddr,
330
memset(&fl, 0, sizeof(fl));
331
ipv6_addr_copy(&fl.fl6_dst, &rxip6h->saddr);
332
ipv6_addr_copy(&fl.fl6_src, &rxip6h->daddr);
320
memset(&fl6, 0, sizeof(fl6));
321
ipv6_addr_copy(&fl6.daddr, &rxip6h->saddr);
322
ipv6_addr_copy(&fl6.saddr, &rxip6h->daddr);
334
fl.proto = IPPROTO_DCCP;
335
fl.oif = inet6_iif(rxskb);
336
fl.fl_ip_dport = dccp_hdr(skb)->dccph_dport;
337
fl.fl_ip_sport = dccp_hdr(skb)->dccph_sport;
338
security_skb_classify_flow(rxskb, &fl);
324
fl6.flowi6_proto = IPPROTO_DCCP;
325
fl6.flowi6_oif = inet6_iif(rxskb);
326
fl6.fl6_dport = dccp_hdr(skb)->dccph_dport;
327
fl6.fl6_sport = dccp_hdr(skb)->dccph_sport;
328
security_skb_classify_flow(rxskb, flowi6_to_flowi(&fl6));
340
330
/* sk = NULL, but it is safe for now. RST socket required. */
341
if (!ip6_dst_lookup(ctl_sk, &dst, &fl)) {
342
if (xfrm_lookup(net, &dst, &fl, NULL, 0) >= 0) {
343
skb_dst_set(skb, dst);
344
ip6_xmit(ctl_sk, skb, &fl, NULL);
345
DCCP_INC_STATS_BH(DCCP_MIB_OUTSEGS);
346
DCCP_INC_STATS_BH(DCCP_MIB_OUTRSTS);
331
dst = ip6_dst_lookup_flow(ctl_sk, &fl6, NULL, false);
333
skb_dst_set(skb, dst);
334
ip6_xmit(ctl_sk, skb, &fl6, NULL);
335
DCCP_INC_STATS_BH(DCCP_MIB_OUTSEGS);
336
DCCP_INC_STATS_BH(DCCP_MIB_OUTRSTS);
484
473
struct inet6_request_sock *ireq6 = inet6_rsk(req);
485
474
struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
486
475
struct inet_sock *newinet;
487
struct dccp_sock *newdp;
488
476
struct dccp6_sock *newdp6;
489
477
struct sock *newsk;
490
478
struct ipv6_txoptions *opt;
541
528
if (dst == NULL) {
542
529
struct in6_addr *final_p, final;
545
memset(&fl, 0, sizeof(fl));
546
fl.proto = IPPROTO_DCCP;
547
ipv6_addr_copy(&fl.fl6_dst, &ireq6->rmt_addr);
548
final_p = fl6_update_dst(&fl, opt, &final);
549
ipv6_addr_copy(&fl.fl6_src, &ireq6->loc_addr);
550
fl.oif = sk->sk_bound_dev_if;
551
fl.fl_ip_dport = inet_rsk(req)->rmt_port;
552
fl.fl_ip_sport = inet_rsk(req)->loc_port;
553
security_sk_classify_flow(sk, &fl);
555
if (ip6_dst_lookup(sk, &dst, &fl))
559
ipv6_addr_copy(&fl.fl6_dst, final_p);
561
if ((xfrm_lookup(sock_net(sk), &dst, &fl, sk, 0)) < 0)
532
memset(&fl6, 0, sizeof(fl6));
533
fl6.flowi6_proto = IPPROTO_DCCP;
534
ipv6_addr_copy(&fl6.daddr, &ireq6->rmt_addr);
535
final_p = fl6_update_dst(&fl6, opt, &final);
536
ipv6_addr_copy(&fl6.saddr, &ireq6->loc_addr);
537
fl6.flowi6_oif = sk->sk_bound_dev_if;
538
fl6.fl6_dport = inet_rsk(req)->rmt_port;
539
fl6.fl6_sport = inet_rsk(req)->loc_port;
540
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
542
dst = ip6_dst_lookup_flow(sk, &fl6, final_p, false);
578
560
newdp6 = (struct dccp6_sock *)newsk;
579
561
newinet = inet_sk(newsk);
580
562
newinet->pinet6 = &newdp6->inet6;
581
newdp = dccp_sk(newsk);
582
563
newnp = inet6_sk(newsk);
584
565
memcpy(newnp, np, sizeof(struct ipv6_pinfo));
891
872
if (usin->sin6_family != AF_INET6)
892
873
return -EAFNOSUPPORT;
894
memset(&fl, 0, sizeof(fl));
875
memset(&fl6, 0, sizeof(fl6));
896
877
if (np->sndflow) {
897
fl.fl6_flowlabel = usin->sin6_flowinfo & IPV6_FLOWINFO_MASK;
898
IP6_ECN_flow_init(fl.fl6_flowlabel);
899
if (fl.fl6_flowlabel & IPV6_FLOWLABEL_MASK) {
878
fl6.flowlabel = usin->sin6_flowinfo & IPV6_FLOWINFO_MASK;
879
IP6_ECN_flow_init(fl6.flowlabel);
880
if (fl6.flowlabel & IPV6_FLOWLABEL_MASK) {
900
881
struct ip6_flowlabel *flowlabel;
901
flowlabel = fl6_sock_lookup(sk, fl.fl6_flowlabel);
882
flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);
902
883
if (flowlabel == NULL)
904
885
ipv6_addr_copy(&usin->sin6_addr, &flowlabel->dst);
972
953
if (!ipv6_addr_any(&np->rcv_saddr))
973
954
saddr = &np->rcv_saddr;
975
fl.proto = IPPROTO_DCCP;
976
ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
977
ipv6_addr_copy(&fl.fl6_src, saddr ? saddr : &np->saddr);
978
fl.oif = sk->sk_bound_dev_if;
979
fl.fl_ip_dport = usin->sin6_port;
980
fl.fl_ip_sport = inet->inet_sport;
981
security_sk_classify_flow(sk, &fl);
983
final_p = fl6_update_dst(&fl, np->opt, &final);
985
err = ip6_dst_lookup(sk, &dst, &fl);
956
fl6.flowi6_proto = IPPROTO_DCCP;
957
ipv6_addr_copy(&fl6.daddr, &np->daddr);
958
ipv6_addr_copy(&fl6.saddr, saddr ? saddr : &np->saddr);
959
fl6.flowi6_oif = sk->sk_bound_dev_if;
960
fl6.fl6_dport = usin->sin6_port;
961
fl6.fl6_sport = inet->inet_sport;
962
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
964
final_p = fl6_update_dst(&fl6, np->opt, &final);
966
dst = ip6_dst_lookup_flow(sk, &fl6, final_p, true);
990
ipv6_addr_copy(&fl.fl6_dst, final_p);
992
err = __xfrm_lookup(sock_net(sk), &dst, &fl, sk, XFRM_LOOKUP_WAIT);
995
err = ip6_dst_blackhole(sk, &dst, &fl);
1000
972
if (saddr == NULL) {
1001
saddr = &fl.fl6_src;
1002
974
ipv6_addr_copy(&np->rcv_saddr, saddr);