mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	rtnetlink: Compute and store minimum ifinfo dump size
The message size allocated for rtnl ifinfo dumps was limited to a single page. This is not enough for additional interface info available with devices that support SR-IOV and caused a bug in which VF info would not be displayed if more than approximately 40 VFs were created per interface. Implement a new function pointer for the rtnl_register service that will calculate the amount of data required for the ifinfo dump and allocate enough data to satisfy the request. Signed-off-by: Greg Rose <gregory.v.rose@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
		
							parent
							
								
									929dd04772
								
							
						
					
					
						commit
						c7ac8679be
					
				
					 30 changed files with 158 additions and 90 deletions
				
			
		| 
						 | 
					@ -148,7 +148,7 @@ static int ibnl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
 | 
				
			||||||
				return -EINVAL;
 | 
									return -EINVAL;
 | 
				
			||||||
			return netlink_dump_start(nls, skb, nlh,
 | 
								return netlink_dump_start(nls, skb, nlh,
 | 
				
			||||||
						  client->cb_table[op].dump,
 | 
											  client->cb_table[op].dump,
 | 
				
			||||||
						  NULL);
 | 
											  NULL, 0);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -221,7 +221,8 @@ struct netlink_callback {
 | 
				
			||||||
	int			(*dump)(struct sk_buff * skb,
 | 
						int			(*dump)(struct sk_buff * skb,
 | 
				
			||||||
					struct netlink_callback *cb);
 | 
										struct netlink_callback *cb);
 | 
				
			||||||
	int			(*done)(struct netlink_callback *cb);
 | 
						int			(*done)(struct netlink_callback *cb);
 | 
				
			||||||
	int			family;
 | 
						u16			family;
 | 
				
			||||||
 | 
						u16			min_dump_alloc;
 | 
				
			||||||
	long			args[6];
 | 
						long			args[6];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -259,7 +260,8 @@ __nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags)
 | 
				
			||||||
extern int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
 | 
					extern int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
 | 
				
			||||||
			      const struct nlmsghdr *nlh,
 | 
								      const struct nlmsghdr *nlh,
 | 
				
			||||||
			      int (*dump)(struct sk_buff *skb, struct netlink_callback*),
 | 
								      int (*dump)(struct sk_buff *skb, struct netlink_callback*),
 | 
				
			||||||
			      int (*done)(struct netlink_callback*));
 | 
								      int (*done)(struct netlink_callback*),
 | 
				
			||||||
 | 
								      u16 min_dump_alloc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NL_NONROOT_RECV 0x1
 | 
					#define NL_NONROOT_RECV 0x1
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,11 +6,14 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef int (*rtnl_doit_func)(struct sk_buff *, struct nlmsghdr *, void *);
 | 
					typedef int (*rtnl_doit_func)(struct sk_buff *, struct nlmsghdr *, void *);
 | 
				
			||||||
typedef int (*rtnl_dumpit_func)(struct sk_buff *, struct netlink_callback *);
 | 
					typedef int (*rtnl_dumpit_func)(struct sk_buff *, struct netlink_callback *);
 | 
				
			||||||
 | 
					typedef u16 (*rtnl_calcit_func)(struct sk_buff *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int	__rtnl_register(int protocol, int msgtype,
 | 
					extern int	__rtnl_register(int protocol, int msgtype,
 | 
				
			||||||
				rtnl_doit_func, rtnl_dumpit_func);
 | 
									rtnl_doit_func, rtnl_dumpit_func,
 | 
				
			||||||
 | 
									rtnl_calcit_func);
 | 
				
			||||||
extern void	rtnl_register(int protocol, int msgtype,
 | 
					extern void	rtnl_register(int protocol, int msgtype,
 | 
				
			||||||
			      rtnl_doit_func, rtnl_dumpit_func);
 | 
								      rtnl_doit_func, rtnl_dumpit_func,
 | 
				
			||||||
 | 
								      rtnl_calcit_func);
 | 
				
			||||||
extern int	rtnl_unregister(int protocol, int msgtype);
 | 
					extern int	rtnl_unregister(int protocol, int msgtype);
 | 
				
			||||||
extern void	rtnl_unregister_all(int protocol);
 | 
					extern void	rtnl_unregister_all(int protocol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -218,19 +218,24 @@ int __init br_netlink_init(void)
 | 
				
			||||||
	if (err < 0)
 | 
						if (err < 0)
 | 
				
			||||||
		goto err1;
 | 
							goto err1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = __rtnl_register(PF_BRIDGE, RTM_GETLINK, NULL, br_dump_ifinfo);
 | 
						err = __rtnl_register(PF_BRIDGE, RTM_GETLINK, NULL,
 | 
				
			||||||
 | 
								      br_dump_ifinfo, NULL);
 | 
				
			||||||
	if (err)
 | 
						if (err)
 | 
				
			||||||
		goto err2;
 | 
							goto err2;
 | 
				
			||||||
	err = __rtnl_register(PF_BRIDGE, RTM_SETLINK, br_rtm_setlink, NULL);
 | 
						err = __rtnl_register(PF_BRIDGE, RTM_SETLINK,
 | 
				
			||||||
 | 
								      br_rtm_setlink, NULL, NULL);
 | 
				
			||||||
	if (err)
 | 
						if (err)
 | 
				
			||||||
		goto err3;
 | 
							goto err3;
 | 
				
			||||||
	err = __rtnl_register(PF_BRIDGE, RTM_NEWNEIGH, br_fdb_add, NULL);
 | 
						err = __rtnl_register(PF_BRIDGE, RTM_NEWNEIGH,
 | 
				
			||||||
 | 
								      br_fdb_add, NULL, NULL);
 | 
				
			||||||
	if (err)
 | 
						if (err)
 | 
				
			||||||
		goto err3;
 | 
							goto err3;
 | 
				
			||||||
	err = __rtnl_register(PF_BRIDGE, RTM_DELNEIGH, br_fdb_delete, NULL);
 | 
						err = __rtnl_register(PF_BRIDGE, RTM_DELNEIGH,
 | 
				
			||||||
 | 
								      br_fdb_delete, NULL, NULL);
 | 
				
			||||||
	if (err)
 | 
						if (err)
 | 
				
			||||||
		goto err3;
 | 
							goto err3;
 | 
				
			||||||
	err = __rtnl_register(PF_BRIDGE, RTM_GETNEIGH, NULL, br_fdb_dump);
 | 
						err = __rtnl_register(PF_BRIDGE, RTM_GETNEIGH,
 | 
				
			||||||
 | 
								      NULL, br_fdb_dump, NULL);
 | 
				
			||||||
	if (err)
 | 
						if (err)
 | 
				
			||||||
		goto err3;
 | 
							goto err3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -740,9 +740,9 @@ static struct pernet_operations fib_rules_net_ops = {
 | 
				
			||||||
static int __init fib_rules_init(void)
 | 
					static int __init fib_rules_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_NEWRULE, fib_nl_newrule, NULL);
 | 
						rtnl_register(PF_UNSPEC, RTM_NEWRULE, fib_nl_newrule, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_DELRULE, fib_nl_delrule, NULL);
 | 
						rtnl_register(PF_UNSPEC, RTM_DELRULE, fib_nl_delrule, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_GETRULE, NULL, fib_nl_dumprule);
 | 
						rtnl_register(PF_UNSPEC, RTM_GETRULE, NULL, fib_nl_dumprule, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = register_pernet_subsys(&fib_rules_net_ops);
 | 
						err = register_pernet_subsys(&fib_rules_net_ops);
 | 
				
			||||||
	if (err < 0)
 | 
						if (err < 0)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2909,12 +2909,13 @@ EXPORT_SYMBOL(neigh_sysctl_unregister);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int __init neigh_init(void)
 | 
					static int __init neigh_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_NEWNEIGH, neigh_add, NULL);
 | 
						rtnl_register(PF_UNSPEC, RTM_NEWNEIGH, neigh_add, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_DELNEIGH, neigh_delete, NULL);
 | 
						rtnl_register(PF_UNSPEC, RTM_DELNEIGH, neigh_delete, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_GETNEIGH, NULL, neigh_dump_info);
 | 
						rtnl_register(PF_UNSPEC, RTM_GETNEIGH, NULL, neigh_dump_info, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_GETNEIGHTBL, NULL, neightbl_dump_info);
 | 
						rtnl_register(PF_UNSPEC, RTM_GETNEIGHTBL, NULL, neightbl_dump_info,
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_SETNEIGHTBL, neightbl_set, NULL);
 | 
							      NULL);
 | 
				
			||||||
 | 
						rtnl_register(PF_UNSPEC, RTM_SETNEIGHTBL, neightbl_set, NULL, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -56,9 +56,11 @@
 | 
				
			||||||
struct rtnl_link {
 | 
					struct rtnl_link {
 | 
				
			||||||
	rtnl_doit_func		doit;
 | 
						rtnl_doit_func		doit;
 | 
				
			||||||
	rtnl_dumpit_func	dumpit;
 | 
						rtnl_dumpit_func	dumpit;
 | 
				
			||||||
 | 
						rtnl_calcit_func 	calcit;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static DEFINE_MUTEX(rtnl_mutex);
 | 
					static DEFINE_MUTEX(rtnl_mutex);
 | 
				
			||||||
 | 
					static u16 min_ifinfo_dump_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void rtnl_lock(void)
 | 
					void rtnl_lock(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -144,12 +146,28 @@ static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex)
 | 
				
			||||||
	return tab ? tab[msgindex].dumpit : NULL;
 | 
						return tab ? tab[msgindex].dumpit : NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static rtnl_calcit_func rtnl_get_calcit(int protocol, int msgindex)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct rtnl_link *tab;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (protocol <= RTNL_FAMILY_MAX)
 | 
				
			||||||
 | 
							tab = rtnl_msg_handlers[protocol];
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							tab = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (tab == NULL || tab[msgindex].calcit == NULL)
 | 
				
			||||||
 | 
							tab = rtnl_msg_handlers[PF_UNSPEC];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return tab ? tab[msgindex].calcit : NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * __rtnl_register - Register a rtnetlink message type
 | 
					 * __rtnl_register - Register a rtnetlink message type
 | 
				
			||||||
 * @protocol: Protocol family or PF_UNSPEC
 | 
					 * @protocol: Protocol family or PF_UNSPEC
 | 
				
			||||||
 * @msgtype: rtnetlink message type
 | 
					 * @msgtype: rtnetlink message type
 | 
				
			||||||
 * @doit: Function pointer called for each request message
 | 
					 * @doit: Function pointer called for each request message
 | 
				
			||||||
 * @dumpit: Function pointer called for each dump request (NLM_F_DUMP) message
 | 
					 * @dumpit: Function pointer called for each dump request (NLM_F_DUMP) message
 | 
				
			||||||
 | 
					 * @calcit: Function pointer to calc size of dump message
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Registers the specified function pointers (at least one of them has
 | 
					 * Registers the specified function pointers (at least one of them has
 | 
				
			||||||
 * to be non-NULL) to be called whenever a request message for the
 | 
					 * to be non-NULL) to be called whenever a request message for the
 | 
				
			||||||
| 
						 | 
					@ -162,7 +180,8 @@ static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex)
 | 
				
			||||||
 * Returns 0 on success or a negative error code.
 | 
					 * Returns 0 on success or a negative error code.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int __rtnl_register(int protocol, int msgtype,
 | 
					int __rtnl_register(int protocol, int msgtype,
 | 
				
			||||||
		    rtnl_doit_func doit, rtnl_dumpit_func dumpit)
 | 
							    rtnl_doit_func doit, rtnl_dumpit_func dumpit,
 | 
				
			||||||
 | 
							    rtnl_calcit_func calcit)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct rtnl_link *tab;
 | 
						struct rtnl_link *tab;
 | 
				
			||||||
	int msgindex;
 | 
						int msgindex;
 | 
				
			||||||
| 
						 | 
					@ -185,6 +204,9 @@ int __rtnl_register(int protocol, int msgtype,
 | 
				
			||||||
	if (dumpit)
 | 
						if (dumpit)
 | 
				
			||||||
		tab[msgindex].dumpit = dumpit;
 | 
							tab[msgindex].dumpit = dumpit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (calcit)
 | 
				
			||||||
 | 
							tab[msgindex].calcit = calcit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL_GPL(__rtnl_register);
 | 
					EXPORT_SYMBOL_GPL(__rtnl_register);
 | 
				
			||||||
| 
						 | 
					@ -199,9 +221,10 @@ EXPORT_SYMBOL_GPL(__rtnl_register);
 | 
				
			||||||
 * of memory implies no sense in continuing.
 | 
					 * of memory implies no sense in continuing.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void rtnl_register(int protocol, int msgtype,
 | 
					void rtnl_register(int protocol, int msgtype,
 | 
				
			||||||
		   rtnl_doit_func doit, rtnl_dumpit_func dumpit)
 | 
							   rtnl_doit_func doit, rtnl_dumpit_func dumpit,
 | 
				
			||||||
 | 
							   rtnl_calcit_func calcit)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (__rtnl_register(protocol, msgtype, doit, dumpit) < 0)
 | 
						if (__rtnl_register(protocol, msgtype, doit, dumpit, calcit) < 0)
 | 
				
			||||||
		panic("Unable to register rtnetlink message handler, "
 | 
							panic("Unable to register rtnetlink message handler, "
 | 
				
			||||||
		      "protocol = %d, message type = %d\n",
 | 
							      "protocol = %d, message type = %d\n",
 | 
				
			||||||
		      protocol, msgtype);
 | 
							      protocol, msgtype);
 | 
				
			||||||
| 
						 | 
					@ -1818,6 +1841,11 @@ static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static u16 rtnl_calcit(struct sk_buff *skb)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return min_ifinfo_dump_size;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb)
 | 
					static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int idx;
 | 
						int idx;
 | 
				
			||||||
| 
						 | 
					@ -1847,11 +1875,14 @@ void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change)
 | 
				
			||||||
	struct net *net = dev_net(dev);
 | 
						struct net *net = dev_net(dev);
 | 
				
			||||||
	struct sk_buff *skb;
 | 
						struct sk_buff *skb;
 | 
				
			||||||
	int err = -ENOBUFS;
 | 
						int err = -ENOBUFS;
 | 
				
			||||||
 | 
						size_t if_info_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	skb = nlmsg_new(if_nlmsg_size(dev), GFP_KERNEL);
 | 
						skb = nlmsg_new((if_info_size = if_nlmsg_size(dev)), GFP_KERNEL);
 | 
				
			||||||
	if (skb == NULL)
 | 
						if (skb == NULL)
 | 
				
			||||||
		goto errout;
 | 
							goto errout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						min_ifinfo_dump_size = max_t(u16, if_info_size, min_ifinfo_dump_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = rtnl_fill_ifinfo(skb, dev, type, 0, 0, change, 0);
 | 
						err = rtnl_fill_ifinfo(skb, dev, type, 0, 0, change, 0);
 | 
				
			||||||
	if (err < 0) {
 | 
						if (err < 0) {
 | 
				
			||||||
		/* -EMSGSIZE implies BUG in if_nlmsg_size() */
 | 
							/* -EMSGSIZE implies BUG in if_nlmsg_size() */
 | 
				
			||||||
| 
						 | 
					@ -1902,14 +1933,20 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
 | 
				
			||||||
	if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) {
 | 
						if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) {
 | 
				
			||||||
		struct sock *rtnl;
 | 
							struct sock *rtnl;
 | 
				
			||||||
		rtnl_dumpit_func dumpit;
 | 
							rtnl_dumpit_func dumpit;
 | 
				
			||||||
 | 
							rtnl_calcit_func calcit;
 | 
				
			||||||
 | 
							u16 min_dump_alloc = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		dumpit = rtnl_get_dumpit(family, type);
 | 
							dumpit = rtnl_get_dumpit(family, type);
 | 
				
			||||||
		if (dumpit == NULL)
 | 
							if (dumpit == NULL)
 | 
				
			||||||
			return -EOPNOTSUPP;
 | 
								return -EOPNOTSUPP;
 | 
				
			||||||
 | 
							calcit = rtnl_get_calcit(family, type);
 | 
				
			||||||
 | 
							if (calcit)
 | 
				
			||||||
 | 
								min_dump_alloc = calcit(skb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		__rtnl_unlock();
 | 
							__rtnl_unlock();
 | 
				
			||||||
		rtnl = net->rtnl;
 | 
							rtnl = net->rtnl;
 | 
				
			||||||
		err = netlink_dump_start(rtnl, skb, nlh, dumpit, NULL);
 | 
							err = netlink_dump_start(rtnl, skb, nlh, dumpit,
 | 
				
			||||||
 | 
										 NULL, min_dump_alloc);
 | 
				
			||||||
		rtnl_lock();
 | 
							rtnl_lock();
 | 
				
			||||||
		return err;
 | 
							return err;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -2019,12 +2056,13 @@ void __init rtnetlink_init(void)
 | 
				
			||||||
	netlink_set_nonroot(NETLINK_ROUTE, NL_NONROOT_RECV);
 | 
						netlink_set_nonroot(NETLINK_ROUTE, NL_NONROOT_RECV);
 | 
				
			||||||
	register_netdevice_notifier(&rtnetlink_dev_notifier);
 | 
						register_netdevice_notifier(&rtnetlink_dev_notifier);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_GETLINK, rtnl_getlink, rtnl_dump_ifinfo);
 | 
						rtnl_register(PF_UNSPEC, RTM_GETLINK, rtnl_getlink,
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_SETLINK, rtnl_setlink, NULL);
 | 
							      rtnl_dump_ifinfo, rtnl_calcit);
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_NEWLINK, rtnl_newlink, NULL);
 | 
						rtnl_register(PF_UNSPEC, RTM_SETLINK, rtnl_setlink, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_DELLINK, rtnl_dellink, NULL);
 | 
						rtnl_register(PF_UNSPEC, RTM_NEWLINK, rtnl_newlink, NULL, NULL);
 | 
				
			||||||
 | 
						rtnl_register(PF_UNSPEC, RTM_DELLINK, rtnl_dellink, NULL, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_GETADDR, NULL, rtnl_dump_all);
 | 
						rtnl_register(PF_UNSPEC, RTM_GETADDR, NULL, rtnl_dump_all, NULL);
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_GETROUTE, NULL, rtnl_dump_all);
 | 
						rtnl_register(PF_UNSPEC, RTM_GETROUTE, NULL, rtnl_dump_all, NULL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1819,8 +1819,8 @@ static int __init dcbnl_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	INIT_LIST_HEAD(&dcb_app_list);
 | 
						INIT_LIST_HEAD(&dcb_app_list);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_GETDCB, dcb_doit, NULL);
 | 
						rtnl_register(PF_UNSPEC, RTM_GETDCB, dcb_doit, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_SETDCB, dcb_doit, NULL);
 | 
						rtnl_register(PF_UNSPEC, RTM_SETDCB, dcb_doit, NULL, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1414,9 +1414,9 @@ void __init dn_dev_init(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dn_dev_devices_on();
 | 
						dn_dev_devices_on();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rtnl_register(PF_DECnet, RTM_NEWADDR, dn_nl_newaddr, NULL);
 | 
						rtnl_register(PF_DECnet, RTM_NEWADDR, dn_nl_newaddr, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_DECnet, RTM_DELADDR, dn_nl_deladdr, NULL);
 | 
						rtnl_register(PF_DECnet, RTM_DELADDR, dn_nl_deladdr, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_DECnet, RTM_GETADDR, NULL, dn_nl_dump_ifaddr);
 | 
						rtnl_register(PF_DECnet, RTM_GETADDR, NULL, dn_nl_dump_ifaddr, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	proc_net_fops_create(&init_net, "decnet_dev", S_IRUGO, &dn_dev_seq_fops);
 | 
						proc_net_fops_create(&init_net, "decnet_dev", S_IRUGO, &dn_dev_seq_fops);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -763,8 +763,8 @@ void __init dn_fib_init(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	register_dnaddr_notifier(&dn_fib_dnaddr_notifier);
 | 
						register_dnaddr_notifier(&dn_fib_dnaddr_notifier);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rtnl_register(PF_DECnet, RTM_NEWROUTE, dn_fib_rtm_newroute, NULL);
 | 
						rtnl_register(PF_DECnet, RTM_NEWROUTE, dn_fib_rtm_newroute, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_DECnet, RTM_DELROUTE, dn_fib_rtm_delroute, NULL);
 | 
						rtnl_register(PF_DECnet, RTM_DELROUTE, dn_fib_rtm_delroute, NULL, NULL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1841,10 +1841,11 @@ void __init dn_route_init(void)
 | 
				
			||||||
	proc_net_fops_create(&init_net, "decnet_cache", S_IRUGO, &dn_rt_cache_seq_fops);
 | 
						proc_net_fops_create(&init_net, "decnet_cache", S_IRUGO, &dn_rt_cache_seq_fops);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_DECNET_ROUTER
 | 
					#ifdef CONFIG_DECNET_ROUTER
 | 
				
			||||||
	rtnl_register(PF_DECnet, RTM_GETROUTE, dn_cache_getroute, dn_fib_dump);
 | 
						rtnl_register(PF_DECnet, RTM_GETROUTE, dn_cache_getroute,
 | 
				
			||||||
 | 
							      dn_fib_dump, NULL);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
	rtnl_register(PF_DECnet, RTM_GETROUTE, dn_cache_getroute,
 | 
						rtnl_register(PF_DECnet, RTM_GETROUTE, dn_cache_getroute,
 | 
				
			||||||
		      dn_cache_dump);
 | 
							      dn_cache_dump, NULL);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1833,8 +1833,8 @@ void __init devinet_init(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rtnl_af_register(&inet_af_ops);
 | 
						rtnl_af_register(&inet_af_ops);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rtnl_register(PF_INET, RTM_NEWADDR, inet_rtm_newaddr, NULL);
 | 
						rtnl_register(PF_INET, RTM_NEWADDR, inet_rtm_newaddr, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_INET, RTM_DELADDR, inet_rtm_deladdr, NULL);
 | 
						rtnl_register(PF_INET, RTM_DELADDR, inet_rtm_deladdr, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_INET, RTM_GETADDR, NULL, inet_dump_ifaddr);
 | 
						rtnl_register(PF_INET, RTM_GETADDR, NULL, inet_dump_ifaddr, NULL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1124,9 +1124,9 @@ static struct pernet_operations fib_net_ops = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void __init ip_fib_init(void)
 | 
					void __init ip_fib_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	rtnl_register(PF_INET, RTM_NEWROUTE, inet_rtm_newroute, NULL);
 | 
						rtnl_register(PF_INET, RTM_NEWROUTE, inet_rtm_newroute, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_INET, RTM_DELROUTE, inet_rtm_delroute, NULL);
 | 
						rtnl_register(PF_INET, RTM_DELROUTE, inet_rtm_delroute, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_INET, RTM_GETROUTE, NULL, inet_dump_fib);
 | 
						rtnl_register(PF_INET, RTM_GETROUTE, NULL, inet_dump_fib, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	register_pernet_subsys(&fib_net_ops);
 | 
						register_pernet_subsys(&fib_net_ops);
 | 
				
			||||||
	register_netdevice_notifier(&fib_netdev_notifier);
 | 
						register_netdevice_notifier(&fib_netdev_notifier);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -871,7 +871,7 @@ static int inet_diag_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return netlink_dump_start(idiagnl, skb, nlh,
 | 
							return netlink_dump_start(idiagnl, skb, nlh,
 | 
				
			||||||
					  inet_diag_dump, NULL);
 | 
										  inet_diag_dump, NULL, 0);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return inet_diag_get_exact(skb, nlh);
 | 
						return inet_diag_get_exact(skb, nlh);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2544,7 +2544,8 @@ int __init ip_mr_init(void)
 | 
				
			||||||
		goto add_proto_fail;
 | 
							goto add_proto_fail;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	rtnl_register(RTNL_FAMILY_IPMR, RTM_GETROUTE, NULL, ipmr_rtm_dumproute);
 | 
						rtnl_register(RTNL_FAMILY_IPMR, RTM_GETROUTE,
 | 
				
			||||||
 | 
							      NULL, ipmr_rtm_dumproute, NULL);
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_IP_PIMSM_V2
 | 
					#ifdef CONFIG_IP_PIMSM_V2
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3295,7 +3295,7 @@ int __init ip_rt_init(void)
 | 
				
			||||||
	xfrm_init();
 | 
						xfrm_init();
 | 
				
			||||||
	xfrm4_init(ip_rt_max_size);
 | 
						xfrm4_init(ip_rt_max_size);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	rtnl_register(PF_INET, RTM_GETROUTE, inet_rtm_getroute, NULL);
 | 
						rtnl_register(PF_INET, RTM_GETROUTE, inet_rtm_getroute, NULL, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_SYSCTL
 | 
					#ifdef CONFIG_SYSCTL
 | 
				
			||||||
	register_pernet_subsys(&sysctl_route_ops);
 | 
						register_pernet_subsys(&sysctl_route_ops);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4727,16 +4727,20 @@ int __init addrconf_init(void)
 | 
				
			||||||
	if (err < 0)
 | 
						if (err < 0)
 | 
				
			||||||
		goto errout_af;
 | 
							goto errout_af;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = __rtnl_register(PF_INET6, RTM_GETLINK, NULL, inet6_dump_ifinfo);
 | 
						err = __rtnl_register(PF_INET6, RTM_GETLINK, NULL, inet6_dump_ifinfo,
 | 
				
			||||||
 | 
								      NULL);
 | 
				
			||||||
	if (err < 0)
 | 
						if (err < 0)
 | 
				
			||||||
		goto errout;
 | 
							goto errout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Only the first call to __rtnl_register can fail */
 | 
						/* Only the first call to __rtnl_register can fail */
 | 
				
			||||||
	__rtnl_register(PF_INET6, RTM_NEWADDR, inet6_rtm_newaddr, NULL);
 | 
						__rtnl_register(PF_INET6, RTM_NEWADDR, inet6_rtm_newaddr, NULL, NULL);
 | 
				
			||||||
	__rtnl_register(PF_INET6, RTM_DELADDR, inet6_rtm_deladdr, NULL);
 | 
						__rtnl_register(PF_INET6, RTM_DELADDR, inet6_rtm_deladdr, NULL, NULL);
 | 
				
			||||||
	__rtnl_register(PF_INET6, RTM_GETADDR, inet6_rtm_getaddr, inet6_dump_ifaddr);
 | 
						__rtnl_register(PF_INET6, RTM_GETADDR, inet6_rtm_getaddr,
 | 
				
			||||||
	__rtnl_register(PF_INET6, RTM_GETMULTICAST, NULL, inet6_dump_ifmcaddr);
 | 
								inet6_dump_ifaddr, NULL);
 | 
				
			||||||
	__rtnl_register(PF_INET6, RTM_GETANYCAST, NULL, inet6_dump_ifacaddr);
 | 
						__rtnl_register(PF_INET6, RTM_GETMULTICAST, NULL,
 | 
				
			||||||
 | 
								inet6_dump_ifmcaddr, NULL);
 | 
				
			||||||
 | 
						__rtnl_register(PF_INET6, RTM_GETANYCAST, NULL,
 | 
				
			||||||
 | 
								inet6_dump_ifacaddr, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ipv6_addr_label_rtnl_register();
 | 
						ipv6_addr_label_rtnl_register();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -592,8 +592,11 @@ static int ip6addrlbl_get(struct sk_buff *in_skb, struct nlmsghdr* nlh,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void __init ipv6_addr_label_rtnl_register(void)
 | 
					void __init ipv6_addr_label_rtnl_register(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	__rtnl_register(PF_INET6, RTM_NEWADDRLABEL, ip6addrlbl_newdel, NULL);
 | 
						__rtnl_register(PF_INET6, RTM_NEWADDRLABEL, ip6addrlbl_newdel,
 | 
				
			||||||
	__rtnl_register(PF_INET6, RTM_DELADDRLABEL, ip6addrlbl_newdel, NULL);
 | 
								NULL, NULL);
 | 
				
			||||||
	__rtnl_register(PF_INET6, RTM_GETADDRLABEL, ip6addrlbl_get, ip6addrlbl_dump);
 | 
						__rtnl_register(PF_INET6, RTM_DELADDRLABEL, ip6addrlbl_newdel,
 | 
				
			||||||
 | 
								NULL, NULL);
 | 
				
			||||||
 | 
						__rtnl_register(PF_INET6, RTM_GETADDRLABEL, ip6addrlbl_get,
 | 
				
			||||||
 | 
								ip6addrlbl_dump, NULL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1586,7 +1586,8 @@ int __init fib6_init(void)
 | 
				
			||||||
	if (ret)
 | 
						if (ret)
 | 
				
			||||||
		goto out_kmem_cache_create;
 | 
							goto out_kmem_cache_create;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = __rtnl_register(PF_INET6, RTM_GETROUTE, NULL, inet6_dump_fib);
 | 
						ret = __rtnl_register(PF_INET6, RTM_GETROUTE, NULL, inet6_dump_fib,
 | 
				
			||||||
 | 
								      NULL);
 | 
				
			||||||
	if (ret)
 | 
						if (ret)
 | 
				
			||||||
		goto out_unregister_subsys;
 | 
							goto out_unregister_subsys;
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1354,7 +1354,8 @@ int __init ip6_mr_init(void)
 | 
				
			||||||
		goto add_proto_fail;
 | 
							goto add_proto_fail;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	rtnl_register(RTNL_FAMILY_IP6MR, RTM_GETROUTE, NULL, ip6mr_rtm_dumproute);
 | 
						rtnl_register(RTNL_FAMILY_IP6MR, RTM_GETROUTE, NULL,
 | 
				
			||||||
 | 
							      ip6mr_rtm_dumproute, NULL);
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
#ifdef CONFIG_IPV6_PIMSM_V2
 | 
					#ifdef CONFIG_IPV6_PIMSM_V2
 | 
				
			||||||
add_proto_fail:
 | 
					add_proto_fail:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2925,9 +2925,9 @@ int __init ip6_route_init(void)
 | 
				
			||||||
		goto xfrm6_init;
 | 
							goto xfrm6_init;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = -ENOBUFS;
 | 
						ret = -ENOBUFS;
 | 
				
			||||||
	if (__rtnl_register(PF_INET6, RTM_NEWROUTE, inet6_rtm_newroute, NULL) ||
 | 
						if (__rtnl_register(PF_INET6, RTM_NEWROUTE, inet6_rtm_newroute, NULL, NULL) ||
 | 
				
			||||||
	    __rtnl_register(PF_INET6, RTM_DELROUTE, inet6_rtm_delroute, NULL) ||
 | 
						    __rtnl_register(PF_INET6, RTM_DELROUTE, inet6_rtm_delroute, NULL, NULL) ||
 | 
				
			||||||
	    __rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL))
 | 
						    __rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL, NULL))
 | 
				
			||||||
		goto fib6_rules_init;
 | 
							goto fib6_rules_init;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = register_netdevice_notifier(&ip6_route_dev_notifier);
 | 
						ret = register_netdevice_notifier(&ip6_route_dev_notifier);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1120,7 +1120,7 @@ ip_set_dump(struct sock *ctnl, struct sk_buff *skb,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return netlink_dump_start(ctnl, skb, nlh,
 | 
						return netlink_dump_start(ctnl, skb, nlh,
 | 
				
			||||||
				  ip_set_dump_start,
 | 
									  ip_set_dump_start,
 | 
				
			||||||
				  ip_set_dump_done);
 | 
									  ip_set_dump_done, 0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Add, del and test */
 | 
					/* Add, del and test */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -970,7 +970,7 @@ ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (nlh->nlmsg_flags & NLM_F_DUMP)
 | 
						if (nlh->nlmsg_flags & NLM_F_DUMP)
 | 
				
			||||||
		return netlink_dump_start(ctnl, skb, nlh, ctnetlink_dump_table,
 | 
							return netlink_dump_start(ctnl, skb, nlh, ctnetlink_dump_table,
 | 
				
			||||||
					  ctnetlink_done);
 | 
										  ctnetlink_done, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = ctnetlink_parse_zone(cda[CTA_ZONE], &zone);
 | 
						err = ctnetlink_parse_zone(cda[CTA_ZONE], &zone);
 | 
				
			||||||
	if (err < 0)
 | 
						if (err < 0)
 | 
				
			||||||
| 
						 | 
					@ -1840,7 +1840,7 @@ ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb,
 | 
				
			||||||
	if (nlh->nlmsg_flags & NLM_F_DUMP) {
 | 
						if (nlh->nlmsg_flags & NLM_F_DUMP) {
 | 
				
			||||||
		return netlink_dump_start(ctnl, skb, nlh,
 | 
							return netlink_dump_start(ctnl, skb, nlh,
 | 
				
			||||||
					  ctnetlink_exp_dump_table,
 | 
										  ctnetlink_exp_dump_table,
 | 
				
			||||||
					  ctnetlink_exp_done);
 | 
										  ctnetlink_exp_done, 0);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = ctnetlink_parse_zone(cda[CTA_EXPECT_ZONE], &zone);
 | 
						err = ctnetlink_parse_zone(cda[CTA_EXPECT_ZONE], &zone);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1659,13 +1659,10 @@ static int netlink_dump(struct sock *sk)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct netlink_sock *nlk = nlk_sk(sk);
 | 
						struct netlink_sock *nlk = nlk_sk(sk);
 | 
				
			||||||
	struct netlink_callback *cb;
 | 
						struct netlink_callback *cb;
 | 
				
			||||||
	struct sk_buff *skb;
 | 
						struct sk_buff *skb = NULL;
 | 
				
			||||||
	struct nlmsghdr *nlh;
 | 
						struct nlmsghdr *nlh;
 | 
				
			||||||
	int len, err = -ENOBUFS;
 | 
						int len, err = -ENOBUFS;
 | 
				
			||||||
 | 
						int alloc_size;
 | 
				
			||||||
	skb = sock_rmalloc(sk, NLMSG_GOODSIZE, 0, GFP_KERNEL);
 | 
					 | 
				
			||||||
	if (!skb)
 | 
					 | 
				
			||||||
		goto errout;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(nlk->cb_mutex);
 | 
						mutex_lock(nlk->cb_mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1675,6 +1672,12 @@ static int netlink_dump(struct sock *sk)
 | 
				
			||||||
		goto errout_skb;
 | 
							goto errout_skb;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						alloc_size = max_t(int, cb->min_dump_alloc, NLMSG_GOODSIZE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						skb = sock_rmalloc(sk, alloc_size, 0, GFP_KERNEL);
 | 
				
			||||||
 | 
						if (!skb)
 | 
				
			||||||
 | 
							goto errout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	len = cb->dump(skb, cb);
 | 
						len = cb->dump(skb, cb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (len > 0) {
 | 
						if (len > 0) {
 | 
				
			||||||
| 
						 | 
					@ -1721,7 +1724,8 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
 | 
				
			||||||
		       const struct nlmsghdr *nlh,
 | 
							       const struct nlmsghdr *nlh,
 | 
				
			||||||
		       int (*dump)(struct sk_buff *skb,
 | 
							       int (*dump)(struct sk_buff *skb,
 | 
				
			||||||
				   struct netlink_callback *),
 | 
									   struct netlink_callback *),
 | 
				
			||||||
		       int (*done)(struct netlink_callback *))
 | 
							       int (*done)(struct netlink_callback *),
 | 
				
			||||||
 | 
							       u16 min_dump_alloc)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct netlink_callback *cb;
 | 
						struct netlink_callback *cb;
 | 
				
			||||||
	struct sock *sk;
 | 
						struct sock *sk;
 | 
				
			||||||
| 
						 | 
					@ -1735,6 +1739,7 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
 | 
				
			||||||
	cb->dump = dump;
 | 
						cb->dump = dump;
 | 
				
			||||||
	cb->done = done;
 | 
						cb->done = done;
 | 
				
			||||||
	cb->nlh = nlh;
 | 
						cb->nlh = nlh;
 | 
				
			||||||
 | 
						cb->min_dump_alloc = min_dump_alloc;
 | 
				
			||||||
	atomic_inc(&skb->users);
 | 
						atomic_inc(&skb->users);
 | 
				
			||||||
	cb->skb = skb;
 | 
						cb->skb = skb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -525,7 +525,7 @@ static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		genl_unlock();
 | 
							genl_unlock();
 | 
				
			||||||
		err = netlink_dump_start(net->genl_sock, skb, nlh,
 | 
							err = netlink_dump_start(net->genl_sock, skb, nlh,
 | 
				
			||||||
					 ops->dumpit, ops->done);
 | 
										 ops->dumpit, ops->done, 0);
 | 
				
			||||||
		genl_lock();
 | 
							genl_lock();
 | 
				
			||||||
		return err;
 | 
							return err;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -289,15 +289,16 @@ static int route_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int __init phonet_netlink_register(void)
 | 
					int __init phonet_netlink_register(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int err = __rtnl_register(PF_PHONET, RTM_NEWADDR, addr_doit, NULL);
 | 
						int err = __rtnl_register(PF_PHONET, RTM_NEWADDR, addr_doit,
 | 
				
			||||||
 | 
									  NULL, NULL);
 | 
				
			||||||
	if (err)
 | 
						if (err)
 | 
				
			||||||
		return err;
 | 
							return err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Further __rtnl_register() cannot fail */
 | 
						/* Further __rtnl_register() cannot fail */
 | 
				
			||||||
	__rtnl_register(PF_PHONET, RTM_DELADDR, addr_doit, NULL);
 | 
						__rtnl_register(PF_PHONET, RTM_DELADDR, addr_doit, NULL, NULL);
 | 
				
			||||||
	__rtnl_register(PF_PHONET, RTM_GETADDR, NULL, getaddr_dumpit);
 | 
						__rtnl_register(PF_PHONET, RTM_GETADDR, NULL, getaddr_dumpit, NULL);
 | 
				
			||||||
	__rtnl_register(PF_PHONET, RTM_NEWROUTE, route_doit, NULL);
 | 
						__rtnl_register(PF_PHONET, RTM_NEWROUTE, route_doit, NULL, NULL);
 | 
				
			||||||
	__rtnl_register(PF_PHONET, RTM_DELROUTE, route_doit, NULL);
 | 
						__rtnl_register(PF_PHONET, RTM_DELROUTE, route_doit, NULL, NULL);
 | 
				
			||||||
	__rtnl_register(PF_PHONET, RTM_GETROUTE, NULL, route_dumpit);
 | 
						__rtnl_register(PF_PHONET, RTM_GETROUTE, NULL, route_dumpit, NULL);
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1115,9 +1115,10 @@ tc_dump_action(struct sk_buff *skb, struct netlink_callback *cb)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int __init tc_action_init(void)
 | 
					static int __init tc_action_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_NEWACTION, tc_ctl_action, NULL);
 | 
						rtnl_register(PF_UNSPEC, RTM_NEWACTION, tc_ctl_action, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_DELACTION, tc_ctl_action, NULL);
 | 
						rtnl_register(PF_UNSPEC, RTM_DELACTION, tc_ctl_action, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_GETACTION, tc_ctl_action, tc_dump_action);
 | 
						rtnl_register(PF_UNSPEC, RTM_GETACTION, tc_ctl_action, tc_dump_action,
 | 
				
			||||||
 | 
							      NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -610,10 +610,10 @@ EXPORT_SYMBOL(tcf_exts_dump_stats);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int __init tc_filter_init(void)
 | 
					static int __init tc_filter_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_NEWTFILTER, tc_ctl_tfilter, NULL);
 | 
						rtnl_register(PF_UNSPEC, RTM_NEWTFILTER, tc_ctl_tfilter, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_DELTFILTER, tc_ctl_tfilter, NULL);
 | 
						rtnl_register(PF_UNSPEC, RTM_DELTFILTER, tc_ctl_tfilter, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_GETTFILTER, tc_ctl_tfilter,
 | 
						rtnl_register(PF_UNSPEC, RTM_GETTFILTER, tc_ctl_tfilter,
 | 
				
			||||||
						 tc_dump_tfilter);
 | 
							      tc_dump_tfilter, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1792,12 +1792,12 @@ static int __init pktsched_init(void)
 | 
				
			||||||
	register_qdisc(&pfifo_head_drop_qdisc_ops);
 | 
						register_qdisc(&pfifo_head_drop_qdisc_ops);
 | 
				
			||||||
	register_qdisc(&mq_qdisc_ops);
 | 
						register_qdisc(&mq_qdisc_ops);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_NEWQDISC, tc_modify_qdisc, NULL);
 | 
						rtnl_register(PF_UNSPEC, RTM_NEWQDISC, tc_modify_qdisc, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_DELQDISC, tc_get_qdisc, NULL);
 | 
						rtnl_register(PF_UNSPEC, RTM_DELQDISC, tc_get_qdisc, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_GETQDISC, tc_get_qdisc, tc_dump_qdisc);
 | 
						rtnl_register(PF_UNSPEC, RTM_GETQDISC, tc_get_qdisc, tc_dump_qdisc, NULL);
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_NEWTCLASS, tc_ctl_tclass, NULL);
 | 
						rtnl_register(PF_UNSPEC, RTM_NEWTCLASS, tc_ctl_tclass, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_DELTCLASS, tc_ctl_tclass, NULL);
 | 
						rtnl_register(PF_UNSPEC, RTM_DELTCLASS, tc_ctl_tclass, NULL, NULL);
 | 
				
			||||||
	rtnl_register(PF_UNSPEC, RTM_GETTCLASS, tc_ctl_tclass, tc_dump_tclass);
 | 
						rtnl_register(PF_UNSPEC, RTM_GETTCLASS, tc_ctl_tclass, tc_dump_tclass, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2299,7 +2299,8 @@ static int xfrm_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
 | 
				
			||||||
		if (link->dump == NULL)
 | 
							if (link->dump == NULL)
 | 
				
			||||||
			return -EINVAL;
 | 
								return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return netlink_dump_start(net->xfrm.nlsk, skb, nlh, link->dump, link->done);
 | 
							return netlink_dump_start(net->xfrm.nlsk, skb, nlh,
 | 
				
			||||||
 | 
										  link->dump, link->done, 0);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = nlmsg_parse(nlh, xfrm_msg_min[type], attrs, XFRMA_MAX,
 | 
						err = nlmsg_parse(nlh, xfrm_msg_min[type], attrs, XFRMA_MAX,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue