mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
neigh: Convert over to dst_neigh_lookup_skb().
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
f9d751667f
commit
13a43d94ab
1 changed files with 16 additions and 3 deletions
|
@ -1201,10 +1201,23 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
|
|||
write_unlock_bh(&neigh->lock);
|
||||
|
||||
rcu_read_lock();
|
||||
/* On shaper/eql skb->dst->neighbour != neigh :( */
|
||||
if (dst && (n2 = dst_get_neighbour_noref(dst)) != NULL)
|
||||
n1 = n2;
|
||||
|
||||
/* Why not just use 'neigh' as-is? The problem is that
|
||||
* things such as shaper, eql, and sch_teql can end up
|
||||
* using alternative, different, neigh objects to output
|
||||
* the packet in the output path. So what we need to do
|
||||
* here is re-lookup the top-level neigh in the path so
|
||||
* we can reinject the packet there.
|
||||
*/
|
||||
n2 = NULL;
|
||||
if (dst) {
|
||||
n2 = dst_neigh_lookup_skb(dst, skb);
|
||||
if (n2)
|
||||
n1 = n2;
|
||||
}
|
||||
n1->output(n1, skb);
|
||||
if (n2)
|
||||
neigh_release(n2);
|
||||
rcu_read_unlock();
|
||||
|
||||
write_lock_bh(&neigh->lock);
|
||||
|
|
Loading…
Reference in a new issue