ipv6: Add infrastructure to bind inet_peer objects to routes.
They are only allowed on cached ipv6 routes. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
672f007d65
commit
b341936380
@ -21,6 +21,7 @@
|
|||||||
#include <net/dst.h>
|
#include <net/dst.h>
|
||||||
#include <net/flow.h>
|
#include <net/flow.h>
|
||||||
#include <net/netlink.h>
|
#include <net/netlink.h>
|
||||||
|
#include <net/inetpeer.h>
|
||||||
|
|
||||||
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
||||||
#define FIB6_TABLE_HASHSZ 256
|
#define FIB6_TABLE_HASHSZ 256
|
||||||
@ -109,6 +110,7 @@ struct rt6_info {
|
|||||||
u32 rt6i_metric;
|
u32 rt6i_metric;
|
||||||
|
|
||||||
struct inet6_dev *rt6i_idev;
|
struct inet6_dev *rt6i_idev;
|
||||||
|
struct inet_peer *rt6i_peer;
|
||||||
|
|
||||||
#ifdef CONFIG_XFRM
|
#ifdef CONFIG_XFRM
|
||||||
u32 rt6i_flow_cache_genid;
|
u32 rt6i_flow_cache_genid;
|
||||||
|
@ -56,6 +56,9 @@ static inline unsigned int rt6_flags2srcprefs(int flags)
|
|||||||
return (flags >> 3) & 7;
|
return (flags >> 3) & 7;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern void rt6_bind_peer(struct rt6_info *rt,
|
||||||
|
int create);
|
||||||
|
|
||||||
extern void ip6_route_input(struct sk_buff *skb);
|
extern void ip6_route_input(struct sk_buff *skb);
|
||||||
|
|
||||||
extern struct dst_entry * ip6_route_output(struct net *net,
|
extern struct dst_entry * ip6_route_output(struct net *net,
|
||||||
|
@ -532,6 +532,7 @@ static int compute_total(void)
|
|||||||
{
|
{
|
||||||
return v4_peers.total + v6_peers.total;
|
return v4_peers.total + v6_peers.total;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(inet_getpeer);
|
||||||
|
|
||||||
/* Called with local BH disabled. */
|
/* Called with local BH disabled. */
|
||||||
static void peer_check_expire(unsigned long dummy)
|
static void peer_check_expire(unsigned long dummy)
|
||||||
@ -577,3 +578,4 @@ void inet_putpeer(struct inet_peer *p)
|
|||||||
|
|
||||||
local_bh_enable();
|
local_bh_enable();
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(inet_putpeer);
|
||||||
|
@ -188,11 +188,29 @@ static void ip6_dst_destroy(struct dst_entry *dst)
|
|||||||
{
|
{
|
||||||
struct rt6_info *rt = (struct rt6_info *)dst;
|
struct rt6_info *rt = (struct rt6_info *)dst;
|
||||||
struct inet6_dev *idev = rt->rt6i_idev;
|
struct inet6_dev *idev = rt->rt6i_idev;
|
||||||
|
struct inet_peer *peer = rt->rt6i_peer;
|
||||||
|
|
||||||
if (idev != NULL) {
|
if (idev != NULL) {
|
||||||
rt->rt6i_idev = NULL;
|
rt->rt6i_idev = NULL;
|
||||||
in6_dev_put(idev);
|
in6_dev_put(idev);
|
||||||
}
|
}
|
||||||
|
if (peer) {
|
||||||
|
BUG_ON(!(rt->rt6i_flags & RTF_CACHE));
|
||||||
|
rt->rt6i_peer = NULL;
|
||||||
|
inet_putpeer(peer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void rt6_bind_peer(struct rt6_info *rt, int create)
|
||||||
|
{
|
||||||
|
struct inet_peer *peer;
|
||||||
|
|
||||||
|
if (WARN_ON(!(rt->rt6i_flags & RTF_CACHE)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
peer = inet_getpeer_v6(&rt->rt6i_dst.addr, create);
|
||||||
|
if (peer && cmpxchg(&rt->rt6i_peer, NULL, peer) != NULL)
|
||||||
|
inet_putpeer(peer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
|
static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
|
||||||
|
Loading…
Reference in New Issue
Block a user