Once the driver support for the TWT Vendor subcmd is identified, enable TWT Offload bit in the driver capability flag2, so that user space can offload the TWT session management responsibility to the driver. If the TWT Vendor path is enabled with CONFIG_DRIVER_NL80211_IFX=y, then in the generic WPA driver NL80211 setup TWT handler, construct the TWT Vendor subcmd, fill the parameters using the TWT vendor attributes and pass it down to the driver layer to offload TWT setup negotiation work to the driver. Signed-off-by: Gokul Sivakumar <gokulkumar.sivakumar@xxxxxxxxxxxx> --- src/common/ifx_vendor.h | 218 ++++++++++++++++++++++++++++++ src/drivers/driver_nl80211.c | 93 +++++++++++++ src/drivers/driver_nl80211_capa.c | 13 ++ 3 files changed, 324 insertions(+) diff --git a/src/common/ifx_vendor.h b/src/common/ifx_vendor.h index 729c01901..b3a95db60 100644 --- a/src/common/ifx_vendor.h +++ b/src/common/ifx_vendor.h @@ -41,6 +41,7 @@ * @IFX_VENDOR_SCMD_AMSDU: Control AMSDU aggregation for both TX & RX on all the TID queues. * * @IFX_VENDOR_SCMD_TWT: Configure Target Wake Time (TWT) Session with the needed parameters. + * Uses Vendor attributes defined in the enum ifx_vendor_attr_twt. * * @IFX_VENDOR_SCMD_OCE: Configure the Optimized Connectivity Experience (OCE) functionality * related parameters. @@ -115,4 +116,221 @@ enum ifx_vendor_attr { IFX_VENDOR_ATTR_MAX }; +/* + * enum ifx_vendor_attr_twt - Attributes for the TWT vendor command + * + * @IFX_VENDOR_ATTR_TWT_UNSPEC: Reserved value 0 + * + * @IFX_VENDOR_ATTR_TWT_OPER: To specify the type of TWT operation + * to be performed. Uses attributes defined in enum ifx_twt_oper. + * + * @IFX_VENDOR_ATTR_TWT_PARAMS: Nester attributes representing the + * parameters configured for TWT. These parameters are defined in + * the enum ifx_vendor_attr_twt_param. + * + * @IFX_VENDOR_ATTR_TWT_MAX: This acts as a the tail of cmds list. + * Make sure it located at the end of the list. + */ +enum ifx_vendor_attr_twt { + IFX_VENDOR_ATTR_TWT_UNSPEC, + IFX_VENDOR_ATTR_TWT_OPER, + IFX_VENDOR_ATTR_TWT_PARAMS, + IFX_VENDOR_ATTR_TWT_MAX +}; + +/* + * enum ifx_twt_oper - TWT operation to be specified using the vendor + * attribute IFX_VENDOR_ATTR_TWT_OPER + * + * @IFX_TWT_OPER_UNSPEC: Reserved value 0 + * + * @IFX_TWT_OPER_SETUP: Setup a TWT session. Required parameters are + * obtained through the nested attrs under IFX_VENDOR_ATTR_TWT_PARAMS. + * + * @IFX_TWT_OPER_MAX: This acts as a the tail of the list. + * Make sure it located at the end of the list. + */ +enum ifx_twt_oper { + IFX_TWT_OPER_UNSPEC, + IFX_TWT_OPER_SETUP, + IFX_TWT_OPER_MAX +}; + +/* + * enum ifx_vendor_attr_twt_param - TWT parameters + * + * @IFX_VENDOR_ATTR_TWT_PARAM_UNSPEC: Reserved value 0 + * + * @IFX_VENDOR_ATTR_TWT_PARAM_NEGO_TYPE: Specifies the type of Negotiation to be + * done during Setup. The four possible types are + * 0 - Individual TWT Negotiation + * 1 - Wake TBTT Negotiation + * 2 - Broadcast TWT in Beacon + * 3 - Broadcast TWT Membership Negotiation + * + * The possible values are defined in the enum ifx_twt_param_nego_type + * + * @IFX_VENDOR_ATTR_TWT_PARAM_SETUP_CMD_TYPE: Specifies the type of TWT Setup frame + * when sent by the TWT Requesting STA + * 0 - Request + * 1 - Suggest + * 2 - Demand + * + * when sent by the TWT Responding STA. + * 3 - Grouping + * 4 - Accept + * 5 - Alternate + * 6 - Dictate + * 7 - Reject + * + * The possible values are defined in the enum ifx_twt_oper_setup_cmd_type. + * + * @IFX_VENDOR_ATTR_TWT_PARAM_DIALOG_TOKEN: Dialog Token used by the TWT Requesting STA to + * identify the TWT Setup request/response transaction. + * + * @IFX_VENDOR_ATTR_TWT_PARAM_WAKE_TIME: Target Wake Time. + * + * @IFX_VENDOR_ATTR_TWT_PARAM_MIN_WAKE_DURATION: Nominal Minimum TWT Wake Duration. + * + * @IFX_VENDOR_ATTR_TWT_PARAM_WAKE_INTVL_EXPONENT: TWT Wake Interval Exponent. + * + * @IFX_VENDOR_ATTR_TWT_PARAM_WAKE_INTVL_MANTISSA: TWT Wake Interval Mantissa. + * + * @IFX_VENDOR_ATTR_TWT_PARAM_REQUESTOR: Specify this is a TWT Requesting / Responding STA. + * + * @IFX_VENDOR_ATTR_TWT_PARAM_TRIGGER: Specify Trigger based / Non-Trigger based TWT Session. + * + * @IFX_VENDOR_ATTR_TWT_PARAM_IMPLICIT: Specify Implicit / Explicit TWT session. + * + * @IFX_VENDOR_ATTR_TWT_PARAM_FLOW_TYPE: Specify Un-Announced / Announced TWT session. + * + * @IFX_VENDOR_ATTR_TWT_PARAM_FLOW_ID: Flow ID of an iTWT session. + * + * @IFX_VENDOR_ATTR_TWT_PARAM_BCAST_TWT_ID: Brocast TWT ID of a bTWT session. + * + * @IFX_VENDOR_ATTR_TWT_PARAM_PROTECTION: Specifies whether Tx within SP is protected. + * Set to 1 to indicate that TXOPs within the TWT SPs shall be initiated + * with a NAV protection mechanism, such as (MU) RTS/CTS or CTS-to-self frame; + * otherwise, it shall set it to 0. + * + * @IFX_VENDOR_ATTR_TWT_PARAM_CHANNEL: TWT channel field which is set to 0, unless + * the HE STA sets up a subchannel selective transmission operation. + * + * @IFX_VENDOR_ATTR_TWT_PARAM_TWT_INFO_FRAME_DISABLED: TWT Information frame RX handing + * disabled / enabled. + * + * @IFX_VENDOR_ATTR_TWT_PARAM_MIN_WAKE_DURATION_UNIT: Nominal Minimum TWT Wake Duration + * Unit. 0 represents unit in "256 usecs" and 1 represents unit in "TUs". + * + * @IFX_VENDOR_ATTR_TWT_PARAM_MAX: This acts as a the tail of the list. + * Make sure it located at the end of the list. + */ +enum ifx_vendor_attr_twt_param { + IFX_VENDOR_ATTR_TWT_PARAM_UNSPEC, + IFX_VENDOR_ATTR_TWT_PARAM_NEGO_TYPE, + IFX_VENDOR_ATTR_TWT_PARAM_SETUP_CMD_TYPE, + IFX_VENDOR_ATTR_TWT_PARAM_DIALOG_TOKEN, + IFX_VENDOR_ATTR_TWT_PARAM_WAKE_TIME, + IFX_VENDOR_ATTR_TWT_PARAM_MIN_WAKE_DURATION, + IFX_VENDOR_ATTR_TWT_PARAM_WAKE_INTVL_EXPONENT, + IFX_VENDOR_ATTR_TWT_PARAM_WAKE_INTVL_MANTISSA, + IFX_VENDOR_ATTR_TWT_PARAM_REQUESTOR, + IFX_VENDOR_ATTR_TWT_PARAM_TRIGGER, + IFX_VENDOR_ATTR_TWT_PARAM_IMPLICIT, + IFX_VENDOR_ATTR_TWT_PARAM_FLOW_TYPE, + IFX_VENDOR_ATTR_TWT_PARAM_FLOW_ID, + IFX_VENDOR_ATTR_TWT_PARAM_BCAST_TWT_ID, + IFX_VENDOR_ATTR_TWT_PARAM_PROTECTION, + IFX_VENDOR_ATTR_TWT_PARAM_CHANNEL, + IFX_VENDOR_ATTR_TWT_PARAM_TWT_INFO_FRAME_DISABLED, + IFX_VENDOR_ATTR_TWT_PARAM_MIN_WAKE_DURATION_UNIT, + IFX_VENDOR_ATTR_TWT_PARAM_MAX +}; + +/* + * enum ifx_twt_param_nego_type - TWT Session Negotiation Type Parameters + * + * @IFX_TWT_PARAM_NEGO_TYPE_ITWT: Individual TWT negotiation between TWT requesting STA + * and TWT responding STA or individual TWT announcement by TWT Responder + * + * @IFX_TWT_PARAM_NEGO_TYPE_WAKE_TBTT: Wake TBTT and Wake interval negotiation between + * TWT scheduled STA and TWT scheduling AP. + * + * @IFX_TWT_PARAM_NEGO_TYPE_BTWT_IE_BCN: Provide Broadcast TWT schedules to TWT scheduled + * STAs by including the TWT element in broadcast Managemnet frames sent by TWT + * scheduling AP. + * + * @IFX_TWT_PARAM_NEGO_TYPE_BTWT: Broadcast TWT negotiation between TWT requesting STA + * and TWT responding STA. Manage Memberships in broadcast TWT schedules by including + * the TWT element in individually addressed Management frames sent by either a TWT + * scheduled STA or a TWT scheduling AP. + * + * @IFX_TWT_PARAM_NEGO_TYPE_MAX: This acts as a the tail of the list. + * Make sure it located at the end of the list. + */ +enum ifx_twt_param_nego_type { + IFX_TWT_PARAM_NEGO_TYPE_INVALID = -1, + IFX_TWT_PARAM_NEGO_TYPE_ITWT = 0, + IFX_TWT_PARAM_NEGO_TYPE_WAKE_TBTT = 1, + IFX_TWT_PARAM_NEGO_TYPE_BTWT_IE_BCN = 2, + IFX_TWT_PARAM_NEGO_TYPE_BTWT = 3, + IFX_TWT_PARAM_NEGO_TYPE_MAX = 4 +}; + +/* + * enum ifx_vendor_attr_twt_param - TWT Session setup command types + * + * @IFX_TWT_OPER_SETUP_CMD_TYPE_REQUEST: A TWT requesting or TWT scheduled STA + * requests to join a TWT without specifying a target wake time. This type needs to + * be used only by the TWT requesting STA. + * + * @IFX_TWT_OPER_SETUP_CMD_TYPE_SUGGEST: A TWT requesting or TWT scheduled STA requests to + * join a TWT without specifying a target wake time. This type needs to be used only + * by the TWT requesting STA. + * + * @IFX_TWT_OPER_SETUP_CMD_TYPE_DEMAND: A TWT requesting or TWT scheduled STA requests to + * join a TWT and specifies a demanded set of TWT parameters. If the demanded set of + * TWT parameters is not accommodated by the responding STA or TWT scheduling AP, then + * the TWT requesting STA or TWT scheduled STA will reject the TWT setup. This type + * needs to be used only by the TWT requesting STA. + * + * @IFX_TWT_OPER_SETUP_CMD_TYPE_GROUPING: The TWT responding STA suggests TWT group + * parameters that are different from the suggested or demanded TWT parameters of the + * TWT requesting STA. This type needs to be used only by the S1G TWT Responding STA in + * case of ITWT Setup Negotiation. + * + * @IFX_TWT_OPER_SETUP_CMD_TYPE_ACCEPT: A TWT responding STA or TWT scheduling AP accepts + * the TWT request with the TWT parameters (see NOTE) indicated in the TWT element + * transmitted by the TWT requesting STA or TWT scheduled STA. This value is also used + * in unsolicited TWT responses. This needs type needs to be used only by the TWT + * responding STA. + * + * @IFX_TWT_OPER_SETUP_CMD_TYPE_ALTERNATE: A TWT responding STA or TWT scheduling AP suggests + * TWT parameters that are different from those suggested by the TWT requesting STA or + * TWT scheduled STA. This needs type needs to be used only by the TWT reponding STA. + * + * @IFX_TWT_OPER_SETUP_CMD_TYPE_DICTATE: A TWT responding STA or TWT scheduling AP indicates + * TWT parameters that are different from those suggested by the TWT requesting STA or + * TWT scheduled STA. This needs type needs to be used only by the TWT responding STA. + * + * @IFX_TWT_OPER_SETUP_CMD_TYPE_REJECT: A TWT responding STA or TWT scheduling AP rejects + * setup, or a TWT scheduling AP terminates an existing broadcast TWT, or a TWT + * scheduled STA terminates its membership in a broadcast TWT. + * + * @IFX_TWT_OPER_SETUP_CMD_TYPE_MAX: This acts as a the tail of the list. + * Make sure it located at the end of the list. + */ +enum ifx_twt_oper_setup_cmd_type { + IFX_TWT_OPER_SETUP_CMD_TYPE_INVALID = -1, + IFX_TWT_OPER_SETUP_CMD_TYPE_REQUEST = 0, + IFX_TWT_OPER_SETUP_CMD_TYPE_SUGGEST = 1, + IFX_TWT_OPER_SETUP_CMD_TYPE_DEMAND = 2, + IFX_TWT_OPER_SETUP_CMD_TYPE_GROUPING = 3, + IFX_TWT_OPER_SETUP_CMD_TYPE_ACCEPT = 4, + IFX_TWT_OPER_SETUP_CMD_TYPE_ALTERNATE = 5, + IFX_TWT_OPER_SETUP_CMD_TYPE_DICTATE = 6, + IFX_TWT_OPER_SETUP_CMD_TYPE_REJECT = 7, + IFX_TWT_OPER_SETUP_CMD_TYPE_MAX = 8 +}; + #endif /* IFX_VENDOR_H */ diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index 95f4bcdef..2b840178f 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -28,6 +28,7 @@ #include "common/qca-vendor.h" #include "common/qca-vendor-attr.h" #include "common/brcm_vendor.h" +#include "common/ifx_vendor.h" #include "common/ieee802_11_defs.h" #include "common/ieee802_11_common.h" #include "common/wpa_common.h" @@ -13452,6 +13453,95 @@ static int testing_nl80211_radio_disable(void *priv, int disabled) #endif /* CONFIG_TESTING_OPTIONS */ +#ifdef CONFIG_DRIVER_NL80211_IFX +static int nl80211_ifx_setup_twt(struct wpa_driver_nl80211_data *drv, + struct drv_setup_twt_params *params) +{ + struct nl_msg *msg = NULL; + struct nlattr *data, *twt_param_attrs; + int ret = -1; + + if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_VENDOR)) || + nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_IFX) || + nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, IFX_VENDOR_SCMD_TWT)) + goto fail; + + data = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA); + if (!data) + goto fail; + + if (nla_put_u8(msg, IFX_VENDOR_ATTR_TWT_OPER, IFX_TWT_OPER_SETUP)) + goto fail; + + twt_param_attrs = nla_nest_start(msg, IFX_VENDOR_ATTR_TWT_PARAMS); + if (!twt_param_attrs) + goto fail; + + if (nla_put_u8(msg, IFX_VENDOR_ATTR_TWT_PARAM_NEGO_TYPE, + params->negotiation_type) || + + nla_put_u8(msg, IFX_VENDOR_ATTR_TWT_PARAM_SETUP_CMD_TYPE, + params->setup_cmd) || + + nla_put_u8(msg, IFX_VENDOR_ATTR_TWT_PARAM_DIALOG_TOKEN, + params->dtok) || + + (params->twt && + nla_put_u64(msg, IFX_VENDOR_ATTR_TWT_PARAM_WAKE_TIME, + params->twt)) || + + nla_put_u8(msg, IFX_VENDOR_ATTR_TWT_PARAM_MIN_WAKE_DURATION, + params->min_twt) || + + nla_put_u8(msg, IFX_VENDOR_ATTR_TWT_PARAM_WAKE_INTVL_EXPONENT, + params->exponent) || + + nla_put_u16(msg, IFX_VENDOR_ATTR_TWT_PARAM_WAKE_INTVL_MANTISSA, + params->mantissa) || + + nla_put_u8(msg, IFX_VENDOR_ATTR_TWT_PARAM_REQUESTOR, + params->requestor) || + + nla_put_u8(msg, IFX_VENDOR_ATTR_TWT_PARAM_TRIGGER, + params->trigger) || + + nla_put_u8(msg, IFX_VENDOR_ATTR_TWT_PARAM_IMPLICIT, + params->implicit) || + + nla_put_u8(msg, IFX_VENDOR_ATTR_TWT_PARAM_FLOW_TYPE, + params->flow_type) || + + nla_put_u8(msg, IFX_VENDOR_ATTR_TWT_PARAM_FLOW_ID, + params->flow_id) || + + nla_put_u8(msg, IFX_VENDOR_ATTR_TWT_PARAM_BCAST_TWT_ID, + params->bcast_twt_id) || + + nla_put_u8(msg, IFX_VENDOR_ATTR_TWT_PARAM_PROTECTION, + params->protection) || + + nla_put_u8(msg, IFX_VENDOR_ATTR_TWT_PARAM_CHANNEL, + params->twt_channel) || + + nla_put_u8(msg, IFX_VENDOR_ATTR_TWT_PARAM_TWT_INFO_FRAME_DISABLED, + params->twt_info_frame_disabled) || + + nla_put_u8(msg, IFX_VENDOR_ATTR_TWT_PARAM_MIN_WAKE_DURATION_UNIT, + params->min_twt_unit)) + goto fail; + + nla_nest_end(msg, twt_param_attrs); + nla_nest_end(msg, data); + + ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL); + return ret; +fail: + nl80211_nlmsg_clear(msg); + nlmsg_free(msg); + return ret; +} +#endif /* CONFIG_DRIVER_NL80211_IFX */ + static int wpa_driver_nl80211_setup_twt(void *priv, struct drv_setup_twt_params *params) { struct i802_bss *bss = priv; @@ -13465,6 +13555,9 @@ static int wpa_driver_nl80211_setup_twt(void *priv, struct drv_setup_twt_params * Call the Vendor implementation for initiating * TWT Setup Request to the Vendor Driver */ +#ifdef CONFIG_DRIVER_NL80211_IFX + ret = nl80211_ifx_setup_twt(drv, params); +#endif if (ret < 0) { wpa_printf(MSG_DEBUG, diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c index 59f45989e..a53f0b9b3 100644 --- a/src/drivers/driver_nl80211_capa.c +++ b/src/drivers/driver_nl80211_capa.c @@ -17,6 +17,7 @@ #include "common/qca-vendor.h" #include "common/qca-vendor-attr.h" #include "common/brcm_vendor.h" +#include "common/ifx_vendor.h" #include "driver_nl80211.h" @@ -1099,6 +1100,18 @@ static int wiphy_info_handler(struct nl_msg *msg, void *arg) break; } #endif /* CONFIG_DRIVER_NL80211_BRCM */ + +#ifdef CONFIG_DRIVER_NL80211_IFX + } else if (vinfo->vendor_id == OUI_IFX) { + switch (vinfo->subcmd) { + case IFX_VENDOR_SCMD_TWT: + drv->capa.flags2 |= + WPA_DRIVER_FLAGS2_TWT_OFFLOAD; + wpa_printf(MSG_DEBUG, + "Enabled IFX TWT"); + break; + } +#endif /* CONFIG_DRIVER_NL80211_IFX */ } wpa_printf(MSG_DEBUG, "nl80211: Supported vendor command: vendor_id=0x%x subcmd=%u", -- 2.25.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap