|
@@ -30,6 +30,11 @@ enum tcp_metric_index {
|
|
|
TCP_METRIC_MAX,
|
|
|
};
|
|
|
|
|
|
+struct tcp_fastopen_metrics {
|
|
|
+ u16 mss;
|
|
|
+ struct tcp_fastopen_cookie cookie;
|
|
|
+};
|
|
|
+
|
|
|
struct tcp_metrics_block {
|
|
|
struct tcp_metrics_block __rcu *tcpm_next;
|
|
|
struct inetpeer_addr tcpm_addr;
|
|
@@ -38,6 +43,7 @@ struct tcp_metrics_block {
|
|
|
u32 tcpm_ts_stamp;
|
|
|
u32 tcpm_lock;
|
|
|
u32 tcpm_vals[TCP_METRIC_MAX];
|
|
|
+ struct tcp_fastopen_metrics tcpm_fastopen;
|
|
|
};
|
|
|
|
|
|
static bool tcp_metric_locked(struct tcp_metrics_block *tm,
|
|
@@ -118,6 +124,8 @@ static void tcpm_suck_dst(struct tcp_metrics_block *tm, struct dst_entry *dst)
|
|
|
tm->tcpm_vals[TCP_METRIC_REORDERING] = dst_metric_raw(dst, RTAX_REORDERING);
|
|
|
tm->tcpm_ts = 0;
|
|
|
tm->tcpm_ts_stamp = 0;
|
|
|
+ tm->tcpm_fastopen.mss = 0;
|
|
|
+ tm->tcpm_fastopen.cookie.len = 0;
|
|
|
}
|
|
|
|
|
|
static struct tcp_metrics_block *tcpm_new(struct dst_entry *dst,
|
|
@@ -633,6 +641,49 @@ bool tcp_tw_remember_stamp(struct inet_timewait_sock *tw)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static DEFINE_SEQLOCK(fastopen_seqlock);
|
|
|
+
|
|
|
+void tcp_fastopen_cache_get(struct sock *sk, u16 *mss,
|
|
|
+ struct tcp_fastopen_cookie *cookie)
|
|
|
+{
|
|
|
+ struct tcp_metrics_block *tm;
|
|
|
+
|
|
|
+ rcu_read_lock();
|
|
|
+ tm = tcp_get_metrics(sk, __sk_dst_get(sk), false);
|
|
|
+ if (tm) {
|
|
|
+ struct tcp_fastopen_metrics *tfom = &tm->tcpm_fastopen;
|
|
|
+ unsigned int seq;
|
|
|
+
|
|
|
+ do {
|
|
|
+ seq = read_seqbegin(&fastopen_seqlock);
|
|
|
+ if (tfom->mss)
|
|
|
+ *mss = tfom->mss;
|
|
|
+ *cookie = tfom->cookie;
|
|
|
+ } while (read_seqretry(&fastopen_seqlock, seq));
|
|
|
+ }
|
|
|
+ rcu_read_unlock();
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void tcp_fastopen_cache_set(struct sock *sk, u16 mss,
|
|
|
+ struct tcp_fastopen_cookie *cookie)
|
|
|
+{
|
|
|
+ struct tcp_metrics_block *tm;
|
|
|
+
|
|
|
+ rcu_read_lock();
|
|
|
+ tm = tcp_get_metrics(sk, __sk_dst_get(sk), true);
|
|
|
+ if (tm) {
|
|
|
+ struct tcp_fastopen_metrics *tfom = &tm->tcpm_fastopen;
|
|
|
+
|
|
|
+ write_seqlock_bh(&fastopen_seqlock);
|
|
|
+ tfom->mss = mss;
|
|
|
+ if (cookie->len > 0)
|
|
|
+ tfom->cookie = *cookie;
|
|
|
+ write_sequnlock_bh(&fastopen_seqlock);
|
|
|
+ }
|
|
|
+ rcu_read_unlock();
|
|
|
+}
|
|
|
+
|
|
|
static unsigned long tcpmhash_entries;
|
|
|
static int __init set_tcpmhash_entries(char *str)
|
|
|
{
|