Commit 129fa447 authored by Gerrit Renker's avatar Gerrit Renker Committed by David S. Miller

dccp: Integrate the TFRC library with DCCP

This patch integrates the TFRC library, which is a dependency of CCID-3 (and
CCID-4), with the new use of CCIDs in the DCCP module.		
Signed-off-by: default avatarGerrit Renker <gerrit@erg.abdn.ac.uk>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e5fd56ca
...@@ -8,6 +8,10 @@ dccp-y := ccid.o feat.o input.o minisocks.o options.o output.o proto.o timer.o ...@@ -8,6 +8,10 @@ dccp-y := ccid.o feat.o input.o minisocks.o options.o output.o proto.o timer.o
# CCID-2 is default (RFC 4340, p. 77) and has Ack Vectors as dependency # CCID-2 is default (RFC 4340, p. 77) and has Ack Vectors as dependency
dccp-y += ccids/ccid2.o ackvec.o dccp-y += ccids/ccid2.o ackvec.o
dccp-$(CONFIG_IP_DCCP_CCID3) += ccids/ccid3.o dccp-$(CONFIG_IP_DCCP_CCID3) += ccids/ccid3.o
dccp-$(CONFIG_IP_DCCP_TFRC_LIB) += ccids/lib/tfrc.o \
ccids/lib/tfrc_equation.o \
ccids/lib/packet_history.o \
ccids/lib/loss_interval.o
dccp_ipv4-y := ipv4.o dccp_ipv4-y := ipv4.o
...@@ -22,5 +26,3 @@ dccp-$(CONFIG_SYSCTL) += sysctl.o ...@@ -22,5 +26,3 @@ dccp-$(CONFIG_SYSCTL) += sysctl.o
dccp_diag-y := diag.o dccp_diag-y := diag.o
dccp_probe-y := probe.o dccp_probe-y := probe.o
obj-y += ccids/
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
*/ */
#include "ccid.h" #include "ccid.h"
#include "ccids/lib/tfrc.h"
static struct ccid_operations *ccids[] = { static struct ccid_operations *ccids[] = {
&ccid2_ops, &ccid2_ops,
...@@ -199,7 +200,10 @@ void ccid_hc_tx_delete(struct ccid *ccid, struct sock *sk) ...@@ -199,7 +200,10 @@ void ccid_hc_tx_delete(struct ccid *ccid, struct sock *sk)
int __init ccid_initialize_builtins(void) int __init ccid_initialize_builtins(void)
{ {
int i, err; int i, err = tfrc_lib_init();
if (err)
return err;
for (i = 0; i < ARRAY_SIZE(ccids); i++) { for (i = 0; i < ARRAY_SIZE(ccids); i++) {
err = ccid_activate(ccids[i]); err = ccid_activate(ccids[i]);
...@@ -211,6 +215,7 @@ int __init ccid_initialize_builtins(void) ...@@ -211,6 +215,7 @@ int __init ccid_initialize_builtins(void)
unwind_registrations: unwind_registrations:
while(--i >= 0) while(--i >= 0)
ccid_deactivate(ccids[i]); ccid_deactivate(ccids[i]);
tfrc_lib_exit();
return err; return err;
} }
...@@ -220,4 +225,5 @@ void ccid_cleanup_builtins(void) ...@@ -220,4 +225,5 @@ void ccid_cleanup_builtins(void)
for (i = 0; i < ARRAY_SIZE(ccids); i++) for (i = 0; i < ARRAY_SIZE(ccids); i++)
ccid_deactivate(ccids[i]); ccid_deactivate(ccids[i]);
tfrc_lib_exit();
} }
...@@ -14,7 +14,6 @@ config IP_DCCP_CCID2_DEBUG ...@@ -14,7 +14,6 @@ config IP_DCCP_CCID2_DEBUG
config IP_DCCP_CCID3 config IP_DCCP_CCID3
bool "CCID-3 (TCP-Friendly) (EXPERIMENTAL)" bool "CCID-3 (TCP-Friendly) (EXPERIMENTAL)"
def_bool y if (IP_DCCP = y || IP_DCCP = m) def_bool y if (IP_DCCP = y || IP_DCCP = m)
select IP_DCCP_TFRC_LIB
---help--- ---help---
CCID-3 denotes TCP-Friendly Rate Control (TFRC), an equation-based CCID-3 denotes TCP-Friendly Rate Control (TFRC), an equation-based
rate-controlled congestion control mechanism. TFRC is designed to rate-controlled congestion control mechanism. TFRC is designed to
...@@ -80,12 +79,8 @@ config IP_DCCP_CCID3_RTO ...@@ -80,12 +79,8 @@ config IP_DCCP_CCID3_RTO
therefore not be performed on WANs. therefore not be performed on WANs.
config IP_DCCP_TFRC_LIB config IP_DCCP_TFRC_LIB
tristate def_bool y if IP_DCCP_CCID3
default n
config IP_DCCP_TFRC_DEBUG config IP_DCCP_TFRC_DEBUG
bool def_bool y if IP_DCCP_CCID3_DEBUG
depends on IP_DCCP_TFRC_LIB
default y if IP_DCCP_CCID3_DEBUG
endmenu endmenu
obj-$(CONFIG_IP_DCCP_TFRC_LIB) += dccp_tfrc_lib.o
dccp_tfrc_lib-y := tfrc.o tfrc_equation.o packet_history.o loss_interval.o
...@@ -60,7 +60,6 @@ void tfrc_lh_cleanup(struct tfrc_loss_hist *lh) ...@@ -60,7 +60,6 @@ void tfrc_lh_cleanup(struct tfrc_loss_hist *lh)
lh->ring[LIH_INDEX(lh->counter)] = NULL; lh->ring[LIH_INDEX(lh->counter)] = NULL;
} }
} }
EXPORT_SYMBOL_GPL(tfrc_lh_cleanup);
static void tfrc_lh_calc_i_mean(struct tfrc_loss_hist *lh) static void tfrc_lh_calc_i_mean(struct tfrc_loss_hist *lh)
{ {
...@@ -121,7 +120,6 @@ u8 tfrc_lh_update_i_mean(struct tfrc_loss_hist *lh, struct sk_buff *skb) ...@@ -121,7 +120,6 @@ u8 tfrc_lh_update_i_mean(struct tfrc_loss_hist *lh, struct sk_buff *skb)
return (lh->i_mean < old_i_mean); return (lh->i_mean < old_i_mean);
} }
EXPORT_SYMBOL_GPL(tfrc_lh_update_i_mean);
/* Determine if `new_loss' does begin a new loss interval [RFC 4342, 10.2] */ /* Determine if `new_loss' does begin a new loss interval [RFC 4342, 10.2] */
static inline u8 tfrc_lh_is_new_loss(struct tfrc_loss_interval *cur, static inline u8 tfrc_lh_is_new_loss(struct tfrc_loss_interval *cur,
...@@ -169,7 +167,6 @@ int tfrc_lh_interval_add(struct tfrc_loss_hist *lh, struct tfrc_rx_hist *rh, ...@@ -169,7 +167,6 @@ int tfrc_lh_interval_add(struct tfrc_loss_hist *lh, struct tfrc_rx_hist *rh,
} }
return 1; return 1;
} }
EXPORT_SYMBOL_GPL(tfrc_lh_interval_add);
int __init tfrc_li_init(void) int __init tfrc_li_init(void)
{ {
......
...@@ -94,7 +94,6 @@ int tfrc_tx_hist_add(struct tfrc_tx_hist_entry **headp, u64 seqno) ...@@ -94,7 +94,6 @@ int tfrc_tx_hist_add(struct tfrc_tx_hist_entry **headp, u64 seqno)
*headp = entry; *headp = entry;
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(tfrc_tx_hist_add);
void tfrc_tx_hist_purge(struct tfrc_tx_hist_entry **headp) void tfrc_tx_hist_purge(struct tfrc_tx_hist_entry **headp)
{ {
...@@ -109,7 +108,6 @@ void tfrc_tx_hist_purge(struct tfrc_tx_hist_entry **headp) ...@@ -109,7 +108,6 @@ void tfrc_tx_hist_purge(struct tfrc_tx_hist_entry **headp)
*headp = NULL; *headp = NULL;
} }
EXPORT_SYMBOL_GPL(tfrc_tx_hist_purge);
u32 tfrc_tx_hist_rtt(struct tfrc_tx_hist_entry *head, const u64 seqno, u32 tfrc_tx_hist_rtt(struct tfrc_tx_hist_entry *head, const u64 seqno,
const ktime_t now) const ktime_t now)
...@@ -127,7 +125,6 @@ u32 tfrc_tx_hist_rtt(struct tfrc_tx_hist_entry *head, const u64 seqno, ...@@ -127,7 +125,6 @@ u32 tfrc_tx_hist_rtt(struct tfrc_tx_hist_entry *head, const u64 seqno,
return rtt; return rtt;
} }
EXPORT_SYMBOL_GPL(tfrc_tx_hist_rtt);
/* /*
...@@ -172,7 +169,6 @@ void tfrc_rx_hist_add_packet(struct tfrc_rx_hist *h, ...@@ -172,7 +169,6 @@ void tfrc_rx_hist_add_packet(struct tfrc_rx_hist *h,
tfrc_rx_hist_entry_from_skb(entry, skb, ndp); tfrc_rx_hist_entry_from_skb(entry, skb, ndp);
} }
EXPORT_SYMBOL_GPL(tfrc_rx_hist_add_packet);
/* has the packet contained in skb been seen before? */ /* has the packet contained in skb been seen before? */
int tfrc_rx_hist_duplicate(struct tfrc_rx_hist *h, struct sk_buff *skb) int tfrc_rx_hist_duplicate(struct tfrc_rx_hist *h, struct sk_buff *skb)
...@@ -189,7 +185,6 @@ int tfrc_rx_hist_duplicate(struct tfrc_rx_hist *h, struct sk_buff *skb) ...@@ -189,7 +185,6 @@ int tfrc_rx_hist_duplicate(struct tfrc_rx_hist *h, struct sk_buff *skb)
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(tfrc_rx_hist_duplicate);
static void tfrc_rx_hist_swap(struct tfrc_rx_hist *h, const u8 a, const u8 b) static void tfrc_rx_hist_swap(struct tfrc_rx_hist *h, const u8 a, const u8 b)
{ {
...@@ -390,7 +385,6 @@ int tfrc_rx_handle_loss(struct tfrc_rx_hist *h, ...@@ -390,7 +385,6 @@ int tfrc_rx_handle_loss(struct tfrc_rx_hist *h,
} }
return is_new_loss; return is_new_loss;
} }
EXPORT_SYMBOL_GPL(tfrc_rx_handle_loss);
int tfrc_rx_hist_alloc(struct tfrc_rx_hist *h) int tfrc_rx_hist_alloc(struct tfrc_rx_hist *h)
{ {
...@@ -412,7 +406,6 @@ out_free: ...@@ -412,7 +406,6 @@ out_free:
} }
return -ENOBUFS; return -ENOBUFS;
} }
EXPORT_SYMBOL_GPL(tfrc_rx_hist_alloc);
void tfrc_rx_hist_purge(struct tfrc_rx_hist *h) void tfrc_rx_hist_purge(struct tfrc_rx_hist *h)
{ {
...@@ -424,7 +417,6 @@ void tfrc_rx_hist_purge(struct tfrc_rx_hist *h) ...@@ -424,7 +417,6 @@ void tfrc_rx_hist_purge(struct tfrc_rx_hist *h)
h->ring[i] = NULL; h->ring[i] = NULL;
} }
} }
EXPORT_SYMBOL_GPL(tfrc_rx_hist_purge);
/** /**
* tfrc_rx_hist_rtt_last_s - reference entry to compute RTT samples against * tfrc_rx_hist_rtt_last_s - reference entry to compute RTT samples against
...@@ -495,4 +487,3 @@ keep_ref_for_next_time: ...@@ -495,4 +487,3 @@ keep_ref_for_next_time:
return sample; return sample;
} }
EXPORT_SYMBOL_GPL(tfrc_rx_hist_sample_rtt);
/* /*
* TFRC: main module holding the pieces of the TFRC library together * TFRC library initialisation
* *
* Copyright (c) 2007 The University of Aberdeen, Scotland, UK * Copyright (c) 2007 The University of Aberdeen, Scotland, UK
* Copyright (c) 2007 Arnaldo Carvalho de Melo <acme@redhat.com> * Copyright (c) 2007 Arnaldo Carvalho de Melo <acme@redhat.com>
*/ */
#include <linux/module.h>
#include <linux/moduleparam.h>
#include "tfrc.h" #include "tfrc.h"
#ifdef CONFIG_IP_DCCP_TFRC_DEBUG #ifdef CONFIG_IP_DCCP_TFRC_DEBUG
int tfrc_debug; int tfrc_debug;
module_param(tfrc_debug, bool, 0644); module_param(tfrc_debug, bool, 0644);
MODULE_PARM_DESC(tfrc_debug, "Enable debug messages"); MODULE_PARM_DESC(tfrc_debug, "Enable TFRC debug messages");
#endif #endif
static int __init tfrc_module_init(void) int __init tfrc_lib_init(void)
{ {
int rc = tfrc_li_init(); int rc = tfrc_li_init();
...@@ -38,18 +36,9 @@ out: ...@@ -38,18 +36,9 @@ out:
return rc; return rc;
} }
static void __exit tfrc_module_exit(void) void __exit tfrc_lib_exit(void)
{ {
tfrc_rx_packet_history_exit(); tfrc_rx_packet_history_exit();
tfrc_tx_packet_history_exit(); tfrc_tx_packet_history_exit();
tfrc_li_exit(); tfrc_li_exit();
} }
module_init(tfrc_module_init);
module_exit(tfrc_module_exit);
MODULE_AUTHOR("Gerrit Renker <gerrit@erg.abdn.ac.uk>, "
"Ian McDonald <ian.mcdonald@jandi.co.nz>, "
"Arnaldo Carvalho de Melo <acme@redhat.com>");
MODULE_DESCRIPTION("DCCP TFRC library");
MODULE_LICENSE("GPL");
...@@ -17,7 +17,8 @@ ...@@ -17,7 +17,8 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/math64.h> #include <linux/math64.h>
#include "../../dccp.h" #include "../../dccp.h"
/* internal includes that this module exports: */
/* internal includes that this library exports: */
#include "loss_interval.h" #include "loss_interval.h"
#include "packet_history.h" #include "packet_history.h"
...@@ -66,4 +67,12 @@ extern void tfrc_rx_packet_history_exit(void); ...@@ -66,4 +67,12 @@ extern void tfrc_rx_packet_history_exit(void);
extern int tfrc_li_init(void); extern int tfrc_li_init(void);
extern void tfrc_li_exit(void); extern void tfrc_li_exit(void);
#ifdef CONFIG_IP_DCCP_TFRC_LIB
extern int tfrc_lib_init(void);
extern void tfrc_lib_exit(void);
#else
#define tfrc_lib_init() (0)
#define tfrc_lib_exit()
#endif
#endif /* _TFRC_H_ */ #endif /* _TFRC_H_ */
...@@ -659,8 +659,6 @@ u32 tfrc_calc_x(u16 s, u32 R, u32 p) ...@@ -659,8 +659,6 @@ u32 tfrc_calc_x(u16 s, u32 R, u32 p)
return scaled_div32(result, f); return scaled_div32(result, f);
} }
EXPORT_SYMBOL_GPL(tfrc_calc_x);
/** /**
* tfrc_calc_x_reverse_lookup - try to find p given f(p) * tfrc_calc_x_reverse_lookup - try to find p given f(p)
* *
...@@ -693,5 +691,3 @@ u32 tfrc_calc_x_reverse_lookup(u32 fvalue) ...@@ -693,5 +691,3 @@ u32 tfrc_calc_x_reverse_lookup(u32 fvalue)
index = tfrc_binsearch(fvalue, 0); index = tfrc_binsearch(fvalue, 0);
return (index + 1) * 1000000 / TFRC_CALC_X_ARRSIZE; return (index + 1) * 1000000 / TFRC_CALC_X_ARRSIZE;
} }
EXPORT_SYMBOL_GPL(tfrc_calc_x_reverse_lookup);
...@@ -1214,8 +1214,6 @@ const char *dccp_feat_typename(const u8 type) ...@@ -1214,8 +1214,6 @@ const char *dccp_feat_typename(const u8 type)
return NULL; return NULL;
} }
EXPORT_SYMBOL_GPL(dccp_feat_typename);
const char *dccp_feat_name(const u8 feat) const char *dccp_feat_name(const u8 feat)
{ {
static const char *feature_names[] = { static const char *feature_names[] = {
...@@ -1240,6 +1238,4 @@ const char *dccp_feat_name(const u8 feat) ...@@ -1240,6 +1238,4 @@ const char *dccp_feat_name(const u8 feat)
return feature_names[feat]; return feature_names[feat];
} }
EXPORT_SYMBOL_GPL(dccp_feat_name);
#endif /* CONFIG_IP_DCCP_DEBUG */ #endif /* CONFIG_IP_DCCP_DEBUG */
...@@ -741,5 +741,3 @@ u32 dccp_sample_rtt(struct sock *sk, long delta) ...@@ -741,5 +741,3 @@ u32 dccp_sample_rtt(struct sock *sk, long delta)
return delta; return delta;
} }
EXPORT_SYMBOL_GPL(dccp_sample_rtt);
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