diff options
author | Eric Dumazet <edumazet@google.com> | 2012-07-15 21:41:36 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-07-17 01:12:00 -0400 |
commit | a6df1ae9383697c4eb1365176002f154982325ad (patch) | |
tree | 8afa8c1407bebeef9774dd673cef9d36efed07bd /net/ipv4/tcp_input.c | |
parent | 141e369de698f2e17bf716b83fcc647ddcb2220c (diff) |
tcp: add OFO snmp counters
Add three SNMP TCP counters, to better track TCP behavior
at global stage (netstat -s), when packets are received
Out Of Order (OFO)
TCPOFOQueue : Number of packets queued in OFO queue
TCPOFODrop : Number of packets meant to be queued in OFO
but dropped because socket rcvbuf limit hit.
TCPOFOMerge : Number of packets in OFO that were merged with
other packets.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp_input.c')
-rw-r--r-- | net/ipv4/tcp_input.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 055ac49b8b4..cc4e12f1f2f 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -4397,8 +4397,8 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb) | |||
4397 | 4397 | ||
4398 | TCP_ECN_check_ce(tp, skb); | 4398 | TCP_ECN_check_ce(tp, skb); |
4399 | 4399 | ||
4400 | if (tcp_try_rmem_schedule(sk, skb->truesize)) { | 4400 | if (unlikely(tcp_try_rmem_schedule(sk, skb->truesize))) { |
4401 | /* TODO: should increment a counter */ | 4401 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPOFODROP); |
4402 | __kfree_skb(skb); | 4402 | __kfree_skb(skb); |
4403 | return; | 4403 | return; |
4404 | } | 4404 | } |
@@ -4407,6 +4407,7 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb) | |||
4407 | tp->pred_flags = 0; | 4407 | tp->pred_flags = 0; |
4408 | inet_csk_schedule_ack(sk); | 4408 | inet_csk_schedule_ack(sk); |
4409 | 4409 | ||
4410 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPOFOQUEUE); | ||
4410 | SOCK_DEBUG(sk, "out of order segment: rcv_next %X seq %X - %X\n", | 4411 | SOCK_DEBUG(sk, "out of order segment: rcv_next %X seq %X - %X\n", |
4411 | tp->rcv_nxt, TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb)->end_seq); | 4412 | tp->rcv_nxt, TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb)->end_seq); |
4412 | 4413 | ||
@@ -4460,6 +4461,7 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb) | |||
4460 | if (skb1 && before(seq, TCP_SKB_CB(skb1)->end_seq)) { | 4461 | if (skb1 && before(seq, TCP_SKB_CB(skb1)->end_seq)) { |
4461 | if (!after(end_seq, TCP_SKB_CB(skb1)->end_seq)) { | 4462 | if (!after(end_seq, TCP_SKB_CB(skb1)->end_seq)) { |
4462 | /* All the bits are present. Drop. */ | 4463 | /* All the bits are present. Drop. */ |
4464 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPOFOMERGE); | ||
4463 | __kfree_skb(skb); | 4465 | __kfree_skb(skb); |
4464 | skb = NULL; | 4466 | skb = NULL; |
4465 | tcp_dsack_set(sk, seq, end_seq); | 4467 | tcp_dsack_set(sk, seq, end_seq); |
@@ -4498,6 +4500,7 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb) | |||
4498 | __skb_unlink(skb1, &tp->out_of_order_queue); | 4500 | __skb_unlink(skb1, &tp->out_of_order_queue); |
4499 | tcp_dsack_extend(sk, TCP_SKB_CB(skb1)->seq, | 4501 | tcp_dsack_extend(sk, TCP_SKB_CB(skb1)->seq, |
4500 | TCP_SKB_CB(skb1)->end_seq); | 4502 | TCP_SKB_CB(skb1)->end_seq); |
4503 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPOFOMERGE); | ||
4501 | __kfree_skb(skb1); | 4504 | __kfree_skb(skb1); |
4502 | } | 4505 | } |
4503 | 4506 | ||