3ca7aea041
This changes the return type of tfrc_lh_update_i_mean() to void, since that function returns always `false'. This is due to len = dccp_delta_seqno(cur->li_seqno, DCCP_SKB_CB(skb)->dccpd_seq) + 1; if (len - (s64)cur->li_length <= 0) /* duplicate or reordered */ return 0; which means that update_i_mean can only increase the length of the open loss interval I_0, and hence the value of I_tot0 (RFC 3448, 5.4). Consequently the test `i_mean < old_i_mean' at the end of the function always evaluates to false. There is no known way by which a loss interval can suddenly become shorter, therefore the return type of the function is changed to void. (That is, under the given circumstances step (3) in RFC 3448, 6.1 will not occur.) Further changes: ---------------- * the function is now called from tfrc_rx_handle_loss, which is equivalent to the previous way of calling from rx_packet_recv (it was called whenever there was no new or pending loss, now it is also updated when there is a pending loss - this increases the accuracy a bit); * added a FIXME to possibly consider NDP counting as per RFC 4342 (this is not implemented yet). Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
76 lines
2.2 KiB
C
76 lines
2.2 KiB
C
#ifndef _DCCP_LI_HIST_
|
|
#define _DCCP_LI_HIST_
|
|
/*
|
|
* net/dccp/ccids/lib/loss_interval.h
|
|
*
|
|
* Copyright (c) 2007 The University of Aberdeen, Scotland, UK
|
|
* Copyright (c) 2005-7 The University of Waikato, Hamilton, New Zealand.
|
|
* Copyright (c) 2005-7 Ian McDonald <ian.mcdonald@jandi.co.nz>
|
|
* Copyright (c) 2005 Arnaldo Carvalho de Melo <acme@conectiva.com.br>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the Free
|
|
* Software Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*/
|
|
#include <linux/ktime.h>
|
|
#include <linux/list.h>
|
|
#include <linux/slab.h>
|
|
|
|
/*
|
|
* Number of loss intervals (RFC 4342, 8.6.1). The history size is one more than
|
|
* NINTERVAL, since the `open' interval I_0 is always stored as the first entry.
|
|
*/
|
|
#define NINTERVAL 8
|
|
#define LIH_SIZE (NINTERVAL + 1)
|
|
|
|
/**
|
|
* tfrc_loss_interval - Loss history record for TFRC-based protocols
|
|
* @li_seqno: Highest received seqno before the start of loss
|
|
* @li_ccval: The CCVal belonging to @li_seqno
|
|
* @li_is_closed: Whether @li_seqno is older than 1 RTT
|
|
* @li_length: Loss interval sequence length
|
|
*/
|
|
struct tfrc_loss_interval {
|
|
u64 li_seqno:48,
|
|
li_ccval:4,
|
|
li_is_closed:1;
|
|
u32 li_length;
|
|
};
|
|
|
|
/**
|
|
* tfrc_loss_hist - Loss record database
|
|
* @ring: Circular queue managed in LIFO manner
|
|
* @counter: Current count of entries (can be more than %LIH_SIZE)
|
|
* @i_mean: Current Average Loss Interval [RFC 3448, 5.4]
|
|
*/
|
|
struct tfrc_loss_hist {
|
|
struct tfrc_loss_interval *ring[LIH_SIZE];
|
|
u8 counter;
|
|
u32 i_mean;
|
|
};
|
|
|
|
static inline void tfrc_lh_init(struct tfrc_loss_hist *lh)
|
|
{
|
|
memset(lh, 0, sizeof(struct tfrc_loss_hist));
|
|
}
|
|
|
|
static inline u8 tfrc_lh_is_initialised(struct tfrc_loss_hist *lh)
|
|
{
|
|
return lh->counter > 0;
|
|
}
|
|
|
|
static inline u8 tfrc_lh_length(struct tfrc_loss_hist *lh)
|
|
{
|
|
return min(lh->counter, (u8)LIH_SIZE);
|
|
}
|
|
|
|
struct tfrc_rx_hist;
|
|
|
|
extern int tfrc_lh_interval_add(struct tfrc_loss_hist *, struct tfrc_rx_hist *,
|
|
u32 (*first_li)(struct sock *), struct sock *);
|
|
extern void tfrc_lh_update_i_mean(struct tfrc_loss_hist *lh, struct sk_buff *);
|
|
extern void tfrc_lh_cleanup(struct tfrc_loss_hist *lh);
|
|
|
|
#endif /* _DCCP_LI_HIST_ */
|