|
@@ -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;
|