diff options
| author | Arnaldo Carvalho de Melo <acme@mandriva.com> | 2006-03-21 01:01:29 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2006-03-21 01:01:29 -0500 |
| commit | 45329e71eeb6cb483c6e7fe9e6f2849dd2932cb5 (patch) | |
| tree | 95d3aea5bfee63103ff6132c630cc220820d5bbb /net/dccp | |
| parent | c4d9390941aee136fd35bb38eb1d6de4e3b1487d (diff) | |
[DCCP] ipv6: cleanups
No changes in the logic were made, just removing trailing whitespaces,
etc.
Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/dccp')
| -rw-r--r-- | net/dccp/ipv6.c | 256 |
1 files changed, 129 insertions, 127 deletions
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c index 6bd9979334a2..f28f38fd0134 100644 --- a/net/dccp/ipv6.c +++ b/net/dccp/ipv6.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * DCCP over IPv6 | 2 | * DCCP over IPv6 |
| 3 | * Linux INET6 implementation | 3 | * Linux INET6 implementation |
| 4 | * | 4 | * |
| 5 | * Based on net/dccp6/ipv6.c | 5 | * Based on net/dccp6/ipv6.c |
| 6 | * | 6 | * |
| @@ -66,8 +66,8 @@ static void dccp_v6_hash(struct sock *sk) | |||
| 66 | } | 66 | } |
| 67 | 67 | ||
| 68 | static inline u16 dccp_v6_check(struct dccp_hdr *dh, int len, | 68 | static inline u16 dccp_v6_check(struct dccp_hdr *dh, int len, |
| 69 | struct in6_addr *saddr, | 69 | struct in6_addr *saddr, |
| 70 | struct in6_addr *daddr, | 70 | struct in6_addr *daddr, |
| 71 | unsigned long base) | 71 | unsigned long base) |
| 72 | { | 72 | { |
| 73 | return csum_ipv6_magic(saddr, daddr, len, IPPROTO_DCCP, base); | 73 | return csum_ipv6_magic(saddr, daddr, len, IPPROTO_DCCP, base); |
| @@ -82,17 +82,17 @@ static __u32 dccp_v6_init_sequence(struct sock *sk, struct sk_buff *skb) | |||
| 82 | skb->nh.ipv6h->saddr.s6_addr32, | 82 | skb->nh.ipv6h->saddr.s6_addr32, |
| 83 | dh->dccph_dport, | 83 | dh->dccph_dport, |
| 84 | dh->dccph_sport); | 84 | dh->dccph_sport); |
| 85 | else | 85 | |
| 86 | return secure_dccp_sequence_number(skb->nh.iph->daddr, | 86 | return secure_dccp_sequence_number(skb->nh.iph->daddr, |
| 87 | skb->nh.iph->saddr, | 87 | skb->nh.iph->saddr, |
| 88 | dh->dccph_dport, | 88 | dh->dccph_dport, |
| 89 | dh->dccph_sport); | 89 | dh->dccph_sport); |
| 90 | } | 90 | } |
| 91 | 91 | ||
| 92 | static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | 92 | static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr, |
| 93 | int addr_len) | 93 | int addr_len) |
| 94 | { | 94 | { |
| 95 | struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr; | 95 | struct sockaddr_in6 *usin = (struct sockaddr_in6 *)uaddr; |
| 96 | struct inet_connection_sock *icsk = inet_csk(sk); | 96 | struct inet_connection_sock *icsk = inet_csk(sk); |
| 97 | struct inet_sock *inet = inet_sk(sk); | 97 | struct inet_sock *inet = inet_sk(sk); |
| 98 | struct ipv6_pinfo *np = inet6_sk(sk); | 98 | struct ipv6_pinfo *np = inet6_sk(sk); |
| @@ -105,10 +105,10 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | |||
| 105 | 105 | ||
| 106 | dp->dccps_role = DCCP_ROLE_CLIENT; | 106 | dp->dccps_role = DCCP_ROLE_CLIENT; |
| 107 | 107 | ||
| 108 | if (addr_len < SIN6_LEN_RFC2133) | 108 | if (addr_len < SIN6_LEN_RFC2133) |
| 109 | return -EINVAL; | 109 | return -EINVAL; |
| 110 | 110 | ||
| 111 | if (usin->sin6_family != AF_INET6) | 111 | if (usin->sin6_family != AF_INET6) |
| 112 | return -EAFNOSUPPORT; | 112 | return -EAFNOSUPPORT; |
| 113 | 113 | ||
| 114 | memset(&fl, 0, sizeof(fl)); | 114 | memset(&fl, 0, sizeof(fl)); |
| @@ -125,17 +125,15 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | |||
| 125 | fl6_sock_release(flowlabel); | 125 | fl6_sock_release(flowlabel); |
| 126 | } | 126 | } |
| 127 | } | 127 | } |
| 128 | |||
| 129 | /* | 128 | /* |
| 130 | * connect() to INADDR_ANY means loopback (BSD'ism). | 129 | * connect() to INADDR_ANY means loopback (BSD'ism). |
| 131 | */ | 130 | */ |
| 132 | 131 | if (ipv6_addr_any(&usin->sin6_addr)) | |
| 133 | if (ipv6_addr_any(&usin->sin6_addr)) | 132 | usin->sin6_addr.s6_addr[15] = 1; |
| 134 | usin->sin6_addr.s6_addr[15] = 0x1; | ||
| 135 | 133 | ||
| 136 | addr_type = ipv6_addr_type(&usin->sin6_addr); | 134 | addr_type = ipv6_addr_type(&usin->sin6_addr); |
| 137 | 135 | ||
| 138 | if(addr_type & IPV6_ADDR_MULTICAST) | 136 | if (addr_type & IPV6_ADDR_MULTICAST) |
| 139 | return -ENETUNREACH; | 137 | return -ENETUNREACH; |
| 140 | 138 | ||
| 141 | if (addr_type & IPV6_ADDR_LINKLOCAL) { | 139 | if (addr_type & IPV6_ADDR_LINKLOCAL) { |
| @@ -160,9 +158,8 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | |||
| 160 | np->flow_label = fl.fl6_flowlabel; | 158 | np->flow_label = fl.fl6_flowlabel; |
| 161 | 159 | ||
| 162 | /* | 160 | /* |
| 163 | * DCCP over IPv4 | 161 | * DCCP over IPv4 |
| 164 | */ | 162 | */ |
| 165 | |||
| 166 | if (addr_type == IPV6_ADDR_MAPPED) { | 163 | if (addr_type == IPV6_ADDR_MAPPED) { |
| 167 | u32 exthdrlen = icsk->icsk_ext_hdr_len; | 164 | u32 exthdrlen = icsk->icsk_ext_hdr_len; |
| 168 | struct sockaddr_in sin; | 165 | struct sockaddr_in sin; |
| @@ -180,7 +177,6 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | |||
| 180 | sk->sk_backlog_rcv = dccp_v4_do_rcv; | 177 | sk->sk_backlog_rcv = dccp_v4_do_rcv; |
| 181 | 178 | ||
| 182 | err = dccp_v4_connect(sk, (struct sockaddr *)&sin, sizeof(sin)); | 179 | err = dccp_v4_connect(sk, (struct sockaddr *)&sin, sizeof(sin)); |
| 183 | |||
| 184 | if (err) { | 180 | if (err) { |
| 185 | icsk->icsk_ext_hdr_len = exthdrlen; | 181 | icsk->icsk_ext_hdr_len = exthdrlen; |
| 186 | icsk->icsk_af_ops = &dccp_ipv6_af_ops; | 182 | icsk->icsk_af_ops = &dccp_ipv6_af_ops; |
| @@ -206,8 +202,9 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | |||
| 206 | fl.fl_ip_dport = usin->sin6_port; | 202 | fl.fl_ip_dport = usin->sin6_port; |
| 207 | fl.fl_ip_sport = inet->sport; | 203 | fl.fl_ip_sport = inet->sport; |
| 208 | 204 | ||
| 209 | if (np->opt && np->opt->srcrt) { | 205 | if (np->opt != NULL && np->opt->srcrt != NULL) { |
| 210 | struct rt0_hdr *rt0 = (struct rt0_hdr *)np->opt->srcrt; | 206 | const struct rt0_hdr *rt0 = (struct rt0_hdr *)np->opt->srcrt; |
| 207 | |||
| 211 | ipv6_addr_copy(&final, &fl.fl6_dst); | 208 | ipv6_addr_copy(&final, &fl.fl6_dst); |
| 212 | ipv6_addr_copy(&fl.fl6_dst, rt0->addr); | 209 | ipv6_addr_copy(&fl.fl6_dst, rt0->addr); |
| 213 | final_p = &final; | 210 | final_p = &final; |
| @@ -216,10 +213,12 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | |||
| 216 | err = ip6_dst_lookup(sk, &dst, &fl); | 213 | err = ip6_dst_lookup(sk, &dst, &fl); |
| 217 | if (err) | 214 | if (err) |
| 218 | goto failure; | 215 | goto failure; |
| 216 | |||
| 219 | if (final_p) | 217 | if (final_p) |
| 220 | ipv6_addr_copy(&fl.fl6_dst, final_p); | 218 | ipv6_addr_copy(&fl.fl6_dst, final_p); |
| 221 | 219 | ||
| 222 | if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) | 220 | err = xfrm_lookup(&dst, &fl, sk, 0); |
| 221 | if (err < 0) | ||
| 223 | goto failure; | 222 | goto failure; |
| 224 | 223 | ||
| 225 | if (saddr == NULL) { | 224 | if (saddr == NULL) { |
| @@ -234,7 +233,7 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | |||
| 234 | ip6_dst_store(sk, dst, NULL); | 233 | ip6_dst_store(sk, dst, NULL); |
| 235 | 234 | ||
| 236 | icsk->icsk_ext_hdr_len = 0; | 235 | icsk->icsk_ext_hdr_len = 0; |
| 237 | if (np->opt) | 236 | if (np->opt != NULL) |
| 238 | icsk->icsk_ext_hdr_len = (np->opt->opt_flen + | 237 | icsk->icsk_ext_hdr_len = (np->opt->opt_flen + |
| 239 | np->opt->opt_nflen); | 238 | np->opt->opt_nflen); |
| 240 | 239 | ||
| @@ -308,7 +307,6 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
| 308 | 307 | ||
| 309 | /* icmp should have updated the destination cache entry */ | 308 | /* icmp should have updated the destination cache entry */ |
| 310 | dst = __sk_dst_check(sk, np->dst_cookie); | 309 | dst = __sk_dst_check(sk, np->dst_cookie); |
| 311 | |||
| 312 | if (dst == NULL) { | 310 | if (dst == NULL) { |
| 313 | struct inet_sock *inet = inet_sk(sk); | 311 | struct inet_sock *inet = inet_sk(sk); |
| 314 | struct flowi fl; | 312 | struct flowi fl; |
| @@ -325,16 +323,17 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
| 325 | fl.fl_ip_dport = inet->dport; | 323 | fl.fl_ip_dport = inet->dport; |
| 326 | fl.fl_ip_sport = inet->sport; | 324 | fl.fl_ip_sport = inet->sport; |
| 327 | 325 | ||
| 328 | if ((err = ip6_dst_lookup(sk, &dst, &fl))) { | 326 | err = ip6_dst_lookup(sk, &dst, &fl); |
| 327 | if (err) { | ||
| 329 | sk->sk_err_soft = -err; | 328 | sk->sk_err_soft = -err; |
| 330 | goto out; | 329 | goto out; |
| 331 | } | 330 | } |
| 332 | 331 | ||
| 333 | if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) { | 332 | err = xfrm_lookup(&dst, &fl, sk, 0); |
| 333 | if (err < 0) { | ||
| 334 | sk->sk_err_soft = -err; | 334 | sk->sk_err_soft = -err; |
| 335 | goto out; | 335 | goto out; |
| 336 | } | 336 | } |
| 337 | |||
| 338 | } else | 337 | } else |
| 339 | dst_hold(dst); | 338 | dst_hold(dst); |
| 340 | 339 | ||
| @@ -358,11 +357,12 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
| 358 | req = inet6_csk_search_req(sk, &prev, dh->dccph_dport, | 357 | req = inet6_csk_search_req(sk, &prev, dh->dccph_dport, |
| 359 | &hdr->daddr, &hdr->saddr, | 358 | &hdr->daddr, &hdr->saddr, |
| 360 | inet6_iif(skb)); | 359 | inet6_iif(skb)); |
| 361 | if (!req) | 360 | if (req == NULL) |
| 362 | goto out; | 361 | goto out; |
| 363 | 362 | ||
| 364 | /* ICMPs are not backlogged, hence we cannot get | 363 | /* |
| 365 | * an established socket here. | 364 | * ICMPs are not backlogged, hence we cannot get an established |
| 365 | * socket here. | ||
| 366 | */ | 366 | */ |
| 367 | BUG_TRAP(req->sk == NULL); | 367 | BUG_TRAP(req->sk == NULL); |
| 368 | 368 | ||
| @@ -376,7 +376,7 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
| 376 | 376 | ||
| 377 | case DCCP_REQUESTING: | 377 | case DCCP_REQUESTING: |
| 378 | case DCCP_RESPOND: /* Cannot happen. | 378 | case DCCP_RESPOND: /* Cannot happen. |
| 379 | It can, it SYNs are crossed. --ANK */ | 379 | It can, it SYNs are crossed. --ANK */ |
| 380 | if (!sock_owned_by_user(sk)) { | 380 | if (!sock_owned_by_user(sk)) { |
| 381 | DCCP_INC_STATS_BH(DCCP_MIB_ATTEMPTFAILS); | 381 | DCCP_INC_STATS_BH(DCCP_MIB_ATTEMPTFAILS); |
| 382 | sk->sk_err = err; | 382 | sk->sk_err = err; |
| @@ -385,7 +385,6 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
| 385 | * (see connect in sock.c) | 385 | * (see connect in sock.c) |
| 386 | */ | 386 | */ |
| 387 | sk->sk_error_report(sk); | 387 | sk->sk_error_report(sk); |
| 388 | |||
| 389 | dccp_done(sk); | 388 | dccp_done(sk); |
| 390 | } else | 389 | } else |
| 391 | sk->sk_err_soft = err; | 390 | sk->sk_err_soft = err; |
| @@ -431,14 +430,16 @@ static int dccp_v6_send_response(struct sock *sk, struct request_sock *req, | |||
| 431 | ireq6->pktopts) { | 430 | ireq6->pktopts) { |
| 432 | struct sk_buff *pktopts = ireq6->pktopts; | 431 | struct sk_buff *pktopts = ireq6->pktopts; |
| 433 | struct inet6_skb_parm *rxopt = IP6CB(pktopts); | 432 | struct inet6_skb_parm *rxopt = IP6CB(pktopts); |
| 433 | |||
| 434 | if (rxopt->srcrt) | 434 | if (rxopt->srcrt) |
| 435 | opt = ipv6_invert_rthdr(sk, | 435 | opt = ipv6_invert_rthdr(sk, |
| 436 | (struct ipv6_rt_hdr *)(pktopts->nh.raw + | 436 | (struct ipv6_rt_hdr *)(pktopts->nh.raw + |
| 437 | rxopt->srcrt)); | 437 | rxopt->srcrt)); |
| 438 | } | 438 | } |
| 439 | 439 | ||
| 440 | if (opt && opt->srcrt) { | 440 | if (opt != NULL && opt->srcrt != NULL) { |
| 441 | struct rt0_hdr *rt0 = (struct rt0_hdr *)opt->srcrt; | 441 | const struct rt0_hdr *rt0 = (struct rt0_hdr *)opt->srcrt; |
| 442 | |||
| 442 | ipv6_addr_copy(&final, &fl.fl6_dst); | 443 | ipv6_addr_copy(&final, &fl.fl6_dst); |
| 443 | ipv6_addr_copy(&fl.fl6_dst, rt0->addr); | 444 | ipv6_addr_copy(&fl.fl6_dst, rt0->addr); |
| 444 | final_p = &final; | 445 | final_p = &final; |
| @@ -447,15 +448,19 @@ static int dccp_v6_send_response(struct sock *sk, struct request_sock *req, | |||
| 447 | err = ip6_dst_lookup(sk, &dst, &fl); | 448 | err = ip6_dst_lookup(sk, &dst, &fl); |
| 448 | if (err) | 449 | if (err) |
| 449 | goto done; | 450 | goto done; |
| 451 | |||
| 450 | if (final_p) | 452 | if (final_p) |
| 451 | ipv6_addr_copy(&fl.fl6_dst, final_p); | 453 | ipv6_addr_copy(&fl.fl6_dst, final_p); |
| 452 | if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) | 454 | |
| 455 | err = xfrm_lookup(&dst, &fl, sk, 0); | ||
| 456 | if (err < 0) | ||
| 453 | goto done; | 457 | goto done; |
| 454 | } | 458 | } |
| 455 | 459 | ||
| 456 | skb = dccp_make_response(sk, dst, req); | 460 | skb = dccp_make_response(sk, dst, req); |
| 457 | if (skb != NULL) { | 461 | if (skb != NULL) { |
| 458 | struct dccp_hdr *dh = dccp_hdr(skb); | 462 | struct dccp_hdr *dh = dccp_hdr(skb); |
| 463 | |||
| 459 | dh->dccph_checksum = dccp_v6_check(dh, skb->len, | 464 | dh->dccph_checksum = dccp_v6_check(dh, skb->len, |
| 460 | &ireq6->loc_addr, | 465 | &ireq6->loc_addr, |
| 461 | &ireq6->rmt_addr, | 466 | &ireq6->rmt_addr, |
| @@ -469,7 +474,7 @@ static int dccp_v6_send_response(struct sock *sk, struct request_sock *req, | |||
| 469 | } | 474 | } |
| 470 | 475 | ||
| 471 | done: | 476 | done: |
| 472 | if (opt && opt != np->opt) | 477 | if (opt != NULL && opt != np->opt) |
| 473 | sock_kfree_s(sk, opt, opt->tot_len); | 478 | sock_kfree_s(sk, opt, opt->tot_len); |
| 474 | dst_release(dst); | 479 | dst_release(dst); |
| 475 | return err; | 480 | return err; |
| @@ -500,7 +505,7 @@ static void dccp_v6_send_check(struct sock *sk, int len, struct sk_buff *skb) | |||
| 500 | struct dccp_hdr *dh = dccp_hdr(skb); | 505 | struct dccp_hdr *dh = dccp_hdr(skb); |
| 501 | 506 | ||
| 502 | dh->dccph_checksum = csum_ipv6_magic(&np->saddr, &np->daddr, | 507 | dh->dccph_checksum = csum_ipv6_magic(&np->saddr, &np->daddr, |
| 503 | len, IPPROTO_DCCP, | 508 | len, IPPROTO_DCCP, |
| 504 | csum_partial((char *)dh, | 509 | csum_partial((char *)dh, |
| 505 | dh->dccph_doff << 2, | 510 | dh->dccph_doff << 2, |
| 506 | skb->csum)); | 511 | skb->csum)); |
| @@ -508,7 +513,7 @@ static void dccp_v6_send_check(struct sock *sk, int len, struct sk_buff *skb) | |||
| 508 | 513 | ||
| 509 | static void dccp_v6_ctl_send_reset(struct sk_buff *rxskb) | 514 | static void dccp_v6_ctl_send_reset(struct sk_buff *rxskb) |
| 510 | { | 515 | { |
| 511 | struct dccp_hdr *rxdh = dccp_hdr(rxskb), *dh; | 516 | struct dccp_hdr *rxdh = dccp_hdr(rxskb), *dh; |
| 512 | const int dccp_hdr_reset_len = sizeof(struct dccp_hdr) + | 517 | const int dccp_hdr_reset_len = sizeof(struct dccp_hdr) + |
| 513 | sizeof(struct dccp_hdr_ext) + | 518 | sizeof(struct dccp_hdr_ext) + |
| 514 | sizeof(struct dccp_hdr_reset); | 519 | sizeof(struct dccp_hdr_reset); |
| @@ -520,7 +525,7 @@ static void dccp_v6_ctl_send_reset(struct sk_buff *rxskb) | |||
| 520 | return; | 525 | return; |
| 521 | 526 | ||
| 522 | if (!ipv6_unicast_destination(rxskb)) | 527 | if (!ipv6_unicast_destination(rxskb)) |
| 523 | return; | 528 | return; |
| 524 | 529 | ||
| 525 | /* | 530 | /* |
| 526 | * We need to grab some memory, and put together an RST, | 531 | * We need to grab some memory, and put together an RST, |
| @@ -529,7 +534,7 @@ static void dccp_v6_ctl_send_reset(struct sk_buff *rxskb) | |||
| 529 | 534 | ||
| 530 | skb = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) + | 535 | skb = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) + |
| 531 | dccp_hdr_reset_len, GFP_ATOMIC); | 536 | dccp_hdr_reset_len, GFP_ATOMIC); |
| 532 | if (skb == NULL) | 537 | if (skb == NULL) |
| 533 | return; | 538 | return; |
| 534 | 539 | ||
| 535 | skb_reserve(skb, MAX_HEADER + sizeof(struct ipv6hdr) + | 540 | skb_reserve(skb, MAX_HEADER + sizeof(struct ipv6hdr) + |
| @@ -608,7 +613,7 @@ static void dccp_v6_ctl_send_ack(struct sk_buff *rxskb) | |||
| 608 | dh->dccph_dport = rxdh->dccph_sport; | 613 | dh->dccph_dport = rxdh->dccph_sport; |
| 609 | dh->dccph_doff = dccp_hdr_ack_len / 4; | 614 | dh->dccph_doff = dccp_hdr_ack_len / 4; |
| 610 | dh->dccph_x = 1; | 615 | dh->dccph_x = 1; |
| 611 | 616 | ||
| 612 | dccp_hdr_set_seq(dh, DCCP_SKB_CB(rxskb)->dccpd_ack_seq); | 617 | dccp_hdr_set_seq(dh, DCCP_SKB_CB(rxskb)->dccpd_ack_seq); |
| 613 | dccp_hdr_set_ack(dccp_hdr_ack_bits(skb), | 618 | dccp_hdr_set_ack(dccp_hdr_ack_bits(skb), |
| 614 | DCCP_SKB_CB(rxskb)->dccpd_seq); | 619 | DCCP_SKB_CB(rxskb)->dccpd_seq); |
| @@ -660,7 +665,6 @@ static struct sock *dccp_v6_hnd_req(struct sock *sk,struct sk_buff *skb) | |||
| 660 | &iph->saddr, dh->dccph_sport, | 665 | &iph->saddr, dh->dccph_sport, |
| 661 | &iph->daddr, ntohs(dh->dccph_dport), | 666 | &iph->daddr, ntohs(dh->dccph_dport), |
| 662 | inet6_iif(skb)); | 667 | inet6_iif(skb)); |
| 663 | |||
| 664 | if (nsk != NULL) { | 668 | if (nsk != NULL) { |
| 665 | if (nsk->sk_state != DCCP_TIME_WAIT) { | 669 | if (nsk->sk_state != DCCP_TIME_WAIT) { |
| 666 | bh_lock_sock(nsk); | 670 | bh_lock_sock(nsk); |
| @@ -689,17 +693,17 @@ static int dccp_v6_conn_request(struct sock *sk, struct sk_buff *skb) | |||
| 689 | return dccp_v4_conn_request(sk, skb); | 693 | return dccp_v4_conn_request(sk, skb); |
| 690 | 694 | ||
| 691 | if (!ipv6_unicast_destination(skb)) | 695 | if (!ipv6_unicast_destination(skb)) |
| 692 | goto drop; | 696 | goto drop; |
| 693 | 697 | ||
| 694 | if (dccp_bad_service_code(sk, service)) { | 698 | if (dccp_bad_service_code(sk, service)) { |
| 695 | reset_code = DCCP_RESET_CODE_BAD_SERVICE_CODE; | 699 | reset_code = DCCP_RESET_CODE_BAD_SERVICE_CODE; |
| 696 | goto drop; | 700 | goto drop; |
| 697 | } | 701 | } |
| 698 | /* | 702 | /* |
| 699 | * There are no SYN attacks on IPv6, yet... | 703 | * There are no SYN attacks on IPv6, yet... |
| 700 | */ | 704 | */ |
| 701 | if (inet_csk_reqsk_queue_is_full(sk)) | 705 | if (inet_csk_reqsk_queue_is_full(sk)) |
| 702 | goto drop; | 706 | goto drop; |
| 703 | 707 | ||
| 704 | if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1) | 708 | if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1) |
| 705 | goto drop; | 709 | goto drop; |
| @@ -733,7 +737,7 @@ static int dccp_v6_conn_request(struct sock *sk, struct sk_buff *skb) | |||
| 733 | ipv6_addr_type(&ireq6->rmt_addr) & IPV6_ADDR_LINKLOCAL) | 737 | ipv6_addr_type(&ireq6->rmt_addr) & IPV6_ADDR_LINKLOCAL) |
| 734 | ireq6->iif = inet6_iif(skb); | 738 | ireq6->iif = inet6_iif(skb); |
| 735 | 739 | ||
| 736 | /* | 740 | /* |
| 737 | * Step 3: Process LISTEN state | 741 | * Step 3: Process LISTEN state |
| 738 | * | 742 | * |
| 739 | * Set S.ISR, S.GSR, S.SWL, S.SWH from packet or Init Cookie | 743 | * Set S.ISR, S.GSR, S.SWL, S.SWH from packet or Init Cookie |
| @@ -777,9 +781,8 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk, | |||
| 777 | /* | 781 | /* |
| 778 | * v6 mapped | 782 | * v6 mapped |
| 779 | */ | 783 | */ |
| 780 | |||
| 781 | newsk = dccp_v4_request_recv_sock(sk, skb, req, dst); | 784 | newsk = dccp_v4_request_recv_sock(sk, skb, req, dst); |
| 782 | if (newsk == NULL) | 785 | if (newsk == NULL) |
| 783 | return NULL; | 786 | return NULL; |
| 784 | 787 | ||
| 785 | newdp6 = (struct dccp6_sock *)newsk; | 788 | newdp6 = (struct dccp6_sock *)newsk; |
| @@ -825,9 +828,9 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk, | |||
| 825 | if (sk_acceptq_is_full(sk)) | 828 | if (sk_acceptq_is_full(sk)) |
| 826 | goto out_overflow; | 829 | goto out_overflow; |
| 827 | 830 | ||
| 828 | if (np->rxopt.bits.osrcrt == 2 && | 831 | if (np->rxopt.bits.osrcrt == 2 && opt == NULL && ireq6->pktopts) { |
| 829 | opt == NULL && ireq6->pktopts) { | 832 | const struct inet6_skb_parm *rxopt = IP6CB(ireq6->pktopts); |
| 830 | struct inet6_skb_parm *rxopt = IP6CB(ireq6->pktopts); | 833 | |
| 831 | if (rxopt->srcrt) | 834 | if (rxopt->srcrt) |
| 832 | opt = ipv6_invert_rthdr(sk, | 835 | opt = ipv6_invert_rthdr(sk, |
| 833 | (struct ipv6_rt_hdr *)(ireq6->pktopts->nh.raw + | 836 | (struct ipv6_rt_hdr *)(ireq6->pktopts->nh.raw + |
| @@ -841,8 +844,9 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk, | |||
| 841 | memset(&fl, 0, sizeof(fl)); | 844 | memset(&fl, 0, sizeof(fl)); |
| 842 | fl.proto = IPPROTO_DCCP; | 845 | fl.proto = IPPROTO_DCCP; |
| 843 | ipv6_addr_copy(&fl.fl6_dst, &ireq6->rmt_addr); | 846 | ipv6_addr_copy(&fl.fl6_dst, &ireq6->rmt_addr); |
| 844 | if (opt && opt->srcrt) { | 847 | if (opt != NULL && opt->srcrt != NULL) { |
| 845 | struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt; | 848 | const struct rt0_hdr *rt0 = (struct rt0_hdr *)opt->srcrt; |
| 849 | |||
| 846 | ipv6_addr_copy(&final, &fl.fl6_dst); | 850 | ipv6_addr_copy(&final, &fl.fl6_dst); |
| 847 | ipv6_addr_copy(&fl.fl6_dst, rt0->addr); | 851 | ipv6_addr_copy(&fl.fl6_dst, rt0->addr); |
| 848 | final_p = &final; | 852 | final_p = &final; |
| @@ -860,7 +864,7 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk, | |||
| 860 | 864 | ||
| 861 | if ((xfrm_lookup(&dst, &fl, sk, 0)) < 0) | 865 | if ((xfrm_lookup(&dst, &fl, sk, 0)) < 0) |
| 862 | goto out; | 866 | goto out; |
| 863 | } | 867 | } |
| 864 | 868 | ||
| 865 | newsk = dccp_create_openreq_child(sk, req, skb); | 869 | newsk = dccp_create_openreq_child(sk, req, skb); |
| 866 | if (newsk == NULL) | 870 | if (newsk == NULL) |
| @@ -873,9 +877,8 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk, | |||
| 873 | */ | 877 | */ |
| 874 | 878 | ||
| 875 | ip6_dst_store(newsk, dst, NULL); | 879 | ip6_dst_store(newsk, dst, NULL); |
| 876 | newsk->sk_route_caps = dst->dev->features & | 880 | newsk->sk_route_caps = dst->dev->features & ~(NETIF_F_IP_CSUM | |
| 877 | ~(NETIF_F_IP_CSUM | NETIF_F_TSO); | 881 | NETIF_F_TSO); |
| 878 | |||
| 879 | newdp6 = (struct dccp6_sock *)newsk; | 882 | newdp6 = (struct dccp6_sock *)newsk; |
| 880 | newinet = inet_sk(newsk); | 883 | newinet = inet_sk(newsk); |
| 881 | newinet->pinet6 = &newdp6->inet6; | 884 | newinet->pinet6 = &newdp6->inet6; |
| @@ -889,7 +892,7 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk, | |||
| 889 | ipv6_addr_copy(&newnp->rcv_saddr, &ireq6->loc_addr); | 892 | ipv6_addr_copy(&newnp->rcv_saddr, &ireq6->loc_addr); |
| 890 | newsk->sk_bound_dev_if = ireq6->iif; | 893 | newsk->sk_bound_dev_if = ireq6->iif; |
| 891 | 894 | ||
| 892 | /* Now IPv6 options... | 895 | /* Now IPv6 options... |
| 893 | 896 | ||
| 894 | First: no IPv4 options. | 897 | First: no IPv4 options. |
| 895 | */ | 898 | */ |
| @@ -911,20 +914,20 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk, | |||
| 911 | newnp->mcast_oif = inet6_iif(skb); | 914 | newnp->mcast_oif = inet6_iif(skb); |
| 912 | newnp->mcast_hops = skb->nh.ipv6h->hop_limit; | 915 | newnp->mcast_hops = skb->nh.ipv6h->hop_limit; |
| 913 | 916 | ||
| 914 | /* Clone native IPv6 options from listening socket (if any) | 917 | /* |
| 915 | 918 | * Clone native IPv6 options from listening socket (if any) | |
| 916 | Yes, keeping reference count would be much more clever, | 919 | * |
| 917 | but we make one more one thing there: reattach optmem | 920 | * Yes, keeping reference count would be much more clever, but we make |
| 918 | to newsk. | 921 | * one more one thing there: reattach optmem to newsk. |
| 919 | */ | 922 | */ |
| 920 | if (opt) { | 923 | if (opt != NULL) { |
| 921 | newnp->opt = ipv6_dup_options(newsk, opt); | 924 | newnp->opt = ipv6_dup_options(newsk, opt); |
| 922 | if (opt != np->opt) | 925 | if (opt != np->opt) |
| 923 | sock_kfree_s(sk, opt, opt->tot_len); | 926 | sock_kfree_s(sk, opt, opt->tot_len); |
| 924 | } | 927 | } |
| 925 | 928 | ||
| 926 | inet_csk(newsk)->icsk_ext_hdr_len = 0; | 929 | inet_csk(newsk)->icsk_ext_hdr_len = 0; |
| 927 | if (newnp->opt) | 930 | if (newnp->opt != NULL) |
| 928 | inet_csk(newsk)->icsk_ext_hdr_len = (newnp->opt->opt_nflen + | 931 | inet_csk(newsk)->icsk_ext_hdr_len = (newnp->opt->opt_nflen + |
| 929 | newnp->opt->opt_flen); | 932 | newnp->opt->opt_flen); |
| 930 | 933 | ||
| @@ -941,7 +944,7 @@ out_overflow: | |||
| 941 | NET_INC_STATS_BH(LINUX_MIB_LISTENOVERFLOWS); | 944 | NET_INC_STATS_BH(LINUX_MIB_LISTENOVERFLOWS); |
| 942 | out: | 945 | out: |
| 943 | NET_INC_STATS_BH(LINUX_MIB_LISTENDROPS); | 946 | NET_INC_STATS_BH(LINUX_MIB_LISTENDROPS); |
| 944 | if (opt && opt != np->opt) | 947 | if (opt != NULL && opt != np->opt) |
| 945 | sock_kfree_s(sk, opt, opt->tot_len); | 948 | sock_kfree_s(sk, opt, opt->tot_len); |
| 946 | dst_release(dst); | 949 | dst_release(dst); |
| 947 | return NULL; | 950 | return NULL; |
| @@ -975,8 +978,8 @@ static int dccp_v6_do_rcv(struct sock *sk, struct sk_buff *skb) | |||
| 975 | goto discard; | 978 | goto discard; |
| 976 | 979 | ||
| 977 | /* | 980 | /* |
| 978 | * socket locking is here for SMP purposes as backlog rcv | 981 | * socket locking is here for SMP purposes as backlog rcv is currently |
| 979 | * is currently called with bh processing disabled. | 982 | * called with bh processing disabled. |
| 980 | */ | 983 | */ |
| 981 | 984 | ||
| 982 | /* Do Stevens' IPV6_PKTOPTIONS. | 985 | /* Do Stevens' IPV6_PKTOPTIONS. |
| @@ -1001,20 +1004,20 @@ static int dccp_v6_do_rcv(struct sock *sk, struct sk_buff *skb) | |||
| 1001 | return 0; | 1004 | return 0; |
| 1002 | } | 1005 | } |
| 1003 | 1006 | ||
| 1004 | if (sk->sk_state == DCCP_LISTEN) { | 1007 | if (sk->sk_state == DCCP_LISTEN) { |
| 1005 | struct sock *nsk = dccp_v6_hnd_req(sk, skb); | 1008 | struct sock *nsk = dccp_v6_hnd_req(sk, skb); |
| 1006 | if (!nsk) | ||
| 1007 | goto discard; | ||
| 1008 | 1009 | ||
| 1010 | if (nsk == NULL) | ||
| 1011 | goto discard; | ||
| 1009 | /* | 1012 | /* |
| 1010 | * Queue it on the new socket if the new socket is active, | 1013 | * Queue it on the new socket if the new socket is active, |
| 1011 | * otherwise we just shortcircuit this and continue with | 1014 | * otherwise we just shortcircuit this and continue with |
| 1012 | * the new socket.. | 1015 | * the new socket.. |
| 1013 | */ | 1016 | */ |
| 1014 | if(nsk != sk) { | 1017 | if (nsk != sk) { |
| 1015 | if (dccp_child_process(sk, nsk, skb)) | 1018 | if (dccp_child_process(sk, nsk, skb)) |
| 1016 | goto reset; | 1019 | goto reset; |
| 1017 | if (opt_skb) | 1020 | if (opt_skb != NULL) |
| 1018 | __kfree_skb(opt_skb); | 1021 | __kfree_skb(opt_skb); |
| 1019 | return 0; | 1022 | return 0; |
| 1020 | } | 1023 | } |
| @@ -1027,7 +1030,7 @@ static int dccp_v6_do_rcv(struct sock *sk, struct sk_buff *skb) | |||
| 1027 | reset: | 1030 | reset: |
| 1028 | dccp_v6_ctl_send_reset(skb); | 1031 | dccp_v6_ctl_send_reset(skb); |
| 1029 | discard: | 1032 | discard: |
| 1030 | if (opt_skb) | 1033 | if (opt_skb != NULL) |
| 1031 | __kfree_skb(opt_skb); | 1034 | __kfree_skb(opt_skb); |
| 1032 | kfree_skb(skb); | 1035 | kfree_skb(skb); |
| 1033 | return 0; | 1036 | return 0; |
| @@ -1060,7 +1063,7 @@ static int dccp_v6_rcv(struct sk_buff **pskb) | |||
| 1060 | dh->dccph_sport, | 1063 | dh->dccph_sport, |
| 1061 | &skb->nh.ipv6h->daddr, ntohs(dh->dccph_dport), | 1064 | &skb->nh.ipv6h->daddr, ntohs(dh->dccph_dport), |
| 1062 | inet6_iif(skb)); | 1065 | inet6_iif(skb)); |
| 1063 | /* | 1066 | /* |
| 1064 | * Step 2: | 1067 | * Step 2: |
| 1065 | * If no socket ... | 1068 | * If no socket ... |
| 1066 | * Generate Reset(No Connection) unless P.type == Reset | 1069 | * Generate Reset(No Connection) unless P.type == Reset |
| @@ -1069,15 +1072,14 @@ static int dccp_v6_rcv(struct sk_buff **pskb) | |||
| 1069 | if (sk == NULL) | 1072 | if (sk == NULL) |
| 1070 | goto no_dccp_socket; | 1073 | goto no_dccp_socket; |
| 1071 | 1074 | ||
| 1072 | /* | 1075 | /* |
| 1073 | * Step 2: | 1076 | * Step 2: |
| 1074 | * ... or S.state == TIMEWAIT, | 1077 | * ... or S.state == TIMEWAIT, |
| 1075 | * Generate Reset(No Connection) unless P.type == Reset | 1078 | * Generate Reset(No Connection) unless P.type == Reset |
| 1076 | * Drop packet and return | 1079 | * Drop packet and return |
| 1077 | */ | 1080 | */ |
| 1078 | |||
| 1079 | if (sk->sk_state == DCCP_TIME_WAIT) | 1081 | if (sk->sk_state == DCCP_TIME_WAIT) |
| 1080 | goto do_time_wait; | 1082 | goto do_time_wait; |
| 1081 | 1083 | ||
| 1082 | if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) | 1084 | if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) |
| 1083 | goto discard_and_relse; | 1085 | goto discard_and_relse; |
| @@ -1116,32 +1118,32 @@ do_time_wait: | |||
| 1116 | } | 1118 | } |
| 1117 | 1119 | ||
| 1118 | static struct inet_connection_sock_af_ops dccp_ipv6_af_ops = { | 1120 | static struct inet_connection_sock_af_ops dccp_ipv6_af_ops = { |
| 1119 | .queue_xmit = inet6_csk_xmit, | 1121 | .queue_xmit = inet6_csk_xmit, |
| 1120 | .send_check = dccp_v6_send_check, | 1122 | .send_check = dccp_v6_send_check, |
| 1121 | .rebuild_header = inet6_sk_rebuild_header, | 1123 | .rebuild_header = inet6_sk_rebuild_header, |
| 1122 | .conn_request = dccp_v6_conn_request, | 1124 | .conn_request = dccp_v6_conn_request, |
| 1123 | .syn_recv_sock = dccp_v6_request_recv_sock, | 1125 | .syn_recv_sock = dccp_v6_request_recv_sock, |
| 1124 | .net_header_len = sizeof(struct ipv6hdr), | 1126 | .net_header_len = sizeof(struct ipv6hdr), |
| 1125 | .setsockopt = ipv6_setsockopt, | 1127 | .setsockopt = ipv6_setsockopt, |
| 1126 | .getsockopt = ipv6_getsockopt, | 1128 | .getsockopt = ipv6_getsockopt, |
| 1127 | .addr2sockaddr = inet6_csk_addr2sockaddr, | 1129 | .addr2sockaddr = inet6_csk_addr2sockaddr, |
| 1128 | .sockaddr_len = sizeof(struct sockaddr_in6) | 1130 | .sockaddr_len = sizeof(struct sockaddr_in6) |
| 1129 | }; | 1131 | }; |
| 1130 | 1132 | ||
| 1131 | /* | 1133 | /* |
| 1132 | * DCCP over IPv4 via INET6 API | 1134 | * DCCP over IPv4 via INET6 API |
| 1133 | */ | 1135 | */ |
| 1134 | static struct inet_connection_sock_af_ops dccp_ipv6_mapped = { | 1136 | static struct inet_connection_sock_af_ops dccp_ipv6_mapped = { |
| 1135 | .queue_xmit = ip_queue_xmit, | 1137 | .queue_xmit = ip_queue_xmit, |
| 1136 | .send_check = dccp_v4_send_check, | 1138 | .send_check = dccp_v4_send_check, |
| 1137 | .rebuild_header = inet_sk_rebuild_header, | 1139 | .rebuild_header = inet_sk_rebuild_header, |
| 1138 | .conn_request = dccp_v6_conn_request, | 1140 | .conn_request = dccp_v6_conn_request, |
| 1139 | .syn_recv_sock = dccp_v6_request_recv_sock, | 1141 | .syn_recv_sock = dccp_v6_request_recv_sock, |
| 1140 | .net_header_len = sizeof(struct iphdr), | 1142 | .net_header_len = sizeof(struct iphdr), |
| 1141 | .setsockopt = ipv6_setsockopt, | 1143 | .setsockopt = ipv6_setsockopt, |
| 1142 | .getsockopt = ipv6_getsockopt, | 1144 | .getsockopt = ipv6_getsockopt, |
| 1143 | .addr2sockaddr = inet6_csk_addr2sockaddr, | 1145 | .addr2sockaddr = inet6_csk_addr2sockaddr, |
| 1144 | .sockaddr_len = sizeof(struct sockaddr_in6) | 1146 | .sockaddr_len = sizeof(struct sockaddr_in6) |
| 1145 | }; | 1147 | }; |
| 1146 | 1148 | ||
| 1147 | /* NOTE: A lot of things set to zero explicitly by call to | 1149 | /* NOTE: A lot of things set to zero explicitly by call to |
| @@ -1168,35 +1170,35 @@ static int dccp_v6_destroy_sock(struct sock *sk) | |||
| 1168 | } | 1170 | } |
| 1169 | 1171 | ||
| 1170 | static struct proto dccp_v6_prot = { | 1172 | static struct proto dccp_v6_prot = { |
| 1171 | .name = "DCCPv6", | 1173 | .name = "DCCPv6", |
| 1172 | .owner = THIS_MODULE, | 1174 | .owner = THIS_MODULE, |
| 1173 | .close = dccp_close, | 1175 | .close = dccp_close, |
| 1174 | .connect = dccp_v6_connect, | 1176 | .connect = dccp_v6_connect, |
| 1175 | .disconnect = dccp_disconnect, | 1177 | .disconnect = dccp_disconnect, |
| 1176 | .ioctl = dccp_ioctl, | 1178 | .ioctl = dccp_ioctl, |
| 1177 | .init = dccp_v6_init_sock, | 1179 | .init = dccp_v6_init_sock, |
| 1178 | .setsockopt = dccp_setsockopt, | 1180 | .setsockopt = dccp_setsockopt, |
| 1179 | .getsockopt = dccp_getsockopt, | 1181 | .getsockopt = dccp_getsockopt, |
| 1180 | .sendmsg = dccp_sendmsg, | 1182 | .sendmsg = dccp_sendmsg, |
| 1181 | .recvmsg = dccp_recvmsg, | 1183 | .recvmsg = dccp_recvmsg, |
| 1182 | .backlog_rcv = dccp_v6_do_rcv, | 1184 | .backlog_rcv = dccp_v6_do_rcv, |
| 1183 | .hash = dccp_v6_hash, | 1185 | .hash = dccp_v6_hash, |
| 1184 | .unhash = dccp_unhash, | 1186 | .unhash = dccp_unhash, |
| 1185 | .accept = inet_csk_accept, | 1187 | .accept = inet_csk_accept, |
| 1186 | .get_port = dccp_v6_get_port, | 1188 | .get_port = dccp_v6_get_port, |
| 1187 | .shutdown = dccp_shutdown, | 1189 | .shutdown = dccp_shutdown, |
| 1188 | .destroy = dccp_v6_destroy_sock, | 1190 | .destroy = dccp_v6_destroy_sock, |
| 1189 | .orphan_count = &dccp_orphan_count, | 1191 | .orphan_count = &dccp_orphan_count, |
| 1190 | .max_header = MAX_DCCP_HEADER, | 1192 | .max_header = MAX_DCCP_HEADER, |
| 1191 | .obj_size = sizeof(struct dccp6_sock), | 1193 | .obj_size = sizeof(struct dccp6_sock), |
| 1192 | .rsk_prot = &dccp6_request_sock_ops, | 1194 | .rsk_prot = &dccp6_request_sock_ops, |
| 1193 | .twsk_prot = &dccp6_timewait_sock_ops, | 1195 | .twsk_prot = &dccp6_timewait_sock_ops, |
| 1194 | }; | 1196 | }; |
| 1195 | 1197 | ||
| 1196 | static struct inet6_protocol dccp_v6_protocol = { | 1198 | static struct inet6_protocol dccp_v6_protocol = { |
| 1197 | .handler = dccp_v6_rcv, | 1199 | .handler = dccp_v6_rcv, |
| 1198 | .err_handler = dccp_v6_err, | 1200 | .err_handler = dccp_v6_err, |
| 1199 | .flags = INET6_PROTO_NOPOLICY | INET6_PROTO_FINAL, | 1201 | .flags = INET6_PROTO_NOPOLICY | INET6_PROTO_FINAL, |
| 1200 | }; | 1202 | }; |
| 1201 | 1203 | ||
| 1202 | static struct proto_ops inet6_dccp_ops = { | 1204 | static struct proto_ops inet6_dccp_ops = { |
