From adcfb902b10eb942f39b12c7d6d0e591ef227c3f Mon Sep 17 00:00:00 2001 From: Sowmiya Sree Elavalagan Date: Mon, 11 Oct 2021 11:24:23 +0530 Subject: [PATCH] iw: Add aggregation count and management rtscts control support Add ampdu and amsdu count option for tid configuration and introduced corresponding nl attribute for the same. Added peer level configuration to enable/disable rtscts for management frames commands: iw dev wlanX set station mgmt_rts_cts iw dev wlanX set tidconf tids 0x3 override ampdu amsdu Signed-off-by: Sowmiya Sree Elavalagan --- bitrate.c | 2 +- interface.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++--------- nl80211.h | 8 ++++++++ station.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 112 insertions(+), 10 deletions(-) --- a/bitrate.c +++ b/bitrate.c @@ -405,7 +405,7 @@ next: if (!setup_he(&txrate_he_ul_5, he_ul_argc_5, he_ul_argv_5)) return -EINVAL; - nl_rates = nla_nest_start(msg, attr); + nl_rates = nla_nest_start(msg, attr | NLA_F_NESTED); if (!nl_rates) goto nla_put_failure; --- a/interface.c +++ b/interface.c @@ -891,6 +891,32 @@ COMMAND(set, tid_aggr_conf, "tid < "Enable/disable aggregation for the TIDs "); +static int get_param_value(const char *argv0, const char *argv1, + const char *argv2, struct nl_msg *msg, + uint32_t attr) +{ + char *end; + int val; + + if (strcmp(argv1, "on") == 0) { + + if (argv2) { + val = strtol(argv2, &end, 10); + if (*end) + return 0; + + NLA_PUT_U16(msg, attr, val); + return 1; + } + return 0; + } else if (strcmp(argv1, "off") == 0) { + return 0; + } + +nla_put_failure: + return -ENOBUFS; +} + static int toggle_tid_param(const char *argv0, const char *argv1, struct nl_msg *msg, uint32_t attr) { @@ -967,7 +993,9 @@ static int handle_tid_config(struct nl80 } if (!tids_array) { - tids_array = nla_nest_start(msg, NL80211_ATTR_TID_CONFIG); + tids_array = nla_nest_start(msg, + NL80211_ATTR_TID_CONFIG | + NLA_F_NESTED); if (!tids_array) return -ENOBUFS; } @@ -977,7 +1005,7 @@ static int handle_tid_config(struct nl80 tids_num++; } - tids_entry = nla_nest_start(msg, tids_num); + tids_entry = nla_nest_start(msg, tids_num | NLA_F_NESTED); if (!tids_entry) return -ENOBUFS; @@ -1015,8 +1043,16 @@ static int handle_tid_config(struct nl80 if (ret) return ret; - argc -= 2; - argv += 2; + ret = get_param_value(argv[0], argv[1], argv[2], msg, + NL80211_TID_CONFIG_ATTR_AMPDU_COUNT); + if (ret) { + argc -= 3; + argv += 3; + } else { + argc -= 2; + argv += 2; + } + } else if (strcmp(argv[0], "amsdu") == 0) { if (argc < 2) { fprintf(stderr, "not enough args for %s\n", argv[0]); @@ -1028,8 +1064,15 @@ static int handle_tid_config(struct nl80 if (ret) return ret; - argc -= 2; - argv += 2; + ret = get_param_value(argv[0], argv[1], argv[2], msg, + NL80211_TID_CONFIG_ATTR_AMSDU_COUNT); + if (ret) { + argc -= 3; + argv += 3; + } else { + argc -= 2; + argv += 2; + } } else if (strcmp(argv[0], "noack") == 0) { if (argc < 2) { fprintf(stderr, "not enough args for %s\n", argv[0]); @@ -1137,7 +1180,7 @@ nla_put_failure: } COMMAND(set, tidconf, "[peer ] tids [override] [sretry ] [lretry ] " - "[ampdu [on|off]] [amsdu [on|off]] [noack [on|off]] [rtscts [on|off]]" + "[ampdu [on |off]] [amsdu [on |off]] [noack [on|off]] [rtscts [on|off]]" "[bitrates [legacy-<2.4|5> *] [ht-mcs-<2.4|5> *]" " [vht-mcs-<2.4|5> *] [sgi-2.4|lgi-2.4] [sgi-5|lgi-5]]", NL80211_CMD_SET_TID_CONFIG, 0, CIB_NETDEV, handle_tid_config, @@ -1147,8 +1190,8 @@ COMMAND(set, tidconf, "[peer mgmt_rts_cts ", + NL80211_CMD_SET_STATION, 0, CIB_NETDEV, handle_station_set_mgmt_rts_cts, + "Enable/Disable rts/cts for management frames", + select_station_cmd, station_set_mgmt_rts_cts); + static int handle_station_dump(struct nl80211_state *state, struct nl_msg *msg, int argc, char **argv,