aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/neighbour.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/neighbour.c')
-rw-r--r--net/core/neighbour.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index 7bb6a9a1256..a16cf1ec5e5 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -834,12 +834,18 @@ static void neigh_timer_handler(unsigned long arg)
834 } 834 }
835 if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) { 835 if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) {
836 struct sk_buff *skb = skb_peek(&neigh->arp_queue); 836 struct sk_buff *skb = skb_peek(&neigh->arp_queue);
837 837 /* keep skb alive even if arp_queue overflows */
838 if (skb)
839 skb_get(skb);
840 write_unlock(&neigh->lock);
838 neigh->ops->solicit(neigh, skb); 841 neigh->ops->solicit(neigh, skb);
839 atomic_inc(&neigh->probes); 842 atomic_inc(&neigh->probes);
840 } 843 if (skb)
844 kfree_skb(skb);
845 } else {
841out: 846out:
842 write_unlock(&neigh->lock); 847 write_unlock(&neigh->lock);
848 }
843 849
844 if (notify) 850 if (notify)
845 neigh_update_notify(neigh); 851 neigh_update_notify(neigh);