mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	genetlink: make policy common to family
Since maxattr is common, the policy can't really differ sanely,
so make it common as well.
The only user that did in fact manage to make a non-common policy
is taskstats, which has to be really careful about it (since it's
still using a common maxattr!). This is no longer supported, but
we can fake it using pre_doit.
This reduces the size of e.g. nl80211.o (which has lots of commands):
   text	   data	    bss	    dec	    hex	filename
 398745	  14323	   2240	 415308	  6564c	net/wireless/nl80211.o (before)
 397913	  14331	   2240	 414484	  65314	net/wireless/nl80211.o (after)
--------------------------------
   -832      +8       0    -824
Which is obviously just 8 bytes for each command, and an added 8
bytes for the new policy pointer. I'm not sure why the ops list is
counted as .text though.
Most of the code transformations were done using the following spatch:
    @ops@
    identifier OPS;
    expression POLICY;
    @@
    struct genl_ops OPS[] = {
    ...,
     {
    -	.policy = POLICY,
     },
    ...
    };
    @@
    identifier ops.OPS;
    expression ops.POLICY;
    identifier fam;
    expression M;
    @@
    struct genl_family fam = {
            .ops = OPS,
            .maxattr = M,
    +       .policy = POLICY,
            ...
    };
This also gets rid of devlink_nl_cmd_region_read_dumpit() accessing
the cb->data as ops, which we want to change in a later genl patch.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
			
			
This commit is contained in:
		
							parent
							
								
									601ed4d6dc
								
							
						
					
					
						commit
						3b0f31f2b8
					
				
					 36 changed files with 68 additions and 374 deletions
				
			
		| 
						 | 
					@ -1999,22 +1999,18 @@ static int nbd_genl_reconfigure(struct sk_buff *skb, struct genl_info *info)
 | 
				
			||||||
static const struct genl_ops nbd_connect_genl_ops[] = {
 | 
					static const struct genl_ops nbd_connect_genl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= NBD_CMD_CONNECT,
 | 
							.cmd	= NBD_CMD_CONNECT,
 | 
				
			||||||
		.policy	= nbd_attr_policy,
 | 
					 | 
				
			||||||
		.doit	= nbd_genl_connect,
 | 
							.doit	= nbd_genl_connect,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= NBD_CMD_DISCONNECT,
 | 
							.cmd	= NBD_CMD_DISCONNECT,
 | 
				
			||||||
		.policy	= nbd_attr_policy,
 | 
					 | 
				
			||||||
		.doit	= nbd_genl_disconnect,
 | 
							.doit	= nbd_genl_disconnect,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= NBD_CMD_RECONFIGURE,
 | 
							.cmd	= NBD_CMD_RECONFIGURE,
 | 
				
			||||||
		.policy	= nbd_attr_policy,
 | 
					 | 
				
			||||||
		.doit	= nbd_genl_reconfigure,
 | 
							.doit	= nbd_genl_reconfigure,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= NBD_CMD_STATUS,
 | 
							.cmd	= NBD_CMD_STATUS,
 | 
				
			||||||
		.policy	= nbd_attr_policy,
 | 
					 | 
				
			||||||
		.doit	= nbd_genl_status,
 | 
							.doit	= nbd_genl_status,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -2031,6 +2027,7 @@ static struct genl_family nbd_genl_family __ro_after_init = {
 | 
				
			||||||
	.ops		= nbd_connect_genl_ops,
 | 
						.ops		= nbd_connect_genl_ops,
 | 
				
			||||||
	.n_ops		= ARRAY_SIZE(nbd_connect_genl_ops),
 | 
						.n_ops		= ARRAY_SIZE(nbd_connect_genl_ops),
 | 
				
			||||||
	.maxattr	= NBD_ATTR_MAX,
 | 
						.maxattr	= NBD_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = nbd_attr_policy,
 | 
				
			||||||
	.mcgrps		= nbd_mcast_grps,
 | 
						.mcgrps		= nbd_mcast_grps,
 | 
				
			||||||
	.n_mcgrps	= ARRAY_SIZE(nbd_mcast_grps),
 | 
						.n_mcgrps	= ARRAY_SIZE(nbd_mcast_grps),
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1271,20 +1271,17 @@ static const struct genl_ops gtp_genl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = GTP_CMD_NEWPDP,
 | 
							.cmd = GTP_CMD_NEWPDP,
 | 
				
			||||||
		.doit = gtp_genl_new_pdp,
 | 
							.doit = gtp_genl_new_pdp,
 | 
				
			||||||
		.policy = gtp_genl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = GTP_CMD_DELPDP,
 | 
							.cmd = GTP_CMD_DELPDP,
 | 
				
			||||||
		.doit = gtp_genl_del_pdp,
 | 
							.doit = gtp_genl_del_pdp,
 | 
				
			||||||
		.policy = gtp_genl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = GTP_CMD_GETPDP,
 | 
							.cmd = GTP_CMD_GETPDP,
 | 
				
			||||||
		.doit = gtp_genl_get_pdp,
 | 
							.doit = gtp_genl_get_pdp,
 | 
				
			||||||
		.dumpit = gtp_genl_dump_pdp,
 | 
							.dumpit = gtp_genl_dump_pdp,
 | 
				
			||||||
		.policy = gtp_genl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -1294,6 +1291,7 @@ static struct genl_family gtp_genl_family __ro_after_init = {
 | 
				
			||||||
	.version	= 0,
 | 
						.version	= 0,
 | 
				
			||||||
	.hdrsize	= 0,
 | 
						.hdrsize	= 0,
 | 
				
			||||||
	.maxattr	= GTPA_MAX,
 | 
						.maxattr	= GTPA_MAX,
 | 
				
			||||||
 | 
						.policy = gtp_genl_policy,
 | 
				
			||||||
	.netnsok	= true,
 | 
						.netnsok	= true,
 | 
				
			||||||
	.module		= THIS_MODULE,
 | 
						.module		= THIS_MODULE,
 | 
				
			||||||
	.ops		= gtp_genl_ops,
 | 
						.ops		= gtp_genl_ops,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -598,37 +598,31 @@ static const struct nla_policy hwsim_genl_policy[MAC802154_HWSIM_ATTR_MAX + 1] =
 | 
				
			||||||
static const struct genl_ops hwsim_nl_ops[] = {
 | 
					static const struct genl_ops hwsim_nl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = MAC802154_HWSIM_CMD_NEW_RADIO,
 | 
							.cmd = MAC802154_HWSIM_CMD_NEW_RADIO,
 | 
				
			||||||
		.policy = hwsim_genl_policy,
 | 
					 | 
				
			||||||
		.doit = hwsim_new_radio_nl,
 | 
							.doit = hwsim_new_radio_nl,
 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = MAC802154_HWSIM_CMD_DEL_RADIO,
 | 
							.cmd = MAC802154_HWSIM_CMD_DEL_RADIO,
 | 
				
			||||||
		.policy = hwsim_genl_policy,
 | 
					 | 
				
			||||||
		.doit = hwsim_del_radio_nl,
 | 
							.doit = hwsim_del_radio_nl,
 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = MAC802154_HWSIM_CMD_GET_RADIO,
 | 
							.cmd = MAC802154_HWSIM_CMD_GET_RADIO,
 | 
				
			||||||
		.policy = hwsim_genl_policy,
 | 
					 | 
				
			||||||
		.doit = hwsim_get_radio_nl,
 | 
							.doit = hwsim_get_radio_nl,
 | 
				
			||||||
		.dumpit = hwsim_dump_radio_nl,
 | 
							.dumpit = hwsim_dump_radio_nl,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = MAC802154_HWSIM_CMD_NEW_EDGE,
 | 
							.cmd = MAC802154_HWSIM_CMD_NEW_EDGE,
 | 
				
			||||||
		.policy = hwsim_genl_policy,
 | 
					 | 
				
			||||||
		.doit = hwsim_new_edge_nl,
 | 
							.doit = hwsim_new_edge_nl,
 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = MAC802154_HWSIM_CMD_DEL_EDGE,
 | 
							.cmd = MAC802154_HWSIM_CMD_DEL_EDGE,
 | 
				
			||||||
		.policy = hwsim_genl_policy,
 | 
					 | 
				
			||||||
		.doit = hwsim_del_edge_nl,
 | 
							.doit = hwsim_del_edge_nl,
 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = MAC802154_HWSIM_CMD_SET_EDGE,
 | 
							.cmd = MAC802154_HWSIM_CMD_SET_EDGE,
 | 
				
			||||||
		.policy = hwsim_genl_policy,
 | 
					 | 
				
			||||||
		.doit = hwsim_set_edge_lqi,
 | 
							.doit = hwsim_set_edge_lqi,
 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -638,6 +632,7 @@ static struct genl_family hwsim_genl_family __ro_after_init = {
 | 
				
			||||||
	.name = "MAC802154_HWSIM",
 | 
						.name = "MAC802154_HWSIM",
 | 
				
			||||||
	.version = 1,
 | 
						.version = 1,
 | 
				
			||||||
	.maxattr = MAC802154_HWSIM_ATTR_MAX,
 | 
						.maxattr = MAC802154_HWSIM_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = hwsim_genl_policy,
 | 
				
			||||||
	.module = THIS_MODULE,
 | 
						.module = THIS_MODULE,
 | 
				
			||||||
	.ops = hwsim_nl_ops,
 | 
						.ops = hwsim_nl_ops,
 | 
				
			||||||
	.n_ops = ARRAY_SIZE(hwsim_nl_ops),
 | 
						.n_ops = ARRAY_SIZE(hwsim_nl_ops),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2637,60 +2637,50 @@ static const struct genl_ops macsec_genl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = MACSEC_CMD_GET_TXSC,
 | 
							.cmd = MACSEC_CMD_GET_TXSC,
 | 
				
			||||||
		.dumpit = macsec_dump_txsc,
 | 
							.dumpit = macsec_dump_txsc,
 | 
				
			||||||
		.policy = macsec_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = MACSEC_CMD_ADD_RXSC,
 | 
							.cmd = MACSEC_CMD_ADD_RXSC,
 | 
				
			||||||
		.doit = macsec_add_rxsc,
 | 
							.doit = macsec_add_rxsc,
 | 
				
			||||||
		.policy = macsec_genl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = MACSEC_CMD_DEL_RXSC,
 | 
							.cmd = MACSEC_CMD_DEL_RXSC,
 | 
				
			||||||
		.doit = macsec_del_rxsc,
 | 
							.doit = macsec_del_rxsc,
 | 
				
			||||||
		.policy = macsec_genl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = MACSEC_CMD_UPD_RXSC,
 | 
							.cmd = MACSEC_CMD_UPD_RXSC,
 | 
				
			||||||
		.doit = macsec_upd_rxsc,
 | 
							.doit = macsec_upd_rxsc,
 | 
				
			||||||
		.policy = macsec_genl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = MACSEC_CMD_ADD_TXSA,
 | 
							.cmd = MACSEC_CMD_ADD_TXSA,
 | 
				
			||||||
		.doit = macsec_add_txsa,
 | 
							.doit = macsec_add_txsa,
 | 
				
			||||||
		.policy = macsec_genl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = MACSEC_CMD_DEL_TXSA,
 | 
							.cmd = MACSEC_CMD_DEL_TXSA,
 | 
				
			||||||
		.doit = macsec_del_txsa,
 | 
							.doit = macsec_del_txsa,
 | 
				
			||||||
		.policy = macsec_genl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = MACSEC_CMD_UPD_TXSA,
 | 
							.cmd = MACSEC_CMD_UPD_TXSA,
 | 
				
			||||||
		.doit = macsec_upd_txsa,
 | 
							.doit = macsec_upd_txsa,
 | 
				
			||||||
		.policy = macsec_genl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = MACSEC_CMD_ADD_RXSA,
 | 
							.cmd = MACSEC_CMD_ADD_RXSA,
 | 
				
			||||||
		.doit = macsec_add_rxsa,
 | 
							.doit = macsec_add_rxsa,
 | 
				
			||||||
		.policy = macsec_genl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = MACSEC_CMD_DEL_RXSA,
 | 
							.cmd = MACSEC_CMD_DEL_RXSA,
 | 
				
			||||||
		.doit = macsec_del_rxsa,
 | 
							.doit = macsec_del_rxsa,
 | 
				
			||||||
		.policy = macsec_genl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = MACSEC_CMD_UPD_RXSA,
 | 
							.cmd = MACSEC_CMD_UPD_RXSA,
 | 
				
			||||||
		.doit = macsec_upd_rxsa,
 | 
							.doit = macsec_upd_rxsa,
 | 
				
			||||||
		.policy = macsec_genl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -2700,6 +2690,7 @@ static struct genl_family macsec_fam __ro_after_init = {
 | 
				
			||||||
	.hdrsize	= 0,
 | 
						.hdrsize	= 0,
 | 
				
			||||||
	.version	= MACSEC_GENL_VERSION,
 | 
						.version	= MACSEC_GENL_VERSION,
 | 
				
			||||||
	.maxattr	= MACSEC_ATTR_MAX,
 | 
						.maxattr	= MACSEC_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = macsec_genl_policy,
 | 
				
			||||||
	.netnsok	= true,
 | 
						.netnsok	= true,
 | 
				
			||||||
	.module		= THIS_MODULE,
 | 
						.module		= THIS_MODULE,
 | 
				
			||||||
	.ops		= macsec_genl_ops,
 | 
						.ops		= macsec_genl_ops,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2725,24 +2725,20 @@ static const struct genl_ops team_nl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = TEAM_CMD_NOOP,
 | 
							.cmd = TEAM_CMD_NOOP,
 | 
				
			||||||
		.doit = team_nl_cmd_noop,
 | 
							.doit = team_nl_cmd_noop,
 | 
				
			||||||
		.policy = team_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = TEAM_CMD_OPTIONS_SET,
 | 
							.cmd = TEAM_CMD_OPTIONS_SET,
 | 
				
			||||||
		.doit = team_nl_cmd_options_set,
 | 
							.doit = team_nl_cmd_options_set,
 | 
				
			||||||
		.policy = team_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = TEAM_CMD_OPTIONS_GET,
 | 
							.cmd = TEAM_CMD_OPTIONS_GET,
 | 
				
			||||||
		.doit = team_nl_cmd_options_get,
 | 
							.doit = team_nl_cmd_options_get,
 | 
				
			||||||
		.policy = team_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = TEAM_CMD_PORT_LIST_GET,
 | 
							.cmd = TEAM_CMD_PORT_LIST_GET,
 | 
				
			||||||
		.doit = team_nl_cmd_port_list_get,
 | 
							.doit = team_nl_cmd_port_list_get,
 | 
				
			||||||
		.policy = team_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -2755,6 +2751,7 @@ static struct genl_family team_nl_family __ro_after_init = {
 | 
				
			||||||
	.name		= TEAM_GENL_NAME,
 | 
						.name		= TEAM_GENL_NAME,
 | 
				
			||||||
	.version	= TEAM_GENL_VERSION,
 | 
						.version	= TEAM_GENL_VERSION,
 | 
				
			||||||
	.maxattr	= TEAM_ATTR_MAX,
 | 
						.maxattr	= TEAM_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = team_nl_policy,
 | 
				
			||||||
	.netnsok	= true,
 | 
						.netnsok	= true,
 | 
				
			||||||
	.module		= THIS_MODULE,
 | 
						.module		= THIS_MODULE,
 | 
				
			||||||
	.ops		= team_nl_ops,
 | 
						.ops		= team_nl_ops,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3620,35 +3620,29 @@ static int hwsim_dump_radio_nl(struct sk_buff *skb,
 | 
				
			||||||
static const struct genl_ops hwsim_ops[] = {
 | 
					static const struct genl_ops hwsim_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = HWSIM_CMD_REGISTER,
 | 
							.cmd = HWSIM_CMD_REGISTER,
 | 
				
			||||||
		.policy = hwsim_genl_policy,
 | 
					 | 
				
			||||||
		.doit = hwsim_register_received_nl,
 | 
							.doit = hwsim_register_received_nl,
 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = HWSIM_CMD_FRAME,
 | 
							.cmd = HWSIM_CMD_FRAME,
 | 
				
			||||||
		.policy = hwsim_genl_policy,
 | 
					 | 
				
			||||||
		.doit = hwsim_cloned_frame_received_nl,
 | 
							.doit = hwsim_cloned_frame_received_nl,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = HWSIM_CMD_TX_INFO_FRAME,
 | 
							.cmd = HWSIM_CMD_TX_INFO_FRAME,
 | 
				
			||||||
		.policy = hwsim_genl_policy,
 | 
					 | 
				
			||||||
		.doit = hwsim_tx_info_frame_received_nl,
 | 
							.doit = hwsim_tx_info_frame_received_nl,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = HWSIM_CMD_NEW_RADIO,
 | 
							.cmd = HWSIM_CMD_NEW_RADIO,
 | 
				
			||||||
		.policy = hwsim_genl_policy,
 | 
					 | 
				
			||||||
		.doit = hwsim_new_radio_nl,
 | 
							.doit = hwsim_new_radio_nl,
 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = HWSIM_CMD_DEL_RADIO,
 | 
							.cmd = HWSIM_CMD_DEL_RADIO,
 | 
				
			||||||
		.policy = hwsim_genl_policy,
 | 
					 | 
				
			||||||
		.doit = hwsim_del_radio_nl,
 | 
							.doit = hwsim_del_radio_nl,
 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = HWSIM_CMD_GET_RADIO,
 | 
							.cmd = HWSIM_CMD_GET_RADIO,
 | 
				
			||||||
		.policy = hwsim_genl_policy,
 | 
					 | 
				
			||||||
		.doit = hwsim_get_radio_nl,
 | 
							.doit = hwsim_get_radio_nl,
 | 
				
			||||||
		.dumpit = hwsim_dump_radio_nl,
 | 
							.dumpit = hwsim_dump_radio_nl,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -3658,6 +3652,7 @@ static struct genl_family hwsim_genl_family __ro_after_init = {
 | 
				
			||||||
	.name = "MAC80211_HWSIM",
 | 
						.name = "MAC80211_HWSIM",
 | 
				
			||||||
	.version = 1,
 | 
						.version = 1,
 | 
				
			||||||
	.maxattr = HWSIM_ATTR_MAX,
 | 
						.maxattr = HWSIM_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = hwsim_genl_policy,
 | 
				
			||||||
	.netnsok = true,
 | 
						.netnsok = true,
 | 
				
			||||||
	.module = THIS_MODULE,
 | 
						.module = THIS_MODULE,
 | 
				
			||||||
	.ops = hwsim_ops,
 | 
						.ops = hwsim_ops,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -442,25 +442,21 @@ static const struct genl_ops tcmu_genl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TCMU_CMD_SET_FEATURES,
 | 
							.cmd	= TCMU_CMD_SET_FEATURES,
 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy	= tcmu_attr_policy,
 | 
					 | 
				
			||||||
		.doit	= tcmu_genl_set_features,
 | 
							.doit	= tcmu_genl_set_features,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TCMU_CMD_ADDED_DEVICE_DONE,
 | 
							.cmd	= TCMU_CMD_ADDED_DEVICE_DONE,
 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy	= tcmu_attr_policy,
 | 
					 | 
				
			||||||
		.doit	= tcmu_genl_add_dev_done,
 | 
							.doit	= tcmu_genl_add_dev_done,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TCMU_CMD_REMOVED_DEVICE_DONE,
 | 
							.cmd	= TCMU_CMD_REMOVED_DEVICE_DONE,
 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy	= tcmu_attr_policy,
 | 
					 | 
				
			||||||
		.doit	= tcmu_genl_rm_dev_done,
 | 
							.doit	= tcmu_genl_rm_dev_done,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TCMU_CMD_RECONFIG_DEVICE_DONE,
 | 
							.cmd	= TCMU_CMD_RECONFIG_DEVICE_DONE,
 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy	= tcmu_attr_policy,
 | 
					 | 
				
			||||||
		.doit	= tcmu_genl_reconfig_dev_done,
 | 
							.doit	= tcmu_genl_reconfig_dev_done,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -472,6 +468,7 @@ static struct genl_family tcmu_genl_family __ro_after_init = {
 | 
				
			||||||
	.name = "TCM-USER",
 | 
						.name = "TCM-USER",
 | 
				
			||||||
	.version = 2,
 | 
						.version = 2,
 | 
				
			||||||
	.maxattr = TCMU_ATTR_MAX,
 | 
						.maxattr = TCMU_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = tcmu_attr_policy,
 | 
				
			||||||
	.mcgrps = tcmu_mcgrps,
 | 
						.mcgrps = tcmu_mcgrps,
 | 
				
			||||||
	.n_mcgrps = ARRAY_SIZE(tcmu_mcgrps),
 | 
						.n_mcgrps = ARRAY_SIZE(tcmu_mcgrps),
 | 
				
			||||||
	.netnsok = true,
 | 
						.netnsok = true,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -233,7 +233,6 @@ const char *CONCAT_(GENL_MAGIC_FAMILY, _genl_cmd_to_str)(__u8 cmd)
 | 
				
			||||||
{								\
 | 
					{								\
 | 
				
			||||||
	handler							\
 | 
						handler							\
 | 
				
			||||||
	.cmd = op_name,						\
 | 
						.cmd = op_name,						\
 | 
				
			||||||
	.policy	= CONCAT_(GENL_MAGIC_FAMILY, _tla_nl_policy),	\
 | 
					 | 
				
			||||||
},
 | 
					},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ZZZ_genl_ops		CONCAT_(GENL_MAGIC_FAMILY, _genl_ops)
 | 
					#define ZZZ_genl_ops		CONCAT_(GENL_MAGIC_FAMILY, _genl_ops)
 | 
				
			||||||
| 
						 | 
					@ -290,7 +289,8 @@ static struct genl_family ZZZ_genl_family __ro_after_init = {
 | 
				
			||||||
#ifdef GENL_MAGIC_FAMILY_HDRSZ
 | 
					#ifdef GENL_MAGIC_FAMILY_HDRSZ
 | 
				
			||||||
	.hdrsize = NLA_ALIGN(GENL_MAGIC_FAMILY_HDRSZ),
 | 
						.hdrsize = NLA_ALIGN(GENL_MAGIC_FAMILY_HDRSZ),
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	.maxattr = ARRAY_SIZE(drbd_tla_nl_policy)-1,
 | 
						.maxattr = ARRAY_SIZE(CONCAT_(GENL_MAGIC_FAMILY, _tla_nl_policy))-1,
 | 
				
			||||||
 | 
						.policy	= CONCAT_(GENL_MAGIC_FAMILY, _tla_nl_policy),
 | 
				
			||||||
	.ops = ZZZ_genl_ops,
 | 
						.ops = ZZZ_genl_ops,
 | 
				
			||||||
	.n_ops = ARRAY_SIZE(ZZZ_genl_ops),
 | 
						.n_ops = ARRAY_SIZE(ZZZ_genl_ops),
 | 
				
			||||||
	.mcgrps = ZZZ_genl_mcgrps,
 | 
						.mcgrps = ZZZ_genl_mcgrps,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,6 +26,7 @@ struct genl_info;
 | 
				
			||||||
 * @name: name of family
 | 
					 * @name: name of family
 | 
				
			||||||
 * @version: protocol version
 | 
					 * @version: protocol version
 | 
				
			||||||
 * @maxattr: maximum number of attributes supported
 | 
					 * @maxattr: maximum number of attributes supported
 | 
				
			||||||
 | 
					 * @policy: netlink policy
 | 
				
			||||||
 * @netnsok: set to true if the family can handle network
 | 
					 * @netnsok: set to true if the family can handle network
 | 
				
			||||||
 *	namespaces and should be presented in all of them
 | 
					 *	namespaces and should be presented in all of them
 | 
				
			||||||
 * @parallel_ops: operations can be called in parallel and aren't
 | 
					 * @parallel_ops: operations can be called in parallel and aren't
 | 
				
			||||||
| 
						 | 
					@ -56,6 +57,7 @@ struct genl_family {
 | 
				
			||||||
	unsigned int		maxattr;
 | 
						unsigned int		maxattr;
 | 
				
			||||||
	bool			netnsok;
 | 
						bool			netnsok;
 | 
				
			||||||
	bool			parallel_ops;
 | 
						bool			parallel_ops;
 | 
				
			||||||
 | 
						const struct nla_policy *policy;
 | 
				
			||||||
	int			(*pre_doit)(const struct genl_ops *ops,
 | 
						int			(*pre_doit)(const struct genl_ops *ops,
 | 
				
			||||||
					    struct sk_buff *skb,
 | 
										    struct sk_buff *skb,
 | 
				
			||||||
					    struct genl_info *info);
 | 
										    struct genl_info *info);
 | 
				
			||||||
| 
						 | 
					@ -124,14 +126,12 @@ static inline int genl_err_attr(struct genl_info *info, int err,
 | 
				
			||||||
 * @cmd: command identifier
 | 
					 * @cmd: command identifier
 | 
				
			||||||
 * @internal_flags: flags used by the family
 | 
					 * @internal_flags: flags used by the family
 | 
				
			||||||
 * @flags: flags
 | 
					 * @flags: flags
 | 
				
			||||||
 * @policy: attribute validation policy
 | 
					 | 
				
			||||||
 * @doit: standard command callback
 | 
					 * @doit: standard command callback
 | 
				
			||||||
 * @start: start callback for dumps
 | 
					 * @start: start callback for dumps
 | 
				
			||||||
 * @dumpit: callback for dumpers
 | 
					 * @dumpit: callback for dumpers
 | 
				
			||||||
 * @done: completion callback for dumps
 | 
					 * @done: completion callback for dumps
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
struct genl_ops {
 | 
					struct genl_ops {
 | 
				
			||||||
	const struct nla_policy	*policy;
 | 
					 | 
				
			||||||
	int		       (*doit)(struct sk_buff *skb,
 | 
						int		       (*doit)(struct sk_buff *skb,
 | 
				
			||||||
				       struct genl_info *info);
 | 
									       struct genl_info *info);
 | 
				
			||||||
	int		       (*start)(struct netlink_callback *cb);
 | 
						int		       (*start)(struct netlink_callback *cb);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -650,16 +650,37 @@ static const struct genl_ops taskstats_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd		= TASKSTATS_CMD_GET,
 | 
							.cmd		= TASKSTATS_CMD_GET,
 | 
				
			||||||
		.doit		= taskstats_user_cmd,
 | 
							.doit		= taskstats_user_cmd,
 | 
				
			||||||
		.policy		= taskstats_cmd_get_policy,
 | 
							/* policy enforced later */
 | 
				
			||||||
		.flags		= GENL_ADMIN_PERM,
 | 
							.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_HASPOL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd		= CGROUPSTATS_CMD_GET,
 | 
							.cmd		= CGROUPSTATS_CMD_GET,
 | 
				
			||||||
		.doit		= cgroupstats_user_cmd,
 | 
							.doit		= cgroupstats_user_cmd,
 | 
				
			||||||
		.policy		= cgroupstats_cmd_get_policy,
 | 
							/* policy enforced later */
 | 
				
			||||||
 | 
							.flags		= GENL_CMD_CAP_HASPOL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int taskstats_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
 | 
				
			||||||
 | 
								      struct genl_info *info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const struct nla_policy *policy = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch (ops->cmd) {
 | 
				
			||||||
 | 
						case TASKSTATS_CMD_GET:
 | 
				
			||||||
 | 
							policy = taskstats_cmd_get_policy;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case CGROUPSTATS_CMD_GET:
 | 
				
			||||||
 | 
							policy = cgroupstats_cmd_get_policy;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nlmsg_validate(info->nlhdr, GENL_HDRLEN, TASKSTATS_CMD_ATTR_MAX,
 | 
				
			||||||
 | 
								      policy, info->extack);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct genl_family family __ro_after_init = {
 | 
					static struct genl_family family __ro_after_init = {
 | 
				
			||||||
	.name		= TASKSTATS_GENL_NAME,
 | 
						.name		= TASKSTATS_GENL_NAME,
 | 
				
			||||||
	.version	= TASKSTATS_GENL_VERSION,
 | 
						.version	= TASKSTATS_GENL_VERSION,
 | 
				
			||||||
| 
						 | 
					@ -667,6 +688,7 @@ static struct genl_family family __ro_after_init = {
 | 
				
			||||||
	.module		= THIS_MODULE,
 | 
						.module		= THIS_MODULE,
 | 
				
			||||||
	.ops		= taskstats_ops,
 | 
						.ops		= taskstats_ops,
 | 
				
			||||||
	.n_ops		= ARRAY_SIZE(taskstats_ops),
 | 
						.n_ops		= ARRAY_SIZE(taskstats_ops),
 | 
				
			||||||
 | 
						.pre_doit	= taskstats_pre_doit,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Needed early in initialization */
 | 
					/* Needed early in initialization */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1345,34 +1345,29 @@ static const struct genl_ops batadv_netlink_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = BATADV_CMD_GET_MESH,
 | 
							.cmd = BATADV_CMD_GET_MESH,
 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
		.policy = batadv_netlink_policy,
 | 
					 | 
				
			||||||
		.doit = batadv_netlink_get_mesh,
 | 
							.doit = batadv_netlink_get_mesh,
 | 
				
			||||||
		.internal_flags = BATADV_FLAG_NEED_MESH,
 | 
							.internal_flags = BATADV_FLAG_NEED_MESH,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = BATADV_CMD_TP_METER,
 | 
							.cmd = BATADV_CMD_TP_METER,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = batadv_netlink_policy,
 | 
					 | 
				
			||||||
		.doit = batadv_netlink_tp_meter_start,
 | 
							.doit = batadv_netlink_tp_meter_start,
 | 
				
			||||||
		.internal_flags = BATADV_FLAG_NEED_MESH,
 | 
							.internal_flags = BATADV_FLAG_NEED_MESH,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = BATADV_CMD_TP_METER_CANCEL,
 | 
							.cmd = BATADV_CMD_TP_METER_CANCEL,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = batadv_netlink_policy,
 | 
					 | 
				
			||||||
		.doit = batadv_netlink_tp_meter_cancel,
 | 
							.doit = batadv_netlink_tp_meter_cancel,
 | 
				
			||||||
		.internal_flags = BATADV_FLAG_NEED_MESH,
 | 
							.internal_flags = BATADV_FLAG_NEED_MESH,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = BATADV_CMD_GET_ROUTING_ALGOS,
 | 
							.cmd = BATADV_CMD_GET_ROUTING_ALGOS,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = batadv_netlink_policy,
 | 
					 | 
				
			||||||
		.dumpit = batadv_algo_dump,
 | 
							.dumpit = batadv_algo_dump,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = BATADV_CMD_GET_HARDIF,
 | 
							.cmd = BATADV_CMD_GET_HARDIF,
 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
		.policy = batadv_netlink_policy,
 | 
					 | 
				
			||||||
		.dumpit = batadv_netlink_dump_hardif,
 | 
							.dumpit = batadv_netlink_dump_hardif,
 | 
				
			||||||
		.doit = batadv_netlink_get_hardif,
 | 
							.doit = batadv_netlink_get_hardif,
 | 
				
			||||||
		.internal_flags = BATADV_FLAG_NEED_MESH |
 | 
							.internal_flags = BATADV_FLAG_NEED_MESH |
 | 
				
			||||||
| 
						 | 
					@ -1381,68 +1376,57 @@ static const struct genl_ops batadv_netlink_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = BATADV_CMD_GET_TRANSTABLE_LOCAL,
 | 
							.cmd = BATADV_CMD_GET_TRANSTABLE_LOCAL,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = batadv_netlink_policy,
 | 
					 | 
				
			||||||
		.dumpit = batadv_tt_local_dump,
 | 
							.dumpit = batadv_tt_local_dump,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = BATADV_CMD_GET_TRANSTABLE_GLOBAL,
 | 
							.cmd = BATADV_CMD_GET_TRANSTABLE_GLOBAL,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = batadv_netlink_policy,
 | 
					 | 
				
			||||||
		.dumpit = batadv_tt_global_dump,
 | 
							.dumpit = batadv_tt_global_dump,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = BATADV_CMD_GET_ORIGINATORS,
 | 
							.cmd = BATADV_CMD_GET_ORIGINATORS,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = batadv_netlink_policy,
 | 
					 | 
				
			||||||
		.dumpit = batadv_orig_dump,
 | 
							.dumpit = batadv_orig_dump,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = BATADV_CMD_GET_NEIGHBORS,
 | 
							.cmd = BATADV_CMD_GET_NEIGHBORS,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = batadv_netlink_policy,
 | 
					 | 
				
			||||||
		.dumpit = batadv_hardif_neigh_dump,
 | 
							.dumpit = batadv_hardif_neigh_dump,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = BATADV_CMD_GET_GATEWAYS,
 | 
							.cmd = BATADV_CMD_GET_GATEWAYS,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = batadv_netlink_policy,
 | 
					 | 
				
			||||||
		.dumpit = batadv_gw_dump,
 | 
							.dumpit = batadv_gw_dump,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = BATADV_CMD_GET_BLA_CLAIM,
 | 
							.cmd = BATADV_CMD_GET_BLA_CLAIM,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = batadv_netlink_policy,
 | 
					 | 
				
			||||||
		.dumpit = batadv_bla_claim_dump,
 | 
							.dumpit = batadv_bla_claim_dump,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = BATADV_CMD_GET_BLA_BACKBONE,
 | 
							.cmd = BATADV_CMD_GET_BLA_BACKBONE,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = batadv_netlink_policy,
 | 
					 | 
				
			||||||
		.dumpit = batadv_bla_backbone_dump,
 | 
							.dumpit = batadv_bla_backbone_dump,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = BATADV_CMD_GET_DAT_CACHE,
 | 
							.cmd = BATADV_CMD_GET_DAT_CACHE,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = batadv_netlink_policy,
 | 
					 | 
				
			||||||
		.dumpit = batadv_dat_cache_dump,
 | 
							.dumpit = batadv_dat_cache_dump,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = BATADV_CMD_GET_MCAST_FLAGS,
 | 
							.cmd = BATADV_CMD_GET_MCAST_FLAGS,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = batadv_netlink_policy,
 | 
					 | 
				
			||||||
		.dumpit = batadv_mcast_flags_dump,
 | 
							.dumpit = batadv_mcast_flags_dump,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = BATADV_CMD_SET_MESH,
 | 
							.cmd = BATADV_CMD_SET_MESH,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = batadv_netlink_policy,
 | 
					 | 
				
			||||||
		.doit = batadv_netlink_set_mesh,
 | 
							.doit = batadv_netlink_set_mesh,
 | 
				
			||||||
		.internal_flags = BATADV_FLAG_NEED_MESH,
 | 
							.internal_flags = BATADV_FLAG_NEED_MESH,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = BATADV_CMD_SET_HARDIF,
 | 
							.cmd = BATADV_CMD_SET_HARDIF,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = batadv_netlink_policy,
 | 
					 | 
				
			||||||
		.doit = batadv_netlink_set_hardif,
 | 
							.doit = batadv_netlink_set_hardif,
 | 
				
			||||||
		.internal_flags = BATADV_FLAG_NEED_MESH |
 | 
							.internal_flags = BATADV_FLAG_NEED_MESH |
 | 
				
			||||||
				  BATADV_FLAG_NEED_HARDIF,
 | 
									  BATADV_FLAG_NEED_HARDIF,
 | 
				
			||||||
| 
						 | 
					@ -1450,7 +1434,6 @@ static const struct genl_ops batadv_netlink_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = BATADV_CMD_GET_VLAN,
 | 
							.cmd = BATADV_CMD_GET_VLAN,
 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
		.policy = batadv_netlink_policy,
 | 
					 | 
				
			||||||
		.doit = batadv_netlink_get_vlan,
 | 
							.doit = batadv_netlink_get_vlan,
 | 
				
			||||||
		.internal_flags = BATADV_FLAG_NEED_MESH |
 | 
							.internal_flags = BATADV_FLAG_NEED_MESH |
 | 
				
			||||||
				  BATADV_FLAG_NEED_VLAN,
 | 
									  BATADV_FLAG_NEED_VLAN,
 | 
				
			||||||
| 
						 | 
					@ -1458,7 +1441,6 @@ static const struct genl_ops batadv_netlink_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = BATADV_CMD_SET_VLAN,
 | 
							.cmd = BATADV_CMD_SET_VLAN,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = batadv_netlink_policy,
 | 
					 | 
				
			||||||
		.doit = batadv_netlink_set_vlan,
 | 
							.doit = batadv_netlink_set_vlan,
 | 
				
			||||||
		.internal_flags = BATADV_FLAG_NEED_MESH |
 | 
							.internal_flags = BATADV_FLAG_NEED_MESH |
 | 
				
			||||||
				  BATADV_FLAG_NEED_VLAN,
 | 
									  BATADV_FLAG_NEED_VLAN,
 | 
				
			||||||
| 
						 | 
					@ -1470,6 +1452,7 @@ struct genl_family batadv_netlink_family __ro_after_init = {
 | 
				
			||||||
	.name = BATADV_NL_NAME,
 | 
						.name = BATADV_NL_NAME,
 | 
				
			||||||
	.version = 1,
 | 
						.version = 1,
 | 
				
			||||||
	.maxattr = BATADV_ATTR_MAX,
 | 
						.maxattr = BATADV_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = batadv_netlink_policy,
 | 
				
			||||||
	.netnsok = true,
 | 
						.netnsok = true,
 | 
				
			||||||
	.pre_doit = batadv_pre_doit,
 | 
						.pre_doit = batadv_pre_doit,
 | 
				
			||||||
	.post_doit = batadv_post_doit,
 | 
						.post_doit = batadv_post_doit,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3640,7 +3640,6 @@ static int devlink_nl_cmd_region_read_dumpit(struct sk_buff *skb,
 | 
				
			||||||
					     struct netlink_callback *cb)
 | 
										     struct netlink_callback *cb)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u64 ret_offset, start_offset, end_offset = 0;
 | 
						u64 ret_offset, start_offset, end_offset = 0;
 | 
				
			||||||
	const struct genl_ops *ops = cb->data;
 | 
					 | 
				
			||||||
	struct devlink_region *region;
 | 
						struct devlink_region *region;
 | 
				
			||||||
	struct nlattr *chunks_attr;
 | 
						struct nlattr *chunks_attr;
 | 
				
			||||||
	const char *region_name;
 | 
						const char *region_name;
 | 
				
			||||||
| 
						 | 
					@ -3657,7 +3656,8 @@ static int devlink_nl_cmd_region_read_dumpit(struct sk_buff *skb,
 | 
				
			||||||
		return -ENOMEM;
 | 
							return -ENOMEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = nlmsg_parse(cb->nlh, GENL_HDRLEN + devlink_nl_family.hdrsize,
 | 
						err = nlmsg_parse(cb->nlh, GENL_HDRLEN + devlink_nl_family.hdrsize,
 | 
				
			||||||
			  attrs, DEVLINK_ATTR_MAX, ops->policy, cb->extack);
 | 
								  attrs, DEVLINK_ATTR_MAX, devlink_nl_family.policy,
 | 
				
			||||||
 | 
								  cb->extack);
 | 
				
			||||||
	if (err)
 | 
						if (err)
 | 
				
			||||||
		goto out_free;
 | 
							goto out_free;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4923,7 +4923,6 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
		.cmd = DEVLINK_CMD_GET,
 | 
							.cmd = DEVLINK_CMD_GET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_get_doit,
 | 
							.doit = devlink_nl_cmd_get_doit,
 | 
				
			||||||
		.dumpit = devlink_nl_cmd_get_dumpit,
 | 
							.dumpit = devlink_nl_cmd_get_dumpit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -4931,21 +4930,18 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
		.cmd = DEVLINK_CMD_PORT_GET,
 | 
							.cmd = DEVLINK_CMD_PORT_GET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_port_get_doit,
 | 
							.doit = devlink_nl_cmd_port_get_doit,
 | 
				
			||||||
		.dumpit = devlink_nl_cmd_port_get_dumpit,
 | 
							.dumpit = devlink_nl_cmd_port_get_dumpit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_PORT,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_PORT,
 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_PORT_SET,
 | 
							.cmd = DEVLINK_CMD_PORT_SET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_port_set_doit,
 | 
							.doit = devlink_nl_cmd_port_set_doit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_PORT,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_PORT,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_PORT_SPLIT,
 | 
							.cmd = DEVLINK_CMD_PORT_SPLIT,
 | 
				
			||||||
		.doit = devlink_nl_cmd_port_split_doit,
 | 
							.doit = devlink_nl_cmd_port_split_doit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
				
			||||||
				  DEVLINK_NL_FLAG_NO_LOCK,
 | 
									  DEVLINK_NL_FLAG_NO_LOCK,
 | 
				
			||||||
| 
						 | 
					@ -4953,7 +4949,6 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_PORT_UNSPLIT,
 | 
							.cmd = DEVLINK_CMD_PORT_UNSPLIT,
 | 
				
			||||||
		.doit = devlink_nl_cmd_port_unsplit_doit,
 | 
							.doit = devlink_nl_cmd_port_unsplit_doit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
				
			||||||
				  DEVLINK_NL_FLAG_NO_LOCK,
 | 
									  DEVLINK_NL_FLAG_NO_LOCK,
 | 
				
			||||||
| 
						 | 
					@ -4962,7 +4957,6 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
		.cmd = DEVLINK_CMD_SB_GET,
 | 
							.cmd = DEVLINK_CMD_SB_GET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_sb_get_doit,
 | 
							.doit = devlink_nl_cmd_sb_get_doit,
 | 
				
			||||||
		.dumpit = devlink_nl_cmd_sb_get_dumpit,
 | 
							.dumpit = devlink_nl_cmd_sb_get_dumpit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
				
			||||||
				  DEVLINK_NL_FLAG_NEED_SB,
 | 
									  DEVLINK_NL_FLAG_NEED_SB,
 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
| 
						 | 
					@ -4971,7 +4965,6 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
		.cmd = DEVLINK_CMD_SB_POOL_GET,
 | 
							.cmd = DEVLINK_CMD_SB_POOL_GET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_sb_pool_get_doit,
 | 
							.doit = devlink_nl_cmd_sb_pool_get_doit,
 | 
				
			||||||
		.dumpit = devlink_nl_cmd_sb_pool_get_dumpit,
 | 
							.dumpit = devlink_nl_cmd_sb_pool_get_dumpit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
				
			||||||
				  DEVLINK_NL_FLAG_NEED_SB,
 | 
									  DEVLINK_NL_FLAG_NEED_SB,
 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
| 
						 | 
					@ -4979,7 +4972,6 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_SB_POOL_SET,
 | 
							.cmd = DEVLINK_CMD_SB_POOL_SET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_sb_pool_set_doit,
 | 
							.doit = devlink_nl_cmd_sb_pool_set_doit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
				
			||||||
				  DEVLINK_NL_FLAG_NEED_SB,
 | 
									  DEVLINK_NL_FLAG_NEED_SB,
 | 
				
			||||||
| 
						 | 
					@ -4988,7 +4980,6 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
		.cmd = DEVLINK_CMD_SB_PORT_POOL_GET,
 | 
							.cmd = DEVLINK_CMD_SB_PORT_POOL_GET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_sb_port_pool_get_doit,
 | 
							.doit = devlink_nl_cmd_sb_port_pool_get_doit,
 | 
				
			||||||
		.dumpit = devlink_nl_cmd_sb_port_pool_get_dumpit,
 | 
							.dumpit = devlink_nl_cmd_sb_port_pool_get_dumpit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_PORT |
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_PORT |
 | 
				
			||||||
				  DEVLINK_NL_FLAG_NEED_SB,
 | 
									  DEVLINK_NL_FLAG_NEED_SB,
 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
| 
						 | 
					@ -4996,7 +4987,6 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_SB_PORT_POOL_SET,
 | 
							.cmd = DEVLINK_CMD_SB_PORT_POOL_SET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_sb_port_pool_set_doit,
 | 
							.doit = devlink_nl_cmd_sb_port_pool_set_doit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_PORT |
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_PORT |
 | 
				
			||||||
				  DEVLINK_NL_FLAG_NEED_SB,
 | 
									  DEVLINK_NL_FLAG_NEED_SB,
 | 
				
			||||||
| 
						 | 
					@ -5005,7 +4995,6 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
		.cmd = DEVLINK_CMD_SB_TC_POOL_BIND_GET,
 | 
							.cmd = DEVLINK_CMD_SB_TC_POOL_BIND_GET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_sb_tc_pool_bind_get_doit,
 | 
							.doit = devlink_nl_cmd_sb_tc_pool_bind_get_doit,
 | 
				
			||||||
		.dumpit = devlink_nl_cmd_sb_tc_pool_bind_get_dumpit,
 | 
							.dumpit = devlink_nl_cmd_sb_tc_pool_bind_get_dumpit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_PORT |
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_PORT |
 | 
				
			||||||
				  DEVLINK_NL_FLAG_NEED_SB,
 | 
									  DEVLINK_NL_FLAG_NEED_SB,
 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
| 
						 | 
					@ -5013,7 +5002,6 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_SB_TC_POOL_BIND_SET,
 | 
							.cmd = DEVLINK_CMD_SB_TC_POOL_BIND_SET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_sb_tc_pool_bind_set_doit,
 | 
							.doit = devlink_nl_cmd_sb_tc_pool_bind_set_doit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_PORT |
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_PORT |
 | 
				
			||||||
				  DEVLINK_NL_FLAG_NEED_SB,
 | 
									  DEVLINK_NL_FLAG_NEED_SB,
 | 
				
			||||||
| 
						 | 
					@ -5021,7 +5009,6 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_SB_OCC_SNAPSHOT,
 | 
							.cmd = DEVLINK_CMD_SB_OCC_SNAPSHOT,
 | 
				
			||||||
		.doit = devlink_nl_cmd_sb_occ_snapshot_doit,
 | 
							.doit = devlink_nl_cmd_sb_occ_snapshot_doit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
				
			||||||
				  DEVLINK_NL_FLAG_NEED_SB,
 | 
									  DEVLINK_NL_FLAG_NEED_SB,
 | 
				
			||||||
| 
						 | 
					@ -5029,7 +5016,6 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_SB_OCC_MAX_CLEAR,
 | 
							.cmd = DEVLINK_CMD_SB_OCC_MAX_CLEAR,
 | 
				
			||||||
		.doit = devlink_nl_cmd_sb_occ_max_clear_doit,
 | 
							.doit = devlink_nl_cmd_sb_occ_max_clear_doit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
				
			||||||
				  DEVLINK_NL_FLAG_NEED_SB,
 | 
									  DEVLINK_NL_FLAG_NEED_SB,
 | 
				
			||||||
| 
						 | 
					@ -5037,14 +5023,12 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_ESWITCH_GET,
 | 
							.cmd = DEVLINK_CMD_ESWITCH_GET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_eswitch_get_doit,
 | 
							.doit = devlink_nl_cmd_eswitch_get_doit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_ESWITCH_SET,
 | 
							.cmd = DEVLINK_CMD_ESWITCH_SET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_eswitch_set_doit,
 | 
							.doit = devlink_nl_cmd_eswitch_set_doit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
				
			||||||
				  DEVLINK_NL_FLAG_NO_LOCK,
 | 
									  DEVLINK_NL_FLAG_NO_LOCK,
 | 
				
			||||||
| 
						 | 
					@ -5052,49 +5036,42 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_DPIPE_TABLE_GET,
 | 
							.cmd = DEVLINK_CMD_DPIPE_TABLE_GET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_dpipe_table_get,
 | 
							.doit = devlink_nl_cmd_dpipe_table_get,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_DPIPE_ENTRIES_GET,
 | 
							.cmd = DEVLINK_CMD_DPIPE_ENTRIES_GET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_dpipe_entries_get,
 | 
							.doit = devlink_nl_cmd_dpipe_entries_get,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_DPIPE_HEADERS_GET,
 | 
							.cmd = DEVLINK_CMD_DPIPE_HEADERS_GET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_dpipe_headers_get,
 | 
							.doit = devlink_nl_cmd_dpipe_headers_get,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET,
 | 
							.cmd = DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_dpipe_table_counters_set,
 | 
							.doit = devlink_nl_cmd_dpipe_table_counters_set,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_RESOURCE_SET,
 | 
							.cmd = DEVLINK_CMD_RESOURCE_SET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_resource_set,
 | 
							.doit = devlink_nl_cmd_resource_set,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_RESOURCE_DUMP,
 | 
							.cmd = DEVLINK_CMD_RESOURCE_DUMP,
 | 
				
			||||||
		.doit = devlink_nl_cmd_resource_dump,
 | 
							.doit = devlink_nl_cmd_resource_dump,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_RELOAD,
 | 
							.cmd = DEVLINK_CMD_RELOAD,
 | 
				
			||||||
		.doit = devlink_nl_cmd_reload,
 | 
							.doit = devlink_nl_cmd_reload,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
				
			||||||
				  DEVLINK_NL_FLAG_NO_LOCK,
 | 
									  DEVLINK_NL_FLAG_NO_LOCK,
 | 
				
			||||||
| 
						 | 
					@ -5103,14 +5080,12 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
		.cmd = DEVLINK_CMD_PARAM_GET,
 | 
							.cmd = DEVLINK_CMD_PARAM_GET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_param_get_doit,
 | 
							.doit = devlink_nl_cmd_param_get_doit,
 | 
				
			||||||
		.dumpit = devlink_nl_cmd_param_get_dumpit,
 | 
							.dumpit = devlink_nl_cmd_param_get_dumpit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_PARAM_SET,
 | 
							.cmd = DEVLINK_CMD_PARAM_SET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_param_set_doit,
 | 
							.doit = devlink_nl_cmd_param_set_doit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -5118,14 +5093,12 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
		.cmd = DEVLINK_CMD_PORT_PARAM_GET,
 | 
							.cmd = DEVLINK_CMD_PORT_PARAM_GET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_port_param_get_doit,
 | 
							.doit = devlink_nl_cmd_port_param_get_doit,
 | 
				
			||||||
		.dumpit = devlink_nl_cmd_port_param_get_dumpit,
 | 
							.dumpit = devlink_nl_cmd_port_param_get_dumpit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_PORT,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_PORT,
 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_PORT_PARAM_SET,
 | 
							.cmd = DEVLINK_CMD_PORT_PARAM_SET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_port_param_set_doit,
 | 
							.doit = devlink_nl_cmd_port_param_set_doit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_PORT,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_PORT,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -5133,21 +5106,18 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
		.cmd = DEVLINK_CMD_REGION_GET,
 | 
							.cmd = DEVLINK_CMD_REGION_GET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_region_get_doit,
 | 
							.doit = devlink_nl_cmd_region_get_doit,
 | 
				
			||||||
		.dumpit = devlink_nl_cmd_region_get_dumpit,
 | 
							.dumpit = devlink_nl_cmd_region_get_dumpit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_REGION_DEL,
 | 
							.cmd = DEVLINK_CMD_REGION_DEL,
 | 
				
			||||||
		.doit = devlink_nl_cmd_region_del,
 | 
							.doit = devlink_nl_cmd_region_del,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_REGION_READ,
 | 
							.cmd = DEVLINK_CMD_REGION_READ,
 | 
				
			||||||
		.dumpit = devlink_nl_cmd_region_read_dumpit,
 | 
							.dumpit = devlink_nl_cmd_region_read_dumpit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -5155,7 +5125,6 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
		.cmd = DEVLINK_CMD_INFO_GET,
 | 
							.cmd = DEVLINK_CMD_INFO_GET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_info_get_doit,
 | 
							.doit = devlink_nl_cmd_info_get_doit,
 | 
				
			||||||
		.dumpit = devlink_nl_cmd_info_get_dumpit,
 | 
							.dumpit = devlink_nl_cmd_info_get_dumpit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -5163,35 +5132,30 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
		.cmd = DEVLINK_CMD_HEALTH_REPORTER_GET,
 | 
							.cmd = DEVLINK_CMD_HEALTH_REPORTER_GET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_health_reporter_get_doit,
 | 
							.doit = devlink_nl_cmd_health_reporter_get_doit,
 | 
				
			||||||
		.dumpit = devlink_nl_cmd_health_reporter_get_dumpit,
 | 
							.dumpit = devlink_nl_cmd_health_reporter_get_dumpit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_HEALTH_REPORTER_SET,
 | 
							.cmd = DEVLINK_CMD_HEALTH_REPORTER_SET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_health_reporter_set_doit,
 | 
							.doit = devlink_nl_cmd_health_reporter_set_doit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_HEALTH_REPORTER_RECOVER,
 | 
							.cmd = DEVLINK_CMD_HEALTH_REPORTER_RECOVER,
 | 
				
			||||||
		.doit = devlink_nl_cmd_health_reporter_recover_doit,
 | 
							.doit = devlink_nl_cmd_health_reporter_recover_doit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE,
 | 
							.cmd = DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE,
 | 
				
			||||||
		.doit = devlink_nl_cmd_health_reporter_diagnose_doit,
 | 
							.doit = devlink_nl_cmd_health_reporter_diagnose_doit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET,
 | 
							.cmd = DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET,
 | 
				
			||||||
		.doit = devlink_nl_cmd_health_reporter_dump_get_doit,
 | 
							.doit = devlink_nl_cmd_health_reporter_dump_get_doit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
				
			||||||
				  DEVLINK_NL_FLAG_NO_LOCK,
 | 
									  DEVLINK_NL_FLAG_NO_LOCK,
 | 
				
			||||||
| 
						 | 
					@ -5199,7 +5163,6 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR,
 | 
							.cmd = DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR,
 | 
				
			||||||
		.doit = devlink_nl_cmd_health_reporter_dump_clear_doit,
 | 
							.doit = devlink_nl_cmd_health_reporter_dump_clear_doit,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK |
 | 
				
			||||||
				  DEVLINK_NL_FLAG_NO_LOCK,
 | 
									  DEVLINK_NL_FLAG_NO_LOCK,
 | 
				
			||||||
| 
						 | 
					@ -5207,7 +5170,6 @@ static const struct genl_ops devlink_nl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = DEVLINK_CMD_FLASH_UPDATE,
 | 
							.cmd = DEVLINK_CMD_FLASH_UPDATE,
 | 
				
			||||||
		.doit = devlink_nl_cmd_flash_update,
 | 
							.doit = devlink_nl_cmd_flash_update,
 | 
				
			||||||
		.policy = devlink_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
							.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -5217,6 +5179,7 @@ static struct genl_family devlink_nl_family __ro_after_init = {
 | 
				
			||||||
	.name		= DEVLINK_GENL_NAME,
 | 
						.name		= DEVLINK_GENL_NAME,
 | 
				
			||||||
	.version	= DEVLINK_GENL_VERSION,
 | 
						.version	= DEVLINK_GENL_VERSION,
 | 
				
			||||||
	.maxattr	= DEVLINK_ATTR_MAX,
 | 
						.maxattr	= DEVLINK_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = devlink_nl_policy,
 | 
				
			||||||
	.netnsok	= true,
 | 
						.netnsok	= true,
 | 
				
			||||||
	.pre_doit	= devlink_nl_pre_doit,
 | 
						.pre_doit	= devlink_nl_pre_doit,
 | 
				
			||||||
	.post_doit	= devlink_nl_post_doit,
 | 
						.post_doit	= devlink_nl_post_doit,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -449,14 +449,12 @@ static const struct genl_ops hsr_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = HSR_C_GET_NODE_STATUS,
 | 
							.cmd = HSR_C_GET_NODE_STATUS,
 | 
				
			||||||
		.flags = 0,
 | 
							.flags = 0,
 | 
				
			||||||
		.policy = hsr_genl_policy,
 | 
					 | 
				
			||||||
		.doit = hsr_get_node_status,
 | 
							.doit = hsr_get_node_status,
 | 
				
			||||||
		.dumpit = NULL,
 | 
							.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = HSR_C_GET_NODE_LIST,
 | 
							.cmd = HSR_C_GET_NODE_LIST,
 | 
				
			||||||
		.flags = 0,
 | 
							.flags = 0,
 | 
				
			||||||
		.policy = hsr_genl_policy,
 | 
					 | 
				
			||||||
		.doit = hsr_get_node_list,
 | 
							.doit = hsr_get_node_list,
 | 
				
			||||||
		.dumpit = NULL,
 | 
							.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -467,6 +465,7 @@ static struct genl_family hsr_genl_family __ro_after_init = {
 | 
				
			||||||
	.name = "HSR",
 | 
						.name = "HSR",
 | 
				
			||||||
	.version = 1,
 | 
						.version = 1,
 | 
				
			||||||
	.maxattr = HSR_A_MAX,
 | 
						.maxattr = HSR_A_MAX,
 | 
				
			||||||
 | 
						.policy = hsr_genl_policy,
 | 
				
			||||||
	.module = THIS_MODULE,
 | 
						.module = THIS_MODULE,
 | 
				
			||||||
	.ops = hsr_ops,
 | 
						.ops = hsr_ops,
 | 
				
			||||||
	.n_ops = ARRAY_SIZE(hsr_ops),
 | 
						.n_ops = ARRAY_SIZE(hsr_ops),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,6 @@ void ieee802154_nl_exit(void);
 | 
				
			||||||
#define IEEE802154_OP(_cmd, _func)			\
 | 
					#define IEEE802154_OP(_cmd, _func)			\
 | 
				
			||||||
	{						\
 | 
						{						\
 | 
				
			||||||
		.cmd	= _cmd,				\
 | 
							.cmd	= _cmd,				\
 | 
				
			||||||
		.policy	= ieee802154_policy,		\
 | 
					 | 
				
			||||||
		.doit	= _func,			\
 | 
							.doit	= _func,			\
 | 
				
			||||||
		.dumpit	= NULL,				\
 | 
							.dumpit	= NULL,				\
 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,		\
 | 
							.flags	= GENL_ADMIN_PERM,		\
 | 
				
			||||||
| 
						 | 
					@ -29,7 +28,6 @@ void ieee802154_nl_exit(void);
 | 
				
			||||||
#define IEEE802154_DUMP(_cmd, _func, _dump)		\
 | 
					#define IEEE802154_DUMP(_cmd, _func, _dump)		\
 | 
				
			||||||
	{						\
 | 
						{						\
 | 
				
			||||||
		.cmd	= _cmd,				\
 | 
							.cmd	= _cmd,				\
 | 
				
			||||||
		.policy	= ieee802154_policy,		\
 | 
					 | 
				
			||||||
		.doit	= _func,			\
 | 
							.doit	= _func,			\
 | 
				
			||||||
		.dumpit	= _dump,			\
 | 
							.dumpit	= _dump,			\
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -136,6 +136,7 @@ struct genl_family nl802154_family __ro_after_init = {
 | 
				
			||||||
	.name		= IEEE802154_NL_NAME,
 | 
						.name		= IEEE802154_NL_NAME,
 | 
				
			||||||
	.version	= 1,
 | 
						.version	= 1,
 | 
				
			||||||
	.maxattr	= IEEE802154_ATTR_MAX,
 | 
						.maxattr	= IEEE802154_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy		= ieee802154_policy,
 | 
				
			||||||
	.module		= THIS_MODULE,
 | 
						.module		= THIS_MODULE,
 | 
				
			||||||
	.ops		= ieee802154_ops,
 | 
						.ops		= ieee802154_ops,
 | 
				
			||||||
	.n_ops		= ARRAY_SIZE(ieee802154_ops),
 | 
						.n_ops		= ARRAY_SIZE(ieee802154_ops),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2220,7 +2220,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
		.doit = nl802154_get_wpan_phy,
 | 
							.doit = nl802154_get_wpan_phy,
 | 
				
			||||||
		.dumpit = nl802154_dump_wpan_phy,
 | 
							.dumpit = nl802154_dump_wpan_phy,
 | 
				
			||||||
		.done = nl802154_dump_wpan_phy_done,
 | 
							.done = nl802154_dump_wpan_phy_done,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_WPAN_PHY |
 | 
							.internal_flags = NL802154_FLAG_NEED_WPAN_PHY |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2229,7 +2228,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
		.cmd = NL802154_CMD_GET_INTERFACE,
 | 
							.cmd = NL802154_CMD_GET_INTERFACE,
 | 
				
			||||||
		.doit = nl802154_get_interface,
 | 
							.doit = nl802154_get_interface,
 | 
				
			||||||
		.dumpit = nl802154_dump_interface,
 | 
							.dumpit = nl802154_dump_interface,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_WPAN_DEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_WPAN_DEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2237,7 +2235,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_NEW_INTERFACE,
 | 
							.cmd = NL802154_CMD_NEW_INTERFACE,
 | 
				
			||||||
		.doit = nl802154_new_interface,
 | 
							.doit = nl802154_new_interface,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_WPAN_PHY |
 | 
							.internal_flags = NL802154_FLAG_NEED_WPAN_PHY |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2245,7 +2242,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_DEL_INTERFACE,
 | 
							.cmd = NL802154_CMD_DEL_INTERFACE,
 | 
				
			||||||
		.doit = nl802154_del_interface,
 | 
							.doit = nl802154_del_interface,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_WPAN_DEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_WPAN_DEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2253,7 +2249,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_SET_CHANNEL,
 | 
							.cmd = NL802154_CMD_SET_CHANNEL,
 | 
				
			||||||
		.doit = nl802154_set_channel,
 | 
							.doit = nl802154_set_channel,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_WPAN_PHY |
 | 
							.internal_flags = NL802154_FLAG_NEED_WPAN_PHY |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2261,7 +2256,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_SET_CCA_MODE,
 | 
							.cmd = NL802154_CMD_SET_CCA_MODE,
 | 
				
			||||||
		.doit = nl802154_set_cca_mode,
 | 
							.doit = nl802154_set_cca_mode,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_WPAN_PHY |
 | 
							.internal_flags = NL802154_FLAG_NEED_WPAN_PHY |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2269,7 +2263,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_SET_CCA_ED_LEVEL,
 | 
							.cmd = NL802154_CMD_SET_CCA_ED_LEVEL,
 | 
				
			||||||
		.doit = nl802154_set_cca_ed_level,
 | 
							.doit = nl802154_set_cca_ed_level,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_WPAN_PHY |
 | 
							.internal_flags = NL802154_FLAG_NEED_WPAN_PHY |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2277,7 +2270,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_SET_TX_POWER,
 | 
							.cmd = NL802154_CMD_SET_TX_POWER,
 | 
				
			||||||
		.doit = nl802154_set_tx_power,
 | 
							.doit = nl802154_set_tx_power,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_WPAN_PHY |
 | 
							.internal_flags = NL802154_FLAG_NEED_WPAN_PHY |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2285,7 +2277,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_SET_WPAN_PHY_NETNS,
 | 
							.cmd = NL802154_CMD_SET_WPAN_PHY_NETNS,
 | 
				
			||||||
		.doit = nl802154_wpan_phy_netns,
 | 
							.doit = nl802154_wpan_phy_netns,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_WPAN_PHY |
 | 
							.internal_flags = NL802154_FLAG_NEED_WPAN_PHY |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2293,7 +2284,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_SET_PAN_ID,
 | 
							.cmd = NL802154_CMD_SET_PAN_ID,
 | 
				
			||||||
		.doit = nl802154_set_pan_id,
 | 
							.doit = nl802154_set_pan_id,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2301,7 +2291,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_SET_SHORT_ADDR,
 | 
							.cmd = NL802154_CMD_SET_SHORT_ADDR,
 | 
				
			||||||
		.doit = nl802154_set_short_addr,
 | 
							.doit = nl802154_set_short_addr,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2309,7 +2298,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_SET_BACKOFF_EXPONENT,
 | 
							.cmd = NL802154_CMD_SET_BACKOFF_EXPONENT,
 | 
				
			||||||
		.doit = nl802154_set_backoff_exponent,
 | 
							.doit = nl802154_set_backoff_exponent,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2317,7 +2305,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_SET_MAX_CSMA_BACKOFFS,
 | 
							.cmd = NL802154_CMD_SET_MAX_CSMA_BACKOFFS,
 | 
				
			||||||
		.doit = nl802154_set_max_csma_backoffs,
 | 
							.doit = nl802154_set_max_csma_backoffs,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2325,7 +2312,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_SET_MAX_FRAME_RETRIES,
 | 
							.cmd = NL802154_CMD_SET_MAX_FRAME_RETRIES,
 | 
				
			||||||
		.doit = nl802154_set_max_frame_retries,
 | 
							.doit = nl802154_set_max_frame_retries,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2333,7 +2319,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_SET_LBT_MODE,
 | 
							.cmd = NL802154_CMD_SET_LBT_MODE,
 | 
				
			||||||
		.doit = nl802154_set_lbt_mode,
 | 
							.doit = nl802154_set_lbt_mode,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2341,7 +2326,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_SET_ACKREQ_DEFAULT,
 | 
							.cmd = NL802154_CMD_SET_ACKREQ_DEFAULT,
 | 
				
			||||||
		.doit = nl802154_set_ackreq_default,
 | 
							.doit = nl802154_set_ackreq_default,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2350,7 +2334,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_SET_SEC_PARAMS,
 | 
							.cmd = NL802154_CMD_SET_SEC_PARAMS,
 | 
				
			||||||
		.doit = nl802154_set_llsec_params,
 | 
							.doit = nl802154_set_llsec_params,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2359,7 +2342,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
		.cmd = NL802154_CMD_GET_SEC_KEY,
 | 
							.cmd = NL802154_CMD_GET_SEC_KEY,
 | 
				
			||||||
		/* TODO .doit by matching key id? */
 | 
							/* TODO .doit by matching key id? */
 | 
				
			||||||
		.dumpit = nl802154_dump_llsec_key,
 | 
							.dumpit = nl802154_dump_llsec_key,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2367,7 +2349,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_NEW_SEC_KEY,
 | 
							.cmd = NL802154_CMD_NEW_SEC_KEY,
 | 
				
			||||||
		.doit = nl802154_add_llsec_key,
 | 
							.doit = nl802154_add_llsec_key,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2375,7 +2356,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_DEL_SEC_KEY,
 | 
							.cmd = NL802154_CMD_DEL_SEC_KEY,
 | 
				
			||||||
		.doit = nl802154_del_llsec_key,
 | 
							.doit = nl802154_del_llsec_key,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2385,7 +2365,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
		.cmd = NL802154_CMD_GET_SEC_DEV,
 | 
							.cmd = NL802154_CMD_GET_SEC_DEV,
 | 
				
			||||||
		/* TODO .doit by matching extended_addr? */
 | 
							/* TODO .doit by matching extended_addr? */
 | 
				
			||||||
		.dumpit = nl802154_dump_llsec_dev,
 | 
							.dumpit = nl802154_dump_llsec_dev,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2393,7 +2372,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_NEW_SEC_DEV,
 | 
							.cmd = NL802154_CMD_NEW_SEC_DEV,
 | 
				
			||||||
		.doit = nl802154_add_llsec_dev,
 | 
							.doit = nl802154_add_llsec_dev,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2401,7 +2379,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_DEL_SEC_DEV,
 | 
							.cmd = NL802154_CMD_DEL_SEC_DEV,
 | 
				
			||||||
		.doit = nl802154_del_llsec_dev,
 | 
							.doit = nl802154_del_llsec_dev,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2411,7 +2388,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
		.cmd = NL802154_CMD_GET_SEC_DEVKEY,
 | 
							.cmd = NL802154_CMD_GET_SEC_DEVKEY,
 | 
				
			||||||
		/* TODO doit by matching ??? */
 | 
							/* TODO doit by matching ??? */
 | 
				
			||||||
		.dumpit = nl802154_dump_llsec_devkey,
 | 
							.dumpit = nl802154_dump_llsec_devkey,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2419,7 +2395,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_NEW_SEC_DEVKEY,
 | 
							.cmd = NL802154_CMD_NEW_SEC_DEVKEY,
 | 
				
			||||||
		.doit = nl802154_add_llsec_devkey,
 | 
							.doit = nl802154_add_llsec_devkey,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2427,7 +2402,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_DEL_SEC_DEVKEY,
 | 
							.cmd = NL802154_CMD_DEL_SEC_DEVKEY,
 | 
				
			||||||
		.doit = nl802154_del_llsec_devkey,
 | 
							.doit = nl802154_del_llsec_devkey,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2436,7 +2410,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
		.cmd = NL802154_CMD_GET_SEC_LEVEL,
 | 
							.cmd = NL802154_CMD_GET_SEC_LEVEL,
 | 
				
			||||||
		/* TODO .doit by matching frame_type? */
 | 
							/* TODO .doit by matching frame_type? */
 | 
				
			||||||
		.dumpit = nl802154_dump_llsec_seclevel,
 | 
							.dumpit = nl802154_dump_llsec_seclevel,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2444,7 +2417,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL802154_CMD_NEW_SEC_LEVEL,
 | 
							.cmd = NL802154_CMD_NEW_SEC_LEVEL,
 | 
				
			||||||
		.doit = nl802154_add_llsec_seclevel,
 | 
							.doit = nl802154_add_llsec_seclevel,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2453,7 +2425,6 @@ static const struct genl_ops nl802154_ops[] = {
 | 
				
			||||||
		.cmd = NL802154_CMD_DEL_SEC_LEVEL,
 | 
							.cmd = NL802154_CMD_DEL_SEC_LEVEL,
 | 
				
			||||||
		/* TODO match frame_type only? */
 | 
							/* TODO match frame_type only? */
 | 
				
			||||||
		.doit = nl802154_del_llsec_seclevel,
 | 
							.doit = nl802154_del_llsec_seclevel,
 | 
				
			||||||
		.policy = nl802154_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL802154_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL802154_FLAG_NEED_RTNL,
 | 
									  NL802154_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -2466,6 +2437,7 @@ static struct genl_family nl802154_fam __ro_after_init = {
 | 
				
			||||||
	.hdrsize = 0,			/* no private header */
 | 
						.hdrsize = 0,			/* no private header */
 | 
				
			||||||
	.version = 1,			/* no particular meaning now */
 | 
						.version = 1,			/* no particular meaning now */
 | 
				
			||||||
	.maxattr = NL802154_ATTR_MAX,
 | 
						.maxattr = NL802154_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = nl802154_policy,
 | 
				
			||||||
	.netnsok = true,
 | 
						.netnsok = true,
 | 
				
			||||||
	.pre_doit = nl802154_pre_doit,
 | 
						.pre_doit = nl802154_pre_doit,
 | 
				
			||||||
	.post_doit = nl802154_post_doit,
 | 
						.post_doit = nl802154_post_doit,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -808,20 +808,17 @@ static const struct genl_ops fou_nl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = FOU_CMD_ADD,
 | 
							.cmd = FOU_CMD_ADD,
 | 
				
			||||||
		.doit = fou_nl_cmd_add_port,
 | 
							.doit = fou_nl_cmd_add_port,
 | 
				
			||||||
		.policy = fou_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = FOU_CMD_DEL,
 | 
							.cmd = FOU_CMD_DEL,
 | 
				
			||||||
		.doit = fou_nl_cmd_rm_port,
 | 
							.doit = fou_nl_cmd_rm_port,
 | 
				
			||||||
		.policy = fou_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = FOU_CMD_GET,
 | 
							.cmd = FOU_CMD_GET,
 | 
				
			||||||
		.doit = fou_nl_cmd_get_port,
 | 
							.doit = fou_nl_cmd_get_port,
 | 
				
			||||||
		.dumpit = fou_nl_dump,
 | 
							.dumpit = fou_nl_dump,
 | 
				
			||||||
		.policy = fou_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -830,6 +827,7 @@ static struct genl_family fou_nl_family __ro_after_init = {
 | 
				
			||||||
	.name		= FOU_GENL_NAME,
 | 
						.name		= FOU_GENL_NAME,
 | 
				
			||||||
	.version	= FOU_GENL_VERSION,
 | 
						.version	= FOU_GENL_VERSION,
 | 
				
			||||||
	.maxattr	= FOU_ATTR_MAX,
 | 
						.maxattr	= FOU_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = fou_nl_policy,
 | 
				
			||||||
	.netnsok	= true,
 | 
						.netnsok	= true,
 | 
				
			||||||
	.module		= THIS_MODULE,
 | 
						.module		= THIS_MODULE,
 | 
				
			||||||
	.ops		= fou_nl_ops,
 | 
						.ops		= fou_nl_ops,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -953,12 +953,10 @@ static const struct genl_ops tcp_metrics_nl_ops[] = {
 | 
				
			||||||
		.cmd = TCP_METRICS_CMD_GET,
 | 
							.cmd = TCP_METRICS_CMD_GET,
 | 
				
			||||||
		.doit = tcp_metrics_nl_cmd_get,
 | 
							.doit = tcp_metrics_nl_cmd_get,
 | 
				
			||||||
		.dumpit = tcp_metrics_nl_dump,
 | 
							.dumpit = tcp_metrics_nl_dump,
 | 
				
			||||||
		.policy = tcp_metrics_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = TCP_METRICS_CMD_DEL,
 | 
							.cmd = TCP_METRICS_CMD_DEL,
 | 
				
			||||||
		.doit = tcp_metrics_nl_cmd_del,
 | 
							.doit = tcp_metrics_nl_cmd_del,
 | 
				
			||||||
		.policy = tcp_metrics_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -968,6 +966,7 @@ static struct genl_family tcp_metrics_nl_family __ro_after_init = {
 | 
				
			||||||
	.name		= TCP_METRICS_GENL_NAME,
 | 
						.name		= TCP_METRICS_GENL_NAME,
 | 
				
			||||||
	.version	= TCP_METRICS_GENL_VERSION,
 | 
						.version	= TCP_METRICS_GENL_VERSION,
 | 
				
			||||||
	.maxattr	= TCP_METRICS_ATTR_MAX,
 | 
						.maxattr	= TCP_METRICS_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = tcp_metrics_nl_policy,
 | 
				
			||||||
	.netnsok	= true,
 | 
						.netnsok	= true,
 | 
				
			||||||
	.module		= THIS_MODULE,
 | 
						.module		= THIS_MODULE,
 | 
				
			||||||
	.ops		= tcp_metrics_nl_ops,
 | 
						.ops		= tcp_metrics_nl_ops,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,19 +17,16 @@ static const struct genl_ops ila_nl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = ILA_CMD_ADD,
 | 
							.cmd = ILA_CMD_ADD,
 | 
				
			||||||
		.doit = ila_xlat_nl_cmd_add_mapping,
 | 
							.doit = ila_xlat_nl_cmd_add_mapping,
 | 
				
			||||||
		.policy = ila_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = ILA_CMD_DEL,
 | 
							.cmd = ILA_CMD_DEL,
 | 
				
			||||||
		.doit = ila_xlat_nl_cmd_del_mapping,
 | 
							.doit = ila_xlat_nl_cmd_del_mapping,
 | 
				
			||||||
		.policy = ila_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = ILA_CMD_FLUSH,
 | 
							.cmd = ILA_CMD_FLUSH,
 | 
				
			||||||
		.doit = ila_xlat_nl_cmd_flush,
 | 
							.doit = ila_xlat_nl_cmd_flush,
 | 
				
			||||||
		.policy = ila_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -38,7 +35,6 @@ static const struct genl_ops ila_nl_ops[] = {
 | 
				
			||||||
		.start = ila_xlat_nl_dump_start,
 | 
							.start = ila_xlat_nl_dump_start,
 | 
				
			||||||
		.dumpit = ila_xlat_nl_dump,
 | 
							.dumpit = ila_xlat_nl_dump,
 | 
				
			||||||
		.done = ila_xlat_nl_dump_done,
 | 
							.done = ila_xlat_nl_dump_done,
 | 
				
			||||||
		.policy = ila_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,6 +45,7 @@ struct genl_family ila_nl_family __ro_after_init = {
 | 
				
			||||||
	.name		= ILA_GENL_NAME,
 | 
						.name		= ILA_GENL_NAME,
 | 
				
			||||||
	.version	= ILA_GENL_VERSION,
 | 
						.version	= ILA_GENL_VERSION,
 | 
				
			||||||
	.maxattr	= ILA_ATTR_MAX,
 | 
						.maxattr	= ILA_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = ila_nl_policy,
 | 
				
			||||||
	.netnsok	= true,
 | 
						.netnsok	= true,
 | 
				
			||||||
	.parallel_ops	= true,
 | 
						.parallel_ops	= true,
 | 
				
			||||||
	.module		= THIS_MODULE,
 | 
						.module		= THIS_MODULE,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -399,7 +399,6 @@ static const struct genl_ops seg6_genl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= SEG6_CMD_SETHMAC,
 | 
							.cmd	= SEG6_CMD_SETHMAC,
 | 
				
			||||||
		.doit	= seg6_genl_sethmac,
 | 
							.doit	= seg6_genl_sethmac,
 | 
				
			||||||
		.policy	= seg6_genl_policy,
 | 
					 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -407,19 +406,16 @@ static const struct genl_ops seg6_genl_ops[] = {
 | 
				
			||||||
		.start	= seg6_genl_dumphmac_start,
 | 
							.start	= seg6_genl_dumphmac_start,
 | 
				
			||||||
		.dumpit	= seg6_genl_dumphmac,
 | 
							.dumpit	= seg6_genl_dumphmac,
 | 
				
			||||||
		.done	= seg6_genl_dumphmac_done,
 | 
							.done	= seg6_genl_dumphmac_done,
 | 
				
			||||||
		.policy	= seg6_genl_policy,
 | 
					 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= SEG6_CMD_SET_TUNSRC,
 | 
							.cmd	= SEG6_CMD_SET_TUNSRC,
 | 
				
			||||||
		.doit	= seg6_genl_set_tunsrc,
 | 
							.doit	= seg6_genl_set_tunsrc,
 | 
				
			||||||
		.policy	= seg6_genl_policy,
 | 
					 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= SEG6_CMD_GET_TUNSRC,
 | 
							.cmd	= SEG6_CMD_GET_TUNSRC,
 | 
				
			||||||
		.doit	= seg6_genl_get_tunsrc,
 | 
							.doit	= seg6_genl_get_tunsrc,
 | 
				
			||||||
		.policy = seg6_genl_policy,
 | 
					 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -429,6 +425,7 @@ static struct genl_family seg6_genl_family __ro_after_init = {
 | 
				
			||||||
	.name		= SEG6_GENL_NAME,
 | 
						.name		= SEG6_GENL_NAME,
 | 
				
			||||||
	.version	= SEG6_GENL_VERSION,
 | 
						.version	= SEG6_GENL_VERSION,
 | 
				
			||||||
	.maxattr	= SEG6_ATTR_MAX,
 | 
						.maxattr	= SEG6_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = seg6_genl_policy,
 | 
				
			||||||
	.netnsok	= true,
 | 
						.netnsok	= true,
 | 
				
			||||||
	.parallel_ops	= true,
 | 
						.parallel_ops	= true,
 | 
				
			||||||
	.ops		= seg6_genl_ops,
 | 
						.ops		= seg6_genl_ops,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -916,57 +916,48 @@ static const struct genl_ops l2tp_nl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = L2TP_CMD_NOOP,
 | 
							.cmd = L2TP_CMD_NOOP,
 | 
				
			||||||
		.doit = l2tp_nl_cmd_noop,
 | 
							.doit = l2tp_nl_cmd_noop,
 | 
				
			||||||
		.policy = l2tp_nl_policy,
 | 
					 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = L2TP_CMD_TUNNEL_CREATE,
 | 
							.cmd = L2TP_CMD_TUNNEL_CREATE,
 | 
				
			||||||
		.doit = l2tp_nl_cmd_tunnel_create,
 | 
							.doit = l2tp_nl_cmd_tunnel_create,
 | 
				
			||||||
		.policy = l2tp_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = L2TP_CMD_TUNNEL_DELETE,
 | 
							.cmd = L2TP_CMD_TUNNEL_DELETE,
 | 
				
			||||||
		.doit = l2tp_nl_cmd_tunnel_delete,
 | 
							.doit = l2tp_nl_cmd_tunnel_delete,
 | 
				
			||||||
		.policy = l2tp_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = L2TP_CMD_TUNNEL_MODIFY,
 | 
							.cmd = L2TP_CMD_TUNNEL_MODIFY,
 | 
				
			||||||
		.doit = l2tp_nl_cmd_tunnel_modify,
 | 
							.doit = l2tp_nl_cmd_tunnel_modify,
 | 
				
			||||||
		.policy = l2tp_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = L2TP_CMD_TUNNEL_GET,
 | 
							.cmd = L2TP_CMD_TUNNEL_GET,
 | 
				
			||||||
		.doit = l2tp_nl_cmd_tunnel_get,
 | 
							.doit = l2tp_nl_cmd_tunnel_get,
 | 
				
			||||||
		.dumpit = l2tp_nl_cmd_tunnel_dump,
 | 
							.dumpit = l2tp_nl_cmd_tunnel_dump,
 | 
				
			||||||
		.policy = l2tp_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = L2TP_CMD_SESSION_CREATE,
 | 
							.cmd = L2TP_CMD_SESSION_CREATE,
 | 
				
			||||||
		.doit = l2tp_nl_cmd_session_create,
 | 
							.doit = l2tp_nl_cmd_session_create,
 | 
				
			||||||
		.policy = l2tp_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = L2TP_CMD_SESSION_DELETE,
 | 
							.cmd = L2TP_CMD_SESSION_DELETE,
 | 
				
			||||||
		.doit = l2tp_nl_cmd_session_delete,
 | 
							.doit = l2tp_nl_cmd_session_delete,
 | 
				
			||||||
		.policy = l2tp_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = L2TP_CMD_SESSION_MODIFY,
 | 
							.cmd = L2TP_CMD_SESSION_MODIFY,
 | 
				
			||||||
		.doit = l2tp_nl_cmd_session_modify,
 | 
							.doit = l2tp_nl_cmd_session_modify,
 | 
				
			||||||
		.policy = l2tp_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = L2TP_CMD_SESSION_GET,
 | 
							.cmd = L2TP_CMD_SESSION_GET,
 | 
				
			||||||
		.doit = l2tp_nl_cmd_session_get,
 | 
							.doit = l2tp_nl_cmd_session_get,
 | 
				
			||||||
		.dumpit = l2tp_nl_cmd_session_dump,
 | 
							.dumpit = l2tp_nl_cmd_session_dump,
 | 
				
			||||||
		.policy = l2tp_nl_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -976,6 +967,7 @@ static struct genl_family l2tp_nl_family __ro_after_init = {
 | 
				
			||||||
	.version	= L2TP_GENL_VERSION,
 | 
						.version	= L2TP_GENL_VERSION,
 | 
				
			||||||
	.hdrsize	= 0,
 | 
						.hdrsize	= 0,
 | 
				
			||||||
	.maxattr	= L2TP_ATTR_MAX,
 | 
						.maxattr	= L2TP_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = l2tp_nl_policy,
 | 
				
			||||||
	.netnsok	= true,
 | 
						.netnsok	= true,
 | 
				
			||||||
	.module		= THIS_MODULE,
 | 
						.module		= THIS_MODULE,
 | 
				
			||||||
	.ops		= l2tp_nl_ops,
 | 
						.ops		= l2tp_nl_ops,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -723,38 +723,32 @@ static int ncsi_set_channel_mask_nl(struct sk_buff *msg,
 | 
				
			||||||
static const struct genl_ops ncsi_ops[] = {
 | 
					static const struct genl_ops ncsi_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NCSI_CMD_PKG_INFO,
 | 
							.cmd = NCSI_CMD_PKG_INFO,
 | 
				
			||||||
		.policy = ncsi_genl_policy,
 | 
					 | 
				
			||||||
		.doit = ncsi_pkg_info_nl,
 | 
							.doit = ncsi_pkg_info_nl,
 | 
				
			||||||
		.dumpit = ncsi_pkg_info_all_nl,
 | 
							.dumpit = ncsi_pkg_info_all_nl,
 | 
				
			||||||
		.flags = 0,
 | 
							.flags = 0,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NCSI_CMD_SET_INTERFACE,
 | 
							.cmd = NCSI_CMD_SET_INTERFACE,
 | 
				
			||||||
		.policy = ncsi_genl_policy,
 | 
					 | 
				
			||||||
		.doit = ncsi_set_interface_nl,
 | 
							.doit = ncsi_set_interface_nl,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NCSI_CMD_CLEAR_INTERFACE,
 | 
							.cmd = NCSI_CMD_CLEAR_INTERFACE,
 | 
				
			||||||
		.policy = ncsi_genl_policy,
 | 
					 | 
				
			||||||
		.doit = ncsi_clear_interface_nl,
 | 
							.doit = ncsi_clear_interface_nl,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NCSI_CMD_SEND_CMD,
 | 
							.cmd = NCSI_CMD_SEND_CMD,
 | 
				
			||||||
		.policy = ncsi_genl_policy,
 | 
					 | 
				
			||||||
		.doit = ncsi_send_cmd_nl,
 | 
							.doit = ncsi_send_cmd_nl,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NCSI_CMD_SET_PACKAGE_MASK,
 | 
							.cmd = NCSI_CMD_SET_PACKAGE_MASK,
 | 
				
			||||||
		.policy = ncsi_genl_policy,
 | 
					 | 
				
			||||||
		.doit = ncsi_set_package_mask_nl,
 | 
							.doit = ncsi_set_package_mask_nl,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NCSI_CMD_SET_CHANNEL_MASK,
 | 
							.cmd = NCSI_CMD_SET_CHANNEL_MASK,
 | 
				
			||||||
		.policy = ncsi_genl_policy,
 | 
					 | 
				
			||||||
		.doit = ncsi_set_channel_mask_nl,
 | 
							.doit = ncsi_set_channel_mask_nl,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -764,6 +758,7 @@ static struct genl_family ncsi_genl_family __ro_after_init = {
 | 
				
			||||||
	.name = "NCSI",
 | 
						.name = "NCSI",
 | 
				
			||||||
	.version = 0,
 | 
						.version = 0,
 | 
				
			||||||
	.maxattr = NCSI_ATTR_MAX,
 | 
						.maxattr = NCSI_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = ncsi_genl_policy,
 | 
				
			||||||
	.module = THIS_MODULE,
 | 
						.module = THIS_MODULE,
 | 
				
			||||||
	.ops = ncsi_ops,
 | 
						.ops = ncsi_ops,
 | 
				
			||||||
	.n_ops = ARRAY_SIZE(ncsi_ops),
 | 
						.n_ops = ARRAY_SIZE(ncsi_ops),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3775,19 +3775,16 @@ static const struct genl_ops ip_vs_genl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= IPVS_CMD_NEW_SERVICE,
 | 
							.cmd	= IPVS_CMD_NEW_SERVICE,
 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy	= ip_vs_cmd_policy,
 | 
					 | 
				
			||||||
		.doit	= ip_vs_genl_set_cmd,
 | 
							.doit	= ip_vs_genl_set_cmd,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= IPVS_CMD_SET_SERVICE,
 | 
							.cmd	= IPVS_CMD_SET_SERVICE,
 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy	= ip_vs_cmd_policy,
 | 
					 | 
				
			||||||
		.doit	= ip_vs_genl_set_cmd,
 | 
							.doit	= ip_vs_genl_set_cmd,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= IPVS_CMD_DEL_SERVICE,
 | 
							.cmd	= IPVS_CMD_DEL_SERVICE,
 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy	= ip_vs_cmd_policy,
 | 
					 | 
				
			||||||
		.doit	= ip_vs_genl_set_cmd,
 | 
							.doit	= ip_vs_genl_set_cmd,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -3795,42 +3792,35 @@ static const struct genl_ops ip_vs_genl_ops[] = {
 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
		.doit	= ip_vs_genl_get_cmd,
 | 
							.doit	= ip_vs_genl_get_cmd,
 | 
				
			||||||
		.dumpit	= ip_vs_genl_dump_services,
 | 
							.dumpit	= ip_vs_genl_dump_services,
 | 
				
			||||||
		.policy	= ip_vs_cmd_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= IPVS_CMD_NEW_DEST,
 | 
							.cmd	= IPVS_CMD_NEW_DEST,
 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy	= ip_vs_cmd_policy,
 | 
					 | 
				
			||||||
		.doit	= ip_vs_genl_set_cmd,
 | 
							.doit	= ip_vs_genl_set_cmd,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= IPVS_CMD_SET_DEST,
 | 
							.cmd	= IPVS_CMD_SET_DEST,
 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy	= ip_vs_cmd_policy,
 | 
					 | 
				
			||||||
		.doit	= ip_vs_genl_set_cmd,
 | 
							.doit	= ip_vs_genl_set_cmd,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= IPVS_CMD_DEL_DEST,
 | 
							.cmd	= IPVS_CMD_DEL_DEST,
 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy	= ip_vs_cmd_policy,
 | 
					 | 
				
			||||||
		.doit	= ip_vs_genl_set_cmd,
 | 
							.doit	= ip_vs_genl_set_cmd,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= IPVS_CMD_GET_DEST,
 | 
							.cmd	= IPVS_CMD_GET_DEST,
 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy	= ip_vs_cmd_policy,
 | 
					 | 
				
			||||||
		.dumpit	= ip_vs_genl_dump_dests,
 | 
							.dumpit	= ip_vs_genl_dump_dests,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= IPVS_CMD_NEW_DAEMON,
 | 
							.cmd	= IPVS_CMD_NEW_DAEMON,
 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy	= ip_vs_cmd_policy,
 | 
					 | 
				
			||||||
		.doit	= ip_vs_genl_set_daemon,
 | 
							.doit	= ip_vs_genl_set_daemon,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= IPVS_CMD_DEL_DAEMON,
 | 
							.cmd	= IPVS_CMD_DEL_DAEMON,
 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy	= ip_vs_cmd_policy,
 | 
					 | 
				
			||||||
		.doit	= ip_vs_genl_set_daemon,
 | 
							.doit	= ip_vs_genl_set_daemon,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -3841,7 +3831,6 @@ static const struct genl_ops ip_vs_genl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= IPVS_CMD_SET_CONFIG,
 | 
							.cmd	= IPVS_CMD_SET_CONFIG,
 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy	= ip_vs_cmd_policy,
 | 
					 | 
				
			||||||
		.doit	= ip_vs_genl_set_cmd,
 | 
							.doit	= ip_vs_genl_set_cmd,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -3857,7 +3846,6 @@ static const struct genl_ops ip_vs_genl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= IPVS_CMD_ZERO,
 | 
							.cmd	= IPVS_CMD_ZERO,
 | 
				
			||||||
		.flags	= GENL_ADMIN_PERM,
 | 
							.flags	= GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy	= ip_vs_cmd_policy,
 | 
					 | 
				
			||||||
		.doit	= ip_vs_genl_set_cmd,
 | 
							.doit	= ip_vs_genl_set_cmd,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -3872,6 +3860,7 @@ static struct genl_family ip_vs_genl_family __ro_after_init = {
 | 
				
			||||||
	.name		= IPVS_GENL_NAME,
 | 
						.name		= IPVS_GENL_NAME,
 | 
				
			||||||
	.version	= IPVS_GENL_VERSION,
 | 
						.version	= IPVS_GENL_VERSION,
 | 
				
			||||||
	.maxattr	= IPVS_CMD_ATTR_MAX,
 | 
						.maxattr	= IPVS_CMD_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = ip_vs_cmd_policy,
 | 
				
			||||||
	.netnsok        = true,         /* Make ipvsadm to work on netns */
 | 
						.netnsok        = true,         /* Make ipvsadm to work on netns */
 | 
				
			||||||
	.module		= THIS_MODULE,
 | 
						.module		= THIS_MODULE,
 | 
				
			||||||
	.ops		= ip_vs_genl_ops,
 | 
						.ops		= ip_vs_genl_ops,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -322,28 +322,24 @@ static const struct genl_ops netlbl_calipso_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_CALIPSO_C_ADD,
 | 
						.cmd = NLBL_CALIPSO_C_ADD,
 | 
				
			||||||
	.flags = GENL_ADMIN_PERM,
 | 
						.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	.policy = calipso_genl_policy,
 | 
					 | 
				
			||||||
	.doit = netlbl_calipso_add,
 | 
						.doit = netlbl_calipso_add,
 | 
				
			||||||
	.dumpit = NULL,
 | 
						.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_CALIPSO_C_REMOVE,
 | 
						.cmd = NLBL_CALIPSO_C_REMOVE,
 | 
				
			||||||
	.flags = GENL_ADMIN_PERM,
 | 
						.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	.policy = calipso_genl_policy,
 | 
					 | 
				
			||||||
	.doit = netlbl_calipso_remove,
 | 
						.doit = netlbl_calipso_remove,
 | 
				
			||||||
	.dumpit = NULL,
 | 
						.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_CALIPSO_C_LIST,
 | 
						.cmd = NLBL_CALIPSO_C_LIST,
 | 
				
			||||||
	.flags = 0,
 | 
						.flags = 0,
 | 
				
			||||||
	.policy = calipso_genl_policy,
 | 
					 | 
				
			||||||
	.doit = netlbl_calipso_list,
 | 
						.doit = netlbl_calipso_list,
 | 
				
			||||||
	.dumpit = NULL,
 | 
						.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_CALIPSO_C_LISTALL,
 | 
						.cmd = NLBL_CALIPSO_C_LISTALL,
 | 
				
			||||||
	.flags = 0,
 | 
						.flags = 0,
 | 
				
			||||||
	.policy = calipso_genl_policy,
 | 
					 | 
				
			||||||
	.doit = NULL,
 | 
						.doit = NULL,
 | 
				
			||||||
	.dumpit = netlbl_calipso_listall,
 | 
						.dumpit = netlbl_calipso_listall,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -354,6 +350,7 @@ static struct genl_family netlbl_calipso_gnl_family __ro_after_init = {
 | 
				
			||||||
	.name = NETLBL_NLTYPE_CALIPSO_NAME,
 | 
						.name = NETLBL_NLTYPE_CALIPSO_NAME,
 | 
				
			||||||
	.version = NETLBL_PROTO_VERSION,
 | 
						.version = NETLBL_PROTO_VERSION,
 | 
				
			||||||
	.maxattr = NLBL_CALIPSO_A_MAX,
 | 
						.maxattr = NLBL_CALIPSO_A_MAX,
 | 
				
			||||||
 | 
						.policy = calipso_genl_policy,
 | 
				
			||||||
	.module = THIS_MODULE,
 | 
						.module = THIS_MODULE,
 | 
				
			||||||
	.ops = netlbl_calipso_ops,
 | 
						.ops = netlbl_calipso_ops,
 | 
				
			||||||
	.n_ops = ARRAY_SIZE(netlbl_calipso_ops),
 | 
						.n_ops = ARRAY_SIZE(netlbl_calipso_ops),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -734,28 +734,24 @@ static const struct genl_ops netlbl_cipsov4_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_CIPSOV4_C_ADD,
 | 
						.cmd = NLBL_CIPSOV4_C_ADD,
 | 
				
			||||||
	.flags = GENL_ADMIN_PERM,
 | 
						.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	.policy = netlbl_cipsov4_genl_policy,
 | 
					 | 
				
			||||||
	.doit = netlbl_cipsov4_add,
 | 
						.doit = netlbl_cipsov4_add,
 | 
				
			||||||
	.dumpit = NULL,
 | 
						.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_CIPSOV4_C_REMOVE,
 | 
						.cmd = NLBL_CIPSOV4_C_REMOVE,
 | 
				
			||||||
	.flags = GENL_ADMIN_PERM,
 | 
						.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	.policy = netlbl_cipsov4_genl_policy,
 | 
					 | 
				
			||||||
	.doit = netlbl_cipsov4_remove,
 | 
						.doit = netlbl_cipsov4_remove,
 | 
				
			||||||
	.dumpit = NULL,
 | 
						.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_CIPSOV4_C_LIST,
 | 
						.cmd = NLBL_CIPSOV4_C_LIST,
 | 
				
			||||||
	.flags = 0,
 | 
						.flags = 0,
 | 
				
			||||||
	.policy = netlbl_cipsov4_genl_policy,
 | 
					 | 
				
			||||||
	.doit = netlbl_cipsov4_list,
 | 
						.doit = netlbl_cipsov4_list,
 | 
				
			||||||
	.dumpit = NULL,
 | 
						.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_CIPSOV4_C_LISTALL,
 | 
						.cmd = NLBL_CIPSOV4_C_LISTALL,
 | 
				
			||||||
	.flags = 0,
 | 
						.flags = 0,
 | 
				
			||||||
	.policy = netlbl_cipsov4_genl_policy,
 | 
					 | 
				
			||||||
	.doit = NULL,
 | 
						.doit = NULL,
 | 
				
			||||||
	.dumpit = netlbl_cipsov4_listall,
 | 
						.dumpit = netlbl_cipsov4_listall,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -766,6 +762,7 @@ static struct genl_family netlbl_cipsov4_gnl_family __ro_after_init = {
 | 
				
			||||||
	.name = NETLBL_NLTYPE_CIPSOV4_NAME,
 | 
						.name = NETLBL_NLTYPE_CIPSOV4_NAME,
 | 
				
			||||||
	.version = NETLBL_PROTO_VERSION,
 | 
						.version = NETLBL_PROTO_VERSION,
 | 
				
			||||||
	.maxattr = NLBL_CIPSOV4_A_MAX,
 | 
						.maxattr = NLBL_CIPSOV4_A_MAX,
 | 
				
			||||||
 | 
						.policy = netlbl_cipsov4_genl_policy,
 | 
				
			||||||
	.module = THIS_MODULE,
 | 
						.module = THIS_MODULE,
 | 
				
			||||||
	.ops = netlbl_cipsov4_ops,
 | 
						.ops = netlbl_cipsov4_ops,
 | 
				
			||||||
	.n_ops = ARRAY_SIZE(netlbl_cipsov4_ops),
 | 
						.n_ops = ARRAY_SIZE(netlbl_cipsov4_ops),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -773,56 +773,48 @@ static const struct genl_ops netlbl_mgmt_genl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_MGMT_C_ADD,
 | 
						.cmd = NLBL_MGMT_C_ADD,
 | 
				
			||||||
	.flags = GENL_ADMIN_PERM,
 | 
						.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	.policy = netlbl_mgmt_genl_policy,
 | 
					 | 
				
			||||||
	.doit = netlbl_mgmt_add,
 | 
						.doit = netlbl_mgmt_add,
 | 
				
			||||||
	.dumpit = NULL,
 | 
						.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_MGMT_C_REMOVE,
 | 
						.cmd = NLBL_MGMT_C_REMOVE,
 | 
				
			||||||
	.flags = GENL_ADMIN_PERM,
 | 
						.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	.policy = netlbl_mgmt_genl_policy,
 | 
					 | 
				
			||||||
	.doit = netlbl_mgmt_remove,
 | 
						.doit = netlbl_mgmt_remove,
 | 
				
			||||||
	.dumpit = NULL,
 | 
						.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_MGMT_C_LISTALL,
 | 
						.cmd = NLBL_MGMT_C_LISTALL,
 | 
				
			||||||
	.flags = 0,
 | 
						.flags = 0,
 | 
				
			||||||
	.policy = netlbl_mgmt_genl_policy,
 | 
					 | 
				
			||||||
	.doit = NULL,
 | 
						.doit = NULL,
 | 
				
			||||||
	.dumpit = netlbl_mgmt_listall,
 | 
						.dumpit = netlbl_mgmt_listall,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_MGMT_C_ADDDEF,
 | 
						.cmd = NLBL_MGMT_C_ADDDEF,
 | 
				
			||||||
	.flags = GENL_ADMIN_PERM,
 | 
						.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	.policy = netlbl_mgmt_genl_policy,
 | 
					 | 
				
			||||||
	.doit = netlbl_mgmt_adddef,
 | 
						.doit = netlbl_mgmt_adddef,
 | 
				
			||||||
	.dumpit = NULL,
 | 
						.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_MGMT_C_REMOVEDEF,
 | 
						.cmd = NLBL_MGMT_C_REMOVEDEF,
 | 
				
			||||||
	.flags = GENL_ADMIN_PERM,
 | 
						.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	.policy = netlbl_mgmt_genl_policy,
 | 
					 | 
				
			||||||
	.doit = netlbl_mgmt_removedef,
 | 
						.doit = netlbl_mgmt_removedef,
 | 
				
			||||||
	.dumpit = NULL,
 | 
						.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_MGMT_C_LISTDEF,
 | 
						.cmd = NLBL_MGMT_C_LISTDEF,
 | 
				
			||||||
	.flags = 0,
 | 
						.flags = 0,
 | 
				
			||||||
	.policy = netlbl_mgmt_genl_policy,
 | 
					 | 
				
			||||||
	.doit = netlbl_mgmt_listdef,
 | 
						.doit = netlbl_mgmt_listdef,
 | 
				
			||||||
	.dumpit = NULL,
 | 
						.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_MGMT_C_PROTOCOLS,
 | 
						.cmd = NLBL_MGMT_C_PROTOCOLS,
 | 
				
			||||||
	.flags = 0,
 | 
						.flags = 0,
 | 
				
			||||||
	.policy = netlbl_mgmt_genl_policy,
 | 
					 | 
				
			||||||
	.doit = NULL,
 | 
						.doit = NULL,
 | 
				
			||||||
	.dumpit = netlbl_mgmt_protocols,
 | 
						.dumpit = netlbl_mgmt_protocols,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_MGMT_C_VERSION,
 | 
						.cmd = NLBL_MGMT_C_VERSION,
 | 
				
			||||||
	.flags = 0,
 | 
						.flags = 0,
 | 
				
			||||||
	.policy = netlbl_mgmt_genl_policy,
 | 
					 | 
				
			||||||
	.doit = netlbl_mgmt_version,
 | 
						.doit = netlbl_mgmt_version,
 | 
				
			||||||
	.dumpit = NULL,
 | 
						.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -833,6 +825,7 @@ static struct genl_family netlbl_mgmt_gnl_family __ro_after_init = {
 | 
				
			||||||
	.name = NETLBL_NLTYPE_MGMT_NAME,
 | 
						.name = NETLBL_NLTYPE_MGMT_NAME,
 | 
				
			||||||
	.version = NETLBL_PROTO_VERSION,
 | 
						.version = NETLBL_PROTO_VERSION,
 | 
				
			||||||
	.maxattr = NLBL_MGMT_A_MAX,
 | 
						.maxattr = NLBL_MGMT_A_MAX,
 | 
				
			||||||
 | 
						.policy = netlbl_mgmt_genl_policy,
 | 
				
			||||||
	.module = THIS_MODULE,
 | 
						.module = THIS_MODULE,
 | 
				
			||||||
	.ops = netlbl_mgmt_genl_ops,
 | 
						.ops = netlbl_mgmt_genl_ops,
 | 
				
			||||||
	.n_ops = ARRAY_SIZE(netlbl_mgmt_genl_ops),
 | 
						.n_ops = ARRAY_SIZE(netlbl_mgmt_genl_ops),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1318,56 +1318,48 @@ static const struct genl_ops netlbl_unlabel_genl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_UNLABEL_C_STATICADD,
 | 
						.cmd = NLBL_UNLABEL_C_STATICADD,
 | 
				
			||||||
	.flags = GENL_ADMIN_PERM,
 | 
						.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	.policy = netlbl_unlabel_genl_policy,
 | 
					 | 
				
			||||||
	.doit = netlbl_unlabel_staticadd,
 | 
						.doit = netlbl_unlabel_staticadd,
 | 
				
			||||||
	.dumpit = NULL,
 | 
						.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_UNLABEL_C_STATICREMOVE,
 | 
						.cmd = NLBL_UNLABEL_C_STATICREMOVE,
 | 
				
			||||||
	.flags = GENL_ADMIN_PERM,
 | 
						.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	.policy = netlbl_unlabel_genl_policy,
 | 
					 | 
				
			||||||
	.doit = netlbl_unlabel_staticremove,
 | 
						.doit = netlbl_unlabel_staticremove,
 | 
				
			||||||
	.dumpit = NULL,
 | 
						.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_UNLABEL_C_STATICLIST,
 | 
						.cmd = NLBL_UNLABEL_C_STATICLIST,
 | 
				
			||||||
	.flags = 0,
 | 
						.flags = 0,
 | 
				
			||||||
	.policy = netlbl_unlabel_genl_policy,
 | 
					 | 
				
			||||||
	.doit = NULL,
 | 
						.doit = NULL,
 | 
				
			||||||
	.dumpit = netlbl_unlabel_staticlist,
 | 
						.dumpit = netlbl_unlabel_staticlist,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_UNLABEL_C_STATICADDDEF,
 | 
						.cmd = NLBL_UNLABEL_C_STATICADDDEF,
 | 
				
			||||||
	.flags = GENL_ADMIN_PERM,
 | 
						.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	.policy = netlbl_unlabel_genl_policy,
 | 
					 | 
				
			||||||
	.doit = netlbl_unlabel_staticadddef,
 | 
						.doit = netlbl_unlabel_staticadddef,
 | 
				
			||||||
	.dumpit = NULL,
 | 
						.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_UNLABEL_C_STATICREMOVEDEF,
 | 
						.cmd = NLBL_UNLABEL_C_STATICREMOVEDEF,
 | 
				
			||||||
	.flags = GENL_ADMIN_PERM,
 | 
						.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	.policy = netlbl_unlabel_genl_policy,
 | 
					 | 
				
			||||||
	.doit = netlbl_unlabel_staticremovedef,
 | 
						.doit = netlbl_unlabel_staticremovedef,
 | 
				
			||||||
	.dumpit = NULL,
 | 
						.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_UNLABEL_C_STATICLISTDEF,
 | 
						.cmd = NLBL_UNLABEL_C_STATICLISTDEF,
 | 
				
			||||||
	.flags = 0,
 | 
						.flags = 0,
 | 
				
			||||||
	.policy = netlbl_unlabel_genl_policy,
 | 
					 | 
				
			||||||
	.doit = NULL,
 | 
						.doit = NULL,
 | 
				
			||||||
	.dumpit = netlbl_unlabel_staticlistdef,
 | 
						.dumpit = netlbl_unlabel_staticlistdef,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_UNLABEL_C_ACCEPT,
 | 
						.cmd = NLBL_UNLABEL_C_ACCEPT,
 | 
				
			||||||
	.flags = GENL_ADMIN_PERM,
 | 
						.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	.policy = netlbl_unlabel_genl_policy,
 | 
					 | 
				
			||||||
	.doit = netlbl_unlabel_accept,
 | 
						.doit = netlbl_unlabel_accept,
 | 
				
			||||||
	.dumpit = NULL,
 | 
						.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.cmd = NLBL_UNLABEL_C_LIST,
 | 
						.cmd = NLBL_UNLABEL_C_LIST,
 | 
				
			||||||
	.flags = 0,
 | 
						.flags = 0,
 | 
				
			||||||
	.policy = netlbl_unlabel_genl_policy,
 | 
					 | 
				
			||||||
	.doit = netlbl_unlabel_list,
 | 
						.doit = netlbl_unlabel_list,
 | 
				
			||||||
	.dumpit = NULL,
 | 
						.dumpit = NULL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -1378,6 +1370,7 @@ static struct genl_family netlbl_unlabel_gnl_family __ro_after_init = {
 | 
				
			||||||
	.name = NETLBL_NLTYPE_UNLABELED_NAME,
 | 
						.name = NETLBL_NLTYPE_UNLABELED_NAME,
 | 
				
			||||||
	.version = NETLBL_PROTO_VERSION,
 | 
						.version = NETLBL_PROTO_VERSION,
 | 
				
			||||||
	.maxattr = NLBL_UNLABEL_A_MAX,
 | 
						.maxattr = NLBL_UNLABEL_A_MAX,
 | 
				
			||||||
 | 
						.policy = netlbl_unlabel_genl_policy,
 | 
				
			||||||
	.module = THIS_MODULE,
 | 
						.module = THIS_MODULE,
 | 
				
			||||||
	.ops = netlbl_unlabel_genl_ops,
 | 
						.ops = netlbl_unlabel_genl_ops,
 | 
				
			||||||
	.n_ops = ARRAY_SIZE(netlbl_unlabel_genl_ops),
 | 
						.n_ops = ARRAY_SIZE(netlbl_unlabel_genl_ops),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -577,7 +577,7 @@ static int genl_family_rcv_msg(const struct genl_family *family,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (attrbuf) {
 | 
						if (attrbuf) {
 | 
				
			||||||
		err = nlmsg_parse(nlh, hdrlen, attrbuf, family->maxattr,
 | 
							err = nlmsg_parse(nlh, hdrlen, attrbuf, family->maxattr,
 | 
				
			||||||
				  ops->policy, extack);
 | 
									  family->policy, extack);
 | 
				
			||||||
		if (err < 0)
 | 
							if (err < 0)
 | 
				
			||||||
			goto out;
 | 
								goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -677,7 +677,7 @@ static int ctrl_fill_info(const struct genl_family *family, u32 portid, u32 seq,
 | 
				
			||||||
				op_flags |= GENL_CMD_CAP_DUMP;
 | 
									op_flags |= GENL_CMD_CAP_DUMP;
 | 
				
			||||||
			if (ops->doit)
 | 
								if (ops->doit)
 | 
				
			||||||
				op_flags |= GENL_CMD_CAP_DO;
 | 
									op_flags |= GENL_CMD_CAP_DO;
 | 
				
			||||||
			if (ops->policy)
 | 
								if (family->policy)
 | 
				
			||||||
				op_flags |= GENL_CMD_CAP_HASPOL;
 | 
									op_flags |= GENL_CMD_CAP_HASPOL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			nest = nla_nest_start(skb, i + 1);
 | 
								nest = nla_nest_start(skb, i + 1);
 | 
				
			||||||
| 
						 | 
					@ -939,7 +939,6 @@ static const struct genl_ops genl_ctrl_ops[] = {
 | 
				
			||||||
		.cmd		= CTRL_CMD_GETFAMILY,
 | 
							.cmd		= CTRL_CMD_GETFAMILY,
 | 
				
			||||||
		.doit		= ctrl_getfamily,
 | 
							.doit		= ctrl_getfamily,
 | 
				
			||||||
		.dumpit		= ctrl_dumpfamily,
 | 
							.dumpit		= ctrl_dumpfamily,
 | 
				
			||||||
		.policy		= ctrl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -957,6 +956,7 @@ static struct genl_family genl_ctrl __ro_after_init = {
 | 
				
			||||||
	.name = "nlctrl",
 | 
						.name = "nlctrl",
 | 
				
			||||||
	.version = 0x2,
 | 
						.version = 0x2,
 | 
				
			||||||
	.maxattr = CTRL_ATTR_MAX,
 | 
						.maxattr = CTRL_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = ctrl_policy,
 | 
				
			||||||
	.netnsok = true,
 | 
						.netnsok = true,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1670,99 +1670,80 @@ static const struct genl_ops nfc_genl_ops[] = {
 | 
				
			||||||
		.doit = nfc_genl_get_device,
 | 
							.doit = nfc_genl_get_device,
 | 
				
			||||||
		.dumpit = nfc_genl_dump_devices,
 | 
							.dumpit = nfc_genl_dump_devices,
 | 
				
			||||||
		.done = nfc_genl_dump_devices_done,
 | 
							.done = nfc_genl_dump_devices_done,
 | 
				
			||||||
		.policy = nfc_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NFC_CMD_DEV_UP,
 | 
							.cmd = NFC_CMD_DEV_UP,
 | 
				
			||||||
		.doit = nfc_genl_dev_up,
 | 
							.doit = nfc_genl_dev_up,
 | 
				
			||||||
		.policy = nfc_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NFC_CMD_DEV_DOWN,
 | 
							.cmd = NFC_CMD_DEV_DOWN,
 | 
				
			||||||
		.doit = nfc_genl_dev_down,
 | 
							.doit = nfc_genl_dev_down,
 | 
				
			||||||
		.policy = nfc_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NFC_CMD_START_POLL,
 | 
							.cmd = NFC_CMD_START_POLL,
 | 
				
			||||||
		.doit = nfc_genl_start_poll,
 | 
							.doit = nfc_genl_start_poll,
 | 
				
			||||||
		.policy = nfc_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NFC_CMD_STOP_POLL,
 | 
							.cmd = NFC_CMD_STOP_POLL,
 | 
				
			||||||
		.doit = nfc_genl_stop_poll,
 | 
							.doit = nfc_genl_stop_poll,
 | 
				
			||||||
		.policy = nfc_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NFC_CMD_DEP_LINK_UP,
 | 
							.cmd = NFC_CMD_DEP_LINK_UP,
 | 
				
			||||||
		.doit = nfc_genl_dep_link_up,
 | 
							.doit = nfc_genl_dep_link_up,
 | 
				
			||||||
		.policy = nfc_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NFC_CMD_DEP_LINK_DOWN,
 | 
							.cmd = NFC_CMD_DEP_LINK_DOWN,
 | 
				
			||||||
		.doit = nfc_genl_dep_link_down,
 | 
							.doit = nfc_genl_dep_link_down,
 | 
				
			||||||
		.policy = nfc_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NFC_CMD_GET_TARGET,
 | 
							.cmd = NFC_CMD_GET_TARGET,
 | 
				
			||||||
		.dumpit = nfc_genl_dump_targets,
 | 
							.dumpit = nfc_genl_dump_targets,
 | 
				
			||||||
		.done = nfc_genl_dump_targets_done,
 | 
							.done = nfc_genl_dump_targets_done,
 | 
				
			||||||
		.policy = nfc_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NFC_CMD_LLC_GET_PARAMS,
 | 
							.cmd = NFC_CMD_LLC_GET_PARAMS,
 | 
				
			||||||
		.doit = nfc_genl_llc_get_params,
 | 
							.doit = nfc_genl_llc_get_params,
 | 
				
			||||||
		.policy = nfc_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NFC_CMD_LLC_SET_PARAMS,
 | 
							.cmd = NFC_CMD_LLC_SET_PARAMS,
 | 
				
			||||||
		.doit = nfc_genl_llc_set_params,
 | 
							.doit = nfc_genl_llc_set_params,
 | 
				
			||||||
		.policy = nfc_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NFC_CMD_LLC_SDREQ,
 | 
							.cmd = NFC_CMD_LLC_SDREQ,
 | 
				
			||||||
		.doit = nfc_genl_llc_sdreq,
 | 
							.doit = nfc_genl_llc_sdreq,
 | 
				
			||||||
		.policy = nfc_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NFC_CMD_FW_DOWNLOAD,
 | 
							.cmd = NFC_CMD_FW_DOWNLOAD,
 | 
				
			||||||
		.doit = nfc_genl_fw_download,
 | 
							.doit = nfc_genl_fw_download,
 | 
				
			||||||
		.policy = nfc_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NFC_CMD_ENABLE_SE,
 | 
							.cmd = NFC_CMD_ENABLE_SE,
 | 
				
			||||||
		.doit = nfc_genl_enable_se,
 | 
							.doit = nfc_genl_enable_se,
 | 
				
			||||||
		.policy = nfc_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NFC_CMD_DISABLE_SE,
 | 
							.cmd = NFC_CMD_DISABLE_SE,
 | 
				
			||||||
		.doit = nfc_genl_disable_se,
 | 
							.doit = nfc_genl_disable_se,
 | 
				
			||||||
		.policy = nfc_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NFC_CMD_GET_SE,
 | 
							.cmd = NFC_CMD_GET_SE,
 | 
				
			||||||
		.dumpit = nfc_genl_dump_ses,
 | 
							.dumpit = nfc_genl_dump_ses,
 | 
				
			||||||
		.done = nfc_genl_dump_ses_done,
 | 
							.done = nfc_genl_dump_ses_done,
 | 
				
			||||||
		.policy = nfc_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NFC_CMD_SE_IO,
 | 
							.cmd = NFC_CMD_SE_IO,
 | 
				
			||||||
		.doit = nfc_genl_se_io,
 | 
							.doit = nfc_genl_se_io,
 | 
				
			||||||
		.policy = nfc_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NFC_CMD_ACTIVATE_TARGET,
 | 
							.cmd = NFC_CMD_ACTIVATE_TARGET,
 | 
				
			||||||
		.doit = nfc_genl_activate_target,
 | 
							.doit = nfc_genl_activate_target,
 | 
				
			||||||
		.policy = nfc_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NFC_CMD_VENDOR,
 | 
							.cmd = NFC_CMD_VENDOR,
 | 
				
			||||||
		.doit = nfc_genl_vendor_cmd,
 | 
							.doit = nfc_genl_vendor_cmd,
 | 
				
			||||||
		.policy = nfc_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NFC_CMD_DEACTIVATE_TARGET,
 | 
							.cmd = NFC_CMD_DEACTIVATE_TARGET,
 | 
				
			||||||
		.doit = nfc_genl_deactivate_target,
 | 
							.doit = nfc_genl_deactivate_target,
 | 
				
			||||||
		.policy = nfc_genl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1771,6 +1752,7 @@ static struct genl_family nfc_genl_family __ro_after_init = {
 | 
				
			||||||
	.name = NFC_GENL_NAME,
 | 
						.name = NFC_GENL_NAME,
 | 
				
			||||||
	.version = NFC_GENL_VERSION,
 | 
						.version = NFC_GENL_VERSION,
 | 
				
			||||||
	.maxattr = NFC_ATTR_MAX,
 | 
						.maxattr = NFC_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = nfc_genl_policy,
 | 
				
			||||||
	.module = THIS_MODULE,
 | 
						.module = THIS_MODULE,
 | 
				
			||||||
	.ops = nfc_genl_ops,
 | 
						.ops = nfc_genl_ops,
 | 
				
			||||||
	.n_ops = ARRAY_SIZE(nfc_genl_ops),
 | 
						.n_ops = ARRAY_SIZE(nfc_genl_ops),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2154,18 +2154,15 @@ static struct genl_ops ct_limit_genl_ops[] = {
 | 
				
			||||||
	{ .cmd = OVS_CT_LIMIT_CMD_SET,
 | 
						{ .cmd = OVS_CT_LIMIT_CMD_SET,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN
 | 
							.flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN
 | 
				
			||||||
					   * privilege. */
 | 
										   * privilege. */
 | 
				
			||||||
		.policy = ct_limit_policy,
 | 
					 | 
				
			||||||
		.doit = ovs_ct_limit_cmd_set,
 | 
							.doit = ovs_ct_limit_cmd_set,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{ .cmd = OVS_CT_LIMIT_CMD_DEL,
 | 
						{ .cmd = OVS_CT_LIMIT_CMD_DEL,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN
 | 
							.flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN
 | 
				
			||||||
					   * privilege. */
 | 
										   * privilege. */
 | 
				
			||||||
		.policy = ct_limit_policy,
 | 
					 | 
				
			||||||
		.doit = ovs_ct_limit_cmd_del,
 | 
							.doit = ovs_ct_limit_cmd_del,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{ .cmd = OVS_CT_LIMIT_CMD_GET,
 | 
						{ .cmd = OVS_CT_LIMIT_CMD_GET,
 | 
				
			||||||
		.flags = 0,		  /* OK for unprivileged users. */
 | 
							.flags = 0,		  /* OK for unprivileged users. */
 | 
				
			||||||
		.policy = ct_limit_policy,
 | 
					 | 
				
			||||||
		.doit = ovs_ct_limit_cmd_get,
 | 
							.doit = ovs_ct_limit_cmd_get,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -2179,6 +2176,7 @@ struct genl_family dp_ct_limit_genl_family __ro_after_init = {
 | 
				
			||||||
	.name = OVS_CT_LIMIT_FAMILY,
 | 
						.name = OVS_CT_LIMIT_FAMILY,
 | 
				
			||||||
	.version = OVS_CT_LIMIT_VERSION,
 | 
						.version = OVS_CT_LIMIT_VERSION,
 | 
				
			||||||
	.maxattr = OVS_CT_LIMIT_ATTR_MAX,
 | 
						.maxattr = OVS_CT_LIMIT_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = ct_limit_policy,
 | 
				
			||||||
	.netnsok = true,
 | 
						.netnsok = true,
 | 
				
			||||||
	.parallel_ops = true,
 | 
						.parallel_ops = true,
 | 
				
			||||||
	.ops = ct_limit_genl_ops,
 | 
						.ops = ct_limit_genl_ops,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -639,7 +639,6 @@ static const struct nla_policy packet_policy[OVS_PACKET_ATTR_MAX + 1] = {
 | 
				
			||||||
static const struct genl_ops dp_packet_genl_ops[] = {
 | 
					static const struct genl_ops dp_packet_genl_ops[] = {
 | 
				
			||||||
	{ .cmd = OVS_PACKET_CMD_EXECUTE,
 | 
						{ .cmd = OVS_PACKET_CMD_EXECUTE,
 | 
				
			||||||
	  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
						  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
				
			||||||
	  .policy = packet_policy,
 | 
					 | 
				
			||||||
	  .doit = ovs_packet_cmd_execute
 | 
						  .doit = ovs_packet_cmd_execute
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -649,6 +648,7 @@ static struct genl_family dp_packet_genl_family __ro_after_init = {
 | 
				
			||||||
	.name = OVS_PACKET_FAMILY,
 | 
						.name = OVS_PACKET_FAMILY,
 | 
				
			||||||
	.version = OVS_PACKET_VERSION,
 | 
						.version = OVS_PACKET_VERSION,
 | 
				
			||||||
	.maxattr = OVS_PACKET_ATTR_MAX,
 | 
						.maxattr = OVS_PACKET_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = packet_policy,
 | 
				
			||||||
	.netnsok = true,
 | 
						.netnsok = true,
 | 
				
			||||||
	.parallel_ops = true,
 | 
						.parallel_ops = true,
 | 
				
			||||||
	.ops = dp_packet_genl_ops,
 | 
						.ops = dp_packet_genl_ops,
 | 
				
			||||||
| 
						 | 
					@ -1424,23 +1424,19 @@ static const struct nla_policy flow_policy[OVS_FLOW_ATTR_MAX + 1] = {
 | 
				
			||||||
static const struct genl_ops dp_flow_genl_ops[] = {
 | 
					static const struct genl_ops dp_flow_genl_ops[] = {
 | 
				
			||||||
	{ .cmd = OVS_FLOW_CMD_NEW,
 | 
						{ .cmd = OVS_FLOW_CMD_NEW,
 | 
				
			||||||
	  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
						  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
				
			||||||
	  .policy = flow_policy,
 | 
					 | 
				
			||||||
	  .doit = ovs_flow_cmd_new
 | 
						  .doit = ovs_flow_cmd_new
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{ .cmd = OVS_FLOW_CMD_DEL,
 | 
						{ .cmd = OVS_FLOW_CMD_DEL,
 | 
				
			||||||
	  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
						  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
				
			||||||
	  .policy = flow_policy,
 | 
					 | 
				
			||||||
	  .doit = ovs_flow_cmd_del
 | 
						  .doit = ovs_flow_cmd_del
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{ .cmd = OVS_FLOW_CMD_GET,
 | 
						{ .cmd = OVS_FLOW_CMD_GET,
 | 
				
			||||||
	  .flags = 0,		    /* OK for unprivileged users. */
 | 
						  .flags = 0,		    /* OK for unprivileged users. */
 | 
				
			||||||
	  .policy = flow_policy,
 | 
					 | 
				
			||||||
	  .doit = ovs_flow_cmd_get,
 | 
						  .doit = ovs_flow_cmd_get,
 | 
				
			||||||
	  .dumpit = ovs_flow_cmd_dump
 | 
						  .dumpit = ovs_flow_cmd_dump
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{ .cmd = OVS_FLOW_CMD_SET,
 | 
						{ .cmd = OVS_FLOW_CMD_SET,
 | 
				
			||||||
	  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
						  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
				
			||||||
	  .policy = flow_policy,
 | 
					 | 
				
			||||||
	  .doit = ovs_flow_cmd_set,
 | 
						  .doit = ovs_flow_cmd_set,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -1450,6 +1446,7 @@ static struct genl_family dp_flow_genl_family __ro_after_init = {
 | 
				
			||||||
	.name = OVS_FLOW_FAMILY,
 | 
						.name = OVS_FLOW_FAMILY,
 | 
				
			||||||
	.version = OVS_FLOW_VERSION,
 | 
						.version = OVS_FLOW_VERSION,
 | 
				
			||||||
	.maxattr = OVS_FLOW_ATTR_MAX,
 | 
						.maxattr = OVS_FLOW_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = flow_policy,
 | 
				
			||||||
	.netnsok = true,
 | 
						.netnsok = true,
 | 
				
			||||||
	.parallel_ops = true,
 | 
						.parallel_ops = true,
 | 
				
			||||||
	.ops = dp_flow_genl_ops,
 | 
						.ops = dp_flow_genl_ops,
 | 
				
			||||||
| 
						 | 
					@ -1817,23 +1814,19 @@ static const struct nla_policy datapath_policy[OVS_DP_ATTR_MAX + 1] = {
 | 
				
			||||||
static const struct genl_ops dp_datapath_genl_ops[] = {
 | 
					static const struct genl_ops dp_datapath_genl_ops[] = {
 | 
				
			||||||
	{ .cmd = OVS_DP_CMD_NEW,
 | 
						{ .cmd = OVS_DP_CMD_NEW,
 | 
				
			||||||
	  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
						  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
				
			||||||
	  .policy = datapath_policy,
 | 
					 | 
				
			||||||
	  .doit = ovs_dp_cmd_new
 | 
						  .doit = ovs_dp_cmd_new
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{ .cmd = OVS_DP_CMD_DEL,
 | 
						{ .cmd = OVS_DP_CMD_DEL,
 | 
				
			||||||
	  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
						  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
				
			||||||
	  .policy = datapath_policy,
 | 
					 | 
				
			||||||
	  .doit = ovs_dp_cmd_del
 | 
						  .doit = ovs_dp_cmd_del
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{ .cmd = OVS_DP_CMD_GET,
 | 
						{ .cmd = OVS_DP_CMD_GET,
 | 
				
			||||||
	  .flags = 0,		    /* OK for unprivileged users. */
 | 
						  .flags = 0,		    /* OK for unprivileged users. */
 | 
				
			||||||
	  .policy = datapath_policy,
 | 
					 | 
				
			||||||
	  .doit = ovs_dp_cmd_get,
 | 
						  .doit = ovs_dp_cmd_get,
 | 
				
			||||||
	  .dumpit = ovs_dp_cmd_dump
 | 
						  .dumpit = ovs_dp_cmd_dump
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{ .cmd = OVS_DP_CMD_SET,
 | 
						{ .cmd = OVS_DP_CMD_SET,
 | 
				
			||||||
	  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
						  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
				
			||||||
	  .policy = datapath_policy,
 | 
					 | 
				
			||||||
	  .doit = ovs_dp_cmd_set,
 | 
						  .doit = ovs_dp_cmd_set,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -1843,6 +1836,7 @@ static struct genl_family dp_datapath_genl_family __ro_after_init = {
 | 
				
			||||||
	.name = OVS_DATAPATH_FAMILY,
 | 
						.name = OVS_DATAPATH_FAMILY,
 | 
				
			||||||
	.version = OVS_DATAPATH_VERSION,
 | 
						.version = OVS_DATAPATH_VERSION,
 | 
				
			||||||
	.maxattr = OVS_DP_ATTR_MAX,
 | 
						.maxattr = OVS_DP_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = datapath_policy,
 | 
				
			||||||
	.netnsok = true,
 | 
						.netnsok = true,
 | 
				
			||||||
	.parallel_ops = true,
 | 
						.parallel_ops = true,
 | 
				
			||||||
	.ops = dp_datapath_genl_ops,
 | 
						.ops = dp_datapath_genl_ops,
 | 
				
			||||||
| 
						 | 
					@ -2260,23 +2254,19 @@ static const struct nla_policy vport_policy[OVS_VPORT_ATTR_MAX + 1] = {
 | 
				
			||||||
static const struct genl_ops dp_vport_genl_ops[] = {
 | 
					static const struct genl_ops dp_vport_genl_ops[] = {
 | 
				
			||||||
	{ .cmd = OVS_VPORT_CMD_NEW,
 | 
						{ .cmd = OVS_VPORT_CMD_NEW,
 | 
				
			||||||
	  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
						  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
				
			||||||
	  .policy = vport_policy,
 | 
					 | 
				
			||||||
	  .doit = ovs_vport_cmd_new
 | 
						  .doit = ovs_vport_cmd_new
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{ .cmd = OVS_VPORT_CMD_DEL,
 | 
						{ .cmd = OVS_VPORT_CMD_DEL,
 | 
				
			||||||
	  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
						  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
				
			||||||
	  .policy = vport_policy,
 | 
					 | 
				
			||||||
	  .doit = ovs_vport_cmd_del
 | 
						  .doit = ovs_vport_cmd_del
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{ .cmd = OVS_VPORT_CMD_GET,
 | 
						{ .cmd = OVS_VPORT_CMD_GET,
 | 
				
			||||||
	  .flags = 0,		    /* OK for unprivileged users. */
 | 
						  .flags = 0,		    /* OK for unprivileged users. */
 | 
				
			||||||
	  .policy = vport_policy,
 | 
					 | 
				
			||||||
	  .doit = ovs_vport_cmd_get,
 | 
						  .doit = ovs_vport_cmd_get,
 | 
				
			||||||
	  .dumpit = ovs_vport_cmd_dump
 | 
						  .dumpit = ovs_vport_cmd_dump
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{ .cmd = OVS_VPORT_CMD_SET,
 | 
						{ .cmd = OVS_VPORT_CMD_SET,
 | 
				
			||||||
	  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
						  .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
 | 
				
			||||||
	  .policy = vport_policy,
 | 
					 | 
				
			||||||
	  .doit = ovs_vport_cmd_set,
 | 
						  .doit = ovs_vport_cmd_set,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -2286,6 +2276,7 @@ struct genl_family dp_vport_genl_family __ro_after_init = {
 | 
				
			||||||
	.name = OVS_VPORT_FAMILY,
 | 
						.name = OVS_VPORT_FAMILY,
 | 
				
			||||||
	.version = OVS_VPORT_VERSION,
 | 
						.version = OVS_VPORT_VERSION,
 | 
				
			||||||
	.maxattr = OVS_VPORT_ATTR_MAX,
 | 
						.maxattr = OVS_VPORT_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = vport_policy,
 | 
				
			||||||
	.netnsok = true,
 | 
						.netnsok = true,
 | 
				
			||||||
	.parallel_ops = true,
 | 
						.parallel_ops = true,
 | 
				
			||||||
	.ops = dp_vport_genl_ops,
 | 
						.ops = dp_vport_genl_ops,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -527,26 +527,22 @@ bool ovs_meter_execute(struct datapath *dp, struct sk_buff *skb,
 | 
				
			||||||
static struct genl_ops dp_meter_genl_ops[] = {
 | 
					static struct genl_ops dp_meter_genl_ops[] = {
 | 
				
			||||||
	{ .cmd = OVS_METER_CMD_FEATURES,
 | 
						{ .cmd = OVS_METER_CMD_FEATURES,
 | 
				
			||||||
		.flags = 0,		  /* OK for unprivileged users. */
 | 
							.flags = 0,		  /* OK for unprivileged users. */
 | 
				
			||||||
		.policy = meter_policy,
 | 
					 | 
				
			||||||
		.doit = ovs_meter_cmd_features
 | 
							.doit = ovs_meter_cmd_features
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{ .cmd = OVS_METER_CMD_SET,
 | 
						{ .cmd = OVS_METER_CMD_SET,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN
 | 
							.flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN
 | 
				
			||||||
					   *  privilege.
 | 
										   *  privilege.
 | 
				
			||||||
					   */
 | 
										   */
 | 
				
			||||||
		.policy = meter_policy,
 | 
					 | 
				
			||||||
		.doit = ovs_meter_cmd_set,
 | 
							.doit = ovs_meter_cmd_set,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{ .cmd = OVS_METER_CMD_GET,
 | 
						{ .cmd = OVS_METER_CMD_GET,
 | 
				
			||||||
		.flags = 0,		  /* OK for unprivileged users. */
 | 
							.flags = 0,		  /* OK for unprivileged users. */
 | 
				
			||||||
		.policy = meter_policy,
 | 
					 | 
				
			||||||
		.doit = ovs_meter_cmd_get,
 | 
							.doit = ovs_meter_cmd_get,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{ .cmd = OVS_METER_CMD_DEL,
 | 
						{ .cmd = OVS_METER_CMD_DEL,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN
 | 
							.flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN
 | 
				
			||||||
					   *  privilege.
 | 
										   *  privilege.
 | 
				
			||||||
					   */
 | 
										   */
 | 
				
			||||||
		.policy = meter_policy,
 | 
					 | 
				
			||||||
		.doit = ovs_meter_cmd_del
 | 
							.doit = ovs_meter_cmd_del
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -560,6 +556,7 @@ struct genl_family dp_meter_genl_family __ro_after_init = {
 | 
				
			||||||
	.name = OVS_METER_FAMILY,
 | 
						.name = OVS_METER_FAMILY,
 | 
				
			||||||
	.version = OVS_METER_VERSION,
 | 
						.version = OVS_METER_VERSION,
 | 
				
			||||||
	.maxattr = OVS_METER_ATTR_MAX,
 | 
						.maxattr = OVS_METER_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = meter_policy,
 | 
				
			||||||
	.netnsok = true,
 | 
						.netnsok = true,
 | 
				
			||||||
	.parallel_ops = true,
 | 
						.parallel_ops = true,
 | 
				
			||||||
	.ops = dp_meter_genl_ops,
 | 
						.ops = dp_meter_genl_ops,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -611,7 +611,6 @@ static const struct genl_ops smc_pnet_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = SMC_PNETID_GET,
 | 
							.cmd = SMC_PNETID_GET,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = smc_pnet_policy,
 | 
					 | 
				
			||||||
		.doit = smc_pnet_get,
 | 
							.doit = smc_pnet_get,
 | 
				
			||||||
		.dumpit = smc_pnet_dump,
 | 
							.dumpit = smc_pnet_dump,
 | 
				
			||||||
		.start = smc_pnet_dump_start
 | 
							.start = smc_pnet_dump_start
 | 
				
			||||||
| 
						 | 
					@ -619,19 +618,16 @@ static const struct genl_ops smc_pnet_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = SMC_PNETID_ADD,
 | 
							.cmd = SMC_PNETID_ADD,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = smc_pnet_policy,
 | 
					 | 
				
			||||||
		.doit = smc_pnet_add
 | 
							.doit = smc_pnet_add
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = SMC_PNETID_DEL,
 | 
							.cmd = SMC_PNETID_DEL,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = smc_pnet_policy,
 | 
					 | 
				
			||||||
		.doit = smc_pnet_del
 | 
							.doit = smc_pnet_del
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = SMC_PNETID_FLUSH,
 | 
							.cmd = SMC_PNETID_FLUSH,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = smc_pnet_policy,
 | 
					 | 
				
			||||||
		.doit = smc_pnet_flush
 | 
							.doit = smc_pnet_flush
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -642,6 +638,7 @@ static struct genl_family smc_pnet_nl_family __ro_after_init = {
 | 
				
			||||||
	.name = SMCR_GENL_FAMILY_NAME,
 | 
						.name = SMCR_GENL_FAMILY_NAME,
 | 
				
			||||||
	.version = SMCR_GENL_FAMILY_VERSION,
 | 
						.version = SMCR_GENL_FAMILY_VERSION,
 | 
				
			||||||
	.maxattr = SMC_PNETID_MAX,
 | 
						.maxattr = SMC_PNETID_MAX,
 | 
				
			||||||
 | 
						.policy = smc_pnet_policy,
 | 
				
			||||||
	.netnsok = true,
 | 
						.netnsok = true,
 | 
				
			||||||
	.module = THIS_MODULE,
 | 
						.module = THIS_MODULE,
 | 
				
			||||||
	.ops = smc_pnet_ops,
 | 
						.ops = smc_pnet_ops,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -144,114 +144,93 @@ static const struct genl_ops tipc_genl_v2_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_BEARER_DISABLE,
 | 
							.cmd	= TIPC_NL_BEARER_DISABLE,
 | 
				
			||||||
		.doit	= tipc_nl_bearer_disable,
 | 
							.doit	= tipc_nl_bearer_disable,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_BEARER_ENABLE,
 | 
							.cmd	= TIPC_NL_BEARER_ENABLE,
 | 
				
			||||||
		.doit	= tipc_nl_bearer_enable,
 | 
							.doit	= tipc_nl_bearer_enable,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_BEARER_GET,
 | 
							.cmd	= TIPC_NL_BEARER_GET,
 | 
				
			||||||
		.doit	= tipc_nl_bearer_get,
 | 
							.doit	= tipc_nl_bearer_get,
 | 
				
			||||||
		.dumpit	= tipc_nl_bearer_dump,
 | 
							.dumpit	= tipc_nl_bearer_dump,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_BEARER_ADD,
 | 
							.cmd	= TIPC_NL_BEARER_ADD,
 | 
				
			||||||
		.doit	= tipc_nl_bearer_add,
 | 
							.doit	= tipc_nl_bearer_add,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_BEARER_SET,
 | 
							.cmd	= TIPC_NL_BEARER_SET,
 | 
				
			||||||
		.doit	= tipc_nl_bearer_set,
 | 
							.doit	= tipc_nl_bearer_set,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_SOCK_GET,
 | 
							.cmd	= TIPC_NL_SOCK_GET,
 | 
				
			||||||
		.start = tipc_dump_start,
 | 
							.start = tipc_dump_start,
 | 
				
			||||||
		.dumpit	= tipc_nl_sk_dump,
 | 
							.dumpit	= tipc_nl_sk_dump,
 | 
				
			||||||
		.done	= tipc_dump_done,
 | 
							.done	= tipc_dump_done,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_PUBL_GET,
 | 
							.cmd	= TIPC_NL_PUBL_GET,
 | 
				
			||||||
		.dumpit	= tipc_nl_publ_dump,
 | 
							.dumpit	= tipc_nl_publ_dump,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_LINK_GET,
 | 
							.cmd	= TIPC_NL_LINK_GET,
 | 
				
			||||||
		.doit   = tipc_nl_node_get_link,
 | 
							.doit   = tipc_nl_node_get_link,
 | 
				
			||||||
		.dumpit	= tipc_nl_node_dump_link,
 | 
							.dumpit	= tipc_nl_node_dump_link,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_LINK_SET,
 | 
							.cmd	= TIPC_NL_LINK_SET,
 | 
				
			||||||
		.doit	= tipc_nl_node_set_link,
 | 
							.doit	= tipc_nl_node_set_link,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_LINK_RESET_STATS,
 | 
							.cmd	= TIPC_NL_LINK_RESET_STATS,
 | 
				
			||||||
		.doit   = tipc_nl_node_reset_link_stats,
 | 
							.doit   = tipc_nl_node_reset_link_stats,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_MEDIA_GET,
 | 
							.cmd	= TIPC_NL_MEDIA_GET,
 | 
				
			||||||
		.doit	= tipc_nl_media_get,
 | 
							.doit	= tipc_nl_media_get,
 | 
				
			||||||
		.dumpit	= tipc_nl_media_dump,
 | 
							.dumpit	= tipc_nl_media_dump,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_MEDIA_SET,
 | 
							.cmd	= TIPC_NL_MEDIA_SET,
 | 
				
			||||||
		.doit	= tipc_nl_media_set,
 | 
							.doit	= tipc_nl_media_set,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_NODE_GET,
 | 
							.cmd	= TIPC_NL_NODE_GET,
 | 
				
			||||||
		.dumpit	= tipc_nl_node_dump,
 | 
							.dumpit	= tipc_nl_node_dump,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_NET_GET,
 | 
							.cmd	= TIPC_NL_NET_GET,
 | 
				
			||||||
		.dumpit	= tipc_nl_net_dump,
 | 
							.dumpit	= tipc_nl_net_dump,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_NET_SET,
 | 
							.cmd	= TIPC_NL_NET_SET,
 | 
				
			||||||
		.doit	= tipc_nl_net_set,
 | 
							.doit	= tipc_nl_net_set,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_NAME_TABLE_GET,
 | 
							.cmd	= TIPC_NL_NAME_TABLE_GET,
 | 
				
			||||||
		.dumpit	= tipc_nl_name_table_dump,
 | 
							.dumpit	= tipc_nl_name_table_dump,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_MON_SET,
 | 
							.cmd	= TIPC_NL_MON_SET,
 | 
				
			||||||
		.doit	= tipc_nl_node_set_monitor,
 | 
							.doit	= tipc_nl_node_set_monitor,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_MON_GET,
 | 
							.cmd	= TIPC_NL_MON_GET,
 | 
				
			||||||
		.doit	= tipc_nl_node_get_monitor,
 | 
							.doit	= tipc_nl_node_get_monitor,
 | 
				
			||||||
		.dumpit	= tipc_nl_node_dump_monitor,
 | 
							.dumpit	= tipc_nl_node_dump_monitor,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_MON_PEER_GET,
 | 
							.cmd	= TIPC_NL_MON_PEER_GET,
 | 
				
			||||||
		.dumpit	= tipc_nl_node_dump_monitor_peer,
 | 
							.dumpit	= tipc_nl_node_dump_monitor_peer,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_PEER_REMOVE,
 | 
							.cmd	= TIPC_NL_PEER_REMOVE,
 | 
				
			||||||
		.doit	= tipc_nl_peer_rm,
 | 
							.doit	= tipc_nl_peer_rm,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
#ifdef CONFIG_TIPC_MEDIA_UDP
 | 
					#ifdef CONFIG_TIPC_MEDIA_UDP
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd	= TIPC_NL_UDP_GET_REMOTEIP,
 | 
							.cmd	= TIPC_NL_UDP_GET_REMOTEIP,
 | 
				
			||||||
		.dumpit	= tipc_udp_nl_dump_remoteip,
 | 
							.dumpit	= tipc_udp_nl_dump_remoteip,
 | 
				
			||||||
		.policy = tipc_nl_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -261,6 +240,7 @@ struct genl_family tipc_genl_family __ro_after_init = {
 | 
				
			||||||
	.version	= TIPC_GENL_V2_VERSION,
 | 
						.version	= TIPC_GENL_V2_VERSION,
 | 
				
			||||||
	.hdrsize	= 0,
 | 
						.hdrsize	= 0,
 | 
				
			||||||
	.maxattr	= TIPC_NLA_MAX,
 | 
						.maxattr	= TIPC_NLA_MAX,
 | 
				
			||||||
 | 
						.policy = tipc_nl_policy,
 | 
				
			||||||
	.netnsok	= true,
 | 
						.netnsok	= true,
 | 
				
			||||||
	.module		= THIS_MODULE,
 | 
						.module		= THIS_MODULE,
 | 
				
			||||||
	.ops		= tipc_genl_v2_ops,
 | 
						.ops		= tipc_genl_v2_ops,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -420,25 +420,21 @@ static const struct genl_ops wimax_gnl_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = WIMAX_GNL_OP_MSG_FROM_USER,
 | 
							.cmd = WIMAX_GNL_OP_MSG_FROM_USER,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = wimax_gnl_policy,
 | 
					 | 
				
			||||||
		.doit = wimax_gnl_doit_msg_from_user,
 | 
							.doit = wimax_gnl_doit_msg_from_user,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = WIMAX_GNL_OP_RESET,
 | 
							.cmd = WIMAX_GNL_OP_RESET,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = wimax_gnl_policy,
 | 
					 | 
				
			||||||
		.doit = wimax_gnl_doit_reset,
 | 
							.doit = wimax_gnl_doit_reset,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = WIMAX_GNL_OP_RFKILL,
 | 
							.cmd = WIMAX_GNL_OP_RFKILL,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = wimax_gnl_policy,
 | 
					 | 
				
			||||||
		.doit = wimax_gnl_doit_rfkill,
 | 
							.doit = wimax_gnl_doit_rfkill,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = WIMAX_GNL_OP_STATE_GET,
 | 
							.cmd = WIMAX_GNL_OP_STATE_GET,
 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.policy = wimax_gnl_policy,
 | 
					 | 
				
			||||||
		.doit = wimax_gnl_doit_state_get,
 | 
							.doit = wimax_gnl_doit_state_get,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -582,6 +578,7 @@ struct genl_family wimax_gnl_family __ro_after_init = {
 | 
				
			||||||
	.version = WIMAX_GNL_VERSION,
 | 
						.version = WIMAX_GNL_VERSION,
 | 
				
			||||||
	.hdrsize = 0,
 | 
						.hdrsize = 0,
 | 
				
			||||||
	.maxattr = WIMAX_GNL_ATTR_MAX,
 | 
						.maxattr = WIMAX_GNL_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = wimax_gnl_policy,
 | 
				
			||||||
	.module = THIS_MODULE,
 | 
						.module = THIS_MODULE,
 | 
				
			||||||
	.ops = wimax_gnl_ops,
 | 
						.ops = wimax_gnl_ops,
 | 
				
			||||||
	.n_ops = ARRAY_SIZE(wimax_gnl_ops),
 | 
						.n_ops = ARRAY_SIZE(wimax_gnl_ops),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13368,7 +13368,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
		.doit = nl80211_get_wiphy,
 | 
							.doit = nl80211_get_wiphy,
 | 
				
			||||||
		.dumpit = nl80211_dump_wiphy,
 | 
							.dumpit = nl80211_dump_wiphy,
 | 
				
			||||||
		.done = nl80211_dump_wiphy_done,
 | 
							.done = nl80211_dump_wiphy_done,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
							.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13376,7 +13375,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_WIPHY,
 | 
							.cmd = NL80211_CMD_SET_WIPHY,
 | 
				
			||||||
		.doit = nl80211_set_wiphy,
 | 
							.doit = nl80211_set_wiphy,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_RTNL,
 | 
							.internal_flags = NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -13384,7 +13382,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
		.cmd = NL80211_CMD_GET_INTERFACE,
 | 
							.cmd = NL80211_CMD_GET_INTERFACE,
 | 
				
			||||||
		.doit = nl80211_get_interface,
 | 
							.doit = nl80211_get_interface,
 | 
				
			||||||
		.dumpit = nl80211_dump_interface,
 | 
							.dumpit = nl80211_dump_interface,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WDEV |
 | 
							.internal_flags = NL80211_FLAG_NEED_WDEV |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13392,7 +13389,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_INTERFACE,
 | 
							.cmd = NL80211_CMD_SET_INTERFACE,
 | 
				
			||||||
		.doit = nl80211_set_interface,
 | 
							.doit = nl80211_set_interface,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13400,7 +13396,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_NEW_INTERFACE,
 | 
							.cmd = NL80211_CMD_NEW_INTERFACE,
 | 
				
			||||||
		.doit = nl80211_new_interface,
 | 
							.doit = nl80211_new_interface,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
							.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13408,7 +13403,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_DEL_INTERFACE,
 | 
							.cmd = NL80211_CMD_DEL_INTERFACE,
 | 
				
			||||||
		.doit = nl80211_del_interface,
 | 
							.doit = nl80211_del_interface,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WDEV |
 | 
							.internal_flags = NL80211_FLAG_NEED_WDEV |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13416,7 +13410,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_GET_KEY,
 | 
							.cmd = NL80211_CMD_GET_KEY,
 | 
				
			||||||
		.doit = nl80211_get_key,
 | 
							.doit = nl80211_get_key,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13424,7 +13417,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_KEY,
 | 
							.cmd = NL80211_CMD_SET_KEY,
 | 
				
			||||||
		.doit = nl80211_set_key,
 | 
							.doit = nl80211_set_key,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL |
 | 
									  NL80211_FLAG_NEED_RTNL |
 | 
				
			||||||
| 
						 | 
					@ -13433,7 +13425,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_NEW_KEY,
 | 
							.cmd = NL80211_CMD_NEW_KEY,
 | 
				
			||||||
		.doit = nl80211_new_key,
 | 
							.doit = nl80211_new_key,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL |
 | 
									  NL80211_FLAG_NEED_RTNL |
 | 
				
			||||||
| 
						 | 
					@ -13442,14 +13433,12 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_DEL_KEY,
 | 
							.cmd = NL80211_CMD_DEL_KEY,
 | 
				
			||||||
		.doit = nl80211_del_key,
 | 
							.doit = nl80211_del_key,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_BEACON,
 | 
							.cmd = NL80211_CMD_SET_BEACON,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.doit = nl80211_set_beacon,
 | 
							.doit = nl80211_set_beacon,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
| 
						 | 
					@ -13457,7 +13446,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_START_AP,
 | 
							.cmd = NL80211_CMD_START_AP,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.doit = nl80211_start_ap,
 | 
							.doit = nl80211_start_ap,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
| 
						 | 
					@ -13465,7 +13453,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_STOP_AP,
 | 
							.cmd = NL80211_CMD_STOP_AP,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.doit = nl80211_stop_ap,
 | 
							.doit = nl80211_stop_ap,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
| 
						 | 
					@ -13475,14 +13462,12 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
		.cmd = NL80211_CMD_GET_STATION,
 | 
							.cmd = NL80211_CMD_GET_STATION,
 | 
				
			||||||
		.doit = nl80211_get_station,
 | 
							.doit = nl80211_get_station,
 | 
				
			||||||
		.dumpit = nl80211_dump_station,
 | 
							.dumpit = nl80211_dump_station,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_STATION,
 | 
							.cmd = NL80211_CMD_SET_STATION,
 | 
				
			||||||
		.doit = nl80211_set_station,
 | 
							.doit = nl80211_set_station,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13490,7 +13475,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_NEW_STATION,
 | 
							.cmd = NL80211_CMD_NEW_STATION,
 | 
				
			||||||
		.doit = nl80211_new_station,
 | 
							.doit = nl80211_new_station,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13498,7 +13482,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_DEL_STATION,
 | 
							.cmd = NL80211_CMD_DEL_STATION,
 | 
				
			||||||
		.doit = nl80211_del_station,
 | 
							.doit = nl80211_del_station,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13507,7 +13490,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
		.cmd = NL80211_CMD_GET_MPATH,
 | 
							.cmd = NL80211_CMD_GET_MPATH,
 | 
				
			||||||
		.doit = nl80211_get_mpath,
 | 
							.doit = nl80211_get_mpath,
 | 
				
			||||||
		.dumpit = nl80211_dump_mpath,
 | 
							.dumpit = nl80211_dump_mpath,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13516,7 +13498,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
		.cmd = NL80211_CMD_GET_MPP,
 | 
							.cmd = NL80211_CMD_GET_MPP,
 | 
				
			||||||
		.doit = nl80211_get_mpp,
 | 
							.doit = nl80211_get_mpp,
 | 
				
			||||||
		.dumpit = nl80211_dump_mpp,
 | 
							.dumpit = nl80211_dump_mpp,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13524,7 +13505,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_MPATH,
 | 
							.cmd = NL80211_CMD_SET_MPATH,
 | 
				
			||||||
		.doit = nl80211_set_mpath,
 | 
							.doit = nl80211_set_mpath,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13532,7 +13512,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_NEW_MPATH,
 | 
							.cmd = NL80211_CMD_NEW_MPATH,
 | 
				
			||||||
		.doit = nl80211_new_mpath,
 | 
							.doit = nl80211_new_mpath,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13540,7 +13519,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_DEL_MPATH,
 | 
							.cmd = NL80211_CMD_DEL_MPATH,
 | 
				
			||||||
		.doit = nl80211_del_mpath,
 | 
							.doit = nl80211_del_mpath,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13548,7 +13526,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_BSS,
 | 
							.cmd = NL80211_CMD_SET_BSS,
 | 
				
			||||||
		.doit = nl80211_set_bss,
 | 
							.doit = nl80211_set_bss,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13557,7 +13534,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
		.cmd = NL80211_CMD_GET_REG,
 | 
							.cmd = NL80211_CMD_GET_REG,
 | 
				
			||||||
		.doit = nl80211_get_reg_do,
 | 
							.doit = nl80211_get_reg_do,
 | 
				
			||||||
		.dumpit = nl80211_get_reg_dump,
 | 
							.dumpit = nl80211_get_reg_dump,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_RTNL,
 | 
							.internal_flags = NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -13565,7 +13541,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_REG,
 | 
							.cmd = NL80211_CMD_SET_REG,
 | 
				
			||||||
		.doit = nl80211_set_reg,
 | 
							.doit = nl80211_set_reg,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_RTNL,
 | 
							.internal_flags = NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
| 
						 | 
					@ -13573,19 +13548,16 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_REQ_SET_REG,
 | 
							.cmd = NL80211_CMD_REQ_SET_REG,
 | 
				
			||||||
		.doit = nl80211_req_set_reg,
 | 
							.doit = nl80211_req_set_reg,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_RELOAD_REGDB,
 | 
							.cmd = NL80211_CMD_RELOAD_REGDB,
 | 
				
			||||||
		.doit = nl80211_reload_regdb,
 | 
							.doit = nl80211_reload_regdb,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_GET_MESH_CONFIG,
 | 
							.cmd = NL80211_CMD_GET_MESH_CONFIG,
 | 
				
			||||||
		.doit = nl80211_get_mesh_config,
 | 
							.doit = nl80211_get_mesh_config,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13593,7 +13565,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_MESH_CONFIG,
 | 
							.cmd = NL80211_CMD_SET_MESH_CONFIG,
 | 
				
			||||||
		.doit = nl80211_update_mesh_config,
 | 
							.doit = nl80211_update_mesh_config,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13601,7 +13572,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_TRIGGER_SCAN,
 | 
							.cmd = NL80211_CMD_TRIGGER_SCAN,
 | 
				
			||||||
		.doit = nl80211_trigger_scan,
 | 
							.doit = nl80211_trigger_scan,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13609,20 +13579,17 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_ABORT_SCAN,
 | 
							.cmd = NL80211_CMD_ABORT_SCAN,
 | 
				
			||||||
		.doit = nl80211_abort_scan,
 | 
							.doit = nl80211_abort_scan,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_GET_SCAN,
 | 
							.cmd = NL80211_CMD_GET_SCAN,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.dumpit = nl80211_dump_scan,
 | 
							.dumpit = nl80211_dump_scan,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_START_SCHED_SCAN,
 | 
							.cmd = NL80211_CMD_START_SCHED_SCAN,
 | 
				
			||||||
		.doit = nl80211_start_sched_scan,
 | 
							.doit = nl80211_start_sched_scan,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13630,7 +13597,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_STOP_SCHED_SCAN,
 | 
							.cmd = NL80211_CMD_STOP_SCHED_SCAN,
 | 
				
			||||||
		.doit = nl80211_stop_sched_scan,
 | 
							.doit = nl80211_stop_sched_scan,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13638,7 +13604,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_AUTHENTICATE,
 | 
							.cmd = NL80211_CMD_AUTHENTICATE,
 | 
				
			||||||
		.doit = nl80211_authenticate,
 | 
							.doit = nl80211_authenticate,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL |
 | 
									  NL80211_FLAG_NEED_RTNL |
 | 
				
			||||||
| 
						 | 
					@ -13647,7 +13612,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_ASSOCIATE,
 | 
							.cmd = NL80211_CMD_ASSOCIATE,
 | 
				
			||||||
		.doit = nl80211_associate,
 | 
							.doit = nl80211_associate,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13655,7 +13619,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_DEAUTHENTICATE,
 | 
							.cmd = NL80211_CMD_DEAUTHENTICATE,
 | 
				
			||||||
		.doit = nl80211_deauthenticate,
 | 
							.doit = nl80211_deauthenticate,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13663,7 +13626,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_DISASSOCIATE,
 | 
							.cmd = NL80211_CMD_DISASSOCIATE,
 | 
				
			||||||
		.doit = nl80211_disassociate,
 | 
							.doit = nl80211_disassociate,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13671,7 +13633,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_JOIN_IBSS,
 | 
							.cmd = NL80211_CMD_JOIN_IBSS,
 | 
				
			||||||
		.doit = nl80211_join_ibss,
 | 
							.doit = nl80211_join_ibss,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13679,7 +13640,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_LEAVE_IBSS,
 | 
							.cmd = NL80211_CMD_LEAVE_IBSS,
 | 
				
			||||||
		.doit = nl80211_leave_ibss,
 | 
							.doit = nl80211_leave_ibss,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13689,7 +13649,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
		.cmd = NL80211_CMD_TESTMODE,
 | 
							.cmd = NL80211_CMD_TESTMODE,
 | 
				
			||||||
		.doit = nl80211_testmode_do,
 | 
							.doit = nl80211_testmode_do,
 | 
				
			||||||
		.dumpit = nl80211_testmode_dump,
 | 
							.dumpit = nl80211_testmode_dump,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
							.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13698,7 +13657,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_CONNECT,
 | 
							.cmd = NL80211_CMD_CONNECT,
 | 
				
			||||||
		.doit = nl80211_connect,
 | 
							.doit = nl80211_connect,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13706,7 +13664,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS,
 | 
							.cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS,
 | 
				
			||||||
		.doit = nl80211_update_connect_params,
 | 
							.doit = nl80211_update_connect_params,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13714,7 +13671,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_DISCONNECT,
 | 
							.cmd = NL80211_CMD_DISCONNECT,
 | 
				
			||||||
		.doit = nl80211_disconnect,
 | 
							.doit = nl80211_disconnect,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13722,20 +13678,17 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_WIPHY_NETNS,
 | 
							.cmd = NL80211_CMD_SET_WIPHY_NETNS,
 | 
				
			||||||
		.doit = nl80211_wiphy_netns,
 | 
							.doit = nl80211_wiphy_netns,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
							.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_GET_SURVEY,
 | 
							.cmd = NL80211_CMD_GET_SURVEY,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.dumpit = nl80211_dump_survey,
 | 
							.dumpit = nl80211_dump_survey,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_PMKSA,
 | 
							.cmd = NL80211_CMD_SET_PMKSA,
 | 
				
			||||||
		.doit = nl80211_setdel_pmksa,
 | 
							.doit = nl80211_setdel_pmksa,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13743,7 +13696,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_DEL_PMKSA,
 | 
							.cmd = NL80211_CMD_DEL_PMKSA,
 | 
				
			||||||
		.doit = nl80211_setdel_pmksa,
 | 
							.doit = nl80211_setdel_pmksa,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13751,7 +13703,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_FLUSH_PMKSA,
 | 
							.cmd = NL80211_CMD_FLUSH_PMKSA,
 | 
				
			||||||
		.doit = nl80211_flush_pmksa,
 | 
							.doit = nl80211_flush_pmksa,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13759,7 +13710,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_REMAIN_ON_CHANNEL,
 | 
							.cmd = NL80211_CMD_REMAIN_ON_CHANNEL,
 | 
				
			||||||
		.doit = nl80211_remain_on_channel,
 | 
							.doit = nl80211_remain_on_channel,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13767,7 +13717,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
 | 
							.cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
 | 
				
			||||||
		.doit = nl80211_cancel_remain_on_channel,
 | 
							.doit = nl80211_cancel_remain_on_channel,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13775,7 +13724,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_TX_BITRATE_MASK,
 | 
							.cmd = NL80211_CMD_SET_TX_BITRATE_MASK,
 | 
				
			||||||
		.doit = nl80211_set_tx_bitrate_mask,
 | 
							.doit = nl80211_set_tx_bitrate_mask,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13783,7 +13731,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_REGISTER_FRAME,
 | 
							.cmd = NL80211_CMD_REGISTER_FRAME,
 | 
				
			||||||
		.doit = nl80211_register_mgmt,
 | 
							.doit = nl80211_register_mgmt,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WDEV |
 | 
							.internal_flags = NL80211_FLAG_NEED_WDEV |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13791,7 +13738,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_FRAME,
 | 
							.cmd = NL80211_CMD_FRAME,
 | 
				
			||||||
		.doit = nl80211_tx_mgmt,
 | 
							.doit = nl80211_tx_mgmt,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13799,7 +13745,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_FRAME_WAIT_CANCEL,
 | 
							.cmd = NL80211_CMD_FRAME_WAIT_CANCEL,
 | 
				
			||||||
		.doit = nl80211_tx_mgmt_cancel_wait,
 | 
							.doit = nl80211_tx_mgmt_cancel_wait,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13807,7 +13752,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_POWER_SAVE,
 | 
							.cmd = NL80211_CMD_SET_POWER_SAVE,
 | 
				
			||||||
		.doit = nl80211_set_power_save,
 | 
							.doit = nl80211_set_power_save,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13815,7 +13759,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_GET_POWER_SAVE,
 | 
							.cmd = NL80211_CMD_GET_POWER_SAVE,
 | 
				
			||||||
		.doit = nl80211_get_power_save,
 | 
							.doit = nl80211_get_power_save,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13823,7 +13766,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_CQM,
 | 
							.cmd = NL80211_CMD_SET_CQM,
 | 
				
			||||||
		.doit = nl80211_set_cqm,
 | 
							.doit = nl80211_set_cqm,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13831,7 +13773,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_CHANNEL,
 | 
							.cmd = NL80211_CMD_SET_CHANNEL,
 | 
				
			||||||
		.doit = nl80211_set_channel,
 | 
							.doit = nl80211_set_channel,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13839,7 +13780,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_WDS_PEER,
 | 
							.cmd = NL80211_CMD_SET_WDS_PEER,
 | 
				
			||||||
		.doit = nl80211_set_wds_peer,
 | 
							.doit = nl80211_set_wds_peer,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13847,7 +13787,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_JOIN_MESH,
 | 
							.cmd = NL80211_CMD_JOIN_MESH,
 | 
				
			||||||
		.doit = nl80211_join_mesh,
 | 
							.doit = nl80211_join_mesh,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13855,7 +13794,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_LEAVE_MESH,
 | 
							.cmd = NL80211_CMD_LEAVE_MESH,
 | 
				
			||||||
		.doit = nl80211_leave_mesh,
 | 
							.doit = nl80211_leave_mesh,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13863,7 +13801,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_JOIN_OCB,
 | 
							.cmd = NL80211_CMD_JOIN_OCB,
 | 
				
			||||||
		.doit = nl80211_join_ocb,
 | 
							.doit = nl80211_join_ocb,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13871,7 +13808,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_LEAVE_OCB,
 | 
							.cmd = NL80211_CMD_LEAVE_OCB,
 | 
				
			||||||
		.doit = nl80211_leave_ocb,
 | 
							.doit = nl80211_leave_ocb,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13880,7 +13816,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_GET_WOWLAN,
 | 
							.cmd = NL80211_CMD_GET_WOWLAN,
 | 
				
			||||||
		.doit = nl80211_get_wowlan,
 | 
							.doit = nl80211_get_wowlan,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		/* can be retrieved by unprivileged users */
 | 
							/* can be retrieved by unprivileged users */
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
							.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13888,7 +13823,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_WOWLAN,
 | 
							.cmd = NL80211_CMD_SET_WOWLAN,
 | 
				
			||||||
		.doit = nl80211_set_wowlan,
 | 
							.doit = nl80211_set_wowlan,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
							.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13897,7 +13831,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_REKEY_OFFLOAD,
 | 
							.cmd = NL80211_CMD_SET_REKEY_OFFLOAD,
 | 
				
			||||||
		.doit = nl80211_set_rekey_data,
 | 
							.doit = nl80211_set_rekey_data,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL |
 | 
									  NL80211_FLAG_NEED_RTNL |
 | 
				
			||||||
| 
						 | 
					@ -13906,7 +13839,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_TDLS_MGMT,
 | 
							.cmd = NL80211_CMD_TDLS_MGMT,
 | 
				
			||||||
		.doit = nl80211_tdls_mgmt,
 | 
							.doit = nl80211_tdls_mgmt,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13914,7 +13846,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_TDLS_OPER,
 | 
							.cmd = NL80211_CMD_TDLS_OPER,
 | 
				
			||||||
		.doit = nl80211_tdls_oper,
 | 
							.doit = nl80211_tdls_oper,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13922,7 +13853,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_UNEXPECTED_FRAME,
 | 
							.cmd = NL80211_CMD_UNEXPECTED_FRAME,
 | 
				
			||||||
		.doit = nl80211_register_unexpected_frame,
 | 
							.doit = nl80211_register_unexpected_frame,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13930,7 +13860,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_PROBE_CLIENT,
 | 
							.cmd = NL80211_CMD_PROBE_CLIENT,
 | 
				
			||||||
		.doit = nl80211_probe_client,
 | 
							.doit = nl80211_probe_client,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13938,7 +13867,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_REGISTER_BEACONS,
 | 
							.cmd = NL80211_CMD_REGISTER_BEACONS,
 | 
				
			||||||
		.doit = nl80211_register_beacons,
 | 
							.doit = nl80211_register_beacons,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
							.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13946,7 +13874,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_NOACK_MAP,
 | 
							.cmd = NL80211_CMD_SET_NOACK_MAP,
 | 
				
			||||||
		.doit = nl80211_set_noack_map,
 | 
							.doit = nl80211_set_noack_map,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13954,7 +13881,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_START_P2P_DEVICE,
 | 
							.cmd = NL80211_CMD_START_P2P_DEVICE,
 | 
				
			||||||
		.doit = nl80211_start_p2p_device,
 | 
							.doit = nl80211_start_p2p_device,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WDEV |
 | 
							.internal_flags = NL80211_FLAG_NEED_WDEV |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13962,7 +13888,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_STOP_P2P_DEVICE,
 | 
							.cmd = NL80211_CMD_STOP_P2P_DEVICE,
 | 
				
			||||||
		.doit = nl80211_stop_p2p_device,
 | 
							.doit = nl80211_stop_p2p_device,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13970,7 +13895,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_START_NAN,
 | 
							.cmd = NL80211_CMD_START_NAN,
 | 
				
			||||||
		.doit = nl80211_start_nan,
 | 
							.doit = nl80211_start_nan,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WDEV |
 | 
							.internal_flags = NL80211_FLAG_NEED_WDEV |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13978,7 +13902,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_STOP_NAN,
 | 
							.cmd = NL80211_CMD_STOP_NAN,
 | 
				
			||||||
		.doit = nl80211_stop_nan,
 | 
							.doit = nl80211_stop_nan,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13986,7 +13909,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_ADD_NAN_FUNCTION,
 | 
							.cmd = NL80211_CMD_ADD_NAN_FUNCTION,
 | 
				
			||||||
		.doit = nl80211_nan_add_func,
 | 
							.doit = nl80211_nan_add_func,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -13994,7 +13916,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_DEL_NAN_FUNCTION,
 | 
							.cmd = NL80211_CMD_DEL_NAN_FUNCTION,
 | 
				
			||||||
		.doit = nl80211_nan_del_func,
 | 
							.doit = nl80211_nan_del_func,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14002,7 +13923,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_CHANGE_NAN_CONFIG,
 | 
							.cmd = NL80211_CMD_CHANGE_NAN_CONFIG,
 | 
				
			||||||
		.doit = nl80211_nan_change_config,
 | 
							.doit = nl80211_nan_change_config,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14010,7 +13930,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_MCAST_RATE,
 | 
							.cmd = NL80211_CMD_SET_MCAST_RATE,
 | 
				
			||||||
		.doit = nl80211_set_mcast_rate,
 | 
							.doit = nl80211_set_mcast_rate,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14018,7 +13937,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_MAC_ACL,
 | 
							.cmd = NL80211_CMD_SET_MAC_ACL,
 | 
				
			||||||
		.doit = nl80211_set_mac_acl,
 | 
							.doit = nl80211_set_mac_acl,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14026,7 +13944,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_RADAR_DETECT,
 | 
							.cmd = NL80211_CMD_RADAR_DETECT,
 | 
				
			||||||
		.doit = nl80211_start_radar_detection,
 | 
							.doit = nl80211_start_radar_detection,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14034,12 +13951,10 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_GET_PROTOCOL_FEATURES,
 | 
							.cmd = NL80211_CMD_GET_PROTOCOL_FEATURES,
 | 
				
			||||||
		.doit = nl80211_get_protocol_features,
 | 
							.doit = nl80211_get_protocol_features,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_UPDATE_FT_IES,
 | 
							.cmd = NL80211_CMD_UPDATE_FT_IES,
 | 
				
			||||||
		.doit = nl80211_update_ft_ies,
 | 
							.doit = nl80211_update_ft_ies,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14047,7 +13962,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_CRIT_PROTOCOL_START,
 | 
							.cmd = NL80211_CMD_CRIT_PROTOCOL_START,
 | 
				
			||||||
		.doit = nl80211_crit_protocol_start,
 | 
							.doit = nl80211_crit_protocol_start,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14055,7 +13969,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_CRIT_PROTOCOL_STOP,
 | 
							.cmd = NL80211_CMD_CRIT_PROTOCOL_STOP,
 | 
				
			||||||
		.doit = nl80211_crit_protocol_stop,
 | 
							.doit = nl80211_crit_protocol_stop,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14063,14 +13976,12 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_GET_COALESCE,
 | 
							.cmd = NL80211_CMD_GET_COALESCE,
 | 
				
			||||||
		.doit = nl80211_get_coalesce,
 | 
							.doit = nl80211_get_coalesce,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
							.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_COALESCE,
 | 
							.cmd = NL80211_CMD_SET_COALESCE,
 | 
				
			||||||
		.doit = nl80211_set_coalesce,
 | 
							.doit = nl80211_set_coalesce,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
							.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14078,7 +13989,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_CHANNEL_SWITCH,
 | 
							.cmd = NL80211_CMD_CHANNEL_SWITCH,
 | 
				
			||||||
		.doit = nl80211_channel_switch,
 | 
							.doit = nl80211_channel_switch,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14087,7 +13997,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
		.cmd = NL80211_CMD_VENDOR,
 | 
							.cmd = NL80211_CMD_VENDOR,
 | 
				
			||||||
		.doit = nl80211_vendor_cmd,
 | 
							.doit = nl80211_vendor_cmd,
 | 
				
			||||||
		.dumpit = nl80211_vendor_cmd_dump,
 | 
							.dumpit = nl80211_vendor_cmd_dump,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
							.internal_flags = NL80211_FLAG_NEED_WIPHY |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14095,7 +14004,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_QOS_MAP,
 | 
							.cmd = NL80211_CMD_SET_QOS_MAP,
 | 
				
			||||||
		.doit = nl80211_set_qos_map,
 | 
							.doit = nl80211_set_qos_map,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14103,7 +14011,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_ADD_TX_TS,
 | 
							.cmd = NL80211_CMD_ADD_TX_TS,
 | 
				
			||||||
		.doit = nl80211_add_tx_ts,
 | 
							.doit = nl80211_add_tx_ts,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14111,7 +14018,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_DEL_TX_TS,
 | 
							.cmd = NL80211_CMD_DEL_TX_TS,
 | 
				
			||||||
		.doit = nl80211_del_tx_ts,
 | 
							.doit = nl80211_del_tx_ts,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14119,7 +14025,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH,
 | 
							.cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH,
 | 
				
			||||||
		.doit = nl80211_tdls_channel_switch,
 | 
							.doit = nl80211_tdls_channel_switch,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14127,7 +14032,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH,
 | 
							.cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH,
 | 
				
			||||||
		.doit = nl80211_tdls_cancel_channel_switch,
 | 
							.doit = nl80211_tdls_cancel_channel_switch,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14135,7 +14039,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST,
 | 
							.cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST,
 | 
				
			||||||
		.doit = nl80211_set_multicast_to_unicast,
 | 
							.doit = nl80211_set_multicast_to_unicast,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14143,21 +14046,18 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_SET_PMK,
 | 
							.cmd = NL80211_CMD_SET_PMK,
 | 
				
			||||||
		.doit = nl80211_set_pmk,
 | 
							.doit = nl80211_set_pmk,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_DEL_PMK,
 | 
							.cmd = NL80211_CMD_DEL_PMK,
 | 
				
			||||||
		.doit = nl80211_del_pmk,
 | 
							.doit = nl80211_del_pmk,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_EXTERNAL_AUTH,
 | 
							.cmd = NL80211_CMD_EXTERNAL_AUTH,
 | 
				
			||||||
		.doit = nl80211_external_auth,
 | 
							.doit = nl80211_external_auth,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_ADMIN_PERM,
 | 
							.flags = GENL_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14165,7 +14065,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_CONTROL_PORT_FRAME,
 | 
							.cmd = NL80211_CMD_CONTROL_PORT_FRAME,
 | 
				
			||||||
		.doit = nl80211_tx_control_port,
 | 
							.doit = nl80211_tx_control_port,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14173,14 +14072,12 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_GET_FTM_RESPONDER_STATS,
 | 
							.cmd = NL80211_CMD_GET_FTM_RESPONDER_STATS,
 | 
				
			||||||
		.doit = nl80211_get_ftm_responder_stats,
 | 
							.doit = nl80211_get_ftm_responder_stats,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_PEER_MEASUREMENT_START,
 | 
							.cmd = NL80211_CMD_PEER_MEASUREMENT_START,
 | 
				
			||||||
		.doit = nl80211_pmsr_start,
 | 
							.doit = nl80211_pmsr_start,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14188,7 +14085,6 @@ static const struct genl_ops nl80211_ops[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.cmd = NL80211_CMD_NOTIFY_RADAR,
 | 
							.cmd = NL80211_CMD_NOTIFY_RADAR,
 | 
				
			||||||
		.doit = nl80211_notify_radar_detection,
 | 
							.doit = nl80211_notify_radar_detection,
 | 
				
			||||||
		.policy = nl80211_policy,
 | 
					 | 
				
			||||||
		.flags = GENL_UNS_ADMIN_PERM,
 | 
							.flags = GENL_UNS_ADMIN_PERM,
 | 
				
			||||||
		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
							.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
 | 
				
			||||||
				  NL80211_FLAG_NEED_RTNL,
 | 
									  NL80211_FLAG_NEED_RTNL,
 | 
				
			||||||
| 
						 | 
					@ -14200,6 +14096,7 @@ static struct genl_family nl80211_fam __ro_after_init = {
 | 
				
			||||||
	.hdrsize = 0,			/* no private header */
 | 
						.hdrsize = 0,			/* no private header */
 | 
				
			||||||
	.version = 1,			/* no particular meaning now */
 | 
						.version = 1,			/* no particular meaning now */
 | 
				
			||||||
	.maxattr = NL80211_ATTR_MAX,
 | 
						.maxattr = NL80211_ATTR_MAX,
 | 
				
			||||||
 | 
						.policy = nl80211_policy,
 | 
				
			||||||
	.netnsok = true,
 | 
						.netnsok = true,
 | 
				
			||||||
	.pre_doit = nl80211_pre_doit,
 | 
						.pre_doit = nl80211_pre_doit,
 | 
				
			||||||
	.post_doit = nl80211_post_doit,
 | 
						.post_doit = nl80211_post_doit,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue