Commit f52e4b27 authored by Tom Parkin's avatar Tom Parkin Committed by David S. Miller

l2tp: fix up inconsistent rx/tx statistics

Historically L2TP core statistics count the L2TP header in the
per-session and per-tunnel byte counts tracked for transmission and
receipt.

Now that l2tp_xmit_skb updates tx stats, it is necessary for
l2tp_xmit_core to pass out the length of the transmitted packet so that
the statistics can be updated correctly.
Signed-off-by: default avatarTom Parkin <tparkin@katalix.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a9fd686a
...@@ -1006,7 +1006,7 @@ static int l2tp_xmit_queue(struct l2tp_tunnel *tunnel, struct sk_buff *skb, stru ...@@ -1006,7 +1006,7 @@ static int l2tp_xmit_queue(struct l2tp_tunnel *tunnel, struct sk_buff *skb, stru
return err >= 0 ? NET_XMIT_SUCCESS : NET_XMIT_DROP; return err >= 0 ? NET_XMIT_SUCCESS : NET_XMIT_DROP;
} }
static int l2tp_xmit_core(struct l2tp_session *session, struct sk_buff *skb) static int l2tp_xmit_core(struct l2tp_session *session, struct sk_buff *skb, unsigned int *len)
{ {
struct l2tp_tunnel *tunnel = session->tunnel; struct l2tp_tunnel *tunnel = session->tunnel;
unsigned int data_len = skb->len; unsigned int data_len = skb->len;
...@@ -1054,6 +1054,11 @@ static int l2tp_xmit_core(struct l2tp_session *session, struct sk_buff *skb) ...@@ -1054,6 +1054,11 @@ static int l2tp_xmit_core(struct l2tp_session *session, struct sk_buff *skb)
goto out_unlock; goto out_unlock;
} }
/* Report transmitted length before we add encap header, which keeps
* statistics consistent for both UDP and IP encap tx/rx paths.
*/
*len = skb->len;
inet = inet_sk(sk); inet = inet_sk(sk);
switch (tunnel->encap) { switch (tunnel->encap) {
case L2TP_ENCAPTYPE_UDP: case L2TP_ENCAPTYPE_UDP:
...@@ -1095,10 +1100,10 @@ static int l2tp_xmit_core(struct l2tp_session *session, struct sk_buff *skb) ...@@ -1095,10 +1100,10 @@ static int l2tp_xmit_core(struct l2tp_session *session, struct sk_buff *skb)
*/ */
int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb) int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb)
{ {
unsigned int len = skb->len; unsigned int len = 0;
int ret; int ret;
ret = l2tp_xmit_core(session, skb); ret = l2tp_xmit_core(session, skb, &len);
if (ret == NET_XMIT_SUCCESS) { if (ret == NET_XMIT_SUCCESS) {
atomic_long_inc(&session->tunnel->stats.tx_packets); atomic_long_inc(&session->tunnel->stats.tx_packets);
atomic_long_add(len, &session->tunnel->stats.tx_bytes); atomic_long_add(len, &session->tunnel->stats.tx_bytes);
......
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