mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.0 KiB
69 lines
2.0 KiB
/* SPDX-License-Identifier: GPL-2.0-or-later */ |
|
#ifndef _DCCP_LI_HIST_ |
|
#define _DCCP_LI_HIST_ |
|
/* |
|
* 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 <[email protected]> |
|
* Copyright (c) 2005 Arnaldo Carvalho de Melo <[email protected]> |
|
*/ |
|
#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; |
|
|
|
int tfrc_lh_interval_add(struct tfrc_loss_hist *, struct tfrc_rx_hist *, |
|
u32 (*first_li)(struct sock *), struct sock *); |
|
u8 tfrc_lh_update_i_mean(struct tfrc_loss_hist *lh, struct sk_buff *); |
|
void tfrc_lh_cleanup(struct tfrc_loss_hist *lh); |
|
|
|
#endif /* _DCCP_LI_HIST_ */
|
|
|