Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 78631
b: refs/heads/master
c: 0e3a480
h: refs/heads/master
i:
  78629: 3caf9ca
  78627: 86a8ec5
  78623: 21a6a50
v: v3
  • Loading branch information
Ilpo Järvinen authored and David S. Miller committed Jan 28, 2008
1 parent ded53a4 commit 3ef38b3
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 27 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7ffc49a6ee92b7138c2ee28073a8e10e58335d62
refs/heads/master: 0e3a4803aa06cd7bc2cfc1d04289df4f6027640a
51 changes: 25 additions & 26 deletions trunk/net/ipv4/tcp_output.c
Original file line number Diff line number Diff line change
Expand Up @@ -1017,13 +1017,29 @@ static void tcp_cwnd_validate(struct sock *sk)
}
}

static unsigned int tcp_window_allows(struct tcp_sock *tp, struct sk_buff *skb, unsigned int mss_now, unsigned int cwnd)
/* Returns the portion of skb which can be sent right away without
* introducing MSS oddities to segment boundaries. In rare cases where
* mss_now != mss_cache, we will request caller to create a small skb
* per input skb which could be mostly avoided here (if desired).
*/
static unsigned int tcp_mss_split_point(struct sock *sk, struct sk_buff *skb,
unsigned int mss_now,
unsigned int cwnd)
{
u32 window, cwnd_len;
struct tcp_sock *tp = tcp_sk(sk);
u32 needed, window, cwnd_len;

window = (tp->snd_una + tp->snd_wnd - TCP_SKB_CB(skb)->seq);
cwnd_len = mss_now * cwnd;
return min(window, cwnd_len);

if (likely(cwnd_len <= window && skb != tcp_write_queue_tail(sk)))
return cwnd_len;

if (skb == tcp_write_queue_tail(sk) && cwnd_len <= skb->len)
return cwnd_len;

needed = min(skb->len, window);
return needed - needed % mss_now;
}

/* Can at least one segment of SKB be sent right now, according to the
Expand Down Expand Up @@ -1458,17 +1474,9 @@ static int tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle)
}

limit = mss_now;
if (tso_segs > 1) {
limit = tcp_window_allows(tp, skb,
mss_now, cwnd_quota);

if (skb->len < limit) {
unsigned int trim = skb->len % mss_now;

if (trim)
limit = skb->len - trim;
}
}
if (tso_segs > 1)
limit = tcp_mss_split_point(sk, skb, mss_now,
cwnd_quota);

if (skb->len > limit &&
unlikely(tso_fragment(sk, skb, limit, mss_now)))
Expand Down Expand Up @@ -1515,7 +1523,6 @@ void __tcp_push_pending_frames(struct sock *sk, unsigned int cur_mss,
*/
void tcp_push_one(struct sock *sk, unsigned int mss_now)
{
struct tcp_sock *tp = tcp_sk(sk);
struct sk_buff *skb = tcp_send_head(sk);
unsigned int tso_segs, cwnd_quota;

Expand All @@ -1530,17 +1537,9 @@ void tcp_push_one(struct sock *sk, unsigned int mss_now)
BUG_ON(!tso_segs);

limit = mss_now;
if (tso_segs > 1) {
limit = tcp_window_allows(tp, skb,
mss_now, cwnd_quota);

if (skb->len < limit) {
unsigned int trim = skb->len % mss_now;

if (trim)
limit = skb->len - trim;
}
}
if (tso_segs > 1)
limit = tcp_mss_split_point(sk, skb, mss_now,
cwnd_quota);

if (skb->len > limit &&
unlikely(tso_fragment(sk, skb, limit, mss_now)))
Expand Down

0 comments on commit 3ef38b3

Please sign in to comment.