RE: [PATCH v2 6/9] cfg80211: Provide an API to report NAN function termination
> -Original Message- > From: Arend Van Spriel [mailto:arend.vanspr...@broadcom.com] > Sent: Sunday, September 18, 2016 23:00 > To: Luca Coelho ; johan...@sipsolutions.net > Cc: linux-wireless@vger.kernel.org; Beker, Ayala ; > Otcheretianski, Andrei ; Grumbach, > Emmanuel ; Coelho, Luciano > > Subject: Re: [PATCH v2 6/9] cfg80211: Provide an API to report NAN function > termination > > On 18-9-2016 21:56, Arend Van Spriel wrote: > > On 16-9-2016 10:33, Luca Coelho wrote: > >> From: Ayala Beker > >> > >> Provide a function that reports NAN DE function termination. The > >> function may be terminated due to one of the following reasons: user > >> request, ttl expiration or failure. > >> If the NAN instance is tied to the owner, the notification will be > >> sent to the socket that started the NAN interface only > > > > So the driver is supposed to use this function from the .rm_nan_func > > callback (or .del_nan_func). How should the driver use this together > > with cfg80211_free_nan_func() function. > > Hit Send button too fast. Would it make sense to free the nan func implicitly > in cfg80211_nan_func_terminated() function or would there be reasons to > keep it. Currently when the NAN interface is stopped (ieee80211_do_stop) the termination notification can't be sent, since ieee80211_vif_to_wdev will return NULL after SDATA_STATE_RUNNING bit is cleared. I guess it's similar not only for mac80211, and in case of interface removal we don't really want to send notifications for each function. > > Regards, > Arend
Re: [PATCH v2 6/9] cfg80211: Provide an API to report NAN function termination
On 18-9-2016 21:56, Arend Van Spriel wrote: > On 16-9-2016 10:33, Luca Coelho wrote: >> From: Ayala Beker >> >> Provide a function that reports NAN DE function termination. The function >> may be terminated due to one of the following reasons: user request, >> ttl expiration or failure. >> If the NAN instance is tied to the owner, the notification will be >> sent to the socket that started the NAN interface only > > So the driver is supposed to use this function from the .rm_nan_func > callback (or .del_nan_func). How should the driver use this together > with cfg80211_free_nan_func() function. Hit Send button too fast. Would it make sense to free the nan func implicitly in cfg80211_nan_func_terminated() function or would there be reasons to keep it. Regards, Arend
Re: [PATCH v2 6/9] cfg80211: Provide an API to report NAN function termination
On 16-9-2016 10:33, Luca Coelho wrote: > From: Ayala Beker > > Provide a function that reports NAN DE function termination. The function > may be terminated due to one of the following reasons: user request, > ttl expiration or failure. > If the NAN instance is tied to the owner, the notification will be > sent to the socket that started the NAN interface only So the driver is supposed to use this function from the .rm_nan_func callback (or .del_nan_func). How should the driver use this together with cfg80211_free_nan_func() function. > Signed-off-by: Andrei Otcheretianski > Signed-off-by: Emmanuel Grumbach > Signed-off-by: Luca Coelho > --- > include/net/cfg80211.h | 16 > include/uapi/linux/nl80211.h | 15 > net/wireless/nl80211.c | 58 > > 3 files changed, 89 insertions(+) > > diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h > index a08d7da..81770d6 100644 > --- a/include/net/cfg80211.h > +++ b/include/net/cfg80211.h > @@ -5676,6 +5676,22 @@ struct cfg80211_nan_match_params { > void cfg80211_nan_match(struct wireless_dev *wdev, > struct cfg80211_nan_match_params *match, gfp_t gfp); > > +/** > + * cfg80211_nan_func_terminated - notify about NAN function termination. > + * > + * @wdev: the wireless device reporting the match > + * @inst_id: the local instance id > + * @reason: termination reason (one of the NL80211_NAN_FUNC_TERM_REASON_*) > + * @cookie: unique NAN function identifier > + * @gfp: allocation flags > + * > + * This function reports that the a NAN function is terminated. > + */ > +void cfg80211_nan_func_terminated(struct wireless_dev *wdev, > + u8 inst_id, > + enum nl80211_nan_func_term_reason reason, > + u64 cookie, gfp_t gfp); > + > /* ethtool helper */ > void cfg80211_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo > *info); > > diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h > index badb4a6..fd86be6 100644 > --- a/include/uapi/linux/nl80211.h > +++ b/include/uapi/linux/nl80211.h > @@ -4978,6 +4978,21 @@ enum nl80211_nan_publish_type { > NL80211_NAN_UNSOLICITED_PUBLISH = 1 << 1, > }; > > +/** > + * enum nl80211_nan_func_term_reason - NAN functions termination reason > + * > + * Defines termination reasons of a NAN function > + * > + * @NL80211_NAN_FUNC_TERM_REASON_USER_REQUEST: requested by user > + * @NL80211_NAN_FUNC_TERM_REASON_TTL_EXPIRED: timeout > + * @NL80211_NAN_FUNC_TERM_REASON_ERROR: errored > + */ > +enum nl80211_nan_func_term_reason { > + NL80211_NAN_FUNC_TERM_REASON_USER_REQUEST, > + NL80211_NAN_FUNC_TERM_REASON_TTL_EXPIRED, > + NL80211_NAN_FUNC_TERM_REASON_ERROR, > +}; > + > #define NL80211_NAN_FUNC_SERVICE_ID_LEN 6 > #define NL80211_NAN_FUNC_SERVICE_SPEC_INFO_MAX_LEN 0xff > #define NL80211_NAN_FUNC_SRF_MAX_LEN 0xff > diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c > index 4d37717..f817105 100644 > --- a/net/wireless/nl80211.c > +++ b/net/wireless/nl80211.c > @@ -10945,6 +10945,64 @@ nla_put_failure: > } > EXPORT_SYMBOL(cfg80211_nan_match); > > +void cfg80211_nan_func_terminated(struct wireless_dev *wdev, > + u8 inst_id, > + enum nl80211_nan_func_term_reason reason, > + u64 cookie, gfp_t gfp) > +{ > + struct wiphy *wiphy = wdev->wiphy; > + struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); > + struct sk_buff *msg; > + struct nlattr *func_attr; > + void *hdr; > + > + if (WARN_ON(!inst_id)) > + return; > + > + msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); > + if (!msg) > + return; > + > + hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RM_NAN_FUNCTION); > + if (!hdr) { > + nlmsg_free(msg); > + return; > + } > + > + if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || > + (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, > + wdev->netdev->ifindex)) || > + nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev))) > + goto nla_put_failure; > + > + if (nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie)) > + goto nla_put_failure; > + > + func_attr = nla_nest_start(msg, NL80211_ATTR_NAN_FUNC); > + if (!func_attr) > + goto nla_put_failure; > + > + if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, inst_id) || > + nla_put_u8(msg, NL80211_NAN_FUNC_TERM_REASON, reason)) > + goto nla_put_failure; > + > + nla_nest_end(msg, func_attr); > + genlmsg_end(msg, hdr); > + > + if (!wdev->owner_nlportid) > + genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), > + msg, 0, NL80211_MCGRP_NAN, gfp); > + else > +
[PATCH v2 6/9] cfg80211: Provide an API to report NAN function termination
From: Ayala Beker Provide a function that reports NAN DE function termination. The function may be terminated due to one of the following reasons: user request, ttl expiration or failure. If the NAN instance is tied to the owner, the notification will be sent to the socket that started the NAN interface only Signed-off-by: Andrei Otcheretianski Signed-off-by: Emmanuel Grumbach Signed-off-by: Luca Coelho --- include/net/cfg80211.h | 16 include/uapi/linux/nl80211.h | 15 net/wireless/nl80211.c | 58 3 files changed, 89 insertions(+) diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index a08d7da..81770d6 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -5676,6 +5676,22 @@ struct cfg80211_nan_match_params { void cfg80211_nan_match(struct wireless_dev *wdev, struct cfg80211_nan_match_params *match, gfp_t gfp); +/** + * cfg80211_nan_func_terminated - notify about NAN function termination. + * + * @wdev: the wireless device reporting the match + * @inst_id: the local instance id + * @reason: termination reason (one of the NL80211_NAN_FUNC_TERM_REASON_*) + * @cookie: unique NAN function identifier + * @gfp: allocation flags + * + * This function reports that the a NAN function is terminated. + */ +void cfg80211_nan_func_terminated(struct wireless_dev *wdev, + u8 inst_id, + enum nl80211_nan_func_term_reason reason, + u64 cookie, gfp_t gfp); + /* ethtool helper */ void cfg80211_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info); diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index badb4a6..fd86be6 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -4978,6 +4978,21 @@ enum nl80211_nan_publish_type { NL80211_NAN_UNSOLICITED_PUBLISH = 1 << 1, }; +/** + * enum nl80211_nan_func_term_reason - NAN functions termination reason + * + * Defines termination reasons of a NAN function + * + * @NL80211_NAN_FUNC_TERM_REASON_USER_REQUEST: requested by user + * @NL80211_NAN_FUNC_TERM_REASON_TTL_EXPIRED: timeout + * @NL80211_NAN_FUNC_TERM_REASON_ERROR: errored + */ +enum nl80211_nan_func_term_reason { + NL80211_NAN_FUNC_TERM_REASON_USER_REQUEST, + NL80211_NAN_FUNC_TERM_REASON_TTL_EXPIRED, + NL80211_NAN_FUNC_TERM_REASON_ERROR, +}; + #define NL80211_NAN_FUNC_SERVICE_ID_LEN 6 #define NL80211_NAN_FUNC_SERVICE_SPEC_INFO_MAX_LEN 0xff #define NL80211_NAN_FUNC_SRF_MAX_LEN 0xff diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 4d37717..f817105 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -10945,6 +10945,64 @@ nla_put_failure: } EXPORT_SYMBOL(cfg80211_nan_match); +void cfg80211_nan_func_terminated(struct wireless_dev *wdev, + u8 inst_id, + enum nl80211_nan_func_term_reason reason, + u64 cookie, gfp_t gfp) +{ + struct wiphy *wiphy = wdev->wiphy; + struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); + struct sk_buff *msg; + struct nlattr *func_attr; + void *hdr; + + if (WARN_ON(!inst_id)) + return; + + msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); + if (!msg) + return; + + hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RM_NAN_FUNCTION); + if (!hdr) { + nlmsg_free(msg); + return; + } + + if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || + (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, +wdev->netdev->ifindex)) || + nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev))) + goto nla_put_failure; + + if (nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie)) + goto nla_put_failure; + + func_attr = nla_nest_start(msg, NL80211_ATTR_NAN_FUNC); + if (!func_attr) + goto nla_put_failure; + + if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, inst_id) || + nla_put_u8(msg, NL80211_NAN_FUNC_TERM_REASON, reason)) + goto nla_put_failure; + + nla_nest_end(msg, func_attr); + genlmsg_end(msg, hdr); + + if (!wdev->owner_nlportid) + genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), + msg, 0, NL80211_MCGRP_NAN, gfp); + else + genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, + wdev->owner_nlportid); + + return; + +nla_put_failure: + nlmsg_free(msg); +} +EXPORT_SYMBOL(cfg80211_nan_func_terminated); + static int nl80211_get_protocol_features(struct sk_buff *skb, struct genl_info *info) { -- 2.9.3