diff options
| author | David S. Miller <davem@davemloft.net> | 2008-06-11 20:53:04 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2008-06-11 20:53:04 -0400 |
| commit | 5cb960a80531211379f8f05c575725d7630098fe (patch) | |
| tree | aee22f43cf5c2ae26a6994e6aa5c427285ff0ff4 /net | |
| parent | ceeff7541e5a4ba8e8d97ffbae32b3f283cb7a3f (diff) | |
| parent | be4c798a41bf626cdaacf96c382f116ed2f7dbe9 (diff) | |
Merge branch 'master' of git://eden-feed.erg.abdn.ac.uk/net-2.6
Diffstat (limited to 'net')
| -rw-r--r-- | net/dccp/ackvec.c | 29 | ||||
| -rw-r--r-- | net/dccp/ccids/ccid3.c | 14 | ||||
| -rw-r--r-- | net/dccp/ccids/lib/tfrc.c | 8 | ||||
| -rw-r--r-- | net/dccp/ccids/lib/tfrc.h | 25 | ||||
| -rw-r--r-- | net/dccp/ccids/lib/tfrc_equation.c | 8 | ||||
| -rw-r--r-- | net/dccp/minisocks.c | 8 | ||||
| -rw-r--r-- | net/dccp/options.c | 4 | ||||
| -rw-r--r-- | net/dccp/output.c | 2 | ||||
| -rw-r--r-- | net/dccp/probe.c | 2 |
9 files changed, 41 insertions, 59 deletions
diff --git a/net/dccp/ackvec.c b/net/dccp/ackvec.c index 6de4bd195d28..1e8be246ad15 100644 --- a/net/dccp/ackvec.c +++ b/net/dccp/ackvec.c | |||
| @@ -290,12 +290,12 @@ int dccp_ackvec_add(struct dccp_ackvec *av, const struct sock *sk, | |||
| 290 | 290 | ||
| 291 | while (1) { | 291 | while (1) { |
| 292 | const u8 len = dccp_ackvec_len(av, index); | 292 | const u8 len = dccp_ackvec_len(av, index); |
| 293 | const u8 state = dccp_ackvec_state(av, index); | 293 | const u8 av_state = dccp_ackvec_state(av, index); |
| 294 | /* | 294 | /* |
| 295 | * valid packets not yet in av_buf have a reserved | 295 | * valid packets not yet in av_buf have a reserved |
| 296 | * entry, with a len equal to 0. | 296 | * entry, with a len equal to 0. |
| 297 | */ | 297 | */ |
| 298 | if (state == DCCP_ACKVEC_STATE_NOT_RECEIVED && | 298 | if (av_state == DCCP_ACKVEC_STATE_NOT_RECEIVED && |
| 299 | len == 0 && delta == 0) { /* Found our | 299 | len == 0 && delta == 0) { /* Found our |
| 300 | reserved seat! */ | 300 | reserved seat! */ |
| 301 | dccp_pr_debug("Found %llu reserved seat!\n", | 301 | dccp_pr_debug("Found %llu reserved seat!\n", |
| @@ -325,31 +325,6 @@ out_duplicate: | |||
| 325 | return -EILSEQ; | 325 | return -EILSEQ; |
| 326 | } | 326 | } |
| 327 | 327 | ||
| 328 | #ifdef CONFIG_IP_DCCP_DEBUG | ||
| 329 | void dccp_ackvector_print(const u64 ackno, const unsigned char *vector, int len) | ||
| 330 | { | ||
| 331 | dccp_pr_debug_cat("ACK vector len=%d, ackno=%llu |", len, | ||
| 332 | (unsigned long long)ackno); | ||
| 333 | |||
| 334 | while (len--) { | ||
| 335 | const u8 state = (*vector & DCCP_ACKVEC_STATE_MASK) >> 6; | ||
| 336 | const u8 rl = *vector & DCCP_ACKVEC_LEN_MASK; | ||
| 337 | |||
| 338 | dccp_pr_debug_cat("%d,%d|", state, rl); | ||
| 339 | ++vector; | ||
| 340 | } | ||
| 341 | |||
| 342 | dccp_pr_debug_cat("\n"); | ||
| 343 | } | ||
| 344 | |||
| 345 | void dccp_ackvec_print(const struct dccp_ackvec *av) | ||
| 346 | { | ||
| 347 | dccp_ackvector_print(av->av_buf_ackno, | ||
| 348 | av->av_buf + av->av_buf_head, | ||
| 349 | av->av_vec_len); | ||
| 350 | } | ||
| 351 | #endif | ||
| 352 | |||
| 353 | static void dccp_ackvec_throw_record(struct dccp_ackvec *av, | 328 | static void dccp_ackvec_throw_record(struct dccp_ackvec *av, |
| 354 | struct dccp_ackvec_record *avr) | 329 | struct dccp_ackvec_record *avr) |
| 355 | { | 330 | { |
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c index f813077234b7..a1929f33d703 100644 --- a/net/dccp/ccids/ccid3.c +++ b/net/dccp/ccids/ccid3.c | |||
| @@ -159,8 +159,8 @@ static void ccid3_hc_tx_update_x(struct sock *sk, ktime_t *stamp) | |||
| 159 | } else if (ktime_us_delta(now, hctx->ccid3hctx_t_ld) | 159 | } else if (ktime_us_delta(now, hctx->ccid3hctx_t_ld) |
| 160 | - (s64)hctx->ccid3hctx_rtt >= 0) { | 160 | - (s64)hctx->ccid3hctx_rtt >= 0) { |
| 161 | 161 | ||
| 162 | hctx->ccid3hctx_x = | 162 | hctx->ccid3hctx_x = min(2 * hctx->ccid3hctx_x, min_rate); |
| 163 | max(min(2 * hctx->ccid3hctx_x, min_rate), | 163 | hctx->ccid3hctx_x = max(hctx->ccid3hctx_x, |
| 164 | scaled_div(((__u64)hctx->ccid3hctx_s) << 6, | 164 | scaled_div(((__u64)hctx->ccid3hctx_s) << 6, |
| 165 | hctx->ccid3hctx_rtt)); | 165 | hctx->ccid3hctx_rtt)); |
| 166 | hctx->ccid3hctx_t_ld = now; | 166 | hctx->ccid3hctx_t_ld = now; |
| @@ -329,8 +329,14 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, struct sk_buff *skb) | |||
| 329 | hctx->ccid3hctx_x = rfc3390_initial_rate(sk); | 329 | hctx->ccid3hctx_x = rfc3390_initial_rate(sk); |
| 330 | hctx->ccid3hctx_t_ld = now; | 330 | hctx->ccid3hctx_t_ld = now; |
| 331 | } else { | 331 | } else { |
| 332 | /* Sender does not have RTT sample: X_pps = 1 pkt/sec */ | 332 | /* |
| 333 | hctx->ccid3hctx_x = hctx->ccid3hctx_s; | 333 | * Sender does not have RTT sample: |
| 334 | * - set fallback RTT (RFC 4340, 3.4) since a RTT value | ||
| 335 | * is needed in several parts (e.g. window counter); | ||
| 336 | * - set sending rate X_pps = 1pps as per RFC 3448, 4.2. | ||
| 337 | */ | ||
| 338 | hctx->ccid3hctx_rtt = DCCP_FALLBACK_RTT; | ||
| 339 | hctx->ccid3hctx_x = hctx->ccid3hctx_s; | ||
| 334 | hctx->ccid3hctx_x <<= 6; | 340 | hctx->ccid3hctx_x <<= 6; |
| 335 | } | 341 | } |
| 336 | ccid3_update_send_interval(hctx); | 342 | ccid3_update_send_interval(hctx); |
diff --git a/net/dccp/ccids/lib/tfrc.c b/net/dccp/ccids/lib/tfrc.c index d1dfbb8de64c..97ecec0a8e76 100644 --- a/net/dccp/ccids/lib/tfrc.c +++ b/net/dccp/ccids/lib/tfrc.c | |||
| @@ -14,14 +14,6 @@ module_param(tfrc_debug, bool, 0444); | |||
| 14 | MODULE_PARM_DESC(tfrc_debug, "Enable debug messages"); | 14 | MODULE_PARM_DESC(tfrc_debug, "Enable debug messages"); |
| 15 | #endif | 15 | #endif |
| 16 | 16 | ||
| 17 | extern int tfrc_tx_packet_history_init(void); | ||
| 18 | extern void tfrc_tx_packet_history_exit(void); | ||
| 19 | extern int tfrc_rx_packet_history_init(void); | ||
| 20 | extern void tfrc_rx_packet_history_exit(void); | ||
| 21 | |||
| 22 | extern int tfrc_li_init(void); | ||
| 23 | extern void tfrc_li_exit(void); | ||
| 24 | |||
| 25 | static int __init tfrc_module_init(void) | 17 | static int __init tfrc_module_init(void) |
| 26 | { | 18 | { |
| 27 | int rc = tfrc_li_init(); | 19 | int rc = tfrc_li_init(); |
diff --git a/net/dccp/ccids/lib/tfrc.h b/net/dccp/ccids/lib/tfrc.h index 1fb1187bbf1c..ed9857527acf 100644 --- a/net/dccp/ccids/lib/tfrc.h +++ b/net/dccp/ccids/lib/tfrc.h | |||
| @@ -15,7 +15,7 @@ | |||
| 15 | * (at your option) any later version. | 15 | * (at your option) any later version. |
| 16 | */ | 16 | */ |
| 17 | #include <linux/types.h> | 17 | #include <linux/types.h> |
| 18 | #include <asm/div64.h> | 18 | #include <linux/math64.h> |
| 19 | #include "../../dccp.h" | 19 | #include "../../dccp.h" |
| 20 | /* internal includes that this module exports: */ | 20 | /* internal includes that this module exports: */ |
| 21 | #include "loss_interval.h" | 21 | #include "loss_interval.h" |
| @@ -29,21 +29,19 @@ extern int tfrc_debug; | |||
| 29 | #endif | 29 | #endif |
| 30 | 30 | ||
| 31 | /* integer-arithmetic divisions of type (a * 1000000)/b */ | 31 | /* integer-arithmetic divisions of type (a * 1000000)/b */ |
| 32 | static inline u64 scaled_div(u64 a, u32 b) | 32 | static inline u64 scaled_div(u64 a, u64 b) |
| 33 | { | 33 | { |
| 34 | BUG_ON(b==0); | 34 | BUG_ON(b==0); |
| 35 | a *= 1000000; | 35 | return div64_u64(a * 1000000, b); |
| 36 | do_div(a, b); | ||
| 37 | return a; | ||
| 38 | } | 36 | } |
| 39 | 37 | ||
| 40 | static inline u32 scaled_div32(u64 a, u32 b) | 38 | static inline u32 scaled_div32(u64 a, u64 b) |
| 41 | { | 39 | { |
| 42 | u64 result = scaled_div(a, b); | 40 | u64 result = scaled_div(a, b); |
| 43 | 41 | ||
| 44 | if (result > UINT_MAX) { | 42 | if (result > UINT_MAX) { |
| 45 | DCCP_CRIT("Overflow: a(%llu)/b(%u) > ~0U", | 43 | DCCP_CRIT("Overflow: %llu/%llu > UINT_MAX", |
| 46 | (unsigned long long)a, b); | 44 | (unsigned long long)a, (unsigned long long)b); |
| 47 | return UINT_MAX; | 45 | return UINT_MAX; |
| 48 | } | 46 | } |
| 49 | return result; | 47 | return result; |
| @@ -58,7 +56,14 @@ static inline u32 tfrc_ewma(const u32 avg, const u32 newval, const u8 weight) | |||
| 58 | return avg ? (weight * avg + (10 - weight) * newval) / 10 : newval; | 56 | return avg ? (weight * avg + (10 - weight) * newval) / 10 : newval; |
| 59 | } | 57 | } |
| 60 | 58 | ||
| 61 | extern u32 tfrc_calc_x(u16 s, u32 R, u32 p); | 59 | extern u32 tfrc_calc_x(u16 s, u32 R, u32 p); |
| 62 | extern u32 tfrc_calc_x_reverse_lookup(u32 fvalue); | 60 | extern u32 tfrc_calc_x_reverse_lookup(u32 fvalue); |
| 63 | 61 | ||
| 62 | extern int tfrc_tx_packet_history_init(void); | ||
| 63 | extern void tfrc_tx_packet_history_exit(void); | ||
| 64 | extern int tfrc_rx_packet_history_init(void); | ||
| 65 | extern void tfrc_rx_packet_history_exit(void); | ||
| 66 | |||
| 67 | extern int tfrc_li_init(void); | ||
| 68 | extern void tfrc_li_exit(void); | ||
| 64 | #endif /* _TFRC_H_ */ | 69 | #endif /* _TFRC_H_ */ |
diff --git a/net/dccp/ccids/lib/tfrc_equation.c b/net/dccp/ccids/lib/tfrc_equation.c index e4e64b76c10c..2f20a29cffe4 100644 --- a/net/dccp/ccids/lib/tfrc_equation.c +++ b/net/dccp/ccids/lib/tfrc_equation.c | |||
| @@ -661,7 +661,7 @@ u32 tfrc_calc_x(u16 s, u32 R, u32 p) | |||
| 661 | 661 | ||
| 662 | EXPORT_SYMBOL_GPL(tfrc_calc_x); | 662 | EXPORT_SYMBOL_GPL(tfrc_calc_x); |
| 663 | 663 | ||
| 664 | /* | 664 | /** |
| 665 | * tfrc_calc_x_reverse_lookup - try to find p given f(p) | 665 | * tfrc_calc_x_reverse_lookup - try to find p given f(p) |
| 666 | * | 666 | * |
| 667 | * @fvalue: function value to match, scaled by 1000000 | 667 | * @fvalue: function value to match, scaled by 1000000 |
| @@ -676,11 +676,11 @@ u32 tfrc_calc_x_reverse_lookup(u32 fvalue) | |||
| 676 | 676 | ||
| 677 | /* Error cases. */ | 677 | /* Error cases. */ |
| 678 | if (fvalue < tfrc_calc_x_lookup[0][1]) { | 678 | if (fvalue < tfrc_calc_x_lookup[0][1]) { |
| 679 | DCCP_WARN("fvalue %d smaller than resolution\n", fvalue); | 679 | DCCP_WARN("fvalue %u smaller than resolution\n", fvalue); |
| 680 | return tfrc_calc_x_lookup[0][1]; | 680 | return TFRC_SMALLEST_P; |
| 681 | } | 681 | } |
| 682 | if (fvalue > tfrc_calc_x_lookup[TFRC_CALC_X_ARRSIZE - 1][0]) { | 682 | if (fvalue > tfrc_calc_x_lookup[TFRC_CALC_X_ARRSIZE - 1][0]) { |
| 683 | DCCP_WARN("fvalue %d exceeds bounds!\n", fvalue); | 683 | DCCP_WARN("fvalue %u exceeds bounds!\n", fvalue); |
| 684 | return 1000000; | 684 | return 1000000; |
| 685 | } | 685 | } |
| 686 | 686 | ||
diff --git a/net/dccp/minisocks.c b/net/dccp/minisocks.c index 33ad48321b08..66dca5bba858 100644 --- a/net/dccp/minisocks.c +++ b/net/dccp/minisocks.c | |||
| @@ -165,12 +165,12 @@ out_free: | |||
| 165 | /* See dccp_v4_conn_request */ | 165 | /* See dccp_v4_conn_request */ |
| 166 | newdmsk->dccpms_sequence_window = req->rcv_wnd; | 166 | newdmsk->dccpms_sequence_window = req->rcv_wnd; |
| 167 | 167 | ||
| 168 | newdp->dccps_gar = newdp->dccps_isr = dreq->dreq_isr; | 168 | newdp->dccps_gar = newdp->dccps_iss = dreq->dreq_iss; |
| 169 | dccp_update_gsr(newsk, dreq->dreq_isr); | ||
| 170 | |||
| 171 | newdp->dccps_iss = dreq->dreq_iss; | ||
| 172 | dccp_update_gss(newsk, dreq->dreq_iss); | 169 | dccp_update_gss(newsk, dreq->dreq_iss); |
| 173 | 170 | ||
| 171 | newdp->dccps_isr = dreq->dreq_isr; | ||
| 172 | dccp_update_gsr(newsk, dreq->dreq_isr); | ||
| 173 | |||
| 174 | /* | 174 | /* |
| 175 | * SWL and AWL are initially adjusted so that they are not less than | 175 | * SWL and AWL are initially adjusted so that they are not less than |
| 176 | * the initial Sequence Numbers received and sent, respectively: | 176 | * the initial Sequence Numbers received and sent, respectively: |
diff --git a/net/dccp/options.c b/net/dccp/options.c index d2a84a2fecee..43bc24e761d0 100644 --- a/net/dccp/options.c +++ b/net/dccp/options.c | |||
| @@ -107,9 +107,11 @@ int dccp_parse_options(struct sock *sk, struct dccp_request_sock *dreq, | |||
| 107 | * | 107 | * |
| 108 | * CCID-specific options are ignored during connection setup, as | 108 | * CCID-specific options are ignored during connection setup, as |
| 109 | * negotiation may still be in progress (see RFC 4340, 10.3). | 109 | * negotiation may still be in progress (see RFC 4340, 10.3). |
| 110 | * The same applies to Ack Vectors, as these depend on the CCID. | ||
| 110 | * | 111 | * |
| 111 | */ | 112 | */ |
| 112 | if (dreq != NULL && opt >= 128) | 113 | if (dreq != NULL && (opt >= 128 || |
| 114 | opt == DCCPO_ACK_VECTOR_0 || opt == DCCPO_ACK_VECTOR_1)) | ||
| 113 | goto ignore_option; | 115 | goto ignore_option; |
| 114 | 116 | ||
| 115 | switch (opt) { | 117 | switch (opt) { |
diff --git a/net/dccp/output.c b/net/dccp/output.c index 1f8a9b64c083..fe20068c5d8e 100644 --- a/net/dccp/output.c +++ b/net/dccp/output.c | |||
| @@ -508,6 +508,7 @@ void dccp_send_ack(struct sock *sk) | |||
| 508 | 508 | ||
| 509 | EXPORT_SYMBOL_GPL(dccp_send_ack); | 509 | EXPORT_SYMBOL_GPL(dccp_send_ack); |
| 510 | 510 | ||
| 511 | #if 0 | ||
| 511 | /* FIXME: Is this still necessary (11.3) - currently nowhere used by DCCP. */ | 512 | /* FIXME: Is this still necessary (11.3) - currently nowhere used by DCCP. */ |
| 512 | void dccp_send_delayed_ack(struct sock *sk) | 513 | void dccp_send_delayed_ack(struct sock *sk) |
| 513 | { | 514 | { |
| @@ -538,6 +539,7 @@ void dccp_send_delayed_ack(struct sock *sk) | |||
| 538 | icsk->icsk_ack.timeout = timeout; | 539 | icsk->icsk_ack.timeout = timeout; |
| 539 | sk_reset_timer(sk, &icsk->icsk_delack_timer, timeout); | 540 | sk_reset_timer(sk, &icsk->icsk_delack_timer, timeout); |
| 540 | } | 541 | } |
| 542 | #endif | ||
| 541 | 543 | ||
| 542 | void dccp_send_sync(struct sock *sk, const u64 ackno, | 544 | void dccp_send_sync(struct sock *sk, const u64 ackno, |
| 543 | const enum dccp_pkt_type pkt_type) | 545 | const enum dccp_pkt_type pkt_type) |
diff --git a/net/dccp/probe.c b/net/dccp/probe.c index 0bcdc9250279..81368a7f5379 100644 --- a/net/dccp/probe.c +++ b/net/dccp/probe.c | |||
| @@ -42,7 +42,7 @@ static int bufsize = 64 * 1024; | |||
| 42 | 42 | ||
| 43 | static const char procname[] = "dccpprobe"; | 43 | static const char procname[] = "dccpprobe"; |
| 44 | 44 | ||
| 45 | struct { | 45 | static struct { |
| 46 | struct kfifo *fifo; | 46 | struct kfifo *fifo; |
| 47 | spinlock_t lock; | 47 | spinlock_t lock; |
| 48 | wait_queue_head_t wait; | 48 | wait_queue_head_t wait; |
