diff options
| author | David S. Miller <davem@outer-richmond.davemloft.net> | 2005-09-10 03:01:36 -0400 | 
|---|---|---|
| committer | David S. Miller <davem@outer-richmond.davemloft.net> | 2005-09-10 03:01:36 -0400 | 
| commit | 41c29dd15b5c36bacdb06ee11facb9199d0b2de0 (patch) | |
| tree | 0b929a5d7b60f0477886e9b08c670fa91a821ff8 | |
| parent | 87fc767b832ef5a681a0ff9d203c3289bc3be2bf (diff) | |
| parent | 59d203f9e989c81defc2cb1c559d678e16dbe684 (diff) | |
Merge master.kernel.org:/pub/scm/linux/kernel/git/acme/net-2.6 
| -rw-r--r-- | net/dccp/ccids/ccid3.c | 166 | ||||
| -rw-r--r-- | net/dccp/ccids/ccid3.h | 2 | ||||
| -rw-r--r-- | net/dccp/ipv4.c | 4 | ||||
| -rw-r--r-- | net/dccp/output.c | 3 | 
4 files changed, 70 insertions, 105 deletions
| diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c index ea30012dd195..e05f4f955eee 100644 --- a/net/dccp/ccids/ccid3.c +++ b/net/dccp/ccids/ccid3.c | |||
| @@ -78,13 +78,11 @@ static struct dccp_li_hist *ccid3_li_hist; | |||
| 78 | 78 | ||
| 79 | static int ccid3_init(struct sock *sk) | 79 | static int ccid3_init(struct sock *sk) | 
| 80 | { | 80 | { | 
| 81 | ccid3_pr_debug("%s, sk=%p\n", dccp_role(sk), sk); | ||
| 82 | return 0; | 81 | return 0; | 
| 83 | } | 82 | } | 
| 84 | 83 | ||
| 85 | static void ccid3_exit(struct sock *sk) | 84 | static void ccid3_exit(struct sock *sk) | 
| 86 | { | 85 | { | 
| 87 | ccid3_pr_debug("%s, sk=%p\n", dccp_role(sk), sk); | ||
| 88 | } | 86 | } | 
| 89 | 87 | ||
| 90 | /* TFRC sender states */ | 88 | /* TFRC sender states */ | 
| @@ -287,14 +285,14 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, | |||
| 287 | long delay; | 285 | long delay; | 
| 288 | int rc = -ENOTCONN; | 286 | int rc = -ENOTCONN; | 
| 289 | 287 | ||
| 290 | /* Check if pure ACK or Terminating*/ | 288 | BUG_ON(hctx == NULL || hctx->ccid3hctx_state == TFRC_SSTATE_TERM); | 
| 291 | 289 | ||
| 290 | /* Check if pure ACK or Terminating*/ | ||
| 292 | /* | 291 | /* | 
| 293 | * XXX: We only call this function for DATA and DATAACK, on, these | 292 | * XXX: We only call this function for DATA and DATAACK, on, these | 
| 294 | * packets can have zero length, but why the comment about "pure ACK"? | 293 | * packets can have zero length, but why the comment about "pure ACK"? | 
| 295 | */ | 294 | */ | 
| 296 | if (hctx == NULL || len == 0 || | 295 | if (unlikely(len == 0)) | 
| 297 | hctx->ccid3hctx_state == TFRC_SSTATE_TERM) | ||
| 298 | goto out; | 296 | goto out; | 
| 299 | 297 | ||
| 300 | /* See if last packet allocated was not sent */ | 298 | /* See if last packet allocated was not sent */ | 
| @@ -304,10 +302,10 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, | |||
| 304 | SLAB_ATOMIC); | 302 | SLAB_ATOMIC); | 
| 305 | 303 | ||
| 306 | rc = -ENOBUFS; | 304 | rc = -ENOBUFS; | 
| 307 | if (new_packet == NULL) { | 305 | if (unlikely(new_packet == NULL)) { | 
| 308 | ccid3_pr_debug("%s, sk=%p, not enough mem to add " | 306 | LIMIT_NETDEBUG(KERN_WARNING "%s: %s, sk=%p, not enough " | 
| 309 | "to history, send refused\n", | 307 | "mem to add to history, send refused\n", | 
| 310 | dccp_role(sk), sk); | 308 | __FUNCTION__, dccp_role(sk), sk); | 
| 311 | goto out; | 309 | goto out; | 
| 312 | } | 310 | } | 
| 313 | 311 | ||
| @@ -318,9 +316,6 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, | |||
| 318 | 316 | ||
| 319 | switch (hctx->ccid3hctx_state) { | 317 | switch (hctx->ccid3hctx_state) { | 
| 320 | case TFRC_SSTATE_NO_SENT: | 318 | case TFRC_SSTATE_NO_SENT: | 
| 321 | ccid3_pr_debug("%s, sk=%p, first packet(%llu)\n", | ||
| 322 | dccp_role(sk), sk, dp->dccps_gss); | ||
| 323 | |||
| 324 | hctx->ccid3hctx_no_feedback_timer.function = ccid3_hc_tx_no_feedback_timer; | 319 | hctx->ccid3hctx_no_feedback_timer.function = ccid3_hc_tx_no_feedback_timer; | 
| 325 | hctx->ccid3hctx_no_feedback_timer.data = (unsigned long)sk; | 320 | hctx->ccid3hctx_no_feedback_timer.data = (unsigned long)sk; | 
| 326 | sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer, | 321 | sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer, | 
| @@ -328,7 +323,7 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, | |||
| 328 | hctx->ccid3hctx_last_win_count = 0; | 323 | hctx->ccid3hctx_last_win_count = 0; | 
| 329 | hctx->ccid3hctx_t_last_win_count = now; | 324 | hctx->ccid3hctx_t_last_win_count = now; | 
| 330 | ccid3_hc_tx_set_state(sk, TFRC_SSTATE_NO_FBACK); | 325 | ccid3_hc_tx_set_state(sk, TFRC_SSTATE_NO_FBACK); | 
| 331 | hctx->ccid3hctx_t_ipi = TFRC_INITIAL_TIMEOUT; | 326 | hctx->ccid3hctx_t_ipi = TFRC_INITIAL_IPI; | 
| 332 | 327 | ||
| 333 | /* Set nominal send time for initial packet */ | 328 | /* Set nominal send time for initial packet */ | 
| 334 | hctx->ccid3hctx_t_nom = now; | 329 | hctx->ccid3hctx_t_nom = now; | 
| @@ -341,7 +336,6 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, | |||
| 341 | case TFRC_SSTATE_FBACK: | 336 | case TFRC_SSTATE_FBACK: | 
| 342 | delay = (timeval_delta(&now, &hctx->ccid3hctx_t_nom) - | 337 | delay = (timeval_delta(&now, &hctx->ccid3hctx_t_nom) - | 
| 343 | hctx->ccid3hctx_delta); | 338 | hctx->ccid3hctx_delta); | 
| 344 | ccid3_pr_debug("send_packet delay=%ld\n", delay); | ||
| 345 | delay /= -1000; | 339 | delay /= -1000; | 
| 346 | /* divide by -1000 is to convert to ms and get sign right */ | 340 | /* divide by -1000 is to convert to ms and get sign right */ | 
| 347 | rc = delay > 0 ? delay : 0; | 341 | rc = delay > 0 ? delay : 0; | 
| @@ -371,13 +365,7 @@ static void ccid3_hc_tx_packet_sent(struct sock *sk, int more, int len) | |||
| 371 | struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); | 365 | struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); | 
| 372 | struct timeval now; | 366 | struct timeval now; | 
| 373 | 367 | ||
| 374 | BUG_ON(hctx == NULL); | 368 | BUG_ON(hctx == NULL || hctx->ccid3hctx_state == TFRC_SSTATE_TERM); | 
| 375 | |||
| 376 | if (hctx->ccid3hctx_state == TFRC_SSTATE_TERM) { | ||
| 377 | ccid3_pr_debug("%s, sk=%p, while state is TFRC_SSTATE_TERM!\n", | ||
| 378 | dccp_role(sk), sk); | ||
| 379 | return; | ||
| 380 | } | ||
| 381 | 369 | ||
| 382 | dccp_timestamp(sk, &now); | 370 | dccp_timestamp(sk, &now); | 
| 383 | 371 | ||
| @@ -387,14 +375,14 @@ static void ccid3_hc_tx_packet_sent(struct sock *sk, int more, int len) | |||
| 387 | struct dccp_tx_hist_entry *packet; | 375 | struct dccp_tx_hist_entry *packet; | 
| 388 | 376 | ||
| 389 | packet = dccp_tx_hist_head(&hctx->ccid3hctx_hist); | 377 | packet = dccp_tx_hist_head(&hctx->ccid3hctx_hist); | 
| 390 | if (packet == NULL) { | 378 | if (unlikely(packet == NULL)) { | 
| 391 | printk(KERN_CRIT "%s: packet doesn't exists in " | 379 | LIMIT_NETDEBUG(KERN_WARNING "%s: packet doesn't " | 
| 392 | "history!\n", __FUNCTION__); | 380 | "exists in history!\n", __FUNCTION__); | 
| 393 | return; | 381 | return; | 
| 394 | } | 382 | } | 
| 395 | if (packet->dccphtx_sent) { | 383 | if (unlikely(packet->dccphtx_sent)) { | 
| 396 | printk(KERN_CRIT "%s: no unsent packet in history!\n", | 384 | LIMIT_NETDEBUG(KERN_WARNING "%s: no unsent packet in " | 
| 397 | __FUNCTION__); | 385 | "history!\n", __FUNCTION__); | 
| 398 | return; | 386 | return; | 
| 399 | } | 387 | } | 
| 400 | packet->dccphtx_tstamp = now; | 388 | packet->dccphtx_tstamp = now; | 
| @@ -465,14 +453,7 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb) | |||
| 465 | u32 x_recv; | 453 | u32 x_recv; | 
| 466 | u32 r_sample; | 454 | u32 r_sample; | 
| 467 | 455 | ||
| 468 | if (hctx == NULL) | 456 | BUG_ON(hctx == NULL || hctx->ccid3hctx_state == TFRC_SSTATE_TERM); | 
| 469 | return; | ||
| 470 | |||
| 471 | if (hctx->ccid3hctx_state == TFRC_SSTATE_TERM) { | ||
| 472 | ccid3_pr_debug("%s, sk=%p, received a packet when " | ||
| 473 | "terminating!\n", dccp_role(sk), sk); | ||
| 474 | return; | ||
| 475 | } | ||
| 476 | 457 | ||
| 477 | /* we are only interested in ACKs */ | 458 | /* we are only interested in ACKs */ | 
| 478 | if (!(DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_ACK || | 459 | if (!(DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_ACK || | 
| @@ -496,12 +477,12 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb) | |||
| 496 | /* get t_recvdata from history */ | 477 | /* get t_recvdata from history */ | 
| 497 | packet = dccp_tx_hist_find_entry(&hctx->ccid3hctx_hist, | 478 | packet = dccp_tx_hist_find_entry(&hctx->ccid3hctx_hist, | 
| 498 | DCCP_SKB_CB(skb)->dccpd_ack_seq); | 479 | DCCP_SKB_CB(skb)->dccpd_ack_seq); | 
| 499 | if (packet == NULL) { | 480 | if (unlikely(packet == NULL)) { | 
| 500 | ccid3_pr_debug("%s, sk=%p, seqno %llu(%s) does't " | 481 | LIMIT_NETDEBUG(KERN_WARNING "%s: %s, sk=%p, seqno " | 
| 501 | "exist in history!\n", | 482 | "%llu(%s) does't exist in history!\n", | 
| 502 | dccp_role(sk), sk, | 483 | __FUNCTION__, dccp_role(sk), sk, | 
| 503 | DCCP_SKB_CB(skb)->dccpd_ack_seq, | 484 | (unsigned long long)DCCP_SKB_CB(skb)->dccpd_ack_seq, | 
| 504 | dccp_packet_name(DCCP_SKB_CB(skb)->dccpd_type)); | 485 | dccp_packet_name(DCCP_SKB_CB(skb)->dccpd_type)); | 
| 505 | return; | 486 | return; | 
| 506 | } | 487 | } | 
| 507 | 488 | ||
| @@ -509,8 +490,8 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb) | |||
| 509 | dccp_timestamp(sk, &now); | 490 | dccp_timestamp(sk, &now); | 
| 510 | r_sample = timeval_delta(&now, &packet->dccphtx_tstamp); | 491 | r_sample = timeval_delta(&now, &packet->dccphtx_tstamp); | 
| 511 | if (unlikely(r_sample <= t_elapsed)) | 492 | if (unlikely(r_sample <= t_elapsed)) | 
| 512 | LIMIT_NETDEBUG(KERN_WARNING | 493 | LIMIT_NETDEBUG(KERN_WARNING "%s: r_sample=%uus, " | 
| 513 | "%s: r_sample=%uus, t_elapsed=%uus\n", | 494 | "t_elapsed=%uus\n", | 
| 514 | __FUNCTION__, r_sample, t_elapsed); | 495 | __FUNCTION__, r_sample, t_elapsed); | 
| 515 | else | 496 | else | 
| 516 | r_sample -= t_elapsed; | 497 | r_sample -= t_elapsed; | 
| @@ -606,10 +587,11 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb) | |||
| 606 | 587 | ||
| 607 | static void ccid3_hc_tx_insert_options(struct sock *sk, struct sk_buff *skb) | 588 | static void ccid3_hc_tx_insert_options(struct sock *sk, struct sk_buff *skb) | 
| 608 | { | 589 | { | 
| 609 | struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); | 590 | const struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); | 
| 610 | 591 | ||
| 611 | if (hctx == NULL || !(sk->sk_state == DCCP_OPEN || | 592 | BUG_ON(hctx == NULL); | 
| 612 | sk->sk_state == DCCP_PARTOPEN)) | 593 | |
| 594 | if (!(sk->sk_state == DCCP_OPEN || sk->sk_state == DCCP_PARTOPEN)) | ||
| 613 | return; | 595 | return; | 
| 614 | 596 | ||
| 615 | DCCP_SKB_CB(skb)->dccpd_ccval = hctx->ccid3hctx_last_win_count; | 597 | DCCP_SKB_CB(skb)->dccpd_ccval = hctx->ccid3hctx_last_win_count; | 
| @@ -624,8 +606,7 @@ static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option, | |||
| 624 | struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); | 606 | struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); | 
| 625 | struct ccid3_options_received *opt_recv; | 607 | struct ccid3_options_received *opt_recv; | 
| 626 | 608 | ||
| 627 | if (hctx == NULL) | 609 | BUG_ON(hctx == NULL); | 
| 628 | return 0; | ||
| 629 | 610 | ||
| 630 | opt_recv = &hctx->ccid3hctx_options_received; | 611 | opt_recv = &hctx->ccid3hctx_options_received; | 
| 631 | 612 | ||
| @@ -639,10 +620,10 @@ static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option, | |||
| 639 | 620 | ||
| 640 | switch (option) { | 621 | switch (option) { | 
| 641 | case TFRC_OPT_LOSS_EVENT_RATE: | 622 | case TFRC_OPT_LOSS_EVENT_RATE: | 
| 642 | if (len != 4) { | 623 | if (unlikely(len != 4)) { | 
| 643 | ccid3_pr_debug("%s, sk=%p, invalid len for " | 624 | LIMIT_NETDEBUG(KERN_WARNING "%s: %s, sk=%p, invalid " | 
| 644 | "TFRC_OPT_LOSS_EVENT_RATE\n", | 625 | "len for TFRC_OPT_LOSS_EVENT_RATE\n", | 
| 645 | dccp_role(sk), sk); | 626 | __FUNCTION__, dccp_role(sk), sk); | 
| 646 | rc = -EINVAL; | 627 | rc = -EINVAL; | 
| 647 | } else { | 628 | } else { | 
| 648 | opt_recv->ccid3or_loss_event_rate = ntohl(*(u32 *)value); | 629 | opt_recv->ccid3or_loss_event_rate = ntohl(*(u32 *)value); | 
| @@ -660,10 +641,10 @@ static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option, | |||
| 660 | opt_recv->ccid3or_loss_intervals_len); | 641 | opt_recv->ccid3or_loss_intervals_len); | 
| 661 | break; | 642 | break; | 
| 662 | case TFRC_OPT_RECEIVE_RATE: | 643 | case TFRC_OPT_RECEIVE_RATE: | 
| 663 | if (len != 4) { | 644 | if (unlikely(len != 4)) { | 
| 664 | ccid3_pr_debug("%s, sk=%p, invalid len for " | 645 | LIMIT_NETDEBUG(KERN_WARNING "%s: %s, sk=%p, invalid " | 
| 665 | "TFRC_OPT_RECEIVE_RATE\n", | 646 | "len for TFRC_OPT_RECEIVE_RATE\n", | 
| 666 | dccp_role(sk), sk); | 647 | __FUNCTION__, dccp_role(sk), sk); | 
| 667 | rc = -EINVAL; | 648 | rc = -EINVAL; | 
| 668 | } else { | 649 | } else { | 
| 669 | opt_recv->ccid3or_receive_rate = ntohl(*(u32 *)value); | 650 | opt_recv->ccid3or_receive_rate = ntohl(*(u32 *)value); | 
| @@ -682,8 +663,6 @@ static int ccid3_hc_tx_init(struct sock *sk) | |||
| 682 | struct dccp_sock *dp = dccp_sk(sk); | 663 | struct dccp_sock *dp = dccp_sk(sk); | 
| 683 | struct ccid3_hc_tx_sock *hctx; | 664 | struct ccid3_hc_tx_sock *hctx; | 
| 684 | 665 | ||
| 685 | ccid3_pr_debug("%s, sk=%p\n", dccp_role(sk), sk); | ||
| 686 | |||
| 687 | dp->dccps_hc_tx_ccid_private = kmalloc(sizeof(*hctx), gfp_any()); | 666 | dp->dccps_hc_tx_ccid_private = kmalloc(sizeof(*hctx), gfp_any()); | 
| 688 | if (dp->dccps_hc_tx_ccid_private == NULL) | 667 | if (dp->dccps_hc_tx_ccid_private == NULL) | 
| 689 | return -ENOMEM; | 668 | return -ENOMEM; | 
| @@ -712,7 +691,6 @@ static void ccid3_hc_tx_exit(struct sock *sk) | |||
| 712 | struct dccp_sock *dp = dccp_sk(sk); | 691 | struct dccp_sock *dp = dccp_sk(sk); | 
| 713 | struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); | 692 | struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); | 
| 714 | 693 | ||
| 715 | ccid3_pr_debug("%s, sk=%p\n", dccp_role(sk), sk); | ||
| 716 | BUG_ON(hctx == NULL); | 694 | BUG_ON(hctx == NULL); | 
| 717 | 695 | ||
| 718 | ccid3_hc_tx_set_state(sk, TFRC_SSTATE_TERM); | 696 | ccid3_hc_tx_set_state(sk, TFRC_SSTATE_TERM); | 
| @@ -792,10 +770,10 @@ static void ccid3_hc_rx_send_feedback(struct sock *sk) | |||
| 792 | } | 770 | } | 
| 793 | 771 | ||
| 794 | packet = dccp_rx_hist_find_data_packet(&hcrx->ccid3hcrx_hist); | 772 | packet = dccp_rx_hist_find_data_packet(&hcrx->ccid3hcrx_hist); | 
| 795 | if (packet == NULL) { | 773 | if (unlikely(packet == NULL)) { | 
| 796 | printk(KERN_CRIT "%s: %s, sk=%p, no data packet in history!\n", | 774 | LIMIT_NETDEBUG(KERN_WARNING "%s: %s, sk=%p, no data packet " | 
| 797 | __FUNCTION__, dccp_role(sk), sk); | 775 | "in history!\n", | 
| 798 | dump_stack(); | 776 | __FUNCTION__, dccp_role(sk), sk); | 
| 799 | return; | 777 | return; | 
| 800 | } | 778 | } | 
| 801 | 779 | ||
| @@ -817,11 +795,12 @@ static void ccid3_hc_rx_send_feedback(struct sock *sk) | |||
| 817 | 795 | ||
| 818 | static void ccid3_hc_rx_insert_options(struct sock *sk, struct sk_buff *skb) | 796 | static void ccid3_hc_rx_insert_options(struct sock *sk, struct sk_buff *skb) | 
| 819 | { | 797 | { | 
| 820 | struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk); | 798 | const struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk); | 
| 821 | u32 x_recv, pinv; | 799 | u32 x_recv, pinv; | 
| 822 | 800 | ||
| 823 | if (hcrx == NULL || !(sk->sk_state == DCCP_OPEN || | 801 | BUG_ON(hcrx == NULL); | 
| 824 | sk->sk_state == DCCP_PARTOPEN)) | 802 | |
| 803 | if (!(sk->sk_state == DCCP_OPEN || sk->sk_state == DCCP_PARTOPEN)) | ||
| 825 | return; | 804 | return; | 
| 826 | 805 | ||
| 827 | DCCP_SKB_CB(skb)->dccpd_ccval = hcrx->ccid3hcrx_last_counter; | 806 | DCCP_SKB_CB(skb)->dccpd_ccval = hcrx->ccid3hcrx_last_counter; | 
| @@ -878,17 +857,17 @@ static u32 ccid3_hc_rx_calc_first_li(struct sock *sk) | |||
| 878 | } | 857 | } | 
| 879 | } | 858 | } | 
| 880 | 859 | ||
| 881 | if (step == 0) { | 860 | if (unlikely(step == 0)) { | 
| 882 | printk(KERN_CRIT "%s: %s, sk=%p, packet history contains no " | 861 | LIMIT_NETDEBUG(KERN_WARNING "%s: %s, sk=%p, packet history " | 
| 883 | "data packets!\n", | 862 | "contains no data packets!\n", | 
| 884 | __FUNCTION__, dccp_role(sk), sk); | 863 | __FUNCTION__, dccp_role(sk), sk); | 
| 885 | return ~0; | 864 | return ~0; | 
| 886 | } | 865 | } | 
| 887 | 866 | ||
| 888 | if (interval == 0) { | 867 | if (unlikely(interval == 0)) { | 
| 889 | ccid3_pr_debug("%s, sk=%p, Could not find a win_count " | 868 | LIMIT_NETDEBUG(KERN_WARNING "%s: %s, sk=%p, Could not find a " | 
| 890 | "interval > 0. Defaulting to 1\n", | 869 | "win_count interval > 0. Defaulting to 1\n", | 
| 891 | dccp_role(sk), sk); | 870 | __FUNCTION__, dccp_role(sk), sk); | 
| 892 | interval = 1; | 871 | interval = 1; | 
| 893 | } | 872 | } | 
| 894 | found: | 873 | found: | 
| @@ -931,8 +910,9 @@ static void ccid3_hc_rx_update_li(struct sock *sk, u64 seq_loss, u8 win_loss) | |||
| 931 | if (li_tail == NULL) | 910 | if (li_tail == NULL) | 
| 932 | return; | 911 | return; | 
| 933 | li_tail->dccplih_interval = ccid3_hc_rx_calc_first_li(sk); | 912 | li_tail->dccplih_interval = ccid3_hc_rx_calc_first_li(sk); | 
| 934 | } | 913 | } else | 
| 935 | /* FIXME: find end of interval */ | 914 | LIMIT_NETDEBUG(KERN_WARNING "%s: FIXME: find end of " | 
| 915 | "interval\n", __FUNCTION__); | ||
| 936 | } | 916 | } | 
| 937 | 917 | ||
| 938 | static void ccid3_hc_rx_detect_loss(struct sock *sk) | 918 | static void ccid3_hc_rx_detect_loss(struct sock *sk) | 
| @@ -956,10 +936,8 @@ static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb) | |||
| 956 | u32 p_prev, r_sample, t_elapsed; | 936 | u32 p_prev, r_sample, t_elapsed; | 
| 957 | int ins; | 937 | int ins; | 
| 958 | 938 | ||
| 959 | if (hcrx == NULL) | 939 | BUG_ON(hcrx == NULL || | 
| 960 | return; | 940 | !(hcrx->ccid3hcrx_state == TFRC_RSTATE_NO_DATA || | 
| 961 | |||
| 962 | BUG_ON(!(hcrx->ccid3hcrx_state == TFRC_RSTATE_NO_DATA || | ||
| 963 | hcrx->ccid3hcrx_state == TFRC_RSTATE_DATA)); | 941 | hcrx->ccid3hcrx_state == TFRC_RSTATE_DATA)); | 
| 964 | 942 | ||
| 965 | opt_recv = &dccp_sk(sk)->dccps_options_received; | 943 | opt_recv = &dccp_sk(sk)->dccps_options_received; | 
| @@ -978,8 +956,8 @@ static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb) | |||
| 978 | t_elapsed = opt_recv->dccpor_elapsed_time * 10; | 956 | t_elapsed = opt_recv->dccpor_elapsed_time * 10; | 
| 979 | 957 | ||
| 980 | if (unlikely(r_sample <= t_elapsed)) | 958 | if (unlikely(r_sample <= t_elapsed)) | 
| 981 | LIMIT_NETDEBUG(KERN_WARNING | 959 | LIMIT_NETDEBUG(KERN_WARNING "%s: r_sample=%uus, " | 
| 982 | "%s: r_sample=%uus, t_elapsed=%uus\n", | 960 | "t_elapsed=%uus\n", | 
| 983 | __FUNCTION__, r_sample, t_elapsed); | 961 | __FUNCTION__, r_sample, t_elapsed); | 
| 984 | else | 962 | else | 
| 985 | r_sample -= t_elapsed; | 963 | r_sample -= t_elapsed; | 
| @@ -997,19 +975,16 @@ static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb) | |||
| 997 | break; | 975 | break; | 
| 998 | case DCCP_PKT_DATA: | 976 | case DCCP_PKT_DATA: | 
| 999 | break; | 977 | break; | 
| 1000 | default: | 978 | default: /* We're not interested in other packet types, move along */ | 
| 1001 | ccid3_pr_debug("%s, sk=%p, not DATA/DATAACK/ACK packet(%s)\n", | ||
| 1002 | dccp_role(sk), sk, | ||
| 1003 | dccp_packet_name(DCCP_SKB_CB(skb)->dccpd_type)); | ||
| 1004 | return; | 979 | return; | 
| 1005 | } | 980 | } | 
| 1006 | 981 | ||
| 1007 | packet = dccp_rx_hist_entry_new(ccid3_rx_hist, sk, opt_recv->dccpor_ndp, | 982 | packet = dccp_rx_hist_entry_new(ccid3_rx_hist, sk, opt_recv->dccpor_ndp, | 
| 1008 | skb, SLAB_ATOMIC); | 983 | skb, SLAB_ATOMIC); | 
| 1009 | if (packet == NULL) { | 984 | if (unlikely(packet == NULL)) { | 
| 1010 | ccid3_pr_debug("%s, sk=%p, Not enough mem to add rx packet " | 985 | LIMIT_NETDEBUG(KERN_WARNING "%s: %s, sk=%p, Not enough mem to " | 
| 1011 | "to history (consider it lost)!", | 986 | "add rx packet to history, consider it lost!\n", | 
| 1012 | dccp_role(sk), sk); | 987 | __FUNCTION__, dccp_role(sk), sk); | 
| 1013 | return; | 988 | return; | 
| 1014 | } | 989 | } | 
| 1015 | 990 | ||
| @@ -1102,10 +1077,7 @@ static void ccid3_hc_rx_exit(struct sock *sk) | |||
| 1102 | struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk); | 1077 | struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk); | 
| 1103 | struct dccp_sock *dp = dccp_sk(sk); | 1078 | struct dccp_sock *dp = dccp_sk(sk); | 
| 1104 | 1079 | ||
| 1105 | ccid3_pr_debug("%s, sk=%p\n", dccp_role(sk), sk); | 1080 | BUG_ON(hcrx == NULL); | 
| 1106 | |||
| 1107 | if (hcrx == NULL) | ||
| 1108 | return; | ||
| 1109 | 1081 | ||
| 1110 | ccid3_hc_rx_set_state(sk, TFRC_RSTATE_TERM); | 1082 | ccid3_hc_rx_set_state(sk, TFRC_RSTATE_TERM); | 
| 1111 | 1083 | ||
| @@ -1123,8 +1095,7 @@ static void ccid3_hc_rx_get_info(struct sock *sk, struct tcp_info *info) | |||
| 1123 | { | 1095 | { | 
| 1124 | const struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk); | 1096 | const struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk); | 
| 1125 | 1097 | ||
| 1126 | if (hcrx == NULL) | 1098 | BUG_ON(hcrx == NULL); | 
| 1127 | return; | ||
| 1128 | 1099 | ||
| 1129 | info->tcpi_ca_state = hcrx->ccid3hcrx_state; | 1100 | info->tcpi_ca_state = hcrx->ccid3hcrx_state; | 
| 1130 | info->tcpi_options |= TCPI_OPT_TIMESTAMPS; | 1101 | info->tcpi_options |= TCPI_OPT_TIMESTAMPS; | 
| @@ -1135,8 +1106,7 @@ static void ccid3_hc_tx_get_info(struct sock *sk, struct tcp_info *info) | |||
| 1135 | { | 1106 | { | 
| 1136 | const struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); | 1107 | const struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); | 
| 1137 | 1108 | ||
| 1138 | if (hctx == NULL) | 1109 | BUG_ON(hctx == NULL); | 
| 1139 | return; | ||
| 1140 | 1110 | ||
| 1141 | info->tcpi_rto = hctx->ccid3hctx_t_rto; | 1111 | info->tcpi_rto = hctx->ccid3hctx_t_rto; | 
| 1142 | info->tcpi_rtt = hctx->ccid3hctx_rtt; | 1112 | info->tcpi_rtt = hctx->ccid3hctx_rtt; | 
| diff --git a/net/dccp/ccids/ccid3.h b/net/dccp/ccids/ccid3.h index d16f00d784f3..eb248778eea3 100644 --- a/net/dccp/ccids/ccid3.h +++ b/net/dccp/ccids/ccid3.h | |||
| @@ -48,6 +48,8 @@ | |||
| 48 | /* Two seconds as per CCID3 spec */ | 48 | /* Two seconds as per CCID3 spec */ | 
| 49 | #define TFRC_INITIAL_TIMEOUT (2 * USEC_PER_SEC) | 49 | #define TFRC_INITIAL_TIMEOUT (2 * USEC_PER_SEC) | 
| 50 | 50 | ||
| 51 | #define TFRC_INITIAL_IPI (USEC_PER_SEC / 4) | ||
| 52 | |||
| 51 | /* In usecs - half the scheduling granularity as per RFC3448 4.6 */ | 53 | /* In usecs - half the scheduling granularity as per RFC3448 4.6 */ | 
| 52 | #define TFRC_OPSYS_HALF_TIME_GRAN (USEC_PER_SEC / (2 * HZ)) | 54 | #define TFRC_OPSYS_HALF_TIME_GRAN (USEC_PER_SEC / (2 * HZ)) | 
| 53 | 55 | ||
| diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c index fee9a8c3777b..2afaa464e7f0 100644 --- a/net/dccp/ipv4.c +++ b/net/dccp/ipv4.c | |||
| @@ -641,16 +641,12 @@ int dccp_v4_send_reset(struct sock *sk, enum dccp_reset_codes code) | |||
| 641 | 641 | ||
| 642 | skb = dccp_make_reset(sk, sk->sk_dst_cache, code); | 642 | skb = dccp_make_reset(sk, sk->sk_dst_cache, code); | 
| 643 | if (skb != NULL) { | 643 | if (skb != NULL) { | 
| 644 | const struct dccp_sock *dp = dccp_sk(sk); | ||
| 645 | const struct inet_sock *inet = inet_sk(sk); | 644 | const struct inet_sock *inet = inet_sk(sk); | 
| 646 | 645 | ||
| 647 | err = ip_build_and_send_pkt(skb, sk, | 646 | err = ip_build_and_send_pkt(skb, sk, | 
| 648 | inet->saddr, inet->daddr, NULL); | 647 | inet->saddr, inet->daddr, NULL); | 
| 649 | if (err == NET_XMIT_CN) | 648 | if (err == NET_XMIT_CN) | 
| 650 | err = 0; | 649 | err = 0; | 
| 651 | |||
| 652 | ccid_hc_rx_exit(dp->dccps_hc_rx_ccid, sk); | ||
| 653 | ccid_hc_tx_exit(dp->dccps_hc_tx_ccid, sk); | ||
| 654 | } | 650 | } | 
| 655 | 651 | ||
| 656 | return err; | 652 | return err; | 
| diff --git a/net/dccp/output.c b/net/dccp/output.c index 28de157a4326..ea6d0e91e511 100644 --- a/net/dccp/output.c +++ b/net/dccp/output.c | |||
| @@ -522,7 +522,4 @@ void dccp_send_close(struct sock *sk, const int active) | |||
| 522 | dccp_transmit_skb(sk, skb_clone(skb, prio)); | 522 | dccp_transmit_skb(sk, skb_clone(skb, prio)); | 
| 523 | } else | 523 | } else | 
| 524 | dccp_transmit_skb(sk, skb); | 524 | dccp_transmit_skb(sk, skb); | 
| 525 | |||
| 526 | ccid_hc_rx_exit(dp->dccps_hc_rx_ccid, sk); | ||
| 527 | ccid_hc_tx_exit(dp->dccps_hc_tx_ccid, sk); | ||
| 528 | } | 525 | } | 
