mirror of
https://github.com/adulau/aha.git
synced 2025-01-01 05:36:24 +00:00
[TFRC]: Hide tx history details from the CCIDs
Based on a previous patch by Gerrit Renker. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
95bdfccb2b
commit
9108d5f4b2
3 changed files with 41 additions and 28 deletions
|
@ -399,7 +399,6 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
|
struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
|
||||||
struct ccid3_options_received *opt_recv;
|
struct ccid3_options_received *opt_recv;
|
||||||
struct tfrc_tx_hist_entry *packet;
|
|
||||||
ktime_t now;
|
ktime_t now;
|
||||||
unsigned long t_nfb;
|
unsigned long t_nfb;
|
||||||
u32 pinv, r_sample;
|
u32 pinv, r_sample;
|
||||||
|
@ -414,19 +413,17 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
|
||||||
switch (hctx->ccid3hctx_state) {
|
switch (hctx->ccid3hctx_state) {
|
||||||
case TFRC_SSTATE_NO_FBACK:
|
case TFRC_SSTATE_NO_FBACK:
|
||||||
case TFRC_SSTATE_FBACK:
|
case TFRC_SSTATE_FBACK:
|
||||||
|
now = ktime_get_real();
|
||||||
|
|
||||||
/* estimate RTT from history if ACK number is valid */
|
/* estimate RTT from history if ACK number is valid */
|
||||||
packet = tfrc_tx_hist_find_entry(hctx->ccid3hctx_hist,
|
r_sample = tfrc_tx_hist_rtt(hctx->ccid3hctx_hist,
|
||||||
DCCP_SKB_CB(skb)->dccpd_ack_seq);
|
DCCP_SKB_CB(skb)->dccpd_ack_seq, now);
|
||||||
if (packet == NULL) {
|
if (r_sample == 0) {
|
||||||
DCCP_WARN("%s(%p): %s with bogus ACK-%llu\n", dccp_role(sk), sk,
|
DCCP_WARN("%s(%p): %s with bogus ACK-%llu\n", dccp_role(sk), sk,
|
||||||
dccp_packet_name(DCCP_SKB_CB(skb)->dccpd_type),
|
dccp_packet_name(DCCP_SKB_CB(skb)->dccpd_type),
|
||||||
(unsigned long long)DCCP_SKB_CB(skb)->dccpd_ack_seq);
|
(unsigned long long)DCCP_SKB_CB(skb)->dccpd_ack_seq);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
* Garbage-collect older (irrelevant) entries
|
|
||||||
*/
|
|
||||||
tfrc_tx_hist_purge(&packet->next);
|
|
||||||
|
|
||||||
/* Update receive rate in units of 64 * bytes/second */
|
/* Update receive rate in units of 64 * bytes/second */
|
||||||
hctx->ccid3hctx_x_recv = opt_recv->ccid3or_receive_rate;
|
hctx->ccid3hctx_x_recv = opt_recv->ccid3or_receive_rate;
|
||||||
|
@ -438,12 +435,10 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
|
||||||
hctx->ccid3hctx_p = 0;
|
hctx->ccid3hctx_p = 0;
|
||||||
else /* can not exceed 100% */
|
else /* can not exceed 100% */
|
||||||
hctx->ccid3hctx_p = 1000000 / pinv;
|
hctx->ccid3hctx_p = 1000000 / pinv;
|
||||||
|
|
||||||
now = ktime_get_real();
|
|
||||||
/*
|
/*
|
||||||
* Calculate new RTT sample and update moving average
|
* Validate new RTT sample and update moving average
|
||||||
*/
|
*/
|
||||||
r_sample = dccp_sample_rtt(sk, ktime_us_delta(now, packet->stamp));
|
r_sample = dccp_sample_rtt(sk, r_sample);
|
||||||
hctx->ccid3hctx_rtt = tfrc_ewma(hctx->ccid3hctx_rtt, r_sample, 9);
|
hctx->ccid3hctx_rtt = tfrc_ewma(hctx->ccid3hctx_rtt, r_sample, 9);
|
||||||
|
|
||||||
if (hctx->ccid3hctx_state == TFRC_SSTATE_NO_FBACK) {
|
if (hctx->ccid3hctx_state == TFRC_SSTATE_NO_FBACK) {
|
||||||
|
|
|
@ -39,12 +39,24 @@
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include "packet_history.h"
|
#include "packet_history.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* tfrc_tx_hist_entry - Simple singly-linked TX history list
|
||||||
|
* @next: next oldest entry (LIFO order)
|
||||||
|
* @seqno: sequence number of this entry
|
||||||
|
* @stamp: send time of packet with sequence number @seqno
|
||||||
|
*/
|
||||||
|
struct tfrc_tx_hist_entry {
|
||||||
|
struct tfrc_tx_hist_entry *next;
|
||||||
|
u64 seqno;
|
||||||
|
ktime_t stamp;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Transmitter History Routines
|
* Transmitter History Routines
|
||||||
*/
|
*/
|
||||||
static struct kmem_cache *tfrc_tx_hist;
|
static struct kmem_cache *tfrc_tx_hist;
|
||||||
|
|
||||||
struct tfrc_tx_hist_entry *
|
static struct tfrc_tx_hist_entry *
|
||||||
tfrc_tx_hist_find_entry(struct tfrc_tx_hist_entry *head, u64 seqno)
|
tfrc_tx_hist_find_entry(struct tfrc_tx_hist_entry *head, u64 seqno)
|
||||||
{
|
{
|
||||||
while (head != NULL && head->seqno != seqno)
|
while (head != NULL && head->seqno != seqno)
|
||||||
|
@ -52,7 +64,6 @@ struct tfrc_tx_hist_entry *
|
||||||
|
|
||||||
return head;
|
return head;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(tfrc_tx_hist_find_entry);
|
|
||||||
|
|
||||||
int tfrc_tx_hist_add(struct tfrc_tx_hist_entry **headp, u64 seqno)
|
int tfrc_tx_hist_add(struct tfrc_tx_hist_entry **headp, u64 seqno)
|
||||||
{
|
{
|
||||||
|
@ -83,6 +94,24 @@ void tfrc_tx_hist_purge(struct tfrc_tx_hist_entry **headp)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(tfrc_tx_hist_purge);
|
EXPORT_SYMBOL_GPL(tfrc_tx_hist_purge);
|
||||||
|
|
||||||
|
u32 tfrc_tx_hist_rtt(struct tfrc_tx_hist_entry *head, const u64 seqno,
|
||||||
|
const ktime_t now)
|
||||||
|
{
|
||||||
|
u32 rtt = 0;
|
||||||
|
struct tfrc_tx_hist_entry *packet = tfrc_tx_hist_find_entry(head, seqno);
|
||||||
|
|
||||||
|
if (packet != NULL) {
|
||||||
|
rtt = ktime_us_delta(now, packet->stamp);
|
||||||
|
/*
|
||||||
|
* Garbage-collect older (irrelevant) entries:
|
||||||
|
*/
|
||||||
|
tfrc_tx_hist_purge(&packet->next);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rtt;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(tfrc_tx_hist_rtt);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Receiver History Routines
|
* Receiver History Routines
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -48,23 +48,12 @@
|
||||||
#define TFRC_WIN_COUNT_PER_RTT 4
|
#define TFRC_WIN_COUNT_PER_RTT 4
|
||||||
#define TFRC_WIN_COUNT_LIMIT 16
|
#define TFRC_WIN_COUNT_LIMIT 16
|
||||||
|
|
||||||
/**
|
struct tfrc_tx_hist_entry;
|
||||||
* tfrc_tx_hist_entry - Simple singly-linked TX history list
|
|
||||||
* @next: next oldest entry (LIFO order)
|
|
||||||
* @seqno: sequence number of this entry
|
|
||||||
* @stamp: send time of packet with sequence number @seqno
|
|
||||||
*/
|
|
||||||
struct tfrc_tx_hist_entry {
|
|
||||||
struct tfrc_tx_hist_entry *next;
|
|
||||||
u64 seqno;
|
|
||||||
ktime_t stamp;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern int tfrc_tx_hist_add(struct tfrc_tx_hist_entry **headp, u64 seqno);
|
extern int tfrc_tx_hist_add(struct tfrc_tx_hist_entry **headp, u64 seqno);
|
||||||
extern void tfrc_tx_hist_purge(struct tfrc_tx_hist_entry **headp);
|
extern void tfrc_tx_hist_purge(struct tfrc_tx_hist_entry **headp);
|
||||||
|
extern u32 tfrc_tx_hist_rtt(struct tfrc_tx_hist_entry *head,
|
||||||
extern struct tfrc_tx_hist_entry *
|
const u64 seqno, const ktime_t now);
|
||||||
tfrc_tx_hist_find_entry(struct tfrc_tx_hist_entry *head, u64 ackno);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Receiver History data structures and declarations
|
* Receiver History data structures and declarations
|
||||||
|
|
Loading…
Reference in a new issue