[PATCH 08/20] driver: nl80211: handle creation of P2P device interface

Peer, Ilan ilan.peer at intel.com
Sun May 19 14:15:08 EDT 2013



> -----Original Message-----
> From: hostap-bounces at lists.shmoo.com [mailto:hostap-
> bounces at lists.shmoo.com] On Behalf Of Arend van Spriel
> Sent: Thursday, May 16, 2013 16:28
> To: Jouni Malinen
> Cc: hostap at lists.shmoo.com
> Subject: [PATCH 08/20] driver: nl80211: handle creation of P2P device interface
> 
> Add specific handler for creating the P2P device to store the wdev_id as this
> type of interface does not have an interface index.
> 
> Signed-hostap: Arend van Spriel <arend at broadcom.com>
> ---
>  src/drivers/driver_nl80211.c |   57
> ++++++++++++++++++++++++++++++++++++------
>  1 file changed, 50 insertions(+), 7 deletions(-)
> 
> diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index
> f185f71..92b8882 100644
> --- a/src/drivers/driver_nl80211.c
> +++ b/src/drivers/driver_nl80211.c
> @@ -4592,10 +4592,15 @@ static int wpa_driver_nl80211_set_key(const char
> *ifname, struct i802_bss *bss,
>  				      const u8 *key, size_t key_len)  {
>  	struct wpa_driver_nl80211_data *drv = bss->drv;
> -	int ifindex = if_nametoindex(ifname);
> +	int ifindex;
>  	struct nl_msg *msg;
>  	int ret;
> 
> +	/* ignore for P2P Device */
> +	if (drv->nlmode == NL80211_IFTYPE_P2P_DEVICE)
> +		return 0;
> +
> +	ifindex = if_nametoindex(ifname);
>  	wpa_printf(MSG_DEBUG, "%s: ifindex=%d alg=%d addr=%p key_idx=%d
> "
>  		   "set_tx=%d seq_len=%lu key_len=%lu",
>  		   __func__, ifindex, alg, addr, key_idx, set_tx, @@ -8584,6
> +8589,24 @@ static int nl80211_p2p_interface_addr(struct
> wpa_driver_nl80211_data *drv,
> 
>  #endif /* CONFIG_P2P */
> 
> +static int nl80211_create_p2p_dev_handler(struct nl_msg *msg, void
> +*arg) {

Can't we simply have this for all the interfaces types? Is there something wrong we having to keep wdev in all cases?

> +	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
> +	struct nlattr *tb[NL80211_ATTR_MAX + 1];
> +	struct i802_bss *p2p_dev = arg;
> +
> +	nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
> +			genlmsg_attrlen(gnlh, 0), NULL);
> +	if (tb[NL80211_ATTR_WDEV])
> +		p2p_dev->wdev_id =
> +			nla_get_u64(tb[NL80211_ATTR_WDEV]);
> +
> +	if (tb[NL80211_ATTR_MAC])
> +		os_memcpy(p2p_dev->addr,
> +			  nla_data(tb[NL80211_ATTR_MAC]), ETH_ALEN);
> +
> +	return NL_SKIP;
> +}
> 
>  static int wpa_driver_nl80211_if_add(void *priv, enum wpa_driver_if_type
> type,
>  				     const char *ifname, const u8 *addr, @@ -
> 8591,7 +8614,9 @@ static int wpa_driver_nl80211_if_add(void *priv, enum
> wpa_driver_if_type type,
>  				     char *force_ifname, u8 *if_addr,
>  				     const char *bridge)
>  {
> +	enum nl80211_iftype nlmode;
>  	struct i802_bss *bss = priv;
> +	struct i802_bss *p2pdev;
>  	struct wpa_driver_nl80211_data *drv = bss->drv;
>  	int ifidx;
>  #ifdef HOSTAPD
> @@ -8606,14 +8631,32 @@ static int wpa_driver_nl80211_if_add(void *priv,
> enum wpa_driver_if_type type,
> 
>  	if (addr)
>  		os_memcpy(if_addr, addr, ETH_ALEN);
> -	ifidx = nl80211_create_iface(drv, ifname,
> -				     wpa_driver_nl80211_if_type(type), addr,
> -				     0, NULL, NULL);
> -	if (ifidx < 0) {
> +	nlmode = wpa_driver_nl80211_if_type(type);
> +	if (nlmode == NL80211_IFTYPE_P2P_DEVICE) {
> +		p2pdev = os_zalloc(sizeof(*p2pdev));
> +		if (!p2pdev)
> +			return -1;
> +		*p2pdev = *bss;
> +		os_strncpy(p2pdev->ifname, ifname, IFNAMSIZ);
> +		ifidx = nl80211_create_iface(drv, ifname, nlmode, addr,
> +					     0,
> nl80211_create_p2p_dev_handler,
> +					     p2pdev);
> +		if (p2pdev->wdev_id == -1 || ifidx != 0 ||
> +		    is_zero_ether_addr((const u8 *)&p2pdev->addr)) {
> +			wpa_printf(MSG_ERROR, "nl80211: Failed to create a
> p2p device"
> +					" interface %s", ifname);
> +			os_free(p2pdev);
> +			return -1;
> +		}
> +	} else {
> +		ifidx = nl80211_create_iface(drv, ifname, nlmode, addr,
> +					     0, NULL, NULL);
> +		if (ifidx < 0) {
>  #ifdef HOSTAPD
> -		os_free(new_bss);
> +			os_free(new_bss);
>  #endif /* HOSTAPD */
> -		return -1;
> +			return -1;
> +		}
>  	}
> 
>  	if (!addr &&
> --
> 1.7.10.4
> 
> 
> _______________________________________________
> HostAP mailing list
> HostAP at lists.shmoo.com
> http://lists.shmoo.com/mailman/listinfo/hostap


More information about the HostAP mailing list