Merge master.kernel.org:/pub/scm/linux/kernel/git/acme/net-2.6
This commit is contained in:
commit
9092b20803
1 changed files with 16 additions and 32 deletions
|
@ -175,39 +175,10 @@ static void pneigh_queue_purge(struct sk_buff_head *list)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev)
|
static void neigh_flush_dev(struct neigh_table *tbl, struct net_device *dev)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
write_lock_bh(&tbl->lock);
|
|
||||||
|
|
||||||
for (i=0; i <= tbl->hash_mask; i++) {
|
|
||||||
struct neighbour *n, **np;
|
|
||||||
|
|
||||||
np = &tbl->hash_buckets[i];
|
|
||||||
while ((n = *np) != NULL) {
|
|
||||||
if (dev && n->dev != dev) {
|
|
||||||
np = &n->next;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
*np = n->next;
|
|
||||||
write_lock_bh(&n->lock);
|
|
||||||
n->dead = 1;
|
|
||||||
neigh_del_timer(n);
|
|
||||||
write_unlock_bh(&n->lock);
|
|
||||||
neigh_release(n);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
write_unlock_bh(&tbl->lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
write_lock_bh(&tbl->lock);
|
|
||||||
|
|
||||||
for (i = 0; i <= tbl->hash_mask; i++) {
|
for (i = 0; i <= tbl->hash_mask; i++) {
|
||||||
struct neighbour *n, **np = &tbl->hash_buckets[i];
|
struct neighbour *n, **np = &tbl->hash_buckets[i];
|
||||||
|
|
||||||
|
@ -243,7 +214,19 @@ int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev)
|
||||||
neigh_release(n);
|
neigh_release(n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev)
|
||||||
|
{
|
||||||
|
write_lock_bh(&tbl->lock);
|
||||||
|
neigh_flush_dev(tbl, dev);
|
||||||
|
write_unlock_bh(&tbl->lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev)
|
||||||
|
{
|
||||||
|
write_lock_bh(&tbl->lock);
|
||||||
|
neigh_flush_dev(tbl, dev);
|
||||||
pneigh_ifdown(tbl, dev);
|
pneigh_ifdown(tbl, dev);
|
||||||
write_unlock_bh(&tbl->lock);
|
write_unlock_bh(&tbl->lock);
|
||||||
|
|
||||||
|
@ -732,6 +715,7 @@ static inline void neigh_add_timer(struct neighbour *n, unsigned long when)
|
||||||
if (unlikely(mod_timer(&n->timer, when))) {
|
if (unlikely(mod_timer(&n->timer, when))) {
|
||||||
printk("NEIGH: BUG, double timer add, state is %x\n",
|
printk("NEIGH: BUG, double timer add, state is %x\n",
|
||||||
n->nud_state);
|
n->nud_state);
|
||||||
|
dump_stack();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -815,10 +799,10 @@ static void neigh_timer_handler(unsigned long arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (neigh->nud_state & NUD_IN_TIMER) {
|
if (neigh->nud_state & NUD_IN_TIMER) {
|
||||||
neigh_hold(neigh);
|
|
||||||
if (time_before(next, jiffies + HZ/2))
|
if (time_before(next, jiffies + HZ/2))
|
||||||
next = jiffies + HZ/2;
|
next = jiffies + HZ/2;
|
||||||
neigh_add_timer(neigh, next);
|
if (!mod_timer(&neigh->timer, next))
|
||||||
|
neigh_hold(neigh);
|
||||||
}
|
}
|
||||||
if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) {
|
if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) {
|
||||||
struct sk_buff *skb = skb_peek(&neigh->arp_queue);
|
struct sk_buff *skb = skb_peek(&neigh->arp_queue);
|
||||||
|
|
Loading…
Add table
Reference in a new issue