+static int parse_vht_chunk(const char *arg, __u8 *nss, __u16 *mcs)
+{
+ int count, i;
+ unsigned int inss, mcs_start, mcs_end, tab[10];
+
+ *nss = 0; *mcs = 0;
+
+ if (strchr(arg, '-')) {
+ /* Format: NSS:MCS_START-MCS_END */
+ count = sscanf(arg, "%u:%u-%u", &inss, &mcs_start, &mcs_end);
+
+ if (count != 3)
+ return 0;
+
+ if (inss < 1 || inss > NL80211_VHT_NSS_MAX)
+ return 0;
+
+ if (mcs_start > mcs_end)
+ return 0;
+
+ if (mcs_start > 9 || mcs_end > 9)
+ return 0;
+
+ *nss = inss;
+ for (i = mcs_start; i <= mcs_end; i++)
+ *mcs |= 1 << i;
+
+ } else {
+ /* Format: NSS:MCSx,MCSy,... */
+ count = sscanf(arg, "%u:%u,%u,%u,%u,%u,%u,%u,%u,%u,%u", &inss,
+ &tab[0], &tab[1], &tab[2], &tab[3], &tab[4], &tab[5],
+ &tab[6], &tab[7], &tab[8], &tab[9]);
+
+ if (count < 2)
+ return 0;
+
+ if (inss < 1 || inss > NL80211_VHT_NSS_MAX)
+ return 0;
+
+ *nss = inss;
+ for (i = 0; i < count - 1; i++) {
+ if (tab[i] > 9)
+ return 0;
+ *mcs |= 1 << tab[i];
+ }
+ }
+
+ return 1;
+}
+
+static int setup_vht(struct nl80211_txrate_vht *txrate_vht,
+ int argc, char **argv)
+{
+ __u8 nss;
+ __u16 mcs;
+ int i;
+
+ memset(txrate_vht, 0, sizeof(*txrate_vht));
+
+ for (i = 0; i < argc; i++) {
+ if(!parse_vht_chunk(argv[i], &nss, &mcs))
+ return 0;
+
+ nss--;
+ txrate_vht->mcs[nss] |= mcs;
+ }
+
+ return 1;
+}
+
+#define VHT_ARGC_MAX 100
+