On Tue, 22 Aug 2006 15:52:47 +0200, Johannes Berg wrote:
> [...]
> + int (*add_virtual_intf)(void *priv, char *name);
What about initial interface type? (Hm, maybe it can be fixed to a STA
mode, but it should be documented somewhere at least.)
> + int (*del_virtual_intf)(void *priv, int ifindex);
> +
> + /* more things to be added...
> + *
> + * for a (*configure)(...) call I'd probably guess that the
> + * best bet would be to have one call that returns all
> + * possible options, one that sets them based on the
> + * struct genl_info *info, and one for that optimised
> + * set-at-once thing.
> + */
> +};
> +
> +/*
> + * register a given method structure with the nl80211 system
> + * and associate the 'priv' pointer with it.
> + * NOTE: for proper operation, this priv pointer MUST also be
> + * assigned to each &struct net_device's @ieee80211_ptr member!
> + */
> +extern int nl80211_register(struct nl80211_ops *ops, void *priv);
Could this function return the allocated wiphy index?
> [...]
> +struct nl80211_registered_driver {
> + struct nl80211_ops *ops;
> + int wiphy;
> + void *priv;
> + struct list_head list;
> + /* we hold this mutex during any call so that
> + * we cannot do multiple calls at once, and also
> + * to avoid the deregister call to proceed while
> + * any call is in progress */
> + struct mutex mtx;
> +};
Hm, most of drivers will need to take rtnl to stay compatible with WE.
(Not a reason to take rtnl in nl80211, just a remark.)
> [...]
> +static struct nl80211_registered_driver *nl80211_drv_by_priv_locked(void
> *priv)
Please use __ prefix instead of _locked suffix (e.g.
__nl80211_drv_by_priv). That's more common convention in the kernel.
> [...]
> +/* requires nl80211_drv_mutex to be held! */
> +static struct nl80211_registered_driver *
> +nl80211_drv_from_info_locked(struct genl_info *info)
> +{
> + int ifindex;
> + struct nl80211_registered_driver *result = NULL;
> + struct net_device *dev;
> + int err = -EINVAL;
> +
> + if (info->attrs[NL80211_ATTR_WIPHY]) {
> + result = nl80211_drv_by_wiphy_locked(
> + nla_get_u32(info->attrs[NL80211_ATTR_WIPHY]));
> + if (result)
> + return result;
> + err = -ENODEV;
> + }
> +
> + if (info->attrs[NL80211_ATTR_IFINDEX]) {
> + ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
> + dev = dev_get_by_index(ifindex);
> + result = nl80211_drv_by_priv_locked(dev->ieee80211_ptr);
> + dev_put(dev);
> + if (result)
> + return result;
> + err = -ENODEV;
> + }
If both ifindex and wiphy index are set and they disagree with each
other, this should return an error.
> +
> + return ERR_PTR(err);
> +}
> +
> [...]
> +static struct nl80211_registered_driver *
> +nl80211_drv_from_info_with_locking(struct genl_info *info)
nl80211_get_drv_from_info would be better. Also, introduce
a nl80211_put_drv function to ease tracking of locks.
> [...]
> +static int nl80211_dump_wiphys(struct sk_buff *skb, struct netlink_callback
> *cb)
> +{
> + /* I think need professional netlink help with dumpit calls */
I'm not able to help you here :-(
Looks really good now, I think.
Thanks,
Jiri
--
Jiri Benc
SUSE Labs
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html