netns: embed ip6_dst_ops directly
struct net::ipv6.ip6_dst_ops is separatedly dynamically allocated, but there is no fundamental reason for it. Embed it directly into struct netns_ipv6. For that: * move struct dst_ops into separate header to fix circular dependencies I honestly tried not to, it's pretty impossible to do other way * drop dynamical allocation, allocate together with netns For a change, remove struct dst_ops::dst_net, it's deducible by using container_of() given dst_ops pointer. Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
885a136c52
commit
86393e52c3
@ -8,6 +8,7 @@
|
||||
#ifndef _NET_DST_H
|
||||
#define _NET_DST_H
|
||||
|
||||
#include <net/dst_ops.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/rcupdate.h>
|
||||
@ -102,28 +103,6 @@ struct dst_entry
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
struct dst_ops
|
||||
{
|
||||
unsigned short family;
|
||||
__be16 protocol;
|
||||
unsigned gc_thresh;
|
||||
|
||||
int (*gc)(struct dst_ops *ops);
|
||||
struct dst_entry * (*check)(struct dst_entry *, __u32 cookie);
|
||||
void (*destroy)(struct dst_entry *);
|
||||
void (*ifdown)(struct dst_entry *,
|
||||
struct net_device *dev, int how);
|
||||
struct dst_entry * (*negative_advice)(struct dst_entry *);
|
||||
void (*link_failure)(struct sk_buff *);
|
||||
void (*update_pmtu)(struct dst_entry *dst, u32 mtu);
|
||||
int (*local_out)(struct sk_buff *skb);
|
||||
|
||||
atomic_t entries;
|
||||
struct kmem_cache *kmem_cachep;
|
||||
struct net *dst_net;
|
||||
};
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
static inline u32
|
||||
|
28
include/net/dst_ops.h
Normal file
28
include/net/dst_ops.h
Normal file
@ -0,0 +1,28 @@
|
||||
#ifndef _NET_DST_OPS_H
|
||||
#define _NET_DST_OPS_H
|
||||
#include <linux/types.h>
|
||||
|
||||
struct dst_entry;
|
||||
struct kmem_cachep;
|
||||
struct net_device;
|
||||
struct sk_buff;
|
||||
|
||||
struct dst_ops {
|
||||
unsigned short family;
|
||||
__be16 protocol;
|
||||
unsigned gc_thresh;
|
||||
|
||||
int (*gc)(struct dst_ops *ops);
|
||||
struct dst_entry * (*check)(struct dst_entry *, __u32 cookie);
|
||||
void (*destroy)(struct dst_entry *);
|
||||
void (*ifdown)(struct dst_entry *,
|
||||
struct net_device *dev, int how);
|
||||
struct dst_entry * (*negative_advice)(struct dst_entry *);
|
||||
void (*link_failure)(struct sk_buff *);
|
||||
void (*update_pmtu)(struct dst_entry *dst, u32 mtu);
|
||||
int (*local_out)(struct sk_buff *skb);
|
||||
|
||||
atomic_t entries;
|
||||
struct kmem_cache *kmem_cachep;
|
||||
};
|
||||
#endif
|
@ -6,6 +6,7 @@
|
||||
|
||||
#ifndef __NETNS_IPV6_H__
|
||||
#define __NETNS_IPV6_H__
|
||||
#include <net/dst_ops.h>
|
||||
|
||||
struct ctl_table_header;
|
||||
|
||||
@ -42,7 +43,7 @@ struct netns_ipv6 {
|
||||
struct timer_list ip6_fib_timer;
|
||||
struct hlist_head *fib_table_hash;
|
||||
struct fib6_table *fib6_main_tbl;
|
||||
struct dst_ops *ip6_dst_ops;
|
||||
struct dst_ops ip6_dst_ops;
|
||||
unsigned int ip6_rt_gc_expire;
|
||||
unsigned long ip6_rt_last_gc;
|
||||
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
||||
|
Reference in New Issue
Block a user