rpms/kernel/F-10 linux-2.6-neigh_-fix-state-transition-INCOMPLETE-_FAILED-via-Netlink-request.patch, NONE, 1.1 kernel.spec, 1.1379, 1.1380
John W. Linville
linville at fedoraproject.org
Mon Jun 15 14:36:40 UTC 2009
Author: linville
Update of /cvs/pkgs/rpms/kernel/F-10
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv4700
Modified Files:
kernel.spec
Added Files:
linux-2.6-neigh_-fix-state-transition-INCOMPLETE-_FAILED-via-Netlink-request.patch
Log Message:
Enable the userspace ARP daemon (#502844) ; neigh: fix state transition INCOMPLETE->FAILED via Netlink request
linux-2.6-neigh_-fix-state-transition-INCOMPLETE-_FAILED-via-Netlink-request.patch:
--- NEW FILE linux-2.6-neigh_-fix-state-transition-INCOMPLETE-_FAILED-via-Netlink-request.patch ---
commit 5ef12d98a19254ee5dc851bd83e214b43ec1f725
Author: Timo Teras <timo.teras at iki.fi>
Date: Thu Jun 11 04:16:28 2009 -0700
neigh: fix state transition INCOMPLETE->FAILED via Netlink request
The current code errors out the INCOMPLETE neigh entry skb queue only from
the timer if maximum probes have been attempted and there has been no reply.
This also causes the transtion to FAILED state.
However, the neigh entry can be also updated via Netlink to inform that the
address is unavailable. Currently, neigh_update() just stops the timers and
leaves the pending skb's unreleased. This results that the clean up code in
the timer callback is never called, preventing also proper garbage collection.
This fixes neigh_update() to process the pending skb queue immediately if
INCOMPLETE -> FAILED state transtion occurs due to a Netlink request.
Signed-off-by: Timo Teras <timo.teras at iki.fi>
Signed-off-by: David S. Miller <davem at davemloft.net>
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index c54229b..163b4f5 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -771,6 +771,28 @@ static __inline__ int neigh_max_probes(struct neighbour *n)
p->ucast_probes + p->app_probes + p->mcast_probes);
}
+static void neigh_invalidate(struct neighbour *neigh)
+{
+ struct sk_buff *skb;
+
+ NEIGH_CACHE_STAT_INC(neigh->tbl, res_failed);
+ NEIGH_PRINTK2("neigh %p is failed.\n", neigh);
+ neigh->updated = jiffies;
+
+ /* It is very thin place. report_unreachable is very complicated
+ routine. Particularly, it can hit the same neighbour entry!
+
+ So that, we try to be accurate and avoid dead loop. --ANK
+ */
+ while (neigh->nud_state == NUD_FAILED &&
+ (skb = __skb_dequeue(&neigh->arp_queue)) != NULL) {
+ write_unlock(&neigh->lock);
+ neigh->ops->error_report(neigh, skb);
+ write_lock(&neigh->lock);
+ }
+ skb_queue_purge(&neigh->arp_queue);
+}
+
/* Called when a timer expires for a neighbour entry. */
static void neigh_timer_handler(unsigned long arg)
@@ -835,26 +857,9 @@ static void neigh_timer_handler(unsigned long arg)
if ((neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) &&
atomic_read(&neigh->probes) >= neigh_max_probes(neigh)) {
- struct sk_buff *skb;
-
neigh->nud_state = NUD_FAILED;
- neigh->updated = jiffies;
notify = 1;
- NEIGH_CACHE_STAT_INC(neigh->tbl, res_failed);
- NEIGH_PRINTK2("neigh %p is failed.\n", neigh);
-
- /* It is very thin place. report_unreachable is very complicated
- routine. Particularly, it can hit the same neighbour entry!
-
- So that, we try to be accurate and avoid dead loop. --ANK
- */
- while (neigh->nud_state == NUD_FAILED &&
- (skb = __skb_dequeue(&neigh->arp_queue)) != NULL) {
- write_unlock(&neigh->lock);
- neigh->ops->error_report(neigh, skb);
- write_lock(&neigh->lock);
- }
- skb_queue_purge(&neigh->arp_queue);
+ neigh_invalidate(neigh);
}
if (neigh->nud_state & NUD_IN_TIMER) {
@@ -1001,6 +1006,11 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
neigh->nud_state = new;
err = 0;
notify = old & NUD_VALID;
+ if ((old & (NUD_INCOMPLETE | NUD_PROBE)) &&
+ (new & NUD_FAILED)) {
+ neigh_invalidate(neigh);
+ notify = 1;
+ }
goto out;
}
Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-10/kernel.spec,v
retrieving revision 1.1379
retrieving revision 1.1380
diff -u -p -r1.1379 -r1.1380
--- kernel.spec 5 Jun 2009 06:22:21 -0000 1.1379
+++ kernel.spec 15 Jun 2009 14:36:05 -0000 1.1380
@@ -662,6 +662,8 @@ Patch685: linux-2.6-iwl3945-use-cancel_d
Patch686: linux-2.6-mac80211-fix-beacon-loss-detection-after-scan.patch
Patch687: mac80211-don-t-drop-nullfunc-frames-during-software.patch
+Patch1000: linux-2.6-neigh_-fix-state-transition-INCOMPLETE-_FAILED-via-Netlink-request.patch
+
Patch1515: linux-2.6.29-lirc.patch
Patch1520: linux-2.6-hdpvr.patch
@@ -1342,6 +1344,9 @@ ApplyPatch linux-2.6-mac80211-fix-beacon
ApplyPatch mac80211-don-t-drop-nullfunc-frames-during-software.patch
+# neigh: fix state transition INCOMPLETE->FAILED via Netlink request
+ApplyPatch linux-2.6-neigh_-fix-state-transition-INCOMPLETE-_FAILED-via-Netlink-request.patch
+
# http://www.lirc.org/
ApplyPatch linux-2.6.29-lirc.patch
# http://hg.jannau.net/hdpvr/
@@ -1998,6 +2003,10 @@ fi
%kernel_variant_files -k vmlinux %{with_kdump} kdump
%changelog
+* Mon Jun 15 2009 John W. Linville <linville at redhat.com> 2.6.29.4-80
+- Enable the userspace ARP daemon (#502844)
+- neigh: fix state transition INCOMPLETE->FAILED via Netlink request
+
* Fri Jun 05 2009 Chuck Ebbert <cebbert at redhat.com> 2.6.29.4-79
- Fix the parport sysctl registration bug (F11#503773)
linux-2.6-parport-quickfix-the-proc-registration-bug.patch
More information about the fedora-extras-commits
mailing list