]> git.ipfire.org Git - thirdparty/iw.git/blobdiff - reg.c
iw: print out mesh configuration element on scan
[thirdparty/iw.git] / reg.c
diff --git a/reg.c b/reg.c
index 625d6953be4625b1ae9bbb0b37b2ad261af6a3a1..9a60cec4a68e1a5ceca82c62d16701543144fe19 100644 (file)
--- a/reg.c
+++ b/reg.c
@@ -12,6 +12,8 @@
 #include "nl80211.h"
 #include "iw.h"
 
+SECTION(reg);
+
 #define MHZ_TO_KHZ(freq) ((freq) * 1000)
 #define KHZ_TO_MHZ(freq) ((freq) / 1000)
 #define DBI_TO_MBI(gain) ((gain) * 100)
@@ -57,9 +59,27 @@ char *reg_initiator_to_string(__u8 initiator)
        }
 }
 
-static int handle_reg_set(struct nl_cb *cb,
+static const char *dfs_domain_name(enum nl80211_dfs_regions region)
+{
+       switch (region) {
+       case NL80211_DFS_UNSET:
+               return "DFS-UNSET";
+       case NL80211_DFS_FCC:
+               return "DFS-FCC";
+       case NL80211_DFS_ETSI:
+               return "DFS-ETSI";
+       case NL80211_DFS_JP:
+               return "DFS-JP";
+       default:
+               return "DFS-invalid";
+       }
+}
+
+static int handle_reg_set(struct nl80211_state *state,
+                         struct nl_cb *cb,
                          struct nl_msg *msg,
-                         int argc, char **argv)
+                         int argc, char **argv,
+                         enum id_input id)
 {
        char alpha2[3];
 
@@ -90,7 +110,8 @@ static int handle_reg_set(struct nl_cb *cb,
        return -ENOBUFS;
 }
 COMMAND(reg, set, "<ISO/IEC 3166-1 alpha2>",
-       NL80211_CMD_REQ_SET_REG, 0, CIB_NONE, handle_reg_set);
+       NL80211_CMD_REQ_SET_REG, 0, CIB_NONE, handle_reg_set,
+       "Notify the kernel about the current regulatory domain.");
 
 static int print_reg_handler(struct nl_msg *msg, void *arg)
 
@@ -105,13 +126,14 @@ static int print_reg_handler(struct nl_msg *msg, void *arg)
        char *alpha2;
        struct nlattr *nl_rule;
        int rem_rule;
+       enum nl80211_dfs_regions dfs_domain;
        static struct nla_policy reg_rule_policy[NL80211_FREQUENCY_ATTR_MAX + 1] = {
-               [NL80211_ATTR_REG_RULE_FLAGS]           = { .type = NLA_U32 },
-               [NL80211_ATTR_FREQ_RANGE_START]         = { .type = NLA_U32 },
-               [NL80211_ATTR_FREQ_RANGE_END]           = { .type = NLA_U32 },
-               [NL80211_ATTR_FREQ_RANGE_MAX_BW]        = { .type = NLA_U32 },
-               [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]  = { .type = NLA_U32 },
-               [NL80211_ATTR_POWER_RULE_MAX_EIRP]      = { .type = NLA_U32 },
+               [NL80211_ATTR_REG_RULE_FLAGS]           = { .type = NLA_U32 },
+               [NL80211_ATTR_FREQ_RANGE_START]         = { .type = NLA_U32 },
+               [NL80211_ATTR_FREQ_RANGE_END]           = { .type = NLA_U32 },
+               [NL80211_ATTR_FREQ_RANGE_MAX_BW]        = { .type = NLA_U32 },
+               [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]  = { .type = NLA_U32 },
+               [NL80211_ATTR_POWER_RULE_MAX_EIRP]      = { .type = NLA_U32 },
        };
 
        nla_parse(tb_msg, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
@@ -127,8 +149,13 @@ static int print_reg_handler(struct nl_msg *msg, void *arg)
                return NL_SKIP;
        }
 
+       if (tb_msg[NL80211_ATTR_DFS_REGION])
+               dfs_domain = nla_get_u8(tb_msg[NL80211_ATTR_DFS_REGION]);
+       else
+               dfs_domain = NL80211_DFS_UNSET;
+
        alpha2 = nla_data(tb_msg[NL80211_ATTR_REG_ALPHA2]);
-       printf("country %s:\n", alpha2);
+       printf("country %c%c: %s\n", alpha2[0], alpha2[1], dfs_domain_name(dfs_domain));
 
        nla_for_each_nested(nl_rule, tb_msg[NL80211_ATTR_REG_RULES], rem_rule) {
                struct nlattr *tb_rule[NL80211_FREQUENCY_ATTR_MAX + 1];
@@ -175,11 +202,14 @@ static int print_reg_handler(struct nl_msg *msg, void *arg)
 #undef PARSE_FLAG
 }
 
-static int handle_reg_get(struct nl_cb *cb,
+static int handle_reg_get(struct nl80211_state *state,
+                         struct nl_cb *cb,
                          struct nl_msg *msg,
-                         int argc, char **argv)
+                         int argc, char **argv,
+                         enum id_input id)
 {
        nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, print_reg_handler, NULL);
        return 0;
 }
-COMMAND(reg, get, NULL, NL80211_CMD_GET_REG, 0, CIB_NONE, handle_reg_get);
+COMMAND(reg, get, NULL, NL80211_CMD_GET_REG, 0, CIB_NONE, handle_reg_get,
+       "Print out the kernel's current regulatory domain information.");