aboutsummaryrefslogtreecommitdiffstats
path: root/net/dccp/ipv6.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/dccp/ipv6.c')
-rw-r--r--net/dccp/ipv6.c37
1 files changed, 17 insertions, 20 deletions
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c
index e48ca5d45658..6574215a1f51 100644
--- a/net/dccp/ipv6.c
+++ b/net/dccp/ipv6.c
@@ -158,8 +158,8 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
158 ipv6_addr_copy(&fl.fl6_dst, &np->daddr); 158 ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
159 ipv6_addr_copy(&fl.fl6_src, &np->saddr); 159 ipv6_addr_copy(&fl.fl6_src, &np->saddr);
160 fl.oif = sk->sk_bound_dev_if; 160 fl.oif = sk->sk_bound_dev_if;
161 fl.fl_ip_dport = inet->dport; 161 fl.fl_ip_dport = inet->inet_dport;
162 fl.fl_ip_sport = inet->sport; 162 fl.fl_ip_sport = inet->inet_sport;
163 security_sk_classify_flow(sk, &fl); 163 security_sk_classify_flow(sk, &fl);
164 164
165 err = ip6_dst_lookup(sk, &dst, &fl); 165 err = ip6_dst_lookup(sk, &dst, &fl);
@@ -241,7 +241,8 @@ out:
241} 241}
242 242
243 243
244static int dccp_v6_send_response(struct sock *sk, struct request_sock *req) 244static int dccp_v6_send_response(struct sock *sk, struct request_sock *req,
245 struct request_values *rv_unused)
245{ 246{
246 struct inet6_request_sock *ireq6 = inet6_rsk(req); 247 struct inet6_request_sock *ireq6 = inet6_rsk(req);
247 struct ipv6_pinfo *np = inet6_sk(sk); 248 struct ipv6_pinfo *np = inet6_sk(sk);
@@ -468,7 +469,7 @@ static int dccp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
468 dreq->dreq_iss = dccp_v6_init_sequence(skb); 469 dreq->dreq_iss = dccp_v6_init_sequence(skb);
469 dreq->dreq_service = service; 470 dreq->dreq_service = service;
470 471
471 if (dccp_v6_send_response(sk, req)) 472 if (dccp_v6_send_response(sk, req, NULL))
472 goto drop_and_free; 473 goto drop_and_free;
473 474
474 inet6_csk_reqsk_queue_hash_add(sk, req, DCCP_TIMEOUT_INIT); 475 inet6_csk_reqsk_queue_hash_add(sk, req, DCCP_TIMEOUT_INIT);
@@ -510,11 +511,9 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk,
510 511
511 memcpy(newnp, np, sizeof(struct ipv6_pinfo)); 512 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
512 513
513 ipv6_addr_set(&newnp->daddr, 0, 0, htonl(0x0000FFFF), 514 ipv6_addr_set_v4mapped(newinet->inet_daddr, &newnp->daddr);
514 newinet->daddr);
515 515
516 ipv6_addr_set(&newnp->saddr, 0, 0, htonl(0x0000FFFF), 516 ipv6_addr_set_v4mapped(newinet->inet_saddr, &newnp->saddr);
517 newinet->saddr);
518 517
519 ipv6_addr_copy(&newnp->rcv_saddr, &newnp->saddr); 518 ipv6_addr_copy(&newnp->rcv_saddr, &newnp->saddr);
520 519
@@ -642,7 +641,8 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk,
642 641
643 dccp_sync_mss(newsk, dst_mtu(dst)); 642 dccp_sync_mss(newsk, dst_mtu(dst));
644 643
645 newinet->daddr = newinet->saddr = newinet->rcv_saddr = LOOPBACK4_IPV6; 644 newinet->inet_daddr = newinet->inet_saddr = LOOPBACK4_IPV6;
645 newinet->inet_rcv_saddr = LOOPBACK4_IPV6;
646 646
647 __inet6_hash(newsk); 647 __inet6_hash(newsk);
648 __inet_inherit_port(sk, newsk); 648 __inet_inherit_port(sk, newsk);
@@ -970,12 +970,9 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
970 icsk->icsk_af_ops = &dccp_ipv6_af_ops; 970 icsk->icsk_af_ops = &dccp_ipv6_af_ops;
971 sk->sk_backlog_rcv = dccp_v6_do_rcv; 971 sk->sk_backlog_rcv = dccp_v6_do_rcv;
972 goto failure; 972 goto failure;
973 } else {
974 ipv6_addr_set(&np->saddr, 0, 0, htonl(0x0000FFFF),
975 inet->saddr);
976 ipv6_addr_set(&np->rcv_saddr, 0, 0, htonl(0x0000FFFF),
977 inet->rcv_saddr);
978 } 973 }
974 ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr);
975 ipv6_addr_set_v4mapped(inet->inet_rcv_saddr, &np->rcv_saddr);
979 976
980 return err; 977 return err;
981 } 978 }
@@ -988,7 +985,7 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
988 ipv6_addr_copy(&fl.fl6_src, saddr ? saddr : &np->saddr); 985 ipv6_addr_copy(&fl.fl6_src, saddr ? saddr : &np->saddr);
989 fl.oif = sk->sk_bound_dev_if; 986 fl.oif = sk->sk_bound_dev_if;
990 fl.fl_ip_dport = usin->sin6_port; 987 fl.fl_ip_dport = usin->sin6_port;
991 fl.fl_ip_sport = inet->sport; 988 fl.fl_ip_sport = inet->inet_sport;
992 security_sk_classify_flow(sk, &fl); 989 security_sk_classify_flow(sk, &fl);
993 990
994 if (np->opt != NULL && np->opt->srcrt != NULL) { 991 if (np->opt != NULL && np->opt->srcrt != NULL) {
@@ -1021,7 +1018,7 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
1021 1018
1022 /* set the source address */ 1019 /* set the source address */
1023 ipv6_addr_copy(&np->saddr, saddr); 1020 ipv6_addr_copy(&np->saddr, saddr);
1024 inet->rcv_saddr = LOOPBACK4_IPV6; 1021 inet->inet_rcv_saddr = LOOPBACK4_IPV6;
1025 1022
1026 __ip6_dst_store(sk, dst, NULL, NULL); 1023 __ip6_dst_store(sk, dst, NULL, NULL);
1027 1024
@@ -1030,7 +1027,7 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
1030 icsk->icsk_ext_hdr_len = (np->opt->opt_flen + 1027 icsk->icsk_ext_hdr_len = (np->opt->opt_flen +
1031 np->opt->opt_nflen); 1028 np->opt->opt_nflen);
1032 1029
1033 inet->dport = usin->sin6_port; 1030 inet->inet_dport = usin->sin6_port;
1034 1031
1035 dccp_set_state(sk, DCCP_REQUESTING); 1032 dccp_set_state(sk, DCCP_REQUESTING);
1036 err = inet6_hash_connect(&dccp_death_row, sk); 1033 err = inet6_hash_connect(&dccp_death_row, sk);
@@ -1039,7 +1036,8 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
1039 1036
1040 dp->dccps_iss = secure_dccpv6_sequence_number(np->saddr.s6_addr32, 1037 dp->dccps_iss = secure_dccpv6_sequence_number(np->saddr.s6_addr32,
1041 np->daddr.s6_addr32, 1038 np->daddr.s6_addr32,
1042 inet->sport, inet->dport); 1039 inet->inet_sport,
1040 inet->inet_dport);
1043 err = dccp_connect(sk); 1041 err = dccp_connect(sk);
1044 if (err) 1042 if (err)
1045 goto late_failure; 1043 goto late_failure;
@@ -1050,7 +1048,7 @@ late_failure:
1050 dccp_set_state(sk, DCCP_CLOSED); 1048 dccp_set_state(sk, DCCP_CLOSED);
1051 __sk_dst_reset(sk); 1049 __sk_dst_reset(sk);
1052failure: 1050failure:
1053 inet->dport = 0; 1051 inet->inet_dport = 0;
1054 sk->sk_route_caps = 0; 1052 sk->sk_route_caps = 0;
1055 return err; 1053 return err;
1056} 1054}
@@ -1188,7 +1186,6 @@ static struct inet_protosw dccp_v6_protosw = {
1188 .protocol = IPPROTO_DCCP, 1186 .protocol = IPPROTO_DCCP,
1189 .prot = &dccp_v6_prot, 1187 .prot = &dccp_v6_prot,
1190 .ops = &inet6_dccp_ops, 1188 .ops = &inet6_dccp_ops,
1191 .capability = -1,
1192 .flags = INET_PROTOSW_ICSK, 1189 .flags = INET_PROTOSW_ICSK,
1193}; 1190};
1194 1191