diff options
Diffstat (limited to 'net/netlink/af_netlink.c')
| -rw-r--r-- | net/netlink/af_netlink.c | 16 | 
1 files changed, 10 insertions, 6 deletions
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index b3025a603d5..43a124feaad 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -1503,14 +1503,16 @@ static void netlink_data_ready(struct sock *sk, int len)   */  struct sock * -netlink_kernel_create(struct net *net, int unit, unsigned int groups, -		      void (*input)(struct sk_buff *skb), -		      struct mutex *cb_mutex, struct module *module) +netlink_kernel_create(struct net *net, int unit, +		      struct module *module, +		      struct netlink_kernel_cfg *cfg)  {  	struct socket *sock;  	struct sock *sk;  	struct netlink_sock *nlk;  	struct listeners *listeners = NULL; +	struct mutex *cb_mutex = cfg ? cfg->cb_mutex : NULL; +	unsigned int groups;  	BUG_ON(!nl_table); @@ -1532,16 +1534,18 @@ netlink_kernel_create(struct net *net, int unit, unsigned int groups,  	sk = sock->sk;  	sk_change_net(sk, net); -	if (groups < 32) +	if (!cfg || cfg->groups < 32)  		groups = 32; +	else +		groups = cfg->groups;  	listeners = kzalloc(sizeof(*listeners) + NLGRPSZ(groups), GFP_KERNEL);  	if (!listeners)  		goto out_sock_release;  	sk->sk_data_ready = netlink_data_ready; -	if (input) -		nlk_sk(sk)->netlink_rcv = input; +	if (cfg && cfg->input) +		nlk_sk(sk)->netlink_rcv = cfg->input;  	if (netlink_insert(sk, net, 0))  		goto out_sock_release;  |