[PATCH] genl: modify genl_ctrl_resolve and friends to allow for module auto-loading

Thomas Graf tgraf at infradead.org
Fri Jun 1 02:24:58 EDT 2012


On Thu, May 31, 2012 at 03:09:05PM -0400, Neil Horman wrote:
> Generic netlink has the ability to autoload modules in response to a request for
> a family.  Currently libnl uses a GETFAMILY call with the NLM_F_DUMP flag to
> list all the available families, but doing so neglects the possibility of an
> autoloaded module.  This patch modifies the genl code to probe the kernel for a
> specific family rather than dumping a list of all the currenlty available ones,
> making autoload work properly.

Nice work Neil

> Signed-off-by: Neil Horman <nhorman at tuxdriver.com>
> CC: Thomas Graf <tgraf at redhat.com>
> ---
>  lib/genl/ctrl.c |  133 +++++++++++++++++++++++++++++++++++++++++++++++++------
>  1 files changed, 119 insertions(+), 14 deletions(-)
> 
> diff --git a/lib/genl/ctrl.c b/lib/genl/ctrl.c
> index 107a4fa..9b29000 100644
> --- a/lib/genl/ctrl.c
> +++ b/lib/genl/ctrl.c
> @@ -250,6 +250,120 @@ struct genl_family *genl_ctrl_search_by_name(struct nl_cache *cache,
>  /** @} */
>  
>  /**
> + * process responses from from the query sent by genl_ctrl_probe_by_name 
> + * @arg nl_msg		Returned message.
> + * @arg name		genl_family structure to fill out.
> + *
> + * Process returned messages, filling out the missing informatino in the
> + * genl_family structure
> + *
> + * @return Indicator to keep processing frames or not
> + *
> + */
> +static int probe_response(struct nl_msg *msg, void *arg)
> +{
> +	struct nlattr *tb[__CTRL_ATTR_MAX+1];
> +	struct nlmsghdr *nlh = nlmsg_hdr(msg);
> +	struct genl_family *ret = (struct genl_family *)arg;
> +
> +	if (genlmsg_parse(nlh, 0, tb, __CTRL_ATTR_MAX, ctrl_policy))

Looks like you have to use CTRL_ATTR_MAX here.

> + */
> +static struct genl_family *genl_ctrl_probe_by_name(struct nl_sock *sk, const char *name)
> +{
> +	struct nl_msg *msg;
> +	struct genl_family *ret = NULL;
> +	int rc;
> +	void *hdr;

hdr seems unused

>  
> @@ -337,6 +440,8 @@ static struct genl_cmd genl_cmds[] = {
>  	{
>  		.c_id		= CTRL_CMD_GETFAMILY,
>  		.c_name		= "GETFAMILY" ,
> +		.c_maxattr	= CTRL_ATTR_MAX,
> +		.c_attr_policy	= ctrl_policy,
>  	},

This seems unneeded, c_maxattr and c_attr_policy should only be used on
rx and the reply should come as CTRL_CMD_NEWFAMILY.



More information about the libnl mailing list