Allow user to configure frequency and channel type during mesh join command.

Signed-off-by: Ashok Nagarajan <[email protected]>
---
 mesh.c |   49 ++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 46 insertions(+), 3 deletions(-)

diff --git a/mesh.c b/mesh.c
index 5a09b62..ec202c9 100644
--- a/mesh.c
+++ b/mesh.c
@@ -431,8 +431,18 @@ static int join_mesh(struct nl80211_state *state, struct 
nl_cb *cb,
 {
        struct nlattr *container;
        float rate;
-       int bintval, dtim_period;
+       int bintval, dtim_period, i;
        char *end;
+       static const struct {
+               const char *name;
+               unsigned int val;
+       } htmap[] = {
+               { .name = "HT20", .val = NL80211_CHAN_HT20, },
+               { .name = "HT40+", .val = NL80211_CHAN_HT40PLUS, },
+               { .name = "HT40-", .val = NL80211_CHAN_HT40MINUS, },
+               { .name = "NOHT", .val = NL80211_CHAN_NO_HT, },
+       };
+       unsigned int htval;
 
        if (argc < 1)
                return 1;
@@ -441,6 +451,37 @@ static int join_mesh(struct nl80211_state *state, struct 
nl_cb *cb,
        argc--;
        argv++;
 
+       /* freq */
+       if (argc > 1 && strcmp(argv[0], "freq") == 0) {
+               argv++;
+               argc--;
+
+               NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ,
+                           strtoul(argv[0], &end, 10));
+               if (*end != '\0')
+                       return 1;
+               argv++;
+               argc--;
+
+       }
+
+       /* channel type */
+       if (argc) {
+               for (i = 0; i < ARRAY_SIZE(htmap); i++) {
+                       if (strcasecmp(htmap[i].name, argv[0]) == 0) {
+                               htval = htmap[i].val;
+                               break;
+                       }
+               }
+               if (i != ARRAY_SIZE(htmap)) {
+                       NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
+                                   htval);
+                       argv++;
+                       argc--;
+               }
+
+       }
+
        if (argc > 1 && strcmp(argv[0], "mcast-rate") == 0) {
                argv++;
                argc--;
@@ -506,11 +547,13 @@ static int join_mesh(struct nl80211_state *state, struct 
nl_cb *cb,
  nla_put_failure:
        return -ENOBUFS;
 }
-COMMAND(mesh, join, "<mesh ID> [mcast-rate <rate in Mbps>]"
+COMMAND(mesh, join, "<mesh ID> [freq in MHz] [HT20|HT40+|HT40-|NOHT]"
+       " [mcast-rate <rate in Mbps>]"
        " [beacon-interval <time in TUs>] [dtim-period <value>]"
        " [vendor_sync on|off] [<param>=<value>]*",
        NL80211_CMD_JOIN_MESH, 0, CIB_NETDEV, join_mesh,
-       "Join a mesh with the given mesh ID with mcast-rate and mesh 
parameters.");
+       "Join a mesh with the given mesh ID with freq, mcast-rate, "
+       "and mesh parameters.");
 
 static int leave_mesh(struct nl80211_state *state, struct nl_cb *cb,
                      struct nl_msg *msg, int argc, char **argv,
-- 
1.7.5.4

_______________________________________________
Devel mailing list
[email protected]
http://lists.open80211s.org/cgi-bin/mailman/listinfo/devel

Reply via email to