mirror of
https://git.yoctoproject.org/meta-ti
synced 2026-07-16 22:38:04 +00:00
7df8fc578b
Signed-off-by: Koen Kooi <koen@dominion.thruhere.net> Signed-off-by: Denys Dmytriyenko <denys@ti.com>
91 lines
3.1 KiB
Diff
91 lines
3.1 KiB
Diff
From 486667d032b8183f75da22b245635debbfa381ca Mon Sep 17 00:00:00 2001
|
|
From: Ben McKeegan <ben@netservers.co.uk>
|
|
Date: Fri, 24 Feb 2012 06:33:56 +0000
|
|
Subject: [PATCH 17/42] ppp: fix 'ppp_mp_reconstruct bad seq' errors
|
|
|
|
[ Upstream commit 8a49ad6e89feb5015e77ce6efeb2678947117e20 ]
|
|
|
|
This patch fixes a (mostly cosmetic) bug introduced by the patch
|
|
'ppp: Use SKB queue abstraction interfaces in fragment processing'
|
|
found here: http://www.spinics.net/lists/netdev/msg153312.html
|
|
|
|
The above patch rewrote and moved the code responsible for cleaning
|
|
up discarded fragments but the new code does not catch every case
|
|
where this is necessary. This results in some discarded fragments
|
|
remaining in the queue, and triggering a 'bad seq' error on the
|
|
subsequent call to ppp_mp_reconstruct. Fragments are discarded
|
|
whenever other fragments of the same frame have been lost.
|
|
This can generate a lot of unwanted and misleading log messages.
|
|
|
|
This patch also adds additional detail to the debug logging to
|
|
make it clearer which fragments were lost and which other fragments
|
|
were discarded as a result of losses. (Run pppd with 'kdebug 1'
|
|
option to enable debug logging.)
|
|
|
|
Signed-off-by: Ben McKeegan <ben@netservers.co.uk>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
---
|
|
drivers/net/ppp/ppp_generic.c | 23 +++++++++++++++++++++++
|
|
1 file changed, 23 insertions(+)
|
|
|
|
diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c
|
|
index edfa15d..486b404 100644
|
|
--- a/drivers/net/ppp/ppp_generic.c
|
|
+++ b/drivers/net/ppp/ppp_generic.c
|
|
@@ -2024,14 +2024,22 @@ ppp_mp_reconstruct(struct ppp *ppp)
|
|
continue;
|
|
}
|
|
if (PPP_MP_CB(p)->sequence != seq) {
|
|
+ u32 oldseq;
|
|
/* Fragment `seq' is missing. If it is after
|
|
minseq, it might arrive later, so stop here. */
|
|
if (seq_after(seq, minseq))
|
|
break;
|
|
/* Fragment `seq' is lost, keep going. */
|
|
lost = 1;
|
|
+ oldseq = seq;
|
|
seq = seq_before(minseq, PPP_MP_CB(p)->sequence)?
|
|
minseq + 1: PPP_MP_CB(p)->sequence;
|
|
+
|
|
+ if (ppp->debug & 1)
|
|
+ netdev_printk(KERN_DEBUG, ppp->dev,
|
|
+ "lost frag %u..%u\n",
|
|
+ oldseq, seq-1);
|
|
+
|
|
goto again;
|
|
}
|
|
|
|
@@ -2076,6 +2084,10 @@ ppp_mp_reconstruct(struct ppp *ppp)
|
|
struct sk_buff *tmp2;
|
|
|
|
skb_queue_reverse_walk_from_safe(list, p, tmp2) {
|
|
+ if (ppp->debug & 1)
|
|
+ netdev_printk(KERN_DEBUG, ppp->dev,
|
|
+ "discarding frag %u\n",
|
|
+ PPP_MP_CB(p)->sequence);
|
|
__skb_unlink(p, list);
|
|
kfree_skb(p);
|
|
}
|
|
@@ -2091,6 +2103,17 @@ ppp_mp_reconstruct(struct ppp *ppp)
|
|
/* If we have discarded any fragments,
|
|
signal a receive error. */
|
|
if (PPP_MP_CB(head)->sequence != ppp->nextseq) {
|
|
+ skb_queue_walk_safe(list, p, tmp) {
|
|
+ if (p == head)
|
|
+ break;
|
|
+ if (ppp->debug & 1)
|
|
+ netdev_printk(KERN_DEBUG, ppp->dev,
|
|
+ "discarding frag %u\n",
|
|
+ PPP_MP_CB(p)->sequence);
|
|
+ __skb_unlink(p, list);
|
|
+ kfree_skb(p);
|
|
+ }
|
|
+
|
|
if (ppp->debug & 1)
|
|
netdev_printk(KERN_DEBUG, ppp->dev,
|
|
" missed pkts %u..%u\n",
|
|
--
|
|
1.7.9.4
|
|
|