diff options
Diffstat (limited to 'net/dccp/ipv6.c')
-rw-r--r-- | net/dccp/ipv6.c | 37 |
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 | ||
244 | static int dccp_v6_send_response(struct sock *sk, struct request_sock *req) | 244 | static 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); |
1052 | failure: | 1050 | failure: |
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 | ||