Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 315512
b: refs/heads/master
c: 1fe4c48
h: refs/heads/master
v: v3
  • Loading branch information
Yuchung Cheng authored and David S. Miller committed Jul 19, 2012
1 parent 59c688a commit 208ebbe
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 2100c8d2d9db23c0a09901a782bb4e3b21bee298
refs/heads/master: 1fe4c481ba637660793217769695c146a037bd54
4 changes: 4 additions & 0 deletions trunk/include/net/tcp.h
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,10 @@ extern void tcp_metrics_init(void);
extern bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst, bool paws_check);
extern bool tcp_remember_stamp(struct sock *sk);
extern bool tcp_tw_remember_stamp(struct inet_timewait_sock *tw);
extern void tcp_fastopen_cache_get(struct sock *sk, u16 *mss,
struct tcp_fastopen_cookie *cookie);
extern void tcp_fastopen_cache_set(struct sock *sk, u16 mss,
struct tcp_fastopen_cookie *cookie);
extern void tcp_fetch_timewait_stamp(struct sock *sk, struct dst_entry *dst);
extern void tcp_disable_fack(struct tcp_sock *tp);
extern void tcp_close(struct sock *sk, long timeout);
Expand Down
51 changes: 51 additions & 0 deletions trunk/net/ipv4/tcp_metrics.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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,
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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)
{
Expand Down

0 comments on commit 208ebbe

Please sign in to comment.