diff options
author | Daniel Lezcano <dlezcano@fr.ibm.com> | 2008-03-04 02:28:58 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-03-04 02:28:58 -0500 |
commit | 5b7c931dff03621ae7ac524c4fa280d4e5f187a4 (patch) | |
tree | 9b3eda8e34816c0ac45cff8ce73d19f6bd11b4dd /net/ipv6/ndisc.c | |
parent | f3db48517f59133610f558f29de8834d7b007691 (diff) |
[NETNS][IPV6] ip6_fib - add net to gc timer parameter
The fib tables are now relative to the network namespace. When the
garbage collector timer expires, we must have a network namespace
parameter in order to retrieve the tables. For now this is the
init_net, but we should be able to have a timer per namespace and use
the timer callback parameter to pass the network namespace from the
expired timer.
The timer callback, fib6_run_gc, is actually used to be called
synchronously by some functions and asynchronously when the timer
expires.
When the timer expires, the delay specified for fib6_run_gc parameter
is always zero. So, I changed fib6_run_gc to not be a timer callback
but a function called by the timer callback and I added a timer
callback where its work is just to retrieve from the data arg of the
timer the network namespace and call fib6_run_gc with zero expiring
time and the network namespace parameters. That makes the code cleaner
for the fib6_run_gc callers.
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
Signed-off-by: Benjamin Thery <benjamin.thery@bull.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/ndisc.c')
-rw-r--r-- | net/ipv6/ndisc.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index eb322959a3e1..f1c95125100d 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -1598,6 +1598,7 @@ int ndisc_rcv(struct sk_buff *skb) | |||
1598 | static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, void *ptr) | 1598 | static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, void *ptr) |
1599 | { | 1599 | { |
1600 | struct net_device *dev = ptr; | 1600 | struct net_device *dev = ptr; |
1601 | struct net *net = dev->nd_net; | ||
1601 | 1602 | ||
1602 | if (dev->nd_net != &init_net) | 1603 | if (dev->nd_net != &init_net) |
1603 | return NOTIFY_DONE; | 1604 | return NOTIFY_DONE; |
@@ -1605,11 +1606,11 @@ static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, | |||
1605 | switch (event) { | 1606 | switch (event) { |
1606 | case NETDEV_CHANGEADDR: | 1607 | case NETDEV_CHANGEADDR: |
1607 | neigh_changeaddr(&nd_tbl, dev); | 1608 | neigh_changeaddr(&nd_tbl, dev); |
1608 | fib6_run_gc(~0UL); | 1609 | fib6_run_gc(~0UL, net); |
1609 | break; | 1610 | break; |
1610 | case NETDEV_DOWN: | 1611 | case NETDEV_DOWN: |
1611 | neigh_ifdown(&nd_tbl, dev); | 1612 | neigh_ifdown(&nd_tbl, dev); |
1612 | fib6_run_gc(~0UL); | 1613 | fib6_run_gc(~0UL, net); |
1613 | break; | 1614 | break; |
1614 | default: | 1615 | default: |
1615 | break; | 1616 | break; |