[PATCH 03/20] driver: nl80211: hold wdev identification for P2P device
Peer, Ilan
ilan.peer
Mon May 20 00:05:12 PDT 2013
> -----Original Message-----
> From: Arend van Spriel [mailto:arend at broadcom.com]
> Sent: Monday, May 20, 2013 00:14
> To: Peer, Ilan
> Cc: Jouni Malinen; hostap at lists.shmoo.com; Johannes Berg
> Subject: Re: [PATCH 03/20] driver: nl80211: hold wdev identification for P2P
> device
>
> On 05/19/2013 08:13 PM, Peer, Ilan wrote:
> >
> >
> >> -----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 03/20] driver: nl80211: hold wdev identification for
> >> P2P device
> >>
> >
> > The title of the patch might be a bit misleading :)
> >
> >> From: David Spinadel <david.spinadel at intel.com>
> >>
> >> Add wdev_id to i802_bss.
> >> Init wdev_id to -1 by default.
> >> Use wdev_id if assigned, instead of ifindex.
> >> Use wdev_id for events that come from the kernel to identify the
> >> relevant interface.
> >>
> >> Signed-off-by: David Spinadel <david.spinadel at intel.com>
> >> ---
> >> src/drivers/driver_nl80211.c | 84 ++++++++++++++++++++++++++++++++-
> -----
> >> ----
> >> 1 file changed, 64 insertions(+), 20 deletions(-)
> >>
> >> diff --git a/src/drivers/driver_nl80211.c
> >> b/src/drivers/driver_nl80211.c index
> >> b304ddd..ec877f2 100644
> >> --- a/src/drivers/driver_nl80211.c
> >> +++ b/src/drivers/driver_nl80211.c
> >> @@ -12,7 +12,7 @@
> >>
> >> #include "includes.h"
> >> #include <sys/ioctl.h>
> >> -#include <sys/types.h>
> >> +#include <inttypes.h>
> >> #include <sys/stat.h>
> >> #include <fcntl.h>
> >> #include <net/if.h>
> >> @@ -183,6 +183,7 @@ struct i802_bss {
> >> struct wpa_driver_nl80211_data *drv;
> >> struct i802_bss *next;
> >> int ifindex;
> >> + int64_t wdev_id;
> >> char ifname[IFNAMSIZ + 1];
> >> char brname[IFNAMSIZ];
> >> unsigned int beacon_set:1;
> >> @@ -464,6 +465,17 @@ struct family_data {
> >> int id;
> >> };
> >>
> >> +static int nl80211_set_iface_id(struct nl_msg *msg, struct i802_bss
> >> +*bss) {
> >
> > It is possible to always add both attributes (and this can actually be done for
> all the nl commands ...). The kernel should be able to handle this.
>
> That was my initial take as well, but Johannes pointed out to keep
> wpa_supplicant usable for kernel version with wdev_id.
I meant put both attributes :) I think that even older kernel versions can handle this.
>
> >> + if (bss->wdev_id != -1)
> >> + NLA_PUT_U64(msg, NL80211_ATTR_WDEV, bss->wdev_id);
> >> + else
> >> + NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, bss->ifindex);
> >> + return 0;
> >> +
> >> +nla_put_failure:
> >> + return -1;
> >> +}
> >>
> >> static int family_handler(struct nl_msg *msg, void *arg) { @@
> >> -2434,23
> >> +2446,35 @@ static int process_drv_event(struct nl_msg *msg, void
> >> +*arg)
> >> struct nlattr *tb[NL80211_ATTR_MAX + 1];
> >> struct i802_bss *bss;
> >> int ifidx = -1;
> >> + int64_t wdev_id = -1;
> >>
> >> nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
> >> genlmsg_attrlen(gnlh, 0), NULL);
> >>
> >> - if (tb[NL80211_ATTR_IFINDEX])
> >> + if (tb[NL80211_ATTR_IFINDEX]) {
> >> ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]);
> >>
> >
> > It might be better to get both IFINDEX and WDEV id, and then have only
> > a single iteration and do similar processing as in
> > process_global_event(). Otherwise, you might miss a case where the
> > ifindex is -1 but a bss with a valid wdev_id is not the first in the
> > list
> >
> >> - for (bss = &drv->first_bss; bss; bss = bss->next) {
> >> - if (ifidx == -1 || ifidx == bss->ifindex) {
> >> - do_process_drv_event(bss, gnlh->cmd, tb);
> >> - return NL_SKIP;
> >> - }
> >> + for (bss = &drv->first_bss; bss; bss = bss->next)
> >> + if (ifidx == -1 || ifidx == bss->ifindex) {
> >> + do_process_drv_event(bss, gnlh->cmd, tb);
> >> + return NL_SKIP;
> >> + }
> >> + wpa_printf(MSG_DEBUG,
> >> + "nl80211: Ignored event (cmd=%d) for foreign
> >> interface (ifindex %d)",
> >> + gnlh->cmd, ifidx);
> >> + } else if (tb[NL80211_ATTR_WDEV]) {
> >> + wdev_id = nla_get_u64(tb[NL80211_ATTR_WDEV]);
> >> + wpa_printf(MSG_DEBUG, "process event on p2p device");
> >> + for (bss = &drv->first_bss; bss; bss = bss->next)
> >> + if (wdev_id == bss->wdev_id) {
> >> + do_process_drv_event(bss, gnlh->cmd, tb);
> >> + return NL_SKIP;
> >> + }
> >> + wpa_printf(MSG_DEBUG,
> >> + "nl80211: Ignored event (cmd=%d) for foreign
> >> interface (wdev 0x%"
> >> + PRIx64 ")", gnlh->cmd, wdev_id);
> >> }
> >>
> >> - wpa_printf(MSG_DEBUG, "nl80211: Ignored event (cmd=%d) for
> >> foreign "
> >> - "interface (ifindex %d)", gnlh->cmd, ifidx);
> >> -
> >> return NL_SKIP;
> >> }
> >>
> >> @@ -2463,17 +2487,22 @@ static int process_global_event(struct nl_msg
> >> *msg, void *arg)
> >> struct wpa_driver_nl80211_data *drv, *tmp;
> >> int ifidx = -1;
> >> struct i802_bss *bss;
> >> + int64_t wdev_id = -1;
> >>
> >> nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
> >> genlmsg_attrlen(gnlh, 0), NULL);
> >>
> >> if (tb[NL80211_ATTR_IFINDEX])
> >> ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]);
> >> + else if (tb[NL80211_ATTR_WDEV])
> >> + wdev_id = nla_get_u64(tb[NL80211_ATTR_WDEV]);
> >>
> >> dl_list_for_each_safe(drv, tmp, &global->interfaces,
> >> struct wpa_driver_nl80211_data, list) {
> >> for (bss = &drv->first_bss; bss; bss = bss->next) {
> >> - if (ifidx == -1 || ifidx == bss->ifindex) {
> >> + if ((ifidx == -1 && wdev_id == -1) ||
> >> + ifidx == bss->ifindex ||
> >> + (wdev_id != -1 && wdev_id == bss->wdev_id)) {
> >> do_process_drv_event(bss, gnlh->cmd, tb);
> >> return NL_SKIP;
> >> }
> >> @@ -3349,6 +3378,7 @@ static void * wpa_driver_nl80211_init(void
> >> *ctx, const char *ifname,
> >> bss = &drv->first_bss;
> >> bss->drv = drv;
> >> bss->ctx = ctx;
> >> + bss->wdev_id = -1;
> >>
> >> os_strlcpy(bss->ifname, ifname, sizeof(bss->ifname));
> >> drv->monitor_ifidx = -1;
> >> @@ -3436,7 +3466,9 @@ static int nl80211_register_frame(struct
> >> i802_bss *bss,
> >>
> >> nl80211_cmd(drv, msg, 0, NL80211_CMD_REGISTER_ACTION);
> >>
> >> - NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, bss->ifindex);
> >> + if (nl80211_set_iface_id(msg, bss))
> >> + goto nla_put_failure;
> >> +
> >> NLA_PUT_U16(msg, NL80211_ATTR_FRAME_TYPE, type);
> >> NLA_PUT(msg, NL80211_ATTR_FRAME_MATCH, match_len, match);
> >>
> >> @@ -3856,7 +3888,7 @@ static void
> >> wpa_driver_nl80211_scan_timeout(void
> >> *eloop_ctx, void *timeout_ctx)
> >>
> >> static struct nl_msg *
> >> nl80211_scan_common(struct wpa_driver_nl80211_data *drv, u8 cmd,
> >> - struct wpa_driver_scan_params *params)
> >> + struct wpa_driver_scan_params *params, int64_t wdev_id)
> >> {
> >> struct nl_msg *msg;
> >> size_t i;
> >> @@ -3867,8 +3899,10 @@ nl80211_scan_common(struct
> >> wpa_driver_nl80211_data *drv, u8 cmd,
> >>
> >> nl80211_cmd(drv, msg, 0, cmd);
> >>
> >> - if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, drv->ifindex) < 0)
> >> - goto fail;
> >> + if (wdev_id == -1)
> >> + NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
> >> + else
> >> + NLA_PUT_U64(msg, NL80211_ATTR_WDEV, wdev_id);
> >>
> >> if (params->num_ssids) {
> >> struct nlattr *ssids;
> >> @@ -3917,6 +3951,7 @@ nl80211_scan_common(struct
> >> wpa_driver_nl80211_data *drv, u8 cmd,
> >> return msg;
> >>
> >> fail:
> >> +nla_put_failure:
> >> nlmsg_free(msg);
> >> return NULL;
> >> }
> >> @@ -3938,7 +3973,8 @@ static int wpa_driver_nl80211_scan(struct
> >> i802_bss *bss,
> >> wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: scan request");
> >> drv->scan_for_auth = 0;
> >>
> >> - msg = nl80211_scan_common(drv, NL80211_CMD_TRIGGER_SCAN,
> >> params);
> >> + msg = nl80211_scan_common(drv, NL80211_CMD_TRIGGER_SCAN,
> >> params,
> >> + bss->wdev_id);
> >> if (!msg)
> >> return -1;
> >>
> >> @@ -4041,7 +4077,8 @@ static int wpa_driver_nl80211_sched_scan(void
> >> *priv,
> >> return android_pno_start(bss, params); #endif /* ANDROID */
> >>
> >> - msg = nl80211_scan_common(drv,
> >> NL80211_CMD_START_SCHED_SCAN, params);
> >> + msg = nl80211_scan_common(drv,
> >> NL80211_CMD_START_SCHED_SCAN, params,
> >> + bss->wdev_id);
> >> if (!msg)
> >> goto nla_put_failure;
> >>
> >> @@ -8585,6 +8622,7 @@ static int wpa_driver_nl80211_if_add(void
> >> *priv, enum wpa_driver_if_type type,
> >> os_strlcpy(new_bss->ifname, ifname, IFNAMSIZ);
> >> os_memcpy(new_bss->addr, if_addr, ETH_ALEN);
> >> new_bss->ifindex = ifidx;
> >> + new_bss->wdev_id = -1;
> >> new_bss->drv = drv;
> >> new_bss->next = drv->first_bss.next;
> >> new_bss->freq = drv->first_bss.freq; @@ -8696,7 +8734,9 @@
> static
> >> int nl80211_send_frame_cmd(struct i802_bss *bss,
> >> freq, wait, no_cck, no_ack, offchanok);
> >> nl80211_cmd(drv, msg, 0, NL80211_CMD_FRAME);
> >>
> >> - NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, bss->ifindex);
> >> + if (nl80211_set_iface_id(msg, bss))
> >> + goto nla_put_failure;
> >> +
> >> NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
> >> if (wait)
> >> NLA_PUT_U32(msg, NL80211_ATTR_DURATION, wait); @@ -
> >> 8818,7 +8858,9 @@ static int
> >> wpa_driver_nl80211_remain_on_channel(void
> >> *priv, unsigned int freq,
> >>
> >> nl80211_cmd(drv, msg, 0, NL80211_CMD_REMAIN_ON_CHANNEL);
> >>
> >> - NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
> >> + if (nl80211_set_iface_id(msg, bss))
> >> + goto nla_put_failure;
> >> +
> >> NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
> >> NLA_PUT_U32(msg, NL80211_ATTR_DURATION, duration);
> >>
> >> @@ -8865,7 +8907,9 @@ static int
> >> wpa_driver_nl80211_cancel_remain_on_channel(void *priv)
> >>
> >> nl80211_cmd(drv, msg, 0,
> >> NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL);
> >>
> >> - NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
> >> + if (nl80211_set_iface_id(msg, bss))
> >> + goto nla_put_failure;
> >> +
> >> NLA_PUT_U64(msg, NL80211_ATTR_COOKIE, drv-
> >>> remain_on_chan_cookie);
> >>
> >> ret = send_and_recv_msgs(drv, msg, NULL, NULL);
> >> --
> >> 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