Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+7 −12
Original line number Diff line number Diff line
@@ -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_options_received *opt_recv;
	struct tfrc_tx_hist_entry *packet;
	ktime_t now;
	unsigned long t_nfb;
	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) {
	case TFRC_SSTATE_NO_FBACK:
	case TFRC_SSTATE_FBACK:
		now = ktime_get_real();

		/* estimate RTT from history if ACK number is valid */
		packet = tfrc_tx_hist_find_entry(hctx->ccid3hctx_hist,
						 DCCP_SKB_CB(skb)->dccpd_ack_seq);
		if (packet == NULL) {
		r_sample = tfrc_tx_hist_rtt(hctx->ccid3hctx_hist,
					    DCCP_SKB_CB(skb)->dccpd_ack_seq, now);
		if (r_sample == 0) {
			DCCP_WARN("%s(%p): %s with bogus ACK-%llu\n", dccp_role(sk), sk,
				  dccp_packet_name(DCCP_SKB_CB(skb)->dccpd_type),
				  (unsigned long long)DCCP_SKB_CB(skb)->dccpd_ack_seq);
			return;
		}
		/*
		 * Garbage-collect older (irrelevant) entries
		 */
		tfrc_tx_hist_purge(&packet->next);

		/* Update receive rate in units of 64 * bytes/second */
		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;
		else				       /* can not exceed 100% */
			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);

		if (hctx->ccid3hctx_state == TFRC_SSTATE_NO_FBACK) {
+31 −2
Original line number Diff line number Diff line
@@ -39,12 +39,24 @@
#include <linux/string.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
 */
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)
{
	while (head != NULL && head->seqno != seqno)
@@ -52,7 +64,6 @@ struct tfrc_tx_hist_entry *

	return head;
}
EXPORT_SYMBOL_GPL(tfrc_tx_hist_find_entry);

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);

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
 */
+3 −14
Original line number Diff line number Diff line
@@ -48,23 +48,12 @@
#define TFRC_WIN_COUNT_PER_RTT	 4
#define TFRC_WIN_COUNT_LIMIT	16

/**
 *  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;
};
struct tfrc_tx_hist_entry;

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 struct tfrc_tx_hist_entry *
	tfrc_tx_hist_find_entry(struct tfrc_tx_hist_entry *head, u64 ackno);
extern u32  tfrc_tx_hist_rtt(struct tfrc_tx_hist_entry *head,
			     const u64 seqno, const ktime_t now);

/*
 * 	Receiver History data structures and declarations