Commit 9108d5f4 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo Committed by David S. Miller

[TFRC]: Hide tx history details from the CCIDs

Based on a previous patch by Gerrit Renker.
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 95bdfccb
...@@ -399,7 +399,6 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb) ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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 * ...@@ -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) ...@@ -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 @@ ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment